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