Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-09-29 19:19:16 +0400
committerCampbell Barton <ideasman42@gmail.com>2010-09-29 19:19:16 +0400
commita2f966b8ee5352f4da9dcd5211872fe1022f98b3 (patch)
tree8ca8068f2c3aa0b564829527a9449fc77cfd4b13 /source/blender
parentc5157cda88938177685225bc8f264a4a46883250 (diff)
bugfix [#24041] Adding NURBS Sphere and NURBS Donut problem
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/curve/editcurve.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 7b9c6c7cc95..fed2fd1e55d 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -3973,7 +3973,7 @@ int mouse_nurb(bContext *C, short mval[2], int extend)
* 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.
*/
-static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, float *cent, short mode)
+static int spin_nurb(RegionView3D *rv3d, Object *obedit, float *dvec, float *cent, short mode)
{
Curve *cu= (Curve*)obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3982,16 +3982,27 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
float persmat[3][3], persinv[3][3];
short a,ok, changed= 0;
-
- unit_m3(persmat);
+
+ if (mode != 2) copy_m3_m4(persmat, rv3d->viewmat);
+ else unit_m3(persmat);
invert_m3_m3(persinv, persmat);
/* imat and center and size */
copy_m3_m4(bmat, obedit->obmat);
invert_m3_m3(imat, bmat);
- n[0]=n[1]= 0.0;
- n[2]= 1.0;
+ 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]);
+ }
phi= M_PI/8.0;
q[0]= cos(phi);
@@ -4044,10 +4055,6 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
}
}
- if(dvec) {
- mul_m3_v3(bmat,dvec);
- translateflagNurb(editnurb, 1,dvec);
- }
}
if(ok) {
@@ -4072,7 +4079,11 @@ static int spin_exec(bContext *C, wmOperator *op)
RNA_float_get_array(op->ptr, "center", cent);
RNA_float_get_array(op->ptr, "axis", axis);
- if(!spin_nurb(C, scene, obedit, axis, cent, 0)) {
+ invert_m4_m4(obedit->imat, obedit->obmat);
+ mul_m4_v3(obedit->imat, cent);
+ mul_mat3_m4_v3(obedit->imat, axis);
+
+ if(!spin_nurb(ED_view3d_context_rv3d(C), obedit, axis, cent, 2)) {
BKE_report(op->reports, RPT_ERROR, "Can't spin");
return OPERATOR_CANCELLED;
}
@@ -5884,6 +5895,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
vec[0]=vec[1]= 0.0;
vec[2]= -grid;
+
+ if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) {
+ /* pass */
+ }
+ else {
+ mul_mat3_m4_v3(mat, vec);
+ }
translateflagNurb(editnurb, 1, vec);
extrudeflagNurb(cu->editnurb, 1);
@@ -5936,9 +5954,9 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
BLI_addtail(editnurb, nu); /* temporal for spin */
if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
+ spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+ spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
makeknots(nu, 2);
@@ -5969,9 +5987,9 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
nu->flag= CU_SMOOTH;
BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
+ spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+ spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
BLI_remlink(editnurb, nu);