Revision: 18473
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18473
Author:   eman
Date:     2009-01-13 06:46:12 +0100 (Tue, 13 Jan 2009)

Log Message:
-----------
Alpha version of new tool that allows refinement of a surface at a particular 
point.
Based on Loop Subdivide from mesh tools.
Committing as prototype to solicit feedback.

Added to specials menu and edit menu:
Surface -> Editmode -> 'w' -> Refine

- Only works in U direction currently 
 - What would be sensible way to switch to V here, keyboard?
- No keyboard input yet
- Doesn't work properly for curves, cyclic or uniform surfaces yet

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/src/buttons_editing.c
    branches/nurbs/blender/source/blender/src/drawobject.c
    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
    branches/nurbs/blender/source/blender/src/toolbox.c

Modified: branches/nurbs/blender/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h      2009-01-13 
05:46:12 UTC (rev 18473)
@@ -143,7 +143,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 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-13 05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.cpp     
2009-01-13 05:46:12 UTC (rev 18473)
@@ -5,6 +5,16 @@
        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) {
+       int sizeU = (*obj->_TessUV[0])*obj->Length(0);
+       int sizeV = (*obj->_TessUV[1])*obj->Length(1);
+       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];
+}
+
 void NURBS_Generate::Surface(Object_NURBS *obj, nbReal* buffer, int resU, int 
resV, int dim) {
        int Vnpts;
 
@@ -94,7 +104,7 @@
                nbReal endV, startV, stepV, tv;
                if(Vnpts == 1)
                        endV = startV = stepV = tv = 0; // these values aren't 
used in NURBSBasis below for curves
-                       else{
+               else{
                        endV = (obj -> KnotVector(1)[Vnpts + extraPntsV]);
                        startV = (obj -> KnotVector(1)[(OrderV-1)]);
                        extra = CyclicV ? 1 : 0;

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2009-01-13 05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Generate.h       
2009-01-13 05:46:12 UTC (rev 18473)
@@ -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              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/libNurbana.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp 2009-01-13 
05:46:12 UTC (rev 18473)
@@ -155,6 +155,7 @@
        Object_NURBS *on;
        on = reinterpret_cast<Object_NURBS*>(nop);
        NURBS_Knot::Insert(on, X, r, UV );
+       NRB_Print(on);
 }
 
 void NRB_DegreeReduce(NurbanaObj_ptr nop,int Udec, int Vdec) {
@@ -297,6 +298,18 @@
        return buffer;
 }
 
+nbReal* NRB_GenerateCurveOnSurface(NurbanaObj_ptr nop, nbReal* buffer, int 
res, float t, int dim) {
+       Object_NURBS *on;
+       on = reinterpret_cast<Object_NURBS*>(nop);
+
+       if(on->RecalculateKnotVector()) {
+               NURBS_Generate::KnotVector(on);
+               on->RecalculateKnotVector(0);
+       }
+       NURBS_Generate::CurveOnSurface(on,buffer, res, t, dim);
+       return buffer;
+}
+
 nbReal* NRB_GenerateCurve(NurbanaObj_ptr nop, nbReal* buffer, nbReal* 
tiltBuffer, nbReal* radiusBuffer, int res) {
        Object_NURBS *on;
        on = reinterpret_cast<Object_NURBS*>(nop);

Modified: branches/nurbs/blender/source/blender/src/buttons_editing.c
===================================================================
--- branches/nurbs/blender/source/blender/src/buttons_editing.c 2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/source/blender/src/buttons_editing.c 2009-01-13 
05:46:12 UTC (rev 18473)
@@ -3747,7 +3747,7 @@
                                uiDefBut(block, BUT, B_DEGREEREDUCEU, "Degree 
Reduce", 10,130-132,150, 19,0, 0, 0, 0, 0, "Decrease the Order of selected 
surface in U");
                        }
                //      uiDefBut(block, BUT, B_DEGREEREDUCE, "Degree Reduce", 
10,130-132,150, 19,0, 0, 0, 0, 0, "FIXME selected");
-                       uiDefBut(block, BUT, B_REFINECURVE, "Degree Refine", 
10,130-154,150, 19,0, 0, 0, 0, 0, "FIXME selected");
+               //      uiDefBut(block, BUT, B_REFINECURVE, "Degree Refine", 
10,130-154,150, 19,0, 0, 0, 0, 0, "FIXME selected");
 
                }
        }

Modified: branches/nurbs/blender/source/blender/src/drawobject.c
===================================================================
--- branches/nurbs/blender/source/blender/src/drawobject.c      2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/source/blender/src/drawobject.c      2009-01-13 
05:46:12 UTC (rev 18473)
@@ -3872,15 +3872,6 @@
                bglEnd();
                        }
 
-                       Mat4CpyMat4(imat,G.vd->viewinv);// 
ob->obmat);//G.vd->viewinv);
-               
-                       Normalize(imat[0]);
-                       Normalize(imat[1]);
-                       //Mat4MulVecfl(imat,ob->rot);
-                       pixsize= v3d->persmat[0][3]*ob->obmat[3][0]+ 
v3d->persmat[1][3]*ob->obmat[3][1]+ v3d->persmat[2][3]*ob->obmat[3][2]+ 
v3d->persmat[3][3];
-                       pixsize*= v3d->pixsize;
-                       dotSize= pixsize*(size);//*0.4f);
-
                        VECCOPY(vec, bp->vec);
                        if(bp->hide==0) {
                                if((bp->f1 & SELECT)== sel)
@@ -3899,6 +3890,14 @@
                                }
                                else
                                {
+                                       //Mat4CpyMat4(imat,G.vd->viewinv);// 
ob->obmat);//G.vd->viewinv);
+
+                                       //Normalize(imat[0]);
+                                       //Normalize(imat[1]);
+                                       //Mat4MulVecfl(imat,ob->rot);
+                               //      pixsize= 
v3d->persmat[0][3]*ob->obmat[3][0]+ v3d->persmat[1][3]*ob->obmat[3][1]+ 
v3d->persmat[2][3]*ob->obmat[3][2]+ v3d->persmat[3][3];
+                               //      pixsize*= v3d->pixsize;
+                                       dotSize= 
0.04f;//pixsize*(size);//*0.4f);
                                        // Not sure why it doesn't work without 
this - eman
                                //      glBegin(GL_POLYGON);
                                //      glEnd();

Modified: branches/nurbs/blender/source/blender/src/editcurve.c
===================================================================
--- branches/nurbs/blender/source/blender/src/editcurve.c       2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/source/blender/src/editcurve.c       2009-01-13 
05:46:12 UTC (rev 18473)
@@ -2075,17 +2075,103 @@
 
 void refine() {
        Nurb *nu;
-       int a, b, sel, amount, *usel, *vsel;
-       BPoint *bp, *prevbp, *bpnew, *bpn;
-       float subdividePositionU,subdividePositionV;
+       //int a, b, sel, amount, *usel, *vsel;
+       //BPoint *bp, *prevbp, *bpnew, *bpn;
+//     float subdividePositionU,subdividePositionV;
+       char msg[128];
+       short mvalo[2] = {0,0}, mval[2];
 
+       ScrArea *sa;
+       short choosing = 1;
+       short canceled = 1;
+       short val,evnt;
+       float index = 0.5;
+       float *buffer;//[3*100]; //FIXME
+       int size = 0;
+       int i=0;
+
        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");
 
-               if((nu->type & 7)==CU_NURBS) {
-                       NRB_Refine(nu->nurbanaPtr, 1, 1);//FIXME nbReal *X, int 
r, bool UV) ;
+//             if((nu->type & 7)==CU_NURBS) {
+//                     NRB_Refine(nu->nurbanaPtr, 1, 1);//FIXME nbReal *X, int 
r, bool UV) ;
+//             }
+
+               // Highlight the Control Edges
+               while(choosing)
+               {
+                       getmouseco_areawin(mval);
+
+                       scrarea_do_windraw(curarea);
+                       sprintf(msg,"Position on surface: %.3f",index);
+                       headerprint(msg);
+
+                       
NRB_GenerateCurveOnSurface(nu->nurbanaPtr,buffer,0,index,0);
+                       
+                       persp(PERSP_VIEW);   
+                       glPushMatrix();   
+                       mymultmatrix(G.obedit->obmat);
+               
+                       // Draw selected part of the surface
+                       glColor3ub(0, 255, 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 ))
+                               { 
+                                       getmouseco_areawin(mval);
+                                       //printf("mouse moved X %d %f 
\n",mvalo[0] - mval[0],((mvalo[0] - mval[0])/100)); 
+                                       index -= (mvalo[1] - mval[1])/100.0;
+                                       if(index > 1)
+                                               index = 1;
+                                       if(index < 0)
+                                               index = 0;
+                                       mvalo[1] = mval[1];
+                               } 
+                               else if(val && (evnt ==  MOUSEX ))
+                               { 
+                                       //printf("mouse moved Y\n"); 
+                               } 
+                               else if(val && ((evnt==LEFTMOUSE || 
evnt==RETKEY) || (evnt == MIDDLEMOUSE || evnt==PADENTER)))
+                               {
+                                       choosing= 0;
+                                       canceled= 0;
+                               }
+                               else if(val && (evnt==ESCKEY || 
evnt==RIGHTMOUSE ))
+                               {
+                                       choosing=0;
+                                       canceled = 1;
+                               }
+                       }
                }
+
+               if(!canceled)
+               {
+                       
NRB_KnotInsert(nu->nurbanaPtr,&index,1,0);//NRB_Refine(nu->nurbanaPtr, 1, 
1);//FIXME nbReal *X, int r, bool UV) ;
+               }
+               MEM_freeN(buffer);
        }
        DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 

Modified: branches/nurbs/blender/source/blender/src/editobject.c
===================================================================
--- branches/nurbs/blender/source/blender/src/editobject.c      2009-01-13 
05:31:33 UTC (rev 18472)
+++ branches/nurbs/blender/source/blender/src/editobject.c      2009-01-13 
05:46:12 UTC (rev 18473)
@@ -2736,7 +2736,7 @@
        }
        else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
 
-               nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set 
Goal Weight%x3|Set Radius%x4|Smooth%x5|Smooth Radius%x6");
+               nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set 
Goal Weight%x3|Set Radius%x4|Smooth%x5|Smooth Radius%x6|Refine%x7");
                
                switch(nr) {
                case 1:
@@ -2757,6 +2757,9 @@
                case 6:
                        smoothradiusNurb();
                        break;
+               case 7:
+                       refine();
+                       break;
                }
                DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
        }

Modified: branches/nurbs/blender/source/blender/src/header_view3d.c
===================================================================
--- branches/nurbs/blender/source/blender/src/header_view3d.c   2009-01-13 
05:31:33 UTC (rev 18472)

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