Revision: 16757
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16757
Author:   eman
Date:     2008-09-27 00:49:54 +0200 (Sat, 27 Sep 2008)

Log Message:
-----------
Added separate tesselation functions for Curves, as they use different 
resolution (res*length).
Fixed bug that was stopping knottype from being updated immediately with 
incremental optimisation on.
Modified tesselation function to cache selectively (Bevel code is 4D and was 
causing problems with curves which are 3D)

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/libNurbana.cpp
    branches/nurbs/blender/source/blender/blenkernel/intern/curve.c

Modified: branches/nurbs/blender/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2008-09-26 
21:49:26 UTC (rev 16756)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2008-09-26 
22:49:54 UTC (rev 16757)
@@ -135,6 +135,8 @@
 extern nbReal* NRB_getIsoPoints(NurbanaObj_ptr nop, nbReal* buffer);
 
 extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int dim 
);
+nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, int dim, int 
res);
+
 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     
2008-09-26 21:49:26 UTC (rev 16756)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp     
2008-09-26 22:49:54 UTC (rev 16757)
@@ -1,6 +1,10 @@
 #include "NURBS_Generate.h"
 //NurbData     NURBS_Generate::nurbData;
 
+void NURBS_Generate::Curve(Object_NURBS *obj, nbReal* buffer, int dim, int 
res, bool update) {
+       Surface(obj, res * obj-> Length(0) , 1 , dim, buffer, obj -> Sum(), 0, 
0, update);
+}
+
 void NURBS_Generate::Surface(Object_NURBS *obj, nbReal* buffer, int dim) {
        int Vnpts;
 
@@ -34,10 +38,10 @@
        nbReal BasisResult;
        int i, OrderU, OrderV, Unpts, Vnpts, extraPntsU, 
extraPntsV,CyclicU,CyclicV;
        bool recalc;
-       nbReal **BasisU;
-       nbReal **BasisV;
-       nbReal3 *TssPts3;
-       nbReal4 *TssPts4;
+       nbReal **BasisU = NULL;
+       nbReal **BasisV = NULL;
+       nbReal3 *TssPts3 = NULL;
+       nbReal4 *TssPts4 = NULL;
 
        int TessU = origTessU;
        int TessV = origTessV;
@@ -72,13 +76,13 @@
        TessU--;
        TessV--;
 
-       if(Change==1) 
+       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 = 1;//FIXME
+        //recalc = 1;//FIXME
        // ("recalc: %d\n",recalc);
 
        // Recalculate Basis Functions
@@ -147,12 +151,20 @@
                else
                        TssPts3 = (nbReal3*)(TssPts);
 
-               // Copy B into Bold -- FIXME memcpy
+/*             // Copy B into Bold -- FIXME memcpy
                for(i = 0; i < Unpts * Vnpts; i++) {
                        //obj -> CtlPtsOld()[i] = obj -> H()[i];
                        obj -> CtlPtsOld()[i] = obj -> CtlPts()[i];
                }
+*/
 
+               if(Update) {
+                       for(i = 0; i < Unpts*Vnpts; i++) {
+                               // Update Old with New
+                               obj -> CtlPtsOld()[i] = obj -> CtlPts()[i];
+                       }
+               }
+
                m = 0;
 
                for(i = 0; i <= TessU; i++) {
@@ -239,20 +251,16 @@
                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 + extraPntsU; k++) {
                                for(l = 0; l < Vnpts+ extraPntsV; l++) {
 
-                       //      m0 = ((k%Unpts)*Vnpts)+(l%Vnpts);
-                               m0 = 
((l%Vnpts)*Unpts)+(k%Unpts);//((k%Unpts)*Vnpts)+(l%Vnpts);
+                               m0 = ((l%Vnpts)*Unpts)+(k%Unpts);
                                printf("incremental m: %d %d\n",m,m0);          
        
                                m = m0;
                        
-                               //dh = obj -> H()[m] - obj -> Hold()[m];
                                dx = obj -> CtlPts()[m].x - obj -> 
CtlPtsOld()[m].x;
                                dy = obj -> CtlPts()[m].y - obj -> 
CtlPtsOld()[m].y;
                                dz = obj -> CtlPts()[m].z - obj -> 
CtlPtsOld()[m].z;
@@ -276,13 +284,12 @@
 
                                        // Calculate the change in the surface 
for each u,w
                                        j = 0;
-       for(i = 0; i <= TessU; i++) {
-                                                               
if(BasisU[i][k]) {                                              
+                                       for(i = 0; i <= TessU; i++) {
+                                               if(BasisU[i][k]) {              
                                
+                                                       for(n = 0; n <= TessV; 
n++) {
+                                                               
if(BasisV[n][l]) {
 
-                                                                       for(n = 
0; n <= TessV; n++) {
-                                                                               
if(BasisV[n][l]) {
-
-                                                                               
        printf("J: %i\n",j);
+                                                               //              
        printf("J: %i\n",j);
                                                                        if(dh) {
                                                                                
// Homogeneous coordinate changed
                                                                                
BasisResult = dh*BasisU[i][k]*BasisV[n][l]/Sum[j];
@@ -319,10 +326,10 @@
                                                                                
}
                                                                        }
                                                                }
-                                                               j++;//j += 
TessU+1;//j++;
+                                                               j++;
                                                        }
                                                } else {
-                                                       j += TessV+1;//TessV+1;
+                                                       j += TessV+1;
                                                }
                                        }
                                }
@@ -340,7 +347,6 @@
        if(Update) {
                for(i = 0; i < Unpts*Vnpts; i++) {
                        // Update Old with New
-                       //obj -> Hold()[i] = obj -> H()[i];
                        obj -> CtlPtsOld()[i] = obj -> CtlPts()[i];
                }
        }
@@ -374,7 +380,6 @@
                                        temp[k].y= obj -> CtlPts()[i*obj -> 
Length(1)+n].y;
                                        temp[k].z= obj -> CtlPts()[i*obj -> 
Length(1)+n].z;
                                        temp[k].H= obj -> CtlPts()[i*obj -> 
Length(1)+n].H;
-                                       //Htemp[k]= obj -> H()[i*obj -> 
Length(1)+n];
                                        k++;
                                }
 
@@ -383,7 +388,6 @@
                                        temp[k].y= obj -> CtlPts()[l+i*obj -> 
Length(1)].y;
                                        temp[k].z= obj -> CtlPts()[l+i*obj -> 
Length(1)].z;
                                        temp[k].H= obj -> CtlPts()[l+i*obj -> 
Length(1)].H;
-                                       //Htemp[k]= obj -> H()[l+i*obj -> 
Length(1)];
                                        k++;
                                }
                        }
