Fix #135086: Light ray visibility not taken into account without light tree
Re-enable tests that were temporarily disabled for this.
Caused by #134846, e813e46327
This commit is contained in:
@@ -99,15 +99,6 @@ void BlenderSync::sync_light(BL::Depsgraph /*b_depsgraph*/, BObjectInfo &b_ob_in
|
||||
world_use_portal = true;
|
||||
}
|
||||
|
||||
/* visibility */
|
||||
const uint visibility = object_ray_visibility(b_ob_info.real_object);
|
||||
light->set_use_camera((visibility & PATH_RAY_CAMERA) != 0);
|
||||
light->set_use_diffuse((visibility & PATH_RAY_DIFFUSE) != 0);
|
||||
light->set_use_glossy((visibility & PATH_RAY_GLOSSY) != 0);
|
||||
light->set_use_transmission((visibility & PATH_RAY_TRANSMIT) != 0);
|
||||
light->set_use_scatter((visibility & PATH_RAY_VOLUME_SCATTER) != 0);
|
||||
light->set_is_shadow_catcher(b_ob_info.real_object.is_shadow_catcher());
|
||||
|
||||
/* tag */
|
||||
light->tag_update(scene);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "hydra/light.h"
|
||||
#include "hydra/session.h"
|
||||
#include "kernel/types.h"
|
||||
#include "scene/light.h"
|
||||
#include "scene/object.h"
|
||||
#include "scene/scene.h"
|
||||
@@ -102,7 +103,12 @@ void HdCyclesLight::Sync(HdSceneDelegate *sceneDelegate,
|
||||
|
||||
value = sceneDelegate->GetLightParamValue(id, _tokens->visibleInPrimaryRay);
|
||||
if (!value.IsEmpty()) {
|
||||
_light->set_use_camera(value.Get<bool>());
|
||||
if (value.Get<bool>()) {
|
||||
_object->set_visibility(_object->get_visibility() | PATH_RAY_CAMERA);
|
||||
}
|
||||
else {
|
||||
_object->set_visibility(_object->get_visibility() & ~PATH_RAY_CAMERA);
|
||||
}
|
||||
}
|
||||
|
||||
value = sceneDelegate->GetLightParamValue(id, HdLightTokens->shadowEnable);
|
||||
@@ -400,7 +406,7 @@ void HdCyclesLight::Initialize(HdRenderParam *renderParam)
|
||||
}
|
||||
|
||||
_light->set_use_mis(true);
|
||||
_light->set_use_camera(false);
|
||||
_object->set_visibility(PATH_RAY_ALL_VISIBILITY & ~PATH_RAY_CAMERA);
|
||||
|
||||
Shader *const shader = lock.scene->create_node<Shader>();
|
||||
array<Node *> used_shaders;
|
||||
|
||||
@@ -213,7 +213,7 @@ ccl_device_noinline bool light_sample(KernelGlobals kg,
|
||||
light_distribution, ls->emitter_id);
|
||||
prim = kdistribution->prim;
|
||||
object_id = kdistribution->object_id;
|
||||
shader_flag = 0;
|
||||
shader_flag = kdistribution->shader_flag;
|
||||
}
|
||||
|
||||
if (!light_link_object_match(kg, object_receiver, object_id)) {
|
||||
|
||||
@@ -114,16 +114,10 @@ NODE_DEFINE(Light)
|
||||
|
||||
SOCKET_BOOLEAN(cast_shadow, "Cast Shadow", true);
|
||||
SOCKET_BOOLEAN(use_mis, "Use Mis", false);
|
||||
SOCKET_BOOLEAN(use_camera, "Use Camera", true);
|
||||
SOCKET_BOOLEAN(use_diffuse, "Use Diffuse", true);
|
||||
SOCKET_BOOLEAN(use_glossy, "Use Glossy", true);
|
||||
SOCKET_BOOLEAN(use_transmission, "Use Transmission", true);
|
||||
SOCKET_BOOLEAN(use_scatter, "Use Scatter", true);
|
||||
SOCKET_BOOLEAN(use_caustics, "Shadow Caustics", false);
|
||||
|
||||
SOCKET_INT(max_bounces, "Max Bounces", 1024);
|
||||
|
||||
SOCKET_BOOLEAN(is_shadow_catcher, "Shadow Catcher", true);
|
||||
SOCKET_BOOLEAN(is_portal, "Is Portal", false);
|
||||
SOCKET_BOOLEAN(is_enabled, "Is Enabled", true);
|
||||
|
||||
@@ -266,6 +260,33 @@ void LightManager::test_enabled_lights(Scene *scene)
|
||||
}
|
||||
}
|
||||
|
||||
static uint light_object_shader_flags(Object *object)
|
||||
{
|
||||
const uint visibility = object->get_visibility();
|
||||
uint shader_flag = 0;
|
||||
|
||||
if (!(visibility & PATH_RAY_CAMERA)) {
|
||||
shader_flag |= SHADER_EXCLUDE_CAMERA;
|
||||
}
|
||||
if (!(visibility & PATH_RAY_DIFFUSE)) {
|
||||
shader_flag |= SHADER_EXCLUDE_DIFFUSE;
|
||||
}
|
||||
if (!(visibility & PATH_RAY_GLOSSY)) {
|
||||
shader_flag |= SHADER_EXCLUDE_GLOSSY;
|
||||
}
|
||||
if (!(visibility & PATH_RAY_TRANSMIT)) {
|
||||
shader_flag |= SHADER_EXCLUDE_TRANSMIT;
|
||||
}
|
||||
if (!(visibility & PATH_RAY_VOLUME_SCATTER)) {
|
||||
shader_flag |= SHADER_EXCLUDE_SCATTER;
|
||||
}
|
||||
if (!(object->get_is_shadow_catcher())) {
|
||||
shader_flag |= SHADER_EXCLUDE_SHADOW_CATCHER;
|
||||
}
|
||||
|
||||
return shader_flag;
|
||||
}
|
||||
|
||||
void LightManager::device_update_distribution(Device * /*unused*/,
|
||||
DeviceScene *dscene,
|
||||
Scene *scene,
|
||||
@@ -342,26 +363,7 @@ void LightManager::device_update_distribution(Device * /*unused*/,
|
||||
Mesh *mesh = static_cast<Mesh *>(object->get_geometry());
|
||||
const bool transform_applied = mesh->transform_applied;
|
||||
const Transform tfm = object->get_tfm();
|
||||
int shader_flag = 0;
|
||||
|
||||
if (!(object->get_visibility() & PATH_RAY_CAMERA)) {
|
||||
shader_flag |= SHADER_EXCLUDE_CAMERA;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_DIFFUSE)) {
|
||||
shader_flag |= SHADER_EXCLUDE_DIFFUSE;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_GLOSSY)) {
|
||||
shader_flag |= SHADER_EXCLUDE_GLOSSY;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_TRANSMIT)) {
|
||||
shader_flag |= SHADER_EXCLUDE_TRANSMIT;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_VOLUME_SCATTER)) {
|
||||
shader_flag |= SHADER_EXCLUDE_SCATTER;
|
||||
}
|
||||
if (!(object->get_is_shadow_catcher())) {
|
||||
shader_flag |= SHADER_EXCLUDE_SHADOW_CATCHER;
|
||||
}
|
||||
const int shader_flag = light_object_shader_flags(object);
|
||||
|
||||
const size_t mesh_num_triangles = mesh->num_triangles();
|
||||
for (size_t i = 0; i < mesh_num_triangles; i++) {
|
||||
@@ -534,33 +536,13 @@ static void light_tree_leaf_emitters_copy_and_flatten(LightTreeFlatten &flatten,
|
||||
|
||||
if (emitter.is_triangle()) {
|
||||
/* Triangle. */
|
||||
int shader_flag = 0;
|
||||
Object *object = flatten.scene->objects[emitter.object_id];
|
||||
Mesh *mesh = static_cast<Mesh *>(object->get_geometry());
|
||||
Shader *shader = static_cast<Shader *>(
|
||||
mesh->get_used_shaders()[mesh->get_shader()[emitter.prim_id]]);
|
||||
|
||||
if (!(object->get_visibility() & PATH_RAY_CAMERA)) {
|
||||
shader_flag |= SHADER_EXCLUDE_CAMERA;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_DIFFUSE)) {
|
||||
shader_flag |= SHADER_EXCLUDE_DIFFUSE;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_GLOSSY)) {
|
||||
shader_flag |= SHADER_EXCLUDE_GLOSSY;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_TRANSMIT)) {
|
||||
shader_flag |= SHADER_EXCLUDE_TRANSMIT;
|
||||
}
|
||||
if (!(object->get_visibility() & PATH_RAY_VOLUME_SCATTER)) {
|
||||
shader_flag |= SHADER_EXCLUDE_SCATTER;
|
||||
}
|
||||
if (!(object->get_is_shadow_catcher())) {
|
||||
shader_flag |= SHADER_EXCLUDE_SHADOW_CATCHER;
|
||||
}
|
||||
|
||||
kemitter.triangle.id = emitter.prim_id + mesh->prim_offset;
|
||||
kemitter.shader_flag = shader_flag;
|
||||
kemitter.shader_flag = light_object_shader_flags(object);
|
||||
kemitter.object_id = emitter.object_id;
|
||||
kemitter.triangle.emission_sampling = shader->emission_sampling;
|
||||
flatten.triangle_array[emitter.prim_id + flatten.object_lookup_offset[emitter.object_id]] =
|
||||
@@ -1227,24 +1209,7 @@ void LightManager::device_update_lights(DeviceScene *dscene, Scene *scene)
|
||||
shader_id &= ~SHADER_CAST_SHADOW;
|
||||
}
|
||||
|
||||
if (!light->use_camera) {
|
||||
shader_id |= SHADER_EXCLUDE_CAMERA;
|
||||
}
|
||||
if (!light->use_diffuse) {
|
||||
shader_id |= SHADER_EXCLUDE_DIFFUSE;
|
||||
}
|
||||
if (!light->use_glossy) {
|
||||
shader_id |= SHADER_EXCLUDE_GLOSSY;
|
||||
}
|
||||
if (!light->use_transmission) {
|
||||
shader_id |= SHADER_EXCLUDE_TRANSMIT;
|
||||
}
|
||||
if (!light->use_scatter) {
|
||||
shader_id |= SHADER_EXCLUDE_SCATTER;
|
||||
}
|
||||
if (!light->is_shadow_catcher) {
|
||||
shader_id |= SHADER_EXCLUDE_SHADOW_CATCHER;
|
||||
}
|
||||
shader_id |= light_object_shader_flags(object);
|
||||
|
||||
klights[light_index].type = light->light_type;
|
||||
klights[light_index].strength[0] = light->strength.x;
|
||||
|
||||
@@ -51,14 +51,8 @@ class Light : public Geometry {
|
||||
|
||||
NODE_SOCKET_API(bool, cast_shadow)
|
||||
NODE_SOCKET_API(bool, use_mis)
|
||||
NODE_SOCKET_API(bool, use_camera)
|
||||
NODE_SOCKET_API(bool, use_diffuse)
|
||||
NODE_SOCKET_API(bool, use_glossy)
|
||||
NODE_SOCKET_API(bool, use_transmission)
|
||||
NODE_SOCKET_API(bool, use_scatter)
|
||||
NODE_SOCKET_API(bool, use_caustics)
|
||||
|
||||
NODE_SOCKET_API(bool, is_shadow_catcher)
|
||||
NODE_SOCKET_API(bool, is_portal)
|
||||
NODE_SOCKET_API(bool, is_enabled)
|
||||
|
||||
|
||||
@@ -22,9 +22,6 @@ BLOCKLIST_ALL = [
|
||||
"visibility_particles.blend",
|
||||
# Temporarily blocked for 4.4 lib upgrade, due to PNG alpha minor difference.
|
||||
"image_log_osl.blend",
|
||||
# Temporarily blocked for investigation
|
||||
"light_path_glossy_depth.blend",
|
||||
"light_path_is_glossy_ray.blend",
|
||||
]
|
||||
|
||||
# Blocklist that disables OSL specific tests for configurations that do not support OSL backend.
|
||||
|
||||
Reference in New Issue
Block a user