[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12212] branches/nurbs/blender: - Added support for 'alfa' curve twist in libNurbana.cpp

Emmanuel Stone emmanuel.stone at gmail.com
Sun Oct 7 04:19:56 CEST 2007


Revision: 12212
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12212
Author:   eman
Date:     2007-10-07 04:19:53 +0200 (Sun, 07 Oct 2007)

Log Message:
-----------
- Added support for 'alfa' curve twist in libNurbana.cpp
 - refactored NURBS_Generate::Surface
 - This fixed a bug in non surface curves
 - TODO confirm that this works with broken's new interp code
- Fixed IsoLines memory leak
 - added resetIsoLines function, and modified buttons_editing.c to call it

Modified Paths:
--------------
    branches/nurbs/blender/intern/nurbana/extern/nurbana.h
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h
    branches/nurbs/blender/intern/nurbana/intern/Object_Base.cpp
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.h
    branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
    branches/nurbs/blender/source/blender/blenkernel/intern/curve.c
    branches/nurbs/blender/source/blender/include/butspace.h
    branches/nurbs/blender/source/blender/src/buttons_editing.c
    branches/nurbs/blender/source/blender/src/editcurve.c

Modified: branches/nurbs/blender/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/extern/nurbana.h	2007-10-06 18:03:37 UTC (rev 12211)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h	2007-10-07 02:19:53 UTC (rev 12212)
@@ -38,20 +38,18 @@
 
 typedef float nbReal;
 
-//typedef struct Point3d {
-//    nbReal  x;  
-//    nbReal  y;
-//    nbReal  z;
-//}Point3d;
 typedef struct nbReal3 {
 	nbReal  x;  
 	nbReal  y;
 	nbReal  z;
-	
-	// This extra data should make Point4d 'struct'rally equivalent to BPoint from Blender::DNA_Data_Types.h
-//	float alfa, weight;		/* alfa: tilt in 3D View, weight: used for softbody goal weight */
-	//short f1, hide;
+
 }nbReal3;
+typedef struct nbReal4 {
+	nbReal  x;  
+	nbReal  y;
+	nbReal  z;
+	nbReal  a;
+}nbReal4;
 
 
 typedef struct Point3d {
@@ -61,7 +59,7 @@
 	nbReal  H;
 	
 	// This extra data should make Point4d 'struct'rally equivalent to BPoint from Blender::DNA_Data_Types.h
-	float alfa, weight;		/* alfa: tilt in 3D View, weight: used for softbody goal weight */
+	nbReal alfa, weight;		/* alfa: tilt in 3D View, weight: used for softbody goal weight */
 	short f1, hide;
 	float radius, pad;		/* user-set radius per point for bevelling etc */
 }Point3d;
@@ -122,14 +120,16 @@
 extern int NRB_getOrder(int uv,NurbanaObj_ptr nurb);
 extern int NRB_getNumKnots(int uv,NurbanaObj_ptr nurb);
 
+
+extern void NRB_resetIsoLines(NurbanaObj_ptr nurb);
 extern int NRB_getNumIsoPoints(NurbanaObj_ptr nop);
 extern int NRB_getIsoResolution(NurbanaObj_ptr nop);
 extern int NRB_getIsoDensity(NurbanaObj_ptr nop);
 extern void NRB_setIsoResolution(NurbanaObj_ptr nop,int res);
 extern void NRB_setIsoDensity(NurbanaObj_ptr nop,int den);
-extern nbReal3_ptr NRB_getIsoPoints(NurbanaObj_ptr nop, nbReal3* buffer);
+extern nbReal* NRB_getIsoPoints(NurbanaObj_ptr nop, nbReal* buffer);
 
