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.
This commit is contained in:
2009-06-28 09:35:37 +00:00
parent 2fac3f3550
commit 6998a0f47b
3 changed files with 36 additions and 19 deletions

View File

@@ -315,13 +315,19 @@ static void init_fastshade_shadeinput(Render *re)
static Render *fastshade_get_render(Scene *scene) static Render *fastshade_get_render(Scene *scene)
{ {
Render *re= RE_GetRender("_Shade View_"); /* XXX ugly global still, but we can't do preview while rendering */
if(re==NULL) { if(G.rendering==0) {
re= RE_NewRender("_Shade View_");
Render *re= RE_GetRender("_Shade View_");
RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */ 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 */ /* 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) void shadeMeshMCol(Scene *scene, Object *ob, Mesh *me)
{ {
Render *re= fastshade_get_render(scene);
int a; int a;
char *cp; char *cp;
unsigned int *mcol= (unsigned int*)me->mcol; unsigned int *mcol= (unsigned int*)me->mcol;
Render *re= fastshade_get_render(scene); if(re) {
mesh_create_shadedColors(re, ob, 1, &mcol, NULL); mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
me->mcol= (MCol*)mcol; me->mcol= (MCol*)mcol;
/* swap bytes */ /* swap bytes */
for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) { for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
SWAP(char, cp[0], cp[3]); SWAP(char, cp[0], cp[3]);
SWAP(char, cp[1], cp[2]); SWAP(char, cp[1], cp[2]);
}
} }
} }
@@ -641,6 +649,8 @@ void shadeDispList(Scene *scene, Base *base)
int a, need_orco; int a, need_orco;
re= fastshade_get_render(scene); re= fastshade_get_render(scene);
if(re==NULL)
return;
dl = find_displist(&ob->disp, DL_VERTCOL); dl = find_displist(&ob->disp, DL_VERTCOL);
if (dl) { if (dl) {

View File

@@ -1812,7 +1812,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser)
Render *re= NULL; Render *re= NULL;
RenderResult *rr= NULL; RenderResult *rr= NULL;
if(iuser->scene) { if(iuser && iuser->scene) {
re= RE_GetRender(iuser->scene->id.name); re= RE_GetRender(iuser->scene->id.name);
rr= RE_GetResult(re); rr= RE_GetResult(re);
} }

View File

@@ -728,21 +728,28 @@ static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
} }
/* create single icon from jpg, png etc. */ /* 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; unsigned int pr_size;
short image_loaded = 0; short image_loaded = 0;
struct ImBuf* ibuf=NULL;
PreviewImage* pi;
/* img->ok is zero when Image cannot load */ /* img->ok is zero when Image cannot load */
if (img==NULL || img->ok==0) if (img==NULL || img->ok==0)
return; 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 /* 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 already there. Very expensive for large images. Need to find a way to
only get existing ibuf */ only get existing ibuf */
ibuf = BKE_image_get_ibuf(img, NULL);
ibuf = BKE_image_get_ibuf(img, &iuser);
if(ibuf==NULL || ibuf->rect==NULL) { if(ibuf==NULL || ibuf->rect==NULL) {
return; 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 /* no drawing (see last parameter doDraw, just calculate preview image
- hopefully small enough to be fast */ - hopefully small enough to be fast */
if (GS(id->name) == ID_IM) if (GS(id->name) == ID_IM)
icon_from_image((struct Image*)id, miplevel); icon_from_image(scene, (struct Image*)id, miplevel);
else { else {
/* create the preview rect */ /* create the preview rect */
icon_create_mipmap(prv_img, miplevel); icon_create_mipmap(prv_img, miplevel);