Revision: 18603
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18603
Author:   eman
Date:     2009-01-21 09:15:48 +0100 (Wed, 21 Jan 2009)

Log Message:
-----------
Interactive Refine UI
 - Keyboard entry using Theeth's transform number input 
  - Values between minKnot and maxKnot allowed
 - Perform refine in V direction
 - Select all CPs after refine. even new ones.

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/libNurbana.cpp
    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      2009-01-21 
07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2009-01-21 
08:15:48 UTC (rev 18603)
@@ -129,8 +129,9 @@
 extern int NRB_getNumCPoints(int uv,NurbanaObj_ptr nurb);
 extern int NRB_getOrder(int uv,NurbanaObj_ptr nurb);
 extern int NRB_getNumKnots(int uv,NurbanaObj_ptr nurb);
+extern nbReal NRB_getLastKnotValue(NurbanaObj_ptr nurb,int uv);
+extern nbReal NRB_getFirstKnotValue(NurbanaObj_ptr nurb,int uv);
 
-
 extern void NRB_resetIsoLines(NurbanaObj_ptr nurb);
 extern int NRB_getNumIsoPoints(NurbanaObj_ptr nop);
 extern int NRB_getIsoResolution(NurbanaObj_ptr nop);
@@ -143,7 +144,7 @@
 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 dim);
+extern nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, 
int res, float t, int uv, int dim);
 extern nbReal3_ptr NRB_GenerateNormals(NurbanaObj_ptr nop);
 
 extern void NRB_Subdivide(NurbanaObj_ptr nop,int subdivideU, int subdivideV);

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp     
2009-01-21 07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp     
2009-01-21 08:15:48 UTC (rev 18603)
@@ -5,14 +5,27 @@
        Surface(obj, res, 1 , 3, buffer, tiltBuffer, radiusBuffer, obj -> 
Sum(), 0, 0, update);
 }
 