@@ -394,7 +398,6 @@
                                temp[i].y= obj -> CtlPts()[i].y;
                                temp[i].z= obj -> CtlPts()[i].z;
                                temp[i].H= obj -> CtlPts()[i].H;
-                               //Htemp[i]= obj -> H()[i];
                                k++;
                        }
                }
@@ -407,7 +410,6 @@
                                        temp[k].y= temp[n+i*obj -> Length(1)].y;
                                        temp[k].z= temp[n+i*obj -> Length(1)].z;
                                        temp[k].H= temp[n+i*obj -> Length(1)].H;
-                                       //Htemp[k]= Htemp[n+i*obj -> Length(1)];
                                        k++;
                                }
                        }
@@ -420,11 +422,9 @@
                obj -> CtlPts()[i].y= temp[i].y;
                obj -> CtlPts()[i].z= temp[i].z;
                obj -> CtlPts()[i].H= temp[i].H;
-               //obj -> H()[i]= Htemp[i];
        }
 
        MEM_freeN(temp);
-       //MEM_freeN(Htemp);
 }
 
 
@@ -806,9 +806,8 @@
 
        //printf("KnotVector, Point3d *cp, nbReal *BasisValues,", nbReal 
*KnotVector, Point3d *cp, nbReal *BasisValues
        //printf("t=%.3f\n",t);
+
        // Allocate memory for temp
