diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-01-29 00:43:43 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-01-29 00:43:43 +0300 |
commit | 7114486e8bba4fafb8f4f0dca10140bee1e0c9fb (patch) | |
tree | 896672ed20caa09d9eb4d39b41a54acb82611cc2 /source/blender/editors/uvedit | |
parent | db9accc1d17d99e4b8bd53ffff326cd45f85a3fb (diff) |
2.5:
* UV Editor Transform, translate, rotate, scale, live unwrap, snap, gesture,
etc work.
* Also for selection operators, used OPERATOR_FINISHED|OPERATOR_PASS_THROUGH
instead of just OPERATOR_PASS_THROUGH to make gestures work, seems more
correct to me.
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_intern.h | 4 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 128 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_unwrap_ops.c | 19 |
3 files changed, 62 insertions, 89 deletions
diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h index ea188848e1e..eb58562239e 100644 --- a/source/blender/editors/uvedit/uvedit_intern.h +++ b/source/blender/editors/uvedit/uvedit_intern.h @@ -44,10 +44,6 @@ struct wmOperatorType; #define TF_PIN_MASK(id) (TF_PIN1 << id) #define TF_SEL_MASK(id) (TF_SEL1 << id) -/* state testing */ -int uvedit_test(struct Object *obedit); -int uvedit_test_silent(struct Object *obedit); - /* visibility and selection */ int uvedit_face_visible_nolocal(struct Scene *scene, struct EditFace *efa); int uvedit_face_visible(struct Scene *scene, struct Image *ima, struct EditFace *efa, struct MTFace *tf); diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 38e959aeff7..24b664daa13 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -56,6 +56,8 @@ #include "IMB_imbuf_types.h" // XXX remove? +#include "BIF_transform.h" + #include "ED_mesh.h" #include "ED_screen.h" @@ -77,7 +79,7 @@ void uvface_setsel__internal(bContext *C, SpaceImage *sima, Scene *scene, Object /************************* state testing ************************/ -int uvedit_test_silent(Object *obedit) +int ED_uvedit_test_silent(Object *obedit) { if(obedit->type != OB_MESH) return 0; @@ -85,12 +87,12 @@ int uvedit_test_silent(Object *obedit) return EM_texFaceCheck(((Mesh*)obedit->data)->edit_mesh); } -int uvedit_test(Object *obedit) +int ED_uvedit_test(Object *obedit) { // XXX if(!obedit) // XXX error("Enter Edit Mode to perform this action"); - return uvedit_test_silent(obedit); + return ED_uvedit_test_silent(obedit); } /************************* assign image ************************/ @@ -160,7 +162,7 @@ void ED_uvedit_set_tile(Scene *scene, Object *obedit, Image *ima, int curtile, i MTFace *tf; /* verify if we have something to do */ - if(!ima || !uvedit_test_silent(obedit)) + if(!ima || !ED_uvedit_test_silent(obedit)) return; /* skip assigning these procedural images... */ @@ -436,69 +438,6 @@ int uvedit_center(Scene *scene, Image *ima, Object *obedit, float *cent, int mod return 0; } -/************************** constraints ****************************/ - -void uvedit_constrain_square(Scene *scene, Image *ima, EditMesh *em) -{ - EditFace *efa; - MTFace *tf; - - /* if 1 vertex selected: doit (with the selected vertex) */ - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->v4) { - tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - - if(uvedit_face_visible(scene, ima, efa, tf)) { - if(uvedit_uv_selected(scene, efa, tf, 0)) { - if(tf->uv[1][0] == tf->uv[2][0] ) { - tf->uv[1][1]= tf->uv[0][1]; - tf->uv[3][0]= tf->uv[0][0]; - } - else { - tf->uv[1][0]= tf->uv[0][0]; - tf->uv[3][1]= tf->uv[0][1]; - } - - } - - if(uvedit_uv_selected(scene, efa, tf, 1)) { - if(tf->uv[2][1] == tf->uv[3][1] ) { - tf->uv[2][0]= tf->uv[1][0]; - tf->uv[0][1]= tf->uv[1][1]; - } - else { - tf->uv[2][1]= tf->uv[1][1]; - tf->uv[0][0]= tf->uv[1][0]; - } - - } - - if(uvedit_uv_selected(scene, efa, tf, 2)) { - if(tf->uv[3][0] == tf->uv[0][0] ) { - tf->uv[3][1]= tf->uv[2][1]; - tf->uv[1][0]= tf->uv[2][0]; - } - else { - tf->uv[3][0]= tf->uv[2][0]; - tf->uv[1][1]= tf->uv[2][1]; - } - } - - if(uvedit_uv_selected(scene, efa, tf, 3)) { - if(tf->uv[0][1] == tf->uv[1][1] ) { - tf->uv[0][0]= tf->uv[3][0]; - tf->uv[2][1]= tf->uv[3][1]; - } - else { - tf->uv[0][1]= tf->uv[3][1]; - tf->uv[2][0]= tf->uv[3][0]; - } - } - } - } - } -} - /************************** find nearest ****************************/ typedef struct NearestHit { @@ -652,6 +591,41 @@ static void find_nearest_uv_vert(Scene *scene, Image *ima, EditMesh *em, float c } } +int ED_uvedit_nearest_uv(Scene *scene, Object *obedit, Image *ima, float co[2], float uv[2]) +{ + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + float mindist, dist; + int i, nverts, found= 0; + + mindist= 1e10f; + uv[0]= co[0]; + uv[1]= co[1]; + + for(efa= em->faces.first; efa; efa= efa->next) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + if(uvedit_face_visible(scene, ima, efa, tf)) { + nverts= efa->v4? 4: 3; + + for(i=0; i<nverts; i++) { + dist= fabs(co[0]-tf->uv[i][0]) + fabs(co[1]-tf->uv[i][1]); + + if(dist<=mindist) { + mindist= dist; + + uv[0]= tf->uv[i][0]; + uv[1]= tf->uv[i][1]; + found= 1; + } + } + } + } + + return found; +} + /*********************** loop select ***********************/ static void uv_vertex_loop_flag(UvMapVert *first) @@ -1323,9 +1297,6 @@ static int stitch_exec(bContext *C, wmOperator *op) MEM_freeN(uv_average); } - // XXX if(sima->flag & SI_BE_SQUARE) - // XXX uvedit_constrain_square(scene, sima->image, em); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); // XXX @@ -1747,7 +1718,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - return OPERATOR_FINISHED; + return OPERATOR_PASS_THROUGH|OPERATOR_FINISHED; } static int select_exec(bContext *C, wmOperator *op) @@ -1947,7 +1918,7 @@ void borderselect_sima(bContext *C, SpaceImage *sima, Scene *scene, Image *ima, int val, ok = 1; short mval[2], select; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; val= 0; // XXX get_border(&rect, 3); select = 0; // XXX (val==LEFTMOUSE) ? 1 : 0; @@ -2236,7 +2207,7 @@ void snap_uv_curs_to_pixels(SpaceImage *sima, View2D *v2d) int snap_uv_curs_to_sel(Scene *scene, Image *ima, Object *obedit, View2D *v2d) { - if(!uvedit_test(obedit)) return 0; + if(!ED_uvedit_test(obedit)) return 0; return uvedit_center(scene, ima, obedit, v2d->cursor, 0); } @@ -2244,7 +2215,7 @@ void snap_menu_sima(SpaceImage *sima, Scene *scene, Object *obedit, View2D *v2d) { short event; - if(!uvedit_test(obedit) || !v2d) return; /* !G.v2d should never happen */ + if(!ED_uvedit_test(obedit) || !v2d) return; /* !G.v2d should never happen */ event = 0; // XXX pupmenu("Snap %t|Selection -> Pixels%x1|Selection -> Cursor%x2|Selection -> Adjacent Unselected%x3|Cursor -> Selection%x4|Cursor -> Pixel%x5"); switch (event) { @@ -2515,7 +2486,7 @@ void pin_tface_uv(Scene *scene, Image *ima, Object *obedit, int mode) EditFace *efa; MTFace *tface; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; for(efa= em->faces.first; efa; efa= efa->next) { tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); @@ -2547,7 +2518,7 @@ void select_pinned_tface_uv(Scene *scene, Image *ima, Object *obedit) EditFace *efa; MTFace *tface; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; for(efa= em->faces.first; efa; efa= efa->next) { tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); @@ -2597,11 +2568,16 @@ void ED_keymap_uvedit(wmWindowManager *wm) // XXX not working? RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, KM_ALT)->ptr, "extend", 1); + /* generates event, needs to be after select to work */ + WM_keymap_add_item(keymap, "WM_OT_tweak_gesture", SELECTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "UV_OT_de_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_stitch", VKEY, KM_PRESS, 0, 0); + + transform_keymap_for_space(wm, keymap, SPACE_IMAGE); } diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 0fe907677f3..de5838823d1 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -53,6 +53,7 @@ #include "PIL_time.h" #include "ED_mesh.h" +#include "ED_uvedit.h" #include "uvedit_intern.h" #include "uvedit_parametrizer.h" @@ -166,12 +167,12 @@ void unwrap_lscm(Scene *scene, Object *obedit, short seamcut) short fillholes = scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES; /* add uvs if there not here */ - if (!uvedit_test(obedit)) { + if (!ED_uvedit_test(obedit)) { #if 0 if (em && em->faces.first) EM_add_data_layer(&em->fdata, CD_MTFACE); - if (!uvedit_test(obedit)) + if (!ED_uvedit_test(obedit)) return; if (G.sima && G.sima->image) /* this is a bit of a kludge, but assume they want the image on their mesh when UVs are added */ @@ -219,7 +220,7 @@ void minimize_stretch_tface_uv(Scene *scene, Object *obedit) unsigned short event = 0; short fillholes = scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; handle = construct_param_handle(scene, em, 1, fillholes, 1); @@ -309,7 +310,7 @@ void pack_charts_tface_uv(Scene *scene, Object *obedit) EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; ParamHandle *handle; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; handle = construct_param_handle(scene, em, 1, 0, 1); param_pack(handle); @@ -330,7 +331,7 @@ void average_charts_tface_uv(Scene *scene, Object *obedit) EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; ParamHandle *handle; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; handle = construct_param_handle(scene, em, 1, 0, 1); param_average(handle); @@ -349,20 +350,20 @@ void average_charts_tface_uv(Scene *scene, Object *obedit) static ParamHandle *liveHandle = NULL; -void unwrap_lscm_live_begin(Scene *scene, Object *obedit) +void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit) { EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; short abf = scene->toolsettings->unwrapper == 1; short fillholes = scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES; - if(!uvedit_test(obedit)) return; + if(!ED_uvedit_test(obedit)) return; liveHandle = construct_param_handle(scene, em, 0, fillholes, 1); param_lscm_begin(liveHandle, PARAM_TRUE, abf); } -void unwrap_lscm_live_re_solve(void) +void ED_uvedit_live_unwrap_re_solve(void) { if (liveHandle) { param_lscm_solve(liveHandle); @@ -370,7 +371,7 @@ void unwrap_lscm_live_re_solve(void) } } -void unwrap_lscm_live_end(short cancel) +void ED_uvedit_live_unwrap_end(short cancel) { if (liveHandle) { param_lscm_end(liveHandle); |