-void NURBS_Generate::CurveOnSurface(Object_NURBS *obj, nbReal* buffer, int 
res, float t, int dim) {
+void NURBS_Generate::CurveOnSurface(Object_NURBS *obj, nbReal* buffer, int 
res, float t, int uv, int dim) {
        int sizeU = (*obj->_TessUV[0])*obj->Length(0);
        int sizeV = (*obj->_TessUV[1])*obj->Length(1);
+       nbReal3 *tessBuffer = (nbReal3*)(obj -> _OldBuffer);    
+       nbReal3 *buffer3 = (nbReal3*)buffer;
+
        if(t == 1.0)
                t = 0.9999;
-       int index = sizeU * t;
-       for(int i=0; i < sizeV * 3; i++)
-               buffer[i] = obj -> _OldBuffer[(sizeV*index*3)+i];
+       if(!uv)
+       {
+               int index = sizeU * t;
+               for(int i=0; i < sizeV ; i++)
+                       buffer3[i] = tessBuffer[(sizeV*index)+i];
+       }
+       else
+       {
+               int index = sizeV * t;
+               for(int i=0; i < sizeU; i++)
+                       buffer3[i] = tessBuffer[(sizeV*i)+index];
+
+       }
 }
 
 void NURBS_Generate::Surface(Object_NURBS *obj, nbReal* buffer, int resU, int 
resV, int dim) {

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2009-01-21 07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2009-01-21 08:15:48 UTC (rev 18603)
@@ -38,7 +38,7 @@
 class NURBS_Generate {
   public:
        static void             Surface(Object_NURBS *obj, nbReal* buffer, int 
resU, int resV, int dim);
-       static void             CurveOnSurface(Object_NURBS *obj, nbReal* 
buffer, int res, float t, int dim);
+       static void             CurveOnSurface(Object_NURBS *obj, nbReal* 
buffer, int res, float t, int uv, int dim);
 //    static void              Surface(Object_NURBS *obj, nbReal* buffer, int 
dim = 3);
        static void                     Curve(Object_NURBS *obj, nbReal* 
buffer, nbReal* tiltBufer, nbReal* radiusBuffer, int res, bool update);
     static void                IsoLines(Object_NURBS *obj, nbReal* buffer); 

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp 2009-01-21 
07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.cpp 2009-01-21 
08:15:48 UTC (rev 18603)
@@ -209,6 +209,25 @@
                else break;
 }
 
+nbReal NURBS_Knot::getLastKnotValue(Object_NURBS *obj, bool UV) {
+       const int oldKnotCount = obj -> Length(UV) + obj -> Order(UV);
+       const bool cyclic = obj -> Cyclic(UV);
+       const int order = obj -> Order(UV);
+       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) + obj->Order(UV) 
+ obj->Order(UV) - 2)]; // don't need a different number for cyclic because of 
virtual CP
+       else
+               return obj -> KnotVector(UV)[(obj->Length(UV) + 
obj->Order(UV))-1];
+
+//     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];
+}
+
 void NURBS_Knot::Insert(Object_NURBS *obj, nbReal *X, int r, bool UV) {
        int             i,j,k,l,ind;
        Point3d *Qw, *bufferQw, *Curve, *bufferCurve;
@@ -225,6 +244,7 @@
        // knot count including virtual knots
        const int newKnotCount2 = oldKnotCount2 + r;
        const int newLength = obj -> Length(UV) + r;
+
        const int first = cyclic ? 0 : degree;
        const int last = cyclic ? oldKnotCount - 1 : oldKnotCount - degree - 1;
     if (cyclic)

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h   2009-01-21 
07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Knot.h   2009-01-21 
08:15:48 UTC (rev 18603)
@@ -43,6 +43,8 @@
     static     void    Refine(Object_NURBS *obj, int U, int V);
     static     void    Remove(Object_NURBS *obj);
     static     void    BezierDecompose(int Npts, int Order, Point3d *CtlPts, 
nbReal *KV);
+       static  nbReal  getLastKnotValue(Object_NURBS *obj, bool UV);
+       static  nbReal  getFirstKnotValue(Object_NURBS *obj, bool UV);
 
   private:
     static     void    _Insert(Object_NURBS *obj, bool UV, nbReal *KV, int 
KVLen);

Modified: branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2009-01-21 
07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2009-01-21 
08:15:48 UTC (rev 18603)
@@ -278,6 +278,19 @@
        return (on->Order(uv));
 }
 
+nbReal NRB_getLastKnotValue(NurbanaObj_ptr nurb,int uv) {
+       Object_NURBS *on;
+       on = reinterpret_cast<Object_NURBS*>(nurb);
+       return (NURBS_Knot::getLastKnotValue(on, uv ));
+}
+
+nbReal NRB_getFirstKnotValue(NurbanaObj_ptr nurb,int uv) {
+       Object_NURBS *on;
+       on = reinterpret_cast<Object_NURBS*>(nurb);
+       return (NURBS_Knot::getFirstKnotValue(on, uv ));
+}
+
+
 void NRB_removeObject(NurbanaObj_ptr nop) {
        printf("removeObject() nop=%d\n",nop);
        Object_NURBS *on;
@@ -298,7 +311,7 @@
        return buffer;
 }
 
-nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, int 
res, float t, int dim) {
+nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, int 
res, float t, int uv, int dim) {
        Object_NURBS *on;
        on = reinterpret_cast<Object_NURBS*>(nop);
 
@@ -306,7 +319,7 @@
                NURBS_Generate::KnotVector(on);
                on->RecalculateKnotVector(0);
        }
-       NURBS_Generate::CurveOnSurface(on,buffer, res, t, dim);
+       NURBS_Generate::CurveOnSurface(on,buffer, res, t, uv, dim);
        return buffer;
 }
 

Modified: branches/nurbs/blender/source/blender/src/editcurve.c
===================================================================
--- branches/nurbs/blender/source/blender/src/editcurve.c       2009-01-21 
07:03:39 UTC (rev 18602)
+++ branches/nurbs/blender/source/blender/src/editcurve.c       2009-01-21 
08:15:48 UTC (rev 18603)
@@ -42,6 +42,7 @@
 #include <stdlib.h>
 #include "MEM_guardedalloc.h"
 #include "nurbana.h"
+#include "transform.h"
 
 #include "BMF_Api.h"
 
@@ -2083,34 +2084,127 @@
 
        ScrArea *sa;
        short choosing = 1;
-       short canceled = 1;
+       short canceled = 0;
+       short direction = 1;
+       short kbMode = 0;
        short val,evnt;
        float index = 0.5;
-       float *buffer;//[3*100]; //FIXME
+       float newKnotVal = 0;
+       float *bufferU = NULL;
+       float *bufferV = NULL;
+       float *buffer = NULL;
+
+       int sizeU = 0;
+       int sizeV = 0;
+
        int size = 0;
        int i=0;
+       float largestKnot,smallestKnot;
+       NumInput num;
 
+       initNumInput(&num);
+
        for(nu= editNurb.first; nu; nu= nu->next) {
                if(!nu->nurbanaPtr)
                        return;
-               size = nu->pntsv * nu->resolv;
-               buffer = (float*)MEM_callocN(3 * size * sizeof(float), "Refine 
temp draw buffer");
+               sizeU = nu->pntsv * nu->resolv;
+               bufferU = (float*)MEM_callocN(3 * sizeU * sizeof(float), 
"Refine temp draw buffer");
 
-//             if((nu->type & 7)==CU_NURBS) {
-//                     NRB_Refine(nu->nurbanaPtr, 1, 1);//FIXME nbReal *X, int 
r, bool UV) ;
-//             }
+               sizeV = nu->pntsu * nu->resolu;
+               bufferV = (float*)MEM_callocN(3 * sizeV * sizeof(float), 
"Refine temp draw buffer");
 
-               // Highlight the Control Edges
-               while(choosing)
+               while(choosing && !canceled)
                {
                        getmouseco_areawin(mval);
 
                        scrarea_do_windraw(curarea);
-                       sprintf(msg,"Position on surface: %.3f",index);
+                       sprintf(msg,"New knot value: %.3f",newKnotVal);
                        headerprint(msg);
+       
+                       if(direction == 0)
+                       {
+                               size = sizeU;
+                               buffer = bufferU;
+                       }
+                       else
+                       {
+                               size = sizeV;
+                               buffer = bufferV;
+                       }
 
-                       
NRB_GenerateCurveOnSurface(nu->nurbanaPtr,buffer,0,index,0);
+                       
NRB_GenerateCurveOnSurface(nu->nurbanaPtr,buffer,0,0.5,direction,3);
+                       persp(PERSP_VIEW);   
+                       glPushMatrix();   
+                       mymultmatrix(G.obedit->obmat);
+
+                       // Draw selected part of the surface
+                       glColor3ub(255, 0, 0);
+
+                       glBegin(GL_LINE_STRIP);
+                       for(i = 0; i < size*3; i+=3)
+                               glVertex3f(buffer[i],buffer[i+1],buffer[i+2]);
+                       if (nu->flagv & CU_CYCLIC)
+                               glVertex3f(buffer[0],buffer[1],buffer[2]);
+                       glEnd(); 
+
+                       glPopMatrix();  
+                       screen_swapbuffers();
+
+                       /* backbuffer refresh for non-apples (no aux) */
+                       #ifndef __APPLE__
+                       if(G.vd->drawtype>OB_WIRE && (G.vd->flag & 
V3D_ZBUF_SELECT)) {
+                               backdrawview3d(0);
+                       }
+                       #endif
+                       while(qtest()) 
+                       {
+                               val=0;
+                               evnt= extern_qread(&val);
+
+                               if(val && ((evnt ==  MOUSEY )||(evnt ==  MOUSEX 
)))
+                               { 
+                                       float epsilon = 2.5;
+                                       int a,b;
+                                       a = abs(mvalo[0]-mval[0])+1;
+                                       b = abs(mvalo[1]-mval[1])+1;
+                                       
+                                       // Detect which direction the mouse is 
mostly moving in
+                                       if(b && (a / (float)b) > epsilon)

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