[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23697] branches/bmesh/blender/source/ blender: part 1 of vkey rip tool.

Joseph Eagar joeedh at gmail.com
Wed Oct 7 23:19:59 CEST 2009


Revision: 23697
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23697
Author:   joeedh
Date:     2009-10-07 23:19:58 +0200 (Wed, 07 Oct 2009)

Log Message:
-----------
part 1 of vkey rip tool.  still needs more work.  ugh, doing this tool correctly is a nightmare.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenlib/BLI_array.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_view.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.h

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-10-07 21:19:58 UTC (rev 23697)
@@ -882,32 +882,50 @@
 					
 					bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol);
 					
-					glTexCoord2fv(luv[0]->uv);
-					glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b);
+					if (luv[0])
+						glTexCoord2fv(luv[0]->uv);
+					if (lcol[0])
+						glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b);
+					else glColor3ub(0, 0, 0);
 					glVertex3fv(ls[0]->v->co);
 
-					glTexCoord2fv(luv[1]->uv);
-					glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b);
+					if (luv[1])
+						glTexCoord2fv(luv[1]->uv);
+					if (lcol[1])
+						glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b);
+					else glColor3ub(0, 0, 0);
 					glVertex3fv(ls[1]->v->co);
 
-					glTexCoord2fv(luv[2]->uv);
-					glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b);
+					if (luv[2])
+						glTexCoord2fv(luv[2]->uv);
+					if (lcol[2])
+						glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b);
+					else glColor3ub(0, 0, 0);
 					glVertex3fv(ls[2]->v->co);
 				} else {
 					bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol);
 					
-					glTexCoord2fv(luv[0]->uv);
-					glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b);
+					if (luv[0])
+						glTexCoord2fv(luv[0]->uv);
+					if (lcol[0])
+						glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b);
+					else glColor3ub(0, 0, 0);
 					glNormal3fv(ls[0]->v->no);
 					glVertex3fv(ls[0]->v->co);
 
-					glTexCoord2fv(luv[1]->uv);
-					glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b);
+					if (luv[1])
+						glTexCoord2fv(luv[1]->uv);
+					if (lcol[1])
+						glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b);
+					else glColor3ub(0, 0, 0);
 					glNormal3fv(ls[1]->v->no);
 					glVertex3fv(ls[1]->v->co);
 
-					glTexCoord2fv(luv[2]->uv);
-					glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b);
+					if (luv[2])
+						glTexCoord2fv(luv[2]->uv);
+					if (lcol[2])
+						glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b);
+					else glColor3ub(0, 0, 0);
 					glNormal3fv(ls[2]->v->no);
 					glVertex3fv(ls[2]->v->co);
 				}

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_array.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_array.h	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_array.h	2009-10-07 21:19:58 UTC (rev 23697)
@@ -30,9 +30,15 @@
 
 /*
 this library needs to be changed to not use macros quite so heavily,
-and to be more of a complete vector array API.  The way arrays are
+and to be more of a complete array API.  The way arrays are
 exposed to client code as normal C arrays is very useful though, imho.
-it does require some use of macros, however.
+it does require some use of macros, however.  
+
+anyway, it's used a bit too heavily to simply rewrite as a 
+more "correct" solution without macros entirely.  I originally wrote this
+to be very easy to use, without the normal pain of most array libraries.
+This was especially helpful when it came to the massive refactors necessary for
+bmesh, and really helped to speed the process up. - joeedh
   
 little array macro library.  example of usage:
 
@@ -51,28 +57,35 @@
 behaviour, though it may not be the best in practice.
 */
 
-#define BLI_array_declare(vec) int _##vec##_count=0; void *_##vec##_tmp
+#define BLI_array_declare(arr) int _##arr##_count=0; void *_##arr##_tmp
 
 /*this returns the entire size of the array, including any buffering.*/
-#define BLI_array_totalsize(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
+#define BLI_array_totalsize(arr) ((signed int)((arr)==NULL ? 0 : MEM_allocN_len(arr) / sizeof(*arr)))
 
 /*this returns the logical size of the array, not including buffering.*/
-#define BLI_array_count(vec) _##vec##_count
+#define BLI_array_count(arr) _##arr##_count
 
 /*grow the array by one.  zeroes the new elements.*/
