Blender V4.5
integrator.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "device/device.h"
6
7#include "scene/background.h"
8#include "scene/bake.h"
9#include "scene/camera.h"
10#include "scene/film.h"
11#include "scene/integrator.h"
12#include "scene/light.h"
13#include "scene/object.h"
14#include "scene/scene.h"
15#include "scene/shader.h"
16#include "scene/stats.h"
18
19#include "kernel/types.h"
20
21#include "util/hash.h"
22#include "util/log.h"
23#include "util/task.h"
24#include "util/time.h"
25
27
29{
30 NodeType *type = NodeType::add("integrator", create);
31
32 SOCKET_INT(min_bounce, "Min Bounce", 0);
33 SOCKET_INT(max_bounce, "Max Bounce", 7);
34
35 SOCKET_INT(max_diffuse_bounce, "Max Diffuse Bounce", 7);
36 SOCKET_INT(max_glossy_bounce, "Max Glossy Bounce", 7);
37 SOCKET_INT(max_transmission_bounce, "Max Transmission Bounce", 7);
38 SOCKET_INT(max_volume_bounce, "Max Volume Bounce", 7);
39
40 SOCKET_INT(transparent_min_bounce, "Transparent Min Bounce", 0);
41 SOCKET_INT(transparent_max_bounce, "Transparent Max Bounce", 7);
42
43#ifdef WITH_CYCLES_DEBUG
44 static NodeEnum direct_light_sampling_type_enum;
45 direct_light_sampling_type_enum.insert("multiple_importance_sampling",
47 direct_light_sampling_type_enum.insert("forward_path_tracing", DIRECT_LIGHT_SAMPLING_FORWARD);
48 direct_light_sampling_type_enum.insert("next_event_estimation", DIRECT_LIGHT_SAMPLING_NEE);
49 SOCKET_ENUM(direct_light_sampling_type,
50 "Direct Light Sampling Type",
51 direct_light_sampling_type_enum,
53#endif
54
55 SOCKET_INT(ao_bounces, "AO Bounces", 0);
56 SOCKET_FLOAT(ao_factor, "AO Factor", 0.0f);
57 SOCKET_FLOAT(ao_distance, "AO Distance", FLT_MAX);
58 SOCKET_FLOAT(ao_additive_factor, "AO Additive Factor", 0.0f);
59
60 SOCKET_INT(volume_max_steps, "Volume Max Steps", 1024);
61 SOCKET_FLOAT(volume_step_rate, "Volume Step Rate", 1.0f);
62
63 static NodeEnum guiding_distribution_enum;
64 guiding_distribution_enum.insert("PARALLAX_AWARE_VMM", GUIDING_TYPE_PARALLAX_AWARE_VMM);
65 guiding_distribution_enum.insert("DIRECTIONAL_QUAD_TREE", GUIDING_TYPE_DIRECTIONAL_QUAD_TREE);
66 guiding_distribution_enum.insert("VMM", GUIDING_TYPE_VMM);
67
68 static NodeEnum guiding_directional_sampling_type_enum;
69 guiding_directional_sampling_type_enum.insert("MIS",
71 guiding_directional_sampling_type_enum.insert("RIS", GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS);
72 guiding_directional_sampling_type_enum.insert("ROUGHNESS",
74
75 SOCKET_BOOLEAN(use_guiding, "Guiding", false);
76 SOCKET_BOOLEAN(deterministic_guiding, "Deterministic Guiding", true);
77 SOCKET_BOOLEAN(use_surface_guiding, "Surface Guiding", true);
78 SOCKET_FLOAT(surface_guiding_probability, "Surface Guiding Probability", 0.5f);
79 SOCKET_BOOLEAN(use_volume_guiding, "Volume Guiding", true);
80 SOCKET_FLOAT(volume_guiding_probability, "Volume Guiding Probability", 0.5f);
81 SOCKET_INT(guiding_training_samples, "Training Samples", 128);
82 SOCKET_BOOLEAN(use_guiding_direct_light, "Guide Direct Light", true);
83 SOCKET_BOOLEAN(use_guiding_mis_weights, "Use MIS Weights", true);
84 SOCKET_ENUM(guiding_distribution_type,
85 "Guiding Distribution Type",
86 guiding_distribution_enum,
88 SOCKET_ENUM(guiding_directional_sampling_type,
89 "Guiding Directional Sampling Type",
90 guiding_directional_sampling_type_enum,
92 SOCKET_FLOAT(guiding_roughness_threshold, "Guiding Roughness Threshold", 0.05f);
93
94 SOCKET_BOOLEAN(caustics_reflective, "Reflective Caustics", true);
95 SOCKET_BOOLEAN(caustics_refractive, "Refractive Caustics", true);
96 SOCKET_FLOAT(filter_glossy, "Filter Glossy", 0.0f);
97
98 SOCKET_BOOLEAN(use_direct_light, "Use Direct Light", true);
99 SOCKET_BOOLEAN(use_indirect_light, "Use Indirect Light", true);
100 SOCKET_BOOLEAN(use_diffuse, "Use Diffuse", true);
101 SOCKET_BOOLEAN(use_glossy, "Use Glossy", true);
102 SOCKET_BOOLEAN(use_transmission, "Use Transmission", true);
103 SOCKET_BOOLEAN(use_emission, "Use Emission", true);
104
105 SOCKET_INT(seed, "Seed", 0);
106 SOCKET_FLOAT(sample_clamp_direct, "Sample Clamp Direct", 0.0f);
107 SOCKET_FLOAT(sample_clamp_indirect, "Sample Clamp Indirect", 10.0f);
108 SOCKET_BOOLEAN(motion_blur, "Motion Blur", false);
109
110 SOCKET_INT(aa_samples, "AA Samples", 0);
111 SOCKET_BOOLEAN(use_sample_subset, "Use Sample Subset", false);
112 SOCKET_INT(sample_subset_offset, "Sample Subset Offset", 0);
113 SOCKET_INT(sample_subset_length, "Sample Subset Length", MAX_SAMPLES);
114
115 SOCKET_BOOLEAN(use_adaptive_sampling, "Use Adaptive Sampling", true);
116 SOCKET_FLOAT(adaptive_threshold, "Adaptive Threshold", 0.01f);
117 SOCKET_INT(adaptive_min_samples, "Adaptive Min Samples", 0);
118
119 SOCKET_BOOLEAN(use_light_tree, "Use light tree to optimize many light sampling", true);
120 SOCKET_FLOAT(light_sampling_threshold, "Light Sampling Threshold", 0.0f);
121
122 static NodeEnum sampling_pattern_enum;
123 sampling_pattern_enum.insert("sobol_burley", SAMPLING_PATTERN_SOBOL_BURLEY);
124 sampling_pattern_enum.insert("tabulated_sobol", SAMPLING_PATTERN_TABULATED_SOBOL);
125 sampling_pattern_enum.insert("blue_noise_pure", SAMPLING_PATTERN_BLUE_NOISE_PURE);
126 sampling_pattern_enum.insert("blue_noise_round", SAMPLING_PATTERN_BLUE_NOISE_ROUND);
127 sampling_pattern_enum.insert("blue_noise_first", SAMPLING_PATTERN_BLUE_NOISE_FIRST);
128 SOCKET_ENUM(sampling_pattern,
129 "Sampling Pattern",
130 sampling_pattern_enum,
132 SOCKET_FLOAT(scrambling_distance, "Scrambling Distance", 1.0f);
133
134 static NodeEnum denoiser_type_enum;
135 denoiser_type_enum.insert("none", DENOISER_NONE);
136 denoiser_type_enum.insert("optix", DENOISER_OPTIX);
137 denoiser_type_enum.insert("openimagedenoise", DENOISER_OPENIMAGEDENOISE);
138
139 static NodeEnum denoiser_prefilter_enum;
140 denoiser_prefilter_enum.insert("none", DENOISER_PREFILTER_NONE);
141 denoiser_prefilter_enum.insert("fast", DENOISER_PREFILTER_FAST);
142 denoiser_prefilter_enum.insert("accurate", DENOISER_PREFILTER_ACCURATE);
143
144 static NodeEnum denoiser_quality_enum;
145 denoiser_quality_enum.insert("high", DENOISER_QUALITY_HIGH);
146 denoiser_quality_enum.insert("balanced", DENOISER_QUALITY_BALANCED);
147 denoiser_quality_enum.insert("fast", DENOISER_QUALITY_FAST);
148
149 /* Default to accurate denoising with OpenImageDenoise. For interactive viewport
150 * it's best use OptiX and disable the normal pass since it does not always have
151 * the desired effect for that denoiser. */
152 SOCKET_BOOLEAN(use_denoise, "Use Denoiser", false);
153 SOCKET_ENUM(denoiser_type, "Denoiser Type", denoiser_type_enum, DENOISER_OPENIMAGEDENOISE);
154 SOCKET_INT(denoise_start_sample, "Start Sample to Denoise", 0);
155 SOCKET_BOOLEAN(use_denoise_pass_albedo, "Use Albedo Pass for Denoiser", true);
156 SOCKET_BOOLEAN(use_denoise_pass_normal, "Use Normal Pass for Denoiser", true);
157 SOCKET_ENUM(denoiser_prefilter,
158 "Denoiser Prefilter",
159 denoiser_prefilter_enum,
161 SOCKET_BOOLEAN(denoise_use_gpu, "Denoise on GPU", true);
162 SOCKET_ENUM(denoiser_quality, "Denoiser Quality", denoiser_quality_enum, DENOISER_QUALITY_HIGH);
163
164 return type;
165}
166
167Integrator::Integrator() : Node(get_node_type()) {}
168
169Integrator::~Integrator() = default;
170
171void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene)
172{
173 if (!is_modified()) {
174 return;
175 }
176
177 const scoped_callback_timer timer([scene](double time) {
178 if (scene->update_stats) {
179 scene->update_stats->integrator.times.add_entry({"device_update", time});
180 }
181 });
182
183 KernelIntegrator *kintegrator = &dscene->data.integrator;
184
185 device_free(device, dscene);
186
187 /* integrator parameters */
188 kintegrator->min_bounce = min_bounce + 1;
189 kintegrator->max_bounce = max_bounce + 1;
190
191 kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
192 kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
193 kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
194 kintegrator->max_volume_bounce = max_volume_bounce + 1;
195
196 kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
197 kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
198
199 kintegrator->ao_bounces = (ao_factor != 0.0f) ? ao_bounces : 0;
200 kintegrator->ao_bounces_distance = ao_distance;
201 kintegrator->ao_bounces_factor = ao_factor;
202 kintegrator->ao_additive_factor = ao_additive_factor;
203
204#ifdef WITH_CYCLES_DEBUG
205 kintegrator->direct_light_sampling_type = direct_light_sampling_type;
206#else
207 kintegrator->direct_light_sampling_type = DIRECT_LIGHT_SAMPLING_MIS;
208#endif
209
210 /* Transparent Shadows
211 * We only need to enable transparent shadows, if we actually have
212 * transparent shaders in the scene. Otherwise we can disable it
213 * to improve performance a bit. */
214 kintegrator->transparent_shadows = false;
215 for (Shader *shader : scene->shaders) {
216 /* keep this in sync with SD_HAS_TRANSPARENT_SHADOW in shader.cpp */
217 if ((shader->has_surface_transparent && shader->get_use_transparent_shadow()) ||
218 shader->has_volume)
219 {
220 kintegrator->transparent_shadows = true;
221 break;
222 }
223 }
224
225 kintegrator->volume_max_steps = volume_max_steps;
226 kintegrator->volume_step_rate = volume_step_rate;
227
228 kintegrator->caustics_reflective = caustics_reflective;
229 kintegrator->caustics_refractive = caustics_refractive;
230 kintegrator->filter_glossy = (filter_glossy == 0.0f) ? FLT_MAX : 1.0f / filter_glossy;
231
232 kintegrator->filter_closures = 0;
233 if (!use_direct_light) {
234 kintegrator->filter_closures |= FILTER_CLOSURE_DIRECT_LIGHT;
235 }
236 if (!use_indirect_light) {
237 kintegrator->min_bounce = 1;
238 kintegrator->max_bounce = 1;
239 }
240 if (!use_diffuse) {
241 kintegrator->filter_closures |= FILTER_CLOSURE_DIFFUSE;
242 }
243 if (!use_glossy) {
244 kintegrator->filter_closures |= FILTER_CLOSURE_GLOSSY;
245 }
246 if (!use_transmission) {
247 kintegrator->filter_closures |= FILTER_CLOSURE_TRANSMISSION;
248 }
249 if (!use_emission) {
250 kintegrator->filter_closures |= FILTER_CLOSURE_EMISSION;
251 }
252 if (scene->bake_manager->get_baking()) {
253 /* Baking does not need to trace through transparency, we only want to bake
254 * the object itself. */
255 kintegrator->filter_closures |= FILTER_CLOSURE_TRANSPARENT;
256 }
257
258 const GuidingParams guiding_params = get_guiding_params(device);
259 kintegrator->use_guiding = guiding_params.use;
260 kintegrator->train_guiding = kintegrator->use_guiding;
261 kintegrator->use_surface_guiding = guiding_params.use_surface_guiding;
262 kintegrator->use_volume_guiding = guiding_params.use_volume_guiding;
263 kintegrator->surface_guiding_probability = surface_guiding_probability;
264 kintegrator->volume_guiding_probability = volume_guiding_probability;
265 kintegrator->use_guiding_direct_light = use_guiding_direct_light;
266 kintegrator->use_guiding_mis_weights = use_guiding_mis_weights;
267 kintegrator->guiding_distribution_type = guiding_params.type;
268 kintegrator->guiding_directional_sampling_type = guiding_params.sampling_type;
269 kintegrator->guiding_roughness_threshold = guiding_params.roughness_threshold;
270
271 kintegrator->sample_clamp_direct = (sample_clamp_direct == 0.0f) ? FLT_MAX :
272 sample_clamp_direct * 3.0f;
273 kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f) ?
274 FLT_MAX :
275 sample_clamp_indirect * 3.0f;
276
277 const int clamped_aa_samples = min(aa_samples, MAX_SAMPLES);
278
279 kintegrator->sampling_pattern = sampling_pattern;
280 kintegrator->scrambling_distance = scrambling_distance;
281 kintegrator->sobol_index_mask = reverse_integer_bits(next_power_of_two(clamped_aa_samples - 1) -
282 1);
283 kintegrator->blue_noise_sequence_length = clamped_aa_samples;
284 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_ROUND) {
285 if (!is_power_of_two(clamped_aa_samples)) {
286 kintegrator->blue_noise_sequence_length = next_power_of_two(clamped_aa_samples);
287 }
288 kintegrator->sampling_pattern = SAMPLING_PATTERN_BLUE_NOISE_PURE;
289 }
290 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_FIRST) {
291 kintegrator->blue_noise_sequence_length -= 1;
292 }
293
294 /* The blue-noise sampler needs a randomized seed to scramble properly, providing e.g. 0 won't
295 * work properly. Therefore, hash the seed in those cases. */
296 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_FIRST ||
297 kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_PURE)
298 {
299 kintegrator->seed = hash_uint(seed);
300 }
301 else {
302 kintegrator->seed = seed;
303 }
304
305 /* NOTE: The kintegrator->use_light_tree is assigned to the efficient value in the light manager,
306 * and the synchronization code is expected to tag the light manager for update when the
307 * `use_light_tree` is changed. */
308 if (light_sampling_threshold > 0.0f && !kintegrator->use_light_tree) {
309 kintegrator->light_inv_rr_threshold = scene->film->get_exposure() / light_sampling_threshold;
310 }
311 else {
312 kintegrator->light_inv_rr_threshold = 0.0f;
313 }
314
315 /* Build pre-tabulated Sobol samples if needed. */
316 const int sequence_size = clamp(
318 const int table_size = sequence_size * NUM_TAB_SOBOL_PATTERNS * NUM_TAB_SOBOL_DIMENSIONS;
319 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_TABULATED_SOBOL &&
320 dscene->sample_pattern_lut.size() != table_size)
321 {
322 kintegrator->tabulated_sobol_sequence_size = sequence_size;
323
324 if (dscene->sample_pattern_lut.size() != 0) {
325 dscene->sample_pattern_lut.free();
326 }
327 float4 *directions = (float4 *)dscene->sample_pattern_lut.alloc(table_size);
328 TaskPool pool;
329 for (int j = 0; j < NUM_TAB_SOBOL_PATTERNS; ++j) {
330 float4 *sequence = directions + j * sequence_size;
331 pool.push([sequence, sequence_size, j] {
332 tabulated_sobol_generate_4D(sequence, sequence_size, j);
333 });
334 }
335 pool.wait_work();
336
338 }
339
340 kintegrator->has_shadow_catcher = scene->has_shadow_catcher();
341
344}
345
346void Integrator::device_free(Device * /*unused*/, DeviceScene *dscene, bool force_free)
347{
348 dscene->sample_pattern_lut.free_if_need_realloc(force_free);
349}
350
351void Integrator::tag_update(Scene *scene, const uint32_t flag)
352{
353 if (flag & UPDATE_ALL) {
354 tag_modified();
355 }
356
357 if (flag & AO_PASS_MODIFIED) {
358 /* tag only the ao_bounces socket as modified so we avoid updating sample_pattern_lut
359 * unnecessarily */
360 tag_ao_bounces_modified();
361 }
362
363 if (motion_blur_is_modified()) {
364 scene->object_manager->tag_update(scene, ObjectManager::MOTION_BLUR_MODIFIED);
365 scene->camera->tag_modified();
366 }
367}
368
370{
371 uint kernel_features = 0;
372
373 if (ao_additive_factor != 0.0f) {
374 kernel_features |= KERNEL_FEATURE_AO_ADDITIVE;
375 }
376
377 if (get_use_light_tree()) {
378 kernel_features |= KERNEL_FEATURE_LIGHT_TREE;
379 }
380
381 return kernel_features;
382}
383
385{
386 AdaptiveSampling adaptive_sampling;
387
388 adaptive_sampling.use = use_adaptive_sampling;
389
390 if (!adaptive_sampling.use) {
391 return adaptive_sampling;
392 }
393
394 const int clamped_aa_samples = min(aa_samples, MAX_SAMPLES);
395
396 if (clamped_aa_samples > 0 && adaptive_threshold == 0.0f) {
397 adaptive_sampling.threshold = max(0.001f, 1.0f / (float)aa_samples);
398 VLOG_INFO << "Cycles adaptive sampling: automatic threshold = " << adaptive_sampling.threshold;
399 }
400 else {
401 adaptive_sampling.threshold = adaptive_threshold;
402 }
403
404 if (use_sample_subset && clamped_aa_samples > 0) {
405 const int subset_samples = max(
406 min(sample_subset_offset + sample_subset_length, clamped_aa_samples) -
407 sample_subset_offset,
408 0);
409
410 adaptive_sampling.threshold *= sqrtf((float)subset_samples / (float)clamped_aa_samples);
411 }
412
413 if (adaptive_sampling.threshold > 0 && adaptive_min_samples == 0) {
414 /* Threshold 0.1 -> 32, 0.01 -> 64, 0.001 -> 128.
415 * This is highly scene dependent, we make a guess that seemed to work well
416 * in various test scenes. */
417 const int min_samples = (int)ceilf(16.0f / powf(adaptive_sampling.threshold, 0.3f));
418 adaptive_sampling.min_samples = max(4, min_samples);
419 VLOG_INFO << "Cycles adaptive sampling: automatic min samples = "
420 << adaptive_sampling.min_samples;
421 }
422 else {
423 adaptive_sampling.min_samples = max(4, adaptive_min_samples);
424 }
425
426 /* Arbitrary factor that makes the threshold more similar to what is was before,
427 * and gives arguably more intuitive values. */
428 adaptive_sampling.threshold *= 5.0f;
429
430 adaptive_sampling.adaptive_step = 16;
431
432 DCHECK(is_power_of_two(adaptive_sampling.adaptive_step))
433 << "Adaptive step must be a power of two for bitwise operations to work";
434
435 return adaptive_sampling;
436}
437
439{
440 DenoiseParams denoise_params;
441
442 denoise_params.use = use_denoise;
443
444 denoise_params.type = denoiser_type;
445
446 denoise_params.use_gpu = denoise_use_gpu;
447
448 denoise_params.start_sample = denoise_start_sample;
449
450 denoise_params.use_pass_albedo = use_denoise_pass_albedo;
451 denoise_params.use_pass_normal = use_denoise_pass_normal;
452
453 denoise_params.prefilter = denoiser_prefilter;
454 denoise_params.quality = denoiser_quality;
455
456 return denoise_params;
457}
458
460{
461 const bool use = use_guiding && device->info.has_guiding;
462
463 GuidingParams guiding_params;
464 guiding_params.use_surface_guiding = use && use_surface_guiding &&
465 surface_guiding_probability > 0.0f;
466 guiding_params.use_volume_guiding = use && use_volume_guiding &&
467 volume_guiding_probability > 0.0f;
468 guiding_params.use = guiding_params.use_surface_guiding || guiding_params.use_volume_guiding;
469 guiding_params.type = guiding_distribution_type;
470 guiding_params.training_samples = guiding_training_samples;
471 guiding_params.deterministic = deterministic_guiding;
472 guiding_params.sampling_type = guiding_directional_sampling_type;
473 // In Blender/Cycles the user set roughness is squared to behave more linear.
474 guiding_params.roughness_threshold = guiding_roughness_threshold * guiding_roughness_threshold;
475 return guiding_params;
476}
unsigned int uint
static unsigned long seed
Definition btSoftBody.h:39
DenoiserType type
Definition denoise.h:59
DenoiserQuality quality
Definition denoise.h:76
bool use_gpu
Definition denoise.h:73
int start_sample
Definition denoise.h:62
DenoiserPrefilter prefilter
Definition denoise.h:75
NODE_DECLARE bool use
Definition denoise.h:56
bool use_pass_normal
Definition denoise.h:66
bool use_pass_albedo
Definition denoise.h:65
device_vector< float > sample_pattern_lut
Definition devicescene.h:84
KernelData data
Definition devicescene.h:89
DeviceInfo info
void tag_update(Scene *scene, const uint32_t flag)
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
DenoiseParams get_denoise_params() const
~Integrator() override
AdaptiveSampling get_adaptive_sampling() const
void device_free(Device *device, DeviceScene *dscene, bool force_free=false)
GuidingParams get_guiding_params(const Device *device) const
static const int MAX_SAMPLES
Definition integrator.h:79
uint get_kernel_features() const
bool has_volume
bool has_surface_transparent
size_t size() const
void free_if_need_realloc(bool force_free)
T * alloc(const size_t width, const size_t height=0, const size_t depth=0)
@ DENOISER_QUALITY_FAST
Definition denoise.h:44
@ DENOISER_QUALITY_BALANCED
Definition denoise.h:43
@ DENOISER_QUALITY_HIGH
Definition denoise.h:42
@ DENOISER_PREFILTER_FAST
Definition denoise.h:32
@ DENOISER_PREFILTER_NONE
Definition denoise.h:28
@ DENOISER_PREFILTER_ACCURATE
Definition denoise.h:36
@ DENOISER_NONE
Definition denoise.h:16
@ DENOISER_OPTIX
Definition denoise.h:12
@ DENOISER_OPENIMAGEDENOISE
Definition denoise.h:13
#define KERNEL_FEATURE_LIGHT_TREE
#define MIN_TAB_SOBOL_SAMPLES
#define NUM_TAB_SOBOL_DIMENSIONS
#define MAX_TAB_SOBOL_SAMPLES
#define NUM_TAB_SOBOL_PATTERNS
#define KERNEL_FEATURE_AO_ADDITIVE
#define powf(x, y)
#define CCL_NAMESPACE_END
#define ceilf(x)
#define sqrtf(x)
VecBase< float, 4 > float4
constexpr T clamp(T, U, U) RET
ccl_device_inline uint hash_uint(const uint kx)
Definition hash.h:77
@ FILTER_CLOSURE_EMISSION
@ FILTER_CLOSURE_GLOSSY
@ FILTER_CLOSURE_DIFFUSE
@ FILTER_CLOSURE_TRANSPARENT
@ FILTER_CLOSURE_DIRECT_LIGHT
@ FILTER_CLOSURE_TRANSMISSION
@ DIRECT_LIGHT_SAMPLING_MIS
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT_MIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS
@ SAMPLING_PATTERN_BLUE_NOISE_FIRST
@ SAMPLING_PATTERN_TABULATED_SOBOL
@ SAMPLING_PATTERN_BLUE_NOISE_PURE
@ SAMPLING_PATTERN_SOBOL_BURLEY
@ SAMPLING_PATTERN_BLUE_NOISE_ROUND
@ GUIDING_TYPE_VMM
@ GUIDING_TYPE_DIRECTIONAL_QUAD_TREE
@ GUIDING_TYPE_PARALLAX_AWARE_VMM
#define VLOG_INFO
Definition log.h:71
#define DCHECK(expression)
Definition log.h:50
ccl_device_inline uint32_t reverse_integer_bits(uint32_t x)
Definition math_base.h:787
ccl_device_inline uint next_power_of_two(const uint x)
Definition math_base.h:771
#define SOCKET_FLOAT(name, ui_name, default_value,...)
Definition node_type.h:200
#define SOCKET_INT(name, ui_name, default_value,...)
Definition node_type.h:194
#define NODE_DEFINE(structname)
Definition node_type.h:148
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
Definition node_type.h:192
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
Definition node_type.h:216
#define min(a, b)
Definition sort.cc:36
#define FLT_MAX
Definition stdcycles.h:14
GuidingDirectionalSamplingType sampling_type
GuidingDistributionType type
void insert(const char *x, const int y)
Definition node_enum.h:21
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=nullptr)
void clear_modified()
void tag_modified()
bool is_modified() const
Node(const NodeType *type, ustring name=ustring())
Film * film
Definition scene.h:128
unique_ptr< ObjectManager > object_manager
Definition scene.h:150
unique_ptr< SceneUpdateStats > update_stats
Definition scene.h:174
unique_ptr< BakeManager > bake_manager
Definition scene.h:152
unique_ptr_vector< Shader > shaders
Definition scene.h:137
bool has_shadow_catcher()
Definition scene.cpp:752
struct Object * camera
void push(TaskRunFunction &&task)
Definition task.cpp:21
void wait_work(Summary *stats=nullptr)
Definition task.cpp:27
CCL_NAMESPACE_BEGIN void tabulated_sobol_generate_4D(float4 points[], const int size, const int rng_seed)
max
Definition text_draw.cc:251
ccl_device_inline bool is_power_of_two(const size_t x)
Definition types_base.h:67
wmTimer * timer
uint8_t flag
Definition wm_window.cc:139