[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53984] trunk/blender/source/blender: Fix projection texture painting crash

Sergey Sharybin sergey.vfx at gmail.com
Tue Jan 22 09:05:05 CET 2013


Revision: 53984
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53984
Author:   nazgul
Date:     2013-01-22 08:05:00 +0000 (Tue, 22 Jan 2013)
Log Message:
-----------
Fix projection texture painting crash

It was caused by own mistake by not noticing externtex is used not
only by render engine. Now this function uses pool passed as argument
rather than using R.pool.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_brush.h
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/render/extern/include/RE_render_ext.h
    trunk/blender/source/blender/render/intern/source/render_texture.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c

Modified: trunk/blender/source/blender/blenkernel/BKE_brush.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_brush.h	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/blenkernel/BKE_brush.h	2013-01-22 08:05:00 UTC (rev 53984)
@@ -36,6 +36,7 @@
 struct ID;
 struct Brush;
 struct ImBuf;
+struct ImagePool;
 struct Scene;
 struct wmOperator;
 // enum CurveMappingPreset;
@@ -67,7 +68,7 @@
 float BKE_brush_curve_strength(struct Brush *br, float p, const float len); /* used for sculpt */
 
 /* sampling */
-void BKE_brush_sample_tex(const struct Scene *scene, struct Brush *brush, const float sampleco[3], float rgba[4], const int thread);
+void BKE_brush_sample_tex(const struct Scene *scene, struct Brush *brush, const float sampleco[3], float rgba[4], const int thread, struct ImagePool *pool);
 void BKE_brush_sample_tex_2D(const struct Scene *scene, struct Brush *brush, const float xy[2], float rgba[4], const int thread);
 void BKE_brush_imbuf_new(const struct Scene *scene, struct Brush *brush, short flt, short texfalloff, int size,
                          struct ImBuf **imbuf, int use_color_correction);

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -472,7 +472,7 @@
 }
 
 /* Brush Sampling for 3d brushes. Currently used for texture painting only, but should be generalized */
-void BKE_brush_sample_tex(const Scene *scene, Brush *brush, const float sampleco[3], float rgba[4], const int thread)
+void BKE_brush_sample_tex(const Scene *scene, Brush *brush, const float sampleco[3], float rgba[4], const int thread, struct ImagePool *pool)
 {
 	MTex *mtex = &brush->mtex;
 
@@ -482,7 +482,7 @@
 		const int radius = BKE_brush_size_get(scene, brush);
 
 		if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_3D) {
-			hasrgb = externtex(mtex, sampleco, &tin, &tr, &tg, &tb, &ta, thread);
+			hasrgb = externtex(mtex, sampleco, &tin, &tr, &tg, &tb, &ta, thread, pool);
 		}
 		else {
 			float co[3];
@@ -491,7 +491,7 @@
 			co[1] = sampleco[1] / radius;
 			co[2] = 0.0f;
 
-			hasrgb = externtex(mtex, co, &tin, &tr, &tg, &tb, &ta, thread);
+			hasrgb = externtex(mtex, co, &tin, &tr, &tg, &tb, &ta, thread, pool);
 		}
 
 		if (hasrgb) {
@@ -526,7 +526,7 @@
 		co[1] = xy[1] / radius;
 		co[2] = 0.0f;
 
-		hasrgb = externtex(mtex, co, &tin, &tr, &tg, &tb, &ta, thread);
+		hasrgb = externtex(mtex, co, &tin, &tr, &tg, &tb, &ta, thread, NULL);
 
 		if (hasrgb) {
 			rgba[0] = tr;

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -3849,7 +3849,7 @@
 					break;
 			}
 
-			externtex(mtex, texvec, &value, rgba, rgba + 1, rgba + 2, rgba + 3, 0);
+			externtex(mtex, texvec, &value, rgba, rgba + 1, rgba + 2, rgba + 3, 0, NULL);
 
 			if ((event & mtex->mapto) & PAMAP_ROUGH)
 				ptex->rough1 = ptex->rough2 = ptex->roughe = texture_value_blend(def, ptex->rough1, value, mtex->roughfac, blend);
@@ -3920,7 +3920,7 @@
 					break;
 			}
 
-			externtex(mtex, texvec, &value, rgba, rgba + 1, rgba + 2, rgba + 3, 0);
+			externtex(mtex, texvec, &value, rgba, rgba + 1, rgba + 2, rgba + 3, 0, NULL);
 
 			if ((event & mtex->mapto) & PAMAP_TIME) {
 				/* the first time has to set the base value for time regardless of blend mode */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -4602,7 +4602,7 @@
 		BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 			if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
 				float tin, dum;
-				externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum, 0);
+				externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum, 0, NULL);
 				eve->co[2] += fac * tin;
 			}
 		}

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -3756,6 +3756,8 @@
 	
 	/* thread settings */
 	int thread_index;