-extern nbReal3_ptr NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal3* buffer);
+extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int dim );
 extern nbReal3_ptr NRB_GenerateNormals(NurbanaObj_ptr nop);
 
 extern void NRB_Subdivide(NurbanaObj_ptr nop,nbReal subdividePositionU, nbReal subdividePositionV);

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp	2007-10-06 18:03:37 UTC (rev 12211)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp	2007-10-07 02:19:53 UTC (rev 12212)
@@ -1,67 +1,58 @@
 #include "NURBS_Generate.h"
 //NurbData	NURBS_Generate::nurbData;
 
-void NURBS_Generate::Surface(Object_NURBS *obj, nbReal3* buffer) {
+void NURBS_Generate::Surface(Object_NURBS *obj, nbReal* buffer, int dim) {
    int Vnpts;
 	
 	Vnpts = obj -> Length(1);
 
 	// Blender seems to use a different tess for curves and surfaces, numCPu*resU vs resU*resV
 	if(Vnpts == 1) 
-		Surface(obj, obj -> Tess(0) * obj-> Length(0) , obj -> Tess(1) * Vnpts , buffer, obj -> Sum(), 0, 0, 1);
+		Surface(obj, obj -> Tess(0) * obj-> Length(0) , obj -> Tess(1) * Vnpts , dim, buffer, obj -> Sum(), 0, 0, 1);
 	else
-		Surface(obj, obj -> Tess(0), obj -> Tess(1) , buffer, obj -> Sum(), 0, 0, 1);
+		Surface(obj, obj -> Tess(0), obj -> Tess(1) , dim, buffer, obj -> Sum(), 0, 0, 1);
 	
 	//IsoLines(obj);
 }
 
-void	NURBS_Generate::IsoLines(Object_NURBS *obj, nbReal3* buffer) {
+void	NURBS_Generate::IsoLines(Object_NURBS *obj, nbReal* buffer) {
 	int Change;
 	Change= obj->Change(1);
 //	Surface(obj, obj -> IPCResolution(), obj -> IPCDensity(), obj -> IPCPts(), obj -> SumIPC(0), 0, 1, 0);
 //	if(!Change) obj->Change(1,0);
 //	Surface(obj,obj->IPCDensity(),obj->IPCResolution(),obj->IPCPts(),obj->SumIPC(1),obj->IPCResolution()*obj->IPCDensity(),1,0);
 //
-	Surface(obj, obj -> IPCDensity(), obj -> IPCResolution(), buffer, obj -> SumIPC(0), 0, 1, 0);
+	Surface(obj, obj -> IPCDensity(), obj -> IPCResolution(), 3, buffer, obj -> SumIPC(0), 0, 1, 0);
 	if(!Change) obj->Change(1,0);
-	Surface(obj,obj->IPCResolution(),obj->IPCDensity(), buffer, obj->SumIPC(1),obj->IPCResolution()*obj->IPCDensity(),1,0);
+	Surface(obj,obj->IPCResolution(),obj->IPCDensity(), 3, buffer, obj->SumIPC(1),obj->IPCResolution()*obj->IPCDensity(),1,0);
 	
 	
 }
-/*
-   AssignNurbData(obj, obj -> Tess(0), obj -> Tess(1), obj -> TssPts(), obj -> Sum(), 0, 0, 0);
-   Surface();
 
-   // Isoparametric U Curves
-   Change= obj -> Change(1);
-   AssignNurbData(obj, obj -> IPCResolution(), obj -> IPCDensity(), obj -> IPCPts(), obj -> SumIPC(0), 0, 1, 0);
-   Surface();
-
-   // Isoparametric V Curves
-   if (!Change) obj -> Change(1,0);
-   AssignNurbData(obj, obj -> IPCDensity(), obj -> IPCResolution(), obj -> IPCPts(),
-                  obj -> SumIPC(1), obj -> IPCResolution() * obj -> IPCDensity(), 1, 1);
-   Surface();
-
-*/
-
-void NURBS_Generate::Surface(Object_NURBS *obj, int TessU, int TessV, nbReal3 *TssPts, nbReal *Sum, int Index, bool Change, bool Update) {
+void NURBS_Generate::Surface(Object_NURBS *obj, int TessU, int TessV, int dim, nbReal *TssPts, 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;
    bool recalc;
    nbReal **BasisU;
    nbReal **BasisV;
+   nbReal3 *TssPts3;
+   nbReal4 *TssPts4;
 
 	Unpts = obj -> Length(0);
 	Vnpts = obj -> Length(1);
-	OrderU = obj -> Order(0);
+	OrderU = obj -> Order(0);	
 	OrderV = obj -> Order(1);
 	CyclicU = obj -> Cyclic(0);
 	CyclicV = obj -> Cyclic(1);
 	extraPntsU = 0;
 	extraPntsV = 0;
 	
+	if(dim == 4)
+		TssPts4 = (nbReal4*)(TssPts);
+	else
+		TssPts3 = (nbReal3*)(TssPts);
+
 	if(CyclicU)
 		extraPntsU = OrderU - 1;
 	if(CyclicV)
@@ -87,34 +78,17 @@
 	else 
 	recalc = (obj -> Change(Change) != Unpts+Vnpts+OrderU+OrderV+TessU+TessV);
 	obj -> Change(Change,Unpts+Vnpts+OrderU+OrderV+TessU+TessV);
-//	if(Change)
-//		recalc = 1;
-//	else
-//		recalc = 0;
+	if(Change)
+		recalc = 1;
+	else
+		recalc = 0;
    recalc = 1;//FIXME
 		
 // ("recalc: %d\n",recalc);
 
 	// Recalculate Basis Functions
 	if(recalc) {
-//		for(i = 0; i <= TessU; i++) {
-//			if(obj -> Cyclic(0)) {
-//				NURBSBasis(OrderU, (OrderU-1)+i*nbReal((Unpts+extraPntsU)-(OrderU-1)) / nbReal(TessU), (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPts(), BasisU[i], 1);
-//			} else {//if(obj -> KnotType(0) == NURBS_KV_Open) {
-//				NURBSBasis(OrderU, i*nbReal(obj -> KnotVector(0)[(Unpts+extraPntsU)-1+OrderU]) / nbReal(TessU), (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPts(), BasisU[i], 1);
-//			}
-//		}
-//		
-//		
-//		for(i = 0; i <= TessV; i++) {
-//			if(obj -> Cyclic(1)) {
-//				NURBSBasis(OrderV, (OrderV-1)+i*nbReal((Vnpts+extraPntsV)-(OrderV-1)) / nbReal(TessV), (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPts(), BasisV[i], 1);
-//			} else {//if(obj -> KnotType(1) == NURBS_KV_Open) {
-//				NURBSBasis(OrderV, i*nbReal(obj -> KnotVector(1)[(Vnpts+extraPntsV)-1+OrderV]) / nbReal(TessV), (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPts(), BasisV[i], 1);
-//			}
-//		}
-//		
-		for(i = 0; i <= TessU; i++) {
+		for(i = 0; i <= TessU; i++) { // FIXME test for Cyclic instead of Periodic?
 			if(obj -> KnotType(0) == NURBS_KV_Periodic) {
 				NURBSBasis(OrderU, (OrderU-1)+i*nbReal((Unpts+extraPntsU)-(OrderU-1)) / nbReal(TessU), (Unpts+extraPntsU),Unpts, obj -> KnotVector(0), obj -> CtlPts(), BasisU[i], 1);
 			} else {//if(obj -> KnotType(0) == NURBS_KV_Open) {
@@ -129,8 +103,6 @@
 				NURBSBasis(OrderV, i*nbReal(obj -> KnotVector(1)[(Vnpts+extraPntsV)-1+OrderV]) / nbReal(TessV), (Vnpts+extraPntsV), Vnpts,obj -> KnotVector(1), obj -> CtlPts(), BasisV[i], 1);
 			}
 		}
-	
-
 	} else {
 
 		for(i = 0; i <= TessU; i++) {
@@ -159,13 +131,18 @@
 		}
 
 			m = 0;
-	for(i = 0; i <= TessU; i++) {
+
+			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);
 				nbReal tmp = fSum(obj -> CtlPts(), BasisU[i], BasisV[n], Unpts+extraPntsU,Unpts,Vnpts+extraPntsV, Vnpts);
 				Sum[m] = tmp;
 				
-				TssPts[Index+m].x = TssPts[Index+m].y= TssPts[Index+m].z= 0;
+				if(dim == 4)
+					TssPts4[Index+m].x = TssPts4[Index+m].y= TssPts4[Index+m].z= TssPts4[Index+m].a=0;
+				else
+					TssPts3[Index+m].x = TssPts3[Index+m].y= TssPts3[Index+m].z= 0;
 				
 				//printf("Basis_U[%d][%d]: %.3f\n", i, k, BasisU[i][k]);
 				for(l = 0; l < Vnpts + extraPntsV; l++) {
@@ -181,9 +158,19 @@
 			//		printf("BasisResult: %.3f BasisU[i=%d][k=%d]:%.3f, BasisV[n=%d][l=%d]:%.3f Sum[m]:%.3f \n",BasisResult,i,k,BasisU[i][k],n,l,BasisV[n][l],Sum[m]);//
 									
 							//	printf("i,n, m,Sum[m] l,k,j: %d,%d,  %d,%f    %d,%d, %d\n",i,n,m,Sum[m],l,k,j);//
-								TssPts[Index+m].x += (obj -> CtlPts()[j].x*BasisResult);
-								TssPts[Index+m].y += (obj -> CtlPts()[j].y*BasisResult);
-								TssPts[Index+m].z += (obj -> CtlPts()[j].z*BasisResult);
+								if(dim == 4)
+								{
+									TssPts4[Index+m].x += (obj -> CtlPts()[j].x*BasisResult);
+									TssPts4[Index+m].y += (obj -> CtlPts()[j].y*BasisResult);
+									TssPts4[Index+m].z += (obj -> CtlPts()[j].z*BasisResult);
+									TssPts4[Index+m].a += (obj -> CtlPts()[j].alfa*BasisResult);
+								}
+								else
+								{
+									TssPts3[Index+m].x += (obj -> CtlPts()[j].x*BasisResult);
+									TssPts3[Index+m].y += (obj -> CtlPts()[j].y*BasisResult);
+									TssPts3[Index+m].z += (obj -> CtlPts()[j].z*BasisResult);
+								}
 							}
 						}
 					} else {
@@ -196,16 +183,16 @@
 			}
 		}
 	} else {  // Incremental Surface Calculations
-		nbReal dh, dx, dy, dz;
+		nbReal dh, dx, dy, dz, da;
 		nbReal *sumold, sumratio;
 		int m0;
 		//sumold = (nbReal *)malloc(sizeof(nbReal)*(TessU+1)*(TessV+1));
 		sumold = (nbReal *)MEM_callocN(sizeof(nbReal)*(TessU+1)*(TessV+1),"sumold");
 
 		m = 0;
-		for(k = 0; k < Unpts; k++) {
+	//	for(k = 0; k < Unpts; k++) {
 			for(l = 0; l < Vnpts; l++) {
-	//			for(k = 0; k < Unpts; k++) {
+				for(k = 0; k < Unpts; k++) {
 				m0 = ((k%Unpts)*Vnpts)+(l%Vnpts);
 				printf("incremental m: %d %d\n",m,m0);
 				//dh = obj -> H()[m] - obj -> Hold()[m];
@@ -213,13 +200,16 @@
 				dy = obj -> CtlPts()[m].y - obj -> CtlPtsOld()[m].y;
 				dz = obj -> CtlPts()[m].z - obj -> CtlPtsOld()[m].z;
 				dh = obj -> CtlPts()[m].H - obj -> CtlPtsOld()[m].H;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list