[Bf-blender-cvs] [f5b298e] soc-2016-pbvh-painting: Fixed undo bug.

Nathan Vollmer noreply at git.blender.org
Fri Jul 1 20:50:04 CEST 2016


Commit: f5b298e4f291b5a51548cd219744dcd00b5bdab7
Author: Nathan Vollmer
Date:   Fri Jul 1 11:50:00 2016 -0700
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rBf5b298e4f291b5a51548cd219744dcd00b5bdab7

Fixed undo bug.

===================================================================

M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/blender/blenkernel/BKE_paint.h
M	source/blender/blenkernel/intern/paint.c
M	source/blender/editors/sculpt_paint/paint_vertex.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_sculpt_paint.c

===================================================================

diff --git a/release/datafiles/locale b/release/datafiles/locale
index c0fe794..6434575 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit c0fe79491797b2405087ce4c40a913c7f88ee9d0
+Subproject commit 6434575731463b1b4e16d5f29721d6d525df276a
diff --git a/release/scripts/addons b/release/scripts/addons
index ce3e1a0..9dd1799 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit ce3e1a0d88579751fbcc7ebbdfa37a8235d3a1c0
+Subproject commit 9dd17998ca72cdc1abce8e9e9cff8b82798244e2
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index e5ed675..6176bf6 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit e5ed67560f3f414390750537a938ff0e58d733ba
+Subproject commit 6176bf658d03be565f7c82e2d2527c9c2aa1cf3b
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index a68981c..30d6450 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -204,6 +204,13 @@ typedef struct SculptSession {
 	MeshElemMap* vert_to_loop;
 	int *poly_map_mem;
 	MeshElemMap* vert_to_poly;
+
+  unsigned int* totalRed;
+  unsigned int* totalGreen;
+  unsigned int* totalBlue;
+  unsigned int* totalAlpha;
+  unsigned int* colorWeight;
+  unsigned int *totloopsHit;
 } SculptSession;
 
 void BKE_sculptsession_free(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index d8e1a53..b3982dc 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -719,6 +719,20 @@ void BKE_sculptsession_free(Object *ob)
 		if (ss->poly_map_mem)
 			MEM_freeN(ss->poly_map_mem);
 
+    /* Free average brush arrays */
+    if (ob->sculpt->totloopsHit)
+    MEM_freeN(ob->sculpt->totloopsHit);
+    if (ob->sculpt->totalRed)
+      MEM_freeN(ob->sculpt->totalRed);
+    if (ob->sculpt->totalGreen)
+      MEM_freeN(ob->sculpt->totalGreen);
+    if (ob->sculpt->totalBlue)
+      MEM_freeN(ob->sculpt->totalBlue);
+    if (ob->sculpt->totalAlpha)
+      MEM_freeN(ob->sculpt->totalAlpha);
+    if (ob->sculpt->colorWeight)
+      MEM_freeN(ob->sculpt->colorWeight);
+
 		MEM_freeN(ss);
 
 		ob->sculpt = NULL;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index f4a46d02..08af851 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -52,6 +52,7 @@
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
+#include "BKE_global.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_action.h"
 #include "BKE_brush.h"
@@ -1782,19 +1783,37 @@ static void do_weight_paint_vertex(
 static void vertex_paint_init_session(Scene *scene, Object *ob)
 {
 	ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt session");
-
-	/* Create maps */
-	Mesh *me = ob->data;
-	ob->sculpt->map_mem = NULL;
-	ob->sculpt->vert_to_loop = NULL;
-	ob->sculpt->poly_map_mem = NULL;
-	ob->sculpt->vert_to_poly = NULL;
-	BKE_mesh_vert_loop_map_create(&ob->sculpt->vert_to_loop, &ob->sculpt->map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
-	BKE_mesh_vert_poly_map_create(&ob->sculpt->vert_to_poly, &ob->sculpt->poly_map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
-
 	BKE_sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, 0, false);
 }
 
+static void vertex_paint_init_session_maps(Object *ob) {
+  if (G.debug & G_DEBUG)
+    printf("Allocating vert maps\n");
+  /* Create maps */
+  Mesh *me = ob->data;
+  ob->sculpt->map_mem = NULL;
+  ob->sculpt->vert_to_loop = NULL;
+  ob->sculpt->poly_map_mem = NULL;
+  ob->sculpt->vert_to_poly = NULL;
+  BKE_mesh_vert_loop_map_create(&ob->sculpt->vert_to_loop, &ob->sculpt->map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+  BKE_mesh_vert_poly_map_create(&ob->sculpt->vert_to_poly, &ob->sculpt->poly_map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+}
+
+static void vertex_paint_init_session_average_arrays(Object *ob){
+  if (G.debug & G_DEBUG)
+    printf("Allocating average and blur brush arrays\n");
+  /* Create average brush arrays */
+  int totNode = 0;
+  //I think the totNodes might include internal nodes, and we really only need the tot leaves.
+  BKE_pbvh_node_num_nodes(ob->sculpt->pbvh, &totNode);
+  ob->sculpt->totalRed = MEM_callocN(totNode*sizeof(unsigned int), "totalRed");
+  ob->sculpt->totalGreen = MEM_callocN(totNode * sizeof(unsigned int), "totalGreen");
+  ob->sculpt->totalBlue = MEM_callocN(totNode * sizeof(unsigned int), "totalBlue");
+  ob->sculpt->totalAlpha = MEM_callocN(totNode * sizeof(unsigned int), "totalAlpha");
+  ob->sculpt->colorWeight = MEM_callocN(totNode * sizeof(unsigned int), "colorWeight");
+  ob->sculpt->totloopsHit = MEM_callocN(totNode * sizeof(unsigned int), "totloopsHit");
+}
+
 /* *************** set wpaint operator ****************** */
 
 /**
@@ -1855,15 +1874,9 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 		ED_mesh_mirror_spatial_table(ob, NULL, NULL, NULL, 's');
 		ED_vgroup_sync_from_pose(ob);
 
-		/* Create vertex/weight paint mode session data */
-		if (ob->sculpt)
-			BKE_sculptsession_free(ob);
-
-		vertex_paint_init_session(scene, ob);
 
 		/* Cache needs to be initialized before mesh_build_data is called. */
 		ob->sculpt->cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
-
 	}
 	
 	/* Weightpaint works by overriding colors in mesh,
@@ -2784,14 +2797,8 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 			BKE_mesh_flush_select_from_polys(me);
 		}
 
-		/* If the cache is not released by a cancel or a done, free it now. */
+    /* If the cache is not released by a cancel or a done, free it now. */
 		if (ob->sculpt->cache){
-			MEM_freeN(ob->sculpt->cache->totloopsHit);
-			MEM_freeN(ob->sculpt->cache->totalRed);
-			MEM_freeN(ob->sculpt->cache->totalGreen);
-			MEM_freeN(ob->sculpt->cache->totalBlue);
-			MEM_freeN(ob->sculpt->cache->totalAlpha);
-			MEM_freeN(ob->sculpt->cache->colorWeight);
 			sculpt_cache_free(ob->sculpt->cache);
 			ob->sculpt->cache = NULL;
 		}
@@ -2817,22 +2824,11 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 		/* Create vertex/weight paint mode session data */
 		if (ob->sculpt)
 			BKE_sculptsession_free(ob);
-
+    
 		vertex_paint_init_session(scene, ob);
 
 		/* Cache needs to be initialized before mesh_build_data is called. */
-		ob->sculpt->cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
-
-		Brush *brush = BKE_paint_brush(&vp->paint);
-		int totNode = 0;
-		//I think the totNodes might include internal nodes, and we really only need the tot leaves.
-		BKE_pbvh_node_num_nodes(ob->sculpt->pbvh, &totNode);
-		ob->sculpt->cache->totalRed = MEM_callocN(totNode*sizeof(unsigned int), "totalRed");
-		ob->sculpt->cache->totalGreen = MEM_callocN(totNode * sizeof(unsigned int), "totalGreen");
-		ob->sculpt->cache->totalBlue = MEM_callocN(totNode * sizeof(unsigned int), "totalBlue");
-		ob->sculpt->cache->totalAlpha = MEM_callocN(totNode * sizeof(unsigned int), "totalAlpha");
-		ob->sculpt->cache->colorWeight = MEM_callocN(totNode * sizeof(unsigned int), "colorWeight");
-		ob->sculpt->cache->totloopsHit = MEM_callocN(totNode * sizeof(unsigned int), "totloopsHit");
+    ob->sculpt->cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
 	}
 	
 	/* update modifier stack for mapping requirements */
@@ -2946,6 +2942,16 @@ static bool vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const f
 	invert_m4_m4(imat, mat);
 	copy_m3_m4(vpd->vpimat, imat);
 
+  /* If not previously created, create vertex/weight paint mode session data */
+  if (!ob->sculpt)
+    vertex_paint_init_session(scene, ob);
+
+  if (!ob->sculpt->vert_to_loop)
+    vertex_paint_init_session_maps(ob);
+
+  if (!ob->sculpt->totloopsHit)
+    vertex_paint_init_session_average_arrays(ob);
+
 	vwpaint_update_cache_invariants(C, vp, ss, op, mouse);
 
 	return 1;
@@ -3030,7 +3036,7 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
 	unsigned int blend[4] = { 0 };
 	char *col;
 	
-	data->ob->sculpt->cache->totloopsHit[n] = 0;
+	data->ob->sculpt->totloopsHit[n] = 0;
 
 	//for each vertex
 	PBVHVertexIter vd;
@@ -3044,7 +3050,7 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
 			if (BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 0.0) {
 				int vertexIndex = vd.vert_indices[vd.i];
 
-				cache->totloopsHit[n] += ss->vert_to_loop[vertexIndex].count;
+				ss->totloopsHit[n] += ss->vert_to_loop[vertexIndex].count;
 				//if a vertex is within the brush region, then add it's color to the blend.
 				for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
 					int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
@@ -3058,10 +3064,10 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
 		}
 		BKE_pbvh_vertex_iter_end;
 	}
-	data->ob->sculpt->cache->totalRed[n] = blend[0];
-	data->ob->sculpt->cache->totalGreen[n] = blend[1];
-	data->ob->sculpt->cache->totalBlue[n] = blend[2];
-	data->ob->sculpt->cache->totalAlpha[n] = blend[3];
+	data->ob->sculpt->totalRed[n] = blend[0];
+	data->ob->sculpt->totalGreen[n] = blend[1];
+	data->ob->sculpt->totalBlue[n] = blend[2];
+	data->ob->sculpt->totalAlpha[n] = blend[3];
 }
 
 static void do_vpaint_brush_draw_task_cb_ex(
@@ -3069,6 +3075,7 @@ static void do_vpaint_brush_draw_task_cb_ex(
 {
 	SculptThreadedTaskData *data = userdata;
 	SculptSession *ss = data->ob->sculpt;
+
 	Brush *brush = data->brush;
 	StrokeCache *cache = ss->cache;
 	const float bstrength = cache->bstrength;
@@ -3179,11 +3186,11 @@ static void calculate_average_color(SculptThreadedTaskData *data, PBVHNode **nod
 	unsigned int totalColor[4] = { 0 };
 	unsigned char blend[4] = { 0 };
 	for (int i = 0; i < totnode; ++i) {
-		totalHitLoops += data->ob->sculpt->cache->totloopsHit[i];
-		totalColor[0] += data->ob->sculpt->cache->totalRed[i];
-		totalColor[1] += data->ob->sculpt->cache->totalGreen[i];
-		totalColor[2] += data->ob->sculpt->cache->totalBlue[i];
-		totalColor[3] += d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list