Blender V5.0
shadow_catcher.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8
10
11/* Check whether current surface bounce is where path is to be split for the shadow catcher. */
14 const int object_flag)
15{
16#ifdef __SHADOW_CATCHER__
17 if (!kernel_data.integrator.has_shadow_catcher) {
18 return false;
19 }
20
21 /* Check the flag first, avoiding fetches form global memory. */
22 if ((object_flag & SD_OBJECT_SHADOW_CATCHER) == 0) {
23 return false;
24 }
25 if (object_flag & SD_OBJECT_HOLDOUT_MASK) {
26 return false;
27 }
28
29 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
30
31 if ((path_flag & PATH_RAY_TRANSPARENT_BACKGROUND) == 0) {
32 /* Split only on primary rays, secondary bounces are to treat shadow catcher as a regular
33 * object. */
34 return false;
35 }
36
37 if (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) {
38 return false;
39 }
40
41 return true;
42#else
43 (void)object_flag;
44 return false;
45#endif
46}
47
48/* Check whether the current path can still split. */
50{
52 return false;
53 }
54
55 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
56
57 if (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) {
58 /* Shadow catcher was already hit and the state was split. No further split is allowed. */
59 return false;
60 }
61
62 return (path_flag & PATH_RAY_TRANSPARENT_BACKGROUND) != 0;
63}
64
65#ifdef __SHADOW_CATCHER__
66
67ccl_device_forceinline bool kernel_shadow_catcher_is_matte_path(const uint32_t path_flag)
68{
69 return (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) == 0;
70}
71
72ccl_device_forceinline bool kernel_shadow_catcher_is_object_pass(const uint32_t path_flag)
73{
74 return path_flag & PATH_RAY_SHADOW_CATCHER_PASS;
75}
76
77#endif /* __SHADOW_CATCHER__ */
78
#define kernel_data
#define ccl_device_forceinline
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ PATH_RAY_SHADOW_CATCHER_HIT
@ PATH_RAY_SHADOW_CATCHER_PASS
@ PATH_RAY_TRANSPARENT_BACKGROUND
@ SD_OBJECT_HOLDOUT_MASK
@ SD_OBJECT_SHADOW_CATCHER
static ulong state[N]
CCL_NAMESPACE_BEGIN ccl_device_inline bool kernel_shadow_catcher_is_path_split_bounce(KernelGlobals kg, IntegratorState state, const int object_flag)
ccl_device_inline bool kernel_shadow_catcher_path_can_split(ConstIntegratorState state)
#define INTEGRATOR_STATE(state, nested_struct, member)
Definition state.h:235
IntegratorStateCPU * IntegratorState
Definition state.h:228
const IntegratorStateCPU * ConstIntegratorState
Definition state.h:229
CCL_NAMESPACE_BEGIN ccl_device_forceinline bool integrator_path_is_terminated(ConstIntegratorState state)
Definition state_flow.h:41
uint8_t flag
Definition wm_window.cc:145