Fix #35672: missing update when changing light ray visibility during viewport render.

This commit is contained in:
Brecht Van Lommel 2013-06-08 13:43:38 +00:00
parent e2c02c47ad
commit 0a54311450
2 changed files with 15 additions and 7 deletions

@ -135,6 +135,7 @@ void Light::tag_update(Scene *scene)
LightManager::LightManager()
{
need_update = true;
use_light_visibility = false;
}
LightManager::~LightManager()
@ -232,15 +233,15 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
if(!(object->visibility & PATH_RAY_DIFFUSE)) {
shader_id |= SHADER_EXCLUDE_DIFFUSE;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
if(!(object->visibility & PATH_RAY_GLOSSY)) {
shader_id |= SHADER_EXCLUDE_GLOSSY;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
if(!(object->visibility & PATH_RAY_TRANSMIT)) {
shader_id |= SHADER_EXCLUDE_TRANSMIT;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
for(size_t i = 0; i < mesh->triangles.size(); i++) {
@ -511,7 +512,6 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce
}
}
}
scene->film->use_light_visibility = false;
for(size_t i = 0; i < scene->lights.size(); i++) {
Light *light = scene->lights[i];
@ -525,15 +525,15 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce
if(!light->use_diffuse) {
shader_id |= SHADER_EXCLUDE_DIFFUSE;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
if(!light->use_glossy) {
shader_id |= SHADER_EXCLUDE_GLOSSY;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
if(!light->use_transmission) {
shader_id |= SHADER_EXCLUDE_TRANSMIT;
scene->film->use_light_visibility = true;
use_light_visibility = true;
}
if(light->type == LIGHT_POINT) {
@ -618,6 +618,8 @@ void LightManager::device_update(Device *device, DeviceScene *dscene, Scene *sce
device_free(device, dscene);
use_light_visibility = false;
device_update_points(device, dscene, scene);
if(progress.get_cancel()) return;
@ -627,6 +629,11 @@ void LightManager::device_update(Device *device, DeviceScene *dscene, Scene *sce
device_update_background(device, dscene, scene, progress);
if(progress.get_cancel()) return;
if(use_light_visibility != scene->film->use_light_visibility) {
scene->film->use_light_visibility = use_light_visibility;
scene->film->tag_update(scene);
}
need_update = false;
}

@ -65,6 +65,7 @@ public:
class LightManager {
public:
bool use_light_visibility;
bool need_update;
LightManager();