Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-06-25 19:41:27 +0400
committerTon Roosendaal <ton@blender.org>2009-06-25 19:41:27 +0400
commit47ca543b32e74b67e5f8eb6265cc08f93018b002 (patch)
tree4091e83691f48b26743dfe6f054e5c24e7edd0c5 /source/blender/editors/preview
parentd428ba1de8074e8b0ca2b7c0b060c18ebf7d6b0c (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.c256
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);
+}
+
+