+
+	struct ImagePool *pool;
 } ProjectHandle;
 
 static void blend_color_mix(unsigned char cp[4], const unsigned char cp1[4], const unsigned char cp2[4], const int fac)
@@ -4005,6 +4007,7 @@
 	const float *lastpos =       ((ProjectHandle *)ph_v)->prevmval;
 	const float *pos =           ((ProjectHandle *)ph_v)->mval;
 	const int thread_index =     ((ProjectHandle *)ph_v)->thread_index;
+	struct ImagePool *pool =     ((ProjectHandle *)ph_v)->pool;
 	/* Done with args from ProjectHandle */
 
 	LinkNode *node;
@@ -4133,7 +4136,7 @@
 					if (falloff > 0.0f) {
 						if (ps->is_texbrush) {
 							/* note, for clone and smear, we only use the alpha, could be a special function */
-							BKE_brush_sample_tex(ps->scene, brush, samplecos, rgba, thread_index);
+							BKE_brush_sample_tex(ps->scene, brush, samplecos, rgba, thread_index, pool);
 							alpha = rgba[3];
 						}
 						else {
@@ -4269,6 +4272,8 @@
 	ListBase threads;
 	int a, i;
 	
+	struct ImagePool *pool;
+	
 	if (!project_bucket_iter_init(ps, pos)) {
 		return 0;
 	}
@@ -4276,6 +4281,8 @@
 	if (ps->thread_tot > 1)
 		BLI_init_threads(&threads, do_projectpaint_thread, ps->thread_tot);
 	
+	pool = BKE_image_pool_new();
+	
 	/* get the threads running */
 	for (a = 0; a < ps->thread_tot; a++) {
 		
@@ -4299,6 +4306,8 @@
 			memcpy(handles[a].projImages[i].partRedrawRect, ps->projImages[i].partRedrawRect, sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED);
 		}
 
+		handles[a].pool = pool;
+
 		if (ps->thread_tot > 1)
 			BLI_insert_thread(&threads, &handles[a]);
 	}
@@ -4309,6 +4318,8 @@
 		do_projectpaint_thread(&handles[0]);
 		
 	
+	BKE_image_pool_free(pool);
+	
 	/* move threaded bounds back into ps->projectPartialRedraws */
 	for (i = 0; i < ps->image_tot; i++) {
 		int touch = 0;

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -898,7 +898,7 @@
 		/* Get strength by feeding the vertex 
 		 * location directly into a texture */
 		externtex(mtex, point, &avg,
-		          &jnk, &jnk, &jnk, &jnk, 0);
+		          &jnk, &jnk, &jnk, &jnk, 0, ss->tex_pool);
 	}
 	else if (ss->texcache) {
 		float rotation = -mtex->rot;

Modified: trunk/blender/source/blender/render/extern/include/RE_render_ext.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_render_ext.h	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/render/extern/include/RE_render_ext.h	2013-01-22 08:05:00 UTC (rev 53984)
@@ -49,10 +49,11 @@
 struct Render;
 struct MTex;
 struct ImBuf;
+struct ImagePool;
 struct DerivedMesh;
 
 /* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
-int	externtex(struct MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread);
+int	externtex(struct MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread, struct ImagePool *pool);
 
 /* particle.c */
 void texture_rgb_blend(float in[3], const float tex[3], const float out[3], float fact, float facg, int blendtype);

Modified: trunk/blender/source/blender/render/intern/source/render_texture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/render_texture.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/render/intern/source/render_texture.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -3398,7 +3398,7 @@
 
 /* ------------------------------------------------------------------------- */
 
-int externtex(MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread)
+int externtex(MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread, struct ImagePool *pool)
 {
 	Tex *tex;
 	TexResult texr;
@@ -3424,7 +3424,7 @@
 		do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
 	}
 	
-	rgb = multitex(tex, texvec, dxt, dyt, 0, &texr, thread, mtex->which_output, R.pool);
+	rgb = multitex(tex, texvec, dxt, dyt, 0, &texr, thread, mtex->which_output, pool);
 	
 	if (rgb) {
 		texr.tin = rgb_to_bw(&texr.tr);

Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c	2013-01-22 07:10:42 UTC (rev 53983)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c	2013-01-22 08:05:00 UTC (rev 53984)
@@ -1051,7 +1051,7 @@
 				}
 			}
 
-			externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
+			externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0, re->pool);
 
 			yn= tin*mtex->colfac;
 			//zn= tin*mtex->alphafac;
@@ -1182,7 +1182,7 @@
 				copy_v3_v3(texvec, orco);
 			}
 
-			hasrgb = externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
+			hasrgb = externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0, re->pool);
 
 			//yn= tin*mtex->colfac;
 			//zn= tin*mtex->alphafac;




More information about the Bf-blender-cvs mailing list