| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /*
- ------------------- 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];
- }
- private static Quaternion[] cachedQuaternionEulerXZArr;
- private static void CacheQuaternionEulerXZ() {
- if (cachedQuaternionEulerXZArr != null) return;
- cachedQuaternionEulerXZArr = new Quaternion[360];
- for (int i = 0; i < 360; i++) {
- cachedQuaternionEulerXZArr[i] = Quaternion.Euler(0, i, 0);
- }
- }
- private static Quaternion GetQuaternionEulerXZ(float rotFloat) {
- int rot = Mathf.RoundToInt(rotFloat);
- rot = rot % 360;
- if (rot < 0) rot += 360;
- if (cachedQuaternionEulerXZArr == null) CacheQuaternionEulerXZ();
- return cachedQuaternionEulerXZArr[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;
- }
- public static void AddToMeshArraysXZ(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.z;
- if (skewed) {
- vertices[vIndex0] = pos + GetQuaternionEulerXZ(rot) * new Vector3(-baseSize.x, 0, baseSize.z);
- vertices[vIndex1] = pos + GetQuaternionEulerXZ(rot) * new Vector3(-baseSize.x, 0, -baseSize.z);
- vertices[vIndex2] = pos + GetQuaternionEulerXZ(rot) * new Vector3(baseSize.x, 0, -baseSize.z);
- vertices[vIndex3] = pos + GetQuaternionEulerXZ(rot) * baseSize;
- } else {
- vertices[vIndex0] = pos + GetQuaternionEulerXZ(rot - 270) * baseSize;
- vertices[vIndex1] = pos + GetQuaternionEulerXZ(rot - 180) * baseSize;
- vertices[vIndex2] = pos + GetQuaternionEulerXZ(rot - 90) * baseSize;
- vertices[vIndex3] = pos + GetQuaternionEulerXZ(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;
- }
- }
|