Revision: 36178
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36178
Author:   joeedh
Date:     2011-04-15 02:45:02 +0000 (Fri, 15 Apr 2011)
Log Message:
-----------
=bmesh= fixed crasher

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c
    branches/bmesh/blender/source/blender/editors/util/crazyspace.c

Modified: 
branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c    
2011-04-15 02:18:24 UTC (rev 36177)
+++ branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c    
2011-04-15 02:45:02 UTC (rev 36178)
@@ -27,11 +27,11 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/editors/space_view3d/view3d_snap.c
- *  \ingroup spview3d
- */
-
-
+/** \file blender/editors/space_view3d/view3d_snap.c
+ *  \ingroup spview3d
+ */
+
+
 #include <math.h>
 #include <string.h>
 
@@ -58,6 +58,7 @@
 #include "BKE_main.h"
 #include "BKE_object.h"
 #include "BKE_tessmesh.h"
+#include "BKE_DerivedMesh.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -79,7 +80,7 @@
 
 typedef struct TransVert {
        float *loc;
-       float oldloc[3], fac;
+       float oldloc[3], maploc[3], fac;
        float *val, oldval;
        int flag;
        float *nor;
@@ -189,6 +190,17 @@
        }
 }
 
+static void set_mapped_co(void *vuserdata, int index, float *co, float *no, 
short *no_s)
+{
+       void ** userdata = vuserdata;
+       BMEditMesh *em = userdata[0];
+       TransVert *tv = userdata[1];
+       BMVert *eve = EDBM_get_vert_for_index(em, index);
+       
+       if (BMINDEX_GET(eve) != -1)
+               copy_v3_v3(tv[BMINDEX_GET(eve)].maploc, co);
+}
+
 /* copied from editobject.c, needs to be replaced with new transform code 
still */
 /* mode flags: */
 #define TM_ALL_JOINTS          1 /* all joints (for bones only) */
@@ -215,6 +227,7 @@
                BMEditMesh *em= me->edit_btmesh;
                BMesh *bm = em->bm;
                BMIter iter;
+               void *userdata[2] = {em, NULL};
                int proptrans= 0;
                
                // transform now requires awareness for select mode, so we tag 
the f1 flags in verts
@@ -266,18 +279,34 @@
                /* and now make transverts */
                if(tottrans) {
                        tv=transvmain= MEM_callocN(tottrans*sizeof(TransVert), 
"maketransverts");
-
+               
+                       a = 0;
                        BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
                                if(BMINDEX_GET(eve)) {
+                                       BMINDEX_SET(eve, a);
                                        VECCOPY(tv->oldloc, eve->co);
                                        tv->loc= eve->co;
-                                       if(eve->no[0] != 0.0f || eve->no[1] != 
0.0f ||eve->no[2] != 0.0f)
+                                       if(eve->no[0] != 0.0f || eve->no[1] != 
0.0f ||eve->no[2] != 0.0f)
                                                tv->nor= eve->no; // note this 
is a hackish signal (ton)
                                        tv->flag= BMINDEX_GET(eve) & SELECT;
                                        tv++;
-                               }
+                                       a++;
+                               } else BMINDEX_SET(eve, -1);
                        }
+                       
+                       userdata[1] = transvmain;
                }