-       //temp = (nbReal *)malloc(sizeof(nbReal)*(npts+Order));
-       //temp = (nbReal 
*)MEM_callocN(sizeof(nbReal)*(npts+Order),"NURBSBasis() temp");
        temp = (nbReal *)MEM_callocN(sizeof(nbReal)*(npts+Order),"NURBSBasis() 
temp");
 
        /* this part is order '1' */
@@ -835,23 +834,6 @@
        }
        temp[i]= 0.0;
 
-       //for(i = 0; i <= npts+Order-1; i++)
-       ////for(i = 0; i < npts+Order; i++)
-       //      temp[i] = (t >= KnotVector[i]) && (t < KnotVector[i+1]) ? 1 : 0;
-
-       //printf("temp: ");
-       //for(i = 0; i < npts+Order+1; i++)
-       //      printf("%.2f, ",temp[i]);
-       //printf("\n");
-
-
-               //printf("Knotvector: ");
-               //for(i = 0; i < npts+Order+1; i++)
-               //      printf("%f, ",KnotVector[i]);
-               //printf("\n");
-
-       // Populate N(i,k)
-       
        for(k = 1; k < Order; k++) {
                for(i = 0; i < (npts+Order)-k; i++) {
                        d = temp[i] ? ((t-KnotVector[i])*temp[i]) / 
(KnotVector[i+k]-KnotVector[i]) : 0;

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2008-09-26 21:49:26 UTC (rev 16756)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2008-09-26 22:49:54 UTC (rev 16757)
@@ -37,8 +37,8 @@
 
 class NURBS_Generate {
   public:
-    static     void            Surface(Object_NURBS *obj, nbReal* buffer, int 
dim = 3);
-
+    static void                Surface(Object_NURBS *obj, nbReal* buffer, int 
dim = 3);
+       static void                     Curve(Object_NURBS *obj, nbReal* 
buffer, int dim, int res, bool update);
     static void                IsoLines(Object_NURBS *obj, nbReal* buffer); 
 
  //   static   void            TrimSurface(Object_NURBS *obj);

Modified: branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2008-09-26 
21:49:26 UTC (rev 16756)
+++ branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2008-09-26 
22:49:54 UTC (rev 16757)
@@ -184,7 +184,8 @@
        //      on->KnotType(uv,NURBS_KV_Custom);
 
        NURBS_Generate::KnotVector(on,uv);
-
+       on->Change(1,1);
+       on->Change(0,1);
        // Turn off recalc flag flag
        on->RecalculateKnotVector(0);
        NRB_Print(on);  
@@ -234,7 +235,17 @@
        NURBS_Generate::Surface(on,buffer, dim);
        return buffer;
 }
+nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, int dim, int 
res) {
+       Object_NURBS *on;
+       on = reinterpret_cast<Object_NURBS*>(nop);
+       if(on->RecalculateKnotVector()) {
+               NURBS_Generate::KnotVector(on);
+               on->RecalculateKnotVector(0);
+       }       
 
+       NURBS_Generate::Curve(on,buffer, dim, res, false);
+       return buffer;
+}
 nbReal3* NRB_GenerateNormals(NurbanaObj_ptr nop) {
        Object_NURBS *on;
        on = reinterpret_cast<Object_NURBS*>(nop);

Modified: branches/nurbs/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- branches/nurbs/blender/source/blender/blenkernel/intern/curve.c     
2008-09-26 21:49:26 UTC (rev 16756)
+++ branches/nurbs/blender/source/blender/blenkernel/intern/curve.c     
2008-09-26 22:49:54 UTC (rev 16757)
@@ -813,7 +813,9 @@
 
 numTess = nu->pntsu * NRB_getNumTessPoints(nu->nurbanaPtr);// FIXME check that 
this number is correct
 
-tsspts = NRB_GenerateSurface(nu->nurbanaPtr,data, dim);
+//tsspts = NRB_GenerateSurface(nu->nurbanaPtr,data, dim);
+tsspts = NRB_GenerateCurve(nu->nurbanaPtr,data, dim, resolu);
+
 //
 //printf("numTess: %d, resolu: %d",numTess,resolu);
 //for(i=0;i<numTess;i++)


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to