50#include <pxr/usd/usd/stage.h>
51#include <pxr/usd/usdGeom/metrics.h>
52#include <pxr/usd/usdGeom/tokens.h>
70 if (!
object.IsValid()) {
74 for (
const pxr::UsdPrim &childPrim :
object.GetChildren()) {
81 STRNCPY(usd_path->
path,
object.GetPrimPath().GetString().c_str());
91 if (!stage || pxr::UsdGeomGetStageUpAxis(stage) == pxr::UsdGeomTokens->
z) {
103 float axis[3] = {1.0f, 0.0f, 0.0f};
120 pxr::TfToken generated_key(
"Blender:generated");
121 pxr::SdfPath path(
"/");
122 auto prim = stage->GetPseudoRoot();
126 for (
auto child : prim.GetChildren()) {
127 if (child_count == 0) {
128 prim = child.GetPrim();
133 if (child_count != 1) {
141 if (!prim.HasCustomDataKey(generated_key)) {
144 path = path.AppendChild(prim.GetName());
148 if (path == pxr::SdfPath(
"/")) {
149 path = pxr::SdfPath();
189 std::cout <<
"USD import of '" <<
data->filepath <<
"' took ";
201 data->was_canceled =
false;
202 data->archive =
nullptr;
203 data->start_time = timeit::Clock::now();
204 data->cache_file =
nullptr;
206 data->params.worker_status = worker_status;
211 if (
data->params.create_collection) {
216 data->bmain,
data->scene->master_collection, display_name);
223 data->view_layer, import_collection);
230 auto get_cache_file = [
data]() {
231 if (!
data->cache_file) {
240 data->cache_file->is_sequence =
data->params.is_sequence;
241 data->cache_file->scale =
data->params.scale;
244 return data->cache_file;
247 data->settings.get_cache_file = get_cache_file;
249 *
data->do_update =
true;
250 *
data->progress = 0.05f;
253 data->was_canceled =
true;
257 *
data->do_update =
true;
258 *
data->progress = 0.1f;
260 std::string prim_path_mask(
data->params.prim_path_mask);
261 pxr::UsdStagePopulationMask pop_mask;
262 if (!prim_path_mask.empty()) {
263 for (
const std::string &mask_token : pxr::TfStringTokenize(prim_path_mask,
",;")) {
264 pxr::SdfPath prim_path(mask_token);
265 if (!prim_path.IsEmpty()) {
266 pop_mask.Add(prim_path);
271 pxr::UsdStageRefPtr stage = pop_mask.IsEmpty() ?
272 pxr::UsdStage::Open(
data->filepath) :
273 pxr::UsdStage::OpenMasked(
data->filepath, pop_mask);
278 "USD Import: unable to open stage to read %s",
280 data->import_ok =
false;
287 data->settings.stage_meters_per_unit = UsdGeomGetStageMetersPerUnit(stage);
290 if (
data->params.set_frame_range) {
291 data->scene->r.sfra = stage->GetStartTimeCode();
292 data->scene->r.efra = stage->GetEndTimeCode();
295 *
data->do_update =
true;
296 *
data->progress = 0.15f;
300 data->archive = archive;
304 if (
data->params.import_lights &&
data->params.create_world_material &&
311 if (
data->params.import_materials &&
data->params.import_all_materials) {
315 *
data->do_update =
true;
316 *
data->progress = 0.2f;
324 *
data->do_update =
true;
325 *
data->progress = 0.25f;
332 reader->create_object(
data->bmain, 0.0);
333 if ((++i & 1023) == 0) {
334 *
data->do_update =
true;
335 *
data->progress = 0.25f + 0.25f * (i /
size);
347 Object *ob = reader->object();
349 reader->read_object_data(
data->bmain, 0.0);
353 if (parent ==
nullptr) {
360 *
data->progress = 0.5f + 0.5f * (++i /
size);
361 *
data->do_update =
true;
364 data->was_canceled =
true;
369 if (
data->params.import_skeletons) {
373 data->import_ok = !
data->was_canceled;
384 if (
data->was_canceled &&
data->archive) {
394 if (
Object *ob = reader->object()) {
399 else if (
data->archive) {
417 if (reader->is_in_proto()) {
421 Object *ob = reader->object();
435 Object *ob = reader->object();
453 if (
data->params.import_materials &&
data->params.import_all_materials) {
454 data->archive->fake_users_for_unused_materials();
462 if (
data->is_background_job) {
471 switch (
data->error_code) {
474 data->import_ok = !
data->was_canceled;
479 "Could not open USD archive for reading, see console for detail");
493 delete data->archive;
498 const char *filepath,
500 bool as_background_job,
528 bool import_ok =
false;
529 if (as_background_job) {
547 worker_status.
reports = reports;
565 const char **r_err_str)
568 pxr::UsdPrim iobject = usd_reader->
prim();
570 if (!iobject.IsValid()) {
571 *r_err_str =
RPT_(
"Invalid object: verify object path");
581 params.motion_sample_time = motion_sample_time;
582 params.read_flags = read_flags;
590 const char **r_err_str)
594 if (usd_reader ==
nullptr) {
603 const Mesh *existing_mesh,
605 const char **r_err_str)
609 if (usd_reader ==
nullptr) {
619 const char *object_path)
621 if (object_path[0] ==
'\0') {
627 if (!archive || !archive->
valid()) {
635 pxr::UsdPrim prim = archive->
stage()->GetPrimAtPath(pxr::SdfPath(object_path));
644 if (usd_reader ==
nullptr) {
648 usd_reader->
object(
object);
651 return reinterpret_cast<CacheReader *
>(usd_reader);
665 const char *filepath,
668 pxr::UsdStageRefPtr stage = pxr::UsdStage::Open(filepath);
701 bool is_constant =
false;
708 if (object->
parent ==
nullptr) {
710 usd_reader->
read_matrix(r_mat_world, time, scale, &is_constant);
714 float mat_parent[4][4];
717 float mat_local[4][4];
718 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(struct 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])
void unit_m4(float m[4][4])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
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
#define STRNCPY(dst, src)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_id_tag_update_ex(Main *bmain, 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.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
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
USDPrimReader * create_reader(const pxr::UsdPrim &prim)
pxr::UsdStageRefPtr stage()
const blender::Vector< USDPrimReader * > & readers() const
const blender::Vector< pxr::UsdLuxDomeLight > & dome_lights() const
void process_armature_modifiers() const
void import_all_materials(struct Main *bmain)
draw_view in_light_buf[] float
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 convert_to_z_up(pxr::UsdStageRefPtr stage, ImportSettings *r_settings)
static void import_freejob(void *user_data)
static void find_prefix_to_skip(pxr::UsdStageRefPtr stage, ImportSettings *r_settings)
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 USD_free_handle(CacheArchiveHandle *handle)
void dome_light_to_world_material(const USDImportParams ¶ms, const ImportSettings &, Scene *scene, Main *bmain, const pxr::UsdLuxDomeLight &dome_light, const double motionSampleTime)
void USD_CacheReader_free(CacheReader *reader)
static void import_startjob(void *customdata, wmJobWorkerStatus *worker_status)
void call_import_hooks(pxr::UsdStageRefPtr stage, ReportList *reports)
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
float conversion_mat[4][4]
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))