From ebc653463ddfd9f8b893b6acbcc6465972e6abc6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 12 Sep 2011 13:13:56 +0000 Subject: Cycles: * Fix missing update when editing objects with emission materials. * Fix preview pass rendering set to 1 not showing full resolution. * Fix CUDA runtime compiling failing due to missing cache directory. * Use settings from first render layer for visibility and material override. And a bunch of incomplete and still disabled code mostly related to closure sampling. --- intern/cycles/render/light.cpp | 60 ++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 20 deletions(-) (limited to 'intern/cycles/render/light.cpp') diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index feb9e35e785..b13cab55404 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -55,6 +55,9 @@ LightManager::~LightManager() void LightManager::device_update_distribution(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) { + /* option to always sample all point lights */ + bool multi_light = false; + /* count */ size_t num_lights = scene->lights.size(); size_t num_triangles = 0; @@ -82,7 +85,10 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen } } - size_t num_distribution = num_triangles + num_lights; + size_t num_distribution = num_triangles; + + if(!multi_light) + num_distribution += num_lights; /* emission area */ float4 *distribution = dscene->light_distribution.resize(num_distribution + 1); @@ -137,14 +143,16 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen float trianglearea = totarea; /* point lights */ - float lightarea = (totarea > 0.0f)? totarea/scene->lights.size(): 1.0f; - - for(size_t i = 0; i < scene->lights.size(); i++, offset++) { - distribution[offset].x = totarea; - distribution[offset].y = __int_as_float(-i-1); - distribution[offset].z = 1.0f; - distribution[offset].w = scene->lights[i]->radius; - totarea += lightarea; + if(!multi_light) { + float lightarea = (totarea > 0.0f)? totarea/scene->lights.size(): 1.0f; + + for(size_t i = 0; i < scene->lights.size(); i++, offset++) { + distribution[offset].x = totarea; + distribution[offset].y = __int_as_float(-i-1); + distribution[offset].z = 1.0f; + distribution[offset].w = scene->lights[i]->radius; + totarea += lightarea; + } } /* normalize cumulative distribution functions */ @@ -163,28 +171,40 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* update device */ KernelIntegrator *kintegrator = &dscene->data.integrator; - kintegrator->use_emission = (totarea > 0.0f); + kintegrator->use_emission = (totarea > 0.0f) || (multi_light && num_lights); if(kintegrator->use_emission) { /* number of emissives */ - kintegrator->num_triangles = num_triangles; - kintegrator->num_lights = num_lights; - kintegrator->num_distribution = num_distribution; + kintegrator->num_distribution = (totarea > 0.0f)? num_distribution: 0; /* precompute pdfs */ kintegrator->pdf_triangles = 0.0f; kintegrator->pdf_lights = 0.0f; - if(trianglearea > 0.0f) { - kintegrator->pdf_triangles = 1.0f/trianglearea; + if(multi_light) { + /* sample one of all triangles and all lights */ + kintegrator->num_all_lights = num_lights; + + if(trianglearea > 0.0f) + kintegrator->pdf_triangles = 1.0f/trianglearea; if(num_lights) - kintegrator->pdf_triangles *= 0.5f; + kintegrator->pdf_lights = 1.0f; } + else { + /* sample one, with 0.5 probability of light or triangle */ + kintegrator->num_all_lights = 0; + + if(trianglearea > 0.0f) { + kintegrator->pdf_triangles = 1.0f/trianglearea; + if(num_lights) + kintegrator->pdf_triangles *= 0.5f; + } - if(num_lights) { - kintegrator->pdf_lights = 1.0f/num_lights; - if(trianglearea > 0.0f) - kintegrator->pdf_lights *= 0.5f; + if(num_lights) { + kintegrator->pdf_lights = 1.0f/num_lights; + if(trianglearea > 0.0f) + kintegrator->pdf_lights *= 0.5f; + } } /* CDF */ -- cgit v1.2.3