Skip to content

Commit 6944d1f

Browse files
committed
Add extra materials baking
1 parent 3c65659 commit 6944d1f

2 files changed

Lines changed: 59 additions & 3 deletions

File tree

Runtime/Scripts/MeshAnimationAsset.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ public class MeshAnimationAsset : ScriptableObject
2222
[ListDrawerSettings(Expanded = true, ShowPaging = false, AlwaysAddDefaultValue = true)]
2323
internal AnimationClip[] animationClips = new AnimationClip[0];
2424

25+
[Required]
26+
[SerializeField]
27+
[ListDrawerSettings(ShowPaging = false, AlwaysAddDefaultValue = true)]
28+
internal List<string> extraMaterials = new List<string>();
29+
2530
[DisableIf("@true")]
2631
[SerializeField]
2732
internal Texture2D bakedTexture = default;
@@ -30,11 +35,23 @@ public class MeshAnimationAsset : ScriptableObject
3035
[SerializeField]
3136
internal Material bakedMaterial = default;
3237

38+
[TableList(ShowPaging = false)]
39+
[DisableIf("@true")]
40+
[SerializeField]
41+
internal List<ExtraMaterialData> extraMaterialData = new List<ExtraMaterialData>();
42+
3343
[TableList(AlwaysExpanded = true, ShowPaging = false)]
3444
[DisableIf("@true")]
3545
[SerializeField]
3646
internal List<AnimationData> animationData = new List<AnimationData>();
3747

48+
[Serializable]
49+
internal class ExtraMaterialData
50+
{
51+
public string name;
52+
public Material material;
53+
}
54+
3855
[Serializable]
3956
internal class AnimationData
4057
{

Runtime/Scripts/MeshAnimationBaker.cs

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace CodeWriter.MeshAnimation
33
{
44
using System;
55
using System.Linq;
6+
using System.Collections.Generic;
67
using JetBrains.Annotations;
78
using UnityEditor;
89
using UnityEngine;
@@ -23,6 +24,11 @@ public static void Clear([NotNull] MeshAnimationAsset asset)
2324

2425
DestroyObject(ref asset.bakedMaterial);
2526
DestroyObject(ref asset.bakedTexture);
27+
28+
foreach (var data in asset.extraMaterialData) {
29+
DestroyObject(ref data.material);
30+
}
31+
2632
SaveAsset(asset);
2733
}
2834

@@ -49,6 +55,7 @@ public static void Bake([NotNull] MeshAnimationAsset asset)
4955
if (!aborted)
5056
{
5157
CreateMaterial(asset);
58+
CreateExtraMaterials(asset);
5259
BakeAnimations(asset);
5360
}
5461

@@ -84,6 +91,30 @@ private static void CreateMaterial(MeshAnimationAsset asset)
8491
}
8592
}
8693

94+
private static void CreateExtraMaterials(MeshAnimationAsset asset)
95+
{
96+
foreach (var materialName in asset.extraMaterials)
97+
{
98+
var data = asset.extraMaterialData.Find(it => it.name == materialName);
99+
if (data == null)
100+
{
101+
data = new MeshAnimationAsset.ExtraMaterialData
102+
{
103+
name = materialName
104+
};
105+
asset.extraMaterialData.Add(data);
106+
}
107+
108+
if (data.material == null)
109+
{
110+
data.material = new Material(asset.shader) {name = $"{asset.name}_{materialName} Material"};
111+
AssetDatabase.AddObjectToAsset(data.material, asset);
112+
}
113+
114+
data.material.shader = asset.shader;
115+
}
116+
}
117+
87118
private static void CreateTexture(MeshAnimationAsset asset, out bool aborted)
88119
{
89120
aborted = false;
@@ -231,9 +262,17 @@ private static void BakeAnimations(MeshAnimationAsset asset)
231262
Object.DestroyImmediate(bakeObject);
232263
Object.DestroyImmediate(bakeMesh);
233264

234-
asset.bakedMaterial.SetTexture(AnimTextureProp, asset.bakedTexture);
235-
asset.bakedMaterial.SetVector(AnimationMulProp, boundMax - boundMin);
236-
asset.bakedMaterial.SetVector(AnimationAddProp, boundMin);
265+
var materials = new HashSet<Material> { asset.bakedMaterial };
266+
foreach (var data in asset.extraMaterialData)
267+
{
268+
materials.Add(data.material);
269+
}
270+
271+
foreach (var material in materials) {
272+
material.SetTexture(AnimTextureProp, asset.bakedTexture);
273+
material.SetVector(AnimationMulProp, boundMax - boundMin);
274+
material.SetVector(AnimationAddProp, boundMin);
275+
}
237276
}
238277

239278
private static void CaptureMeshToTexture(Texture2D texture, Mesh mesh, Vector3 min, Vector3 max, int line)

0 commit comments

Comments
 (0)