diff options
author | Ton Roosendaal <ton@blender.org> | 2009-06-25 19:41:27 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-06-25 19:41:27 +0400 |
commit | 47ca543b32e74b67e5f8eb6265cc08f93018b002 (patch) | |
tree | 4091e83691f48b26743dfe6f054e5c24e7edd0c5 /source/blender/editors/preview | |
parent | d428ba1de8074e8b0ca2b7c0b060c18ebf7d6b0c (diff) |
2.5
Rendering preview icons is back!
Note for Andrea: the render code has been decoupled from
drawing, it needs Scene context to be able to run...
At the moment only the search menu calls the new render
code (which is the ID browse menu default anyway)
Diffstat (limited to 'source/blender/editors/preview')
-rw-r--r-- | source/blender/editors/preview/previewrender.c | 256 |
1 files changed, 27 insertions, 229 deletions
diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c index 1ce20fcb0af..1efa5108b96 100644 --- a/source/blender/editors/preview/previewrender.c +++ b/source/blender/editors/preview/previewrender.c @@ -114,46 +114,12 @@ typedef struct ShaderPreview { ID *id; int sizex, sizey; + int *pr_rect; int pr_method; } ShaderPreview; -static void set_previewrect(ScrArea *sa, RenderInfo *ri) -{ - ARegion *ar= NULL; // XXX - rctf viewplane; - - BLI_init_rctf(&viewplane, PR_XMIN, PR_XMAX, PR_YMIN, PR_YMAX); - -// ui_graphics_to_window_rct(ar->win, &viewplane, &ri->disprect); - - /* correction for gla draw */ - BLI_translate_rcti(&ri->disprect, -ar->winrct.xmin, -ar->winrct.ymin); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - glaDefine2DArea(&ar->winrct); - - ri->pr_rectx= (ri->disprect.xmax-ri->disprect.xmin); - ri->pr_recty= (ri->disprect.ymax-ri->disprect.ymin); -} - -static void end_previewrect(ARegion *ar) -{ - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - // restore viewport / scissor which was set by glaDefine2DArea - glViewport(ar->winrct.xmin, ar->winrct.ymin, ar->winx, ar->winy); - glScissor(ar->winrct.xmin, ar->winrct.ymin, ar->winx, ar->winy); - -} /* unused now */ void draw_tex_crop(Tex *tex) @@ -438,196 +404,6 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp return NULL; } -void previewrender_progress(void *handle, RenderResult *rr, volatile rcti *renrect) -{ - SpaceButs *sbuts= NULL; // XXX - RenderLayer *rl; - RenderInfo *ri= sbuts->ri; - float ofsx, ofsy; - - if(renrect) return; - - rl= rr->layers.first; - - ofsx= ri->disprect.xmin + rr->tilerect.xmin; - ofsy= ri->disprect.ymin + rr->tilerect.ymin; - - glDrawBuffer(GL_FRONT); - glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf); - bglFlush(); - glDrawBuffer(GL_BACK); -} - - -/* called by interface_icons.c, or by BIF_previewrender_buts or by nodes... */ -void BIF_previewrender(Scene *scene, struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method) -{ - SpaceButs *sbuts= NULL; // XXX - Render *re; - RenderStats *rstats; - Scene *sce; - int oldx= ri->pr_rectx, oldy= ri->pr_recty; - char name [32]; - - if(ri->tottile && ri->curtile>=ri->tottile) return; - - /* check for return with a new event */ - if(pr_method!=PR_ICON_RENDER && qtest()) { -// if(area) -// addafterqueue(area->win, RENDERPREVIEW, 1); - return; - } - - /* get the stuff from the builtin preview dbase */ -// sce= preview_prepare_scene(scene, ri, GS(id->name), id, pr_method); - if(sce==NULL) return; - - /* set drawing conditions OK */ - if(area) { - sbuts= area->spacedata.first; /* needed for flag */ - - set_previewrect(area, ri); // uses UImat - - /* because preview render size can differs */ - if(ri->rect && (oldx!=ri->pr_rectx || oldy!=ri->pr_recty)) { - MEM_freeN(ri->rect); - ri->rect= NULL; - ri->curtile= 0; - } - } - -// XXX sprintf(name, "ButsPreview %d", area?area->win:0); - re= RE_GetRender(name); - - /* full refreshed render from first tile */ - if(re==NULL || ri->curtile==0) { - - re= RE_NewRender(name); - - /* handle cases */ - if(pr_method==PR_DRAW_RENDER) { -// RE_display_draw_cb(re, previewrender_progress); -// RE_test_break_cb(re, qtest); - sce->r.scemode |= R_NODE_PREVIEW; - if(sbuts->flag & SB_PRV_OSA) - sce->r.mode |= R_OSA; - sce->r.scemode &= ~R_NO_IMAGE_LOAD; - } - else if(pr_method==PR_DO_RENDER) { -// RE_test_break_cb(re, qtest); - sce->r.scemode |= R_NODE_PREVIEW; - sce->r.scemode &= ~R_NO_IMAGE_LOAD; - } - else { /* PR_ICON_RENDER */ - sce->r.scemode &= ~R_NODE_PREVIEW; - sce->r.scemode |= R_NO_IMAGE_LOAD; - } - - /* allocates render result */ - RE_InitState(re, NULL, &sce->r, ri->pr_rectx, ri->pr_recty, NULL); - - /* enforce preview image clear */ - if(GS(id->name)==ID_MA) { - Material *ma= (Material *)id; - ntreeClearPreview(ma->nodetree); - } - } - /* entire cycle for render engine */ - RE_SetCamera(re, sce->camera); - RE_Database_FromScene(re, sce, 1); - RE_TileProcessor(re, ri->curtile, 0); // actual render engine - RE_Database_Free(re); - - /* handle results */ - if(pr_method==PR_ICON_RENDER) { - if(ri->rect==NULL) - ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); - RE_ResultGet32(re, ri->rect); - } - else { - rstats= RE_GetStats(re); - - if(rstats->partsdone!=ri->curtile) { - if(ri->rect==NULL) - ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); - RE_ResultGet32(re, ri->rect); - } - - if(rstats->totpart==rstats->partsdone && rstats->partsdone) { - // allqueues - } - else { -// if(pr_method==PR_DRAW_RENDER && qtest()) -// addafterqueue(area->win, RENDERPREVIEW, 1); - } - - ri->curtile= rstats->partsdone; - ri->tottile= rstats->totpart; - } - - /* unassign the pointers, reset vars */ -// preview_prepare_scene(scene, ri, GS(id->name), NULL, 0); - -} - - -/* afterqueue call */ -void BIF_previewrender_buts(Scene *scene, SpaceButs *sbuts) -{ -// ScrArea *sa= NULL; // XXX - ARegion *ar= NULL; // XXX - uiBlock *block; - struct ID* id = 0; -// struct ID* idfrom = 0; - struct ID* idshow = 0; - Object *ob; - - if (!sbuts->ri) return; - - -// block= uiFindOpenPanelBlockName(&sa->uiblocks, "Preview"); - if(block==NULL) return; - - ob= ((scene->basact)? (scene->basact)->object: 0); - - /* we cant trust this global lockpoin.. for example with headerless window */ -// buttons_active_id(&id, &idfrom); - sbuts->lockpoin= id; - - if(sbuts->mainb==CONTEXT_SHADING) { - int tab= TAB_SHADING_MAT; // XXX sbuts->tab[CONTEXT_SHADING]; - - if(tab==TAB_SHADING_MAT) - idshow = sbuts->lockpoin; - else if(tab==TAB_SHADING_TEX) - idshow = sbuts->lockpoin; - else if(tab==TAB_SHADING_LAMP) { - if(ob && ob->type==OB_LAMP) idshow= ob->data; - } - else if(tab==TAB_SHADING_WORLD) - idshow = sbuts->lockpoin; - } - else if(sbuts->mainb==CONTEXT_OBJECT) { - if(ob && ob->type==OB_LAMP) idshow = ob->data; - } - - if (idshow) { - BKE_icon_changed(BKE_icon_getid(idshow)); -// uiPanelPush(block); -// BIF_previewrender(scene, idshow, sbuts->ri, sbuts->area, PR_DRAW_RENDER); -// uiPanelPop(block); - end_previewrect(ar); - } - else { - /* no active block to draw. But we do draw black if possible */ - if(sbuts->ri->rect) { - memset(sbuts->ri->rect, 0, sizeof(int)*sbuts->ri->pr_rectx*sbuts->ri->pr_recty); - sbuts->ri->tottile= 10000; -// addqueue(sa->win, REDRAW, 1); - } - return; - } -} /* new UI convention: draw is in pixel space already. */ /* uses ROUNDBOX button in block to get the rect */ @@ -1006,7 +782,7 @@ static void shader_preview_updatejob(void *spv) } -/* runs inside thread */ +/* runs inside thread for material, in foreground for icons */ static void shader_preview_startjob(void *customdata, short *stop, short *do_update) { ShaderPreview *sp= customdata; @@ -1064,9 +840,8 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd /* handle results */ if(sp->pr_method==PR_ICON_RENDER) { - //if(ri->rect==NULL) - // ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); - //RE_ResultGet32(re, ri->rect); + if(sp->pr_rect) + RE_ResultGet32(re, sp->pr_rect); } else { /* validate owner */ @@ -1113,6 +888,29 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, in WM_jobs_callbacks(steve, shader_preview_startjob, NULL, shader_preview_updatejob); WM_jobs_start(CTX_wm_manager(C), steve); + + /* signal to rerender icon in menus */ + BKE_icon_changed(BKE_icon_getid(id)); } +/* rect should be allocated, sizex/sizy pixels, 32 bits */ +void ED_preview_iconrender(Scene *scene, ID *id, int *rect, int sizex, int sizey) +{ + ShaderPreview *sp= MEM_callocN(sizeof(ShaderPreview), "ShaderPreview"); + short stop=0, do_update=0; + + /* customdata for preview thread */ + sp->scene= scene; + sp->sizex= sizex; + sp->sizey= sizey; + sp->pr_method= PR_ICON_RENDER; + sp->pr_rect= rect; + sp->id = id; + + shader_preview_startjob(sp, &stop, &do_update); + + MEM_freeN(sp); +} + + |