[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