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);
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 pxr::UsdStagePopulationMask pop_mask;
170 for (
const std::string &mask_token : pxr::TfStringTokenize(
data->params.prim_path_mask,
",;")) {
171 pxr::SdfPath prim_path(mask_token);
172 if (!prim_path.IsEmpty()) {
173 pop_mask.Add(prim_path);
177 pxr::UsdStageRefPtr stage = pop_mask.IsEmpty() ?
178 pxr::UsdStage::Open(
data->filepath) :
179 pxr::UsdStage::OpenMasked(
data->filepath, pop_mask);
184 "USD Import: unable to open stage to read %s",
186 data->import_ok =
false;
191 double scene_scale =
data->params.scale;
192 if (
data->params.apply_unit_conversion_scale) {
193 scene_scale *= pxr::UsdGeomGetStageMetersPerUnit(stage);
197 if (
data->params.set_frame_range) {
198 data->scene->r.sfra = stage->GetStartTimeCode();
199 data->scene->r.efra = stage->GetEndTimeCode();
202 *
data->do_update =
true;
203 *
data->progress = 0.15f;
207 auto get_cache_file = [
data, scene_scale]() {
208 if (!
data->cache_file) {
217 data->cache_file->is_sequence =
data->params.is_sequence;
218 data->cache_file->scale = scene_scale;
224 return data->cache_file;
234 data->archive = archive;
238 if (
data->params.import_lights &&
data->params.create_world_material &&
245 if (
data->params.import_materials &&
data->params.import_all_materials) {
249 *
data->do_update =
true;
250 *
data->progress = 0.2f;
258 *
data->do_update =
true;
259 *
data->progress = 0.25f;
266 reader->create_object(
data->bmain);
267 if ((++
i & 1023) == 0) {
268 *
data->do_update =
true;
269 *
data->progress = 0.25f + 0.25f * (
i /
size);
280 Object *ob = reader->object();
281 reader->read_object_data(
data->bmain, 0.0);
284 if (parent ==
nullptr) {
291 *
data->progress = 0.5f + 0.5f * (++
i /
size);
292 *
data->do_update =
true;
295 data->was_canceled =
true;
300 if (
data->params.import_skeletons) {
304 data->import_ok = !
data->was_canceled;
315 if (
data->was_canceled &&
data->archive) {
325 if (
Object *ob = reader->object()) {
330 else if (
data->archive) {
348 if (reader->is_in_proto()) {
352 Object *ob = reader->object();
366 Object *ob = reader->object();
384 if (
data->params.import_materials &&
data->params.import_all_materials) {
385 data->archive->fake_users_for_unused_materials();
388 data->archive->call_material_import_hooks(
data->bmain);
392 if (
data->is_background_job) {
401 switch (
data->error_code) {
404 data->import_ok = !
data->was_canceled;
409 "Could not open USD archive for reading, see console for detail");
421 delete data->archive;
426 const char *filepath,
428 bool as_background_job,
450 bool import_ok =
false;
451 if (as_background_job) {
469 worker_status.
reports = reports;
487 const char **r_err_str)
490 pxr::UsdPrim iobject = usd_reader->
prim();
492 if (!iobject.IsValid()) {
493 *r_err_str =
RPT_(
"Invalid object: verify object path");
503 params.motion_sample_time = motion_sample_time;
504 params.read_flags = read_flags;
512 const char **r_err_str)
516 if (usd_reader ==
nullptr) {
525 const Mesh *existing_mesh,
527 const char **r_err_str)
531 if (usd_reader ==
nullptr) {
541 const char *object_path)
543 if (object_path[0] ==
'\0') {
549 if (!archive || !archive->
valid()) {
557 pxr::UsdPrim prim = archive->
stage()->GetPrimAtPath(pxr::SdfPath(object_path));
566 if (usd_reader ==
nullptr) {
570 if (!usd_reader->
valid()) {
574 usd_reader->
object(
object);
577 return reinterpret_cast<CacheReader *
>(usd_reader);
591 const char *filepath,
594 pxr::UsdStageRefPtr stage = pxr::UsdStage::Open(filepath);
624 bool is_constant =
false;
631 if (object->
parent ==
nullptr) {
633 usd_reader->
read_matrix(r_mat_world, time, scale, &is_constant);
637 float mat_parent[4][4];
640 float mat_local[4][4];
641 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 bool topology_changed(const Mesh *, pxr::UsdTimeCode)
virtual void read_geometry(bke::GeometrySet &geometry_set, USDMeshReadParams params, const char **r_err_str)=0
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_locked_interface_set(wmWindowManager *wm, bool lock)
void WM_main_add_notifier(uint type, void *reference)
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))