Blender V4.3
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
9
11
12/* Check whether current surface bounce is where path is to be split for the shadow catcher. */
15 const int object_flag)
16{
17#ifdef __SHADOW_CATCHER__
18 if (!kernel_data.integrator.has_shadow_catcher) {
19 return false;
20 }
21
22 /* Check the flag first, avoiding fetches form global memory. */
23 if ((object_flag & SD_OBJECT_SHADOW_CATCHER) == 0) {
24 return false;
25 }
26 if (object_flag & SD_OBJECT_HOLDOUT_MASK) {
27 return false;
28 }
29
30 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
31
32 if ((path_flag & PATH_RAY_TRANSPARENT_BACKGROUND) == 0) {
33 /* Split only on primary rays, secondary bounces are to treat shadow catcher as a regular
34 * object. */
35 return false;
36 }
37
38 if (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) {
39 return false;
40 }
41
42 return true;
43#else
44 (void)object_flag;
45 return false;
46#endif
47}
48
49/* Check whether the current path can still split. */
52{
54 return false;
55 }
56
57 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
58
59 if (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) {
60 /* Shadow catcher was already hit and the state was split. No further split is allowed. */
61 return false;
62 }
63
64 return (path_flag & PATH_RAY_TRANSPARENT_BACKGROUND) != 0;
65}
66
67#ifdef __SHADOW_CATCHER__
68
69ccl_device_forceinline bool kernel_shadow_catcher_is_matte_path(const uint32_t path_flag)
70{
71 return (path_flag & PATH_RAY_SHADOW_CATCHER_HIT) == 0;
72}
73
74ccl_device_forceinline bool kernel_shadow_catcher_is_object_pass(const uint32_t path_flag)
75{
76 return path_flag & PATH_RAY_SHADOW_CATCHER_PASS;
77}
78
79#endif /* __SHADOW_CATCHER__ */
80
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define ccl_device_forceinline
#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_device_inline bool kernel_shadow_catcher_path_can_split(KernelGlobals kg, ConstIntegratorState state)
CCL_NAMESPACE_BEGIN ccl_device_inline bool kernel_shadow_catcher_is_path_split_bounce(KernelGlobals kg, IntegratorState state, const int object_flag)
IntegratorStateCPU *ccl_restrict IntegratorState
Definition state.h:228
const IntegratorStateCPU *ccl_restrict ConstIntegratorState
Definition state.h:229
#define INTEGRATOR_STATE(state, nested_struct, member)
Definition state.h:235
CCL_NAMESPACE_BEGIN ccl_device_forceinline bool integrator_path_is_terminated(ConstIntegratorState state)
Definition state_flow.h:33
unsigned int uint32_t
Definition stdint.h:80
uint8_t flag
Definition wm_window.cc:138