[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18603] branches/nurbs/blender: Interactive Refine UI
Emmanuel Stone
emmanuel.stone at gmail.com
Wed Jan 21 09:15:48 CET 2009
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. @@
More information about the Bf-blender-cvs
mailing list