42 BL::BlendData &b_data,
46 bool use_developer_ui,
54 procedural_map(scene),
56 particle_system_map(scene),
61 use_developer_ui(use_developer_ui),
68 dicing_rate = preview ?
RNA_float_get(&cscene,
"preview_dicing_rate") :
70 max_subdivisions =
RNA_int_get(&cscene,
"max_subdivisions");
81 this->b_data = b_data;
82 this->b_scene = b_scene;
92 b_bake_target = b_object;
98 BL::SpaceView3D &b_v3d,
99 BL::RegionView3D &b_rv3d)
103 BL::Object b_dicing_camera_object = get_dicing_camera_object(b_v3d, b_rv3d);
104 bool dicing_camera_updated =
false;
107 for (BL::DepsgraphUpdate &b_update : b_depsgraph.updates) {
114 BL::ID b_id(b_update.id());
117 if (b_id.is_a(&RNA_Material)) {
118 const BL::Material b_mat(b_id);
119 shader_map.set_recalc(b_mat);
122 else if (b_id.is_a(&RNA_Light)) {
123 const BL::Light b_light(b_id);
124 shader_map.set_recalc(b_light);
125 geometry_map.set_recalc(b_light);
128 else if (b_id.is_a(&RNA_Object)) {
129 BL::Object b_ob(b_id);
130 const bool can_have_geometry = object_can_have_geometry(b_ob);
131 const bool is_light = !can_have_geometry && object_is_light(b_ob);
133 if (b_ob.is_instancer() && b_update.is_updated_shading()) {
135 object_map.set_recalc(b_ob);
138 if (can_have_geometry ||
is_light) {
139 const bool updated_geometry = b_update.is_updated_geometry();
140 const bool updated_transform = b_update.is_updated_transform();
143 if (can_have_geometry) {
144 if (updated_transform || b_update.is_updated_shading()) {
145 object_map.set_recalc(b_ob);
149 b_ob, preview, use_adaptive_subdivision) !=
154 if (updated_geometry || (updated_transform && use_adaptive_subdiv)) {
155 BL::ID
const key = BKE_object_is_modified(b_ob) ?
158 geometry_map.set_recalc(key);
161 const map<void *, set<BL::ID>>::const_iterator instance_geometries =
162 instance_geometries_by_object.find(b_ob.ptr.data);
163 if (instance_geometries != instance_geometries_by_object.end()) {
164 for (BL::ID
const &geometry : instance_geometries->second) {
165 geometry_map.set_recalc(geometry);
170 if (updated_geometry) {
171 BL::Object::particle_systems_iterator b_psys;
172 for (b_ob.particle_systems.begin(b_psys); b_psys != b_ob.particle_systems.end();
175 particle_system_map.set_recalc(b_ob);
181 if (b_update.is_updated_transform() || b_update.is_updated_shading()) {
182 object_map.set_recalc(b_ob);
183 geometry_map.set_recalc(b_ob);
186 if (updated_geometry) {
187 geometry_map.set_recalc(b_ob);
191 else if (object_is_camera(b_ob)) {
192 shader_map.set_recalc(b_ob);
195 if (b_dicing_camera_object == b_ob) {
196 dicing_camera_updated =
true;
200 else if (b_id.is_a(&RNA_Mesh)) {
201 const BL::Mesh b_mesh(b_id);
202 geometry_map.set_recalc(b_mesh);
205 else if (b_id.is_a(&RNA_World)) {
206 const BL::World b_world(b_id);
207 if (world_map == b_world.ptr.data) {
210 shader_map.set_recalc(b_world);
213 else if (b_id.is_a(&RNA_Scene)) {
214 shader_map.set_recalc(b_id);
217 else if (b_id.is_a(&RNA_Volume)) {
218 const BL::Volume b_volume(b_id);
219 geometry_map.set_recalc(b_volume);
222 else if (b_id.is_a(&RNA_Camera)) {
223 if (b_dicing_camera_object && b_dicing_camera_object.data() == b_id) {
224 dicing_camera_updated =
true;
229 if (use_adaptive_subdivision) {
232 bool dicing_prop_changed =
false;
234 const float updated_dicing_rate = preview ?
RNA_float_get(&cscene,
"preview_dicing_rate") :
237 if (dicing_rate != updated_dicing_rate) {
238 dicing_rate = updated_dicing_rate;
239 dicing_prop_changed =
true;
242 const int updated_max_subdivisions =
RNA_int_get(&cscene,
"max_subdivisions");
244 if (max_subdivisions != updated_max_subdivisions) {
245 max_subdivisions = updated_max_subdivisions;
246 dicing_prop_changed =
true;
254 for (
const pair<const GeometryKey, Geometry *> &iter : geometry_map.key_to_scene_data()) {
257 Mesh *mesh =
static_cast<Mesh *
>(geom);
260 geometry_map.set_recalc(BL::ID(id_ptr));
270 if (viewport_parameters.shader_modified(new_viewport_parameters)) {
275 has_updates_ |= viewport_parameters.modified(new_viewport_parameters);
280 BL::Depsgraph &b_depsgraph,
281 BL::SpaceView3D &b_v3d,
282 BL::RegionView3D &b_rv3d,
285 void **python_thread_state,
289 ImageManager *image_manager = scene->image_manager.get();
290 const int frame = b_scene.frame_current();
293 if (!has_updates_ && !auto_refresh_update) {
299 BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval();
303 const bool background = !b_v3d;
307 sync_film(b_view_layer, b_v3d);
308 sync_shaders(b_depsgraph, b_v3d, auto_refresh_update);
311 geometry_synced.clear();
316 sync_objects(b_depsgraph, b_v3d);
318 sync_motion(b_render, b_depsgraph, b_v3d, b_rv3d, width, height, python_thread_state);
320 geometry_synced.clear();
324 shader_map.post_sync(
false);
326 LOG_INFO <<
"Total time spent synchronizing data: " <<
timer.get_time();
328 has_updates_ =
false;
340 use_adaptive_subdivision = !b_bake_target;
344 integrator->set_min_bounce(
get_int(cscene,
"min_light_bounces"));
345 integrator->set_max_bounce(
get_int(cscene,
"max_bounces"));
347 integrator->set_max_diffuse_bounce(
get_int(cscene,
"diffuse_bounces"));
348 integrator->set_max_glossy_bounce(
get_int(cscene,
"glossy_bounces"));
349 integrator->set_max_transmission_bounce(
get_int(cscene,
"transmission_bounces"));
350 integrator->set_max_volume_bounce(
get_int(cscene,
"volume_bounces"));
351 integrator->set_transparent_min_bounce(
get_int(cscene,
"min_transparent_bounces"));
352 integrator->set_transparent_max_bounce(
get_int(cscene,
"transparent_max_bounces"));
354 integrator->set_volume_ray_marching(
get_boolean(cscene,
"volume_biased"));
355 integrator->set_volume_max_steps(
get_int(cscene,
"volume_max_steps"));
356 const float volume_step_rate = (preview) ?
get_float(cscene,
"volume_preview_step_rate") :
358 integrator->set_volume_step_rate(volume_step_rate);
360 integrator->set_caustics_reflective(
get_boolean(cscene,
"caustics_reflective"));
361 integrator->set_caustics_refractive(
get_boolean(cscene,
"caustics_refractive"));
362 integrator->set_filter_glossy(
get_float(cscene,
"blur_glossy"));
367 if (b_scene.frame_subframe() != 0.0f) {
371 seed +=
hash_uint2((
int)(b_scene.frame_subframe() * (
float)INT_MAX),
376 integrator->set_seed(
seed);
378 integrator->set_sample_clamp_direct(
get_float(cscene,
"sample_clamp_direct"));
379 integrator->set_sample_clamp_indirect(
get_float(cscene,
"sample_clamp_indirect"));
381 integrator->set_motion_blur(view_layer.use_motion_blur);
384 const bool use_light_tree =
get_boolean(cscene,
"use_light_tree");
385 integrator->set_use_light_tree(use_light_tree);
386 integrator->set_light_sampling_threshold(
get_float(cscene,
"light_sampling_threshold"));
388 if (integrator->use_light_tree_is_modified()) {
395 switch (sampling_pattern) {
413 if (!use_developer_ui) {
419 const bool is_vertex_baking = b_bake_target && b_scene.render().bake().target() !=
420 BL::BakeSettings::target_IMAGE_TEXTURES;
421 scene->bake_manager->set_use_seed(is_vertex_baking);
422 if (is_vertex_baking) {
428 integrator->set_sampling_pattern(sampling_pattern);
431 bool use_adaptive_sampling =
false;
433 samples =
get_int(cscene,
"preview_samples");
434 use_adaptive_sampling =
RNA_boolean_get(&cscene,
"use_preview_adaptive_sampling");
435 integrator->set_use_adaptive_sampling(use_adaptive_sampling);
436 integrator->set_adaptive_threshold(
get_float(cscene,
"preview_adaptive_threshold"));
437 integrator->set_adaptive_min_samples(
get_int(cscene,
"preview_adaptive_min_samples"));
440 samples =
get_int(cscene,
"samples");
441 use_adaptive_sampling =
RNA_boolean_get(&cscene,
"use_adaptive_sampling");
442 integrator->set_use_adaptive_sampling(use_adaptive_sampling);
443 integrator->set_adaptive_threshold(
get_float(cscene,
"adaptive_threshold"));
444 integrator->set_adaptive_min_samples(
get_int(cscene,
"adaptive_min_samples"));
447 float scrambling_distance =
get_float(cscene,
"scrambling_distance");
448 const bool auto_scrambling_distance =
get_boolean(cscene,
"auto_scrambling_distance");
449 if (auto_scrambling_distance) {
458 if (use_adaptive_sampling) {
464 scrambling_distance *= 4.0f /
sqrtf(samples);
468 const bool preview_scrambling_distance =
get_boolean(cscene,
"preview_scrambling_distance");
469 if ((preview && !preview_scrambling_distance) ||
472 scrambling_distance = 1.0f;
475 if (scrambling_distance != 1.0f) {
476 LOG_INFO <<
"Using scrambling distance: " << scrambling_distance;
478 integrator->set_scrambling_distance(scrambling_distance);
482 integrator->set_ao_bounces(
get_int(cscene,
"ao_bounces"));
485 integrator->set_ao_bounces(
get_int(cscene,
"ao_bounces_render"));
489 integrator->set_ao_bounces(0);
492#ifdef WITH_CYCLES_DEBUG
495 integrator->set_direct_light_sampling_type(direct_light_sampling_type);
498 integrator->set_use_guiding(
get_boolean(cscene,
"use_guiding"));
499 integrator->set_use_surface_guiding(
get_boolean(cscene,
"use_surface_guiding"));
500 integrator->set_use_volume_guiding(
get_boolean(cscene,
"use_volume_guiding"));
501 integrator->set_guiding_training_samples(
get_int(cscene,
"guiding_training_samples"));
503 if (use_developer_ui) {
504 integrator->set_deterministic_guiding(
get_boolean(cscene,
"use_deterministic_guiding"));
505 integrator->set_surface_guiding_probability(
get_float(cscene,
"surface_guiding_probability"));
506 integrator->set_volume_guiding_probability(
get_float(cscene,
"volume_guiding_probability"));
507 integrator->set_use_guiding_direct_light(
get_boolean(cscene,
"use_guiding_direct_light"));
508 integrator->set_use_guiding_mis_weights(
get_boolean(cscene,
"use_guiding_mis_weights"));
511 integrator->set_guiding_distribution_type(guiding_distribution_type);
514 "guiding_directional_sampling_type",
517 integrator->set_guiding_directional_sampling_type(guiding_directional_sampling_type);
518 integrator->set_guiding_roughness_threshold(
get_float(cscene,
"guiding_roughness_threshold"));
522 b_scene, b_view_layer, background, denoise_device_info);
526 if (is_vertex_baking) {
527 denoise_params.
use =
false;
530 integrator->set_use_denoise(denoise_params.
use);
535 if (denoise_params.
use) {
536 integrator->set_denoiser_type(denoise_params.
type);
537 integrator->set_denoise_use_gpu(denoise_params.
use_gpu);
538 integrator->set_denoise_start_sample(denoise_params.
start_sample);
539 integrator->set_use_denoise_pass_albedo(denoise_params.
use_pass_albedo);
540 integrator->set_use_denoise_pass_normal(denoise_params.
use_pass_normal);
541 integrator->set_denoiser_prefilter(denoise_params.
prefilter);
542 integrator->set_denoiser_quality(denoise_params.
quality);
552void BlenderSync::sync_film(BL::ViewLayer &b_view_layer, BL::SpaceView3D &b_v3d)
561 film->set_display_pass(new_viewport_parameters.display_pass);
562 film->set_show_active_pixels(new_viewport_parameters.show_active_pixels);
565 film->set_exposure(
get_float(cscene,
"film_exposure"));
566 film->set_filter_type(
568 const float filter_width = (film->get_filter_type() ==
FILTER_BOX) ?
571 film->set_filter_width(filter_width);
573 if (b_scene.world()) {
574 BL::WorldMistSettings b_mist = b_scene.world().mist_settings();
576 film->set_mist_start(b_mist.start());
577 film->set_mist_depth(b_mist.depth());
579 switch (b_mist.falloff()) {
580 case BL::WorldMistSettings::falloff_QUADRATIC:
581 film->set_mist_falloff(2.0f);
583 case BL::WorldMistSettings::falloff_LINEAR:
584 film->set_mist_falloff(1.0f);
586 case BL::WorldMistSettings::falloff_INVERSE_QUADRATIC:
587 film->set_mist_falloff(0.5f);
595 film->set_use_approximate_shadow_catcher(
true);
598 film->set_use_approximate_shadow_catcher(!
get_boolean(crl,
"use_pass_shadow_catcher"));
606 view_layer.
name = b_view_layer.name();
609 view_layer.use_background_shader = b_view_layer.use_sky();
611 view_layer.use_surfaces = b_view_layer.use_solid() || b_bake_target;
612 view_layer.use_hair = b_view_layer.use_strand();
613 view_layer.use_volumes = b_view_layer.use_volumes();
614 view_layer.use_motion_blur = b_view_layer.use_motion_blur() &&
615 b_scene.render().use_motion_blur();
618 view_layer.material_override = b_view_layer.material_override();
620 view_layer.world_override = b_view_layer.world_override();
624 const int use_layer_samples =
get_enum(cscene,
"use_layer_samples");
626 view_layer.bound_samples = (use_layer_samples == 1);
627 view_layer.samples = 0;
629 if (use_layer_samples != 2) {
630 const int samples = b_view_layer.samples();
631 view_layer.samples = samples;
636void BlenderSync::sync_images()
640 const bool is_interface_locked = b_engine.render() && b_engine.render().use_lock_interface();
648 for (BL::Image &b_image : b_data.images) {
650 if (is_builtin ==
false) {
651 b_image.buffers_free();
661 const string name = b_pass.name();
662#define MAP_PASS(passname, passtype, noisy) \
663 if (name == passname) { \
665 mode = (noisy) ? PassMode::NOISY : PassMode::DENOISED; \
742 pass->set_type(type);
743 pass->set_name(ustring(
name));
744 pass->set_mode(mode);
753 scene->delete_nodes(set<Pass *>(scene_passes.begin(), scene_passes.end()));
760 const int crypto_depth =
divide_up(
min(16, b_view_layer.pass_cryptomatte_depth()), 2);
761 scene->film->set_cryptomatte_depth(crypto_depth);
763 if (b_view_layer.use_pass_cryptomatte_object()) {
766 if (b_view_layer.use_pass_cryptomatte_material()) {
769 if (b_view_layer.use_pass_cryptomatte_asset()) {
772 scene->film->set_cryptomatte_passes(cryptomatte_passes);
774 unordered_set<string> expected_passes;
777 BL::ViewLayer::aovs_iterator b_aov_iter;
778 for (b_view_layer.aovs.begin(b_aov_iter); b_aov_iter != b_view_layer.aovs.end(); ++b_aov_iter) {
779 BL::AOV b_aov(*b_aov_iter);
780 if (!b_aov.is_valid()) {
784 const string name = b_aov.name();
788 expected_passes.insert(
name);
792 BL::ViewLayer::lightgroups_iterator b_lightgroup_iter;
793 for (b_view_layer.lightgroups.begin(b_lightgroup_iter);
794 b_lightgroup_iter != b_view_layer.lightgroups.end();
797 BL::Lightgroup b_lightgroup(*b_lightgroup_iter);
802 pass->set_lightgroup(ustring(b_lightgroup.name()));
803 expected_passes.insert(
name);
807 for (BL::RenderPass &b_pass : b_rlay.passes) {
812 if (!expected_passes.count(b_pass.name())) {
813 LOG_ERROR <<
"Unknown pass " << b_pass.name();
819 (b_view_layer.use_motion_blur() && b_scene.render().use_motion_blur()))
824 pass_add(scene, pass_type, b_pass.name().c_str(), pass_mode);
827 scene->film->set_pass_alpha_threshold(b_view_layer.pass_alpha_threshold());
837 const bool is_interface_locked = b_engine.render() && b_engine.render().use_lock_interface();
838 const bool is_persistent_data = b_engine.render() && b_engine.render().use_persistent_data();
839 const bool can_free_caches =
848 if (!can_free_caches) {
854 for (BL::Object &b_ob : b_depsgraph.objects) {
857 if (b_ob.type() == BL::Object::type_GREASEPENCIL) {
860 b_ob.cache_release();
867 const bool background,
868 const bool use_developer_ui)
874 if (shadingsystem == 0) {
877 else if (shadingsystem == 1) {
881 if (background || (use_developer_ui &&
get_enum(cscene,
"debug_bvh_type"))) {
900 texture_limit =
RNA_enum_get(&cscene,
"texture_limit_render");
905 if (texture_limit > 0 && b_scene.render().use_simplify()) {
906 params.texture_limit = 1 << (texture_limit + 6);
914 params.background = background;
928 BL::Preferences &b_preferences,
935 if (background && !b_engine.is_preview()) {
940 params.temp_dir = b_engine.temporary_directory();
945 params.background = background;
950 b_preferences, b_scene,
params.background, b_engine.is_preview(),
params.denoise_device);
953 const int samples =
get_int(cscene,
"samples");
954 const int preview_samples =
get_int(cscene,
"preview_samples");
955 const bool use_sample_subset =
get_boolean(cscene,
"use_sample_subset");
956 const int sample_subset_offset =
get_int(cscene,
"sample_offset");
957 const int sample_subset_length =
get_int(cscene,
"sample_subset_length");
962 params.use_sample_subset = use_sample_subset;
963 params.sample_subset_offset = sample_subset_offset;
964 params.sample_subset_length = sample_subset_length;
967 params.samples = preview_samples;
968 if (
params.samples == 0) {
971 params.use_sample_subset =
false;
972 params.sample_subset_offset = 0;
973 params.sample_subset_length = 0;
977 params.pixel_size = b_engine.get_preview_pixel_size(b_scene);
986 if (shadingsystem == 0) {
989 else if (shadingsystem == 1) {
1006 params.use_profiling =
params.device.has_profiling && !b_engine.is_preview() && background &&
1010 params.use_auto_tile =
true;
1014 params.use_auto_tile =
false;
1021 BL::ViewLayer &b_view_layer,
1025 enum DenoiserInput {
1026 DENOISER_INPUT_RGB = 1,
1027 DENOISER_INPUT_RGB_ALBEDO = 2,
1028 DENOISER_INPUT_RGB_ALBEDO_NORMAL = 3,
1036 int input_passes = -1;
1048 input_passes = (DenoiserInput)
get_enum(
1049 cscene,
"denoising_input_passes", DENOISER_INPUT_NUM, DENOISER_INPUT_RGB_ALBEDO_NORMAL);
1054 denoising.
use =
false;
1070 input_passes = (DenoiserInput)
get_enum(
1071 cscene,
"preview_denoising_input_passes", DENOISER_INPUT_NUM, DENOISER_INPUT_RGB_ALBEDO);
1077 denoising.
use =
false;
1082 switch (input_passes) {
1083 case DENOISER_INPUT_RGB:
1088 case DENOISER_INPUT_RGB_ALBEDO:
1093 case DENOISER_INPUT_RGB_ALBEDO_NORMAL:
1099 LOG_ERROR <<
"Unhandled input passes enum " << input_passes;
DeviceInfo blender_device_info(BL::Preferences &b_preferences, BL::Scene &b_scene, bool background, bool preview, DeviceInfo &preferences_device)
int blender_device_threads(BL::Scene &b_scene)
static unsigned long seed
static bool print_render_stats
BlenderSync(BL::RenderEngine &b_engine, BL::BlendData &b_data, BL::Scene &b_scene, Scene *scene, bool preview, bool use_developer_ui, Progress &progress)
static DenoiseParams get_denoise_params(BL::Scene &b_scene, BL::ViewLayer &b_view_layer, bool background, const DeviceInfo &denoise_device)
static bool get_session_pause(BL::Scene &b_scene, bool background)
static SessionParams get_session_params(BL::RenderEngine &b_engine, BL::Preferences &b_preferences, BL::Scene &b_scene, bool background)
void sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d)
void sync_view_layer(BL::ViewLayer &b_view_layer)
void sync_integrator(BL::ViewLayer &b_view_layer, bool background, const DeviceInfo &denoise_device_info)
void free_data_after_sync(BL::Depsgraph &b_depsgraph)
static SceneParams get_scene_params(BL::Scene &b_scene, const bool background, const bool use_developer_ui)
void reset(BL::BlendData &b_data, BL::Scene &b_scene)
void set_bake_target(BL::Object &b_object)
void sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_view_layer)
void sync_data(BL::RenderSettings &b_render, BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, const int width, const int height, void **python_thread_state, const DeviceInfo &denoise_device_info)
DenoiserPrefilter prefilter
static DenoiserType automatic_viewport_denoiser_type(const DeviceInfo &denoise_device_info)
bool set_animation_frame_update(const int frame)
void tag_update(Scene *scene, const uint32_t flag)
AdaptiveSampling get_adaptive_sampling() const
static bool image_is_builtin(BL::Image &ima, BL::RenderEngine &engine)
static float get_float(PointerRNA &ptr, const char *name)
static bool get_boolean(PointerRNA &ptr, const char *name)
static int get_int(PointerRNA &ptr, const char *name)
static int get_enum(PointerRNA &ptr, const char *name, int num_values=-1, int default_value=-1)
static Mesh::SubdivisionType object_subdivision_type(BL::Object &b_ob, const bool preview, const bool use_adaptive_subdivision)
static CCL_NAMESPACE_BEGIN BL::ID object_get_data(const BL::Object &b_ob, const bool use_adaptive_subdivision)
static bool region_view3d_navigating_or_transforming(const BL::RegionView3D &b_rv3d)
DebugFlags & DebugFlags()
@ DENOISER_QUALITY_BALANCED
@ DENOISER_PREFILTER_FAST
@ DENOISER_PREFILTER_NONE
#define CCL_NAMESPACE_END
ccl_device_inline uint hash_uint2(const uint kx, const uint ky)
@ DIRECT_LIGHT_SAMPLING_MIS
@ DIRECT_LIGHT_SAMPLING_NUM
GuidingDirectionalSamplingType
@ GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ SAMPLING_PATTERN_AUTOMATIC
@ SAMPLING_PATTERN_BLUE_NOISE_FIRST
@ SAMPLING_PATTERN_TABULATED_SOBOL
@ SAMPLING_PATTERN_BLUE_NOISE_PURE
@ PASS_TRANSMISSION_DIRECT
@ PASS_TRANSMISSION_COLOR
@ PASS_TRANSMISSION_INDIRECT
@ PASS_GUIDING_PROBABILITY
@ PASS_ADAPTIVE_AUX_BUFFER
@ PASS_GUIDING_AVG_ROUGHNESS
@ GUIDING_TYPE_PARALLAX_AWARE_VMM
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
const PointerRNA PointerRNA_NULL
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_id_pointer_create(ID *id)
bool string_startswith(const string_view s, const string_view start)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
T * create_node(Args &&...)=delete
static bool get_known_pass_type(BL::RenderPass &b_pass, PassType &type, PassMode &mode)
#define MAP_PASS(passname, passtype, noisy)
static Pass * pass_add(Scene *scene, PassType type, const char *name, PassMode mode=PassMode::DENOISED)
static CCL_NAMESPACE_BEGIN const char * cryptomatte_prefix
ccl_device_inline bool is_light(const ccl_global KernelLightTreeEmitter *kemitter)
ccl_device_inline size_t divide_up(const size_t x, const size_t y)