76 std::cout <<
"Alembic export of '" <<
data->filepath <<
"' took ";
84 data->was_canceled =
false;
85 data->start_time = blender::timeit::Clock::now();
87 G.is_rendering =
true;
97 if (!
data->params.apply_subdiv) {
104 const int orig_frame = scene->
r.
cfra;
105 const bool export_animation = (
data->params.frame_start !=
data->params.frame_end);
108 std::unique_ptr<ABCArchive> abc_archive;
110 abc_archive = std::make_unique<ABCArchive>(
111 data->bmain, scene,
data->params, std::string(
data->filepath));
113 catch (
const std::exception &ex) {
114 std::stringstream error_message_stream;
115 error_message_stream <<
"Error writing to " <<
data->filepath;
116 const std::string &error_message = error_message_stream.str();
120 CLOG_ERROR(&
LOG,
"%s: %s", error_message.c_str(), ex.what());
122 data->export_ok =
false;
127 std::stringstream error_message_stream;
128 error_message_stream <<
"Unknown error writing to " <<
data->filepath;
130 data->export_ok =
false;
136 if (export_animation) {
140 const float progress_per_frame = 1.0f / std::max(
size_t(1), abc_archive->total_frame_count());
141 ABCArchive::Frames::const_iterator frame_it = abc_archive->frames_begin();
142 const ABCArchive::Frames::const_iterator frames_end = abc_archive->frames_end();
144 for (; frame_it != frames_end; frame_it++) {
145 double frame = *frame_it;
147 if (
G.is_break || worker_status->
stop) {
152 scene->
r.
cfra = int(frame);
157 ExportSubset export_subset = abc_archive->export_subset_for_frame(frame);
161 worker_status->
progress += progress_per_frame;
173 if (scene->
r.
cfra != orig_frame) {
174 scene->
r.
cfra = orig_frame;
178 data->export_ok = !
data->was_canceled;
194 G.is_rendering =
false;
203 const char *filepath,
205 bool as_background_job)
209 ExportJobData *job = MEM_new<ExportJobData>(
"ExportJobData");
227 bool export_ok =
false;
228 if (as_background_job) {
232 "Exporting Alembic...",
238 wm_job, job, [](
void *j) { MEM_delete(
static_cast<ExportJobData *
>(j)); });
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()
char * STRNCPY(char(&dst)[N], const char *src)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_DEBUG(clg_ref,...)
#define CLOG_STR_DEBUG(clg_ref, str)
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_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)
BMesh const char void * data
void set_export_subset(ExportSubset export_subset)
void iterate_and_write() override
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_ID_NAME - 2]
AlembicExportParams params
blender::timeit::TimePoint start_time
void WM_locked_interface_set(wmWindowManager *wm, bool lock)
void WM_global_report(eReportType type, const char *message)
void WM_global_reportf(eReportType type, const char *format,...)
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))