Revision: 19043
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19043
Author:   eman
Date:     2009-02-19 19:53:43 +0100 (Thu, 19 Feb 2009)

Log Message:
-----------
New Split tool by Laurynas Duburas
Specials Menu (w) -> Split
Also:
Smart knot  vector editing in extrude functions (actually currently overwritten 
by  NRB_SizeChanged in cases other than knottype == 9)

Modified Paths:
--------------
    branches/nurbs/blender/intern/nurbana/extern/nurbana.h
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Utils.h
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.h
    branches/nurbs/blender/intern/nurbana/intern/Object_Primitives.cpp
    branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
    branches/nurbs/blender/source/blender/include/butspace.h
    branches/nurbs/blender/source/blender/src/editcurve.c
    branches/nurbs/blender/source/blender/src/editobject.c
    branches/nurbs/blender/source/blender/src/header_view3d.c

Modified: branches/nurbs/blender/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2009-02-19 
17:13:04 UTC (rev 19042)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2009-02-19 
18:53:43 UTC (rev 19043)
@@ -114,6 +114,7 @@
 
 extern void NRB_setLength(int U, int V, int shiftU, int shiftV, int copyKnots, 
NurbanaObj_ptr nurb);
 extern void NRB_reallocKnots(int U, int V, int copy, NurbanaObj_ptr nurb);
+extern void NRB_copyPatchFromBuffer(nbReal4 *buffer, int curveLength, int 
nextCurve, int curveCount, NurbanaObj_ptr nurb, int uOffset, int vOffset);
 extern void NRB_reallocCtlPts(int U, int V, int shiftU, int shiftV, 
NurbanaObj_ptr nurb);
 
 extern void NRB_ConvertToPrimitive(NurbanaObj_ptr nop,unsigned char type);
@@ -151,6 +152,9 @@
 extern void NRB_Refine(NurbanaObj_ptr nop, int U, int V);
 extern void NRB_KnotInsert(NurbanaObj_ptr nop,nbReal *X, int r, int UV);
 
