diff options
author | Ton Roosendaal <ton@blender.org> | 2009-06-07 15:12:35 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-06-07 15:12:35 +0400 |
commit | a2f9ca3b3fcd020e5124b6c3fb6523545377b5e2 (patch) | |
tree | 83830cf58852e6b2a6572d36b244bd6bdeddfebc /source/blender/editors/preview | |
parent | 1bb8d745b914aade700d69220e665096d5db43d0 (diff) |
2.5
Nice goodie: Preview renders!
- Added new preview.blend, allowing super wide cinemascope previews
- Draws nicely blended inside widget type, rounded corners
- Preview now renders using all available cpus/cores.
- Uses - hopefully rock stable - method, which doesn't copy or
allocate anything for previews, but just uses render API calls.
- Multiple previews are possible! But, added provision in Jobs
manager to only render one preview job at a time. If you start
more preview jobs, they're suspended until it's their turn.
Bugfix: new buttons context code crashed when going full-window.
Tweaks are still needed for notifiers. I have to figure out still
how to retrieve SpaceButs button view types...
Diffstat (limited to 'source/blender/editors/preview')
-rw-r--r-- | source/blender/editors/preview/previewrender.c | 118 | ||||
-rw-r--r-- | source/blender/editors/preview/previewrender_intern.h | 32 |
2 files changed, 68 insertions, 82 deletions
diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c index 85cb1e4e1bf..a17c488f1c9 100644 --- a/source/blender/editors/preview/previewrender.c +++ b/source/blender/editors/preview/previewrender.c @@ -88,6 +88,7 @@ #include "WM_types.h" #include "ED_anim_api.h" +#include "ED_previewrender.h" #include "ED_view3d.h" #include "UI_interface.h" @@ -113,6 +114,7 @@ typedef struct ShaderPreview { int sizex, sizey; int pr_method; + } ShaderPreview; @@ -620,45 +622,43 @@ void BIF_previewrender_buts(Scene *scene, SpaceButs *sbuts) } } - -/* is panel callback, supposed to be called with correct panel offset matrix */ -void BIF_previewdraw(ScrArea *sa, uiBlock *block) +/* new UI convention: draw is in pixel space already. */ +/* uses ROUNDBOX button in block to get the rect */ +void ED_preview_draw(const bContext *C, void *idp, rcti *rect) { - ARegion *ar= NULL; // XXX + ScrArea *sa= CTX_wm_area(C); SpaceButs *sbuts= sa->spacedata.first; - short id_code= 0; - - if(sbuts->lockpoin) { - ID *id= sbuts->lockpoin; - id_code= GS(id->name); + RenderResult rres; + int newx= rect->xmax-rect->xmin, newy= rect->ymax-rect->ymin; + int ok= 0; + char name[32]; + + sprintf(name, "Preview %p", sa); + RE_GetResultImage(RE_GetRender(name), &rres); + + if(rres.rectf) { + if(rres.rectx==newx && rres.recty==newy) { + glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA); + glEnable(GL_BLEND); + + glaDrawPixelsSafe(rect->xmin, rect->ymin, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_FLOAT, rres.rectf); + ok= 1; + + glDisable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } } - if (!sbuts->ri) { - sbuts->ri= MEM_callocN(sizeof(RenderInfo), "butsrenderinfo"); - sbuts->ri->tottile = 10000; + /* check for spacetype... */ + if(sbuts->spacetype==SPACE_BUTS && sbuts->preview) { + sbuts->preview= 0; + ok= 0; } - if (sbuts->ri->rect==NULL) BIF_preview_changed(id_code); - else { - RenderInfo *ri= sbuts->ri; - int oldx= ri->pr_rectx, oldy= ri->pr_recty; - - /* we now do scalable previews! */ - set_previewrect(sa, ri); - if( ABS(oldx-ri->pr_rectx)<2 && ABS(oldy-ri->pr_recty)<2 ) { - /* restore old values for drawing! */ - ri->pr_rectx= oldx; - ri->pr_recty= oldy; - glaDrawPixelsSafe(ri->disprect.xmin, ri->disprect.ymin, ri->pr_rectx, ri->pr_recty, ri->pr_rectx, GL_RGBA, GL_UNSIGNED_BYTE, ri->rect); - } - else { - MEM_freeN(ri->rect); - ri->rect= NULL; - sbuts->ri->curtile= 0; - } - end_previewrect(ar); + if(ok==0) { + printf("added shader job\n"); + ED_preview_shader_job(C, sa, idp, newx, newy); } - if(sbuts->ri->curtile==0) BIF_preview_changed(id_code); } @@ -975,7 +975,7 @@ void BIF_view3d_previewdraw(struct ScrArea *sa, struct uiBlock *block) /* **************************** New preview system ****************** */ -/* called by renderer, sets job update value */ +/* inside thread, called by renderer, sets job update value */ static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rcti *rect) { ShaderPreview *sp= spv; @@ -991,12 +991,20 @@ static int shader_preview_break(void *spv) return *(sp->stop); } +/* outside thread, called before redraw notifiers, it moves finished preview over */ +static void shader_preview_updatejob(void *spv) +{ +// ShaderPreview *sp= spv; + +} +/* runs inside thread */ static void shader_preview_startjob(void *customdata, short *stop, short *do_update) { ShaderPreview *sp= customdata; Render *re; Scene *sce; + float oldlens; char name [32]; sp->stop= stop; @@ -1010,35 +1018,39 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd re= RE_GetRender(name); /* full refreshed render from first tile */ - if(re==NULL) { + if(re==NULL) re= RE_NewRender(name); - /* sce->r gets copied in RE_InitState! */ - if(sp->pr_method==PR_DO_RENDER) { - 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, sp->sizex, sp->sizey, NULL); + /* sce->r gets copied in RE_InitState! */ + if(sp->pr_method==PR_DO_RENDER) { + sce->r.scemode |= R_NODE_PREVIEW; + sce->r.scemode &= ~R_NO_IMAGE_LOAD; + sce->r.mode |= R_OSA; } - + else { /* PR_ICON_RENDER */ + sce->r.scemode &= ~R_NODE_PREVIEW; + sce->r.scemode |= R_NO_IMAGE_LOAD; + } + + /* allocates or re-uses render result */ + RE_InitState(re, NULL, &sce->r, sp->sizex, sp->sizey, NULL); + /* callbacs are cleared on GetRender() */ if(sp->pr_method==PR_DO_RENDER) { RE_display_draw_cb(re, sp, shader_preview_draw); RE_test_break_cb(re, sp, shader_preview_break); } + /* lens adjust */ + oldlens= ((Camera *)sce->camera->data)->lens; + ((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sp->sizex; /* entire cycle for render engine */ RE_SetCamera(re, sce->camera); RE_Database_FromScene(re, sce, 1); - RE_TileProcessor(re, 0, 0); // actual render engine + RE_TileProcessor(re, 0, 1); // actual render engine RE_Database_Free(re); + ((Camera *)sce->camera->data)->lens= oldlens; *do_update= 1; /* handle results */ @@ -1047,6 +1059,12 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd // ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); //RE_ResultGet32(re, ri->rect); } + else { + /* validate owner */ + //if(ri->rect==NULL) + // ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender"); + //RE_ResultGet32(re, ri->rect); + } /* unassign the pointers, reset vars */ preview_prepare_scene(sp->scene, GS(sp->id->name), NULL); @@ -1076,9 +1094,9 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, in /* setup job */ WM_jobs_customdata(steve, sp, shader_preview_free); WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL); - WM_jobs_callbacks(steve, shader_preview_startjob, NULL, NULL); + WM_jobs_callbacks(steve, shader_preview_startjob, NULL, shader_preview_updatejob); - WM_jobs_start(steve); + WM_jobs_start(CTX_wm_manager(C), steve); } diff --git a/source/blender/editors/preview/previewrender_intern.h b/source/blender/editors/preview/previewrender_intern.h index 7d42727914b..74a3aeee754 100644 --- a/source/blender/editors/preview/previewrender_intern.h +++ b/source/blender/editors/preview/previewrender_intern.h @@ -32,38 +32,6 @@ /* internal exports only */ -typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha); - -/* stores rendered preview - is also used for icons */ -typedef struct RenderInfo { - int pr_rectx; - int pr_recty; - short curtile, tottile, status; - rcti disprect; /* storage for view3d preview rect */ - unsigned int* rect; - struct Render *re; /* persistant render */ -} RenderInfo; - -/* ri->status */ -#define PR_DBASE 1 -#define PR_DISPRECT 2 -#define PR_PROJECTED 4 -#define PR_ROTATED 8 - -/* Render the preview - -pr_method: -- PR_DRAW_RENDER: preview is rendered and drawn, as indicated by called context (buttons panel) -- PR_ICON_RENDER: the preview is not drawn and the function is not dynamic, - so no events are processed. Hopefully fast enough for at least 32x32 -- PR_DO_RENDER: preview is rendered, not drawn, but events are processed for afterqueue, - in use for node editor now. - */ - -#define PR_DRAW_RENDER 0 -#define PR_ICON_RENDER 1 -#define PR_DO_RENDER 2 - #endif /* PREVIEWRENDER_INTERN_H */ |