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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to