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:
Brecht Van Lommel
2025-02-25 10:55:26 +01:00
parent 10482f5fba
commit 655ccf1d7a
6 changed files with 39 additions and 86 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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)) {

View File

@@ -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;

View File

@@ -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)

View File

@@ -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.