[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