23#include "util/color.h"
77 BL::SpaceView3D &
b_v3d,
129 session->set_pause(session_pause);
138 BL::Object b_camera_override(
b_engine.camera_override());
149 session->reset(session_params, buffer_params);
186 if (is_new_session) {
205 if (
scene->params.modified(scene_params) ||
session->params.modified(session_params) ||
206 !this->b_render.use_persistent_data())
211 if (!is_new_session) {
225 if (is_new_session) {
236 BL::Object b_camera_override(
b_engine.camera_override());
243 session->reset(session_params, buffer_params);
277 string prefix =
"cryptomatte/" + identifier.substr(0, 7) +
"/";
287 BL::RenderResult b_rr =
b_engine.get_result();
288 string prefix =
"cycles." + view_layer_name +
".";
291 b_rr.stamp_data_add_field((prefix +
"samples").c_str(),
297 if (
session->tile_manager.range_num_samples != -1) {
298 b_rr.stamp_data_add_field((prefix +
"range_start_sample").c_str(),
300 b_rr.stamp_data_add_field((prefix +
"range_num_samples").c_str(),
308 view_layer_name +
".CryptoObject",
309 scene->object_manager->get_cryptomatte_objects(
scene));
313 view_layer_name +
".CryptoMaterial",
314 scene->shader_manager->get_cryptomatte_materials(
scene));
318 view_layer_name +
".CryptoAsset",
319 scene->object_manager->get_cryptomatte_assets(
scene));
325 b_rr.stamp_data_add_field((prefix +
"total_time").c_str(),
327 b_rr.stamp_data_add_field((prefix +
"render_time").c_str(),
329 b_rr.stamp_data_add_field((prefix +
"synchronization_time").c_str(),
337 if (
session->progress.get_cancel()) {
344 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
348 BL::ViewLayer b_view_layer =
b_depsgraph.view_layer_eval();
357 BL::RenderResult b_rr =
b_engine.begin_result(0, 0, 1, 1, b_view_layer.name().c_str(),
NULL);
358 BL::RenderResult::layers_iterator b_single_rlay;
359 b_rr.layers.begin(b_single_rlay);
360 BL::RenderLayer b_rlay = *b_single_rlay;
371 sync->sync_render_passes(b_rlay, b_view_layer);
373 BL::RenderResult::views_iterator b_view_iter;
376 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
381 for (b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index)
385 buffer_params.
layer = b_view_layer.name();
399 BL::Object b_camera_override(
b_engine.camera_override());
413 const bool can_free_cache = (view_index == num_views - 1);
414 if (can_free_cache) {
423 if (can_free_cache) {
429 if (view_index != 0) {
430 int seed =
scene->integrator->get_seed();
436 const int samples =
sync->get_layer_samples();
437 const bool bound_samples =
sync->get_layer_bound_samples();
440 if (samples != 0 && (!bound_samples || (samples < session_params.
samples))) {
441 effective_session_params.
samples = samples;
445 session->reset(effective_session_params, buffer_params);
449 scene->enable_update_stats();
457 session->collect_statistics(&stats);
461 if (
session->progress.get_cancel()) {
470 b_engine.end_result(b_rr,
true,
false,
false);
475 b_engine.tile_highlight_clear_all();
480 VLOG_INFO <<
"Render time (without synchronization): " << render_time;
490 if (!
b_render.use_persistent_data()) {
500 session->process_full_buffer_from_disk(filename);
511 session->set_output_driver(
nullptr);
522 session->set_display_driver(
nullptr);
534 const bool filter_direct = (bake_filter & BL::BakeSettings::pass_filter_DIRECT) != 0;
535 const bool filter_indirect = (bake_filter & BL::BakeSettings::pass_filter_INDIRECT) != 0;
536 const bool filter_color = (bake_filter & BL::BakeSettings::pass_filter_COLOR) != 0;
539 bool use_direct_light =
false;
540 bool use_indirect_light =
false;
541 bool include_albedo =
false;
544 if (bake_type ==
"POSITION") {
547 else if (bake_type ==
"NORMAL") {
550 else if (bake_type ==
"UV") {
553 else if (bake_type ==
"ROUGHNESS") {
556 else if (bake_type ==
"EMIT") {
560 else if (bake_type ==
"ENVIRONMENT") {
564 else if (bake_type ==
"AO") {
568 else if (bake_type ==
"SHADOW") {
571 film->set_use_approximate_shadow_catcher(
true);
573 use_direct_light =
true;
574 use_indirect_light =
true;
575 include_albedo =
true;
577 integrator->set_use_diffuse(
true);
578 integrator->set_use_glossy(
true);
579 integrator->set_use_transmission(
true);
580 integrator->set_use_emission(
true);
583 else if (bake_type ==
"COMBINED") {
585 film->set_use_approximate_shadow_catcher(
true);
587 use_direct_light = filter_direct;
588 use_indirect_light = filter_indirect;
589 include_albedo = filter_color;
591 integrator->set_use_diffuse((bake_filter & BL::BakeSettings::pass_filter_DIFFUSE) != 0);
592 integrator->set_use_glossy((bake_filter & BL::BakeSettings::pass_filter_GLOSSY) != 0);
593 integrator->set_use_transmission((bake_filter & BL::BakeSettings::pass_filter_TRANSMISSION) !=
595 integrator->set_use_emission((bake_filter & BL::BakeSettings::pass_filter_EMIT) != 0);
598 else if ((bake_type ==
"DIFFUSE") || (bake_type ==
"GLOSSY") || (bake_type ==
"TRANSMISSION")) {
599 use_direct_light = filter_direct;
600 use_indirect_light = filter_indirect;
601 include_albedo = filter_color;
603 integrator->set_use_diffuse(bake_type ==
"DIFFUSE");
604 integrator->set_use_glossy(bake_type ==
"GLOSSY");
605 integrator->set_use_transmission(bake_type ==
"TRANSMISSION");
607 if (bake_type ==
"DIFFUSE") {
608 if (filter_direct && filter_indirect) {
611 else if (filter_direct) {
614 else if (filter_indirect) {
621 else if (bake_type ==
"GLOSSY") {
622 if (filter_direct && filter_indirect) {
625 else if (filter_direct) {
628 else if (filter_indirect) {
635 else if (bake_type ==
"TRANSMISSION") {
636 if (filter_direct && filter_indirect) {
639 else if (filter_direct) {
642 else if (filter_indirect) {
657 pass->set_name(ustring(
"Combined"));
658 pass->set_type(type);
659 pass->set_include_albedo(include_albedo);
662 integrator->set_use_direct_light(use_direct_light);
663 integrator->set_use_indirect_light(use_indirect_light);
669 integrator->set_use_denoise(
false);
676 BL::Object &b_object,
677 const string &bake_type,
678 const int bake_filter,
679 const int bake_width,
680 const int bake_height)
689 scene->bake_manager->set(
scene, b_object.name());
691 session->set_display_driver(
nullptr);
692 session->set_output_driver(make_unique<BlenderOutputDriver>(
b_engine));
696 BL::Object b_camera_override(
b_engine.camera_override());
710 const bool was_denoiser_enabled = integrator->get_use_denoise();
719 scene->background->set_transparent(
true);
721 if (!
session->progress.get_cancel()) {
728 Object *bake_object =
nullptr;
729 if (!
session->progress.get_cancel()) {
731 if (ob->
name == b_object.name()) {
739 const bool was_shadow_catcher = (bake_object) ? bake_object->get_is_shadow_catcher() :
false;
740 if (bake_object && bake_type ==
"SHADOW") {
741 bake_object->set_is_shadow_catcher(
true);
744 if (bake_object && !
session->progress.get_cancel()) {
747 buffer_params.
width = bake_width;
748 buffer_params.
height = bake_height;
755 session->reset(session_params, buffer_params);
757 session->progress.set_update_callback(
762 if (bake_object && !
session->progress.get_cancel()) {
769 bake_object->set_is_shadow_catcher(was_shadow_catcher);
774 integrator->set_use_denoise(was_denoiser_enabled);
791 if (
session->params.modified(session_params) ||
scene->params.modified(scene_params)) {
801 session->set_pause(session_pause);
814 if (!
session->ready_to_reset() || !
session->scene->mutex.try_lock()) {
822 BL::Object b_camera_override(
b_engine.camera_override());
844 if (
scene->need_reset()) {
845 session->reset(session_params, buffer_params);
855 session->scene->mutex.unlock();
872 const int pass_index = space_image.image_user().multilayer_pass();
874 BL::RenderPass b_display_pass(
b_engine.pass_by_index_get(
b_rlay_name.c_str(), pass_index));
875 if (!b_display_pass) {
888 scene->film->set_display_pass(pass->get_type());
894 BL::Array<float, 2> zoom = space_image.zoom();
908 if (
session->ready_to_reset()) {
931 if (!
session->scene->mutex.try_lock()) {
939 if (
scene->camera->is_modified()) {
943 session->scene->mutex.unlock();
954 if (session_pause ==
false) {
955 session->reset(session_params, buffer_params);
973 session->progress.get_status(status, substatus);
979 progress =
session->progress.get_progress();
984 double progress =
session->progress.get_progress();
987 b_engine.update_progress((
float)progress);
994 string timestatus, status, substatus;
995 string scene_status =
"";
997 double total_time, remaining_time = 0, render_time;
998 float mem_used = (
float)
session->stats.mem_used / 1024.0f / 1024.0f;
999 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.size() > 0) {
1027 status =
" | " + status;
1029 if (substatus.size() > 0) {
1030 status +=
" | " + substatus;
1034 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);
1045 b_engine.update_progress((
float)progress);
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));
constexpr PointerRNA PointerRNA_NULL
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
struct BlenderSession::@300340132313211376032214177306334015362006342252 draw_state_
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 free_blender_memory_if_possible()
void view_draw(int w, int h)
BL::Preferences b_userpref
void reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsgraph)
void bake(BL::Depsgraph &b_depsgrah, BL::Object &b_object, const string &pass_type, const int custom_flag, const int bake_width, const int bake_height)
BlenderDisplayDriver * display_driver_
void render(BL::Depsgraph &b_depsgraph)
void draw(BL::SpaceImageEditor &space_image)
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 BufferParams get_buffer_params(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, Camera *cam, int width, int height)
static SceneParams get_scene_params(BL::Scene &b_scene, const bool background, const bool use_developer_ui)
static SessionParams get_session_params(BL::RenderEngine &b_engine, BL::Preferences &b_userpref, BL::Scene &b_scene, bool background)
PassInfo get_info() const
static const Pass * find(const vector< Pass * > &passes, const string &name)
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
draw_view in_light_buf[] float
static const char * to_string(const Interpolation &interp)
ccl_device_inline uint hash_uint2(uint kx, 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, int len, 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)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
T * create_node(Args &&...args)
std::unique_lock< std::mutex > thread_scoped_lock
string time_human_readable_from_seconds(const double seconds)
CCL_NAMESPACE_BEGIN double time_dt()