[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