[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60147] trunk/blender/source/blender/ editors: modify crazyspace_get_mapped_editverts to work like crazyspace_set_quats_mesh

Campbell Barton ideasman42 at gmail.com
Sun Sep 15 13:38:48 CEST 2013


Revision: 60147
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60147
Author:   campbellbarton
Date:     2013-09-15 11:38:48 +0000 (Sun, 15 Sep 2013)
Log Message:
-----------
modify crazyspace_get_mapped_editverts to work like crazyspace_set_quats_mesh
- array of quats is now aligned with the vertices (over alloc, it simplifies things and removes need to set invalid index values).
- remove visit-bitmap from crazyspace_get_mapped_editverts(). setting coords multiple times isnt bad.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_util.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/util/crazyspace.c

Modified: trunk/blender/source/blender/editors/include/ED_util.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_util.h	2013-09-15 10:56:36 UTC (rev 60146)
+++ trunk/blender/source/blender/editors/include/ED_util.h	2013-09-15 11:38:48 UTC (rev 60147)
@@ -78,8 +78,8 @@
 void    undo_editmode_clear(void);
 
 /* crazyspace.c */
-float *crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit);
-void crazyspace_set_quats_editmesh(struct BMEditMesh *em, float *origcos, float *mappedcos, float *quats);
+float (*crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit))[3];
+void crazyspace_set_quats_editmesh(struct BMEditMesh *em, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]);
 void crazyspace_set_quats_mesh(struct Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]);
 int sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);
 void crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-09-15 10:56:36 UTC (rev 60146)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-09-15 11:38:48 UTC (rev 60147)
@@ -2127,7 +2127,7 @@
 	BMVert *eve;
 	BMIter iter;
 	BMVert *eve_act = NULL;
-	float *mappedcos = NULL, *quats = NULL;
+	float (*mappedcos)[3] = NULL, (*quats)[4] = NULL;
 	float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
 	float *dists = NULL;
 	int a;
@@ -2216,9 +2216,6 @@
 		island_info = editmesh_islands_info_calc(em, &island_info_tot, &island_vert_map);
 	}
 
