2.5
authorTon Roosendaal <ton@blender.org>
Sun, 28 Jun 2009 09:35:37 +0000 (09:35 +0000)
committerTon Roosendaal <ton@blender.org>
Sun, 28 Jun 2009 09:35:37 +0000 (09:35 +0000)
Bugfixes:

- Preview Icon for render result crashed, there was still need for a scene
  pointer to be passed on.

- Added quick fix for preventing shaded drawmode to call render while
  rendering is in progress. It crashes badly.
  Rendering while UI is alive is still in probation, most UI stuff will
  probably get blocked, with exception from inspecting buttons and using
  the image window.

source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/image.c
source/blender/editors/interface/interface_icons.c

index 736165a8a989c75d02415dbdff9b88884461fe67..cdf4b90cee199ef438ae4bbc642ae872f7f5ad9f 100644 (file)
@@ -315,13 +315,19 @@ static void init_fastshade_shadeinput(Render *re)
 
 static Render *fastshade_get_render(Scene *scene)
 {
-       Render *re= RE_GetRender("_Shade View_");
-       if(re==NULL) {
-               re= RE_NewRender("_Shade View_");
-       
-               RE_Database_Baking(re, scene, 0, 0);    /* 0= no faces */
+       /* XXX ugly global still, but we can't do preview while rendering */
+       if(G.rendering==0) {
+               
+               Render *re= RE_GetRender("_Shade View_");
+               if(re==NULL) {
+                       re= RE_NewRender("_Shade View_");
+               
+                       RE_Database_Baking(re, scene, 0, 0);    /* 0= no faces */
+               }
+               return re;
        }
-       return re;
+       
+       return NULL;
 }
 
 /* called on file reading */
@@ -611,18 +617,20 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
 
 void shadeMeshMCol(Scene *scene, Object *ob, Mesh *me)
 {
+       Render *re= fastshade_get_render(scene);
        int a;
        char *cp;
        unsigned int *mcol= (unsigned int*)me->mcol;
        
-       Render *re= fastshade_get_render(scene);
-       mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
-       me->mcol= (MCol*)mcol;
+       if(re) {
+               mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
+               me->mcol= (MCol*)mcol;
 
-       /* swap bytes */
-       for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
-               SWAP(char, cp[0], cp[3]);
-               SWAP(char, cp[1], cp[2]);
+               /* swap bytes */
+               for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
+                       SWAP(char, cp[0], cp[3]);
+                       SWAP(char, cp[1], cp[2]);
+               }
        }
 }
 
@@ -641,6 +649,8 @@ void shadeDispList(Scene *scene, Base *base)
        int a, need_orco;
        
        re= fastshade_get_render(scene);
+       if(re==NULL)
+               return;
        
        dl = find_displist(&ob->disp, DL_VERTCOL);
        if (dl) {
index 8eef9984c925b70f26ab7cfe48235ff0513fc4de..6b231cfc702e7dc22afbbd9a2ba5cb08ac7725d7 100644 (file)
@@ -1812,7 +1812,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser)
        Render *re= NULL;
        RenderResult *rr= NULL;
        
-       if(iuser->scene) {
+       if(iuser && iuser->scene) {
                re= RE_GetRender(iuser->scene->id.name);
                rr= RE_GetResult(re);
        }
index 4d8ec5996beb09729f17184926fcdb1089fdc63d..315b8693905fcd159846b92659f9a049c3f5db34 100644 (file)
@@ -728,21 +728,28 @@ static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
 }
 
 /* create single icon from jpg, png etc. */
-static void icon_from_image(Image *img, int miplevel)
+static void icon_from_image(Scene *scene, Image *img, int miplevel)
 {
+       ImBuf *ibuf= NULL;
+       ImageUser iuser;
+       PreviewImage *pi;
        unsigned int pr_size;
        short image_loaded = 0;
-       struct ImBuf* ibuf=NULL;
-       PreviewImage* pi;
 
        /* img->ok is zero when Image cannot load */
        if (img==NULL || img->ok==0)
                return;
 
+       /* setup dummy image user */
+       memset(&iuser, 0, sizeof(ImageUser));
+       iuser.ok= iuser.framenr= 1;
+       iuser.scene= scene;
+       
        /* elubie: this needs to be changed: here image is always loaded if not
           already there. Very expensive for large images. Need to find a way to 
           only get existing ibuf */
-       ibuf = BKE_image_get_ibuf(img, NULL);
+       
+       ibuf = BKE_image_get_ibuf(img, &iuser);
        if(ibuf==NULL || ibuf->rect==NULL) {
                return;
        }
@@ -788,7 +795,7 @@ static void icon_set_image(Scene *scene, ID *id, PreviewImage* prv_img, int mipl
        /* no drawing (see last parameter doDraw, just calculate preview image 
                - hopefully small enough to be fast */
        if (GS(id->name) == ID_IM)
-               icon_from_image((struct Image*)id, miplevel);
+               icon_from_image(scene, (struct Image*)id, miplevel);
        else {  
                /* create the preview rect */
                icon_create_mipmap(prv_img, miplevel);