[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18172] branches/nurbs/blender: Another patch from Laurynas, thanks!
Emmanuel Stone
emmanuel.stone at gmail.com
Tue Dec 30 12:10:59 CET 2008
Revision: 18172
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18172
Author: eman
Date: 2008-12-30 12:10:59 +0100 (Tue, 30 Dec 2008)
Log Message:
-----------
Another patch from Laurynas, thanks!
His commit message:
Fixes in curve primitives: default V order and default cp radius and weight values.
Curve extrusion code is removed. It was the same functionality as in surface case when v line is selected.
Methods setRecalculateKnotVector and getRecalculateKnotVector are added to Object_NURBS to avoid knot recalculation.
Temp buffer allocation is moved form NURBS_Generate::NURBSBasis to calling functions.
>From NURBS_Generate::KnotVector function redundant code is removed.
Weights are fixed in elevate/reduce degree.
Modified Paths:
--------------
branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp
branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.h
branches/nurbs/blender/intern/nurbana/intern/Object_Primitives.cpp
branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
branches/nurbs/blender/source/blender/src/editcurve.c
Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp 2008-12-30 10:37:52 UTC (rev 18171)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp 2008-12-30 11:10:59 UTC (rev 18172)
@@ -96,6 +96,12 @@
Pts[i].y = ctlPts[i*pntsU+Curve].y;
Pts[i].z = ctlPts[i*pntsU+Curve].z;
Pts[i].H = ctlPts[i*pntsU+Curve].H;
+ if (1.0 != Pts[i].H) {
+ nbReal w = Pts[i].H;
+ Pts[i].x *= w;
+ Pts[i].y *= w;
+ Pts[i].z *= w;
+ }
} //eof
} else {
// U Directional Curves
@@ -104,6 +110,12 @@
Pts[i].y = ctlPts[i+pntsU*Curve].y;
Pts[i].z = ctlPts[i+pntsU*Curve].z;
Pts[i].H = ctlPts[i+pntsU*Curve].H;
+ if (1.0 != Pts[i].H) {
+ nbReal w = Pts[i].H;
+ Pts[i].x *= w;
+ Pts[i].y *= w;
+ Pts[i].z *= w;
+ }
} //eof
} //fi
@@ -298,6 +310,12 @@
FnlPts[indx].y = Pts[i].y;
FnlPts[indx].z = Pts[i].z;
FnlPts[indx].H = Pts[i].H;
+ if (1.0 != FnlPts[indx].H) {
+ nbReal w = 1 / FnlPts[indx].H;
+ FnlPts[indx].x *= w;
+ FnlPts[indx].y *= w;
+ FnlPts[indx].z *= w;
+ }
ctlPts = newCtlPts; //HMMM FIXME CHECKME eman - moot for now since only allowing increase in one dir per call
// Update Original because we know V is just tacked onto the end of the array and
@@ -316,6 +334,12 @@
FnlPts[indx].y = Pts[i].y;
FnlPts[indx].z = Pts[i].z;
FnlPts[indx].H = Pts[i].H;
+ if (1.0 != FnlPts[indx].H) {
+ nbReal w = 1 / FnlPts[indx].H;
+ FnlPts[indx].x *= w;
+ FnlPts[indx].y *= w;
+ FnlPts[indx].z *= w;
+ }
//printf("U FnlPts[%d]: %.3f,%.3f,%.3f:%.3f\n",indx,FnlPts[indx].x,FnlPts[indx].y,FnlPts[indx].z,FnlPts[indx].H);
} //eof
} //fi
@@ -538,6 +562,12 @@
Pts[i].y= obj -> CtlPts()[indx].y;
Pts[i].z= obj -> CtlPts()[indx].z;
Pts[i].H= obj -> CtlPts()[indx].H;
+ if (1.0 != Pts[i].H) {
+ nbReal w = Pts[i].H;
+ Pts[i].x *= w;
+ Pts[i].y *= w;
+ Pts[i].z *= w;
+ }
} //eof
} else {
// U Directional Curves
@@ -547,6 +577,12 @@
Pts[i].y= obj -> CtlPts()[indx].y;
Pts[i].z= obj -> CtlPts()[indx].z;
Pts[i].H= obj -> CtlPts()[indx].H;
+ if (1.0 != Pts[i].H) {
+ nbReal w = Pts[i].H;
+ Pts[i].x *= w;
+ Pts[i].y *= w;
+ Pts[i].z *= w;
+ }
} //eof
} //fi
for(i= 0; i < obj -> Length(UV) + obj -> Order(UV); i++)
@@ -769,6 +805,12 @@
FnlPts[indx].y= Pts[i].y;
FnlPts[indx].z= Pts[i].z;
FnlPts[indx].H= Pts[i].H;
+ if (1.0 != FnlPts[indx].H) {
+ nbReal w = 1 / FnlPts[indx].H;
+ FnlPts[indx].x *= w;
+ FnlPts[indx].y *= w;
+ FnlPts[indx].z *= w;
+ }
} //eof
} else {
// U Directional Curves
@@ -778,6 +820,12 @@
FnlPts[indx].y= Pts[i].y;
FnlPts[indx].z= Pts[i].z;
FnlPts[indx].H= Pts[i].H;
+ if (1.0 != FnlPts[indx].H) {
+ nbReal w = 1 / FnlPts[indx].H;
+ FnlPts[indx].x *= w;
+ FnlPts[indx].y *= w;
+ FnlPts[indx].z *= w;
+ }
//printf("U FnlPts[%d]: %.3f,%.3f,%.3f:%.3f\n",indx,FnlPts[indx].x,FnlPts[indx].y,FnlPts[indx].z,FnlPts[indx].H);
// will need to do something like this if we allow simultaenous reduction in U and V
Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp 2008-12-30 10:37:52 UTC (rev 18171)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp 2008-12-30 11:10:59 UTC (rev 18172)
@@ -74,6 +74,9 @@
recalc = (obj -> Change(Change) != Unpts+Vnpts+OrderU+OrderV+TessU+TessV+CyclicU+CyclicV);
obj -> Change(Change,Unpts+Vnpts+OrderU+OrderV+TessU+TessV+CyclicU+CyclicV);
+ // Allocate memory for temp
+ int tempSize = NurbanaMath::Max(OrderU + Unpts + extraPntsU, OrderV + Vnpts + extraPntsV);
+ nbReal *tempForBasis = (nbReal *) MEM_callocN(sizeof(nbReal) * tempSize, "Surface() tempForBasis");
// Recalculate Basis Functions
if(recalc) {
@@ -84,7 +87,7 @@
nbReal t = startU;
for(i = 0; i <= TessU; i++) {
- NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPts(), BasisU[i], 1);
+ NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPts(), BasisU[i], 1, tempForBasis);
t += stepU;
}
@@ -99,7 +102,7 @@
tv = startV;
}
for(i = 0; i <= TessV; i++) {
- NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPts(), BasisV[i], 1);
+ NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPts(), BasisV[i], 1, tempForBasis);
tv += stepV;
}
} else {
@@ -110,7 +113,7 @@
nbReal t = startU;
for(i = 0; i <= TessU; i++) {
- NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPtsOld(), BasisU[i], 1);
+ NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPtsOld(), BasisU[i], 1, tempForBasis);
t += stepU;
}
@@ -121,10 +124,12 @@
nbReal tv = startV;
for(i = 0; i <= TessV; i++) {
- NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPtsOld(), BasisV[i], 1);
+ NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPtsOld(), BasisV[i], 1, tempForBasis);
tv += stepV;
}
}
+ MEM_freeN(tempForBasis);
+
// Compute Surface
if(recalc) {
@@ -336,45 +341,23 @@
//#define NURBS_KV_Open 1 // endpoints tied
//#define NURBS_KV_Bezier 2
- if(uv == 0)
- {
- if(obj -> KnotType(0) == NURBS_KV_Periodic) {
- if(obj -> Cyclic(0))
- PeriodicKnot(obj -> Length(0) + obj -> Order(0) -1,obj -> Order(0),obj -> KnotVector(0));
- else
- PeriodicKnot(obj -> Length(0),obj -> Order(0),obj -> KnotVector(0));
+ if(obj -> KnotType(uv) == NURBS_KV_Periodic) {
+ if(obj -> Cyclic(uv))
+ PeriodicKnot(obj -> Length(uv) + obj -> Order(uv) - 1, obj -> Order(uv), obj -> KnotVector(uv));
+ else
+ PeriodicKnot(obj -> Length(uv), obj -> Order(uv), obj -> KnotVector(uv));
- } else if(obj -> KnotType(0) == NURBS_KV_Open) {
- if(obj -> Cyclic(0))
- OpenKnot(obj -> Length(0)-1 + obj ->Order(0) -1,obj -> Order(0),obj -> KnotVector(0));
- else
- OpenKnot(obj -> Length(0)-1,obj -> Order(0),obj -> KnotVector(0));
- } else if(obj -> KnotType(0) == NURBS_KV_Bezier) {
- if(obj -> Cyclic(0))
- BezierKnot(obj -> Length(0) + obj ->Order(0) -1,obj -> Order(0),obj -> KnotVector(0));
- else
- BezierKnot(obj -> Length(0),obj -> Order(0),obj -> KnotVector(0));
- }
+ } else if(obj -> KnotType(uv) == NURBS_KV_Open) {
+ if(obj -> Cyclic(uv))
+ OpenKnot(obj -> Length(uv) - 1 + obj ->Order(uv) - 1, obj -> Order(uv), obj -> KnotVector(uv));
+ else
+ OpenKnot(obj -> Length(uv) - 1, obj -> Order(uv), obj -> KnotVector(uv));
+ } else if(obj -> KnotType(uv) == NURBS_KV_Bezier) {
+ if(obj -> Cyclic(uv))
+ BezierKnot(obj -> Length(uv) + obj -> Order(uv) - 1, obj -> Order(uv), obj -> KnotVector(uv));
+ else
+ BezierKnot(obj -> Length(uv), obj -> Order(uv), obj -> KnotVector(uv));
}
- else
- {
- if(obj -> KnotType(1) == NURBS_KV_Periodic) { //FIXME check for curve no knotV
- if(obj -> Cyclic(1))
- PeriodicKnot(obj -> Length(1) + obj -> Order(1) -1,obj -> Order(1),obj -> KnotVector(1));
- else
- PeriodicKnot(obj -> Length(1),obj -> Order(1),obj -> KnotVector(1));
- } else if(obj -> KnotType(1) == NURBS_KV_Open) {
- if(obj -> Cyclic(1))
- OpenKnot(obj -> Length(1)-1 + obj -> Order(1) -1,obj -> Order(1),obj -> KnotVector(1));
- else
- OpenKnot(obj -> Length(1)-1,obj -> Order(1),obj -> KnotVector(1));
- } else if(obj -> KnotType(1) == NURBS_KV_Bezier) {
- if(obj -> Cyclic(1))
- BezierKnot(obj -> Length(1) + obj ->Order(1) -1,obj -> Order(1),obj -> KnotVector(1));
- else
- BezierKnot(obj -> Length(1),obj -> Order(1),obj -> KnotVector(1));
- }
- }
}
@@ -660,9 +643,9 @@
// KnotVector[i] = i;
}
-void NURBS_Generate::NURBSBasis(int Order, nbReal t, int npts, int realPts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type) {
+void NURBS_Generate::NURBSBasis(int Order, nbReal t, int npts, int realPts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type, nbReal *temp) {
int i, k;
- nbReal *temp, sum, d, e;
+ nbReal sum, d, e;
/* For Curves */
if(npts == 1) {
@@ -675,9 +658,6 @@
else if(t > KnotVector[Order+npts-1])
t= KnotVector[Order+npts-1];
- // Allocate memory for temp
- temp = (nbReal *)MEM_callocN(sizeof(nbReal)*(npts+Order),"NURBSBasis() temp");
-
/* this part is order '1' */
int o2 = Order + 1;
int orderpluspnts= Order+npts;
@@ -735,8 +715,6 @@
//for(i =0;i<npts;i++)
//printf(" %f,",BasisValues[i]);
//printf("\n");
-
- MEM_freeN(temp);
}
//
Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h 2008-12-30 10:37:52 UTC (rev 18171)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h 2008-12-30 11:10:59 UTC (rev 18172)
@@ -62,7 +62,7 @@
static void PeriodicKnot(int npts, int Order, nbReal *KnotVector);
static void OpenKnot(int npts, int Order, nbReal *KnotVector);
- static void NURBSBasis(int Order, nbReal t, int npts, int realPts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type);
+ static void NURBSBasis(int Order, nbReal t, int npts, int realPts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type, nbReal *temp);
// static void NURBSBasis(int Order, nbReal t, int npts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type);
static void NURBSBasisDer1(int Order, nbReal t, int npts, nbReal *KnotVector, Point3d *cp, nbReal *BasisValues, bool Type);
Modified: branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
===================================================================
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list