-#define BLI_array_growone(vec) \
-	BLI_array_totalsize(vec) > _##vec##_count ? _##vec##_count++ : \
-	((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
-	(vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
-	(vec && (MEM_freeN(vec),1)),\
-	(vec = _##vec##_tmp),\
-	_##vec##_count++)
+#define BLI_array_growone(arr) \
+	BLI_array_totalsize(arr) > _##arr##_count ? _##arr##_count++ : \
+	((_##arr##_tmp = MEM_callocN(sizeof(*arr)*(_##arr##_count*2+2), #arr " " __FILE__ " ")),\
+	(arr && memcpy(_##arr##_tmp, arr, sizeof(*arr) * _##arr##_count)),\
+	(arr && (MEM_freeN(arr),1)),\
+	(arr = _##arr##_tmp),\
+	_##arr##_count++)
 
-#define BLI_array_free(vec) if (vec) MEM_freeN(vec);
+/*appends an item to the array and returns a pointer to the item in the array.
+  item is not a pointer, but actual data value.*/
+#define BLI_array_append(arr, item) (BLI_array_growone(arr), arr[_##arr##_count] = item, (arr+_##arr##_count))
 
+/*grow an array by a specified number of items.*/
+#define BLI_array_growitems(arr, num) {int _i; for (_i=0; _i<(num); _i++) {BLI_array_growone(arr);}}
+#define BLI_array_free(arr) if (arr) MEM_freeN(arr)
+
 /*resets the logical size of an array to zero, but doesn't
   free the memory.*/
-#define BLI_array_empty(vec) _##vec##_count=0
+#define BLI_array_empty(arr) _##arr##_count=0
 
-/*set the count of the array*/
-#define BLI_array_set_length(vec, count) _##vec##_count = (count)
+/*set the count of the array, doesn't actually increase the allocated array
+  size.  don't use this unless you know what your doing.*/
+#define BLI_array_set_length(arr, count) _##arr##_count = (count)

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-10-07 21:19:58 UTC (rev 23697)
@@ -13,7 +13,7 @@
 /*returns true if v is in f*/
 int BM_Vert_In_Face(struct BMFace *f, struct BMVert *v);
 
-// int BM_VERTS_OF_MESH_In_Face(struct BMFace *f, struct BMVert **varr, int len);
+// int BM_Verts_In_Face(struct BMFace *f, struct BMVert **varr, int len);
 int BM_Verts_In_Face(struct BMesh *bm, struct BMFace *f, struct BMVert **varr, int len);
 
 int BM_Edge_In_Face(struct BMFace *f, struct BMEdge *e);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-10-07 21:19:58 UTC (rev 23697)
@@ -154,12 +154,13 @@
 };
 
 /*
-  Edge Split
+  Edge Bisect
 
   Splits input edges (but doesn't do anything else).
+  This creates a 2-valence vert.
 */
-BMOpDefine def_edgesplit = {
-	"edgesplit",
+BMOpDefine def_edgebisect = {
+	"edgebisect",
 	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, //input edges
 	{BMOP_OPSLOT_INT, "numcuts"}, //number of cuts
 	{BMOP_OPSLOT_ELEMENT_BUF, "outsplit"}, //newly created vertices and edges
@@ -802,6 +803,21 @@
 	0
 };
 
+/*
+  Edge Split
+
+  Disconnects faces along input edges.
+ */
+BMOpDefine def_edgesplit = {
+	"edgesplit",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /* input edges */
+	 {BMOP_OPSLOT_ELEMENT_BUF, "edgeout1"}, /* old output disconnected edges */
+	 {BMOP_OPSLOT_ELEMENT_BUF, "edgeout2"}, /* new output disconnected edges */
+	 {0} /*null-terminating sentinel*/},
+	bmesh_edgesplitop_exec,
+	0
+};
+
 BMOpDefine *opdefines[] = {
 	&def_splitop,
 	&def_dupeop,
@@ -831,7 +847,7 @@
 	&def_removedoubles,
 	&def_finddoubles,
 	&def_mirror,
-	&def_edgesplit,
+	&def_edgebisect,
 	&def_reversefaces,
 	&def_edgerotate,
 	&def_regionextend,
@@ -855,6 +871,7 @@
 	&def_meshreversecolors,
 	&def_vertexshortestpath,
 	&def_scale,
+	&def_edgesplit,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-10-07 21:19:58 UTC (rev 23697)
@@ -59,4 +59,5 @@
 void bmesh_reversecolors_exec(BMesh *bm, BMOperator *op);
 void bmesh_vertexshortestpath_exec(BMesh *bm, BMOperator *op);
 void bmesh_scale_exec(BMesh *bm, BMOperator *op);
+void bmesh_edgesplitop_exec(BMesh *bm, BMOperator *op);
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-10-07 21:19:35 UTC (rev 23696)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-10-07 21:19:58 UTC (rev 23697)
@@ -184,6 +184,9 @@
 	BMEdge *curedge;
 	int i, len=0;
 	
+	if (!v1 || !v2 || v1 == v2)
+		return NULL;
+	
 	if(v1->edge){
 		diskbase = bmesh_disk_getpointer(v1->edge,v1);
 		len = bmesh_cycle_length(diskbase);

Added: branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c	                        (rev 0)
+++ branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c	2009-10-07 21:19:58 UTC (rev 23697)
@@ -0,0 +1,357 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.	
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list