211 for (i = 0; i <
len; i++) {
212 uv[i][0] = uv_orig[i][0] * aspx;
213 uv[i][1] = uv_orig[i][1] * aspy;
220 bool changed =
false;
223 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
224 Object *obedit = objects_edit[ob_index];
282 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
283 Object *obedit = objects_edit[ob_index];
316 bool changed =
false;
341 bool changed =
false;
346 if (r_has_select !=
NULL) {
347 uint objects_len = 0;
356 uint objects_len = 0;
361 if (r_has_select !=
NULL) {
362 *r_has_select = changed;
399 float cent[2],
min[2],
max[2];
403 uint objects_len = 0;
408 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
409 Object *obedit = objects[ob_index];
440 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
441 Object *obedit = objects[ob_index];
443 bool changed =
false;
464 luv->
uv[0] = cent[0];
484 luv->
uv[1] = cent[1];
496 BMIter iter, liter, eiter;
533 if (tot_eed_tag == 1) {
561 eve_next = eve_other;
575 scene, eve_line[0], cd_loop_uv_offset);
583 if (uv_start[1] == uv_end[1]) {
587 a = (uv_end[0] - uv_start[0]) / (uv_end[1] - uv_start[1]);
591 if (uv_start[0] == uv_end[0]) {
595 a = (uv_end[1] - uv_start[1]) / (uv_end[0] - uv_start[0]);
613 luv->
uv[0] =
a * (luv->
uv[1] - uv_start[1]) + uv_start[0];
616 luv->
uv[1] =
a * (luv->
uv[0] - uv_start[0]) + uv_start[1];
663 "Align UVs along the line defined by the endpoints"},
668 "Align UVs along the line defined by the endpoints along the X axis"},
673 "Align UVs along the line defined by the endpoints along the Y axis"},
678 "Automatically choose the axis on which there is most alignment already"},
679 {
UV_ALIGN_X,
"ALIGN_X", 0,
"Align X",
"Align UVs on X axis"},
680 {
UV_ALIGN_Y,
"ALIGN_Y", 0,
"Align Y",
"Align UVs on Y axis"},
715 uint objects_len = 0;
719 bool *changed =
MEM_callocN(
sizeof(
bool) * objects_len,
"uv_remove_doubles_selected.changed");
724 "uv_remove_doubles_selected.ob_mloopuv_max_idx");
728 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
729 Object *obedit = objects[ob_index];
739 KDTree_2d *
tree = BLI_kdtree_2d_new(uv_maxlen);
741 int *duplicates =
NULL;
747 int mloopuv_count = 0;
749 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
753 Object *obedit = objects[ob_index];
770 BLI_kdtree_2d_insert(
tree, mloopuv_count, luv->
uv);
778 ob_mloopuv_max_idx[ob_index] = mloopuv_count - 1;
781 BLI_kdtree_2d_balance(
tree);
782 int found_duplicates = BLI_kdtree_2d_calc_duplicates_fast(
tree, threshold,
false, duplicates);
784 if (found_duplicates > 0) {
786 int *uv_duplicate_count =
MEM_callocN(
sizeof(
int) * mloopuv_count,
787 "uv_remove_doubles_selected.uv_duplicate_count");
788 for (
int i = 0; i < mloopuv_count; i++) {
789 if (duplicates[i] == -1) {
790 uv_duplicate_count[i]++;
794 if (duplicates[i] != i) {
797 add_v2_v2(mloopuv_arr[duplicates[i]]->uv, mloopuv_arr[i]->uv);
799 uv_duplicate_count[duplicates[i]]++;
802 for (
int i = 0; i < mloopuv_count; i++) {
803 if (uv_duplicate_count[i] < 2) {
807 mul_v2_fl(mloopuv_arr[i]->uv, 1.0f / (
float)uv_duplicate_count[i]);
813 for (
int i = 0; i < mloopuv_count; i++) {
817 while (ob_mloopuv_max_idx[ob_index] < i) {
821 if (duplicates[i] == -1) {
825 copy_v2_v2(mloopuv_arr[i]->uv, mloopuv_arr[duplicates[i]]->uv);
826 changed[ob_index] =
true;
829 for (ob_index = 0; ob_index < objects_len; ob_index++) {
830 if (changed[ob_index]) {
831 Object *obedit = objects[ob_index];
839 BLI_kdtree_2d_free(
tree);
859 uint objects_len = 0;
865 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
866 Object *obedit = objects[ob_index];
871 KDTree_2d *
tree = BLI_kdtree_2d_new(uv_maxlen);
876 int mloopuv_count = 0;
879 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
883 Object *obedit = objects[ob_index];
900 BLI_kdtree_2d_insert(
tree, mloopuv_count, luv->
uv);
908 BLI_kdtree_2d_balance(
tree);
911 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
915 bool changed =
false;
916 Object *obedit = objects[ob_index];
933 KDTreeNearest_2d nearest;
934 const int i = BLI_kdtree_2d_find_nearest(
tree, luv->
uv, &nearest);
936 if (i != -1 && nearest.dist < threshold) {
951 BLI_kdtree_2d_free(
tree);
969 ot->
name =
"Merge UVs by Distance";
971 "Selected UV vertices that are within a radius of each other are welded together";
972 ot->
idname =
"UV_OT_remove_doubles";
985 "Maximum distance between welded vertices",
989 ot->
srna,
"use_unselected", 0,
"Unselected",
"Merge selected to other unselected vertices");
1026 uvco[0] = roundf(uvco[0] *
w) /
w;
1027 uvco[1] = roundf(uvco[1] * h) / h;
1050 bool changed =
false;
1061 uint objects_len = 0;
1082 {0,
"PIXELS", 0,
"Pixels",
""},
1083 {1,
"SELECTED", 0,
"Selected",
""},
1088 ot->
name =
"Snap Cursor";
1099 ot->
srna,
"target", target_items, 0,
"Target",
"Target to snap the selected UVs to");
1115 bool changed =
false;
1143 bool changed =
false;
1170 BMIter iter, liter, lsubiter;
1172 bool changed =
false;
1193 float uv[2] = {0.0f, 0.0f};
1228 bool changed =
false;
1262 float offset[2] = {0};
1264 uint objects_len = 0;
1277 bool changed_multi =
false;
1278 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1279 Object *obedit = objects[ob_index];
1286 bool changed =
false;
1303 changed_multi =
true;
1317 {0,
"PIXELS", 0,
"Pixels",
""},
1318 {1,
"CURSOR", 0,
"Cursor",
""},
1319 {2,
"CURSOR_OFFSET", 0,
"Cursor (Offset)",
""},
1320 {3,
"ADJACENT_UNSELECTED", 0,
"Adjacent Unselected",
""},
1325 ot->
name =
"Snap Selection";
1326 ot->
description =
"Snap selected UV vertices to target type";
1327 ot->
idname =
"UV_OT_snap_selected";
1336 ot->
srna,
"target", target_items, 0,
"Target",
"Target to snap the selected UVs to");
1357 uint objects_len = 0;
1361 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1362 Object *obedit = objects[ob_index];
1365 bool changed =
false;
1407 "Set/clear selected UV vertices as anchored between multiple unwrap operations";
1417 ot->
srna,
"clear", 0,
"Clear",
"Clear pinning for the selection instead of setting it");
1428 #define UV_SEL_TEST(luv, bool_test) \
1429 ((((luv)->flag & MLOOPUV_VERTSEL) == MLOOPUV_VERTSEL) == bool_test)
1443 }
while ((l_iter = l_iter->
next) != l_first);
1456 uint objects_len = 0;
1460 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1461 Object *ob = objects[ob_index];
1496 if (use_face_center) {
1560 ot->
name =
"Hide Selected";
1590 uint objects_len = 0;
1594 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1595 Object *ob = objects[ob_index];
1614 if (use_face_center) {
1713 ot->
name =
"Reveal Hidden";
1758 if (event->
mval[1] <= 16) {
1767 ®ion->
v2d, event->
mval[0], event->
mval[1], &location[0], &location[1]);
1776 ot->
name =
"Set 2D Cursor";
1793 "Cursor location in normalized (0.0 to 1.0) coordinates",
1810 bool changed_multi =
false;
1812 uint objects_len = 0;
1816 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1817 Object *ob = objects[ob_index];
1828 bool changed =
false;
1855 }
while ((l_other = l_other->
radial_next) != l_iter);
1866 }
while ((l_iter = l_iter->
next) != l_first);
1870 changed_multi =
true;
1883 ot->
name =
"Seams from Islands";
1884 ot->
description =
"Set mesh seams according to island setup in the UV editor";
1885 ot->
idname =
"UV_OT_seams_from_islands";
1917 uint objects_len = 0;
1921 bool changed =
false;
1923 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1924 Object *ob = objects[ob_index];
2074 "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_len(arr)
#define BLI_array_free(arr)
A kd-tree for nearest neighbor search.
void closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
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(struct SpaceImage *sima)
void ED_space_image_get_size(struct SpaceImage *sima, int *r_width, int *r_height)
bool ED_space_image_cursor_poll(struct bContext *C)
void EDBM_selectmode_flush_ex(struct BMEditMesh *em, const short selectmode)
bool EDBM_mesh_hide(struct BMEditMesh *em, bool swap)
void EDBM_update_generic(struct Mesh *me, const bool do_tessellation, const bool is_destructive)
bool EDBM_mesh_reveal(struct BMEditMesh *em, bool select)
bool EDBM_uv_check(struct BMEditMesh *em)
void ED_node_tag_update_nodetree(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node)
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)
void ED_uvedit_live_unwrap(const struct Scene *scene, struct Object **objects, int objects_len)
bool uvedit_uv_select_test(const struct Scene *scene, struct BMLoop *l, const int cd_loop_uv_offset)
void ED_uvedit_live_unwrap_re_solve(void)
void uvedit_face_select_disable(const struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const int cd_loop_uv_offset)
bool uvedit_edge_select_test(const struct Scene *scene, struct BMLoop *l, const 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 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
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume SH_NODE_TEX_IMAGE
void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext)
struct uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *pup)
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()
#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_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_select_history_validate(BMesh *bm)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
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)
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
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.
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static void clear(Message *msg)
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 CustomData pdata ldata
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
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
void UV_OT_rip(struct wmOperatorType *ot)
void UV_OT_select_linked(struct wmOperatorType *ot)
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)
bool uvedit_select_is_any_selected_multi(struct Scene *scene, struct Object **objects, const uint objects_len)
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_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)
const float * uvedit_first_selected_uv_from_vertex(struct Scene *scene, struct BMVert *eve, const int cd_loop_uv_offset)
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 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 int uv_hide_exec(bContext *C, wmOperator *op)
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])
void ED_uvedit_select_all(BMesh *bm)
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_SEL_TEST(luv, bool_test)
void ED_operatortypes_uvedit(void)
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)
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 *))