[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24047] branches/nurbs25: * makenurbCurve

Emmanuel Stone emmanuel.stone at gmail.com
Thu Oct 22 05:22:44 CEST 2009


Revision: 24047
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24047
Author:   eman
Date:     2009-10-22 05:22:44 +0200 (Thu, 22 Oct 2009)

Log Message:
-----------
* makenurbCurve 
 - Added stride into function declaration to match recent changes in 2.5 for Bevel
 - Should fix compile problem on linux
 - Stride var not currently respected, as nurbana only accepts float buffers and this expects BevPoint too
* Refine Surface
 - Modal operator based on loopcut
 - First draft, not finished
  - The UI will be refactored, it's currently clunky
  - Numerical input hasn't been ported over from 2.4 yet
  - Redo/tweak not hooked up

Modified Paths:
--------------
    branches/nurbs25/intern/nurbana/extern/nurbana.h
    branches/nurbs25/release/scripts/ui/space_view3d_toolbar.py
    branches/nurbs25/source/blender/blenkernel/intern/curve.c
    branches/nurbs25/source/blender/editors/curve/curve_intern.h
    branches/nurbs25/source/blender/editors/curve/curve_ops.c
    branches/nurbs25/source/blender/editors/curve/editcurve.c
    branches/nurbs25/source/blender/editors/space_view3d/drawobject.c

Modified: branches/nurbs25/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs25/intern/nurbana/extern/nurbana.h	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/intern/nurbana/extern/nurbana.h	2009-10-22 03:22:44 UTC (rev 24047)
@@ -59,7 +59,7 @@
 	nbReal y;
 	nbReal z;
 	nbReal H;
-	// This extra data makes nurbana struct compatible with blender
+	// This extra data makes nurbana struct compatible with blender BPoint
 	float alfa, weight;		/* alfa: tilt in 3D View, weight: used for softbody goal weight */
 	short f1, hide;
 	float radius, pad;		/* user-set radius per point for bevelling etc */

Modified: branches/nurbs25/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- branches/nurbs25/release/scripts/ui/space_view3d_toolbar.py	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/release/scripts/ui/space_view3d_toolbar.py	2009-10-22 03:22:44 UTC (rev 24047)
@@ -125,7 +125,7 @@
 		col.itemO("curve.cyclic_toggle")
 		col.itemO("curve.switch_direction")
 		col.itemO("curve.spline_type_set")
-		
+
 		col = layout.column(align=True)
 		col.itemL(text="Handles:")
 		col.item_enumO("curve.handle_type_set", "type", 'AUTOMATIC')
@@ -171,6 +171,7 @@
 		col.itemO("curve.delete")
 		col.itemO("curve.cyclic_toggle")
 		col.itemO("curve.switch_direction")
+		col.itemO("curve.surface_refine")	
 		
 		col = layout.column(align=True)
 		col.itemL(text="Modeling:")

Modified: branches/nurbs25/source/blender/blenkernel/intern/curve.c
===================================================================
--- branches/nurbs25/source/blender/blenkernel/intern/curve.c	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/source/blender/blenkernel/intern/curve.c	2009-10-22 03:22:44 UTC (rev 24047)
@@ -841,7 +841,7 @@
 	NRB_getIsoPoints(nu->nurbanaPtr,data);
 }
 
-void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu)
+void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride)
 /* coord_array has to be 3*4*pntsu*resolu in size and zero-ed
  * tilt_array and radius_array will be written to if valid */
 {
@@ -877,6 +877,8 @@
 	if(radius_array)
 		printf("radius_array!\n");
 */
+
+	// FIXME eman 'stride' is currently ignored, as nurbana assumes float arrays.
 	NRB_GenerateCurve(nu->nurbanaPtr,coord_array,tilt_array, radius_array, resolu);
 }
 

Modified: branches/nurbs25/source/blender/editors/curve/curve_intern.h
===================================================================
--- branches/nurbs25/source/blender/editors/curve/curve_intern.h	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/source/blender/editors/curve/curve_intern.h	2009-10-22 03:22:44 UTC (rev 24047)
@@ -82,6 +82,9 @@
 void CURVE_OT_smooth(struct wmOperatorType *ot);
 void CURVE_OT_smooth_radius(struct wmOperatorType *ot);
 
+// Nurbana operators
+void CURVE_OT_surface_refine(struct wmOperatorType *ot);
+
 void CURVE_OT_de_select_first(struct wmOperatorType *ot);
 void CURVE_OT_de_select_last(struct wmOperatorType *ot);
 void CURVE_OT_select_all_toggle(struct wmOperatorType *ot);

