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>(
146 session->reset(session_params, buffer_params);
182 const bool is_new_session = (
session ==
nullptr);
183 if (is_new_session) {
202 if (
scene->params.modified(scene_params) ||
session->params.modified(session_params) ||
203 !this->b_render.use_persistent_data())
208 if (!is_new_session) {
222 if (is_new_session) {
224 sync = make_unique<BlenderSync>(
238 session->reset(session_params, buffer_params);
270 const string prefix =
"cryptomatte/" + identifier.substr(0, 7) +
"/";
280 BL::RenderResult b_rr =
b_engine.get_result();
281 const string prefix =
"cycles." + view_layer_name +
".";
284 b_rr.stamp_data_add_field((prefix +
"samples").c_str(),
290 if (
session->tile_manager.range_num_samples != -1) {
291 b_rr.stamp_data_add_field((prefix +
"range_start_sample").c_str(),
293 b_rr.stamp_data_add_field((prefix +
"range_num_samples").c_str(),
301 view_layer_name +
".CryptoObject",
302 scene->object_manager->get_cryptomatte_objects(
scene));
306 view_layer_name +
".CryptoMaterial",
307 scene->shader_manager->get_cryptomatte_materials(
scene));
311 view_layer_name +
".CryptoAsset",
312 scene->object_manager->get_cryptomatte_assets(
scene));
319 b_rr.stamp_data_add_field((prefix +
"total_time").c_str(),
321 b_rr.stamp_data_add_field((prefix +
"render_time").c_str(),
323 b_rr.stamp_data_add_field((prefix +
"synchronization_time").c_str(),
331 if (
session->progress.get_cancel()) {
338 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
342 BL::ViewLayer b_view_layer =
b_depsgraph.view_layer_eval();
351 BL::RenderResult b_rr =
b_engine.begin_result(0, 0, 1, 1, b_view_layer.name().c_str(),
nullptr);
352 BL::RenderResult::layers_iterator b_single_rlay;
353 b_rr.layers.begin(b_single_rlay);
354 BL::RenderLayer b_rlay = *b_single_rlay;
365 sync->sync_render_passes(b_rlay, b_view_layer);
367 BL::RenderResult::views_iterator b_view_iter;
370 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
375 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index)
379 buffer_params.
layer = b_view_layer.name();
406 const bool can_free_cache = (view_index == num_views - 1);
407 if (can_free_cache) {
416 if (can_free_cache) {
422 if (view_index != 0) {
423 int seed =
scene->integrator->get_seed();
429 const int samples =
sync->get_layer_samples();
430 const bool bound_samples =
sync->get_layer_bound_samples();
433 if (samples != 0 && (!bound_samples || (samples < session_params.
samples))) {
434 effective_session_params.
samples = samples;
438 session->reset(effective_session_params, buffer_params);
442 scene->enable_update_stats();
450 session->collect_statistics(&stats);
454 if (
session->progress.get_cancel()) {
463 b_engine.end_result(b_rr,
true,
false,
false);
468 b_engine.tile_highlight_clear_all();
474 LOG_INFO <<
"Render time (without synchronization): " << render_time;
484 if (!
b_render.use_persistent_data()) {
493 session->process_full_buffer_from_disk(filename);
504 session->set_output_driver(
nullptr);
505 session->full_buffer_written_cb =
nullptr;
515 session->set_display_driver(
nullptr);
527 const bool filter_direct = (bake_filter & BL::BakeSettings::pass_filter_DIRECT) != 0;
528 const bool filter_indirect = (bake_filter & BL::BakeSettings::pass_filter_INDIRECT) != 0;
529 const bool filter_color = (bake_filter & BL::BakeSettings::pass_filter_COLOR) != 0;
532 bool use_direct_light =
false;
533 bool use_indirect_light =
false;
534 bool include_albedo =
false;
537 if (bake_type ==
"POSITION") {
540 else if (bake_type ==
"NORMAL") {
543 else if (bake_type ==
"UV") {
546 else if (bake_type ==
"ROUGHNESS") {
549 else if (bake_type ==
"EMIT") {
553 else if (bake_type ==
"ENVIRONMENT") {
557 else if (bake_type ==
"AO") {
561 else if (bake_type ==
"SHADOW") {
564 film->set_use_approximate_shadow_catcher(
true);
566 use_direct_light =
true;
567 use_indirect_light =
true;
568 include_albedo =
true;
570 integrator->set_use_diffuse(
true);
571 integrator->set_use_glossy(
true);
572 integrator->set_use_transmission(
true);
573 integrator->set_use_emission(
true);
576 else if (bake_type ==
"COMBINED") {
578 film->set_use_approximate_shadow_catcher(
true);
580 use_direct_light = filter_direct;
581 use_indirect_light = filter_indirect;
582 include_albedo = filter_color;
584 integrator->set_use_diffuse((bake_filter & BL::BakeSettings::pass_filter_DIFFUSE) != 0);
585 integrator->set_use_glossy((bake_filter & BL::BakeSettings::pass_filter_GLOSSY) != 0);
586 integrator->set_use_transmission((bake_filter & BL::BakeSettings::pass_filter_TRANSMISSION) !=
588 integrator->set_use_emission((bake_filter & BL::BakeSettings::pass_filter_EMIT) != 0);
591 else if ((bake_type ==
"DIFFUSE") || (bake_type ==
"GLOSSY") || (bake_type ==
"TRANSMISSION")) {
592 use_direct_light = filter_direct;
593 use_indirect_light = filter_indirect;
594 include_albedo = filter_color;
596 integrator->set_use_diffuse(bake_type ==
"DIFFUSE");
597 integrator->set_use_glossy(bake_type ==
"GLOSSY");
598 integrator->set_use_transmission(bake_type ==
"TRANSMISSION");
600 if (bake_type ==
"DIFFUSE") {
601 if (filter_direct && filter_indirect) {
604 else if (filter_direct) {
607 else if (filter_indirect) {
614 else if (bake_type ==
"GLOSSY") {
615 if (filter_direct && filter_indirect) {
618 else if (filter_direct) {
621 else if (filter_indirect) {
628 else if (bake_type ==
"TRANSMISSION") {
629 if (filter_direct && filter_indirect) {
632 else if (filter_direct) {
635 else if (filter_indirect) {
650 pass->set_name(ustring(
"Combined"));
651 pass->set_type(type);
652 pass->set_include_albedo(include_albedo);
655 integrator->set_use_direct_light(use_direct_light);
656 integrator->set_use_indirect_light(use_indirect_light);
662 integrator->set_use_denoise(
false);
669 BL::Object &b_object,
670 const string &bake_type,
671 const int bake_filter,
672 const int bake_width,
673 const int bake_height)
684 session->set_display_driver(
nullptr);
685 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
689 sync->set_bake_target(b_object);
703 const bool was_denoiser_enabled = integrator->get_use_denoise();
712 scene->background->set_transparent(
true);
714 if (!
session->progress.get_cancel()) {
721 Object *bake_object =
nullptr;
722 if (!
session->progress.get_cancel()) {
724 if (ob->get_is_bake_target()) {
732 const bool was_shadow_catcher = (bake_object) ? bake_object->get_is_shadow_catcher() :
false;
733 if (bake_object && bake_type ==
"SHADOW") {
734 bake_object->set_is_shadow_catcher(
true);
737 if (bake_object && !
session->progress.get_cancel()) {
740 buffer_params.
width = bake_width;
741 buffer_params.
height = bake_height;
748 session->reset(session_params, buffer_params);
754 if (bake_object && !
session->progress.get_cancel()) {
761 bake_object->set_is_shadow_catcher(was_shadow_catcher);
766 integrator->set_use_denoise(was_denoiser_enabled);
783 if (
session->params.modified(session_params) ||
scene->params.modified(scene_params)) {
793 session->set_pause(session_pause);
806 if (!
session->ready_to_reset() || !
session->scene->mutex.try_lock()) {
835 if (
scene->need_reset()) {
836 session->reset(session_params, buffer_params);
846 session->scene->mutex.unlock();
863 const int pass_index = space_image.image_user().multilayer_pass();
865 BL::RenderPass b_display_pass(
b_engine.pass_by_index_get(
b_rlay_name.c_str(), pass_index));
866 if (!b_display_pass) {
879 scene->film->set_display_pass(pass->get_type());
885 BL::Array<float, 2> zoom = space_image.zoom();
899 if (
session->ready_to_reset()) {
922 if (!
session->scene->mutex.try_lock()) {
930 if (
scene->camera->is_modified()) {
934 session->scene->mutex.unlock();
945 if (session_pause ==
false) {
946 session->reset(session_params, buffer_params);
970 progress =
session->progress.get_progress();
975 const double progress =
session->progress.get_progress();
978 b_engine.update_progress((
float)progress);
990 status +=
" | " + substatus;
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;
1003 const double remaining_time =
session->get_estimated_remaining_time();
1004 if (remaining_time > 0) {
1012 const double current_time =
time_dt();
1018 b_engine.update_memory_stats(mem_used, mem_peak);
1023 b_engine.update_progress((
float)progress);
1032 if (!
session->progress.get_error()) {
1036 const string error =
session->progress.get_error_message();
1080 session->progress.set_cancel(
"Cancelled");
1117 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)
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
struct BlenderSession::@354214365005032072334250106204100123257136110325 draw_state_
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()