[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27402] branches/bmesh/blender/source/ blender: brought back x-mirror editing, though it's currently buggy.

Joseph Eagar joeedh at gmail.com
Thu Mar 11 06:30:02 CET 2010


Revision: 27402
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27402
Author:   joeedh
Date:     2010-03-11 06:30:01 +0100 (Thu, 11 Mar 2010)

Log Message:
-----------
brought back x-mirror editing, though it's currently buggy.  also made tesselation face normals writable to disk.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.h
    branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
    branches/bmesh/blender/source/blender/editors/transform/transform_generics.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2010-03-11 05:30:01 UTC (rev 27402)
@@ -57,6 +57,10 @@
 	/*Mesh structure this editmesh came from, if it came from one*/
 	struct Mesh *me;
 	struct Object *ob;
+
+	/*temp variables for x-mirror editing*/
+	int mirror_cdlayer;
+	int mirr_free_arrays;
 } BMEditMesh;
 
 void BMEdit_RecalcTesselation(BMEditMesh *tm);

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2010-03-11 05:30:01 UTC (rev 27402)
@@ -936,7 +936,7 @@
 	 layerSwap_mcol, layerDefault_mcol},
 	{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 3 floats per normal vector */
-	{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+	{sizeof(float)*3, "vec3f", 1, NULL, NULL, NULL, NULL, NULL, NULL},
 	{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	{sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
 	{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2010-03-11 05:30:01 UTC (rev 27402)
@@ -316,6 +316,7 @@
 void BM_Data_Facevert_Edgeinterp(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, struct BMEdge *e1, float fac);
 //void bmesh_data_interp_from_face(struct BMesh *bm, struct BMFace *source, struct BMFace *target);
 void BM_add_data_layer(BMesh *em, CustomData *data, int type);
+void BM_add_data_layer_named(BMesh *bm, CustomData *data, int type, char *name);
 void BM_free_data_layer(BMesh *em, CustomData *data, int type);
 
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2010-03-11 05:30:01 UTC (rev 27402)
@@ -254,6 +254,18 @@
 	if (olddata.layers) MEM_freeN(olddata.layers);
 }
 
+void BM_add_data_layer_named(BMesh *bm, CustomData *data, int type, char *name)
+{
+	CustomData olddata;
+
+	olddata= *data;
+	olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
+	CustomData_add_layer_named(data, type, CD_DEFAULT, NULL, 0, name);
+
+	update_data_blocks(bm, &olddata, data);
+	if (olddata.layers) MEM_freeN(olddata.layers);
+}
+
 void BM_free_data_layer(BMesh *bm, CustomData *data, int type)
 {
 	CustomData olddata;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2010-03-11 05:30:01 UTC (rev 27402)
@@ -128,35 +128,14 @@
 		if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1;
 		BM_ClearHFlag(v, BM_SELECT);
 	}
-
-	/*BMESH_TODO hrm, not sure if flushing here is such a good idea. . .
-	  but probably easier then calling a EDBM_Normalize_Selection after
-	  each tool?*/
-#if 0
-	BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
-		if (!BM_TestHFlag(e, BM_SELECT) && BM_TestHFlag(e->v1, BM_SELECT) 
-		                                && BM_TestHFlag(e->v2, BM_SELECT)) {
-			BM_SetHFlag(e, BM_SELECT);
-			bm->totedgesel += 1;
-		} else if (BM_TestHFlag(e, BM_SELECT) && (!BM_TestHFlag(e->v1, BM_SELECT) 
-		                                      || !BM_TestHFlag(e->v2, BM_SELECT))) {
-			BM_ClearHFlag(e, BM_SELECT);
-			bm->totedgesel -= 1;		
-		}
-	}
-#endif
 }
 
 /*
  * BMESH SELECT EDGE
  *
  * Changes selection state of a single edge
- * in a mesh. Note that this is actually not
- * 100 percent reliable. Deselecting an edge
- * will also deselect both its vertices
- * regardless of the selection state of
- * other edges incident upon it. Fixing this
- * issue breaks multi-select mode though...
+ * in a mesh. Note that this may not be
+ * 100 percent reliable.
  *
 */
 
@@ -165,7 +144,7 @@
 	int candesel;
 	int testiso = 1;
 
-	/*I might move this logic to bmeshutils_mods.c, where it'd be invoked
+	/*I might move this logic to editors/mesh/bmesh_select.c, where it'd be invoked
 	  by the selection tools.  in that case, we'd still retain the checks
 	  for if an edge's verts can be deselected.*/
 

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2010-03-11 05:30:01 UTC (rev 27402)
@@ -85,6 +85,28 @@
 
 /* bmeshutils.c */
 
+/*x-mirror editing api.  usage:
+  
+  EDBM_CacheMirrorVerts(em);
+  ...
+  ...
+  BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+     mirrorv = EDBM_GetMirrorVert(em, v);
+  }
+  ...
+  ...
+  EDBM_EndMirrorCache(em);
+ 
+  note: why do we only allow x axis mirror editing?
+  */
+void EDBM_CacheMirrorVerts(struct BMEditMesh *em);
+
+/*retrieves mirrored cache vert, or NULL if there isn't one.
+  note: calling this without ensuring the mirror cache state
+  is bad.*/
+struct BMVert *EDBM_GetMirrorVert(struct BMEditMesh *em, struct BMVert *v);
+void EDBM_EndMirrorCache(struct BMEditMesh *em);
+
 void EDBM_RecalcNormals(struct BMEditMesh *em);
 
 void EDBM_MakeEditBMesh(struct ToolSettings *ts, struct Scene *scene, struct Object *ob);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2010-03-11 05:30:01 UTC (rev 27402)
@@ -73,6 +73,8 @@
 #include "BKE_report.h"
 #include "BKE_tessmesh.h"
 
+#include "bmesh.h"
+
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
@@ -86,8 +88,8 @@
 
 #include "UI_interface.h"
 
+#include "editbmesh_bvh.h"
 #include "mesh_intern.h"
-#include "bmesh.h"
 
 void EDBM_RecalcNormals(BMEditMesh *em)
 {
@@ -805,3 +807,91 @@
 	return em && em->bm->totface && CustomData_has_layer(&em->bm->ldata, CD_MLOOPCOL);
 }
 
+
+void EDBM_CacheMirrorVerts(BMEditMesh *em)
+{
+	BMBVHTree *tree = BMBVH_NewBVH(em);
+	BMIter iter;
+	BMVert *v;
+	float invmat[4][4];
+	int li, i;
+
+	if (!em->vert_index) {
+		EDBM_init_index_arrays(em, 1, 0, 0);
+		em->mirr_free_arrays = 1;
+	}
+
+	if (!CustomData_get_layer_named(&em->bm->vdata, CD_PROP_INT, "__mirror_index")) {
+		BM_add_data_layer_named(em->bm, &em->bm->vdata, CD_PROP_INT, "__mirror_index");
+	}
+
+	li = CustomData_get_named_layer_index(&em->bm->vdata, CD_PROP_INT, "__mirror_index");
+	em->bm->vdata.layers[li].flag |= CD_FLAG_TEMPORARY;
+
+	/*multiply verts by object matrix, temporarily*/
+
+	i = 0;
+	BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+		BMINDEX_SET(v, i);
+		i++;
+
+		if (em->ob) 
+			mul_m4_v3(em->ob->obmat, v->co);
+	}
+
+	BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+		BMVert *mirr;
+		int *idx = CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, li);
+		float co[3] = {-v->co[0], v->co[1], v->co[2]};
+
+		//temporary for testing, check for selection
+		if (!BM_TestHFlag(v, BM_SELECT))
+			continue;
+		
+		mirr = BMBVH_FindClosestVertTopo(tree, co, BM_SEARCH_MAXDIST, v);
+		if (mirr && mirr != v) {
+			*idx = BMINDEX_GET(mirr);
+			idx = CustomData_bmesh_get_layer_n(&em->bm->vdata,mirr->head.data, li);
+			*idx = BMINDEX_GET(v);
+		} else *idx = -1;
+	}
+
+	/*unmultiply by object matrix*/
+	if (em->ob) {
+		i = 0;
+		invert_m4_m4(invmat, em->ob->obmat);
+		BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+			BMINDEX_SET(v, i);
+			i++;
+
+			mul_m4_v3(invmat, v->co);
+		}
+
+		BMBVH_FreeBVH(tree);
+	}
+}
+
+BMVert *EDBM_GetMirrorVert(BMEditMesh *em, BMVert *v)
+{
+	int *mirr = CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, em->mirror_cdlayer);
+	
+	if (mirr && *mirr >=0 && *mirr < em->bm->totvert) {
+		if (!em->vert_index) {
+			printf("err: should only be called between "
+				"EDBM_CacheMirrorVerts and EDBM_EndMirrorCache");
+			return NULL;
+		}
+
+		return em->vert_index[*mirr];
+	}
+
+	return NULL;
+}
+
+void EDBM_EndMirrorCache(BMEditMesh *em)
+{
+	if (em->mirr_free_arrays) {
+		MEM_freeN(em->vert_index);
+		em->vert_index = NULL;
+	}
+}

