[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21099] branches/bmesh/blender/source/ blender/bmesh/operators/removedoubles.c: forgot to add this file.

Joseph Eagar joeedh at gmail.com
Tue Jun 23 08:37:12 CEST 2009


Revision: 21099
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21099
Author:   joeedh
Date:     2009-06-23 08:37:12 +0200 (Tue, 23 Jun 2009)

Log Message:
-----------
forgot to add this file.

Added Paths:
-----------
    branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c

Added: branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c	                        (rev 0)
+++ branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c	2009-06-23 06:37:12 UTC (rev 21099)
@@ -0,0 +1,225 @@
+#include "MEM_guardedalloc.h"
+
+#include "BKE_utildefines.h"
+
+#include "bmesh.h"
+#include "mesh_intern.h"
+#include "bmesh_private.h"
+#include "BLI_arithb.h"
+#include "BLI_ghash.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define BL(ptr) ((BMLoop*)(ptr))
+
+void remdoubles_splitface(BMFace *f, BMesh *bm, BMOperator *op)
+{
+	BMIter liter;
+	BMLoop *l;
+	BMVert *v2, *doub;
+	int split=0;
+
+	BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+		v2 = BMO_Get_MapPointer(bm, op, "targetmap", l->v);
+		/*ok: if v2 is NULL (e.g. not in the map) then it's
+		      a target vert, otherwise it's a double*/
+		if (v2 && BM_Vert_In_Face(f, v2) && v2 != BL(l->head.prev)->v 
+		    && v2 != BL(l->head.next)->v)
+		{
+			doub = l->v;
+			split = 1;
+			break;
+		}
+	}
+
+	if (split) {
+		BMLoop *nl;
+		BMFace *f2 = BM_Split_Face(bm, f, doub, v2, &nl, NULL);
+
+		remdoubles_splitface(f, bm, op);
+		remdoubles_splitface(f2, bm, op);
+	}
+}
+
+#define ELE_DEL		1
+#define EDGE_COL	2
+#define FACE_MARK	2
+
+#if 0
+int remdoubles_face_overlaps(BMesh *bm, BMVert **varr, 
+			     int len, BMFace *exclude, 
+			     BMFace **overlapface)
+{
+	BMIter vertfaces;
+	BMFace *f;
+	int i, amount;
+
+	if (overlapface) *overlapface = NULL;
+
+	for(i=0; i < len; i++){
+		f = BMIter_New(&vertfaces, bm, BM_FACES_OF_VERT, varr[i] );
+		while(f){
+			amount = BM_Verts_In_Face(bm, f, varr, len);
+			if(amount >= len){
+				if (overlapface) *overlapface = f;
+				return 1;				
+			}
+			f = BMIter_Step(&vertfaces);
+		}
+	}
+	return 0;
+}
+#endif
+
+void bmesh_weldverts_exec(BMesh *bm, BMOperator *op)
+{
+	BMIter iter, liter;
+	BMVert *v, *v2;
+	BMEdge *e, *e2, **edges = NULL;
+	V_DECLARE(edges);
+	BMLoop *l;
+	BMFace *f, *f2;
+	int a;
+
+	BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+		if (BMO_Get_MapPointer(bm, op, "targetmap", v))
+			BMO_SetFlag(bm, v, ELE_DEL);
+	}
+
+	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+		remdoubles_splitface(f, bm, op);
+	}
+	
+	BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+		v = BMO_Get_MapPointer(bm, op, "targetmap", e->v1);
+		v2 = BMO_Get_MapPointer(bm, op, "targetmap", e->v2);
+		
+		if (!v) v = e->v1;
+		if (!v2) v2 = e->v2;
+
+		if ((e->v1 != v) || (e->v2 != v2)) {
+			if (v == v2) BMO_SetFlag(bm, e, EDGE_COL);
+			else BM_Make_Edge(bm, v, v2, e, 1);
+
+			BMO_SetFlag(bm, e, ELE_DEL);
+		}
+	}
+
+	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+		BMINDEX_SET(f, 0);
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			if (BMO_TestFlag(bm, l->v, ELE_DEL))
+				BMO_SetFlag(bm, f, FACE_MARK);
+			if (BMO_TestFlag(bm, l->e, EDGE_COL)) 
+				BMINDEX_SET(f, BMINDEX_GET(f)+1);
+		}
+	}
+
+	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+		if (!BMO_TestFlag(bm, f, FACE_MARK)) continue;
+		if (f->len - BMINDEX_GET(f) + 1 < 3) {
+			BMO_SetFlag(bm, f, ELE_DEL);
+			continue;
+		}
+
+		V_RESET(edges);
+		a = 0;
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			v = l->v;
+			v2 = BL(l->head.next)->v;
+			if (BMO_TestFlag(bm, v, ELE_DEL)) 
+				v = BMO_Get_MapPointer(bm, op, "targetmap", v);
+			if (BMO_TestFlag(bm, v2, ELE_DEL)) 
+					v2 = BMO_Get_MapPointer(bm, op, "targetmap", v2);
+			
+			e2 = BM_Edge_Exist(v, v2);
+			if (e2) {
+				V_GROW(edges);
+				edges[a++] = e2;
+			}
+		}
+		
+		f2 = BM_Make_Ngon(bm, v, v2, edges, a, 0);
+		if (f2) {
+			BM_Copy_Attributes(bm, bm, f, f2);
+			BMO_SetFlag(bm, f, ELE_DEL);
+		}
+
+		/*need to still copy customdata stuff here, will do later*/
+	}
+
+	BMO_CallOpf(bm, "del geom=%fvef context=%i", ELE_DEL, DEL_ONLYTAGGED);
+
+	V_FREE(edges);
+}
+
+static int vergaverco(const void *e1, const void *e2)
+{
+	const BMVert *v1 = e1, *v2 = e2;
+	float x1 = v1->co[0] + v1->co[1] + v1->co[2];
+	float x2 = v2->co[0] + v2->co[1] + v2->co[2];
+
+	if (x1 > x2) return 1;
+	else if (x1 < x2) return -1;
+	else return 0;
+}
+
+#define VERT_TESTED	1
+#define VERT_DOUBLE	2
+#define VERT_TARGET	4
+
+void bmesh_removedoubles_exec(BMesh *bm, BMOperator *op)
+{
+	BMOperator weldop;
+	BMOIter oiter;
+	BMVert *v, *v2;
+	BMVert **verts=NULL;
+	V_DECLARE(verts);
+	float dist, distsqr;
+	int i, j, len;
+
+	dist = BMO_Get_Float(op, "dist");
+	distsqr = dist*dist;
+
+	BMO_Init_Op(&weldop, "weldverts");
+	
+	i = 0;
+	BMO_ITER(v, &oiter, bm, op, "verts", BM_VERT) {
+		V_GROW(verts);
+		verts[i++] = v;
+	}
+
+	/*sort by vertex coordinates added together*/
+	qsort(verts, V_COUNT(verts), sizeof(void*), vergaverco);
+	
+	len = V_COUNT(verts);
+	for (i=0; i<len; i++) {
+		v = verts[i];
+		if (BMO_TestFlag(bm, v, VERT_TESTED)) continue;
+		
+		BMO_SetFlag(bm, v, VERT_TESTED);
+		for (j=i+1; j<len; j++) {
+			float vec[3];
+			
+			v2 = verts[j];
+			vec[0] = v->co[0] - v2->co[0];
+			vec[1] = v->co[1] - v2->co[1];
+			vec[2] = v->co[2] - v2->co[2];
+			
+			if (INPR(vec, vec) < distsqr) {
+				BMO_SetFlag(bm, v2, VERT_TESTED);
+				BMO_SetFlag(bm, v2, VERT_DOUBLE);
+				BMO_SetFlag(bm, v, VERT_TARGET);
+			
+				BMO_Insert_MapPointer(bm, &weldop, "targetmap", v2, v);
+			}
+		}
+	}
+
+	V_FREE(verts);
+
+	BMO_Exec_Op(bm, &weldop);
+	BMO_Finish_Op(bm, &weldop);
+}





More information about the Bf-blender-cvs mailing list