diff options
Diffstat (limited to 'intern/cycles/render/light.cpp')
-rw-r--r-- | intern/cycles/render/light.cpp | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 9adf8e5341a..cb7474017fa 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -120,6 +120,7 @@ NODE_DEFINE(Light) SOCKET_VECTOR(dir, "Dir", make_float3(0.0f, 0.0f, 0.0f)); SOCKET_FLOAT(size, "Size", 0.0f); + SOCKET_FLOAT(angle, "Angle", 0.0f); SOCKET_VECTOR(axisu, "Axis U", make_float3(0.0f, 0.0f, 0.0f)); SOCKET_FLOAT(sizeu, "Size U", 1.0f); @@ -181,7 +182,10 @@ bool Light::has_contribution(Scene *scene) LightManager::LightManager() { need_update = true; + need_update_background = true; use_light_visibility = false; + last_background_enabled = false; + last_background_resolution = 0; } LightManager::~LightManager() @@ -201,7 +205,7 @@ bool LightManager::has_background_light(Scene *scene) return false; } -void LightManager::disable_ineffective_light(Scene *scene) +void LightManager::test_enabled_lights(Scene *scene) { /* Make all lights enabled by default, and perform some preliminary checks * needed for finer-tuning of settings (for example, check whether we've @@ -214,6 +218,9 @@ void LightManager::disable_ineffective_light(Scene *scene) has_background |= light->type == LIGHT_BACKGROUND; } + bool background_enabled = false; + int background_resolution = 0; + if (has_background) { /* Ignore background light if: * - If unsupported on a device @@ -225,9 +232,18 @@ void LightManager::disable_ineffective_light(Scene *scene) foreach (Light *light, scene->lights) { if (light->type == LIGHT_BACKGROUND) { light->is_enabled = !disable_mis; + background_enabled = !disable_mis; + background_resolution = light->map_resolution; } } } + + if (last_background_enabled != background_enabled || + last_background_resolution != background_resolution) { + last_background_enabled = background_enabled; + last_background_resolution = background_resolution; + need_update_background = true; + } } bool LightManager::object_usable_as_light(Object *object) @@ -901,11 +917,12 @@ void LightManager::device_update(Device *device, VLOG(1) << "Total " << scene->lights.size() << " lights."; - device_free(device, dscene); + /* Detect which lights are enabled, also determins if we need to update the background. */ + test_enabled_lights(scene); - use_light_visibility = false; + device_free(device, dscene, need_update_background); - disable_ineffective_light(scene); + use_light_visibility = false; device_update_points(device, dscene, scene); if (progress.get_cancel()) @@ -915,9 +932,11 @@ void LightManager::device_update(Device *device, if (progress.get_cancel()) return; - device_update_background(device, dscene, scene, progress); - if (progress.get_cancel()) - return; + if (need_update_background) { + device_update_background(device, dscene, scene, progress); + if (progress.get_cancel()) + return; + } device_update_ies(dscene); if (progress.get_cancel()) @@ -929,14 +948,17 @@ void LightManager::device_update(Device *device, } need_update = false; + need_update_background = false; } -void LightManager::device_free(Device *, DeviceScene *dscene) +void LightManager::device_free(Device *, DeviceScene *dscene, const bool free_background) { dscene->light_distribution.free(); dscene->lights.free(); - dscene->light_background_marginal_cdf.free(); - dscene->light_background_conditional_cdf.free(); + if (free_background) { + dscene->light_background_marginal_cdf.free(); + dscene->light_background_conditional_cdf.free(); + } dscene->ies_lights.free(); } @@ -989,6 +1011,7 @@ int LightManager::add_ies(const string &content) ies_slots[slot]->hash = hash; need_update = true; + need_update_background = true; return slot; } @@ -1007,6 +1030,7 @@ void LightManager::remove_ies(int slot) /* If the slot has no more users, update the device to remove it. */ need_update |= (ies_slots[slot]->users == 0); + need_update_background |= need_update; } void LightManager::device_update_ies(DeviceScene *dscene) |