79 std::cout <<
"Alembic export of '" << data->filepath <<
"' took ";
88 data->start_time = blender::timeit::Clock::now();
90 G.is_rendering =
true;
100 if (!data->params.apply_subdiv) {
107 const int orig_frame = scene->r.cfra;
108 const bool export_animation = (data->params.frame_start != data->params.frame_end);
111 std::unique_ptr<ABCArchive> abc_archive;
113 abc_archive = std::make_unique<ABCArchive>(
114 data->bmain, scene, data->params, std::string(data->filepath));
116 catch (
const std::exception &ex) {
117 std::stringstream error_message_stream;
118 error_message_stream <<
"Error writing to " << data->filepath;
119 const std::string &error_message = error_message_stream.str();
123 CLOG_ERROR(&
LOG,
"%s: %s", error_message.c_str(), ex.what());
125 data->export_ok =
false;
130 std::stringstream error_message_stream;
131 error_message_stream <<
"Unknown error writing to " << data->filepath;
133 data->export_ok =
false;
139 if (export_animation) {
143 const float progress_per_frame = 1.0f / std::max(
size_t(1), abc_archive->total_frame_count());
144 ABCArchive::Frames::const_iterator frame_it = abc_archive->frames_begin();
145 const ABCArchive::Frames::const_iterator frames_end = abc_archive->frames_end();
147 for (; frame_it != frames_end; frame_it++) {
148 double frame = *frame_it;
150 if (
G.is_break || worker_status->
stop) {
155 scene->r.cfra =
int(frame);
156 scene->r.subframe =
float(frame - scene->r.cfra);
160 ExportSubset export_subset = abc_archive->export_subset_for_frame(frame);
164 worker_status->
progress += progress_per_frame;
176 if (scene->r.cfra != orig_frame) {
177 scene->r.cfra = orig_frame;
181 data->export_ok = !data->was_canceled;
193 if (data->was_canceled &&
BLI_exists(data->filepath)) {
197 G.is_rendering =
false;
206 const char *filepath,
208 bool as_background_job)
231 bool export_ok =
false;
232 if (as_background_job) {
wmWindow * CTX_wm_window(const bContext *C)
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain)
void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph)
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_delete(const char *path, bool dir, bool recursive) ATTR_NONNULL()
#define STRNCPY(dst, src)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_free(Depsgraph *graph)
void DEG_graph_build_from_collection(Depsgraph *graph, Collection *collection)
void DEG_graph_build_for_all_objects(Depsgraph *graph)
void DEG_graph_build_from_view_layer(Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
Read Guarded memory(de)allocation.
@ WM_JOB_TYPE_ALEMBIC_EXPORT
bool ABC_export(Scene *scene, bContext *C, const char *filepath, const AlembicExportParams *params, bool as_background_job)
void set_export_subset(ExportSubset export_subset)
virtual void iterate_and_write() override
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static void export_endjob(void *customdata)
static void export_startjob(void *customdata, wmJobWorkerStatus *worker_status)
static bool build_depsgraph(ExportJobData *job)
static void report_job_duration(const ExportJobData *data)
std::chrono::nanoseconds Nanoseconds
Clock::time_point TimePoint
void print_duration(Nanoseconds duration)
char collection[MAX_IDPROP_NAME]
bool visible_objects_only
AlembicExportParams params
blender::timeit::TimePoint start_time
void WM_report(eReportType type, const char *message)
void WM_reportf(eReportType type, const char *format,...)
void WM_set_locked_interface(wmWindowManager *wm, bool lock)
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))