From 2184ac8c9d878cbf507437a08cc824eed536540b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 19 Aug 2014 19:36:49 +0600 Subject: Fix T41457: Viewport resolution divider does freestyle for every resolution Now freestyle would be rendered for the final resolution only, making it so viewport navigation is really interactive. --- source/blender/editors/render/render_internal.c | 13 ++++++++++++- source/blender/render/extern/include/RE_pipeline.h | 1 + source/blender/render/intern/source/pipeline.c | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 7eb3b5f8882..baf25a49f7c 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -1032,6 +1032,7 @@ typedef struct RenderPreview { int start_resolution_divider; int resolution_divider; + bool has_freestyle; } RenderPreview; static int render_view3d_disprect(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, rcti *disprect) @@ -1150,6 +1151,15 @@ static void render_update_resolution(Render *re, const RenderPreview *rp, else { RE_ChangeResolution(re, winx, winy, NULL); } + + if (rp->has_freestyle) { + if (rp->resolution_divider == 1) { + RE_ChangeModeFlag(re, R_EDGE_FRS, false); + } + else { + RE_ChangeModeFlag(re, R_EDGE_FRS, true); + } + } } static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress)) @@ -1163,7 +1173,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda bool orth, restore = 0; char name[32]; int update_flag; - bool use_border = false; + bool use_border; update_flag = rp->engine->job_update_flag; rp->engine->job_update_flag = 0; @@ -1429,6 +1439,7 @@ static void render_view3d_do(RenderEngine *engine, const bContext *C) rp->bmain = CTX_data_main(C); rp->resolution_divider = divider; rp->start_resolution_divider = divider; + rp->has_freestyle = scene->r.mode & R_EDGE_FRS; copy_m4_m4(rp->viewmat, rp->rv3d->viewmat); /* clear info text */ diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 4ab0f5a234d..3b54de4c943 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -194,6 +194,7 @@ void RE_InitState(struct Render *re, struct Render *source, struct RenderData *r struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect); void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect); +void RE_ChangeModeFlag(struct Render *re, int flag, bool clear); /* set up the viewplane/perspective matrix, three choices */ struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index aaaa53bd54c..77059f1b998 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -736,6 +736,20 @@ void RE_ChangeResolution(Render *re, int winx, int winy, rcti *disprect) } } +/* TODO(sergey): This is a bit hackish, used to temporary disable freestyle when + * doing viewport render. Needs some better integration of BI viewport rendering + * into the pipeline. + */ +void RE_ChangeModeFlag(Render *re, int flag, bool clear) +{ + if (clear) { + re->r.mode &= ~flag; + } + else { + re->r.mode |= flag; + } +} + /* update some variables that can be animated, and otherwise wouldn't be due to * RenderData getting copied once at the start of animation render */ void render_update_anim_renderdata(Render *re, RenderData *rd) -- cgit v1.2.3