-	/* BMESH_TODO, crazy-space writing into the index values is BAD!, means we cant
-	 * use the values for vertex mirror - campbell */
-
 	/* detect CrazySpace [tm] */
 	if (modifiers_getCageIndex(t->scene, t->obedit, NULL, 1) >= 0) {
 		if (modifiers_isCorrectableDeformed(t->obedit)) {
@@ -2232,8 +2229,8 @@
 			 * the modifiers that support deform matrices (defcos) */
 			if (totleft > 0) {
 				mappedcos = crazyspace_get_mapped_editverts(t->scene, t->obedit);
-				quats = MEM_mallocN((t->total) * sizeof(float) * 4, "crazy quats");
-				crazyspace_set_quats_editmesh(em, (float *)defcos, mappedcos, quats); /* BMESH_TODO, abuses vertex index, should use an int array */
+				quats = MEM_mallocN(em->bm->totvert * sizeof(*quats), "crazy quats");
+				crazyspace_set_quats_editmesh(em, defcos, mappedcos, quats);
 				if (mappedcos)
 					MEM_freeN(mappedcos);
 			}
@@ -2285,12 +2282,12 @@
 				}
 
 				/* CrazySpace */
-				if (defmats || (quats && BM_elem_index_get(eve) != -1)) {
+				if (defmats || (quats && BM_elem_flag_test(eve, BM_ELEM_TAG))) {
 					float mat[3][3], qmat[3][3], imat[3][3];
 
 					/* use both or either quat and defmat correction */
-					if (quats && BM_elem_index_get(eve) != -1) {
-						quat_to_mat3(qmat, quats + 4 * BM_elem_index_get(eve));
+					if (quats && BM_elem_flag_test(eve, BM_ELEM_TAG)) {
+						quat_to_mat3(qmat, quats[BM_elem_index_get(eve)]);
 
 						if (defmats)
 							mul_serie_m3(mat, mtx, qmat, defmats[a],

Modified: trunk/blender/source/blender/editors/util/crazyspace.c
===================================================================
--- trunk/blender/source/blender/editors/util/crazyspace.c	2013-09-15 10:56:36 UTC (rev 60146)
+++ trunk/blender/source/blender/editors/util/crazyspace.c	2013-09-15 11:38:48 UTC (rev 60147)
@@ -40,7 +40,6 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
-#include "BLI_bitmap.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_modifier.h"
@@ -51,8 +50,7 @@
 #include "ED_util.h"
 
 typedef struct {
-	float *vertexcos;
-	BLI_bitmap *vertex_visit;
+	float (*vertexcos)[3];
 } MappedUserData;
 
 BLI_INLINE void tan_calc_v3(float a[3], const float b[3], const float c[3])
@@ -85,15 +83,7 @@
                                     const float UNUSED(no_f[3]), const short UNUSED(no_s[3]))
 {
 	MappedUserData *mappedData = (MappedUserData *)userData;
-	float *vec = mappedData->vertexcos;
-
-	vec += 3 * index;
-	if (BLI_BITMAP_GET(mappedData->vertex_visit, index) == 0) {
-		/* we need coord from prototype vertex, not it clones or images,
-		 * suppose they stored in the beginning of vertex array stored in DM */
-		copy_v3_v3(vec, co);
-		BLI_BITMAP_SET(mappedData->vertex_visit, index);
-	}
+	copy_v3_v3(mappedData->vertexcos[index], co);
 }
 
 static int modifiers_disable_subsurf_temporary(Object *ob)
@@ -112,13 +102,12 @@
 }
 
 /* disable subsurf temporal, get mapped cos, and enable it */
-float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
+float (*crazyspace_get_mapped_editverts(Scene *scene, Object *obedit))[3]
 {
 	Mesh *me = obedit->data;
 	DerivedMesh *dm;
-	float *vertexcos;
+	float (*vertexcos)[3];
 	int nverts = me->edit_btmesh->bm->totvert;
-	BLI_bitmap *vertex_visit;
 	MappedUserData userData;
 
 	/* disable subsurf temporal, get mapped cos, and enable it */
@@ -130,11 +119,9 @@
 	/* now get the cage */
 	dm = editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
 
-	vertexcos = MEM_callocN(3 * sizeof(float) * nverts, "vertexcos map");
-	vertex_visit = BLI_BITMAP_NEW(nverts, "vertexcos flags");
+	vertexcos = MEM_callocN(sizeof(*vertexcos) * nverts, "vertexcos map");
 
 	userData.vertexcos = vertexcos;
-	userData.vertex_visit = vertex_visit;
 	dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP);
 
 	dm->release(dm);
@@ -142,60 +129,64 @@
 	/* set back the flag, no new cage needs to be built, transform does it */
 	modifiers_disable_subsurf_temporary(obedit);
 
-	MEM_freeN(vertex_visit);
-
 	return vertexcos;
 }
 
-void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mappedcos, float *quats)
+void crazyspace_set_quats_editmesh(BMEditMesh *em, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4])
 {
-	BMVert *v;
-	BMIter iter, liter;
-	BMLoop *l;
-	float *v1, *v2, *v3, *co1, *co2, *co3;
-	int *vert_table = MEM_callocN(sizeof(int) * em->bm->totvert, "vert_table");
-	int index = 0;
+	BMFace *f;
+	BMIter iter;
+	int index;
 
-	BM_mesh_elem_index_ensure(em->bm, BM_VERT);
-
-	BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
-		if (!BM_elem_flag_test(v, BM_ELEM_SELECT) || BM_elem_flag_test(v, BM_ELEM_HIDDEN))
-			continue;
-		
-		BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
-			BMLoop *l2 = BM_loop_other_edge_loop(l, v);
-			
-			/* retrieve mapped coordinates */
-			v1 = mappedcos + 3 * BM_elem_index_get(l->v);
-			v2 = mappedcos + 3 * BM_elem_index_get(BM_edge_other_vert(l2->e, l->v));
-			v3 = mappedcos + 3 * BM_elem_index_get(BM_edge_other_vert(l->e, l->v));
-
-			co1 = (origcos) ? origcos + 3 * BM_elem_index_get(l->v) : l->v->co;
-			co2 = (origcos) ? origcos + 3 * BM_elem_index_get(BM_edge_other_vert(l2->e, l->v)) : BM_edge_other_vert(l2->e, l->v)->co;
-			co3 = (origcos) ? origcos + 3 * BM_elem_index_get(BM_edge_other_vert(l->e, l->v)) : BM_edge_other_vert(l->e, l->v)->co;
-			
-			set_crazy_vertex_quat(quats, v1, v2, v3, co1, co2, co3);
-			quats += 4;
-			
-			vert_table[BM_elem_index_get(l->v)] = index + 1;
-			
-			index++;
-			break; /*just do one corner*/
+	{
+		BMVert *v;
+		BM_ITER_MESH_INDEX (v, &iter, em->bm, BM_VERTS_OF_MESH, index) {
+			BM_elem_flag_disable(v, BM_ELEM_TAG);
+			BM_elem_index_set(v, index);  /* set_inline */
 		}
+		em->bm->elem_index_dirty &= ~BM_VERT;
 	}
 
-	index = 0;
-	BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
-		if (vert_table[index] != 0)
-			BM_elem_index_set(v, vert_table[index] - 1);  /* set_dirty! */
-		else
-			BM_elem_index_set(v, -1);  /* set_dirty! */
-		
-		index++;
-	}
-	em->bm->elem_index_dirty |= BM_VERT;
+	BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
+		BMLoop *l_iter, *l_first;
 
-	MEM_freeN(vert_table);
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
+			if (!BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT) || BM_elem_flag_test(l_iter->v, BM_ELEM_HIDDEN))
+				continue;
+
+			if (!BM_elem_flag_test(l_iter->v, BM_ELEM_TAG)) {
+				const float *co_prev, *co_curr, *co_next;  /* orig */
+				const float *vd_prev, *vd_curr, *vd_next;  /* deform */
+
+				const int i_prev = BM_elem_index_get(l_iter->prev->v);
+				const int i_curr = BM_elem_index_get(l_iter->v);
+				const int i_next = BM_elem_index_get(l_iter->next->v);
+
+				/* retrieve mapped coordinates */
+				vd_prev = mappedcos[i_prev];
+				vd_curr = mappedcos[i_curr];
+				vd_next = mappedcos[i_next];
+
+				if (origcos) {
+					co_prev = origcos[i_prev];
+					co_curr = origcos[i_curr];
+					co_next = origcos[i_next];
+				}
+				else {
+					co_prev = l_iter->prev->v->co;
+					co_curr = l_iter->v->co;
+					co_next = l_iter->next->v->co;
+				}
+
+				set_crazy_vertex_quat(quats[i_curr],
+				                      co_curr, co_next, co_prev,
+				                      vd_curr, vd_next, vd_prev);
+
+				BM_elem_flag_enable(l_iter->v, BM_ELEM_TAG);
+			}
+		} while ((l_iter = l_iter->next) != l_first);
+	}
 }
 
 void crazyspace_set_quats_mesh(Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4])




More information about the Bf-blender-cvs mailing list