[Bf-blender-cvs] [d143e8ff753] usd-dev: USD IO: initial commit of extended features
makowalski
noreply at git.blender.org
Sun Aug 8 03:56:45 CEST 2021
Commit: d143e8ff7531c9d4504501a41f7cf868607ac846
Author: makowalski
Date: Sat Aug 7 21:38:02 2021 -0400
Branches: usd-dev
https://developer.blender.org/rBd143e8ff7531c9d4504501a41f7cf868607ac846
USD IO: initial commit of extended features
Instancing import: Import USD scene instances as Blender collection instances.
Instancing export: Extend the existing instancing option to support exporting arbitrary object hierarchies as USD scene instances. Additional support for exporting Blender particle systems as USD point instancers.
Environment map IO: Logic to convert between USD dome lights and Blender world materials, including environment textures.
Unit conversion scene scale: Automatically scale the scene for unit conversion on import and export (e.g., scale the imported objects based on the USD’s meters per unit value).
Curve export.
Armature export: Export armatures and skinned meshes to USD skeletons and skeletal animations.
Light unit conversion: Experimental code to convert between light intensity units in Nits and Blender’s light energy units, on import and export.
Transform operator options: Option to save transforms to USD as the combination of scale, rotate and translate operators, where the rotation can be expressed as Euler angles or a quaternion.
Export to USD shader nodes: Convert Blender shader nodes to UsdPreviewSurface nodes, MDL material nodes or a custom USD representation of Cycles shaders. (MDL export requires UMM addon to be installed.)
Import MDL materials: Convert MDL materials to Blender shader networks. (Requires UMM addon to be installed.)
Texture export: An option to save textures to a directory relative to the USD being exported, using either absolute or relative asset paths. This feature works with UDIM tiles as well as packed and in-memory “baked” textures.
Option to specify a default primitive on export.
Option to add a root primitive on export. This option adds a single prim as the parent of all exported prims.
===================================================================
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/abc_util.h
M source/blender/io/alembic/intern/alembic_capi.cc
M source/blender/io/common/CMakeLists.txt
M source/blender/io/common/IO_abstract_hierarchy_iterator.h
A source/blender/io/common/IO_types.h
M source/blender/io/common/intern/abstract_hierarchy_iterator.cc
M source/blender/io/usd/CMakeLists.txt
R056 source/blender/io/usd/intern/usd_capi.cc source/blender/io/usd/intern/usd_capi_export.cc
A source/blender/io/usd/intern/usd_capi_import.cc
A source/blender/io/usd/intern/usd_common.cc
A source/blender/io/usd/intern/usd_common.h
M source/blender/io/usd/intern/usd_hierarchy_iterator.cc
M source/blender/io/usd/intern/usd_hierarchy_iterator.h
A source/blender/io/usd/intern/usd_light_convert.cc
A source/blender/io/usd/intern/usd_light_convert.h
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_instance.cc
A source/blender/io/usd/intern/usd_reader_instance.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_material.cc
A source/blender/io/usd/intern/usd_reader_material.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_umm.cc
A source/blender/io/usd/intern/usd_umm.h
M source/blender/io/usd/intern/usd_writer_abstract.cc
M source/blender/io/usd/intern/usd_writer_abstract.h
A source/blender/io/usd/intern/usd_writer_armature.cc
A source/blender/io/usd/intern/usd_writer_armature.h
M source/blender/io/usd/intern/usd_writer_camera.cc
A source/blender/io/usd/intern/usd_writer_curve.cc
A source/blender/io/usd/intern/usd_writer_curve.h
M source/blender/io/usd/intern/usd_writer_hair.cc
M source/blender/io/usd/intern/usd_writer_hair.h
M source/blender/io/usd/intern/usd_writer_light.cc
A source/blender/io/usd/intern/usd_writer_material.cc
A source/blender/io/usd/intern/usd_writer_material.h
M source/blender/io/usd/intern/usd_writer_mesh.cc
M source/blender/io/usd/intern/usd_writer_mesh.h
A source/blender/io/usd/intern/usd_writer_particle.cc
A source/blender/io/usd/intern/usd_writer_particle.h
A source/blender/io/usd/intern/usd_writer_skel_root.cc
A source/blender/io/usd/intern/usd_writer_skel_root.h
A source/blender/io/usd/intern/usd_writer_skinned_mesh.cc
A source/blender/io/usd/intern/usd_writer_skinned_mesh.h
M source/blender/io/usd/intern/usd_writer_transform.cc
M source/blender/io/usd/intern/usd_writer_transform.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/makesrna/intern/rna_cachefile.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 5e68896a2a7..bcf579208a0 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -468,6 +468,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)")
self.layout.operator("wm.gpencil_import_svg", text="SVG as Grease Pencil")
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 2c25b940578..0a3bd72402b 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -694,6 +694,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 eaba5d33a20..75180de94d8 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)
@@ -166,15 +170,30 @@ void BKE_cachefile_reader_open(CacheFile *cache_file,
Object *object,
const char *object_path)
{
-#ifdef WITH_ALEMBIC
+#if defined(WITH_ALEMBIC) || defined(WITH_USD)
+
BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
if (cache_file->handle == NULL) {
return;
}
- /* Open Alembic cache reader. */
- *reader = CacheReader_open_alembic_object(cache_file->handle, *reader, object, object_path);
+ switch (cache_file->type) {
+ case CACHEFILE_TYPE_ALEMBIC:
+# ifdef WITH_ALEMBIC
+ /* Open Alembic cache reader. */
+ *reader = CacheReader_open_alembic_object(cache_file->handle, *reader, object, object_path);
+# endif
+ break;
+ case CACHEFILE_TYPE_USD:
+# ifdef WITH_USD
+ /* Open USD cache reader. */
+ *reader = CacheReader_open_usd_object(cache_file->handle, *reader, object, object_path);
+# endif
+ break;
+ case CACHE_FILE_TYPE_INVALID:
+ break;
+ }
/* Multiple modifiers and constraints can call this function concurrently. */
BLI_spin_lock(&spin);
@@ -197,16 +216,30 @@ void BKE_cachefile_reader_open(CacheFile *cache_file,
void BKE_cachefile_reader_free(CacheFile *cache_file, struct CacheReader **reader)
{
-#ifdef WITH_ALEMBIC
+#if defined(WITH_ALEMBIC) || defined(WITH_USD)
/* Multiple modifiers and constraints can call this function concurrently, and
* cachefile_handle_free() can also be called at the same time. */
BLI_spin_lock(&spin);
if (*reader != NULL) {
if (cache_file) {
BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE);
+
+ switch (cache_file->type) {
+ case CACHEFILE_TYPE_ALEMBIC:
+# ifdef WITH_ALEMBIC
+ ABC_CacheReader_free(*reader);
+# endif
+ break;
+ case CACHEFILE_TYPE_USD:
+# ifdef WITH_USD
+ USD_CacheReader_free(*reader);
+# endif
+ break;
+ case CACHE_FILE_TYPE_INVALID:
+ break;
+ }
}
- CacheReader_free(*reader);
*reader = NULL;
if (cache_file && cache_file->handle_readers) {
@@ -221,7 +254,8 @@ void BKE_cachefile_reader_free(CacheFile *cache_file, struct CacheReader **reade
static void cachefile_handle_free(CacheFile *cache_file)
{
-#ifdef WITH_ALEMBIC
+#if defined(WITH_ALEMBIC) || defined(WITH_USD)
+
/* Free readers in all modifiers and constraints that use the handle, before
* we free the handle itself. */
BLI_spin_lock(&spin);
@@ -230,7 +264,21 @@ static void cachefile_handle_free(CacheFile *cache_file)
GSET_ITER (gs_iter, cache_file->handle_readers) {
struct CacheReader **reader = BLI_gsetIterator_getKey(&gs_iter);
if (*reader != NULL) {
- CacheReader_free(*reader);
+ switch (cache_file->type) {
+ case CACHEFILE_TYPE_ALEMBIC:
+# ifdef WITH_ALEMBIC
+ ABC_CacheReader_free(*reader);
+# endif
+ break;
+ case CACHEFILE_TYPE_USD:
+# ifdef WITH_USD
+ USD_CacheReader_free(*reader);
+# endif
+ break;
+ case CACHE_FILE_TYPE_INVALID:
+ break;
+ }
+
*reader = NULL;
}
}
@@ -242,7 +290,22 @@ static void cachefile_handle_free(CacheFile *cache_file)
/* Free handle. */
if (cache_file->handle) {
- ABC_free_handle(cache_file->handle);
+
+ switch (cache_file->type) {
+ case CACHEFILE_TYPE_ALEMBIC:
+# ifdef WITH_ALEMBIC
+ ABC_free_handle(cache_file->handle);
+# endif
+ break;
+ case CACHEFILE_TYPE_USD:
+# ifdef WITH_USD
+ USD_free_handle(cache_file->handle);
+# endif
+ break;
+ case CACHE_FILE_TYPE_INVALID:
+ break;
+ }
+
cache_file->handle = NULL;
}
@@ -289,8 +352,18 @@ 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 = ABC_create_handle(bmain, filepath, &cache_file->object_paths);
+ BLI_strncpy(cache_file->handle_filepath, filepath, FILE_MAX);
+ }
+#endif
+#ifdef WITH_USD
+ if (BLI_path_extension_check_glob(filepath, "*.usd;*.usda;*.usdc")) {
+ cache_file->type = CACHEFILE_TYPE_USD;
+ cache_file->handle = USD_create_handle(bmain, filepath, &cache_file->object_paths);
+ BLI_strncpy(cache_file->handle_filepath, filepath, FILE_MAX);
+ }
#endif
if (DEG_is_active(depsgraph)) {
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index bc993d8d58d..919583601ec 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -95,6 +95,10 @@
# include "ABC_alembic.h"
#endif
+#ifdef WITH_USD
+# include "usd.h"
+#endif
+
/* ---------------------------------------------------------------------------- */
/* Useful macros for testing various common flag combinations */
@@ -5403,7 +5407,7 @@ static void transformcache_id_looper(bConstraint *con, ConstraintIDFunc func, vo
static void transformcache_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *targets)
{
-#ifdef WITH_ALEMBIC
+#if defined(WITH_ALEMBIC) || defined(WITH_USD)
bTransformCacheConstraint *data = con->data;
Scene *scene = cob->scene;
@@ -5421,7 +5425,20 @@ static void transformcache_evaluate(bConstraint *con, bConstraintOb *cob, ListBa
BKE_cachefile_reader_open(cache_file, &data->reader, cob->ob, data->object_path);
}
- ABC_get_transform(data->reader, cob->matrix, time, cache_file->scale);
+ switch (cache_file->type) {
+ case CACHEFILE_TYPE_ALEMBIC:
+# ifdef WITH_ALEMBIC
+ ABC_get_transform(data->reader, cob->matrix, time, cache_file->scale);
+# endif
+ break;
+ case CACHEFILE_TYPE_USD:
+# ifdef WITH_USD
+ USD_get_transform(data->reader, cob->matrix, time * FPS, cache_file->scale);
+# endif
+ break;
+ case CACHE_FILE_TYPE_INVALID:
+ break;
+ }
#else
UNUSED_VARS(con, cob);
#endif
diff --git a/source/blender/editors/io/io_ops.c b/source/blender/editors/io/io_ops.c
index 9fa34a1c55d..b2788ee49a2 100644
--- a/source/blender/editors/io/io_ops.c
+++ b/source/blender/editors/io/io_ops.c
@@ -52,6 +52,7 @@ void ED_operatortypes_io(void)
WM_operatortype_append(WM_OT_alembic_export);
#endif
#ifdef WITH_USD
+ WM_operatortype_append(WM_OT_usd_import);
WM_operatortype_append(WM_OT_usd_export);
#endif
diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c
index 0eadb38abb5..d827442636e 100644
--- a/source/blender/editors/io/io_usd.c
+++ b/source/blender/editors/io/io_usd.c
@@ -22,23 +22,31 @@
*/
#ifdef WITH_USD
+
+# include "DNA_modifier_types.h"
# include "DNA_space_types.h"
+# include <string.h>
# include "BKE_context.h"
# include "BKE_main.h"
# include "BKE_report.h"
+# include "BLI_blenlib.h"
# include "BLI_path_util.h"
# include "BLI_string.h"
# include "BLI_utildefines.h"
# include "BLT_translation.h"
+# include "ED_object.h"
+
# include "MEM_guardedalloc.h"
# include "RNA_access.h"
# include "RNA_define.h"
+# include "RNA_enum_types.h"
+
# include "UI_interface.h"
# include "UI_resources.h"
@@ -50,6 +58,8 @@
# include "io_usd.h"
# include "usd.h"
+# include "stdio.h"
+
const EnumPropertyItem rna_enum_usd_export_evaluation_mode_items[] = {
{DAG_EVAL_RENDER,
"RENDER",
@@ -64,6 +74,58 @@ const EnumPropertyItem rna_enum_usd_export_evaluation_mode_items[] = {
{0, NULL, 0, NULL, NULL},
};
+const EnumPropertyItem rna_enum_usd_import_shaders_mode_items[] = {
+ {USD_IMPORT_SHADERS_NONE, "NONE", 0, "None", "Don't import USD shaders"},
+ {USD_IMPORT_USD_PREVIEW_SURFACE,
+ "USD_PREVIEW_SURFACE",
+ 0,
+ "USD Preview Surface",
+ "Convert USD Preview Surface shaders to Blender Principled BSDF"},
+ {USD_IMPORT_MDL,
+ "USD MDL",
+ 0,
+ "MDL",
+ "Convert USD Preview Surface shaders to Blender Principled BSDF"},
+ {0, NULL, 0, NULL, NULL},
+};
+
+const EnumPropertyItem rna_enum_usd_import_shaders_mode_items_no_umm[] = {
+ {USD_IMPORT_SHADERS_NONE, "NONE", 0, "None", "Don't import USD shaders"},
+ {USD_IMPORT_USD_PREVIEW_SURFACE,
+ "USD_PREVIEW_SURFACE",
+ 0,
+ "USD Preview Surface",
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list