[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