[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