[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