Commit: 0589a814ba0b6abc5323da69b92e2fd5f752065c
Author: Sergey Sharybin
Date:   Sun Jun 7 21:33:48 2015 +0200
Branches: master
https://developer.blender.org/rB0589a814ba0b6abc5323da69b92e2fd5f752065c

Cycles: Fix crash doing render preview of external OSL script

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

M       source/blender/editors/include/ED_render.h
M       source/blender/editors/interface/interface_icons.c
M       source/blender/editors/render/render_preview.c

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

diff --git a/source/blender/editors/include/ED_render.h 
b/source/blender/editors/include/ED_render.h
index 414126c..ba58ae6 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -74,7 +74,7 @@ void ED_preview_init_dbase(void);
 void ED_preview_free_dbase(void);
 
 void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID 
*id, struct ID *parent, struct MTex *slot, int sizex, int sizey, int method);
-void ED_preview_icon_render(struct Scene *scene, struct ID *id, unsigned int 
*rect, int sizex, int sizey);
+void ED_preview_icon_render(struct Main *bmain, struct Scene *scene, struct ID 
*id, unsigned int *rect, int sizex, int sizey);
 void ED_preview_icon_job(const struct bContext *C, void *owner, struct ID *id, 
unsigned int *rect, int sizex, int sizey);
 void ED_preview_kill_jobs(struct wmWindowManager *wm, struct Main *bmain);
 
diff --git a/source/blender/editors/interface/interface_icons.c 
b/source/blender/editors/interface/interface_icons.c
index 492fd4c..ef246c5 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -995,7 +995,7 @@ static void icon_set_image(
                        scene = CTX_data_scene(C);
                }
                /* Immediate version */
-               ED_preview_icon_render(scene, id, prv_img->rect[size], 
prv_img->w[size], prv_img->h[size]);
+               ED_preview_icon_render(CTX_data_main(C), scene, id, 
prv_img->rect[size], prv_img->w[size], prv_img->h[size]);
        }
 }
 
diff --git a/source/blender/editors/render/render_preview.c 
b/source/blender/editors/render/render_preview.c
index 5112cd8..9ed0cec 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -161,6 +161,7 @@ typedef struct ShaderPreview {
        unsigned int *pr_rect;
        int pr_method;
 
+       Main *bmain;
        Main *pr_main;
 } ShaderPreview;
 
@@ -171,6 +172,7 @@ typedef struct IconPreviewSize {
 } IconPreviewSize;
 
 typedef struct IconPreview {
+       Main *bmain;
        Scene *scene;
        void *owner;
        ID *id;
@@ -261,12 +263,14 @@ static Scene *preview_get_scene(Main *pr_main)
 
 /* call this with a pointer to initialize preview scene */
 /* call this with NULL to restore assigned ID pointers in preview scene */
-static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, 
ShaderPreview *sp)
+static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int 
id_type, ShaderPreview *sp)
 {
        Scene *sce;
        Base *base;
        Main *pr_main = sp->pr_main;
-       
+
+       memcpy(pr_main->name, bmain->name, sizeof(pr_main->name));
+
        sce = preview_get_scene(pr_main);
        if (sce) {
                
@@ -712,7 +716,7 @@ static void shader_preview_render(ShaderPreview *sp, ID 
*id, int split, int firs
        }
        
        /* get the stuff from the builtin preview dbase */
-       sce = preview_prepare_scene(sp->scene, id, idtype, sp);
+       sce = preview_prepare_scene(sp->bmain, sp->scene, id, idtype, sp);
        if (sce == NULL) return;
        
        if (!split || first) sprintf(name, "Preview %p", sp->owner);
@@ -767,7 +771,7 @@ static void shader_preview_render(ShaderPreview *sp, ID 
*id, int split, int firs
        }
 
        /* unassign the pointers, reset vars */
-       preview_prepare_scene(sp->scene, NULL, GS(id->name), sp);
+       preview_prepare_scene(sp->bmain, sp->scene, NULL, GS(id->name), sp);
        
        /* XXX bad exception, end-exec is not being called in render, because 
it uses local main */
 //     if (idtype == ID_TE) {
@@ -1075,6 +1079,7 @@ static void icon_preview_startjob_all_sizes(void 
*customdata, short *stop, short
                sp->pr_method = is_render ? PR_ICON_RENDER : PR_ICON_DEFERRED;
                sp->pr_rect = cur_size->rect;
                sp->id = ip->id;
+               sp->bmain = ip->bmain;
 
                if (is_render) {
                        BLI_assert(ip->id);
@@ -1135,12 +1140,13 @@ static void icon_preview_free(void *customdata)
        MEM_freeN(ip);
 }
 
-void ED_preview_icon_render(Scene *scene, ID *id, unsigned int *rect, int 
sizex, int sizey)
+void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, unsigned int 
*rect, int sizex, int sizey)
 {
        IconPreview ip = {NULL};
        short stop = false, update = false;
        float progress = 0.0f;
 
+       ip.bmain = bmain;
        ip.scene = scene;
        ip.owner = id;
        ip.id = id;
@@ -1171,6 +1177,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, 
ID *id, unsigned int *r
                BLI_movelisttolist(&ip->sizes, &old_ip->sizes);
 
        /* customdata for preview thread */
+       ip->bmain = CTX_data_main(C);
        ip->scene = CTX_data_scene(C);
        ip->owner = owner;
        ip->id = id;
@@ -1212,6 +1219,7 @@ void ED_preview_shader_job(const bContext *C, void 
*owner, ID *id, ID *parent, M
        sp->id = id;
        sp->parent = parent;
        sp->slot = slot;
+       sp->bmain = CTX_data_main(C);
 
        /* hardcoded preview .blend for cycles/internal, this should be solved
         * once with custom preview .blend path for external engines */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to