Cycles microdisplacement: add max subdivision setting

This is to prevent situations such as when the camera gets very close to a mesh
and causes it to be tessellated into an excessive amount of micropolygons. In
REYES this is known as the eye-splits problem.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D1922
This commit is contained in:
2016-04-18 22:35:49 +02:00
committed by Brecht Van Lommel
parent 71588300d2
commit 3068ea34e4
7 changed files with 97 additions and 5 deletions

View File

@@ -64,10 +64,12 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
experimental(false),
is_cpu(is_cpu),
dicing_rate(1.0f),
max_subdivisions(12),
progress(progress)
{
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate") : RNA_float_get(&cscene, "dicing_rate");
max_subdivisions = RNA_int_get(&cscene, "max_subdivisions");
}
BlenderSync::~BlenderSync()
@@ -127,16 +129,24 @@ bool BlenderSync::sync_recalc()
}
}
bool dicing_rate_changed = false;
bool dicing_prop_changed = false;
if(experimental) {
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
float updated_dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate")
: RNA_float_get(&cscene, "dicing_rate");
if(dicing_rate != updated_dicing_rate) {
dicing_rate = updated_dicing_rate;
dicing_rate_changed = true;
dicing_prop_changed = true;
}
int updated_max_subdivisions = RNA_int_get(&cscene, "max_subdivisions");
if(max_subdivisions != updated_max_subdivisions) {
max_subdivisions = updated_max_subdivisions;
dicing_prop_changed = true;
}
}
@@ -146,7 +156,7 @@ bool BlenderSync::sync_recalc()
if(b_mesh->is_updated()) {
mesh_map.set_recalc(*b_mesh);
}
else if(dicing_rate_changed) {
else if(dicing_prop_changed) {
PointerRNA cmesh = RNA_pointer_get(&b_mesh->ptr, "cycles");
if(RNA_enum_get(&cmesh, "subdivision_type"))