195 for (i = 0; i <
len; i++) {
196 uv[i][0] = uv_orig[i][0] * aspx;
197 uv[i][1] = uv_orig[i][1] * aspy;
204 bool changed =
false;
207 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
208 Object *obedit = objects_edit[ob_index];
265 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
266 Object *obedit = objects_edit[ob_index];
299 bool changed =
false;
324 bool changed =
false;
329 if (r_has_select !=
NULL) {
330 uint objects_len = 0;
339 uint objects_len = 0;
344 if (r_has_select !=
NULL) {
345 *r_has_select = changed;
380 bool changed =
false;
398 if (luv->
uv[0] != cent[0]) {
399 luv->
uv[0] = cent[0];
404 if (luv->
uv[1] != cent[1]) {
405 luv->
uv[1] = cent[1];
449 if ((*prec_a < flags && 0.0f < len_sq_b) || (*prec_a == flags && len_sq_ab < len_sq_b)) {
455 if ((*prec_b < flags && 0.0f < len_sq_a) || (*prec_b == flags && len_sq_ab < len_sq_a)) {
470 const int cd_loop_uv_offset,
479 for (
int i = 0; i < 10; i++) {
481 for (
int j = 0; j <
len; j++) {
498 if (uv_start[1] == uv_end[1]) {
503 a = (uv_end[0] - uv_start[0]) / (uv_end[1] - uv_start[1]);
507 if (uv_start[0] == uv_end[0]) {
512 a = (uv_end[1] - uv_start[1]) / (uv_end[0] - uv_start[0]);
516 bool changed =
false;
517 for (
int j = 0; j <
len; j++) {
524 luv->
uv[0] =
a * (luv->
uv[1] - uv_start[1]) + uv_start[0];
527 luv->
uv[1] =
a * (luv->
uv[0] - uv_start[0]) + uv_start[1];
543 if (cd_loop_uv_offset == -1) {
548 if (element_map ==
NULL) {
552 bool changed =
false;
556 for (
int i = element_map->
totalIslands - 1; i >= 0; --i) {
559 element_map->
buf + j0, j1 - j0, cd_loop_uv_offset, tool);
574 float cent[2],
min[2],
max[2];
578 uint objects_len = 0;
583 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
584 Object *obedit = objects[ob_index];
615 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
616 Object *obedit = objects[ob_index];
618 bool changed =
false;
656 "Align UVs along the line defined by the endpoints"},
661 "Align UVs along the line defined by the endpoints along the X axis"},
666 "Align UVs along the line defined by the endpoints along the Y axis"},
671 "Automatically choose the axis on which there is most alignment already"},
672 {
UV_ALIGN_X,
"ALIGN_X", 0,
"Align X",
"Align UVs on X axis"},
673 {
UV_ALIGN_Y,
"ALIGN_Y", 0,
"Align Y",
"Align UVs on Y axis"},
708 uint objects_len = 0;
712 bool *changed =
MEM_callocN(
sizeof(
bool) * objects_len,
"uv_remove_doubles_selected.changed");
717 "uv_remove_doubles_selected.ob_mloopuv_max_idx");
721 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
722 Object *obedit = objects[ob_index];
732 KDTree_2d *
tree = BLI_kdtree_2d_new(uv_maxlen);
734 int *duplicates =
NULL;
740 int mloopuv_count = 0;
742 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
746 Object *obedit = objects[ob_index];
763 BLI_kdtree_2d_insert(
tree, mloopuv_count, luv->
uv);
771 ob_mloopuv_max_idx[ob_index] = mloopuv_count - 1;
774 BLI_kdtree_2d_balance(
tree);
775 int found_duplicates = BLI_kdtree_2d_calc_duplicates_fast(
tree,
threshold,
false, duplicates);
777 if (found_duplicates > 0) {
779 int *uv_duplicate_count =
MEM_callocN(
sizeof(
int) * mloopuv_count,
780 "uv_remove_doubles_selected.uv_duplicate_count");
781 for (
int i = 0; i < mloopuv_count; i++) {
782 if (duplicates[i] == -1) {
783 uv_duplicate_count[i]++;
787 if (duplicates[i] != i) {
790 add_v2_v2(mloopuv_arr[duplicates[i]]->uv, mloopuv_arr[i]->uv);
792 uv_duplicate_count[duplicates[i]]++;
795 for (
int i = 0; i < mloopuv_count; i++) {
796 if (uv_duplicate_count[i] < 2) {
800 mul_v2_fl(mloopuv_arr[i]->uv, 1.0f / (
float)uv_duplicate_count[i]);
806 for (
int i = 0; i < mloopuv_count; i++) {
810 while (ob_mloopuv_max_idx[ob_index] < i) {
814 if (duplicates[i] == -1) {
818 copy_v2_v2(mloopuv_arr[i]->uv, mloopuv_arr[duplicates[i]]->uv);
819 changed[ob_index] =
true;
822 for (ob_index = 0; ob_index < objects_len; ob_index++) {
823 if (changed[ob_index]) {
824 Object *obedit = objects[ob_index];
832 BLI_kdtree_2d_free(
tree);
852 uint objects_len = 0;
858 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
859 Object *obedit = objects[ob_index];
864 KDTree_2d *
tree = BLI_kdtree_2d_new(uv_maxlen);
869 int mloopuv_count = 0;
872 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
876 Object *obedit = objects[ob_index];
893 BLI_kdtree_2d_insert(
tree, mloopuv_count, luv->
uv);
901 BLI_kdtree_2d_balance(
tree);
904 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
908 bool changed =
false;
909 Object *obedit = objects[ob_index];
926 KDTreeNearest_2d nearest;
927 const int i = BLI_kdtree_2d_find_nearest(
tree, luv->
uv, &nearest);
929 if (i != -1 && nearest.dist <
threshold) {
944 BLI_kdtree_2d_free(
tree);
962 ot->
name =
"Merge UVs by Distance";
964 "Selected UV vertices that are within a radius of each other are welded together";
965 ot->
idname =
"UV_OT_remove_doubles";
978 "Maximum distance between welded vertices",
982 ot->
srna,
"use_unselected", 0,
"Unselected",
"Merge selected to other unselected vertices");
1019 uvco[0] = roundf(uvco[0] *
w) /
w;
1020 uvco[1] = roundf(uvco[1] * h) / h;
1049 bool changed =
false;
1060 uint objects_len = 0;
1085 {0,
"PIXELS", 0,
"Pixels",
""},
1086 {1,
"SELECTED", 0,
"Selected",
""},
1087 {2,
"ORIGIN", 0,
"Origin",
""},
1092 ot->
name =
"Snap Cursor";
1103 ot->
srna,
"target", target_items, 0,
"Target",
"Target to snap the selected UVs to");
1119 bool changed =
false;
1147 bool changed =
false;
1174 BMIter iter, liter, lsubiter;
1176 bool changed =
false;
1197 float uv[2] = {0.0f, 0.0f};
1232 bool changed =
false;
1268 uint objects_len = 0;
1281 bool changed_multi =
false;
1282 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1283 Object *obedit = objects[ob_index];
1290 bool changed =
false;
1307 changed_multi =
true;
1321 {0,
"PIXELS", 0,
"Pixels",
""},
1322 {1,
"CURSOR", 0,
"Cursor",
""},
1323 {2,
"CURSOR_OFFSET", 0,
"Cursor (Offset)",
""},
1324 {3,
"ADJACENT_UNSELECTED", 0,
"Adjacent Unselected",
""},
1329 ot->
name =
"Snap Selection";
1330 ot->
description =
"Snap selected UV vertices to target type";
1331 ot->
idname =
"UV_OT_snap_selected";
1340 ot->
srna,
"target", target_items, 0,
"Target",
"Target to snap the selected UVs to");
1361 uint objects_len = 0;
1365 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1366 Object *obedit = objects[ob_index];
1369 bool changed =
false;
1411 "Set/clear selected UV vertices as anchored between multiple unwrap operations";
1421 ot->
srna,
"clear", 0,
"Clear",
"Clear pinning for the selection instead of setting it");
1432 #define UV_VERT_SEL_TEST(luv, bool_test) \
1433 ((((luv)->flag & MLOOPUV_VERTSEL) == MLOOPUV_VERTSEL) == bool_test)
1435 #define UV_EDGE_SEL_TEST(luv, bool_test) \
1436 ((((luv)->flag & MLOOPUV_EDGESEL) == MLOOPUV_EDGESEL) == bool_test)
1450 }
while ((l_iter = l_iter->
next) != l_first);
1463 uint objects_len = 0;
1467 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1468 Object *ob = objects[ob_index];
1481 .calc_looptri = true,
1482 .calc_normals = false,
1483 .is_destructive = false,
1506 if (use_face_center) {
1601 #undef UV_VERT_SEL_TEST
1602 #undef UV_EDGE_SEL_TEST
1607 ot->
name =
"Hide Selected";
1635 uint objects_len = 0;
1639 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1640 Object *ob = objects[ob_index];
1659 .calc_looptri = true,
1660 .calc_normals = false,
1661 .is_destructive = false,
1671 if (use_face_center) {
1753 ot->
name =
"Reveal Hidden";
1806 ®ion->
v2d, event->
mval[0], event->
mval[1], &location[0], &location[1]);
1815 ot->
name =
"Set 2D Cursor";
1832 "Cursor location in normalized (0.0 to 1.0) coordinates",
1849 bool changed_multi =
false;
1851 uint objects_len = 0;
1855 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1856 Object *ob = objects[ob_index];
1867 bool changed =
false;
1894 }
while ((l_other = l_other->
radial_next) != l_iter);
1905 }
while ((l_iter = l_iter->
next) != l_first);
1909 changed_multi =
true;
1922 ot->
name =
"Seams from Islands";
1923 ot->
description =
"Set mesh seams according to island setup in the UV editor";
1924 ot->
idname =
"UV_OT_seams_from_islands";
1956 uint objects_len = 0;
1960 bool changed =
false;
1962 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1963 Object *ob = objects[ob_index];
2115 "Unstitch UV's and move the result",
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct Object * CTX_data_active_object(const bContext *C)
struct bScreen * CTX_wm_screen(const bContext *C)
struct wmMsgBus * CTX_wm_message_bus(const bContext *C)
struct ARegion * CTX_wm_region(const bContext *C)
struct SpaceImage * CTX_wm_space_image(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
void * CustomData_get_layer(const struct CustomData *data, int type)
int CustomData_get_offset(const struct CustomData *data, int type)
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, v3d, r_len)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
#define SH_NODE_TEX_ENVIRONMENT
struct bNode * nodeGetActiveTexture(struct bNodeTree *ntree)
A (mainly) macro array library.
#define BLI_array_append(arr, item)
#define BLI_array_declare(arr)
#define BLI_array_free(arr)
A KD-tree for nearest neighbor search.
float closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void zero_v2(float r[2])
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
#define INIT_MINMAX2(min, max)
#define UNUSED_FUNCTION(x)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_COPY_ON_WRITE
Object is a sort of wrapper for general info.
#define UV_SYNC_SELECTION
#define SCE_SELECT_VERTEX
@ V3D_AROUND_CENTER_BOUNDS
bool ED_space_image_show_cache_and_mval_over(const struct SpaceImage *sima, struct ARegion *region, const int mval[2])
void ED_space_image_get_size(struct SpaceImage *sima, int *r_width, int *r_height)
bool ED_space_image_cursor_poll(struct bContext *C)
struct UvElementMap * BM_uv_element_map_create(struct BMesh *bm, const struct Scene *scene, bool uv_selected, bool use_winding, bool do_islands)
void EDBM_update(struct Mesh *me, const struct EDBMUpdate_Params *params)
bool EDBM_mesh_hide(struct BMEditMesh *em, bool swap)
bool EDBM_mesh_reveal(struct BMEditMesh *em, bool select)
bool EDBM_uv_check(struct BMEditMesh *em)
void BM_uv_element_map_free(struct UvElementMap *element_map)
void ED_node_tree_propagate_change(const struct bContext *C, struct Main *bmain, struct bNodeTree *ntree)
bool ED_operator_uvedit_space_image(struct bContext *C)
bool ED_operator_uvedit(struct bContext *C)
void ED_uvedit_live_unwrap_begin(struct Scene *scene, struct Object *obedit)
bool uvedit_uv_select_test(const struct Scene *scene, struct BMLoop *l, int cd_loop_uv_offset)
void ED_uvedit_live_unwrap(const struct Scene *scene, struct Object **objects, int objects_len)
void ED_uvedit_live_unwrap_re_solve(void)
void uvedit_face_select_disable(const struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, int cd_loop_uv_offset)
bool uvedit_edge_select_test(const struct Scene *scene, struct BMLoop *l, int cd_loop_uv_offset)
bool uvedit_face_visible_test(const struct Scene *scene, struct BMFace *efa)
void ED_uvedit_live_unwrap_end(short cancel)
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block SH_NODE_TEX_IMAGE
void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
struct uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *pup)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
uiPopupMenu * UI_popup_menu_begin(struct bContext *C, const char *title, int icon) ATTR_NONNULL()
void UI_view2d_region_to_view(const struct View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_select_mode_flush(BMesh *bm)
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select)
Select Vert.
void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
Select Edge.
void BM_select_history_validate(BMesh *bm)
void BM_mesh_elem_hflag_enable_test(BMesh *bm, const char htype, const char hflag, const bool respecthide, const bool overwrite, const char hflag_test)
ATTR_WARN_UNUSED_RESULT const void * element
ATTR_WARN_UNUSED_RESULT const BMLoop * l
bool BM_loop_uv_share_edge_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static void clear(Message *msg)
static void update(bNodeTree *ntree)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
struct BMLoop * radial_next
struct bNodeTree * nodetree
struct BMEditMesh * edit_mesh
struct ToolSettings * toolsettings
bool(* poll)(struct bContext *)
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
struct wmOperatorType * type
void UV_OT_rip(struct wmOperatorType *ot)
void UV_OT_select_linked(struct wmOperatorType *ot)
void UV_OT_select_similar(struct wmOperatorType *ot)
bool uvedit_select_is_any_selected_multi(const struct Scene *scene, struct Object **objects, uint objects_len)
void UV_OT_select_less(struct wmOperatorType *ot)
void UV_OT_select_loop(struct wmOperatorType *ot)
void UV_OT_select(struct wmOperatorType *ot)
void UV_OT_select_pinned(struct wmOperatorType *ot)
void UV_OT_select_overlap(struct wmOperatorType *ot)
void UV_OT_select_box(struct wmOperatorType *ot)
void UV_OT_unwrap(struct wmOperatorType *ot)
void UV_OT_select_mode(struct wmOperatorType *ot)
void UV_OT_sphere_project(struct wmOperatorType *ot)
void UV_OT_select_more(struct wmOperatorType *ot)
void UV_OT_smart_project(struct wmOperatorType *ot)
void UV_OT_shortest_path_pick(struct wmOperatorType *ot)
void UV_OT_shortest_path_select(struct wmOperatorType *ot)
void UV_OT_cube_project(struct wmOperatorType *ot)
void UV_OT_cylinder_project(struct wmOperatorType *ot)
void UV_OT_select_split(struct wmOperatorType *ot)
void UV_OT_select_all(struct wmOperatorType *ot)
void UV_OT_stitch(struct wmOperatorType *ot)
void UV_OT_select_lasso(struct wmOperatorType *ot)
void UV_OT_reset(struct wmOperatorType *ot)
void UV_OT_average_islands_scale(struct wmOperatorType *ot)
void UV_OT_select_linked_pick(struct wmOperatorType *ot)
void UV_OT_select_circle(struct wmOperatorType *ot)
void UV_OT_project_from_view(struct wmOperatorType *ot)
void UV_OT_pack_islands(struct wmOperatorType *ot)
void UV_OT_minimize_stretch(struct wmOperatorType *ot)
void UV_OT_select_edge_ring(struct wmOperatorType *ot)
void ED_keymap_uvedit(wmKeyConfig *keyconf)
void uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy, int len)
static void UV_OT_snap_cursor(wmOperatorType *ot)
static eUVEndPointPrecedence uvedit_line_update_get_precedence(const MLoopUV *luv)
static void UV_OT_cursor_set(wmOperatorType *ot)
void ED_operatormacros_uvedit(void)
static int uv_snap_selection_exec(bContext *C, wmOperator *op)
bool ED_uvedit_center_from_pivot(SpaceImage *sima, Scene *scene, ViewLayer *view_layer, float r_center[2], char mode)
static int uv_mark_seam_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
static int uv_remove_doubles_to_selected(bContext *C, wmOperator *op)
static int uv_remove_doubles_exec(bContext *C, wmOperator *op)
bool ED_uvedit_center_multi(const Scene *scene, Object **objects_edit, uint objects_len, float cent[2], char mode)
static void UV_OT_align(wmOperatorType *ot)
static bool uvedit_uv_straighten(Scene *scene, BMesh *bm, eUVWeldAlign tool)
static int uv_hide_exec(bContext *C, wmOperator *op)
static void uv_snap_cursor_to_origin(float uvco[2])
static void UV_OT_mark_seam(wmOperatorType *ot)
static void UV_OT_weld(wmOperatorType *ot)
static bool uv_snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit)
static bool uv_snap_uvs_to_cursor(Scene *scene, Object *obedit, const float cursor[2])
bool ED_uvedit_test(Object *obedit)
static void uv_weld_align(bContext *C, eUVWeldAlign tool)
static bool ED_uvedit_median_multi(const Scene *scene, Object **objects_edit, uint objects_len, float co[2])
static bool uvedit_uv_align_weld(Scene *scene, BMesh *bm, const eUVWeldAlign tool, const float cent[2])
void ED_uvedit_select_all(BMesh *bm)
static bool uvedit_line_update_endpoint(const MLoopUV *luv, float uv_a[2], eUVEndPointPrecedence *prec_a, float uv_b[2], eUVEndPointPrecedence *prec_b)
static void UV_OT_snap_selected(wmOperatorType *ot)
static int uv_weld_exec(bContext *C, wmOperator *UNUSED(op))
static void uv_snap_to_pixel(float uvco[2], float w, float h)
static bool uv_snap_uvs_to_adjacent_unselected(Scene *scene, Object *obedit)
bool ED_uvedit_center_from_pivot_ex(SpaceImage *sima, Scene *scene, ViewLayer *view_layer, float r_center[2], char mode, bool *r_has_select)
static int uv_snap_cursor_exec(bContext *C, wmOperator *op)
static void UV_OT_reveal(wmOperatorType *ot)
static bool uv_snap_uvs_offset(Scene *scene, Object *obedit, const float offset[2])
#define UV_EDGE_SEL_TEST(luv, bool_test)
void ED_operatortypes_uvedit(void)
static bool uvedit_uv_straighten_elements(const UvElement *element, const int len, const int cd_loop_uv_offset, const eUVWeldAlign tool)
static int uv_align_exec(bContext *C, wmOperator *op)
static void UV_OT_hide(wmOperatorType *ot)
static int uv_seams_from_islands_exec(bContext *C, wmOperator *op)
bool ED_object_get_active_image(Object *ob, int mat_nr, Image **r_ima, ImageUser **r_iuser, bNode **r_node, bNodeTree **r_ntree)
static bool uv_snap_cursor_to_selection(Scene *scene, Object **objects_edit, uint objects_len, SpaceImage *sima)
static void uv_snap_cursor_to_pixels(SpaceImage *sima)
static int uv_pin_exec(bContext *C, wmOperator *op)
void uvedit_live_unwrap_update(SpaceImage *sima, Scene *scene, Object *obedit)
static bool bm_face_is_all_uv_sel(BMFace *f, bool select_test, const int cd_loop_uv_offset)
static void UV_OT_seams_from_islands(wmOperatorType *ot)
void ED_object_assign_active_image(Main *bmain, Object *ob, int mat_nr, Image *ima)
#define UV_VERT_SEL_TEST(luv, bool_test)
static int UNUSED_FUNCTION() ED_operator_uvmap_mesh(bContext *C)
static void UV_OT_pin(wmOperatorType *ot)
bool ED_uvedit_minmax(const Scene *scene, Object *obedit, float r_min[2], float r_max[2])
static int uv_reveal_exec(bContext *C, wmOperator *op)
static int uv_set_2d_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int uv_mark_seam_exec(bContext *C, wmOperator *op)
static int uv_remove_doubles_to_unselected(bContext *C, wmOperator *op)
static void UV_OT_remove_doubles(wmOperatorType *ot)
static bool is_image_texture_node(bNode *node)
static int uv_set_2d_cursor_exec(bContext *C, wmOperator *op)
bool ED_uvedit_minmax_multi(const Scene *scene, Object **objects_edit, uint objects_len, float r_min[2], float r_max[2])
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
wmOperatorType * WM_operatortype_append_macro(const char *idname, const char *name, const char *description, int flag)
wmOperatorTypeMacro * WM_operatortype_macro_define(wmOperatorType *ot, const char *idname)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))