diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 68f5f4b12f2..d65718f6e19 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -370,6 +370,19 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): min=2, max=65536 ) + cls.dicing_rate = FloatProperty( + name="Dicing Rate", + description="Size of a micropolygon in pixels", + min=0.1, max=1000.0, + default=1.0, + ) + cls.preview_dicing_rate = FloatProperty( + name="Preview Dicing Rate", + description="Size of a micropolygon in pixels during preview render", + min=0.1, max=1000.0, + default=8.0, + ) + cls.film_exposure = FloatProperty( name="Exposure", description="Image brightness scale", @@ -945,7 +958,7 @@ class CyclesMeshSettings(bpy.types.PropertyGroup): ) cls.dicing_rate = FloatProperty( name="Dicing Rate", - description="Size of a micropolygon in pixels", + description="Multiplier for scene dicing rate", min=0.1, max=1000.0, default=1.0, ) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index c02e2497d93..afad3b83983 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -209,8 +209,8 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel): draw_samples_info(layout, context) -class CyclesRender_PT_volume_sampling(CyclesButtonsPanel, Panel): - bl_label = "Volume Sampling" +class CyclesRender_PT_geometery(CyclesButtonsPanel, Panel): + bl_label = "Geometry" bl_options = {'DEFAULT_CLOSED'} def draw(self, context): @@ -219,11 +219,28 @@ class CyclesRender_PT_volume_sampling(CyclesButtonsPanel, Panel): scene = context.scene cscene = scene.cycles - row = layout.row() - row.label("Heterogeneous:") - row = layout.row() - row.prop(cscene, "volume_step_size") - row.prop(cscene, "volume_max_steps") + if cscene.feature_set == 'EXPERIMENTAL': + split = layout.split() + + col = split.column() + + sub = col.column(align=True) + sub.label("Volume Sampling:") + sub.prop(cscene, "volume_step_size") + sub.prop(cscene, "volume_max_steps") + + col = split.column() + + sub = col.column(align=True) + sub.label("Subdivision Rate:") + sub.prop(cscene, "dicing_rate", text="Render") + sub.prop(cscene, "preview_dicing_rate", text="Preview") + else: + row = layout.row() + row.label("Volume Sampling:") + row = layout.row() + row.prop(cscene, "volume_step_size") + row.prop(cscene, "volume_max_steps") class CyclesRender_PT_light_paths(CyclesButtonsPanel, Panel): @@ -694,8 +711,7 @@ class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel): sub.prop(cdata, "subdivision_type", text="") if cdata.subdivision_type != 'NONE': - sub.label(text="Subdivision Rate:") - sub.prop(cdata, "dicing_rate", text="Render") + sub.prop(cdata, "dicing_rate") class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel): bl_label = "Motion Blur" diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index a590b5f5532..ba0ba7892e8 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -660,13 +660,14 @@ static void create_subd_mesh(Scene *scene, BL::Object b_ob, BL::Mesh& b_mesh, PointerRNA *cmesh, - const vector& used_shaders) + const vector& used_shaders, + float dicing_rate) { Mesh basemesh; create_mesh(scene, &basemesh, b_mesh, used_shaders); SubdParams sdparams(mesh, used_shaders[0], true, false); - sdparams.dicing_rate = RNA_float_get(cmesh, "dicing_rate"); + sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate); scene->camera->update(); sdparams.camera = scene->camera; @@ -783,7 +784,7 @@ 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); + create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders, dicing_rate); 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 2239f992404..803a997ca6e 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -63,8 +63,11 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine, preview(preview), experimental(false), is_cpu(is_cpu), + dicing_rate(1.0f), 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"); } BlenderSync::~BlenderSync() @@ -124,11 +127,33 @@ bool BlenderSync::sync_recalc() } } + bool dicing_rate_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; + } + } + BL::BlendData::meshes_iterator b_mesh; - for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh) - if(b_mesh->is_updated()) + for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh) { + if(b_mesh->is_updated()) { mesh_map.set_recalc(*b_mesh); + } + else if(dicing_rate_changed) { + PointerRNA cmesh = RNA_pointer_get(&b_mesh->ptr, "cycles"); + + if(RNA_enum_get(&cmesh, "subdivision_type")) + mesh_map.set_recalc(*b_mesh); + } + } + BL::BlendData::worlds_iterator b_world; diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index a007099b178..4918b7871f8 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -172,6 +172,8 @@ private: bool experimental; bool is_cpu; + float dicing_rate; + struct RenderLayerInfo { RenderLayerInfo() : scene_layer(0), layer(0),