Modified: branches/nurbs25/source/blender/editors/curve/curve_ops.c
===================================================================
--- branches/nurbs25/source/blender/editors/curve/curve_ops.c	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/source/blender/editors/curve/curve_ops.c	2009-10-22 03:22:44 UTC (rev 24047)
@@ -77,6 +77,7 @@
 	uiItemO(layout, NULL, 0, "CURVE_OT_radius_set");
 	uiItemO(layout, NULL, 0, "CURVE_OT_smooth");
 	uiItemO(layout, NULL, 0, "CURVE_OT_smooth_radius");
+	uiItemO(layout, NULL, 0, "CURVE_OT_surface_refine");
 	uiPupMenuEnd(C, pup);
 
 	return OPERATOR_CANCELLED;
@@ -137,6 +138,8 @@
 	WM_operatortype_append(CURVE_OT_smooth);
 	WM_operatortype_append(CURVE_OT_smooth_radius);
 
+	WM_operatortype_append(CURVE_OT_surface_refine);
+
 	WM_operatortype_append(CURVE_OT_de_select_first);
 	WM_operatortype_append(CURVE_OT_de_select_last);
 	WM_operatortype_append(CURVE_OT_select_all_toggle);
@@ -247,6 +250,8 @@
 	WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
 	RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1);
 
+	WM_keymap_add_item(keymap, "CURVE_OT_surface_refine", YKEY, KM_PRESS, KM_SHIFT, 0);
+
 	WM_keymap_add_item(keymap, "CURVE_OT_specials_menu", WKEY, KM_PRESS, 0, 0);
 
 	ED_object_generic_keymap(keyconf, keymap, TRUE);

Modified: branches/nurbs25/source/blender/editors/curve/editcurve.c
===================================================================
--- branches/nurbs25/source/blender/editors/curve/editcurve.c	2009-10-22 03:12:44 UTC (rev 24046)
+++ branches/nurbs25/source/blender/editors/curve/editcurve.c	2009-10-22 03:22:44 UTC (rev 24047)
@@ -77,6 +77,8 @@
 #include "ED_types.h"
 #include "ED_util.h"
 #include "ED_view3d.h"
+#include "ED_screen.h"
+#include "ED_space_api.h"
 
 #include "UI_interface.h"
 
@@ -84,10 +86,37 @@
 #include "RNA_define.h"
 
 #include "nurbana.h"
+#include "BIF_gl.h"
+#include "BIF_glutil.h" /* for paint cursor */
 
 /* still need to eradicate a few :( */
 #define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name)
 
