Skip to content

Commit

Permalink
Merge pull request #1396 from anatawa12/fix-merge-skinned-mesh-preserve
Browse files Browse the repository at this point in the history
fix: preventing removing viseme blendShapes not working for manual Merge Skinned Mesh
  • Loading branch information
anatawa12 authored Feb 8, 2025
2 parents 10adfae + a40dc55 commit 3aae111
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 15 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-PRERELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog].
### Removed

### Fixed
- Error when we manually configure Merge Skinned Mesh for face mesh along with Trace and Optimize `#1396`

### Security

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog].
### Removed

### Fixed
- Error when we manually configure Merge Skinned Mesh for face mesh along with Trace and Optimize `#1396`

### Security

Expand Down
34 changes: 19 additions & 15 deletions Editor/Processors/SkinnedMeshes/MergeSkinnedMeshProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,6 @@ bool RendererEnabled(Renderer x)
staticMeshRenderers = StaticMeshRenderers.ToList();
}

Profiler.BeginSample("Merge PreserveBlendShapes");
{
var state = context.GetState<TraceAndOptimizes.TraceAndOptimizeState>();
HashSet<string>? thisPreserve = null;
foreach (var skinnedRenderer in skinnedMeshRenderers)
{
if (!state.PreserveBlendShapes.TryGetValue(skinnedRenderer, out var preserve)) continue;

if (thisPreserve == null && !state.PreserveBlendShapes.TryGetValue(Target, out thisPreserve))
state.PreserveBlendShapes.Add(Target, thisPreserve = new HashSet<string>());
thisPreserve.UnionWith(preserve);
}
}
Profiler.EndSample();

Profiler.BeginSample("Collect MeshInfos");
// Owns staticRendererMeshInfos
var staticRendererMeshInfos = staticMeshRenderers.Select(renderer => new MeshInfo2(renderer)).ToDisposableList();
Expand Down Expand Up @@ -323,6 +308,16 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) =>

var rendererPrefixes = BlendShapePrefixComputer.Create();

var traceAndOptimizeState = context.GetState<TraceAndOptimizes.TraceAndOptimizeState>();

void AddPreserveBlendShapes(IEnumerable<string> preserves)
{
var targetRenderer = (SkinnedMeshRenderer)target.SourceRenderer;
if (!traceAndOptimizeState.PreserveBlendShapes.TryGetValue(targetRenderer, out var thisPreserve))
traceAndOptimizeState.PreserveBlendShapes.Add(targetRenderer, thisPreserve = new HashSet<string>());
thisPreserve.UnionWith(preserves);
}

for (var i = 0; i < meshInfos.Length; i++)
{
Profiler.BeginSample($"Process MeshInfo#{i}");
Expand Down Expand Up @@ -353,6 +348,10 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) =>
}
meshInfo.SubMeshes.Clear();

var preserveShapes = meshInfo.SourceRenderer is SkinnedMeshRenderer skinnedRenderer
? traceAndOptimizeState.PreserveBlendShapes.GetValueOrDefault(skinnedRenderer)
: null;

// rename if componentBlendShapeMode is RenameToAvoidConflict
if (componentBlendShapeMode == MergeSkinnedMesh.BlendShapeMode.RenameToAvoidConflict)
{
Expand All @@ -372,9 +371,14 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) =>
}

mappings.Add(($"blendShape.{name}", $"blendShape.{newName}"));
if (preserveShapes?.Contains(name) ?? false)
preserveShapes.Add(newName);
}
}

if (preserveShapes != null)
AddPreserveBlendShapes(preserveShapes);

// add BlendShape if not defined by name
for (var sourceI = 0; sourceI < meshInfo.BlendShapes.Count; sourceI++)
{
Expand Down

0 comments on commit 3aae111

Please sign in to comment.