Fix projection texture painting crash
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 22 Jan 2013 08:05:00 +0000 (08:05 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 22 Jan 2013 08:05:00 +0000 (08:05 +0000)
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.

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

index b19a9c4d4ebeeb121c34595ff48b738c53ac82fc..91f0525d4f36e69907164094e220eeeccafa555d 100644 (file)
@@ -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_clamp(struct Brush *br, float p, const float len)
 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);
index 6d655f8b495edebd6113cb32bc92e6cc51309c99..792a6058872d1ee4eb89387634334914f20cc7a9 100644 (file)
@@ -472,7 +472,7 @@ int BKE_brush_clone_image_delete(Brush *brush)
 }
 
 /* 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 @@ void BKE_brush_sample_tex(const Scene *scene, Brush *brush, const float sampleco
                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 @@ void BKE_brush_sample_tex(const Scene *scene, Brush *brush, const float sampleco
                        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 @@ void BKE_brush_sample_tex_2D(const Scene *scene, Brush *brush, const float xy[2]
                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;
index b2851962b497cb94f55db943536b32c3a8c1e0cc..71854a93f4d8e27397dc0afbd46acfcb7885abe9 100644 (file)
@@ -3849,7 +3849,7 @@ static void get_cpa_texture(DerivedMesh *dm, ParticleSystem *psys, ParticleSetti
                                        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 @@ void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTex
                                        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 */
index a34ae23df24819abfbe721c4a01c1d5987d0d084..3e8219bfd1c5699cf70cee8661c837fd0a15a5c6 100644 (file)
@@ -4602,7 +4602,7 @@ static int edbm_noise_exec(bContext *C, wmOperator *op)
                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;
                        }
                }
index c27b61d41e273f3267759af23b59049352960b18..c60097e20ebed663c85bed6b1619aca90b970e3e 100644 (file)
@@ -3756,6 +3756,8 @@ typedef struct ProjectHandle {
        
        /* 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 @@ static void *do_projectpaint_thread(void *ph_v)
        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 @@ static void *do_projectpaint_thread(void *ph_v)
                                        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 @@ static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), const float lastp
        ListBase threads;
        int a, i;
        
+       struct ImagePool *pool;
+       
        if (!project_bucket_iter_init(ps, pos)) {
                return 0;
        }
@@ -4276,6 +4281,8 @@ static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), const float lastp
        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 @@ static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), const float lastp
                        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 @@ static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), const float lastp
                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;
index f49d8006ab8abfc384d5d3d50882cb0c80815315..5ab287479a425e67af3d89eddc666eb133e70d89 100644 (file)
@@ -898,7 +898,7 @@ static float tex_strength(SculptSession *ss, Brush *br,
                /* 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;
index 2a9a1becc42f18653e1c8b937eb00b6b76273b1b..2dfbdd0d6f55ff0c5c824863a412b20b377faa6e 100644 (file)
@@ -49,10 +49,11 @@ struct RNode;
 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);
index 01eee4686af5ee2a1f7f0696994ab3a82914320a..3ea94981cacba1af60f4f0ba6f5198b6dddf9ab0 100644 (file)
@@ -3398,7 +3398,7 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
 
 /* ------------------------------------------------------------------------- */
 
-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 @@ int externtex(MTex *mtex, const float vec[3], float *tin, float *tr, float *tg,
                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);
index 31424b900c714a0209e611d03afe7c3726bcbc45..b25f2f4201a93ee8a5863d453fc864be3cc6bacf 100644 (file)
@@ -1051,7 +1051,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma,
                                }
                        }
 
-                       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 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
                                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;