[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11951] branches/bmesh/source/blender: -> Edge and Vertex Extrude

Geoffrey Bantle hairbat at yahoo.com
Fri Sep 7 00:48:53 CEST 2007


Revision: 11951
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11951
Author:   briggs
Date:     2007-09-07 00:48:52 +0200 (Fri, 07 Sep 2007)

Log Message:
-----------
-> Edge and Vertex Extrude

Added edge and vertex extrude (non-manifold). Dependant
upon selection mode.

Face extrude will follow along with a fix for face selection mode.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/include/editbmesh.h
    branches/bmesh/source/blender/src/editbmesh_tools.c
    branches/bmesh/source/blender/src/space.c

Modified: branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-09-06 21:35:51 UTC (rev 11950)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-09-06 22:48:52 UTC (rev 11951)
@@ -204,11 +204,13 @@
 /*Vertex Tools*/
 void BME_connect_verts(struct BME_Mesh *bm);
 void BME_delete_verts(struct BME_Mesh *bm);
+int BME_extrude_verts(struct BME_Mesh *bm);
 /*Edge Tools*/
 void BME_cut_edge(struct BME_Mesh *bm, BME_Edge *e, int numcuts);
 void BME_cut_edges(struct BME_Mesh *bm, int numcuts);
 void BME_dissolve_edges(struct BME_Mesh *bm);
 void BME_delete_edges(struct BME_Mesh *bm);
+int BME_extrude_edges(struct BME_Mesh *bm);
 /*Face Tools*/
 struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
 void BME_split_face(struct BME_Mesh *bm, struct BME_Poly *f);

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-09-06 21:35:51 UTC (rev 11950)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-09-06 22:48:52 UTC (rev 11951)
@@ -412,8 +412,89 @@
 	remove_tagged_polys(bm);
 }
 	
+int BME_extrude_verts(BME_Mesh *bm){
+	BME_Vert *v, *nv = NULL;
+	BME_Edge *ne = NULL;
+	float vec[3];
+	short retval = 0; 
+	
+	//extrude the vertices
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(BME_SELECTED(v)){
+			retval = 1;
+			VECCOPY(vec,v->co);
+			nv = BME_MV(bm,vec);
+			ne = BME_ME(bm,v,nv);
+			BME_VISIT(nv);
+			BME_select_vert(bm,v,0);
+		}
+	}
+	//clean up selection
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(BME_ISVISITED(v)) BME_select_vert(bm, v,1);
+	}
+	return retval;
+}
 
+int BME_extrude_edges(BME_Mesh *bm){
+	BME_Poly *nf=NULL;
+	BME_Edge *e, *l=NULL, *r=NULL, *edar[4], *ne;
+	BME_Vert *v, *v1, *v2, *lv, *rv, *nv;
+	float vec[3];
+	short retval = 0;
+	
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
+		if(BME_SELECTED(e)){
+			e->tflag1 = 1; //mark as original
+			e->v1->tflag1 = 1;//mark for dupe
+			e->v2->tflag1 = 1;//mark for dupe
+			BME_select_edge(bm,e,0); //clear selection
+			retval = 1;
+		}
+	}
+	
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(v->tflag1){
+			VECCOPY(vec,v->co);
+			nv = BME_MV(bm,vec);
+			ne = BME_ME(bm,v,nv);
+			ne->tflag1 = 2; //mark as new
+		}
+	}
 
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
+		if(e->tflag1==1){
+			/*find one face incident upon e and use it for winding of new face*/
+			if(e->loop){
+				v1 = e->loop->v;
+				v2 = e->loop->next->v;
+			}
+			else{
+				v1 = e->v1;
+				v2 = e->v2;
+			}
+			
+			if(v1->edge->tflag1 == 2) l = v1->edge;
+			else l = BME_disk_next_edgeflag(v1->edge, v1, 0, 2);
+			if(v2->edge->tflag1 == 2) r = v2->edge;
+			else r = BME_disk_next_edgeflag(v2->edge, v2, 0, 2);
+			
+			lv = BME_edge_getothervert(l,v1);
+			rv = BME_edge_getothervert(r,v2);
+			
+			ne = BME_ME(bm,lv,rv);
+			
+			edar[0] = e;
+			edar[1] = l;
+			edar[2] = ne;
+			edar[3] = r;
+			BME_MF(bm,v1,v2,edar,4);
+			BME_select_edge(bm,ne,1);
+		}
+	}
+	return retval;
+}
 
 
 
