59 lines
1.9 KiB
C#
59 lines
1.9 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|