diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index ca49ffccd2a..eba94604a88 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -150,6 +150,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): description="Use progressive sampling of lighting", default=True, ) + cls.squared_samples = BoolProperty( + name="Squared Samples", + description="Square sampling values for easier artist control", + default=False, + ) cls.samples = IntProperty( name="Samples", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 8d129aa821c..d862a00f006 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -84,6 +84,8 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel): sub.prop(cscene, "ao_samples", text="AO") sub.prop(cscene, "mesh_light_samples", text="Mesh Light") sub.prop(cscene, "subsurface_samples", text="Subsurface") + + layout.prop(cscene, "squared_samples") if cscene.feature_set == 'EXPERIMENTAL' and (device_type == 'NONE' or cscene.device == 'CPU'): layout.row().prop(cscene, "sampling_pattern", text="Pattern") diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index d1e3d64d572..b2235c36af0 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -154,10 +154,16 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI light->shader = used_shaders[0]; /* shadow */ + PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles"); light->cast_shadow = get_boolean(clamp, "cast_shadow"); light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling"); - light->samples = get_int(clamp, "samples"); + + int samples = get_int(clamp, "samples"); + if(get_boolean(cscene, "squared_samples")) + light->samples = samples * samples; + else + light->samples = samples; /* visibility */ uint visibility = object_ray_visibility(b_ob); @@ -174,6 +180,7 @@ void BlenderSync::sync_background_light() BL::World b_world = b_scene.world(); if(b_world) { + PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles"); bool sample_as_light = get_boolean(cworld, "sample_as_light"); @@ -188,8 +195,13 @@ void BlenderSync::sync_background_light() { light->type = LIGHT_BACKGROUND; light->map_resolution = get_int(cworld, "sample_map_resolution"); - light->samples = get_int(cworld, "samples"); light->shader = scene->default_background; + + int samples = get_int(cworld, "samples"); + if(get_boolean(cscene, "squared_samples")) + light->samples = samples * samples; + else + light->samples = samples; light->tag_update(scene); light_map.set_recalc(b_world); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index e9e39e485f5..10a17b7abc3 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -191,14 +191,33 @@ void BlenderSync::sync_integrator() } #endif - integrator->diffuse_samples = get_int(cscene, "diffuse_samples"); - integrator->glossy_samples = get_int(cscene, "glossy_samples"); - integrator->transmission_samples = get_int(cscene, "transmission_samples"); - integrator->ao_samples = get_int(cscene, "ao_samples"); - integrator->mesh_light_samples = get_int(cscene, "mesh_light_samples"); - integrator->subsurface_samples = get_int(cscene, "subsurface_samples"); integrator->progressive = get_boolean(cscene, "progressive"); + int diffuse_samples = get_int(cscene, "diffuse_samples"); + int glossy_samples = get_int(cscene, "glossy_samples"); + int transmission_samples = get_int(cscene, "transmission_samples"); + int ao_samples = get_int(cscene, "ao_samples"); + int mesh_light_samples = get_int(cscene, "mesh_light_samples"); + int subsurface_samples = get_int(cscene, "subsurface_samples"); + + if(get_boolean(cscene, "squared_samples")) { + integrator->diffuse_samples = diffuse_samples * diffuse_samples; + integrator->glossy_samples = glossy_samples * glossy_samples; + integrator->transmission_samples = transmission_samples * transmission_samples; + integrator->ao_samples = ao_samples * ao_samples; + integrator->mesh_light_samples = mesh_light_samples * mesh_light_samples; + integrator->subsurface_samples = subsurface_samples * subsurface_samples; + } + else { + integrator->diffuse_samples = diffuse_samples; + integrator->glossy_samples = glossy_samples; + integrator->transmission_samples = transmission_samples; + integrator->ao_samples = ao_samples; + integrator->mesh_light_samples = mesh_light_samples; + integrator->subsurface_samples = subsurface_samples; + } + + if(experimental) integrator->sampling_pattern = (SamplingPattern)RNA_enum_get(&cscene, "sampling_pattern"); @@ -300,8 +319,13 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer) render_layer.use_localview = false; render_layer.bound_samples = (use_layer_samples == 1); - if(use_layer_samples != 2) - render_layer.samples = b_rlay->samples(); + if(use_layer_samples != 2) { + int samples = b_rlay->samples(); + if(get_boolean(cscene, "squared_samples")) + render_layer.samples = samples * samples; + else + render_layer.samples = samples; + } } first_layer = false; @@ -385,22 +409,34 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use params.background = background; /* samples */ + int samples = get_int(cscene, "samples"); + int aa_samples = get_int(cscene, "aa_samples"); + int preview_samples = get_int(cscene, "preview_samples"); + int preview_aa_samples = get_int(cscene, "preview_aa_samples"); + + if(get_boolean(cscene, "squared_samples")) { + samples = samples * samples; + aa_samples = aa_samples * aa_samples; + preview_samples = preview_samples * preview_samples; + preview_aa_samples = preview_aa_samples * preview_aa_samples; + } + if(get_boolean(cscene, "progressive") == 0 && params.device.type == DEVICE_CPU) { if(background) { - params.samples = get_int(cscene, "aa_samples"); + params.samples = aa_samples; } else { - params.samples = get_int(cscene, "preview_aa_samples"); + params.samples = preview_aa_samples; if(params.samples == 0) params.samples = 65536; } } else { if(background) { - params.samples = get_int(cscene, "samples"); + params.samples = samples; } else { - params.samples = get_int(cscene, "preview_samples"); + params.samples = preview_samples; if(params.samples == 0) params.samples = 65536; }