From 7b2172cb0b4afaada3f59f90f694847cfc61c43d Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 17 May 2013 11:13:46 +0000 Subject: 3D Viewport rendering (Blender Internal) Added incremental re-render on view changes. That means all data preprocessing only needs to be done once on view changes, quite faster that way. Also fixed a bug in raytracing strands with soft shadows, was wrongly changing coordinates in a static array. Note: proper signals for re-renders is still on the todo. Many button options don't signal a re-render yet. Work around: press G+ESC for quick full renders. --- source/blender/editors/render/render_internal.c | 31 +++++++++++-------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'source/blender/editors/render') diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index a172287113f..954fff42a37 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -718,6 +718,8 @@ typedef struct RenderPreview { Main *bmain; RenderEngine *engine; + float viewmat[4][4]; + int keep_data; } RenderPreview; @@ -828,7 +830,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda rp->stop = stop; rp->do_update = do_update; -// printf("Enter previewrender\n"); + // printf("Enter previewrender\n"); /* ok, are we rendering all over? */ sprintf(name, "View3dPreview %p", (void *)rp->ar); @@ -884,14 +886,14 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda lay |= rp->v3d->lay; else lay = rp->v3d->lay; - RE_SetView(re, rp->rv3d->viewmat); + RE_SetView(re, rp->viewmat); RE_Database_FromScene(re, rp->bmain, rp->scene, lay, 0); // 0= dont use camera view -// printf("dbase update\n"); + // printf("dbase update\n"); } else { -// printf("dbase rotate\n"); - RE_DataBase_IncrementalView(re, rp->rv3d->viewmat, 0); + // printf("dbase rotate\n"); + RE_DataBase_IncrementalView(re, rp->viewmat, 0); restore = 1; } @@ -900,15 +902,13 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda /* OK, can we enter render code? */ if (rstats->convertdone) { RE_TileProcessor(re); -// printf("tile processor\n"); + /* always rotate back */ if (restore) - RE_DataBase_IncrementalView(re, rp->rv3d->viewmat, 1); - + RE_DataBase_IncrementalView(re, rp->viewmat, 1); + rp->engine->flag &= ~RE_ENGINE_DO_UPDATE; } - -// printf("done\n\n"); } static void render_view3d_free(void *customdata) @@ -943,6 +943,7 @@ static void render_view3d_do(RenderEngine *engine, const bContext *C, int keep_d rp->rv3d = CTX_wm_region_view3d(C); rp->bmain = CTX_data_main(C); rp->keep_data = keep_data; + copy_m4_m4(rp->viewmat, rp->rv3d->viewmat); /* dont alloc in threads */ if (engine->text == NULL) @@ -992,13 +993,9 @@ static int render_view3d_changed(RenderEngine *engine, const bContext *C) if (engine->resolution_x != ar->winx || engine->resolution_y != ar->winy) update |= PR_UPDATE_RENDERSIZE; - /* view updating fails on raytrace */ RE_GetView(re, mat); if (compare_m4m4(mat, rv3d->viewmat, 0.00001f) == 0) { - if ((scene->r.mode & R_RAYTRACE) == 0) - update |= PR_UPDATE_VIEW; - else - engine->flag |= RE_ENGINE_DO_UPDATE; + update |= PR_UPDATE_VIEW; } render_view3d_get_rects(ar, v3d, rv3d, &viewplane, engine, &clipsta, &clipend, &orth); @@ -1013,8 +1010,8 @@ static int render_view3d_changed(RenderEngine *engine, const bContext *C) if (update) engine->flag |= RE_ENGINE_DO_UPDATE; -// if (update) -// printf("changed ma %d res %d view %d\n", update & PR_UPDATE_MATERIAL, update & PR_UPDATE_RENDERSIZE, update & PR_UPDATE_VIEW); + //if (update) + // printf("changed ma %d res %d view %d\n", update & PR_UPDATE_MATERIAL, update & PR_UPDATE_RENDERSIZE, update & PR_UPDATE_VIEW); } return update; -- cgit v1.2.3