75 BL::SpaceView3D &
b_v3d,
124 session = make_unique<Session>(session_params, scene_params);
127 session->set_pause(session_pause);
134 sync = make_unique<BlenderSync>(
136 BL::Object b_camera_override(
b_engine.camera_override());
147 session->reset(session_params, buffer_params);
183 const bool is_new_session = (
session ==
nullptr);
184 if (is_new_session) {
203 if (
scene->params.modified(scene_params) ||
session->params.modified(session_params) ||
204 !
this->b_render.use_persistent_data())
209 if (!is_new_session) {
223 if (is_new_session) {
225 sync = make_unique<BlenderSync>(
233 BL::Object b_camera_override(
b_engine.camera_override());
240 session->reset(session_params, buffer_params);
272 const string prefix =
"cryptomatte/" + identifier.substr(0, 7) +
"/";
282 BL::RenderResult b_rr =
b_engine.get_result();
283 const string prefix =
"cycles." + view_layer_name +
".";
286 b_rr.stamp_data_add_field((prefix +
"samples").c_str(),
292 if (
session->tile_manager.range_num_samples != -1) {
293 b_rr.stamp_data_add_field((prefix +
"range_start_sample").c_str(),
295 b_rr.stamp_data_add_field((prefix +
"range_num_samples").c_str(),
303 view_layer_name +
".CryptoObject",
304 scene->object_manager->get_cryptomatte_objects(
scene));
308 view_layer_name +
".CryptoMaterial",
309 scene->shader_manager->get_cryptomatte_materials(
scene));
313 view_layer_name +
".CryptoAsset",
314 scene->object_manager->get_cryptomatte_assets(
scene));
321 b_rr.stamp_data_add_field((prefix +
"total_time").c_str(),
323 b_rr.stamp_data_add_field((prefix +
"render_time").c_str(),
325 b_rr.stamp_data_add_field((prefix +
"synchronization_time").c_str(),
333 if (
session->progress.get_cancel()) {
340 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
344 BL::ViewLayer b_view_layer =
b_depsgraph.view_layer_eval();
353 BL::RenderResult b_rr =
b_engine.begin_result(0, 0, 1, 1, b_view_layer.name().c_str(),
nullptr);
354 BL::RenderResult::layers_iterator b_single_rlay;
355 b_rr.layers.begin(b_single_rlay);
356 BL::RenderLayer b_rlay = *b_single_rlay;
367 sync->sync_render_passes(b_rlay, b_view_layer);
369 BL::RenderResult::views_iterator b_view_iter;
372 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
377 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index)
381 buffer_params.
layer = b_view_layer.name();
395 BL::Object b_camera_override(
b_engine.camera_override());
409 const bool can_free_cache = (view_index == num_views - 1);
410 if (can_free_cache) {
419 if (can_free_cache) {
425 if (view_index != 0) {
426 int seed =
scene->integrator->get_seed();
432 const int samples =
sync->get_layer_samples();
433 const bool bound_samples =
sync->get_layer_bound_samples();
436 if (samples != 0 && (!bound_samples || (samples < session_params.
samples))) {
437 effective_session_params.
samples = samples;
441 session->reset(effective_session_params, buffer_params);
445 scene->enable_update_stats();
453 session->collect_statistics(&stats);
457 if (
session->progress.get_cancel()) {
466 b_engine.end_result(b_rr,
true,
false,
false);
471 b_engine.tile_highlight_clear_all();
477 VLOG_INFO <<
"Render time (without synchronization): " << render_time;
487 if (!
b_render.use_persistent_data()) {
496 session->process_full_buffer_from_disk(filename);
507 session->set_output_driver(
nullptr);
508 session->full_buffer_written_cb =
nullptr;
518 session->set_display_driver(
nullptr);
530 const bool filter_direct = (bake_filter & BL::BakeSettings::pass_filter_DIRECT) != 0;
531 const bool filter_indirect = (bake_filter & BL::BakeSettings::pass_filter_INDIRECT) != 0;
532 const bool filter_color = (bake_filter & BL::BakeSettings::pass_filter_COLOR) != 0;
535 bool use_direct_light =
false;
536 bool use_indirect_light =
false;
537 bool include_albedo =
false;
540 if (bake_type ==
"POSITION") {
543 else if (bake_type ==
"NORMAL") {
546 else if (bake_type ==
"UV") {
549 else if (bake_type ==
"ROUGHNESS") {
552 else if (bake_type ==
"EMIT") {
556 else if (bake_type ==
"ENVIRONMENT") {
560 else if (bake_type ==
"AO") {
564 else if (bake_type ==
"SHADOW") {
567 film->set_use_approximate_shadow_catcher(
true);
569 use_direct_light =
true;
570 use_indirect_light =
true;
571 include_albedo =
true;
573 integrator->set_use_diffuse(
true);
574 integrator->set_use_glossy(
true);
575 integrator->set_use_transmission(
true);
576 integrator->set_use_emission(
true);
579 else if (bake_type ==
"COMBINED") {
581 film->set_use_approximate_shadow_catcher(
true);
583 use_direct_light = filter_direct;
584 use_indirect_light = filter_indirect;
585 include_albedo = filter_color;
587 integrator->set_use_diffuse((bake_filter & BL::BakeSettings::pass_filter_DIFFUSE) != 0);
588 integrator->set_use_glossy((bake_filter & BL::BakeSettings::pass_filter_GLOSSY) != 0);
589 integrator->set_use_transmission((bake_filter & BL::BakeSettings::pass_filter_TRANSMISSION) !=
591 integrator->set_use_emission((bake_filter & BL::BakeSettings::pass_filter_EMIT) != 0);
594 else if ((bake_type ==
"DIFFUSE") || (bake_type ==
"GLOSSY") || (bake_type ==
"TRANSMISSION")) {
595 use_direct_light = filter_direct;
596 use_indirect_light = filter_indirect;
597 include_albedo = filter_color;
599 integrator->set_use_diffuse(bake_type ==
"DIFFUSE");
600 integrator->set_use_glossy(bake_type ==
"GLOSSY");
601 integrator->set_use_transmission(bake_type ==
"TRANSMISSION");
603 if (bake_type ==
"DIFFUSE") {
604 if (filter_direct && filter_indirect) {
607 else if (filter_direct) {
610 else if (filter_indirect) {
617 else if (bake_type ==
"GLOSSY") {
618 if (filter_direct && filter_indirect) {
621 else if (filter_direct) {
624 else if (filter_indirect) {
631 else if (bake_type ==
"TRANSMISSION") {
632 if (filter_direct && filter_indirect) {
635 else if (filter_direct) {
638 else if (filter_indirect) {
653 pass->set_name(ustring(
"Combined"));
654 pass->set_type(type);
655 pass->set_include_albedo(include_albedo);
658 integrator->set_use_direct_light(use_direct_light);
659 integrator->set_use_indirect_light(use_indirect_light);
665 integrator->set_use_denoise(
false);
672 BL::Object &b_object,
673 const string &bake_type,
674 const int bake_filter,
675 const int bake_width,
676 const int bake_height)
687 session->set_display_driver(
nullptr);
688 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
692 BL::Object b_camera_override(
b_engine.camera_override());
693 sync->set_bake_target(b_object);
707 const bool was_denoiser_enabled = integrator->get_use_denoise();
716 scene->background->set_transparent(
true);
718 if (!
session->progress.get_cancel()) {
725 Object *bake_object =
nullptr;
726 if (!
session->progress.get_cancel()) {
728 if (ob->get_is_bake_target()) {
736 const bool was_shadow_catcher = (bake_object) ? bake_object->get_is_shadow_catcher() :
false;
737 if (bake_object && bake_type ==
"SHADOW") {
738 bake_object->set_is_shadow_catcher(
true);
741 if (bake_object && !
session->progress.get_cancel()) {
744 buffer_params.
width = bake_width;
745 buffer_params.
height = bake_height;
752 session->reset(session_params, buffer_params);
758 if (bake_object && !
session->progress.get_cancel()) {
765 bake_object->set_is_shadow_catcher(was_shadow_catcher);
770 integrator->set_use_denoise(was_denoiser_enabled);
787 if (
session->params.modified(session_params) ||
scene->params.modified(scene_params)) {
797 session->set_pause(session_pause);
810 if (!
session->ready_to_reset() || !
session->scene->mutex.try_lock()) {
818 BL::Object b_camera_override(
b_engine.camera_override());
840 if (
scene->need_reset()) {
841 session->reset(session_params, buffer_params);
851 session->scene->mutex.unlock();
868 const int pass_index = space_image.image_user().multilayer_pass();
870 BL::RenderPass b_display_pass(
b_engine.pass_by_index_get(
b_rlay_name.c_str(), pass_index));
871 if (!b_display_pass) {
884 scene->film->set_display_pass(pass->get_type());
890 BL::Array<float, 2> zoom = space_image.zoom();
904 if (
session->ready_to_reset()) {
927 if (!
session->scene->mutex.try_lock()) {
935 if (
scene->camera->is_modified()) {
939 session->scene->mutex.unlock();
950 if (session_pause ==
false) {
951 session->reset(session_params, buffer_params);
969 session->progress.get_status(status, substatus);
996 double remaining_time = 0;
998 const float mem_used = (float)
session->stats.mem_used / 1024.0f / 1024.0f;
999 const float mem_peak = (float)
session->stats.mem_peak / 1024.0f / 1024.0f;
1005 remaining_time =
session->get_estimated_remaining_time();
1010 scene_status +=
" | " +
scene->name;
1020 if (remaining_time > 0) {
1024 timestatus +=
string_printf(
"Mem:%.2fM, Peak:%.2fM", (
double)mem_used, (
double)mem_peak);
1026 if (!status.empty()) {
1027 status =
" | " + status;
1029 if (!substatus.empty()) {
1030 status +=
" | " + substatus;
1034 const double current_time =
time_dt();
1039 b_engine.update_stats(
"", (timestatus + scene_status + status).c_str());
1040 b_engine.update_memory_stats(mem_used, mem_peak);
1054 if (!
session->progress.get_error()) {
1058 const string error =
session->progress.get_error_message();
1102 session->progress.set_cancel(
"Cancelled");
1139 session->set_display_driver(std::move(display_driver));
static void add_cryptomatte_layer(BL::RenderResult &b_rr, string name, string manifest)
static bool bake_setup_pass(Scene *scene, const string &bake_type, const int bake_filter)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static unsigned long seed
void reset()
clear internal cached data and reset random seed
void stamp_view_layer_metadata(Scene *scene, const string &view_layer_name)
BL::RenderSettings b_render
static bool print_render_stats
bool check_and_report_session_error()
void update_bake_progress()
BL::RenderEngine b_engine
void full_buffer_written(string_view filename)
struct BlenderSession::@043244105231332026276030153256235162324026120052 draw_state_
void synchronize(BL::Depsgraph &b_depsgraph)
vector< string > full_buffer_files_
void ensure_display_driver_if_needed()
void builtin_images_load()
void update_status_progress()
void * python_thread_state
void bake(BL::Depsgraph &b_depsgraph_, BL::Object &b_object, const string &bake_type, const int bake_filter, const int bake_width, const int bake_height)
void free_blender_memory_if_possible()
BL::Preferences b_userpref
void reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsgraph)
BlenderDisplayDriver * display_driver_
unique_ptr< BlenderSync > sync
void render(BL::Depsgraph &b_depsgraph)
void draw(BL::SpaceImageEditor &space_image)
void view_draw(const int w, const int h)
unique_ptr< Session > session
BlenderSession(BL::RenderEngine &b_engine, BL::Preferences &b_userpref, BL::BlendData &b_data, bool preview_osl)
void render_frame_finish()
void get_status(string &status, string &substatus)
void get_progress(double &progress, double &total_time, double &render_time)
BL::Depsgraph b_depsgraph
static DeviceTypeMask device_override
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)
static SceneParams get_scene_params(BL::Scene &b_scene, const bool background, const bool use_developer_ui)
static BufferParams get_buffer_params(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, Camera *cam, const int width, const int height)
static const Pass * find(const unique_ptr_vector< Pass > &passes, const string &name)
PassInfo get_info() const
DeviceInfo denoise_device
static int render_resolution_x(BL::RenderSettings &b_render)
static int render_resolution_y(BL::RenderSettings &b_render)
static void render_add_metadata(BL::RenderResult &b_rr, string name, string value)
#define CCL_NAMESPACE_END
static const char * to_string(const Interpolation &interp)
ccl_device_inline uint hash_uint2(const uint kx, const uint ky)
@ PASS_TRANSMISSION_DIRECT
@ PASS_TRANSMISSION_COLOR
@ PASS_TRANSMISSION_INDIRECT
static void error(const char *str)
uint32_t util_murmur_hash3(const void *key, const int len, const uint32_t seed)
bool path_remove(const string &path)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
const PointerRNA PointerRNA_NULL
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
T * create_node(Args &&...)=delete
std::unique_lock< std::mutex > thread_scoped_lock
string time_human_readable_from_seconds(const double seconds)
CCL_NAMESPACE_BEGIN double time_dt()