+extern void NRB_split(NurbanaObj_ptr nop, nbReal x, int uv, nbReal4* dst, int 
dstLen, int* frstLen, int* scndLen, int* k, int* newPoints, int* inserted);
+extern void NRB_splitBuffer(nbReal4* buffer, int newPoints, NurbanaObj_ptr 
nop, NurbanaObj_ptr nop2, nbReal splitKnot, int newLength, int span, int uv, 
int frstLen, int scndLen);
+
 extern void NRB_DegreeElevate(NurbanaObj_ptr nop,int Uinc, int Vinc);
 extern void NRB_DegreeReduce(NurbanaObj_ptr nop,int Udec, int Vdec);
 

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp       
2009-02-19 17:13:04 UTC (rev 19042)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp       
2009-02-19 18:53:43 UTC (rev 19043)
@@ -138,7 +138,7 @@
                                if (frstInsNum) {
                                        if (cyclic) {
                                                memcpy(pts - degree, pts - 
degree + curveLength, sizeof(*pts) * degree);
-                                           NURBS_Knot::insertCurveKnot(pts, 
curveLength + lastInsNum, 1, pts, 1, unwrappedKnots + degree, degree, 
frstInsKnot, frstInsIndex, degree - frstInsNum, frstInsNum);
+                                           insertCurveKnot(pts, curveLength + 
lastInsNum, 1, pts, 1, unwrappedKnots + degree, degree, frstInsKnot, 
frstInsIndex, degree - frstInsNum, frstInsNum);
                                                curveLength += frstInsNum;
                                                memcpy(pts - degree + 
curveLength, pts - degree, sizeof(*pts) * degree);
                                                pts += frstInsIndex - (degree - 
frstInsNum);

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp 2009-02-19 
17:13:04 UTC (rev 19042)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp 2009-02-19 
18:53:43 UTC (rev 19043)
@@ -135,6 +135,15 @@
        return count;
 }
 
+void NURBS_Knot::getSpanAndMult(nbReal u, int degree, int curveLength, bool 
cyclic, const nbReal *knots, int& k, int& mult) {
+       mult = 0;
+       for (int i = 0; i <= curveLength + degree + 1; i++) {
+               if (knots[i] == u)
+                       mult++;
+       }
+       k = NURBS_Knot::FindSpanRef(u, degree, curveLength + 1 + (cyclic ? 
degree: 0), knots);
+}
+
 int NURBS_Knot::FindSpan(int Unpts, int p, nbReal u, nbReal *KnotVector) {
        int     low,mid,high;
 
@@ -244,16 +253,19 @@
        const int degree = order - 1;
        const int last = cyclic ? oldKnotCount - 1 : oldKnotCount - degree - 1;
        if(obj->Cyclic(UV))
-               return obj -> KnotVector(UV)[(obj->Length(UV) - 1)]; // don't 
need a different number for cyclic because of virtual CP
+               return obj -> KnotVector(UV)[(obj->Length(UV) + order - 1)]; // 
don't need a different number for cyclic because of virtual CP
        else
-               return obj -> KnotVector(UV)[(obj->Length(UV) + 
obj->Order(UV))-1];
+               return obj -> KnotVector(UV)[obj->Length(UV)];
 
 //     printf("Last knot value: %.4f\n",obj -> KnotVector(UV)[last]);
 //     return obj -> KnotVector(UV)[last];
 }
 
 nbReal NURBS_Knot::getFirstKnotValue(Object_NURBS *obj, bool UV) {
-       return obj -> KnotVector(UV)[0];
+//     if (obj -> Cyclic(UV))
+//         return obj -> KnotVector(UV)[0];
+//     else 
+       return obj -> KnotVector(UV)[obj -> Order(UV) - 1];
 }
 
 void NURBS_Knot::refine(int order, int curveLength, int curveCount, bool 
cyclic, const Point3d* inCps, int nextCurveIn, Point3d* outCps, int 
nextCurveOut, int nextCp, const nbReal* inKnotVect, nbReal* outKnotVect, 
nbReal* X, int r, bool cpsIn4D) {
@@ -862,37 +874,12 @@
                *outCp = *inCp;
 }
 
-void NURBS_Knot::insertCurveKnot(nbReal4* inCps, int cpCount, int nextInCp, 
nbReal4* outCps, int nextOutCp, nbReal* knots, int degree, nbReal u, int k, int 
mult, int num) {
-       nbReal4 Rw[MAX_ORDER];
-       if (inCps != outCps) {
-       //FIXME: copy leading control points
-       }
-       
-//     for (int i = cpCount - 1; i >= k - mult; i--) {
-//             cps [i + num][0] = cps [i][0];
-//             cps [i + num][1] = cps [i][1];
-//     }
-       
-       copyBackCurve(inCps + (cpCount - 1) * nextInCp, nextInCp, outCps + 
(cpCount - 1 + num) * nextOutCp, nextOutCp, cpCount - k + mult);
-       copyCurve(inCps + (k - degree) * nextInCp, nextInCp, Rw, 1, degree + 1 
- mult);
-       
-       int l = 0;      
-       for (int j = 1; j <= num; j++) {
-               l = k - degree + j;
-               for (int i = 0; i <= degree - j - mult; i++) {
-                       float alpha = (u - knots[l + i]) / (knots[i + k + 1] - 
knots[l + i]);
-                       Rw[i].x = alpha * Rw[i + 1].x + (1.0f - alpha) * 
Rw[i].x;
-                       Rw[i].y = alpha * Rw[i + 1].y + (1.0f - alpha) * 
Rw[i].y;
-                       Rw[i].z = alpha * Rw[i + 1].z + (1.0f - alpha) * 
Rw[i].z;
-                       Rw[i].a = alpha * Rw[i + 1].a + (1.0f - alpha) * 
Rw[i].a;
-               }
-               *(outCps + l * nextOutCp) = Rw[0];
-               *(outCps + (k + num - j - mult) * nextOutCp) = Rw[degree - j - 
mult];
-       }
-       copyCurve(Rw + 1, 1, outCps + (l + 1) * nextOutCp, nextOutCp, k - num  
- l - 1);
-}
-
 void NURBS_Knot::insertKnot(const nbReal* inKnots, nbReal* outKnots, nbReal u, 
int k, int num, int cpCount, int order, bool cyclic) {
+    const int degree = order - 1;
+       if (cyclic && k >= cpCount) {
+       k -= cpCount;
+       u -= inKnots[cpCount];
+    }
        if (inKnots != outKnots)
                memcpy(outKnots, inKnots, sizeof(*inKnots) * (k + 1));
        int tail = (cyclic ? cpCount - k : cpCount + order - k - 1);

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h   2009-02-19 
17:13:04 UTC (rev 19042)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h   2009-02-19 
18:53:43 UTC (rev 19043)
@@ -22,8 +22,6 @@
 #include "NGlobal.h"
 #endif
 
-#define MAX_ORDER 6
-
 class Object_NURBS;
 class NURBS_Knot {
   public:
@@ -37,10 +35,11 @@
     
     static  int     getKnotMultiplicity(const nbReal knotVect[], int index, 
int cpCount, int order, bool cyclic);
     static  int     getFwdKnotMultiplicity(const nbReal knotVect[], int index, 
int cpCount, int order, bool cyclic);
-
+    static  void    getSpanAndMult(nbReal u, int degree, int curveLength, bool 
cyclic, const nbReal *knots, int& k, int& mult);
+    
     static     void    Difference(nbReal *KV1, int L1, nbReal *KV2, int L2, 
nbReal *KV3, int &L3);
     static     int             FindSpan(int Unpts, int p, nbReal u, nbReal 
*KnotVector);
-       static  int     FindSpanRef(nbReal &u, int first, int last, const 
nbReal *KnotVector);
+    static  int     FindSpanRef(nbReal &u, int first, int last, const nbReal 
*KnotVector);
     static     void    Scale(nbReal *KV, int r, nbReal Max);
     static     void    MergeKnotVectors(int Ulen, nbReal *U, int Vlen, nbReal 
*V, int &Ki, nbReal *KV);
     static     void    Refine(Object_NURBS *obj, nbReal *X, int r, bool UV);
@@ -50,10 +49,13 @@
     static     void    Remove(Object_NURBS *obj);
     static     void    BezierDecompose(int Npts, int Order, Point3d *CtlPts, 
nbReal *KV);
     static  void    removeCurveKnot(nbReal4* inCps, int cpCount, int nextInCp, 
nbReal4* outCps, int nextOutCp, nbReal* knots, int degree, int r, int num);
-    static  void    insertCurveKnot(nbReal4* inCps, int cpCount, int nextInCp, 
nbReal4* outCps, int nextOutCp, nbReal* knots, int degree, nbReal u, int k, int 
mult, int num);
-       static  nbReal  getLastKnotValue(Object_NURBS *obj, bool UV);
+//    static  void    splitCurve(const nbReal4* srcCps, int cpCount, int 
nextSrcCp, nbReal4* dstCps, int nextDstCp, const nbReal* knots, int degree, 
nbReal u, int k, int mult, bool cyclic, int& frstLen, int& scndLen);
+//    static  void    insertCurveKnot(const nbReal4* inCps, int cpCount, int 
nextInCp, nbReal4* outCps, int nextOutCp, const nbReal* knots, int degree, 
nbReal u, int k, int mult, int num, bool cyclic = false);
+    static     nbReal  getLastKnotValue(Object_NURBS *obj, bool UV);
        static  nbReal  getFirstKnotValue(Object_NURBS *obj, bool UV);
 
+       template <class SrcPoint, class DstPoint>
+       static void split(const SrcPoint* srcCps, int curveLength, int 
curveCount, int nextSrcCp, int nextSrcCurve, DstPoint* dstCps, int nextDstCp, 
int nextDstCurve, const nbReal* knots, int degree, nbReal u, bool cyclic, int& 
k, int& newPoints, int& inserted, int& frstLen, int& scndLen, bool pointsIn3D);
     /**
      * Inserts knot into knot vector.
      * @param inKnots input knot vector.
@@ -82,4 +84,56 @@
 
 }; //eof class NURBS_Knot
 
+
+template <class SrcPoint, class DstPoint>
+void NURBS_Knot::split(const SrcPoint* srcCps, int curveLength, int 
curveCount, int nextSrcCp, int nextSrcCurve, DstPoint* dstCps, int nextDstCp, 
int nextDstCurve, const nbReal* knots, int degree, nbReal u, bool cyclic, int& 
k, int& newPoints, int& inserted, int& frstLen, int& scndLen, bool pointsIn3D = 
false) {
+       //number of knots to insert
+       SrcPoint* srcCurve = const_cast<SrcPoint* >(srcCps);
+       DstPoint* dstCurve = dstCps;
+       const int srcBufferLength = curveLength + (cyclic ? degree + 1 : 0);
+       const int nextSrcBufferCp = cyclic ? 1 : nextSrcCp;
+       
+       int mult;
+       NURBS_Knot::getSpanAndMult(u, degree, curveLength, cyclic, knots, k, 
mult);
+       //printf("u: %f, k: %i, mult: %i\n", u, k, mult);
+       const int num = NurbanaMath::Max(degree - mult, 0);
+       inserted = num;
+       
+       if (num) {
+               SrcPoint* srcBuffer;
+               if (cyclic) 
+                       srcBuffer = (SrcPoint*) MEM_callocN(sizeof(*srcBuffer) 
* srcBufferLength, "split() srcBuffer");
+
+               for (int i = 0; i < curveCount; i++, srcCurve += nextSrcCurve, 
dstCurve += nextDstCurve) {
+                       if (cyclic) {
+                               copyCurve(srcCurve, nextSrcCp, srcBuffer, 1, 
curveLength);
+                               copyCurve(srcCurve, nextSrcCp, srcBuffer + 
curveLength, 1, degree + 1);
+                       }  else srcBuffer = srcCurve;

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to