23#include "util/color.h"
46 BL::Preferences &b_userpref,
47 BL::BlendData &b_data,
53 b_userpref(b_userpref),
55 b_render(b_engine.render()),
62 preview_osl(preview_osl),
63 python_thread_state(
NULL),
64 use_developer_ui(b_userpref.experimental().use_cycles_debug() &&
65 b_userpref.view().show_developer_ui())
75 BL::Preferences &b_userpref,
76 BL::BlendData &b_data,
77 BL::SpaceView3D &b_v3d,
78 BL::RegionView3D &b_rv3d,
85 b_userpref(b_userpref),
87 b_render(b_engine.render()),
95 python_thread_state(
NULL),
96 use_developer_ui(b_userpref.experimental().use_cycles_debug() &&
97 b_userpref.view().show_developer_ui())
138 BL::Object b_camera_override(
b_engine.camera_override());
166 this->
b_scene = b_depsgraph.scene_eval();
186 if (is_new_session) {
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());
242 b_null_space_view3d, b_null_region_view3d, scene->camera,
width,
height);
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(),
306 if (scene->film->get_cryptomatte_passes() &
CRYPT_OBJECT) {
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));
316 if (scene->film->get_cryptomatte_passes() &
CRYPT_ASSET) {
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(),
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;
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();
432 scene->integrator->set_seed(
seed);
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();
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()) {
532 Film *film = scene->film;
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) {
656 Pass *pass = scene->create_node<
Pass>();
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());
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);
728 Object *bake_object =
nullptr;
730 foreach (
Object *ob, scene->objects) {
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);
747 buffer_params.
width = bake_width;
748 buffer_params.
height = bake_height;
769 bake_object->set_is_shadow_catcher(was_shadow_catcher);
774 integrator->set_use_denoise(was_denoiser_enabled);
822 BL::Object b_camera_override(
b_engine.camera_override());
844 if (scene->need_reset()) {
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) {
883 const Pass *pass =
Pass::find(scene->passes, b_display_pass.name());
888 scene->film->set_display_pass(pass->get_type());
894 BL::Array<float, 2> zoom = space_image.zoom();
939 if (scene->camera->is_modified()) {
954 if (session_pause ==
false) {
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;
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);
1136 unique_ptr<BlenderDisplayDriver> display_driver = make_unique<BlenderDisplayDriver>(
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 set_zoom(float zoom_x, float zoom_y)
void stamp_view_layer_metadata(Scene *scene, const string &view_layer_name)
BL::RenderSettings b_render
struct BlenderSession::@1415 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)
void sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d)
void sync_data(BL::RenderSettings &b_render, BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, BL::Object &b_override, int width, int height, void **python_thread_state, const DeviceInfo &denoise_device_info)
void sync_camera(BL::RenderSettings &b_render, BL::Object &b_override, int width, int height, const char *viewname)
void sync_render_passes(BL::RenderLayer &b_render_layer, BL::ViewLayer &b_view_layer)
int get_layer_bound_samples()
void free_data_after_sync(BL::Depsgraph &b_depsgraph)
static BufferParams get_buffer_params(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, Camera *cam, int width, int height)
void sync_view(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, int width, int height)
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)
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)
void set_cancel_callback(function< void()> function)
void get_status(string &status_, string &substatus_) const
void set_cancel(const string &cancel_message_)
void get_time(double &total_time_, double &render_time_) const
double get_progress() const
string get_error_message() const
void set_update_callback(function< void()> function)
bool modified(const SessionParams ¶ms) const
DeviceInfo denoise_device
void collect_statistics(RenderStats *stats)
void set_pause(bool pause)
void process_full_buffer_from_disk(string_view filename)
void set_display_driver(unique_ptr< DisplayDriver > driver)
void set_time_limit(double time_limit)
void cancel(bool quick=false)
double get_estimated_remaining_time() const
function< void(string_view)> full_buffer_written_cb
void reset(const SessionParams &session_params, const BufferParams &buffer_params)
void set_output_driver(unique_ptr< OutputDriver > driver)
void set_samples(int samples)
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,...)
std::unique_lock< std::mutex > thread_scoped_lock
string time_human_readable_from_seconds(const double seconds)
CCL_NAMESPACE_BEGIN double time_dt()