Skip to content
This repository has been archived by the owner on Jun 10, 2024. It is now read-only.

Commit

Permalink
Add null mesh/zero vertex check before merging
Browse files Browse the repository at this point in the history
  • Loading branch information
JLChnToZ committed Apr 25, 2023
1 parent c0838d6 commit fc9bc60
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions Editor/SkinnedMeshCombinerCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,12 @@ public SkinnedMeshCombinerCore(BlendShapeCopyMode blendShapeCopyMode = BlendShap
}

public void Add(SkinnedMeshRenderer source, CombineBlendshapeFlags[] bakeFlags, CombineMeshFlags mergeFlags = CombineMeshFlags.None) {
var orgMesh = source.sharedMesh;
if (orgMesh == null || orgMesh.vertexCount <= 0) return;
if (combineInstances.Count == 0)
bounds = source.bounds;
else
bounds.Encapsulate(source.bounds);
var orgMesh = source.sharedMesh;
var mesh = Instantiate(orgMesh);
var sharedMaterials = source.sharedMaterials;
var bones = source.bones;
Expand Down Expand Up @@ -164,6 +165,10 @@ public void Add(SkinnedMeshRenderer source, CombineBlendshapeFlags[] bakeFlags,
}
mesh = vertexCutter.Apply(mesh);
}
if (mesh.vertexCount <= 0) {
DestroyImmediate(mesh, false);
return;
}
weights = mesh.boneWeights;
foreach (var weight in weights) {
if (weight.weight0 > 0) boneHasWeights.Add(weight.boneIndex0);
Expand Down Expand Up @@ -202,12 +207,13 @@ public void Add(SkinnedMeshRenderer source, CombineBlendshapeFlags[] bakeFlags,
}
var subMeshCount = mesh.subMeshCount;
for (int i = 0; i < subMeshCount; i++) {
var subMesh = mesh.GetSubMesh(i);
if (subMesh.vertexCount <= 0) continue;
var sharedMaterial = i < sharedMaterials.Length ? sharedMaterials[i] : null;
if (sharedMaterial == null && mergeFlags.HasFlag(CombineMeshFlags.RemoveSubMeshWithoutMaterials)) continue;
GetCombines(sharedMaterial).Add((new CombineInstance { mesh = mesh, subMeshIndex = i, transform = remapTransform }, bakeFlags));
var subMesh = mesh.GetSubMesh(i);
boneWeights[(mesh, i)] = weights.Length > 0 ? new ArraySegment<BoneWeight>(weights, subMesh.firstVertex, subMesh.vertexCount) :
Enumerable.Repeat(new BoneWeight { boneIndex0 = defaultBoneIndex, weight0 = 1 }, mesh.GetSubMesh(i).vertexCount);;
Enumerable.Repeat(new BoneWeight { boneIndex0 = defaultBoneIndex, weight0 = 1 }, mesh.GetSubMesh(i).vertexCount);
}
if (vertices != null) mesh.GetVertices(vertices);
if (normals != null) mesh.GetNormals(normals);
Expand All @@ -230,16 +236,19 @@ public void Add(SkinnedMeshRenderer source, CombineBlendshapeFlags[] bakeFlags,
public void Add(MeshRenderer source, Renderer destination, CombineMeshFlags mergeFlags = CombineMeshFlags.CreateBoneForNonSkinnedMesh) {
var sourceTransform = source.transform;
if (!source.TryGetComponent(out MeshFilter meshFilter)) return;
var orgMesh = meshFilter.sharedMesh;
if (orgMesh == null || orgMesh.vertexCount <= 0) return;
if (combineInstances.Count == 0)
bounds = source.bounds;
else
bounds.Encapsulate(source.bounds);
var mesh = Instantiate(meshFilter.sharedMesh);
var mesh = Instantiate(orgMesh);
var sharedMaterials = source.sharedMaterials;
var subMeshCount = mesh.subMeshCount;
int index = mergeFlags.HasFlag(CombineMeshFlags.CreateBoneForNonSkinnedMesh) ? 0 : GetBoneIndex(sourceTransform, Matrix4x4.identity);
var transform = mergeFlags.HasFlag(CombineMeshFlags.CreateBoneForNonSkinnedMesh) ? sourceTransform.localToWorldMatrix * destination.worldToLocalMatrix : Matrix4x4.identity;
for (int i = 0; i < subMeshCount; i++) {
if (mesh.GetSubMesh(i).vertexCount <= 0) continue;
var sharedMaterial = i < sharedMaterials.Length ? sharedMaterials[i] : null;
if (sharedMaterial == null && mergeFlags.HasFlag(CombineMeshFlags.RemoveSubMeshWithoutMaterials)) continue;
GetCombines(sharedMaterial).Add((new CombineInstance { mesh = mesh, subMeshIndex = i, transform = transform }, new[] { CombineBlendshapeFlags.CombineBlendShape }));
Expand Down

0 comments on commit fc9bc60

Please sign in to comment.