[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18493] branches/blender2.5/blender/source /blender: Noticed that sculpt was quite slow because of string lookups in RNA, so added a separate sculpt stroke cache for some values that usually aren' t even changed except at stroke initialization.

Nicholas Bishop nicholasbishop at gmail.com
Wed Jan 14 00:21:10 CET 2009


Revision: 18493
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18493
Author:   nicholasbishop
Date:     2009-01-14 00:21:05 +0100 (Wed, 14 Jan 2009)

Log Message:
-----------
Noticed that sculpt was quite slow because of string lookups in RNA, so added a separate sculpt stroke cache for some values that usually aren't even changed except at stroke initialization.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h
    branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c
    branches/blender2.5/blender/source/blender/editors/sculpt/sculpt_intern.h
    branches/blender2.5/blender/source/blender/editors/sculpt/stroke.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h	2009-01-13 22:59:18 UTC (rev 18492)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h	2009-01-13 23:21:05 UTC (rev 18493)
@@ -37,6 +37,7 @@
 struct Scene;
 struct SculptData;
 struct SculptSession;
+struct StrokeCache;
 
 typedef struct SculptSession {
 	struct ProjVert *projverts;
@@ -69,6 +70,8 @@
 	struct RadialControl *radialcontrol;
 	
 	struct SculptStroke *stroke;
+
+	struct StrokeCache *cache;
 } SculptSession;
 
 void sculptdata_init(struct Scene *sce);

Modified: branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c	2009-01-13 22:59:18 UTC (rev 18492)
+++ branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c	2009-01-13 23:21:05 UTC (rev 18493)
@@ -124,6 +124,13 @@
 	float grab_delta[3];
 } BrushActionSymm;
 
+/* Cache stroke properties that don't change after
+   the initialization at the start of a stroke. Used because
+   RNA property lookup isn't particularly fast. */
+typedef struct StrokeCache {
+	float radius;
+} StrokeCache;
+
 typedef struct BrushAction {
 	BrushActionSymm symm;
 
@@ -134,7 +141,6 @@
 	short (*orig_norms)[3];
 
 	short mouse[2];
-	float size_3d;
 
 	float prev_radius;
 	float radius;
@@ -274,8 +280,6 @@
 		
 		y -= CTX_wm_region(C)->winrct.ymin;
 
-		printf("x=%d, y=%d\n", x, y);
-
 		if(vd && vd->depths && x > 0 && y > 0 && x < vd->w && y < vd->h)
 			return vd->depths[y * vd->w + x];
 	}
@@ -926,7 +930,7 @@
 	}
 }
 
-void do_brush_action(SculptData *sd, BrushAction *a)
+void do_brush_action(SculptData *sd, StrokeCache *cache, BrushAction *a)
 {
 	int i;
 	float av_dist;
@@ -950,7 +954,7 @@
 				//vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : a->verts[i].co;
 				vert= ss->mvert[i].co;
 				av_dist= VecLenf(a->symm.center_3d, vert);
-				if(av_dist < a->size_3d) {
+				if(av_dist < cache->radius) {
 					adata= (ActiveData*)MEM_mallocN(sizeof(ActiveData), "ActiveData");
 
 					adata->Index = i;
@@ -1033,7 +1037,7 @@
 	flip_coord(a->symm.grab_delta, symm);
 }
 
-void do_symmetrical_brush_actions(SculptData *sd, BrushAction *a, short co[2], short pr_co[2])
+void do_symmetrical_brush_actions(SculptData *sd, StrokeCache *cache, BrushAction *a, short co[2], short pr_co[2])
 {
 	const char symm = sd->flags & 7;
 	BrushActionSymm orig;
@@ -1041,7 +1045,7 @@
 
 	//init_brushaction(sd, a, co, pr_co);
 	orig = a->symm;
-	do_brush_action(sd, a);
+	do_brush_action(sd, cache, a);
 
 	for(i = 1; i <= symm; ++i) {
 		if(symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5))) {
@@ -1049,7 +1053,7 @@
 			a->symm = orig;
 
 			calc_brushdata_symm(a, i);
-			do_brush_action(sd, a);
+			do_brush_action(sd, cache, a);
 		}
 	}
 
@@ -1213,7 +1217,7 @@
  	else
  		unproject(ss, brush_edge_loc, mouse[0] + size, mouse[1], mouse_depth);
  
-	a->size_3d = VecLenf(a->symm.center_3d, brush_edge_loc);
+	//a->size_3d = VecLenf(a->symm.center_3d, brush_edge_loc);
 
 	a->prev_radius = a->radius;
 
@@ -1644,6 +1648,21 @@
 	mats->viewport[3] = ar->winy;	
 }
 
+/* Initialize stroke operator properties */
+static int sculpt_brush_stroke_init(bContext *C, wmOperator *op, wmEvent *event, SculptSession *ss)
+{
+	SculptData *sd = &CTX_data_scene(C)->sculptdata;
+	float brush_center[3], brush_edge[3];
+	float depth = get_depth(C, event->x, event->y);
+	float size = brush_size(sd, sd->brush);
+
+	unproject(ss, brush_center, event->x, event->y, depth);
+	unproject(ss, brush_edge, event->x + size, event->y, depth);
+
+	ss->cache->radius = VecLenf(brush_center, brush_edge);
+	RNA_float_set(op->ptr, "radius", ss->cache->radius);
+}
+
 static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	SculptData *sd = &CTX_data_scene(C)->sculptdata;
