51#include <pxr/usd/usd/stage.h>
52#include <pxr/usd/usdGeom/metrics.h>
70 if (!
object.IsValid()) {
74 for (
const pxr::UsdPrim &childPrim :
object.GetChildren()) {
80 STRNCPY(usd_path->
path,
object.GetPrimPath().GetString().c_str());
119 fmt::print(
"USD import of '{}' took ",
data->filepath);
128 data->stop = &worker_status->stop;
129 data->do_update = &worker_status->do_update;
130 data->progress = &worker_status->progress;
131 data->was_canceled =
false;
132 data->archive =
nullptr;
133 data->start_time = timeit::Clock::now();
134 data->cache_file =
nullptr;
136 data->params.worker_status = worker_status;
141 if (
data->params.create_collection) {
146 data->bmain,
data->scene->master_collection, display_name);
153 data->view_layer, import_collection);
158 *
data->do_update =
true;
159 *
data->progress = 0.05f;
162 data->was_canceled =
true;
166 *
data->do_update =
true;
167 *
data->progress = 0.1f;
169 std::string prim_path_mask(
data->params.prim_path_mask);
170 pxr::UsdStagePopulationMask pop_mask;
171 if (!prim_path_mask.empty()) {
172 for (
const std::string &mask_token : pxr::TfStringTokenize(prim_path_mask,
",;")) {
173 pxr::SdfPath prim_path(mask_token);
174 if (!prim_path.IsEmpty()) {
175 pop_mask.Add(prim_path);
180 pxr::UsdStageRefPtr stage = pop_mask.IsEmpty() ?
181 pxr::UsdStage::Open(
data->filepath) :
182 pxr::UsdStage::OpenMasked(
data->filepath, pop_mask);
187 "USD Import: unable to open stage to read %s",
189 data->import_ok =
false;
194 double scene_scale =
data->params.scale;
195 if (
data->params.apply_unit_conversion_scale) {
196 scene_scale *= pxr::UsdGeomGetStageMetersPerUnit(stage);
200 if (
data->params.set_frame_range) {
201 data->scene->r.sfra = stage->GetStartTimeCode();
202 data->scene->r.efra = stage->GetEndTimeCode();
205 *
data->do_update =
true;
206 *
data->progress = 0.15f;
210 auto get_cache_file = [
data, scene_scale]() {
211 if (!
data->cache_file) {
220 data->cache_file->is_sequence =
data->params.is_sequence;
221 data->cache_file->scale = scene_scale;
227 return data->cache_file;
237 data->archive = archive;
241 if (
data->params.import_lights &&
data->params.create_world_material &&
248 if (
data->params.import_materials &&
data->params.import_all_materials) {
252 *
data->do_update =
true;
253 *
data->progress = 0.2f;
255 const float size = float(archive->
readers().size());
261 *
data->do_update =
true;
262 *
data->progress = 0.25f;
269 reader->create_object(
data->bmain);
270 if ((++
i & 1023) == 0) {
271 *
data->do_update =
true;
272 *
data->progress = 0.25f + 0.25f * (
i /
size);
283 Object *ob = reader->object();
284 reader->read_object_data(
data->bmain, 0.0);
287 if (parent ==
nullptr) {
294 *
data->progress = 0.5f + 0.5f * (++
i /
size);
295 *
data->do_update =
true;
298 data->was_canceled =
true;
303 if (
data->params.import_skeletons) {
307 data->import_ok = !
data->was_canceled;
309 worker_status->progress = 1.0f;
310 worker_status->do_update =
true;
318 if (
data->was_canceled &&
data->archive) {
328 if (
Object *ob = reader->object()) {
333 else if (
data->archive) {
351 if (reader->is_in_proto()) {
355 Object *ob = reader->object();
369 Object *ob = reader->object();
387 if (
data->params.import_materials &&
data->params.import_all_materials) {
388 data->archive->fake_users_for_unused_materials();
391 data->archive->call_material_import_hooks(
data->bmain);
395 if (
data->is_background_job) {
404 switch (
data->error_code) {
407 data->import_ok = !
data->was_canceled;
412 "Could not open USD archive for reading, see console for detail");
426 delete data->archive;
431 const char *filepath,
433 bool as_background_job,
455 bool import_ok =
false;
456 if (as_background_job) {
472 wmJobWorkerStatus worker_status = {};
474 worker_status.reports =
reports;
492 const char **r_err_str)
495 pxr::UsdPrim iobject = usd_reader->
prim();
497 if (!iobject.IsValid()) {
498 *r_err_str =
RPT_(
"Invalid object: verify object path");
508 params.motion_sample_time = motion_sample_time;
509 params.read_flags = read_flags;
517 const char **r_err_str)
521 if (usd_reader ==
nullptr) {
530 const Mesh *existing_mesh,
532 const char **r_err_str)
536 if (usd_reader ==
nullptr) {
546 const char *object_path)
548 if (object_path[0] ==
'\0') {
554 if (!archive || !archive->
valid()) {
562 pxr::UsdPrim prim = archive->
stage()->GetPrimAtPath(pxr::SdfPath(object_path));
571 if (usd_reader ==
nullptr) {
575 if (!usd_reader->
valid()) {
579 usd_reader->
object(
object);
582 return reinterpret_cast<CacheReader *
>(usd_reader);
596 const char *filepath,
599 pxr::UsdStageRefPtr stage = pxr::UsdStage::Open(filepath);
629 bool is_constant =
false;
636 if (object->
parent ==
nullptr) {
638 usd_reader->
read_matrix(r_mat_world, time, scale, &is_constant);
642 float mat_parent[4][4];
645 float mat_local[4][4];
646 usd_reader->
read_matrix(mat_local, time, scale, &is_constant);
void * BKE_cachefile_add(Main *bmain, const char *name)
Collection * BKE_collection_add(Main *bmain, Collection *collection_parent, const char *name_custom)
bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(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)
LayerCollection * BKE_layer_collection_first_from_scene_collection(const ViewLayer *view_layer, const Collection *collection)
LayerCollection * BKE_layer_collection_get_active(ViewLayer *view_layer)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
void BKE_view_layer_base_deselect_all(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
void BKE_view_layer_base_select_and_set_active(ViewLayer *view_layer, Base *selbase)
void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL()
const char * BKE_main_blendfile_path_from_global()
General operations, lookup, etc. for blender objects.
void BKE_object_get_parent_matrix(const Object *ob, Object *par, float r_parentmat[4][4])
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void BLI_path_to_display_name(char *display_name, int display_name_maxncpy, const char *name) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
Object groups, one object can be in many groups at once.
These structs are the foundation for all linked lists in the library system.
Object is a sort of wrapper for general info.
void ED_undo_push(bContext *C, const char *str)
Read Guarded memory(de)allocation.
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void create_object(Main *) override
virtual void read_geometry(bke::GeometrySet &geometry_set, USDMeshReadParams params, const char **r_err_str)=0
virtual bool topology_changed(const Mesh *, double)
const pxr::UsdPrim & prim() const
USDPrimReader * parent() const
virtual bool valid() const
USDPrimReader * create_reader(const pxr::UsdPrim &prim)
pxr::UsdStageRefPtr stage()
const blender::Vector< USDPrimReader * > & readers() const
void find_material_import_hook_sources()
void process_armature_modifiers() const
const blender::Vector< USDDomeLightReader * > & dome_light_readers() const
void import_all_materials(struct Main *bmain)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_callocN(size_t len, const char *str)
static void import_endjob(void *customdata)
static USDPrimReader * get_usd_reader(CacheReader *reader, const Object *, const char **r_err_str)
CacheArchiveHandle * USD_create_handle(Main *, const char *filepath, ListBase *object_paths)
CacheReader * CacheReader_open_usd_object(CacheArchiveHandle *handle, CacheReader *reader, Object *object, const char *object_path)
static void import_freejob(void *user_data)
static bool gather_objects_paths(const pxr::UsdPrim &object, ListBase *object_paths)
static void report_job_duration(const ExportJobData *data)
bool USD_mesh_topology_changed(CacheReader *reader, const Object *ob, const Mesh *existing_mesh, const double time, const char **r_err_str)
USDMeshReadParams create_mesh_read_params(const double motion_sample_time, const int read_flags)
void USD_get_transform(CacheReader *reader, float r_mat_world[4][4], float time, float scale)
void USD_read_geometry(CacheReader *reader, const Object *ob, blender::bke::GeometrySet &geometry_set, const USDMeshReadParams params, const char **r_err_str)
bool USD_import(const bContext *C, const char *filepath, const USDImportParams *params, bool as_background_job, ReportList *reports)
void call_import_hooks(USDStageReader *archive, ReportList *reports)
void USD_free_handle(CacheArchiveHandle *handle)
void USD_CacheReader_free(CacheReader *reader)
static void import_startjob(void *customdata, wmJobWorkerStatus *worker_status)
static USDStageReader * stage_reader_from_handle(CacheArchiveHandle *handle)
static CacheArchiveHandle * handle_from_stage_reader(USDStageReader *reader)
void register_hook_converters()
std::chrono::nanoseconds Nanoseconds
Clock::time_point TimePoint
void print_duration(Nanoseconds duration)
struct Collection * collection
timeit::TimePoint start_time
void WM_main_add_notifier(uint type, void *reference)
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))