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.
This commit is contained in:
Sergey Sharybin 2014-08-19 19:36:49 +06:00
parent 1a20074acb
commit 2184ac8c9d
Notes: blender-bot 2023-02-14 10:12:59 +01:00
Referenced by issue #41457, "Implement resolution divider in the Blender Internal" plus Freestyle calls freestyle render over and over and over for each subdivided resolution
3 changed files with 27 additions and 1 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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)