Modified: branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c	2010-03-10 21:21:14 UTC (rev 27401)
+++ branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c	2010-03-11 05:30:01 UTC (rev 27402)
@@ -325,7 +325,7 @@
 	BLI_array_declare(stack2);
 	float vec1[3], vec2[3], minangle=FLT_MAX, w;
 	int lvl=1;
-	static int maxlevel = 8;
+	static int maxlevel = 3;
 
 	/*ok.  see how similar v is to v2, based on topological similaritys in the local
 	  topological neighborhood*/
@@ -409,17 +409,65 @@
 		if (!s1->curl)
 			s1->curl = s1->cure->loop;
 		if (!s2->curl) {
+			float no1[3], no2[3], angle;
 			int wind1, wind2;
 			
 			s2->curl = s2->cure->loop;
 
 			/*find which of two possible faces to use*/
-			wind1 = winding(s1->v->co, s1->lastv->co, 
-				s1->v == s1->curl->v ? ((BMLoop*)s1->curl->head.prev->prev)->v->co : ((BMLoop*)s1->curl->head.next->next)->v->co);
+			l1 = BM_OtherFaceLoop(s1->curl->e, s1->curl->f, s1->lastv);
+			l2 = BM_OtherFaceLoop(s2->curl->e, s2->curl->f, s2->lastv);
 
-			wind2 = winding(s2->v->co, s2->lastv->co, 
-				s2->v == s2->curl->v ? ((BMLoop*)s2->curl->head.prev->prev)->v->co : ((BMLoop*)s2->curl->head.next->next)->v->co);
+			if (l1->v == s2->lastv) {
+				l1 = (BMLoop*) l1->head.next;
+				if (l1->v == s2->v)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list