+typedef struct nurbsOpData {
+	ARegion *ar;		/* region that ringsel was activated in */
+	void *draw_handle;	/* for drawing preview loop */
+
+	//float (*edges)[2][3];
+	//int totedge;
+
+	ViewContext vc;
+
+	Object *ob;
+	Nurb *nu;
+	//EditMesh *em;
+	//EditEdge *eed;
+	
+	short direction;
+	short direction_confirmed;
+	short mval_old[2];
+	int size[2];
+	float* buffer[2];//U, bufferV;
+	float index;
+	float newKnotVal;
+	//int extend;
+	//int do_cut;
+} nurbsOpData;
+
 float nurbcircle[8][2]= {
 	{0.0, -1.0}, {-1.0, -1.0}, {-1.0, 0.0}, {-1.0,  1.0},
 	{0.0,  1.0}, { 1.0,  1.0}, { 1.0, 0.0}, { 1.0, -1.0}
@@ -1371,6 +1400,242 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+/*************************************************************/
+/******************* nurbana functions ***********************/
+/*************************************************************/
+
+/******************* Surface refine operator ******************/
+static void surface_refine_cleanup(bContext *C, wmOperator *op)
+{
+	nurbsOpData *lcd= op->customdata;
+
+	MEM_freeN(lcd->buffer[0]);
+	MEM_freeN(lcd->buffer[1]);
+	/* deactivate the extra drawing stuff in 3D-View */
+	ED_region_draw_cb_exit(lcd->ar->type, lcd->draw_handle);
+}
+static int surface_refine_cancel (bContext *C, wmOperator *op)
+{
+	surface_refine_cleanup(C,op);
+	return OPERATOR_CANCELLED;
+}
+
+
+static void draw_surface_curve(const bContext *C, ARegion *ar, void *arg)
+{
+	float *buffer = NULL;
+	int size = 0;
+	int i=0;
+	float index = 0.3;
+
+	nurbsOpData *lcd = arg;
+	
+	Object *obedit= CTX_data_edit_object(C);
+	ListBase *editnurb= curve_get_editcurve(obedit);
+	Nurb *nu = lcd->nu;
+
+	size = nu->pntsv * nu->resolv;
+
+	buffer = lcd->buffer[lcd->direction];
+	size = lcd->size[lcd->direction];
+
+	if(!lcd->direction_confirmed)
+	{
+		NRB_GenerateCurveOnSurface(nu->nurbanaPtr,buffer,0,0.5,lcd->direction,3);
+		glPushMatrix();   
+
+		// 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();	
+	}
+	else
+	{
+		float largestKnot,smallestKnot;
+	
+		largestKnot = NRB_getLastKnotValue(nu->nurbanaPtr,lcd->direction);
+		smallestKnot = NRB_getFirstKnotValue(nu->nurbanaPtr,lcd->direction);
+
+		NRB_GenerateCurveOnSurface(nu->nurbanaPtr,buffer,0,lcd->index,lcd->direction,0);
+	  
+		glPushMatrix();   
+		glMultMatrixf(lcd->ob->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();
+	}
+}
+
+static int surface_refine_modal (bContext *C, wmOperator *op, wmEvent *event)
+{
+	Object *obedit= CTX_data_edit_object(C);
+	ListBase *editnurb= curve_get_editcurve(obedit);
+	Nurb *nu;
+	nurbsOpData *lcd = op->customdata;
+
+	nu = lcd->nu;
+
+	lcd->vc.mval[0] = event->mval[0];
+	lcd->vc.mval[1] = event->mval[1];
+
+	view3d_operator_needs_opengl(C);
+	switch (event->type) {
+		case LEFTMOUSE: /* confirm */ // XXX hardcoded
+			if (event->val == KM_RELEASE) {
+				if(!lcd->direction_confirmed)
+					lcd->direction_confirmed = 1;
+				else
+				{
+					BPoint *bp;
+					int a,b;
+					NRB_KnotInsert(nu->nurbanaPtr,&lcd->newKnotVal,1,lcd->direction);//NRB_Refine(nu->nurbanaPtr, 1, 1);//FIXME nbReal *X, int r, bool UV) ;
+					bp= nu->bp;
+					for(a=0; a<nu->pntsv; a++) {
+						for(b=0; b<nu->pntsu; b++) {
+							bp->f1 |= SELECT;
+							bp++;
+						}
+					}
+					ED_region_tag_redraw(lcd->ar);
+					surface_refine_cleanup(C, op);
+					return OPERATOR_FINISHED;
+				}
+			}
+			break;
+		case RIGHTMOUSE: /* abort */ // XXX hardcoded
+		case ESCKEY:
+			if (event->val == KM_RELEASE) {
+				/* finish */
+				surface_refine_cleanup(C, op);
+				return OPERATOR_FINISHED;
+				
+			}
+			ED_region_tag_redraw(lcd->ar);
+			break;
+
+		case MOUSEMOVE: { 
+			float epsilon = 2.5;
+			int a,b;
+
+			if(!lcd->direction_confirmed)
+			{
+				a = abs(lcd->mval_old[0]-event->mval[0])+1;
+				b = abs(lcd->mval_old[1]-event->mval[1])+1;
+
+				// Detect which direction the mouse is mostly moving in
+				if(b && (a / (float)b) > epsilon)
+					lcd->direction = 1; //printf("moving horizontal\n");
+				else if (a && (b / (float)a) > epsilon)
+					lcd->direction = 0; //printf("moving vertical\n");
+			}
+			else
+			{
+				float index = lcd->index;
+
+				float largestKnot,smallestKnot;
+
+				//float newKnotVal = 0;
+
+				largestKnot = NRB_getLastKnotValue(nu->nurbanaPtr, lcd->direction);
+				smallestKnot = NRB_getFirstKnotValue(nu->nurbanaPtr, lcd->direction);
+				index -= (lcd->mval_old[lcd->direction] - event->mval[lcd->direction])/100.0;
+				if(index > 1)
+					index = 1;
+				if(index < 0)
+					index = 0;
+				lcd->newKnotVal = smallestKnot + ((largestKnot - smallestKnot)*index);
+				printf("small big index knot %f %f %f %f\n",smallestKnot,largestKnot,index,lcd->newKnotVal);
+				lcd->index = index;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list