@@ -1662,12 +1681,15 @@
 	sd->session->mvert = me->mvert;
 	sd->session->totvert = me->totvert;
 	sd->session->mats = MEM_callocN(sizeof(bglMats), "test sculpt mats");
+	sd->session->cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
 	
 	// XXX: temporary matrix stuff
 	sculpt_load_mats(C, sd->session->mats);
 
 	sculptmode_update_all_projverts(sd->session);
 
+	sculpt_brush_stroke_init(C, op, event, sd->session);
+
 	/* add modal handler */
 	WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
 	
@@ -1679,7 +1701,6 @@
 {
 	memset(a, 0, sizeof(BrushAction));
 	
-	a->size_3d = 0.25;
 	a->scale[0] = 1;
 	a->scale[1] = 1;
 	a->scale[2] = 1;
@@ -1695,14 +1716,12 @@
 
 	sculpt_action_init(&a);
 	unproject(sd->session, a.symm.center_3d, event->x, event->y, get_depth(C, event->x, event->y));
-	/*printf("depth=%f\n", get_depth(C, event->x, event->y));
-	  printvecf("center", a.symm.center_3d);*/
 
 	/* Add to stroke */
 	RNA_collection_add(op->ptr, "stroke", &itemptr);
 	RNA_float_set_array(&itemptr, "location", a.symm.center_3d);
 
-	do_symmetrical_brush_actions(&CTX_data_scene(C)->sculptdata, &a, NULL, NULL);
+	do_symmetrical_brush_actions(&CTX_data_scene(C)->sculptdata, sd->session->cache, &a, NULL, NULL);
 	//calc_damaged_verts(sd->session, &a);
 	BLI_freelistN(&sd->session->damaged_verts);
 
@@ -1734,7 +1753,7 @@
 		sculpt_action_init(&a);		
 		RNA_float_get_array(&itemptr, "location", a.symm.center_3d);
 
-		do_symmetrical_brush_actions(sd, &a, NULL, NULL);
+		do_symmetrical_brush_actions(sd, sd->session->cache, &a, NULL, NULL);
 		BLI_freelistN(&sd->session->damaged_verts);
 	}
 	RNA_END;
@@ -1764,6 +1783,15 @@
 	/* properties */
 	prop= RNA_def_property(ot->srna, "stroke", PROP_COLLECTION, PROP_NONE);
 	RNA_def_property_struct_runtime(prop, &RNA_OperatorStrokeElement);
+
+	/* Brush radius measured in object space, projected from the brush setting in pixels */
+	prop= RNA_def_property(ot->srna, "radius", PROP_FLOAT, PROP_NONE);
+
+	/* If the object has a scaling factor, brushes also need to be scaled
+	   to work as expected. */
+	prop= RNA_def_property(ot->srna, "scale", PROP_FLOAT, PROP_VECTOR);
+	RNA_def_property_array(prop, 3);
+	
 }
 
 /**** Toggle operator for turning sculpt mode on or off ****/
@@ -1939,20 +1967,20 @@
 						}
  					}
 					
-  					do_symmetrical_brush_actions(sd, a, mouse, NULL);
+  					//do_symmetrical_brush_actions(sd, a, mouse, NULL);
   				}
 				else {
 					if(smooth_stroke) {
 						sculpt_stroke_apply(sd, ss->stroke, a);
 					}
 					else if(sd->spacing==0 || spacing>sd->spacing) {
-						do_symmetrical_brush_actions(sd, a, mouse, NULL);
+						//do_symmetrical_brush_actions(sd, a, mouse, NULL);
 						spacing= 0;
 					}
 				}
 			}
 			else {
-				do_symmetrical_brush_actions(sd, a, mouse, mvalo);
+				//do_symmetrical_brush_actions(sd, a, mouse, mvalo);
 				unproject(ss, sd->pivot, mouse[0], mouse[1], a->depth);
 			}
 

Modified: branches/blender2.5/blender/source/blender/editors/sculpt/sculpt_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt/sculpt_intern.h	2009-01-13 22:59:18 UTC (rev 18492)
+++ branches/blender2.5/blender/source/blender/editors/sculpt/sculpt_intern.h	2009-01-13 23:21:05 UTC (rev 18493)
@@ -34,7 +34,6 @@
 #include "DNA_vec_types.h"
 #include "BKE_sculpt.h"
 
-struct uiBlock;
 struct BrushAction;
 struct Brush;
 struct IndexNode;
@@ -55,7 +54,7 @@
 void sculpt_radialcontrol_start(int mode);
 
 struct Brush *sculptmode_brush(void);
-void do_symmetrical_brush_actions(struct SculptData *sd, struct BrushAction *a, short *, short *);
+//void do_symmetrical_brush_actions(struct SculptData *sd, struct wmOperator *wm, struct BrushAction *a, short *, short *);
 
 char sculpt_modifiers_active(struct Object *ob);
 void sculpt(SculptData *sd);

Modified: branches/blender2.5/blender/source/blender/editors/sculpt/stroke.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt/stroke.c	2009-01-13 22:59:18 UTC (rev 18492)
+++ branches/blender2.5/blender/source/blender/editors/sculpt/stroke.c	2009-01-13 23:21:05 UTC (rev 18493)
@@ -209,7 +209,7 @@
 		co[0] = p->x*v + p->next->x*u;
 		co[1] = p->y*v + p->next->y*u;
 
-		do_symmetrical_brush_actions(sd, a, co, NULL);
+		//do_symmetrical_brush_actions(sd, a, co, NULL);
 	}
 
 	return p ? p->next : NULL;





More information about the Bf-blender-cvs mailing list