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-07 15:12:35 +0400
committerTon Roosendaal <ton@blender.org>2009-06-07 15:12:35 +0400
commita2f9ca3b3fcd020e5124b6c3fb6523545377b5e2 (patch)
tree83830cf58852e6b2a6572d36b244bd6bdeddfebc /source/blender/editors/preview
parent1bb8d745b914aade700d69220e665096d5db43d0 (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.c118
-rw-r--r--source/blender/editors/preview/previewrender_intern.h32
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 */