Blender  V3.3
closures.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Adapted from Open Shading Language
4  * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
5  * All Rights Reserved.
6  *
7  * Modifications Copyright 2011-2022 Blender Foundation. */
8 
9 #ifndef __OSL_CLOSURES_H__
10 #define __OSL_CLOSURES_H__
11 
12 #include "kernel/types.h"
13 #include "util/types.h"
14 
15 #include <OSL/genclosure.h>
16 #include <OSL/oslclosure.h>
17 #include <OSL/oslexec.h>
18 
20 
21 OSL::ClosureParam *closure_emission_params();
22 OSL::ClosureParam *closure_background_params();
23 OSL::ClosureParam *closure_holdout_params();
24 OSL::ClosureParam *closure_bsdf_diffuse_ramp_params();
25 OSL::ClosureParam *closure_bsdf_phong_ramp_params();
26 OSL::ClosureParam *closure_bsdf_transparent_params();
27 OSL::ClosureParam *closure_bssrdf_params();
28 OSL::ClosureParam *closure_absorption_params();
29 OSL::ClosureParam *closure_henyey_greenstein_params();
30 OSL::ClosureParam *closure_bsdf_microfacet_params();
31 OSL::ClosureParam *closure_bsdf_microfacet_multi_ggx_params();
39 OSL::ClosureParam *closure_bsdf_principled_clearcoat_params();
40 
41 void closure_emission_prepare(OSL::RendererServices *, int id, void *data);
42 void closure_background_prepare(OSL::RendererServices *, int id, void *data);
43 void closure_holdout_prepare(OSL::RendererServices *, int id, void *data);
44 void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *data);
45 void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data);
46 void closure_bsdf_transparent_prepare(OSL::RendererServices *, int id, void *data);
47 void closure_bssrdf_prepare(OSL::RendererServices *, int id, void *data);
48 void closure_absorption_prepare(OSL::RendererServices *, int id, void *data);
49 void closure_henyey_greenstein_prepare(OSL::RendererServices *, int id, void *data);
50 void closure_bsdf_microfacet_prepare(OSL::RendererServices *, int id, void *data);
51 void closure_bsdf_microfacet_multi_ggx_prepare(OSL::RendererServices *, int id, void *data);
52 void closure_bsdf_microfacet_multi_ggx_glass_prepare(OSL::RendererServices *, int id, void *data);
53 void closure_bsdf_microfacet_multi_ggx_aniso_prepare(OSL::RendererServices *, int id, void *data);
54 void closure_bsdf_microfacet_ggx_fresnel_prepare(OSL::RendererServices *, int id, void *data);
56  int id,
57  void *data);
59  int id,
60  void *data);
62  int id,
63  void *data);
65  int id,
66  void *data);
67 void closure_bsdf_principled_clearcoat_prepare(OSL::RendererServices *, int id, void *data);
68 void closure_bsdf_principled_hair_prepare(OSL::RendererServices *, int id, void *data);
69 
70 #define CCLOSURE_PREPARE(name, classname) \
71  void name(RendererServices *, int id, void *data) \
72  { \
73  memset(data, 0, sizeof(classname)); \
74  new (data) classname(); \
75  }
76 
77 #define CCLOSURE_PREPARE_STATIC(name, classname) static CCLOSURE_PREPARE(name, classname)
78 
79 #define CLOSURE_FLOAT3_PARAM(st, fld) \
80  { \
81  TypeDesc::TypeVector, (int)reckless_offsetof(st, fld), NULL, sizeof(OSL::Vec3) \
82  }
83 
84 #define BSDF_CLOSURE_FLOAT_PARAM(st, fld) CLOSURE_FLOAT_PARAM(st, fld),
85 #define BSDF_CLOSURE_FLOAT3_PARAM(st, fld) CLOSURE_FLOAT3_PARAM(st, fld),
86 
87 #define TO_VEC3(v) OSL::Vec3(v.x, v.y, v.z)
88 #define TO_COLOR3(v) OSL::Color3(v.x, v.y, v.z)
89 #define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
90 
91 /* Closure */
92 
94  public:
95  virtual void setup(ShaderData *sd, uint32_t path_flag, float3 weight) = 0;
96 
97  OSL::ustring label;
98 };
99 
100 /* BSDF */
101 
103  public:
104  bool skip(const ShaderData *sd, uint32_t path_flag, int scattering);
105 };
106 
107 #define BSDF_CLOSURE_CLASS_BEGIN(Upper, lower, structname, TYPE) \
108 \
109  class Upper##Closure : public CBSDFClosure { \
110  public: \
111  structname params; \
112  float3 unused; \
113 \
114  void setup(ShaderData *sd, uint32_t path_flag, float3 weight) \
115  { \
116  if (!skip(sd, path_flag, TYPE)) { \
117  params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); \
118  structname *bsdf = (structname *)bsdf_alloc_osl(sd, sizeof(structname), weight, &params); \
119  sd->flag |= (bsdf) ? bsdf_##lower##_setup(bsdf) : 0; \
120  } \
121  } \
122  }; \
123 \
124  static ClosureParam *bsdf_##lower##_params() \
125  { \
126  static ClosureParam params[] = {
127 
128 /* parameters */
129 
130 #define BSDF_CLOSURE_CLASS_END(Upper, lower) \
131  CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), CLOSURE_FINISH_PARAM(Upper##Closure) \
132  } \
133  ; \
134  return params; \
135  } \
136 \
137  CCLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
138 
140 
141 #endif /* __OSL_CLOSURES_H__ */
bool skip(const ShaderData *sd, uint32_t path_flag, int scattering)
Definition: closures.cpp:478
virtual void setup(ShaderData *sd, uint32_t path_flag, float3 weight)=0
OSL::ustring label
Definition: closures.h:97
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_params()
Definition: closures.cpp:723
OSL::ClosureParam * closure_bsdf_microfacet_ggx_aniso_fresnel_params()
Definition: closures.cpp:653
void closure_bssrdf_prepare(OSL::RendererServices *, int id, void *data)
void closure_emission_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bssrdf_params()
Definition: bssrdf.cpp:83
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_aniso_fresnel_params()
Definition: closures.cpp:882
CCL_NAMESPACE_BEGIN OSL::ClosureParam * closure_emission_params()
Definition: emissive.cpp:41
OSL::ClosureParam * closure_bsdf_microfacet_ggx_fresnel_params()
Definition: closures.cpp:624
void closure_bsdf_transparent_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bsdf_microfacet_params()
Definition: closures.cpp:555
void closure_bsdf_microfacet_multi_ggx_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_microfacet_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_principled_clearcoat_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_microfacet_ggx_fresnel_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bsdf_transparent_params()
Definition: closures.cpp:948
OSL::ClosureParam * closure_bsdf_phong_ramp_params()
OSL::ClosureParam * closure_absorption_params()
Definition: closures.cpp:967
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_glass_fresnel_params()
Definition: closures.cpp:920
void closure_bsdf_microfacet_multi_ggx_fresnel_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_microfacet_ggx_aniso_fresnel_prepare(OSL::RendererServices *, int id, void *data)
void closure_henyey_greenstein_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bsdf_diffuse_ramp_params()
OSL::ClosureParam * closure_henyey_greenstein_params()
Definition: closures.cpp:994
void closure_bsdf_principled_hair_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bsdf_principled_clearcoat_params()
Definition: closures.cpp:299
void closure_background_prepare(OSL::RendererServices *, int id, void *data)
void closure_absorption_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_holdout_params()
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_fresnel_params()
Definition: closures.cpp:852
void closure_bsdf_microfacet_multi_ggx_aniso_prepare(OSL::RendererServices *, int id, void *data)
void closure_holdout_prepare(OSL::RendererServices *, int id, void *data)
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_aniso_params()
Definition: closures.cpp:751
OSL::ClosureParam * closure_bsdf_microfacet_multi_ggx_glass_params()
Definition: closures.cpp:786
OSL::ClosureParam * closure_background_params()
void closure_bsdf_microfacet_multi_ggx_glass_fresnel_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_microfacet_multi_ggx_glass_prepare(OSL::RendererServices *, int id, void *data)
void closure_bsdf_microfacet_multi_ggx_aniso_fresnel_prepare(OSL::RendererServices *, int id, void *data)
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
ShaderData
Definition: kernel/types.h:925
unsigned int uint32_t
Definition: stdint.h:80