[Bf-blender-cvs] [1e5e81a8738] usd-importer-T81257-merge: Initial USD Import open sourcing.
Benjamin Skinner
noreply at git.blender.org
Mon Feb 8 22:21:42 CET 2021
Commit: 1e5e81a873874ac23ed390292221c9745c0bfc2b
Author: Benjamin Skinner
Date: Tue Nov 17 10:43:35 2020 -0500
Branches: usd-importer-T81257-merge
https://developer.blender.org/rB1e5e81a873874ac23ed390292221c9745c0bfc2b
Initial USD Import open sourcing.
Cherry-picked commit of Tangent Animation's
USD importer from branch ta-usd-import in
https://github.com/tangent-opensource/blender.git.
===================================================================
M release/scripts/startup/bl_ui/space_topbar.py
M source/blender/blenkernel/CMakeLists.txt
M source/blender/blenkernel/intern/cachefile.c
M source/blender/blenkernel/intern/constraint.c
M source/blender/editors/io/io_ops.c
M source/blender/editors/io/io_usd.c
M source/blender/editors/io/io_usd.h
M source/blender/io/alembic/ABC_alembic.h
M source/blender/io/alembic/intern/alembic_capi.cc
M source/blender/io/usd/CMakeLists.txt
M source/blender/io/usd/intern/usd_capi.cc
A source/blender/io/usd/intern/usd_reader_camera.cc
A source/blender/io/usd/intern/usd_reader_camera.h
A source/blender/io/usd/intern/usd_reader_curve.cc
A source/blender/io/usd/intern/usd_reader_curve.h
A source/blender/io/usd/intern/usd_reader_geom.cc
A source/blender/io/usd/intern/usd_reader_geom.h
A source/blender/io/usd/intern/usd_reader_light.cc
A source/blender/io/usd/intern/usd_reader_light.h
A source/blender/io/usd/intern/usd_reader_mesh.cc
A source/blender/io/usd/intern/usd_reader_mesh.h
A source/blender/io/usd/intern/usd_reader_nurbs.cc
A source/blender/io/usd/intern/usd_reader_nurbs.h
A source/blender/io/usd/intern/usd_reader_prim.cc
A source/blender/io/usd/intern/usd_reader_prim.h
A source/blender/io/usd/intern/usd_reader_stage.cc
A source/blender/io/usd/intern/usd_reader_stage.h
A source/blender/io/usd/intern/usd_reader_volume.cc
A source/blender/io/usd/intern/usd_reader_volume.h
A source/blender/io/usd/intern/usd_reader_xform.cc
A source/blender/io/usd/intern/usd_reader_xform.h
A source/blender/io/usd/intern/usd_util.cc
A source/blender/io/usd/intern/usd_util.h
M source/blender/io/usd/usd.h
M source/blender/makesdna/DNA_cachefile_defaults.h
M source/blender/makesdna/DNA_cachefile_types.h
M source/blender/makesdna/DNA_customdata_types.h
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_cachefile.c
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/CMakeLists.txt
M source/blender/modifiers/intern/MOD_meshsequencecache.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index a7e28c38b9e..02cc4cc4266 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -441,6 +441,9 @@ class TOPBAR_MT_file_import(Menu):
text="Collada (Default) (.dae)")
if bpy.app.build_options.alembic:
self.layout.operator("wm.alembic_import", text="Alembic (.abc)")
+ if bpy.app.build_options.usd:
+ self.layout.operator(
+ "wm.usd_import", text="Universal Scene Description (.usd, .usdc, .usda)")
class TOPBAR_MT_file_export(Menu):
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 82f985a3227..3a7715a1d33 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -668,6 +668,13 @@ if(WITH_ALEMBIC)
add_definitions(-DWITH_ALEMBIC)
endif()
+if(WITH_USD)
+ list(APPEND INC
+ ../io/usd
+ )
+ add_definitions(-DWITH_USD)
+endif()
+
if(WITH_OPENSUBDIV)
list(APPEND INC_SYS
${OPENSUBDIV_INCLUDE_DIRS}
diff --git a/source/blender/blenkernel/intern/cachefile.c b/source/blender/blenkernel/intern/cachefile.c
index d6c31809a2e..fa11c43769c 100644
--- a/source/blender/blenkernel/intern/cachefile.c
+++ b/source/blender/blenkernel/intern/cachefile.c
@@ -55,6 +55,10 @@
# include "ABC_alembic.h"
#endif
+#ifdef WITH_USD
+# include "usd.h"
+#endif
+
static void cachefile_handle_free(CacheFile *cache_file);
static void cache_file_init_data(ID *id)
@@ -162,89 +166,178 @@ void BKE_cachefile_reader_open(CacheFile *cache_file,
Object *object,
const char *object_path)
{
+ switch (cache_file->type) {
#ifdef WITH_ALEMBIC
- BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
+ case CACHEFILE_TYPE_ALEMBIC:
+ BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
- if (cache_file->handle == NULL) {
- return;
- }
+ if (cache_file->handle == NULL) {
+ return;
+ }
- /* Open Alembic cache reader. */
- *reader = CacheReader_open_alembic_object(cache_file->handle, *reader, object, object_path);
+ /* Open Alembic cache reader. */
+ *reader = CacheReader_open_alembic_object(
+ (CacheArchiveHandle *)cache_file->handle, *reader, object, object_path);
+
+ /* Multiple modifiers and constraints can call this function concurrently. */
+ BLI_spin_lock(&spin);
+ if (*reader) {
+ /* Register in set so we can free it when the cache file changes. */
+ if (cache_file->handle_readers == NULL) {
+ cache_file->handle_readers = BLI_gset_ptr_new("CacheFile.handle_readers");
+ }
+ BLI_gset_reinsert(cache_file->handle_readers, reader, NULL);
+ }
+ else if (cache_file->handle_readers) {
+ /* Remove in case CacheReader_open_alembic_object free the existing reader. */
+ BLI_gset_remove(cache_file->handle_readers, reader, NULL);
+ }
+ BLI_spin_unlock(&spin);
+ break;
+#endif
+#ifdef WITH_USD
+ case CACHEFILE_TYPE_USD:
+ BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
+ if (cache_file->handle == NULL) {
+ return;
+ }
- /* Multiple modifiers and constraints can call this function concurrently. */
- BLI_spin_lock(&spin);
- if (*reader) {
- /* Register in set so we can free it when the cache file changes. */
- if (cache_file->handle_readers == NULL) {
- cache_file->handle_readers = BLI_gset_ptr_new("CacheFile.handle_readers");
- }
- BLI_gset_reinsert(cache_file->handle_readers, reader, NULL);
- }
- else if (cache_file->handle_readers) {
- /* Remove in case CacheReader_open_alembic_object free the existing reader. */
- BLI_gset_remove(cache_file->handle_readers, reader, NULL);
- }
- BLI_spin_unlock(&spin);
-#else
- UNUSED_VARS(cache_file, reader, object, object_path);
+ /* Open USD cache reader. */
+ *reader = CacheReader_open_usd_object(
+ (USDStageHandle *)cache_file->handle, *reader, object, object_path);
+ /* Multiple modifiers and constraints can call this function concurrently. */
+ BLI_spin_lock(&spin);
+ if (*reader) {
+ /* Register in set so we can free it when the cache file changes. */
+ if (cache_file->handle_readers == NULL) {
+ cache_file->handle_readers = BLI_gset_ptr_new("CacheFile.handle_readers");
+ }
+ BLI_gset_reinsert(cache_file->handle_readers, reader, NULL);
+ }
+ else if (cache_file->handle_readers) {
+ /* Remove in case CacheReader_open_usd_object free the existing reader. */
+ BLI_gset_remove(cache_file->handle_readers, reader, NULL);
+ }
+ BLI_spin_unlock(&spin);
+ break;
#endif
+ default:
+ UNUSED_VARS(cache_file, reader, object, object_path);
+ break;
+ }
}
void BKE_cachefile_reader_free(CacheFile *cache_file, struct CacheReader **reader)
{
+ switch (cache_file->type) {
#ifdef WITH_ALEMBIC
- if (*reader != NULL) {
- if (cache_file) {
- BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
- }
+ case CACHEFILE_TYPE_ALEMBIC:
+ if (*reader != NULL) {
+ if (cache_file) {
+ BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
+ }
- CacheReader_free(*reader);
- *reader = NULL;
+ CacheReader_free(*reader);
+ *reader = NULL;
- /* Multiple modifiers and constraints can call this function concurrently. */
- BLI_spin_lock(&spin);
- if (cache_file && cache_file->handle_readers) {
- BLI_gset_remove(cache_file->handle_readers, reader, NULL);
- }
- BLI_spin_unlock(&spin);
- }
-#else
- UNUSED_VARS(cache_file, reader);
+ /* Multiple modifiers and constraints can call this function concurrently. */
+ BLI_spin_lock(&spin);
+ if (cache_file && cache_file->handle_readers) {
+ BLI_gset_remove(cache_file->handle_readers, reader, NULL);
+ }
+ BLI_spin_unlock(&spin);
+ }
#endif
+#ifdef WITH_USD
+ case CACHEFILE_TYPE_USD:
+ if (*reader != NULL) {
+ if (cache_file) {
+ BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
+ }
+
+ USDCacheReader_free(*reader);
+ *reader = NULL;
+
+ /* Multiple modifiers and constraints can call this function concurrently. */
+ BLI_spin_lock(&spin);
+ if (cache_file && cache_file->handle_readers) {
+ BLI_gset_remove(cache_file->handle_readers, reader, NULL);
+ }
+ BLI_spin_unlock(&spin);
+ }
+ break;
+#endif
+ default:
+ UNUSED_VARS(cache_file, reader);
+ break;
+ }
}
static void cachefile_handle_free(CacheFile *cache_file)
{
+ switch (cache_file->type) {
#ifdef WITH_ALEMBIC
- /* Free readers in all modifiers and constraints that use the handle, before
- * we free the handle itself. */
- BLI_spin_lock(&spin);
- if (cache_file->handle_readers) {
- GSetIterator gs_iter;
- GSET_ITER (gs_iter, cache_file->handle_readers) {
- struct CacheReader **reader = BLI_gsetIterator_getKey(&gs_iter);
- if (*reader != NULL) {
- CacheReader_free(*reader);
- *reader = NULL;
+ case CACHEFILE_TYPE_ALEMBIC:
+ /* Free readers in all modifiers and constraints that use the handle, before
+ * we free the handle itself. */
+ BLI_spin_lock(&spin);
+ if (cache_file->handle_readers) {
+ GSetIterator gs_iter;
+ GSET_ITER (gs_iter, cache_file->handle_readers) {
+ struct CacheReader **reader = BLI_gsetIterator_getKey(&gs_iter);
+ if (*reader != NULL) {
+ CacheReader_free(*reader);
+ *reader = NULL;
+ }
+ }
+
+ BLI_gset_free(cache_file->handle_readers, NULL);
+ cache_file->handle_readers = NULL;
}
- }
+ BLI_spin_unlock(&spin);
- BLI_gset_free(cache_file->handle_readers, NULL);
- cache_file->handle_readers = NULL;
- }
- BLI_spin_unlock(&spin);
+ /* Free handle. */
+ if (cache_file->handle) {
+ ABC_free_handle((CacheArchiveHandle *)cache_file->handle);
+ cache_file->handle = NULL;
+ }
- /* Free handle. */
- if (cache_file->handle) {
- ABC_free_handle(cache_file->handle);
- cache_file->handle = NULL;
- }
+ cache_file->handle_filepath[0] = '\0';
+ break;
+#endif
+#ifdef WITH_USD
+ case CACHEFILE_TYPE_USD:
+ /* Free readers in all modifiers and constraints that use the handle, before
+ * we free the handle itself. */
+ BLI_spin_lock(&spin);
+ if (cache_file->handle_readers) {
+ GSetIterator gs_iter;
+ GSET_ITER (gs_iter, cache_file->handle_readers) {
+ struct CacheReader **reader = BLI_gsetIterator_getKey(&gs_iter);
+ if (*reader != NULL) {
+ USDCacheReader_free(*reader);
+ *reader = NULL;
+ }
+ }
+
+ BLI_gset_free(cache_file->handle_readers, NULL);
+ cache_file->handle_readers = NULL;
+ }
+ BLI_spin_unlock(&spin);
- cache_file->handle_filepath[0] = '\0';
-#else
- UNUSED_VARS(cache_file);
+ /* Free handle. */
+ if (cache_file->handle) {
+ USD_free_handle((USDStageHandle *)cache_file->handle);
+ cache_file->handle = NULL;
+ }
+
+ cache_file->handle_filepath[0] = '\0';
+ break;
#endif
+ default:
+ UNUSED_VARS(cache_file);
+ break;
+ }
}
void *BKE_cachefile_add(Main *bmain, const char *name)
@@ -284,8 +377,20 @@ void BKE_cachefile_eval(Main *bmain, Depsgraph *depsgraph, CacheFile *cache_file
BLI_freelistN(&cache_file->object_paths);
#ifdef WITH_ALEMBIC
- cache_file->handle = ABC_create_handle(bmain, filepath, &cache_file->object_paths);
- BLI_strncpy(cache_file->handle_filepath, filepath, FILE_MAX);
+ if (BLI_path_extension_check_glob(filepath, "*abc")) {
+ cache_file->type = CACHEFILE_TYPE_ALEMBIC;
+ cache_file->handle = (CacheArchiveHandle *)ABC_create_handle(
+ bmain, filepath, &cache_file->object_paths);
+ BLI_strncpy(cache_file->handle_fi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list