[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29521] branches/soc-2010-jwilkins/source/ blender/editors/sculpt_paint: * reduced strength of thumb brush

Jason Wilkins Jason.A.Wilkins at gmail.com
Thu Jun 17 12:55:18 CEST 2010


Revision: 29521
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29521
Author:   jwilkins
Date:     2010-06-17 12:55:18 +0200 (Thu, 17 Jun 2010)

Log Message:
-----------
* reduced strength of thumb brush

* fixed MSVC warnings:
** removed unused FLATTEN_SAMPLE_SIZE from source, its no longer used
** use automatic memory for BoundBox bb in sculpt_get_redraw_planes
** quieted warning about unused parameter in update_cb
** sculpt_undo_get_node, sculpt_undo_push_end and sculpt_undo_push_begin do not use their SculptSession parameters
** rewrote 'non-constant agregate initializers' because they are not standard C
** changed the vert parameter of neighbor_average from int to unsigned to prevent mismatch
** do_brush_action doesn't need its cache parameter
** removed unused parameter 'C' from sculpt_update_cache_invariants
** sculpt_brush_stroke_init_properties doesn't use its SculptSession parameter
** in over_mesh, no need to cast return value of sculpt_stroke_get_location to int, it already returns an int
** sculpt_stroke_done doesn't use its 'stroke' parameter
** sculpt_set_persistent_base and sculpt_toggle_mode do not used their wmOperator parameters

* broke sculpt undo functions out into their own file sculpt_undo.c

Modified Paths:
--------------
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt_intern.h

Added Paths:
-----------
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt_undo.c

Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-17 10:47:55 UTC (rev 29520)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-17 10:55:18 UTC (rev 29521)
@@ -91,8 +91,9 @@
 #include <stdlib.h>
 #include <string.h>
 
-/* Number of vertices to average in order to determine the flatten distance */
-#define FLATTEN_SAMPLE_SIZE 10
+//#ifdef _OPENMP
+//#include <omp.h>
+//#endif
 
 /* ===== STRUCTS =====
  *
@@ -236,10 +237,12 @@
 				  RegionView3D *rv3d, Object *ob)
 {
 	PBVH *pbvh= ob->sculpt->pbvh;
-	BoundBox *bb = MEM_callocN(sizeof(BoundBox), "sculpt boundbox");
+	BoundBox bb;
 	bglMats mats;
 	rcti rect;
 
+	memset(&bb, 0, sizeof(BoundBox));
+
 	view3d_get_transformation(ar, rv3d, ob, &mats);
 	sculpt_get_redraw_rect(ar, rv3d,ob, &rect);
 
@@ -258,288 +261,14 @@
 	rect.ymax -= 2;
 #endif
 
-	view3d_calculate_clipping(bb, planes, &mats, &rect);
+	view3d_calculate_clipping(&bb, planes, &mats, &rect);
 	mul_m4_fl(planes, -1.0f);
 
-	MEM_freeN(bb);
-
 	/* clear redraw flag from nodes */
 	if(pbvh)
 		BLI_pbvh_update(pbvh, PBVH_UpdateRedraw, NULL);
 }
 
