diff options
Diffstat (limited to 'Pathfinding Visualizer/Assets/Scripts/MeshUtils.cs')
| -rw-r--r-- | Pathfinding Visualizer/Assets/Scripts/MeshUtils.cs | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/Pathfinding Visualizer/Assets/Scripts/MeshUtils.cs b/Pathfinding Visualizer/Assets/Scripts/MeshUtils.cs new file mode 100644 index 0000000..fa7842c --- /dev/null +++ b/Pathfinding Visualizer/Assets/Scripts/MeshUtils.cs @@ -0,0 +1,161 @@ +/* + ------------------- Code Monkey ------------------- + + Thank you for downloading this package + I hope you find it useful in your projects + If you have any questions let me know + Cheers! + + unitycodemonkey.com + -------------------------------------------------- + */ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public static class MeshUtils { + + private static readonly Vector3 Vector3zero = Vector3.zero; + private static readonly Vector3 Vector3one = Vector3.one; + private static readonly Vector3 Vector3yDown = new Vector3(0,-1); + + + private static Quaternion[] cachedQuaternionEulerArr; + private static void CacheQuaternionEuler() { + if (cachedQuaternionEulerArr != null) return; + cachedQuaternionEulerArr = new Quaternion[360]; + for (int i=0; i<360; i++) { + cachedQuaternionEulerArr[i] = Quaternion.Euler(0,0,i); + } + } + private static Quaternion GetQuaternionEuler(float rotFloat) { + int rot = Mathf.RoundToInt(rotFloat); + rot = rot % 360; + if (rot < 0) rot += 360; + //if (rot >= 360) rot -= 360; + if (cachedQuaternionEulerArr == null) CacheQuaternionEuler(); + return cachedQuaternionEulerArr[rot]; + } + + + public static Mesh CreateEmptyMesh() { + Mesh mesh = new Mesh(); + mesh.vertices = new Vector3[0]; + mesh.uv = new Vector2[0]; + mesh.triangles = new int[0]; + return mesh; + } + + public static void CreateEmptyMeshArrays(int quadCount, out Vector3[] vertices, out Vector2[] uvs, out int[] triangles) { + vertices = new Vector3[4 * quadCount]; + uvs = new Vector2[4 * quadCount]; + triangles = new int[6 * quadCount]; + } + + public static Mesh CreateMesh(Vector3 pos, float rot, Vector3 baseSize, Vector2 uv00, Vector2 uv11) { + return AddToMesh(null, pos, rot, baseSize, uv00, uv11); + } + + public static Mesh AddToMesh(Mesh mesh, Vector3 pos, float rot, Vector3 baseSize, Vector2 uv00, Vector2 uv11) { + if (mesh == null) { + mesh = CreateEmptyMesh(); + } + Vector3[] vertices = new Vector3[4 + mesh.vertices.Length]; + Vector2[] uvs = new Vector2[4 + mesh.uv.Length]; + int[] triangles = new int[6 + mesh.triangles.Length]; + + mesh.vertices.CopyTo(vertices, 0); + mesh.uv.CopyTo(uvs, 0); + mesh.triangles.CopyTo(triangles, 0); + + int index = vertices.Length / 4 - 1; + //Relocate vertices + int vIndex = index*4; + int vIndex0 = vIndex; + int vIndex1 = vIndex+1; + int vIndex2 = vIndex+2; + int vIndex3 = vIndex+3; + + baseSize *= .5f; + + bool skewed = baseSize.x != baseSize.y; + if (skewed) { + vertices[vIndex0] = pos+GetQuaternionEuler(rot)*new Vector3(-baseSize.x, baseSize.y); + vertices[vIndex1] = pos+GetQuaternionEuler(rot)*new Vector3(-baseSize.x, -baseSize.y); + vertices[vIndex2] = pos+GetQuaternionEuler(rot)*new Vector3( baseSize.x, -baseSize.y); + vertices[vIndex3] = pos+GetQuaternionEuler(rot)*baseSize; + } else { + vertices[vIndex0] = pos+GetQuaternionEuler(rot-270)*baseSize; + vertices[vIndex1] = pos+GetQuaternionEuler(rot-180)*baseSize; + vertices[vIndex2] = pos+GetQuaternionEuler(rot- 90)*baseSize; + vertices[vIndex3] = pos+GetQuaternionEuler(rot- 0)*baseSize; + } + + //Relocate UVs + uvs[vIndex0] = new Vector2(uv00.x, uv11.y); + uvs[vIndex1] = new Vector2(uv00.x, uv00.y); + uvs[vIndex2] = new Vector2(uv11.x, uv00.y); + uvs[vIndex3] = new Vector2(uv11.x, uv11.y); + + //Create triangles + int tIndex = index*6; + + triangles[tIndex+0] = vIndex0; + triangles[tIndex+1] = vIndex3; + triangles[tIndex+2] = vIndex1; + + triangles[tIndex+3] = vIndex1; + triangles[tIndex+4] = vIndex3; + triangles[tIndex+5] = vIndex2; + + mesh.vertices = vertices; + mesh.triangles = triangles; + mesh.uv = uvs; + + //mesh.bounds = bounds; + + return mesh; + } + + public static void AddToMeshArrays(Vector3[] vertices, Vector2[] uvs, int[] triangles, int index, Vector3 pos, float rot, Vector3 baseSize, Vector2 uv00, Vector2 uv11) { + //Relocate vertices + int vIndex = index*4; + int vIndex0 = vIndex; + int vIndex1 = vIndex+1; + int vIndex2 = vIndex+2; + int vIndex3 = vIndex+3; + + baseSize *= .5f; + + bool skewed = baseSize.x != baseSize.y; + if (skewed) { + vertices[vIndex0] = pos+GetQuaternionEuler(rot)*new Vector3(-baseSize.x, baseSize.y); + vertices[vIndex1] = pos+GetQuaternionEuler(rot)*new Vector3(-baseSize.x, -baseSize.y); + vertices[vIndex2] = pos+GetQuaternionEuler(rot)*new Vector3( baseSize.x, -baseSize.y); + vertices[vIndex3] = pos+GetQuaternionEuler(rot)*baseSize; + } else { + vertices[vIndex0] = pos+GetQuaternionEuler(rot-270)*baseSize; + vertices[vIndex1] = pos+GetQuaternionEuler(rot-180)*baseSize; + vertices[vIndex2] = pos+GetQuaternionEuler(rot- 90)*baseSize; + vertices[vIndex3] = pos+GetQuaternionEuler(rot- 0)*baseSize; + } + + //Relocate UVs + uvs[vIndex0] = new Vector2(uv00.x, uv11.y); + uvs[vIndex1] = new Vector2(uv00.x, uv00.y); + uvs[vIndex2] = new Vector2(uv11.x, uv00.y); + uvs[vIndex3] = new Vector2(uv11.x, uv11.y); + + //Create triangles + int tIndex = index*6; + + triangles[tIndex+0] = vIndex0; + triangles[tIndex+1] = vIndex3; + triangles[tIndex+2] = vIndex1; + + triangles[tIndex+3] = vIndex1; + triangles[tIndex+4] = vIndex3; + triangles[tIndex+5] = vIndex2; + } +} |
