* LSCM live transform is finally here!
authorMatt Ebb <matt@mke3.net>
Tue, 22 Nov 2005 15:00:32 +0000 (15:00 +0000)
committerMatt Ebb <matt@mke3.net>
Tue, 22 Nov 2005 15:00:32 +0000 (15:00 +0000)
This is a combined effort from Jens, Ton who finished the code here on my machine, and myself putting in the little menu toggle and committing :).

Turn it on and off in the UV/Image window menu UVs -> LSCM Live Transform. It recalculates the LSCM within the transform loop when you're transforming pinned vertices, so it gives realtime feedback - a real time saver! Note: this is much more powerful than proportional edit, since it's properly calculating LSCM using the correct edge angles, etc.

I recorded a quicky demo video here: http://orange.blender.org/wp-content/themes/orange/images/media/lscm_live.mov (quicktime animation codec)

source/blender/include/BDR_unwrapper.h
source/blender/makesdna/DNA_space_types.h
source/blender/src/header_image.c
source/blender/src/transform_generics.c
source/blender/src/unwrapper.c

index d1e6caaa58b5e1a18ac193288f726b2e14c3b621..176bf8c8e68f3ec20cc6b39aba2baa020c589918 100644 (file)
@@ -35,6 +35,7 @@
 
 void set_seamtface(void); /* set TF_SEAM flags in tfaces */
 void unwrap_lscm(void); /* unwrap selected tfaces */
+void unwrap_lscm_live(void); /* unwrap selected tfaces (for live mode, with no undo pushes) */
 void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index);
 
 #endif /* BDR_UNWRAPPER_H */
index 4d63e14ac87ad737b75a117e329f0a1fd68308d6..7007981ff640f72b639321cccfc4bde0b6b8f76b 100644 (file)
@@ -444,6 +444,7 @@ typedef struct SpaceImaSel {
 #define SI_LOCALSTICKY  256
 #define SI_COORDFLOATS  512
 #define SI_PIXELSNAP   1024
+#define SI_LSCM_LIVE   2048
 
 /* SpaceText flags (moved from DNA_text_types.h) */
 
index d839323dd834df89a2d7dab224dffc31ef1d5ca5..8a4603ec532a9c08a2d627affae2ee1ab25e162f 100644 (file)
@@ -1007,6 +1007,10 @@ static void do_image_uvsmenu(void *arg, int event)
     case 10:
                unwrap_lscm();
                break;
+       case 11:
+               if(G.sima->flag & SI_LSCM_LIVE) G.sima->flag &= ~SI_LSCM_LIVE;
+               else G.sima->flag |= SI_LSCM_LIVE;
+               break;
        }
 }
 
@@ -1033,9 +1037,11 @@ static uiBlock *image_uvsmenu(void *arg_unused)
 
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");        
 
+       if(G.sima->flag & SI_LSCM_LIVE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "LSCM Live Transform", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
+       else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "LSCM Live Transform", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "LSCM Unwrap|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpin|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pin|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "LSCM Unwrap|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
 
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");        
 
index 99b9c3d021a1dfe649dba9570a22516b168981cc..edad524e3833320511632eb5fb62f8c1644e88d0 100755 (executable)
@@ -272,6 +272,7 @@ void recalcData(TransInfo *t)
        }
        else if(t->spacetype==SPACE_IMAGE) {
                flushTransUVs(t);
+               if (G.sima->flag & SI_LSCM_LIVE) unwrap_lscm_live();
        }
        else {
                for(base= FIRSTBASE; base; base= base->next) {
index c1bf0d3fa3f5ec83092ca79115b232c836bbe726..045eea316253d13f727403eb1bb2d27402349f2b 100644 (file)
@@ -1164,6 +1164,38 @@ void unwrap_lscm(void)
        allqueue(REDRAWIMAGE, 0);
 }
 
+/* note; to make it quick work, brecht/jens: you can make it nice later! (ton) */
+void unwrap_lscm_live(void)
+{
+    int dopack = 1;
+       int res;
+       Mesh *me;
+       int totgroup, *groups=NULL, a;
+       
+       me= get_mesh(OBACT);
+       if(me==0 || me->tface==0) return;
+       
+       totgroup= make_seam_groups(me, &groups);
+       
+       if(totgroup==0) return;
+       
+       for(a=totgroup; a>0; a--) {
+               res= unwrap_lscm_face_group(me, groups, a);
+               if((res < 3) && (res > -1)) {
+                       seam_group_normalize(me, groups, a);
+               }
+               else {
+                       dopack = 0;
+               }
+               
+       }
+       
+       if(dopack) pack_seam_groups(me, groups, totgroup);
+       
+       MEM_freeN(groups);
+
+}
+
 /* Set tface seams based on edge data, uses hash table to find seam edges. */
 
 void set_seamtface()