-/************************** Undo *************************/
-
-typedef struct SculptUndoNode {
-	struct SculptUndoNode *next, *prev;
-
-	char idname[MAX_ID_NAME];	/* name instead of pointer*/
-	void *node;					/* only during push, not valid afterwards! */
-
-	float (*co)[3];
-	short (*no)[3];
-	int totvert;
-
-	/* non-multires */
-	int maxvert;				/* to verify if totvert it still the same */
-	int *index;					/* to restore into right location */
-
-	/* multires */
-	int maxgrid;				/* same for grid */
-	int gridsize;				/* same for grid */
-	int totgrid;				/* to restore into right location */
-	int *grids;					/* to restore into right location */
-
-	/* layer brush */
-	float *layer_disp;
-} SculptUndoNode;
-
-static void update_cb(PBVHNode *node, void *data)
-{
-	BLI_pbvh_node_mark_update(node);
-}
-
-/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-static int sculpt_modifiers_active(Scene *scene, Object *ob)
-{
-	ModifierData *md;
-	MultiresModifierData *mmd = sculpt_multires_active(scene, ob);
-
-	/* check if there are any modifiers after what we are sculpting,
-	   for a multires modifier with a deform modifier in front, we
-	   do no need to recalculate the modifier stack. note that this
-	   needs to be in sync with ccgDM_use_grid_pbvh! */
-	if(mmd)
-		md= mmd->modifier.next;
-	else
-		md= modifiers_getVirtualModifierList(ob);
-	
-	/* exception for shape keys because we can edit those */
-	for(; md; md= md->next) {
-		if(modifier_isEnabled(scene, md, eModifierMode_Realtime))
-			if(md->type != eModifierType_ShapeKey)
-				return 1;
-	}
-	
-	return 0;
-}
-
-static void sculpt_undo_restore(bContext *C, ListBase *lb)
-{
-	Scene *scene = CTX_data_scene(C);
-	Object *ob = CTX_data_active_object(C);
-	DerivedMesh *dm = mesh_get_derived_final(scene, ob, 0);
-	SculptSession *ss = ob->sculpt;
-	SculptUndoNode *unode;
-	MVert *mvert;
-	MultiresModifierData *mmd;
-	int *index;
-	int i, j, update= 0;
-
-	sculpt_update_mesh_elements(scene, ob, 0);
-
-	for(unode=lb->first; unode; unode=unode->next) {
-		if(!(strcmp(unode->idname, ob->id.name)==0))
-			continue;
-
-		if(unode->maxvert) {
-			/* regular mesh restore */
-			if(ss->totvert != unode->maxvert)
-				continue;
-
-			index= unode->index;
-			mvert= ss->mvert;
-
-			for(i=0; i<unode->totvert; i++) {
-				swap_v3_v3(mvert[index[i]].co, unode->co[i]);
-				mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE;
-			}
-		}
-		else if(unode->maxgrid && dm->getGridData) {
-			/* multires restore */
-			DMGridData **grids, *grid;
-			float (*co)[3];
-			int gridsize;
-
-			if(dm->getNumGrids(dm) != unode->maxgrid)
-				continue;
-			if(dm->getGridSize(dm) != unode->gridsize)
-				continue;
-
-			grids= dm->getGridData(dm);
-			gridsize= dm->getGridSize(dm);
-
-			co = unode->co;
-			for(j=0; j<unode->totgrid; j++) {
-				grid= grids[unode->grids[j]];
-
-				for(i=0; i<gridsize*gridsize; i++, co++)
-					swap_v3_v3(grid[i].co, co[0]);
-			}
-		}
-
-		update= 1;
-	}
-
-	if(update) {
-		if(ss->kb) sculpt_mesh_to_key(ss->ob, ss->kb);
-		if(ss->refkb) sculpt_key_to_mesh(ss->refkb, ob);
-
-		/* we update all nodes still, should be more clever, but also
-		   needs to work correct when exiting/entering sculpt mode and
-		   the nodes get recreated, though in that case it could do all */
-		BLI_pbvh_search_callback(ss->pbvh, NULL, NULL, update_cb, NULL);
-		BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw, NULL);
-
-		if((mmd=sculpt_multires_active(scene, ob)))
-			multires_mark_as_modified(ob);
-
-		if(sculpt_modifiers_active(scene, ob))
-			DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
-	}
-}
-
-static void sculpt_undo_free(ListBase *lb)
-{
-	SculptUndoNode *unode;
-
-	for(unode=lb->first; unode; unode=unode->next) {
-		if(unode->co)
-			MEM_freeN(unode->co);
-		if(unode->no)
-			MEM_freeN(unode->no);
-		if(unode->index)
-			MEM_freeN(unode->index);
-		if(unode->grids)
-			MEM_freeN(unode->grids);
-		if(unode->layer_disp)
-			MEM_freeN(unode->layer_disp);
-	}
-}
-
-static SculptUndoNode *sculpt_undo_get_node(SculptSession *ss, PBVHNode *node)
-{
-	ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH);
-	SculptUndoNode *unode;
-
-	if(!lb)
-		return NULL;
-
-	for(unode=lb->first; unode; unode=unode->next)
-		if(unode->node == node)
-			return unode;
-
-	return NULL;
-}
-
-static SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
-{
-	ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH);
-	Object *ob= ss->ob;
-	SculptUndoNode *unode;
-	int totvert, allvert, totgrid, maxgrid, gridsize, *grids;
-
-	/* list is manipulated by multiple threads, so we lock */
-	BLI_lock_thread(LOCK_CUSTOM1);
-
-	if((unode= sculpt_undo_get_node(ss, node))) {
-		BLI_unlock_thread(LOCK_CUSTOM1);
-		return unode;
-	}
-
-	unode= MEM_mallocN(sizeof(SculptUndoNode), "SculptUndoNode");
-	strcpy(unode->idname, ob->id.name);
-	unode->node= node;
-
-	BLI_pbvh_node_num_verts(ss->pbvh, node, &totvert, &allvert);
-	BLI_pbvh_node_get_grids(ss->pbvh, node, &grids, &totgrid,
-		&maxgrid, &gridsize, NULL, NULL);
-
-	unode->totvert= totvert;
-	/* we will use this while sculpting, is mapalloc slow to access then? */
-	unode->co= MEM_mapallocN(sizeof(float)*3*allvert, "SculptUndoNode.co");
-	unode->no= MEM_mapallocN(sizeof(short)*3*allvert, "SculptUndoNode.no");
-	undo_paint_push_count_alloc(UNDO_PAINT_MESH, (sizeof(float)*3 + sizeof(short)*3 + sizeof(int))*allvert);
-	BLI_addtail(lb, unode);
-
-	if(maxgrid) {
-		/* multires */
-		unode->maxgrid= maxgrid;
-		unode->totgrid= totgrid;
-		unode->gridsize= gridsize;
-		unode->grids= MEM_mapallocN(sizeof(int)*totgrid, "SculptUndoNode.grids");
-
-		unode->maxvert = 0;
-		unode->index   = 0;
-	}
-	else {
-		/* regular mesh */
-		unode->maxvert= ss->totvert;
-		unode->index= MEM_mapallocN(sizeof(int)*allvert, "SculptUndoNode.index");
-
-		unode->maxgrid=  0;
-		unode->totgrid=  0;
-		unode->gridsize= 0;
-		unode->grids=    0;
-	}
-
-	BLI_unlock_thread(LOCK_CUSTOM1);
-
-	/* copy threaded, hopefully this is the performance critical part */
-	{
-		PBVHVertexIter vd;
-
-		BLI_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL) {
-			copy_v3_v3(unode->co[vd.i], vd.co);
-			if(vd.no) VECCOPY(unode->no[vd.i], vd.no)
-			else normal_float_to_short_v3(unode->no[vd.i], vd.fno);
-			if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i];
-		}
-		BLI_pbvh_vertex_iter_end;
-	}
-
-	if(unode->grids) memcpy(unode->grids, grids, sizeof(int)*totgrid);
-
-	unode->layer_disp= 0;
-
-	return unode;
-}
-
-static void sculpt_undo_push_begin(SculptSession *ss, char *name)
-{
-	undo_paint_push_begin(UNDO_PAINT_MESH, name,
-		sculpt_undo_restore, sculpt_undo_free);
-}
-
-static void sculpt_undo_push_end(SculptSession *ss)
-{
-	ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH);
-	SculptUndoNode *unode;
-
-	/* we don't need normals in the undo stack */
-	for(unode=lb->first; unode; unode=unode->next) {
-		if(unode->no) {
-			MEM_freeN(unode->no);
-			unode->no= NULL;
-		}
-
-		if(unode->layer_disp) {
-			MEM_freeN(unode->layer_disp);
-			unode->layer_disp= NULL;
-		}
-	}
-
-	undo_paint_push_end(UNDO_PAINT_MESH);
-}
-
-void ED_sculpt_force_update(bContext *C)
-{
-	Object *ob= CTX_data_active_object(C);
-
-	if(ob && (ob->mode & OB_MODE_SCULPT))
-		multires_force_update(ob);
-}
-
 /************************ Brush Testing *******************/
 
 typedef struct SculptBrushTest {
@@ -563,37 +292,37 @@
 	//test->symmetry_pass = ss->cache->symmetry_pass;
 }
 
