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 ";
199 data->do_update = &worker_status->
do_update;
200 data->progress = &worker_status->
progress;
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) {
232 data->cache_file =
static_cast<CacheFile *
>(
240 data->cache_file->is_sequence = data->params.is_sequence;
241 data->cache_file->scale = data->params.scale;
242 STRNCPY(data->cache_file->filepath, data->filepath);
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 &&
308 data->params, data->settings, data->scene, data->bmain, archive->
dome_lights().
first());
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) {
402 const Scene *scene = data->scene;
403 ViewLayer *view_layer = data->view_layer;
410 data->archive->create_proto_collections(data->bmain, lc->
collection);
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;
477 BKE_report(data->params.worker_status->reports,
479 "Could not open USD archive for reading, see console for detail");
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);
719 mul_m4_m4m4(r_mat_world, mat_parent, object->parentinv);
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))