Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMai Lavelle <mai.lavelle@gmail.com>2016-04-18 23:35:49 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2016-04-18 23:47:24 +0300
commit3068ea34e414e7af6d20af7ab92c69cbd9a33414 (patch)
treee820479e09c3959219a16e8346c766be3d61f22d /intern/cycles/blender
parent71588300d233f795fcf9b0b55ce397b9b81614ff (diff)
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
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r--intern/cycles/blender/addon/properties.py7
-rw-r--r--intern/cycles/blender/addon/ui.py2
-rw-r--r--intern/cycles/blender/blender_mesh.cpp7
-rw-r--r--intern/cycles/blender/blender_sync.cpp16
-rw-r--r--intern/cycles/blender/blender_sync.h1
5 files changed, 28 insertions, 5 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index d65718f6e19..a5887bb9e2d 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -383,6 +383,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default=8.0,
)
+ cls.max_subdivisions = IntProperty(
+ name="Max Subdivisions",
+ description="Stop subdividing when this level is reached even if the dice rate would produce finer tessellation",
+ min=0, max=16,
+ default=12,
+ )
+
cls.film_exposure = FloatProperty(
name="Exposure",
description="Image brightness scale",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index afad3b83983..a4e6809390d 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -235,6 +235,8 @@ class CyclesRender_PT_geometery(CyclesButtonsPanel, Panel):
sub.label("Subdivision Rate:")
sub.prop(cscene, "dicing_rate", text="Render")
sub.prop(cscene, "preview_dicing_rate", text="Preview")
+ sub.separator()
+ sub.prop(cscene, "max_subdivisions")
else:
row = layout.row()
row.label("Volume Sampling:")
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index ba0ba7892e8..09e27c2282d 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -661,13 +661,15 @@ static void create_subd_mesh(Scene *scene,
BL::Mesh& b_mesh,
PointerRNA *cmesh,
const vector<uint>& used_shaders,
- float dicing_rate)
+ float dicing_rate,
+ int max_subdivisions)
{
Mesh basemesh;
create_mesh(scene, &basemesh, b_mesh, used_shaders);
SubdParams sdparams(mesh, used_shaders[0], true, false);
sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate);
+ sdparams.max_level = max_subdivisions;
scene->camera->update();
sdparams.camera = scene->camera;
@@ -784,7 +786,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
if(b_mesh) {
if(render_layer.use_surfaces && !hide_tris) {
if(cmesh.data && experimental && RNA_enum_get(&cmesh, "subdivision_type"))
- create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders, dicing_rate);
+ create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders,
+ dicing_rate, max_subdivisions);
else
create_mesh(scene, mesh, b_mesh, used_shaders);
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 803a997ca6e..6291b38d462 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -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"))
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 4918b7871f8..6ff5326f39f 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -173,6 +173,7 @@ private:
bool is_cpu;
float dicing_rate;
+ int max_subdivisions;
struct RenderLayerInfo {
RenderLayerInfo()