Cycles: Raycast Visibility Toggle

Cycles implementation of #157799.
Allows removing objects from Raycast Node queries.

Adds `PathRayVisibilityFlag::PATH_RAY_VISIBILITY_RAYCAST` .
OSL adds a new `__raycast__` traceset.

Pull Request: https://projects.blender.org/blender/blender/pulls/158816
This commit is contained in:
Miguel Pozo 2026-06-17 20:37:50 +02:00 • committed by Miguel Pozo
parent d82e5e068a
commit 6e7a0eee32
8 changed files with 16 additions and 10 deletions

View file

@ -1507,6 +1507,7 @@ class CYCLES_OBJECT_PT_visibility_ray_visibility(CyclesButtonsPanel, Panel):
if ob.type != 'LIGHT':
sub = col.column()
sub.prop(ob, "visible_shadow", text="Shadow")
sub.prop(ob, "visible_raycast", text="Raycast")
class CYCLES_OBJECT_PT_visibility_culling(CyclesButtonsPanel, Panel):

View file

@ -741,6 +741,9 @@ static inline PathRayVisibility object_ray_visibility(blender::Object &b_ob)
visibility |= ((b_ob.visibility_flag & blender::OB_HIDE_VOLUME_SCATTER) == 0) ?
PATH_RAY_VISIBILITY_VOLUME_SCATTER :
PATH_RAY_VISIBILITY_NONE;
visibility |= ((b_ob.visibility_flag & blender::OB_HIDE_RAYCAST) == 0) ?
PATH_RAY_VISIBILITY_RAYCAST :
PATH_RAY_VISIBILITY_NONE;
return visibility;
}

View file

@ -570,8 +570,10 @@ bool OSLRenderServices::trace(TraceOpt &options,
}
else {
/* Ray-trace, leaving out shadow opaque to avoid early exit. */
const PathRayVisibility visibility = PATH_RAY_VISIBILITY_ALL &
~PATH_RAY_VISIBILITY_SHADOW_OPAQUE;
PathRayVisibility visibility = PATH_RAY_VISIBILITY_ALL & ~PATH_RAY_VISIBILITY_SHADOW_OPAQUE;
if (options.traceset == DeviceStrings::u_traceset_raycast) {
visibility = PATH_RAY_VISIBILITY_RAYCAST;
}
tracedata->hit = scene_intersect(kg, &ray, visibility, &tracedata->isect);
if (tracedata->hit) {
tracedata->self_hit = tracedata->isect.object == sd->object;

View file

@ -36,7 +36,7 @@ shader node_raycast(point Position = P,
"mindist",
mindist,
"traceset",
only_local ? "__only_local__" : ""))
only_local ? "__only_local__" : "__raycast__"))
{
IsHit = 1.0;
getmessage("trace", "hitself", SelfHit);

View file

@ -111,6 +111,7 @@ OSL_DEVICE_STRING(u_distance, "distance", 5661183123366514158ull)
OSL_DEVICE_STRING(u_index, "index", 15907549540151602841ull)
OSL_DEVICE_STRING(u_trace, "trace", 13264932728578201327ull)
OSL_DEVICE_STRING(u_traceset_only_local, "__only_local__", 12891670648956128852ull)
OSL_DEVICE_STRING(u_traceset_raycast, "__raycast__", 2367107625979882517ull)
OSL_DEVICE_STRING(u_hit, "hit", 7529033939518063282ull)
OSL_DEVICE_STRING(u_hitdist, "hitdist", 17066342024105335641ull)
OSL_DEVICE_STRING(u_hitself, "hitself", 12209754783026028319ull)

View file

@ -76,10 +76,7 @@ ccl_device bool svm_raycast(KernelGlobals kg,
isect = local_isect.hits[0];
}
else {
/* Ray-trace, leaving out shadow opaque to avoid early exit. */
const PathRayVisibility visibility = PATH_RAY_VISIBILITY_ALL &
~PATH_RAY_VISIBILITY_SHADOW_OPAQUE;
if (!scene_intersect(kg, &ray, visibility, &isect)) {
if (!scene_intersect(kg, &ray, PATH_RAY_VISIBILITY_RAYCAST, &isect)) {
return false;
}
}

View file

@ -163,10 +163,12 @@ enum PathRayVisibilityFlag : uint32_t {
PATH_RAY_VISIBILITY_SHADOW = (PATH_RAY_VISIBILITY_SHADOW_OPAQUE |
PATH_RAY_VISIBILITY_SHADOW_TRANSPARENT),
PATH_RAY_VISIBILITY_RAYCAST = (1U << 7U),
/* Set of flags used for ray visibility for intersection.
*
* NOTE: SHADOW_CATCHER and OSL macros below assume there are no more than 16 visibility bits. */
PATH_RAY_VISIBILITY_ALL = ((1U << 7U) - 1U),
PATH_RAY_VISIBILITY_ALL = ((1U << 8U) - 1U),
/* Special flag to tag unaligned BVH nodes.
* Only set and used in BVH nodes to distinguish how to interpret bounding box information stored

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3d4cc55a8147622436202446629386d1ba0885a70f76334e65c0de8a1edb59d9
size 10234
oid sha256:bc368d7d3d7dbd286de10b228facc4d46580e21388aa2e73ba18831200d27d91
size 9815