mirror of
https://github.com/blender/blender
synced 2026-09-29 04:37:17 +03:00
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:
parent
d82e5e068a
commit
6e7a0eee32
8 changed files with 16 additions and 10 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3d4cc55a8147622436202446629386d1ba0885a70f76334e65c0de8a1edb59d9
|
||||
size 10234
|
||||
oid sha256:bc368d7d3d7dbd286de10b228facc4d46580e21388aa2e73ba18831200d27d91
|
||||
size 9815
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue