[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38936] branches/bmesh/blender/source/ blender: make spin into a bmop, use it in screw
Howard Trickey
howard.trickey at gmail.com
Tue Aug 2 16:45:35 CEST 2011
Revision: 38936
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38936
Author: howardt
Date: 2011-08-02 14:45:34 +0000 (Tue, 02 Aug 2011)
Log Message:
-----------
make spin into a bmop, use it in screw
Modified Paths:
--------------
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/operators/bmesh_dupeops.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-08-02 13:51:00 UTC (rev 38935)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-08-02 14:45:34 UTC (rev 38936)
@@ -696,6 +696,28 @@
};
/*
+ Spin
+
+ Extrude or duplicate geometry a number of times,
+ rotating and possibly translating after each step
+*/
+static BMOpDefine def_spinop = {
+ "spin",
+ {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
+ {BMOP_OPSLOT_ELEMENT_BUF, "lastout"}, /* result of last step */
+ {BMOP_OPSLOT_VEC, "cent"}, /* rotation center */
+ {BMOP_OPSLOT_VEC, "axis"}, /* rotation axis */
+ {BMOP_OPSLOT_VEC, "dvec"}, /* translation delta per step */
+ {BMOP_OPSLOT_FLT, "ang"}, /* total rotation angle (degrees) */
+ {BMOP_OPSLOT_INT, "steps"}, /* number of steps */
+ {BMOP_OPSLOT_INT, "dupli"}, /* duplicate or extrude? */
+ {0} /*null-terminating sentinel*/},
+ spinop_exec,
+ 0
+};
+
+
+/*
Similar faces search
Find similar faces (area/material/perimeter....).
@@ -988,6 +1010,7 @@
BMOpDefine *opdefines[] = {
&def_splitop,
+ &def_spinop,
&def_dupeop,
&def_delop,
&def_subdop,
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-08-02 13:51:00 UTC (rev 38935)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-08-02 14:45:34 UTC (rev 38936)
@@ -8,6 +8,7 @@
void BMO_pop(BMesh *bm);
void splitop_exec(BMesh *bm, BMOperator *op);
+void spinop_exec(BMesh *bm, BMOperator *op);
void dupeop_exec(BMesh *bm, BMOperator *op);
void delop_exec(BMesh *bm, BMOperator *op);
void esubdivide_exec(BMesh *bmesh, BMOperator *op);
Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2011-08-02 13:51:00 UTC (rev 38935)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2011-08-02 14:45:34 UTC (rev 38936)
@@ -543,3 +543,60 @@
BM_remove_tagged_verts(bm, DEL_INPUT);
}
}
+
+/*
+ * Spin Operator
+ *
+ * Extrude or duplicate geometry a number of times,
+ * rotating and possibly translating after each step
+*/
+
+void spinop_exec(BMesh *bm, BMOperator *op)
+{
+ BMOperator dupop, extop;
+ float cent[3], dvec[3];
+ float axis[3] = {0.0f, 0.0f, 1.0f};
+ float q[4];
+ float rmat[3][3];
+ float phi, si;
+ int steps, dupli, a, usedvec;
+
+ BMO_Get_Vec(op, "cent", cent);
+ BMO_Get_Vec(op, "axis", axis);
+ normalize_v3(axis);
+ BMO_Get_Vec(op, "dvec", dvec);
+ usedvec = !is_zero_v3(dvec);
+ steps = BMO_Get_Int(op, "steps");
+ phi = BMO_Get_Float(op, "ang")*M_PI/(360.0*steps);
+ dupli = BMO_Get_Int(op, "dupli");
+
+ si = (float)sin(phi);
+ q[0] = (float)cos(phi);
+ q[1] = axis[0]*si;
+ q[2] = axis[1]*si;
+ q[3] = axis[2]*si;
+ quat_to_mat3(rmat, q);
+
+ BMO_CopySlot(op, op, "geom", "lastout");
+ for(a=0; a<steps; a++) {
+ if(dupli) {
+ BMO_InitOpf(bm, &dupop, "dupe geom=%s", op, "lastout");
+ BMO_Exec_Op(bm, &dupop);
+ BMO_CallOpf(bm, "rotate cent=%v mat=%m3 verts=%s",
+ cent, rmat, &dupop, "newout");
+ BMO_CopySlot(&dupop, op, "newout", "lastout");
+ BMO_Finish_Op(bm, &dupop);
+ } else {
+ BMO_InitOpf(bm, &extop, "extrudefaceregion edgefacein=%s",
+ op, "lastout");
+ BMO_Exec_Op(bm, &extop);
+ BMO_CallOpf(bm, "rotate cent=%v mat=%m3 verts=%s",
+ cent, rmat, &extop, "geomout");
+ BMO_CopySlot(&extop, op, "geomout", "lastout");
+ BMO_Finish_Op(bm, &extop);
+ }
+
+ if(usedvec)
+ BMO_CallOpf(bm, "translate vec=%v verts=%s", dvec, op, "lastout");
+ }
+}
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-08-02 13:51:00 UTC (rev 38935)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-08-02 14:45:34 UTC (rev 38936)
@@ -3821,85 +3821,39 @@
}
-static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float degr, int dupli)
+static int spin_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
ToolSettings *ts= CTX_data_tool_settings(C);
BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
- float nor[3]= {0.0f, 0.0f, 0.0f};
- float si, n[3], q[4], cmat[3][3], imat[3][3], tmat[3][3];
- float cent[3], bmat[3][3], rmat[4][4];
- float phi;
- short a, ok= 1;
- BMOperator bmop;
-
+ BMesh *bm= em->bm;
+ BMOperator spinop;
+ float cent[3], axis[3], imat[3][3];
+ float d[3] = {0.0f, 0.0f, 0.0f};
+ int steps, dupli;
+ float degr;
+
RNA_float_get_array(op->ptr, "center", cent);
-
- /* imat and center and size */
- copy_m3_m4(bmat, obedit->obmat);
- invert_m3_m3(imat,bmat);
-
- cent[0]-= obedit->obmat[3][0];
- cent[1]-= obedit->obmat[3][1];
- cent[2]-= obedit->obmat[3][2];
+ RNA_float_get_array(op->ptr, "axis", axis);
+ steps = RNA_int_get(op->ptr, "steps");
+ degr = RNA_float_get(op->ptr, "degrees");
+ if(ts->editbutflag & B_CLOCKWISE) degr= -degr;
+ dupli = RNA_boolean_get(op->ptr, "dupli");
+
+ /* undo object transformation */
+ copy_m3_m4(imat, obedit->imat);
+ sub_v3_v3(cent, obedit->obmat[3]);
mul_m3_v3(imat, cent);
+ mul_m3_v3(imat, axis);
- phi= degr*M_PI/360.0;
- phi/= steps;
- if(ts->editbutflag & B_CLOCKWISE) phi= -phi;
+ BMO_InitOpf(bm, &spinop,
+ "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=%d",
+ BM_SELECT, cent, axis, d, steps, degr, dupli);
+ BMO_Exec_Op(bm, &spinop);
+ EDBM_clear_flag_all(em, BM_SELECT);
+ BMO_HeaderFlag_Buffer(bm, &spinop, "lastout", BM_SELECT, BM_ALL);
+ BMO_Finish_Op(bm, &spinop);
- RNA_float_get_array(op->ptr, "axis", n);
- normalize_v3(n);
-
- q[0]= (float)cos(phi);
- si= (float)sin(phi);
- q[1]= n[0]*si;
- q[2]= n[1]*si;
- q[3]= n[2]*si;
- quat_to_mat3( cmat,q);
-
- mul_m3_m3m3(tmat,cmat,bmat);
- mul_m3_m3m3(bmat,imat,tmat);
- copy_m4_m3(rmat, bmat);
-
- for(a=0; a<steps; a++) {
- if(dupli==0) {
- EDBM_Extrude_edge(obedit, em, BM_SELECT, nor);
- BMO_CallOpf(em->bm, "rotate cent=%v mat=%m4 verts=%hv", cent, rmat, BM_SELECT);
- ok = 1;
- } else {
- EDBM_InitOpf(em, &bmop, op, "dupe geom=%hvef", BM_SELECT);
- BMO_Exec_Op(em->bm, &bmop);
- BMO_CallOpf(em->bm, "rotate cent=%v mat=%m4 verts=%s", cent, rmat, &bmop, "newout");
- EDBM_clear_flag_all(em, BM_SELECT);
- BMO_HeaderFlag_Buffer(em->bm, &bmop, "newout", BM_SELECT, BM_ALL);
- ok = EDBM_FinishOp(em, &bmop, op, 1);
- }
-
- if(!ok)
- break;
-
- if(dvec) {
- mul_m3_v3(bmat, dvec);
- BMO_CallOpf(em->bm, "translate vec=%v verts=%hv", (float*)dvec, BM_SELECT);
- }
- }
-
-
- return ok;
-}
-
-static int spin_mesh_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- int ok;
-
- ok= spin_mesh(C, op, NULL, RNA_int_get(op->ptr,"steps"), RNA_float_get(op->ptr,"degrees"), RNA_boolean_get(op->ptr,"dupli"));
- if(ok==0) {
- BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
- return OPERATOR_CANCELLED;
- }
-
DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -3947,18 +3901,29 @@
{
Object *obedit= CTX_data_edit_object(C);
BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+ BMesh *bm= em->bm;
BMEdge *eed;
BMVert *eve, *v1, *v2;
BMIter iter, eiter;
- float dvec[3], nor[3];
+ BMOperator spinop;
+ float dvec[3], nor[3], cent[3], axis[3];
+ float imat[3][3];
int steps, turns;
int valence;
turns= RNA_int_get(op->ptr, "turns");
steps= RNA_int_get(op->ptr, "steps");
+ RNA_float_get_array(op->ptr, "center", cent);
+ RNA_float_get_array(op->ptr, "axis", axis);
+ /* undo object transformation */
+ copy_m3_m4(imat, obedit->imat);
+ sub_v3_v3(cent, obedit->obmat[3]);
+ mul_m3_v3(imat, cent);
+ mul_m3_v3(imat, axis);
+
/* find two vertices with valence count==1, more or less is wrong */
v1 = NULL;
v2 = NULL;
@@ -3992,29 +3957,23 @@
}
/* calculate dvec */
- dvec[0]= ( v1->co[0]- v2->co[0] )/steps;
- dvec[1]= ( v1->co[1]- v2->co[1] )/steps;
- dvec[2]= ( v1->co[2]- v2->co[2] )/steps;
+ sub_v3_v3v3(dvec, v1->co, v2->co);
+ mul_v3_fl(dvec, 1.0f/steps);
- VECCOPY(nor, obedit->obmat[2]);
+ if(dot_v3v3(nor, dvec)>0.000)
+ negate_v3(dvec);
- if(nor[0]*dvec[0]+nor[1]*dvec[1]+nor[2]*dvec[2]>0.000) {
- dvec[0]= -dvec[0];
- dvec[1]= -dvec[1];
- dvec[2]= -dvec[2];
- }
+ BMO_InitOpf(bm, &spinop,
+ "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=0",
+ BM_SELECT, cent, axis, dvec, turns*steps, 360.0f*turns);
+ BMO_Exec_Op(bm, &spinop);
+ EDBM_clear_flag_all(em, BM_SELECT);
+ BMO_HeaderFlag_Buffer(bm, &spinop, "lastout", BM_SELECT, BM_ALL);
+ BMO_Finish_Op(bm, &spinop);
- if(spin_mesh(C, op, dvec, turns*steps, 360.0f*turns, 0)) {
- DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- return OPERATOR_FINISHED;
- }
- else {
- BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
- return OPERATOR_CANCELLED;
- }
-
return OPERATOR_FINISHED;
}
More information about the Bf-blender-cvs
mailing list