-static int sculpt_brush_test_clip(SculptBrushTest* test, float co[3])
-{
-	//if (test->symmetry) {
-	//	int i;
+//static int sculpt_brush_test_clip(SculptBrushTest* test, float co[3])
+//{
+//	if (test->symmetry) {
+//		int i;
+//
+//		for (i = 0; i < 3; i++) {
+//			if (test->symmetry_pass & (1<<i)) {
+//				if (test->true_location[i] >= 0) {
+//					if (co[i] >= 0) return 0;
+//				}
+//				else if (test->true_location[i] < 0) {
+//					if (co[i] < 0) return 0;
+//				}
+//			}
+//			else {
+//				if (test->true_location[i] >= 0) {
+//					if (co[i] < 0) return 0;
+//				}
+//				else if (test->true_location[i] < 0) {
+//					if (co[i] >= 0) return 0;
+//				}
+//			}
+//		}
+//	}
+//
+//	return 1;
+//}
 
-	//	for (i = 0; i < 3; i++) {
-	//		if (test->symmetry_pass & (1<<i)) {
-	//			if (test->true_location[i] >= 0) {
-	//				if (co[i] >= 0) return 0;
-	//			}
-	//			else if (test->true_location[i] < 0) {
-	//				if (co[i] < 0) return 0;
-	//			}
-	//		}
-	//		else {
-	//			if (test->true_location[i] >= 0) {
-	//				if (co[i] < 0) return 0;
-	//			}
-	//			else if (test->true_location[i] < 0) {
-	//				if (co[i] >= 0) return 0;
-	//			}
-	//		}
-	//	}
-	//}
-
-	return 1;
-}
-
 static int sculpt_brush_test(SculptBrushTest *test, float co[3])
 {
-	if (sculpt_brush_test_clip(test, co)) {
+	//if (sculpt_brush_test_clip(test, co)) {
 		float distsq = len_squared_v3v3(co, test->location);
 
 		if(distsq < test->radius_squared) {
@@ -603,15 +332,15 @@
 		else {
 			return 0;
 		}
-	}
-	else {
-		return 0;
-	}
+	//}
+	//else {
+	//	return 0;
+	//}
 }
 
 static int sculpt_brush_test_sq(SculptBrushTest *test, float co[3])
 {
-	if (sculpt_brush_test_clip(test, co)) {
+	//if (sculpt_brush_test_clip(test, co)) {
 		float distsq = len_squared_v3v3(co, test->location);
 
 		if(distsq < test->radius_squared) {
@@ -621,20 +350,20 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list