[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