+               
+               if (transvmain && em->derivedFinal) {
+                       EDBM_init_index_arrays(em, 1, 0, 0);
+                       em->derivedFinal->foreachMappedVert(em->derivedFinal, 
set_mapped_co, userdata);
+                       EDBM_free_index_arrays(em);
+               } else if (transvmain) {
+                       tv = transvmain;
+                       for (a=0; a<tottrans; a++, tv++) {
+                               copy_v3_v3(tv->maploc, tv->loc);
+                       }
+               }
        }
        else if (obedit->type==OB_ARMATURE){
                bArmature *arm= obedit->data;
@@ -455,11 +484,11 @@
        for(a=0; a<tottrans; a++, tv++) {
                if(tv->flag & SELECT) {
                        add_v3_v3(centroid, tv->oldloc);
-                       total += 1.0f;
+                       total += 1.0f;
                        DO_MINMAX(tv->oldloc, min, max);
                }
        }
-       if(total != 0.0f) {
+       if(total != 0.0f) {
                mul_v3_fl(centroid, 1.0f/total);
        }
 
@@ -497,9 +526,9 @@
                        VECCOPY(vec, tv->loc);
                        mul_m3_v3(bmat, vec);
                        add_v3_v3(vec, obedit->obmat[3]);
-                       vec[0]= gridf*floorf(0.5f+ vec[0]/gridf);
-                       vec[1]= gridf*floorf(0.5f+ vec[1]/gridf);
-                       vec[2]= gridf*floorf(0.5f+ vec[2]/gridf);
+                       vec[0]= gridf*floorf(0.5f+ vec[0]/gridf);
+                       vec[1]= gridf*floorf(0.5f+ vec[1]/gridf);
+                       vec[2]= gridf*floorf(0.5f+ vec[2]/gridf);
                        sub_v3_v3(vec, obedit->obmat[3]);
                        
                        mul_m3_v3(imat, vec);
@@ -527,9 +556,9 @@
                                                                
                                                                /* get nearest 
grid point to snap to */
                                                                VECCOPY(nLoc, 
pchan->pose_mat[3]);
-                                                               vec[0]= gridf * 
(float)(floor(0.5f+ nLoc[0]/gridf));
-                                                               vec[1]= gridf * 
(float)(floor(0.5f+ nLoc[1]/gridf));
-                                                               vec[2]= gridf * 
(float)(floor(0.5f+ nLoc[2]/gridf));
+                                                               vec[0]= gridf * 
(float)(floor(0.5f+ nLoc[0]/gridf));
+                                                               vec[1]= gridf * 
(float)(floor(0.5f+ nLoc[1]/gridf));
+                                                               vec[2]= gridf * 
(float)(floor(0.5f+ nLoc[2]/gridf));
                                                                
                                                                /* get 
bone-space location of grid point */
                                                                
armature_loc_pose_to_bone(pchan, vec, vecN);
@@ -557,9 +586,9 @@
                        else {
                                ob->recalc |= OB_RECALC_OB;
                                
-                               vec[0]= -ob->obmat[3][0]+gridf*floorf(0.5f+ 
ob->obmat[3][0]/gridf);
-                               vec[1]= -ob->obmat[3][1]+gridf*floorf(0.5f+ 
ob->obmat[3][1]/gridf);
-                               vec[2]= -ob->obmat[3][2]+gridf*floorf(0.5f+ 
ob->obmat[3][2]/gridf);
+                               vec[0]= -ob->obmat[3][0]+gridf*floorf(0.5f+ 
ob->obmat[3][0]/gridf);
+                               vec[1]= -ob->obmat[3][1]+gridf*floorf(0.5f+ 
ob->obmat[3][1]/gridf);
+                               vec[2]= -ob->obmat[3][2]+gridf*floorf(0.5f+ 
ob->obmat[3][2]/gridf);
                                
                                if(ob->parent) {
                                        where_is_object(scene, ob);
@@ -742,9 +771,9 @@
        gridf= rv3d->gridview;
        curs= give_cursor(scene, v3d);
 
-       curs[0]= gridf*floorf(0.5f+curs[0]/gridf);
-       curs[1]= gridf*floorf(0.5f+curs[1]/gridf);
-       curs[2]= gridf*floorf(0.5f+curs[2]/gridf);
+       curs[0]= gridf*floorf(0.5f+curs[0]/gridf);
+       curs[1]= gridf*floorf(0.5f+curs[1]/gridf);
+       curs[2]= gridf*floorf(0.5f+curs[2]/gridf);
        
        WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);        // hrm
        
@@ -803,7 +832,7 @@
                }
                
                if(v3d->around==V3D_CENTROID) {
-                       mul_v3_fl(centroid, 1.0f/(float)tottrans);
+                       mul_v3_fl(centroid, 1.0f/(float)tottrans);
                        VECCOPY(curs, centroid);
                }
                else {
@@ -843,7 +872,7 @@
                }
                if(count) {
                        if(v3d->around==V3D_CENTROID) {
-                               mul_v3_fl(centroid, 1.0f/(float)count);
+                               mul_v3_fl(centroid, 1.0f/(float)count);
                                VECCOPY(curs, centroid);
                        }
                        else {
@@ -978,7 +1007,7 @@
        
        tv= transvmain;
        for(a=0; a<tottrans; a++, tv++) {               
-               VECCOPY(vec, tv->loc);
+               VECCOPY(vec, tv->maploc);
                mul_m3_v3(bmat, vec);
                add_v3_v3(vec, obedit->obmat[3]);
                add_v3_v3(centroid, vec);

Modified: branches/bmesh/blender/source/blender/editors/util/crazyspace.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/util/crazyspace.c     
2011-04-15 02:18:24 UTC (rev 36177)
+++ branches/bmesh/blender/source/blender/editors/util/crazyspace.c     
2011-04-15 02:45:02 UTC (rev 36178)
@@ -156,6 +156,9 @@
        
        index = 0;
        BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+               if (!BM_TestHFlag(v, BM_SELECT) || BM_TestHFlag(v, BM_HIDDEN))
+                       continue;
+               
                BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, v) {
                        BMLoop *l2 = BM_OtherFaceLoop(l->e, l->f, v);
                        

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to