[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36178] branches/bmesh/blender/source/ blender/editors: =bmesh= fixed crasher

Joseph Eagar joeedh at gmail.com
Fri Apr 15 04:45:03 CEST 2011


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);
 			




More information about the Bf-blender-cvs mailing list