[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32201] trunk/blender/source/blender/ editors/curve/editcurve.c: cleanup of nurb spin function, was very confusing.
Campbell Barton
ideasman42 at gmail.com
Thu Sep 30 07:26:38 CEST 2010
Revision: 32201
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32201
Author: campbellbarton
Date: 2010-09-30 07:26:36 +0200 (Thu, 30 Sep 2010)
Log Message:
-----------
cleanup of nurb spin function, was very confusing. no functional changes.
Modified Paths:
--------------
trunk/blender/source/blender/editors/curve/editcurve.c
Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c 2010-09-29 22:13:24 UTC (rev 32200)
+++ trunk/blender/source/blender/editors/curve/editcurve.c 2010-09-30 05:26:36 UTC (rev 32201)
@@ -1280,13 +1280,9 @@
while(a--) {
if(bp->f1 & flag) {
- bp->vec[0]-=cent[0];
- bp->vec[1]-=cent[1];
- bp->vec[2]-=cent[2];
+ sub_v3_v3(bp->vec, cent);
mul_m3_v3(rotmat, bp->vec);
- bp->vec[0]+=cent[0];
- bp->vec[1]+=cent[1];
- bp->vec[2]+=cent[2];
+ add_v3_v3(bp->vec, cent);
}
bp++;
}
@@ -1326,7 +1322,7 @@
}
}
-static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode==0: replace, mode==1: multiply */
+static void weightflagNurb(ListBase *editnurb, short flag, float w)
{
Nurb *nu;
BPoint *bp;
@@ -1338,8 +1334,8 @@
bp= nu->bp;
while(a--) {
if(bp->f1 & flag) {
- if(mode==1) bp->vec[3]*= w;
- else bp->vec[3]= w;
+ /* a mode used to exist for replace/multiple but is was unused */
+ bp->vec[3]*= w;
}
bp++;
}
@@ -3969,14 +3965,9 @@
/******************** spin operator ***********************/
-/* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the
- * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up
- * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view.
-*/
-
/* 'cent' is in object space and 'dvec' in worldspace.
*/
-static int spin_nurb(RegionView3D *rv3d, Object *obedit, float *dvec, float *cent, short mode)
+static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cent)
{
Curve *cu= (Curve*)obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3986,27 +3977,15 @@
float persmat[3][3], persinv[3][3];
short a,ok, changed= 0;
- if (mode != 2) copy_m3_m4(persmat, rv3d->viewmat);
- else unit_m3(persmat);
+ copy_m3_m4(persmat, viewmat);
invert_m3_m3(persinv, persmat);
/* imat and center and size */
copy_m3_m4(bmat, obedit->obmat);
invert_m3_m3(imat, bmat);
-
- if(dvec || mode==2) {
- if(dvec) {
- normalize_v3_v3(n, dvec);
- }
- else {
- n[0]=n[1]= 0.0;
- n[2]= 1.0;
- }
- }
- else {
- normalize_v3_v3(n, rv3d->viewinv[2]);
- }
+ normalize_v3_v3(n, axis);
+
phi= M_PI/8.0;
q[0]= cos(phi);
si= sin(phi);
@@ -4018,8 +3997,8 @@
mul_m3_m3m3(rotmat, imat, tmat);
unit_m3(scalemat1);
- scalemat1[0][0]= sqrt(2.0);
- scalemat1[1][1]= sqrt(2.0);
+ scalemat1[0][0]= M_SQRT2;
+ scalemat1[1][1]= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat1,tmat);
@@ -4027,8 +4006,8 @@
mul_m3_m3m3(scalemat1,imat,tmat);
unit_m3(scalemat2);
- scalemat2[0][0]/= sqrt(2.0);
- scalemat2[1][1]/= sqrt(2.0);
+ scalemat2[0][0]/= M_SQRT2;
+ scalemat2[1][1]/= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat2,tmat);
@@ -4038,26 +4017,23 @@
ok= 1;
for(a=0;a<7;a++) {
- if(mode==0 || mode==2) ok= extrudeflagNurb(cu->editnurb, 1);
- else adduplicateflagNurb(obedit, 1);
+ ok= extrudeflagNurb(cu->editnurb, 1);
if(ok==0)
return changed;
changed= 1;
- rotateflagNurb(editnurb, 1,cent,rotmat);
+ rotateflagNurb(editnurb, SELECT, cent, rotmat);
- if(mode==0 || mode==2) {
- if( (a & 1)==0 ) {
- rotateflagNurb(editnurb, 1,cent,scalemat1);
- weightflagNurb(editnurb, 1, 0.25*sqrt(2.0), 1);
- }
- else {
- rotateflagNurb(editnurb, 1,cent,scalemat2);
- weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
- }
+ if( (a & SELECT)==0 ) {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat1);
+ weightflagNurb(editnurb, SELECT, 0.25*M_SQRT2);
}
+ else {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat2);
+ weightflagNurb(editnurb, SELECT, 4.0/M_SQRT2);
+ }
}
if(ok) {
@@ -4075,7 +4051,6 @@
static int spin_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
float cent[3], axis[3];
@@ -4085,7 +4060,7 @@
invert_m4_m4(obedit->imat, obedit->obmat);
mul_m4_v3(obedit->imat, cent);
- if(!spin_nurb(ED_view3d_context_rv3d(C), obedit, axis, cent, 0)) {
+ if(!spin_nurb(ED_view3d_context_rv3d(C)->viewmat, obedit, axis, cent)) {
BKE_report(op->reports, RPT_ERROR, "Can't spin");
return OPERATOR_CANCELLED;
}
@@ -5638,10 +5613,10 @@
Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
{
static int xzproj= 0; /* this function calls itself... */
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
View3D *v3d= CTX_wm_view3d(C);
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
Nurb *nu = NULL;
BezTriple *bezt;
BPoint *bp;
@@ -5649,7 +5624,10 @@
float fac, grid;
int a, b, cutype, stype;
int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
-
+
+ float umat[4][4];
+ unit_m4(umat);
+
cutype= type & CU_TYPE; // poly, bezier, nurbs, etc
stype= type & CU_PRIMITIVE;
@@ -5834,7 +5812,7 @@
bp->vec[0]+= 0.25*nurbcircle[a][0]*grid-.75*grid;
bp->vec[2]+= 0.25*nurbcircle[a][1]*grid;
}
- if(a & 1) bp->vec[3]= 0.25*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.25*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp->radius = bp->weight = 1.0;
@@ -5925,7 +5903,7 @@
case CU_PRIM_SPHERE: /* sphere */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
if(newname) {
rename_id((ID *)obedit, "SurfSphere");
@@ -5946,7 +5924,7 @@
bp->f1= SELECT;
bp->vec[0]+= nurbcircle[a][0]*grid;
bp->vec[2]+= nurbcircle[a][1]*grid;
- if(a & 1) bp->vec[3]= 0.5*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.5*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp++;
@@ -5955,11 +5933,11 @@
makeknots(nu, 1);
BLI_addtail(editnurb, nu); /* temporal for spin */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
- else
- spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
+ if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(rv3d->viewmat, obedit, rv3d->viewinv[2], mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
makeknots(nu, 2);
a= nu->pntsu*nu->pntsv;
@@ -5974,7 +5952,7 @@
case CU_PRIM_DONUT: /* torus */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
if(newname) {
rename_id((ID *)obedit, "SurfTorus");
@@ -5987,12 +5965,14 @@
nu->resolu= 4;
nu->resolv= 4;
nu->flag= CU_SMOOTH;
- BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
- else
- spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
+ BLI_addtail(editnurb, nu); /* temporal for spin */
+ /* same as above */
+ if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(rv3d->viewmat, obedit, rv3d->viewinv[2], mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
+
BLI_remlink(editnurb, nu);
a= nu->pntsu*nu->pntsv;
More information about the Bf-blender-cvs
mailing list