[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18473] branches/nurbs/blender: Alpha version of new tool that allows refinement of a surface at a particular point .
Emmanuel Stone
emmanuel.stone at gmail.com
Tue Jan 13 06:46:17 CET 2009
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. @@
More information about the Bf-blender-cvs
mailing list