forked from bartvdbraak/blender
Separate scene simplification into viewport and render
This way it is possible to have viewport simplification bumped all the way up, making viewport really responsive but still have final render to use highest subdivision possible. Reviewers: lukastoenne, campbellbarton, dingto Reviewed By: campbellbarton, dingto Subscribers: dingto, nutel, eyecandy, venomgfx Differential Revision: https://developer.blender.org/D1273
This commit is contained in:
parent
7e3ee2d15d
commit
b7d0ff0ad6
@ -1409,10 +1409,17 @@ class CyclesScene_PT_simplify(CyclesButtonsPanel, Panel):
|
|||||||
rd = context.scene.render
|
rd = context.scene.render
|
||||||
|
|
||||||
layout.active = rd.use_simplify
|
layout.active = rd.use_simplify
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
row = layout.row()
|
col = split.column()
|
||||||
row.prop(rd, "simplify_subdivision", text="Subdivision")
|
col.label(text="Viewport:")
|
||||||
row.prop(rd, "simplify_child_particles", text="Child Particles")
|
col.prop(rd, "simplify_subdivision", text="Subdivision")
|
||||||
|
col.prop(rd, "simplify_child_particles", text="Child Particles")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.label(text="Render:")
|
||||||
|
col.prop(rd, "simplify_subdivision_render", text="Subdivision")
|
||||||
|
col.prop(rd, "simplify_child_particles_render", text="Child Particles")
|
||||||
|
|
||||||
|
|
||||||
def draw_device(self, context):
|
def draw_device(self, context):
|
||||||
|
@ -392,14 +392,17 @@ class SCENE_PT_simplify(SceneButtonsPanel, Panel):
|
|||||||
split = layout.split()
|
split = layout.split()
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
|
col.label(text="Viewport:")
|
||||||
col.prop(rd, "simplify_subdivision", text="Subdivision")
|
col.prop(rd, "simplify_subdivision", text="Subdivision")
|
||||||
col.prop(rd, "simplify_child_particles", text="Child Particles")
|
col.prop(rd, "simplify_child_particles", text="Child Particles")
|
||||||
|
|
||||||
col.prop(rd, "use_simplify_triangulate")
|
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
|
col.label(text="Render:")
|
||||||
|
col.prop(rd, "simplify_subdivision_render", text="Subdivision")
|
||||||
|
col.prop(rd, "simplify_child_particles_render", text="Child Particles")
|
||||||
col.prop(rd, "simplify_shadow_samples", text="Shadow Samples")
|
col.prop(rd, "simplify_shadow_samples", text="Shadow Samples")
|
||||||
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
|
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
|
||||||
|
col.prop(rd, "use_simplify_triangulate")
|
||||||
|
|
||||||
|
|
||||||
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
|
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
|
||||||
|
@ -127,8 +127,8 @@ struct SceneRenderView *BKE_scene_add_render_view(struct Scene *sce, const char
|
|||||||
bool BKE_scene_remove_render_view(struct Scene *scene, struct SceneRenderView *srv);
|
bool BKE_scene_remove_render_view(struct Scene *scene, struct SceneRenderView *srv);
|
||||||
|
|
||||||
/* render profile */
|
/* render profile */
|
||||||
int get_render_subsurf_level(const struct RenderData *r, int level);
|
int get_render_subsurf_level(const struct RenderData *r, int level, bool for_render);
|
||||||
int get_render_child_particle_number(const struct RenderData *r, int num);
|
int get_render_child_particle_number(const struct RenderData *r, int num, bool for_render);
|
||||||
int get_render_shadow_samples(const struct RenderData *r, int samples);
|
int get_render_shadow_samples(const struct RenderData *r, int samples);
|
||||||
float get_render_aosss_error(const struct RenderData *r, float error);
|
float get_render_aosss_error(const struct RenderData *r, float error);
|
||||||
|
|
||||||
|
@ -340,13 +340,13 @@ static int multires_get_level(Object *ob, MultiresModifierData *mmd,
|
|||||||
bool render, bool ignore_simplify)
|
bool render, bool ignore_simplify)
|
||||||
{
|
{
|
||||||
if (render)
|
if (render)
|
||||||
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl) : mmd->renderlvl;
|
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl, true) : mmd->renderlvl;
|
||||||
else if (ob->mode == OB_MODE_SCULPT)
|
else if (ob->mode == OB_MODE_SCULPT)
|
||||||
return mmd->sculptlvl;
|
return mmd->sculptlvl;
|
||||||
else if (ignore_simplify)
|
else if (ignore_simplify)
|
||||||
return mmd->lvl;
|
return mmd->lvl;
|
||||||
else
|
else
|
||||||
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl) : mmd->lvl;
|
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl, false) : mmd->lvl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
|
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
|
||||||
|
@ -297,7 +297,7 @@ int psys_get_child_number(Scene *scene, ParticleSystem *psys)
|
|||||||
else
|
else
|
||||||
nbr= psys->part->child_nbr;
|
nbr= psys->part->child_nbr;
|
||||||
|
|
||||||
return get_render_child_particle_number(&scene->r, nbr);
|
return get_render_child_particle_number(&scene->r, nbr, psys->renderdata != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int psys_get_tot_child(Scene *scene, ParticleSystem *psys)
|
int psys_get_tot_child(Scene *scene, ParticleSystem *psys)
|
||||||
|
@ -1939,20 +1939,30 @@ bool BKE_scene_remove_render_view(Scene *scene, SceneRenderView *srv)
|
|||||||
|
|
||||||
/* render simplification */
|
/* render simplification */
|
||||||
|
|
||||||
int get_render_subsurf_level(const RenderData *r, int lvl)
|
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
|
||||||
{
|
{
|
||||||
if (r->mode & R_SIMPLIFY)
|
if (r->mode & R_SIMPLIFY) {
|
||||||
return min_ii(r->simplify_subsurf, lvl);
|
if (for_render)
|
||||||
|
return min_ii(r->simplify_subsurf_render, lvl);
|
||||||
else
|
else
|
||||||
|
return min_ii(r->simplify_subsurf, lvl);
|
||||||
|
}
|
||||||
|
else {
|
||||||
return lvl;
|
return lvl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_render_child_particle_number(const RenderData *r, int num)
|
int get_render_child_particle_number(const RenderData *r, int num, bool for_render)
|
||||||
{
|
{
|
||||||
if (r->mode & R_SIMPLIFY)
|
if (r->mode & R_SIMPLIFY) {
|
||||||
return (int)(r->simplify_particles * num);
|
if (for_render)
|
||||||
|
return (int)(r->simplify_particles_render * num);
|
||||||
else
|
else
|
||||||
|
return (int)(r->simplify_particles * num);
|
||||||
|
}
|
||||||
|
else {
|
||||||
return num;
|
return num;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_render_shadow_samples(const RenderData *r, int samples)
|
int get_render_shadow_samples(const RenderData *r, int samples)
|
||||||
|
@ -3828,7 +3828,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
|
|||||||
/* note: editmode calculation can only run once per
|
/* note: editmode calculation can only run once per
|
||||||
* modifier stack evaluation (uses freed cache) [#36299] */
|
* modifier stack evaluation (uses freed cache) [#36299] */
|
||||||
if (flags & SUBSURF_FOR_EDIT_MODE) {
|
if (flags & SUBSURF_FOR_EDIT_MODE) {
|
||||||
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels) : smd->levels;
|
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels, false) : smd->levels;
|
||||||
|
|
||||||
smd->emCache = _getSubSurf(smd->emCache, levels, 3, useSimple | useAging | CCG_CALC_NORMALS);
|
smd->emCache = _getSubSurf(smd->emCache, levels, 3, useSimple | useAging | CCG_CALC_NORMALS);
|
||||||
ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
|
ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
|
||||||
@ -3840,7 +3840,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
|
|||||||
else if (flags & SUBSURF_USE_RENDER_PARAMS) {
|
else if (flags & SUBSURF_USE_RENDER_PARAMS) {
|
||||||
/* Do not use cache in render mode. */
|
/* Do not use cache in render mode. */
|
||||||
CCGSubSurf *ss;
|
CCGSubSurf *ss;
|
||||||
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->renderLevels) : smd->renderLevels;
|
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->renderLevels, true) : smd->renderLevels;
|
||||||
|
|
||||||
if (levels == 0)
|
if (levels == 0)
|
||||||
return dm;
|
return dm;
|
||||||
@ -3856,7 +3856,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int useIncremental = (smd->flags & eSubsurfModifierFlag_Incremental);
|
int useIncremental = (smd->flags & eSubsurfModifierFlag_Incremental);
|
||||||
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels) : smd->levels;
|
int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels, false) : smd->levels;
|
||||||
CCGSubSurf *ss;
|
CCGSubSurf *ss;
|
||||||
|
|
||||||
/* It is quite possible there is a much better place to do this. It
|
/* It is quite possible there is a much better place to do this. It
|
||||||
|
@ -822,5 +822,13 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "short", "simplify_subsurf_render")) {
|
||||||
|
Scene *scene;
|
||||||
|
for (scene = main->scene.first; scene != NULL; scene = scene->id.next) {
|
||||||
|
scene->r.simplify_subsurf_render = scene->r.simplify_subsurf;
|
||||||
|
scene->r.simplify_particles_render = scene->r.simplify_particles;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -657,8 +657,10 @@ typedef struct RenderData {
|
|||||||
/* render simplify */
|
/* render simplify */
|
||||||
int simplify_flag;
|
int simplify_flag;
|
||||||
short simplify_subsurf;
|
short simplify_subsurf;
|
||||||
short simplify_shadowsamples;
|
short simplify_subsurf_render;
|
||||||
|
short simplify_shadowsamples, pad9;
|
||||||
float simplify_particles;
|
float simplify_particles;
|
||||||
|
float simplify_particles_render;
|
||||||
float simplify_aosss;
|
float simplify_aosss;
|
||||||
|
|
||||||
/* cineon */
|
/* cineon */
|
||||||
|
@ -5821,6 +5821,17 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(prop, "Simplify Child Particles", "Global child particles percentage");
|
RNA_def_property_ui_text(prop, "Simplify Child Particles", "Global child particles percentage");
|
||||||
RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
|
RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "simplify_subdivision_render", PROP_INT, PROP_UNSIGNED);
|
||||||
|
RNA_def_property_int_sdna(prop, NULL, "simplify_subsurf_render");
|
||||||
|
RNA_def_property_ui_range(prop, 0, 6, 1, -1);
|
||||||
|
RNA_def_property_ui_text(prop, "Simplify Subdivision", "Global maximum subdivision level during rendering");
|
||||||
|
RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "simplify_child_particles_render", PROP_FLOAT, PROP_FACTOR);
|
||||||
|
RNA_def_property_float_sdna(prop, NULL, "simplify_particles_render");
|
||||||
|
RNA_def_property_ui_text(prop, "Simplify Child Particles", "Global child particles percentage during rendering");
|
||||||
|
RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "simplify_shadow_samples", PROP_INT, PROP_UNSIGNED);
|
prop = RNA_def_property(srna, "simplify_shadow_samples", PROP_INT, PROP_UNSIGNED);
|
||||||
RNA_def_property_int_sdna(prop, NULL, "simplify_shadowsamples");
|
RNA_def_property_int_sdna(prop, NULL, "simplify_shadowsamples");
|
||||||
RNA_def_property_ui_range(prop, 1, 16, 1, -1);
|
RNA_def_property_ui_range(prop, 1, 16, 1, -1);
|
||||||
|
@ -88,7 +88,7 @@ static bool isDisabled(ModifierData *md, int useRenderParams)
|
|||||||
SubsurfModifierData *smd = (SubsurfModifierData *) md;
|
SubsurfModifierData *smd = (SubsurfModifierData *) md;
|
||||||
int levels = (useRenderParams) ? smd->renderLevels : smd->levels;
|
int levels = (useRenderParams) ? smd->renderLevels : smd->levels;
|
||||||
|
|
||||||
return get_render_subsurf_level(&md->scene->r, levels) == 0;
|
return get_render_subsurf_level(&md->scene->r, levels, useRenderParams != 0) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
||||||
|
Loading…
Reference in New Issue
Block a user