Firstborn/Library/PackageCache/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Utils/MeshUtilities.cs

59 lines
1.9 KiB
C#
Raw Normal View History

2023-03-28 13:24:16 -04:00
using System;
using System.Collections.Generic;
using UnityEngine.Assertions;
namespace UnityEngine.Rendering.PostProcessing
{
static class MeshUtilities
{
static Dictionary<PrimitiveType, Mesh> s_Primitives;
static Dictionary<Type, PrimitiveType> s_ColliderPrimitives;
static MeshUtilities()
{
s_Primitives = new Dictionary<PrimitiveType, Mesh>();
s_ColliderPrimitives = new Dictionary<Type, PrimitiveType>
{
{ typeof(BoxCollider), PrimitiveType.Cube },
{ typeof(SphereCollider), PrimitiveType.Sphere },
{ typeof(CapsuleCollider), PrimitiveType.Capsule }
};
}
internal static Mesh GetColliderMesh(Collider collider)
{
var type = collider.GetType();
if (type == typeof(MeshCollider))
return ((MeshCollider)collider).sharedMesh;
Assert.IsTrue(s_ColliderPrimitives.ContainsKey(type), "Unknown collider");
return GetPrimitive(s_ColliderPrimitives[type]);
}
internal static Mesh GetPrimitive(PrimitiveType primitiveType)
{
Mesh mesh;
if (!s_Primitives.TryGetValue(primitiveType, out mesh))
{
mesh = GetBuiltinMesh(primitiveType);
s_Primitives.Add(primitiveType, mesh);
}
return mesh;
}
// (Not pretty) hack to get meshes from `unity default resources` in user land
// What it does is create a new GameObject using the CreatePrimitive utility, retrieve its
// mesh and discard it...
static Mesh GetBuiltinMesh(PrimitiveType primitiveType)
{
var gameObject = GameObject.CreatePrimitive(primitiveType);
var mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;
RuntimeUtilities.Destroy(gameObject);
return mesh;
}
}
}