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);
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs