[Bf-blender-cvs] [19fa05d37c0] universal-scene-description: USD skel export fixes.

Michael Kowalski noreply at git.blender.org
Sat Sep 3 00:52:59 CEST 2022


Commit: 19fa05d37c0fc27b79baa195a6f2cf72aee621fc
Author: Michael Kowalski
Date:   Fri Sep 2 18:51:55 2022 -0400
Branches: universal-scene-description
https://developer.blender.org/rB19fa05d37c0fc27b79baa195a6f2cf72aee621fc

USD skel export fixes.

Fixed error in USDSkinnedMeshWriter which was causing
the mesh to be written more than once when exporting
blendshapes is disabled.  Also removed unnecessary
warnings when the mesh has deform groups that don't
match any bones.

Updated USDBlendShapeMeshWriter to skip creating a
blendshape neutral mesh if exporting blendshapes is
disabled.

Added more descriptive error message when the shape key
offset count doesn't match the mesh vertex count.  Now
exporting the default mesh when this size mismatch is
detected.

===================================================================

M	source/blender/io/usd/intern/usd_writer_blendshape_mesh.cc
M	source/blender/io/usd/intern/usd_writer_skinned_mesh.cc

===================================================================

diff --git a/source/blender/io/usd/intern/usd_writer_blendshape_mesh.cc b/source/blender/io/usd/intern/usd_writer_blendshape_mesh.cc
index 6f6a78f9974..44c2d1947f4 100644
--- a/source/blender/io/usd/intern/usd_writer_blendshape_mesh.cc
+++ b/source/blender/io/usd/intern/usd_writer_blendshape_mesh.cc
@@ -39,6 +39,9 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_meta_types.h"
 
+#include "WM_api.h"
+#include "WM_types.h"
+
 #include <string>
 
 namespace usdtokens {
@@ -144,18 +147,28 @@ void USDBlendShapeMeshWriter::write_blendshape(HierarchyContext &context) const
     return;
   }
 
-  pxr::UsdSkelSkeleton skel = get_skeleton(context);
+  const Key *key = get_shape_key(context.object);
 
-  if (!skel) {
-    printf("WARNING: couldn't get skeleton for blendshape mesh prim %s\n",
-           this->usd_export_context_.usd_path.GetString().c_str());
+  if (!key || !key->block.first) {
+    WM_reportf(RPT_WARNING,
+               "WARNING: couldn't get shape key for blendshape mesh prim %s",
+               usd_export_context_.usd_path.GetString().c_str());
     return;
   }
 
-  const Key *key = get_shape_key(context.object);
+  /* Validate the offset counts. */
+  Mesh *src_mesh = static_cast<Mesh *>(context.object->data);
+  KeyBlock *basis = reinterpret_cast<KeyBlock *>(src_mesh->key->block.first);
+  if (src_mesh->totvert != basis->totelem) {
+    /* No need for a warning, as we would have warned about
+     * the vert count mismatch when creating the mesh. */
+    return;
+  }
 
-  if (!key) {
-    printf("WARNING: couldn't get shape key for blendshape mesh prim %s\n",
+  pxr::UsdSkelSkeleton skel = get_skeleton(context);
+
+  if (!skel) {
+    printf("WARNING: couldn't get skeleton for blendshape mesh prim %s\n",
            this->usd_export_context_.usd_path.GetString().c_str());
     return;
   }
@@ -331,7 +344,10 @@ pxr::UsdSkelSkeleton USDBlendShapeMeshWriter::get_skeleton(const HierarchyContex
 
 Mesh *USDBlendShapeMeshWriter::get_export_mesh(Object *object_eval, bool &r_needsfree)
 {
-  if (!is_blendshape_mesh(object_eval)) {
+  /* We must check if blendshapes are enabled before attempting to create the
+   * blendshape mesh. */
+  if (!(usd_export_context_.export_params.export_blendshapes && is_blendshape_mesh(object_eval))) {
+    /* Get the default mesh.  */
     return USDMeshWriter::get_export_mesh(object_eval, r_needsfree);
   }
 
@@ -348,10 +364,15 @@ Mesh *USDBlendShapeMeshWriter::get_export_mesh(Object *object_eval, bool &r_need
   KeyBlock *basis = reinterpret_cast<KeyBlock *>(src_mesh->key->block.first);
 
   if (src_mesh->totvert != basis->totelem) {
-    printf("WARNING: shape vert count %d doesn't match shape key number of elements %d\n",
-           src_mesh->totvert,
-           basis->totelem);
-    return nullptr;
+    WM_reportf(RPT_WARNING,
+               "USD Export: mesh %s can't be exported as a blendshape because the mesh vertex count %d "
+               "doesn't match shape key number of elements %d'.  This may be because the mesh topology was "
+               "changed by a modifier.  Exporting meshes with modifiers as blendshapes isn't currently supported",
+               object_eval->id.name + 2,
+               src_mesh->totvert,
+               basis->totelem);
+
+    return USDMeshWriter::get_export_mesh(object_eval, r_needsfree);
   }
 
   Mesh *temp_mesh = reinterpret_cast<Mesh *>(
diff --git a/source/blender/io/usd/intern/usd_writer_skinned_mesh.cc b/source/blender/io/usd/intern/usd_writer_skinned_mesh.cc
index a79b0dd42fe..320cd41b1ae 100644
--- a/source/blender/io/usd/intern/usd_writer_skinned_mesh.cc
+++ b/source/blender/io/usd/intern/usd_writer_skinned_mesh.cc
@@ -78,9 +78,11 @@ USDSkinnedMeshWriter::USDSkinnedMeshWriter(const USDExporterContext &ctx)
 
 void USDSkinnedMeshWriter::do_write(HierarchyContext &context)
 {
-  if (this->frame_has_been_written_ && usd_export_context_.export_params.export_blendshapes) {
+  if (this->frame_has_been_written_) {
     /* Only blendshapes may be animated on skinned meshes. */
-    write_blendshape(context);
+    if (usd_export_context_.export_params.export_blendshapes) {
+      write_blendshape(context);
+    }
     return;
   }
 
@@ -214,12 +216,6 @@ void USDSkinnedMeshWriter::write_weights(const Object *ob,
       }
     }
 
-    if (bone_idx == -1) {
-      printf("WARNING: deform group %s in skinned mesh %s doesn't match any bones\n",
-             def->name,
-             this->usd_export_context_.usd_path.GetString().c_str());
-    }
-
     group_to_bone_idx.push_back(bone_idx);
   }



More information about the Bf-blender-cvs mailing list