[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18868] branches/bmesh/blender/source/ blender: alt-ctrl leftmouse (e.g.
Joseph Eagar
joeedh at gmail.com
Sun Feb 8 18:01:33 CET 2009
Revision: 18868
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18868
Author: joeedh
Date: 2009-02-08 18:01:28 +0100 (Sun, 08 Feb 2009)
Log Message:
-----------
alt-ctrl leftmouse (e.g. current knife) now uses bmesh edge subdivide! wa-hoo! basically I had to add some slots to the subdivide operator so it could accept custom percentags for splitting edges. also put some commonly passed-around paramters into a struct, so i don't have to constantly keep changing a dozen function signatures
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_loop.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-02-08 14:56:43 UTC (rev 18867)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-02-08 17:01:28 UTC (rev 18868)
@@ -62,6 +62,7 @@
void BMO_Set_Float(struct BMOperator *op, int slotcode, float f);
void BMO_Set_Int(struct BMOperator *op, int slotcode, int i);
void BMO_Set_PntBuf(struct BMOperator *op, int slotcode, void *p, int len);
+void BMO_Set_FltBuf(BMOperator *op, int slotcode, float *p, int len);
void BMO_Set_Pnt(struct BMOperator *op, int slotcode, void *p);
void BMO_Set_Vec(struct BMOperator *op, int slotcode, float *vec);
void BMO_SetFlag(struct BMesh *bm, void *element, int flag);
@@ -161,7 +162,7 @@
BMOP_ESUBDIVIDE_CUSTOMFILL_FACES,
BMOP_ESUBDIVIDE_CUSTOMFILL_PATTERNS,
- BMOP_ESUBDIVIDE_PERCENT_VERTS,
+ BMOP_ESUBDIVIDE_PERCENT_EDGES,
BMOP_ESUBDIVIDE_PERCENT_VALUES,
BMOP_ESUBDIVIDE_TOTSLOT,
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-02-08 14:56:43 UTC (rev 18867)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-02-08 17:01:28 UTC (rev 18868)
@@ -42,7 +42,7 @@
BMOP_OPSLOT_PNT_BUF,
BMOP_OPSLOT_PNT_BUF,
BMOP_OPSLOT_PNT_BUF,
- BMOP_OPSLOT_FLT},
+ BMOP_OPSLOT_FLT_BUF},
esubdivide_exec,
BMOP_ESUBDIVIDE_TOTSLOT,
0
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2009-02-08 14:56:43 UTC (rev 18867)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2009-02-08 17:01:28 UTC (rev 18868)
@@ -212,6 +212,15 @@
op->slots[slotcode].len = len;
}
+void BMO_Set_FltBuf(BMOperator *op, int slotcode, float *p, int len)
+{
+ if( !(op->slots[slotcode].slottype == BMOP_OPSLOT_FLT_BUF) )
+ return;
+
+ op->slots[slotcode].data.p = p;
+ op->slots[slotcode].len = len;
+}
+
void BMO_Set_Pnt(BMOperator *op, int slotcode, void *p)
{
if( !(op->slots[slotcode].slottype == BMOP_OPSLOT_PNT) )
Modified: branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c 2009-02-08 14:56:43 UTC (rev 18867)
+++ branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c 2009-02-08 17:01:28 UTC (rev 18868)
@@ -21,6 +21,8 @@
#define SUBD_SPLIT 1
+#define EDGE_PERCENT 2
+
/*I don't think new faces are flagged, currently, but
better safe than sorry.*/
#define FACE_NEW 2
@@ -48,12 +50,12 @@
*/
/* calculates offset for co, based on fractal, sphere or smooth settings */
-static void alter_co(float *co, BMEdge *edge, float rad, int flag, float perc,
+static void alter_co(float *co, BMEdge *edge, subdparams *params, float perc,
BMVert *vsta, BMVert *vend)
{
float vec1[3], fac;
- if(flag & B_SMOOTH) {
+ if(params->flag & B_SMOOTH) {
/* we calculate an offset vector vec1[], to be added to *co */
float len, fac, nor[3], nor1[3], nor2[3];
@@ -77,23 +79,23 @@
vec1[1]+= fac*nor2[1];
vec1[2]+= fac*nor2[2];
- vec1[0]*= rad*len;
- vec1[1]*= rad*len;
- vec1[2]*= rad*len;
+ vec1[0]*= params->rad*len;
+ vec1[1]*= params->rad*len;
+ vec1[2]*= params->rad*len;
co[0] += vec1[0];
co[1] += vec1[1];
co[2] += vec1[2];
}
else {
- if(rad > 0.0) { /* subdivide sphere */
+ if(params->rad > 0.0) { /* subdivide sphere */
Normalize(co);
- co[0]*= rad;
- co[1]*= rad;
- co[2]*= rad;
+ co[0]*= params->rad;
+ co[1]*= params->rad;
+ co[2]*= params->rad;
}
- else if(rad< 0.0) { /* fractal subdivide */
- fac= rad* VecLenf(vsta->co, vend->co);
+ else if(params->rad< 0.0) { /* fractal subdivide */
+ fac= params->rad* VecLenf(vsta->co, vend->co);
vec1[0]= fac*(float)(0.5-BLI_drand());
vec1[1]= fac*(float)(0.5-BLI_drand());
vec1[2]= fac*(float)(0.5-BLI_drand());
@@ -106,18 +108,18 @@
/* assumes in the edge is the correct interpolated vertices already */
/* percent defines the interpolation, rad and flag are for special options */
/* results in new vertex with correct coordinate, vertex normal and weight group info */
-static BMVert *bm_subdivide_edge_addvert(BMesh *bm, BMEdge *edge, float rad,
- int flag, float percent, BMEdge **out,
- BMVert *vsta, BMVert *vend)
+static BMVert *bm_subdivide_edge_addvert(BMesh *bm, BMEdge *edge,
+ subdparams *params, float percent,
+ BMEdge **out,BMVert *vsta,BMVert *vend)
{
BMVert *ev;
// float co[3];
ev = BM_Split_Edge(bm, edge->v1, edge, out, percent, 1);
- if (flag & SELTYPE_INNER) BM_Select_Vert(bm, ev, 1);
+ if (params->flag & SELTYPE_INNER) BM_Select_Vert(bm, ev, 1);
/* offset for smooth or sphere or fractal */
- alter_co(ev->co, edge, rad, flag, percent, vsta, vend);
+ alter_co(ev->co, edge, params, percent, vsta, vend);
#if 0 //TODO
/* clip if needed by mirror modifier */
@@ -138,48 +140,33 @@
}
static BMVert *subdivideedgenum(BMesh *bm, BMEdge *edge,
- int curpoint, int totpoint, float rad,
- int flag, BMEdge **newe,
- BMVert *vsta, BMVert *vend)
+ int curpoint, int totpoint, subdparams *params,
+ BMEdge **newe, BMVert *vsta, BMVert *vend)
{
BMVert *ev;
float percent;
- if (flag & (B_PERCENTSUBD) && totpoint == 1)
- /*I guess the idea is vertices store what
- percent to use?*/
- //percent=(float)(edge->tmp.l)/32768.0f;
- percent= 1.0; //edge->tmp.fp;
+ if (BMO_TestFlag(bm, edge, EDGE_PERCENT) && totpoint == 1)
+ percent= *((float*)BLI_ghash_lookup(params->percenthash,edge));
else {
percent= 1.0f/(float)(totpoint+1-curpoint);
}
- /*{
- float co[3], co2[3];
- VecSubf(co, edge->v2->co, edge->v1->co);
- VecMulf(co, 1.0f/(float)(totpoint+1-curpoint));
- VecAddf(co2, edge->v1->co, co);
-*/
- ev= bm_subdivide_edge_addvert(bm, edge, rad, flag, percent,
- newe, vsta, vend);
-
-/* VECCOPY(ev->co, co2);
- }
-*/
+ ev= bm_subdivide_edge_addvert(bm, edge, params, percent,
+ newe, vsta, vend);
return ev;
}
-static void bm_subdivide_multicut(BMesh *bm, BMEdge *edge, float rad,
- int flag, int numcuts,
+static void bm_subdivide_multicut(BMesh *bm, BMEdge *edge, subdparams *params,
BMVert *vsta, BMVert *vend) {
BMEdge *eed = edge, *newe;
BMVert *v;
- int i;
+ int i, numcuts = params->numcuts;
for(i=0;i<numcuts;i++) {
- v = subdivideedgenum(bm, eed, i, numcuts, rad,
- flag, &newe, vsta, vend);
+ v = subdivideedgenum(bm, eed, i, params->numcuts, params,
+ &newe, vsta, vend);
BMO_SetFlag(bm, v, SUBD_SPLIT);
BMO_SetFlag(bm, eed, SUBD_SPLIT);
}
@@ -199,28 +186,28 @@
v4---v0---v1
*/
-static void q_1edge_split(BMesh *bm, BMFace *face, BMVert **vlist, int numcuts,
- int flag, float rad) {
+static void q_1edge_split(BMesh *bm, BMFace *face,
+ BMVert **verts, subdparams *params) {
BMFace *nf;
- int i, add;
+ int i, add, numcuts = params->numcuts;
/*if it's odd, the middle face is a quad, otherwise it's a triangle*/
if (numcuts % 2==0) {
add = 2;
for (i=0; i<numcuts; i++) {
if (i == numcuts/2) add -= 1;
- BM_Connect_Verts(bm, vlist[i], vlist[numcuts+add],
+ BM_Connect_Verts(bm, verts[i], verts[numcuts+add],
&nf);
}
} else {
add = 2;
for (i=0; i<numcuts; i++) {
- BM_Connect_Verts(bm, vlist[i], vlist[numcuts+add],
+ BM_Connect_Verts(bm, verts[i], verts[numcuts+add],
&nf);
if (i == numcuts/2) {
add -= 1;
- BM_Connect_Verts(bm, vlist[i],
- vlist[numcuts+add],
+ BM_Connect_Verts(bm, verts[i],
+ verts[numcuts+add],
&nf);
}
}
@@ -246,13 +233,14 @@
*/
-static void q_2edge_op_split(BMesh *bm, BMFace *face, BMVert **vlist,
- int numcuts, int flag, float rad) {
+static void q_2edge_op_split(BMesh *bm, BMFace *face, BMVert **verts,
+ subdparams *params)
+{
BMFace *nf;
- int i;
+ int i, numcuts = params->numcuts;
for (i=0; i<numcuts; i++) {
- BM_Connect_Verts(bm, vlist[i],vlist[(numcuts-i-1)+numcuts+2],
+ BM_Connect_Verts(bm, verts[i],verts[(numcuts-i-1)+numcuts+2],
&nf);
}
}
@@ -272,16 +260,17 @@
v7-v0--v1-v2
*/
-static void q_2edge_split(BMesh *bm, BMFace *face, BMVert **vlist,
- int numcuts, int flag, float rad) {
+static void q_2edge_split(BMesh *bm, BMFace *face, BMVert **verts,
+ subdparams *params)
+{
BMFace *nf;
- int i;
+ int i, numcuts = params->numcuts;
for (i=0; i<numcuts; i++) {
- BM_Connect_Verts(bm, vlist[i], vlist[numcuts+(numcuts-i)],
+ BM_Connect_Verts(bm, verts[i], verts[numcuts+(numcuts-i)],
&nf);
}
- BM_Connect_Verts(bm, vlist[numcuts*2+3], vlist[numcuts*2+1], &nf);
+ BM_Connect_Verts(bm, verts[numcuts*2+3], verts[numcuts*2+1], &nf);
}
subdpattern q_2edge = {
@@ -300,25 +289,26 @@
v9-v0--v1-v2
*/
-static void q_3edge_split(BMesh *bm, BMFace *face, BMVert **vlist,
- int numcuts, int flag, float rad) {
+static void q_3edge_split(BMesh *bm, BMFace *face, BMVert **verts,
+ subdparams *params)
+{
BMFace *nf;
- int i, add=0;
+ int i, add=0, numcuts = params->numcuts;
for (i=0; i<numcuts; i++) {
if (i == numcuts/2) {
if (numcuts % 2 != 0) {
- BM_Connect_Verts(bm, vlist[numcuts-i-1+add],
- vlist[i+numcuts+1], &nf);
+ BM_Connect_Verts(bm, verts[numcuts-i-1+add],
+ verts[i+numcuts+1], &nf);
}
add = numcuts*2+2;
}
- BM_Connect_Verts(bm, vlist[numcuts-i-1+add],
- vlist[i+numcuts+1], &nf);
+ BM_Connect_Verts(bm, verts[numcuts-i-1+add],
+ verts[i+numcuts+1], &nf);
}
for (i=0; i<numcuts/2+1; i++) {
- BM_Connect_Verts(bm, vlist[i],vlist[(numcuts-i)+numcuts*2+1],
+ BM_Connect_Verts(bm, verts[i],verts[(numcuts-i)+numcuts*2+1],
&nf);
}
}
@@ -340,27 +330,30 @@
it goes from bottom up
*/
-static void q_4edge_split(BMesh *bm, BMFace *face, BMVert **vlist, int numcuts,
- int flag, float rad) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list