+

Modified: branches/bmesh/source/blender/include/editbmesh.h
===================================================================
--- branches/bmesh/source/blender/include/editbmesh.h	2007-09-06 21:35:51 UTC (rev 11950)
+++ branches/bmesh/source/blender/include/editbmesh.h	2007-09-06 22:48:52 UTC (rev 11951)
@@ -28,4 +28,5 @@
 /*editbmesh_tools.c*/
 void EM_cut_edges(int numcuts);
 void EM_dissolve_edges(void);
-void EM_delete_context(void);
\ No newline at end of file
+void EM_delete_context(void);
+void EM_extrude_mesh(void);
\ No newline at end of file

Modified: branches/bmesh/source/blender/src/editbmesh_tools.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_tools.c	2007-09-06 21:35:51 UTC (rev 11950)
+++ branches/bmesh/source/blender/src/editbmesh_tools.c	2007-09-06 22:48:52 UTC (rev 11951)
@@ -44,6 +44,7 @@
 #include "BKE_DerivedMesh.h"
 #include "BKE_depsgraph.h"
 #include "BKE_utildefines.h"
+#include "BKE_object.h"
 
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
@@ -62,6 +63,7 @@
 #include "BIF_screen.h"
 #include "BIF_resources.h"
 #include "BIF_language.h"
+#include "BIF_transform.h"
 
 #include "BDR_editobject.h"
 #include "BDR_drawobject.h"
@@ -102,3 +104,52 @@
 	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
 	allqueue(REDRAWVIEW3D,0);
 }
+
+void EM_extrude_mesh(void){
+	float nor[3]= {0.0, 0.0, 0.0};
+	short transmode=0,extrudemode=0; //1 = verts, 2, = edges, 3 = faces, 4 = individual faces... should actually be inset then move along individual normals?
+	
+	BME_model_begin(G.editMesh);
+	if(G.scene->selectmode == SCE_SELECT_VERTEX){ 
+		transmode = BME_extrude_verts(G.editMesh);
+		if(transmode) extrudemode = 1;
+	}
+	else if(G.scene->selectmode == SCE_SELECT_EDGE){
+		transmode = BME_extrude_edges(G.editMesh);
+		if(transmode) extrudemode = 2;
+	}
+	
+	if(transmode){
+		/* We need to force immediate calculation here because 
+		* transform may use derived objects (which are now stale).
+		*
+		* This shouldn't be necessary, derived queries should be
+		* automatically building this data if invalid. Or something.
+		*/
+		DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);	
+		object_handle_update(G.obedit);
+
+		/* individual faces? */
+		BIF_TransformSetUndo("Extrude");
+		/*if(nr==2) {
+			initTransform(TFM_SHRINKFATTEN, CTX_NO_PET);
+			Transform();
+		}
+		else {
+			initTransform(TFM_TRANSLATION, CTX_NO_PET);
+			if(transmode=='n') {
+				Mat4MulVecfl(G.obedit->obmat, nor);
+				VecSubf(nor, nor, G.obedit->obmat[3]);
+				BIF_setSingleAxisConstraint(nor, NULL);
+			}
+			Transform();
+		}*/
+		
+		initTransform(TFM_TRANSLATION,CTX_NO_PET);
+		Transform();
+	}	
+	BME_model_end(G.editMesh);
+	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
+	allqueue(REDRAWVIEW3D,0);
+}
+

Modified: branches/bmesh/source/blender/src/space.c
===================================================================
--- branches/bmesh/source/blender/src/space.c	2007-09-06 21:35:51 UTC (rev 11950)
+++ branches/bmesh/source/blender/src/space.c	2007-09-06 22:48:52 UTC (rev 11951)
@@ -1776,8 +1776,8 @@
 			case EKEY:
 				if (G.qual==0){
 					if(G.obedit) {
-						//if(G.obedit->type==OB_MESH)
-							//EDITBMESHGREP extrude_mesh();
+						if(G.obedit->type==OB_MESH)
+							EM_extrude_mesh();
 						if(G.obedit->type==OB_CURVE)
 							addvert_Nurb('e');
 						else if(G.obedit->type==OB_SURF)





More information about the Bf-blender-cvs mailing list