[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31246] branches/nurbs-merge: * Fixed two bugs that Sergey pointed out - both related to calculation of BevelList 's for 2D NURBS curves
Sergey Sharybin
g.ulairi at gmail.com
Wed Aug 11 17:39:33 CEST 2010
Revision: 31246
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31246
Author: nazgul
Date: 2010-08-11 17:39:33 +0200 (Wed, 11 Aug 2010)
Log Message:
-----------
* Fixed two bugs that Sergey pointed out - both related to calculation of BevelList's for 2D NURBS curves
- Bevp values are now calculated correctly
- Bevel objects work for NURBS curves
- Vector lines are displayed properly
* rewrote tesselation function to be clearer for values tessU and tessV ("i < tessU" instead of "tessU--;i<=tessU")
Own changes:
- No need in s/CU_CYCLIC/CU_NURB_CYCLIC part of patch
Merge rev28396 from nurbs25 branch
Revision Links:
--------------
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28396
Modified Paths:
--------------
branches/nurbs-merge/intern/nurbana/extern/nurbana.h
branches/nurbs-merge/intern/nurbana/intern/libNurbana.cpp
branches/nurbs-merge/intern/nurbana/intern/nbConstruct.cpp
branches/nurbs-merge/intern/nurbana/intern/nbGenerate.cpp
branches/nurbs-merge/intern/nurbana/intern/nbGenerate.h
branches/nurbs-merge/intern/nurbana/intern/nbNURBS.cpp
branches/nurbs-merge/source/blender/blenkernel/BKE_curve.h
branches/nurbs-merge/source/blender/blenkernel/intern/curve.c
branches/nurbs-merge/source/blender/blenkernel/intern/displist.c
branches/nurbs-merge/source/blender/editors/curve/curve_ops.c
Modified: branches/nurbs-merge/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs-merge/intern/nurbana/extern/nurbana.h 2010-08-11 15:39:10 UTC (rev 31245)
+++ branches/nurbs-merge/intern/nurbana/extern/nurbana.h 2010-08-11 15:39:33 UTC (rev 31246)
@@ -134,8 +134,8 @@
//extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int dim );
extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int resU, int resV, int dim);
-extern nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res);
-extern nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, int res, float t, int uv, int dim);
+extern nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, nbReal* bevpBuffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res, int stride);
+extern nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, int res, nbReal t, int uv, int dim);
extern nbReal3_ptr NRB_GenerateNormals(NurbanaObj_ptr nop);
Modified: branches/nurbs-merge/intern/nurbana/intern/libNurbana.cpp
===================================================================
--- branches/nurbs-merge/intern/nurbana/intern/libNurbana.cpp 2010-08-11 15:39:10 UTC (rev 31245)
+++ branches/nurbs-merge/intern/nurbana/intern/libNurbana.cpp 2010-08-11 15:39:33 UTC (rev 31246)
@@ -460,7 +460,7 @@
nbReal* NRB_getIsoPoints(NurbanaObj_ptr nop, nbReal* buffer) {
nbNURBS *on;
on = reinterpret_cast<nbNURBS*>(nop);
- nbGenerate::IsoLines(on,buffer);
+ nbGenerate::isoLines(on,buffer);
return buffer;
}
@@ -584,7 +584,7 @@
return buffer;
}
-nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res) {
+nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, nbReal* bevpBuffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res, int stride) {
nbNURBS *on;
on = reinterpret_cast<nbNURBS*>(nop);
if(on->RecalculateKnotVector()) {
@@ -592,7 +592,7 @@
on->RecalculateKnotVector(0);
}
- nbGenerate::curve(on,buffer, tiltBuffer, radiusBuffer, res, false);
+ nbGenerate::curve(on,buffer, bevpBuffer, tiltBuffer, radiusBuffer, res, stride, false);
return buffer;
}
nbReal3* NRB_GenerateNormals(NurbanaObj_ptr nop) {
Modified: branches/nurbs-merge/intern/nurbana/intern/nbConstruct.cpp
===================================================================
--- branches/nurbs-merge/intern/nurbana/intern/nbConstruct.cpp 2010-08-11 15:39:10 UTC (rev 31245)
+++ branches/nurbs-merge/intern/nurbana/intern/nbConstruct.cpp 2010-08-11 15:39:33 UTC (rev 31246)
@@ -114,10 +114,10 @@
for(i = 0; i < tmp1->Length(0) * tmp1->Length(1); i++) {
for(j = 0; j < tmp2->Length(0) * tmp2->Length(1); j++) {
D2 = sqrt(
- (tmp1->getCtlPts()[i].x - tmpCP2[j].x)*(tmp1->getCtlPts()[i].x - tmpCP2[j].x) +
- (tmp1->getCtlPts()[i].y - tmpCP2[j].y)*(tmp1->getCtlPts()[i].y - tmpCP2[j].y) +
- (tmp1->getCtlPts()[i].z - tmpCP2[j].z)*(tmp1->getCtlPts()[i].z - tmpCP2[j].z) +
- (tmp1->getCtlPts()[i].H - tmpCP2[j].H)*(tmp1->getCtlPts()[i].H - tmpCP2[j].H)
+ (tmpCP1[i].x - tmpCP2[j].x)*(tmpCP1[i].x - tmpCP2[j].x) +
+ (tmpCP1[i].y - tmpCP2[j].y)*(tmpCP1[i].y - tmpCP2[j].y) +
+ (tmpCP1[i].z - tmpCP2[j].z)*(tmpCP1[i].z - tmpCP2[j].z) +
+ (tmpCP1[i].H - tmpCP2[j].H)*(tmpCP1[i].H - tmpCP2[j].H)
);
if (D2 < D1) D1= D2;
} //eof
Modified: branches/nurbs-merge/intern/nurbana/intern/nbGenerate.cpp
===================================================================
--- branches/nurbs-merge/intern/nurbana/intern/nbGenerate.cpp 2010-08-11 15:39:10 UTC (rev 31245)
+++ branches/nurbs-merge/intern/nurbana/intern/nbGenerate.cpp 2010-08-11 15:39:33 UTC (rev 31246)
@@ -1,8 +1,8 @@
#include "nbGenerate.h"
//NurbData nbGenerate::nurbData;
-void nbGenerate::curve(nbNURBS *obj, nbReal* buffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res, bool update) {
- surface(obj, res, 1 , 3, buffer, tiltBuffer, radiusBuffer, obj->Sum(), 0, 0, update);
+void nbGenerate::curve(nbNURBS *obj, nbReal* buffer, nbReal* bevpBuffer, nbReal* tiltBuffer, nbReal* radiusBuffer, int res, int stride, bool update) {
+ surface(obj, res, 1 , 3, buffer, (nbReal3*)bevpBuffer, tiltBuffer, radiusBuffer, stride, obj->Sum(), 0, 0, update);
}
void nbGenerate::curveOnSurface(nbNURBS *obj, nbReal* buffer, int res, float t, int uv, int dim) {
@@ -37,21 +37,21 @@
// Blender seems to use a different tess for curves and surfaces, numCPu*resU vs resU*resV
if(Vnpts == 1)
- surface(obj, resU , resV * Vnpts , dim, buffer, NULL, NULL, obj->Sum(), 0, 0, 1);
+ surface(obj, resU , resV * Vnpts , dim, buffer, NULL, NULL, NULL, 0, obj->Sum(), 0, 0, 1);
else
- surface(obj,resU, resV , dim, buffer, NULL, NULL, obj->Sum(), 0, 0, 1);
+ surface(obj,resU, resV , dim, buffer, NULL, NULL, NULL, 0, obj->Sum(), 0, 0, 1);
}
-void nbGenerate::IsoLines(nbNURBS *obj, nbReal* buffer) {
+void nbGenerate::isoLines(nbNURBS *obj, nbReal* buffer) {
int Change;
- Change= obj->Change(1);
+ Change = obj->Change(1);
- surface(obj, obj->getIsolineDensity(), obj->getIsoilineResolution(), 3, buffer, NULL, NULL, obj->SumIPC(0), 0, 0, 0);
+ surface(obj, obj->getIsolineDensity(), obj->getIsoilineResolution(), 3, buffer, NULL, NULL, NULL, 0, obj->SumIPC(0), 0, 0, 0);
if(!Change) obj->Change(1,0);
- surface(obj,obj->getIsoilineResolution(),obj->getIsolineDensity(), 3, buffer, NULL, NULL, obj->SumIPC(1),obj->getIsoilineResolution()*obj->getIsolineDensity(),0,0);
+ surface(obj,obj->getIsoilineResolution(),obj->getIsolineDensity(), 3, buffer, NULL, NULL, NULL, 0, obj->SumIPC(1),obj->getIsoilineResolution()*obj->getIsolineDensity(),0,0);
}
-void nbGenerate::surface(nbNURBS *obj, int origTessU, int origTessV, int dim, nbReal *TssPts, nbReal *tiltBuffer, nbReal *radiusBuffer, nbReal *Sum, int Index, bool Change, bool Update) {
+void nbGenerate::surface(nbNURBS *obj, int origTessU, int origTessV, int dim, nbReal *TssPts, nbReal3 *bevpBuffer, nbReal *tiltBuffer, nbReal *radiusBuffer, int stride, nbReal *Sum, int index, bool Change, bool Update) {
int n,k,l,m,j,j0;
nbReal BasisResult;
int i, OrderU, OrderV, Unpts, Vnpts, extraPntsU, extraPntsV,CyclicU,CyclicV;
@@ -61,9 +61,12 @@
nbReal3 *TssPts3 = NULL;
nbReal4 *TssPts4 = NULL;
- int TessU = origTessU;
- int TessV = origTessV;
+ int tessU = origTessU;
+ int tessV = origTessV;
+ nbReal3 *bevp_fp = bevpBuffer;
+ nbReal *tilt_fp= tiltBuffer, *radius_fp= radiusBuffer;
+
Unpts = obj->Length(0);
Vnpts = obj->Length(1);
OrderU = obj->getOrder(0);
@@ -79,25 +82,22 @@
extraPntsV = OrderV - 1;
if(Vnpts <= 1)
- TessV = 1;
+ tessV = 1;
- BasisU = (nbReal **)MEM_callocN(sizeof(nbReal*) * TessU,"BasisU");
- for(i = 0; i < TessU; i++) {
+ BasisU = (nbReal **)MEM_callocN(sizeof(nbReal*) * tessU,"BasisU");
+ for(i = 0; i < tessU; i++) {
BasisU[i] = (nbReal*)MEM_callocN(sizeof(nbReal)*(Unpts+extraPntsU),"BasisU[i]");
}
- BasisV = (nbReal **)MEM_callocN(sizeof(nbReal*) * TessV,"BasisV");
- for(i = 0; i < TessV; i++) {
+ BasisV = (nbReal **)MEM_callocN(sizeof(nbReal*) * tessV,"BasisV");
+ for(i = 0; i < tessV; i++) {
BasisV[i] = (nbReal*)MEM_callocN(sizeof(nbReal)*(Vnpts+extraPntsV),"BasisV[i]");
}
- TessU--;
- TessV--;
-
if(Update == false || Change==1)
recalc = 1;
else
- recalc = (obj->Change(Change) != Unpts+Vnpts+OrderU+OrderV+TessU+TessV+CyclicU+CyclicV);
- obj->Change(Change,Unpts+Vnpts+OrderU+OrderV+TessU+TessV+CyclicU+CyclicV);
+ 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 = nbMath::Max(OrderU + Unpts + extraPntsU, OrderV + Vnpts + extraPntsV);
@@ -108,10 +108,10 @@
nbReal endU = (obj->getKnotVector(0)[Unpts + extraPntsU]);
nbReal startU = (obj->getKnotVector(0)[(OrderU-1)]);
int extra = CyclicU ? 1 : 0;
- nbReal stepU = (endU - startU)/(TessU + extra);
+ nbReal stepU = (endU - startU)/((tessU-1) + extra);
nbReal t = startU;
- for(i = 0; i <= TessU; i++) {
+ for(i = 0; i < tessU; i++) {
NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj->getKnotVector(0), obj->getCtlPts(), BasisU[i], 1, tempForBasis);
t += stepU;
}
@@ -123,10 +123,10 @@
endV = (obj->getKnotVector(1)[Vnpts + extraPntsV]);
startV = (obj->getKnotVector(1)[(OrderV-1)]);
extra = CyclicV ? 1 : 0;
- stepV= (endV - startV)/(TessV + extra);
+ stepV= (endV - startV)/((tessV-1) + extra);
tv = startV;
}
- for(i = 0; i <= TessV; i++) {
+ for(i = 0; i < tessV; i++) {
NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj->getKnotVector(1), obj->getCtlPts(), BasisV[i], 1, tempForBasis);
tv += stepV;
}
@@ -134,10 +134,10 @@
nbReal endU = (obj->getKnotVector(0)[Unpts + extraPntsU]);
nbReal startU = (obj->getKnotVector(0)[(OrderU-1)]);
int extra = CyclicU ? 1 : 0;
- nbReal stepU = (endU - startU)/(TessU + extra);
+ nbReal stepU = (endU - startU)/((tessU-1) + extra);
nbReal t = startU;
- for(i = 0; i <= TessU; i++) {
+ for(i = 0; i < tessU; i++) {
NURBSBasis(OrderU, t, (Unpts+extraPntsU),Unpts, obj->getKnotVector(0), obj->CtlPtsOld(), BasisU[i], 1, tempForBasis);
t += stepU;
}
@@ -145,10 +145,10 @@
nbReal endV = (obj->getKnotVector(1)[Vnpts + extraPntsV]);
nbReal startV = (obj->getKnotVector(1)[(OrderV-1)]);
extra = CyclicV ? 1 : 0;
- nbReal stepV = (endV - startV)/(TessV + extra);
+ nbReal stepV = (endV - startV)/((tessV-1) + extra);
nbReal tv = startV;
- for(i = 0; i <= TessV; i++) {
+ for(i = 0; i < tessV; i++) {
NURBSBasis(OrderV, tv, (Vnpts+extraPntsV), Vnpts,obj->getKnotVector(1), obj->CtlPtsOld(), BasisV[i], 1, tempForBasis);
tv += stepV;
}
@@ -160,7 +160,7 @@
if(recalc) {
if(dim == 4)
TssPts4 = (nbReal4*)(TssPts);
- else
+ else if(dim == 3)
TssPts3 = (nbReal3*)(TssPts);
if(Update) {
@@ -172,17 +172,17 @@
m = 0;
- for(i = 0; i <= TessU; i++) {
- for(n = 0; n <= TessV; n++) {
+ for(i = 0; i < tessU; i++) {
+ for(n = 0; n < tessV; n++) {
- // printf("TessU: %d TessV %d i: %d n: %d\n", TessU, TessV,i,n);
+ // printf("tessU: %d tessV %d i: %d n: %d\n", tessU, tessV,i,n);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list