5f9e8f979d
cell values and grid lines are displayed. no interaction available yet.
237 lines
8.8 KiB
C#
237 lines
8.8 KiB
C#
/*
|
|
------------------- Code Monkey -------------------
|
|
|
|
Thank you for downloading the Code Monkey Utilities
|
|
I hope you find them useful in your projects
|
|
If you have any questions use the contact form
|
|
Cheers!
|
|
|
|
unitycodemonkey.com
|
|
--------------------------------------------------
|
|
*/
|
|
|
|
using UnityEngine;
|
|
|
|
namespace CodeMonkey.Utils {
|
|
|
|
/*
|
|
* Mesh in the World
|
|
* */
|
|
public class World_Mesh {
|
|
|
|
private const int sortingOrderDefault = 5000;
|
|
|
|
public GameObject gameObject;
|
|
public Transform transform;
|
|
private Material material;
|
|
private Vector3[] vertices;
|
|
private Vector2[] uv;
|
|
private int[] triangles;
|
|
private Mesh mesh;
|
|
|
|
|
|
public static World_Mesh CreateEmpty(Vector3 position, float eulerZ, Material material, int sortingOrderOffset = 0) {
|
|
return new World_Mesh(null, position, Vector3.one, eulerZ, material, new Vector3[0], new Vector2[0], new int[0], sortingOrderOffset);
|
|
}
|
|
|
|
public static World_Mesh Create(Vector3 position, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset = 0) {
|
|
return new World_Mesh(null, position, Vector3.one, eulerZ, material, vertices, uv, triangles, sortingOrderOffset);
|
|
}
|
|
|
|
public static World_Mesh Create(Vector3 position, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
|
|
return new World_Mesh(null, position, Vector3.one, eulerZ, meshWidth, meshHeight, material, uvCoords, sortingOrderOffset);
|
|
}
|
|
|
|
public static World_Mesh Create(Vector3 lowerLeftCorner, float width, float height, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
|
|
return Create(lowerLeftCorner, lowerLeftCorner + new Vector3(width, height), material, uvCoords, sortingOrderOffset);
|
|
}
|
|
|
|
public static World_Mesh Create(Vector3 lowerLeftCorner, Vector3 upperRightCorner, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
|
|
float width = upperRightCorner.x - lowerLeftCorner.x;
|
|
float height = upperRightCorner.y - lowerLeftCorner.y;
|
|
Vector3 localScale = upperRightCorner - lowerLeftCorner;
|
|
Vector3 position = lowerLeftCorner + localScale * .5f;
|
|
return new World_Mesh(null, position, Vector3.one, 0f, width, height, material, uvCoords, sortingOrderOffset);
|
|
}
|
|
|
|
|
|
private static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) {
|
|
return (int)(baseSortingOrder - position.y) + offset;
|
|
}
|
|
|
|
|
|
public class UVCoords {
|
|
public int x, y, width, height;
|
|
public UVCoords(int x, int y, int width, int height) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.width = width;
|
|
this.height = height;
|
|
}
|
|
}
|
|
|
|
|
|
public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset) {
|
|
this.material = material;
|
|
|
|
vertices = new Vector3[4];
|
|
uv = new Vector2[4];
|
|
triangles = new int[6];
|
|
|
|
/* 0,1
|
|
* 1,1
|
|
* 0,0
|
|
* 1,0
|
|
*/
|
|
|
|
float meshWidthHalf = meshWidth / 2f;
|
|
float meshHeightHalf = meshHeight / 2f;
|
|
|
|
vertices[0] = new Vector3(-meshWidthHalf, meshHeightHalf);
|
|
vertices[1] = new Vector3( meshWidthHalf, meshHeightHalf);
|
|
vertices[2] = new Vector3(-meshWidthHalf, -meshHeightHalf);
|
|
vertices[3] = new Vector3( meshWidthHalf, -meshHeightHalf);
|
|
|
|
if (uvCoords == null) {
|
|
uvCoords = new UVCoords(0, 0, material.mainTexture.width, material.mainTexture.height);
|
|
}
|
|
|
|
Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
|
|
|
|
ApplyUVToUVArray(uvArray, ref uv);
|
|
|
|
triangles[0] = 0;
|
|
triangles[1] = 1;
|
|
triangles[2] = 2;
|
|
triangles[3] = 2;
|
|
triangles[4] = 1;
|
|
triangles[5] = 3;
|
|
|
|
mesh = new Mesh();
|
|
|
|
mesh.vertices = vertices;
|
|
mesh.uv = uv;
|
|
mesh.triangles = triangles;
|
|
|
|
gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
|
|
gameObject.transform.parent = parent;
|
|
gameObject.transform.localPosition = localPosition;
|
|
gameObject.transform.localScale = localScale;
|
|
gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
|
|
|
|
gameObject.GetComponent<MeshFilter>().mesh = mesh;
|
|
gameObject.GetComponent<MeshRenderer>().material = material;
|
|
|
|
transform = gameObject.transform;
|
|
|
|
SetSortingOrderOffset(sortingOrderOffset);
|
|
}
|
|
|
|
public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset) {
|
|
this.material = material;
|
|
this.vertices = vertices;
|
|
this.uv = uv;
|
|
this.triangles = triangles;
|
|
|
|
mesh = new Mesh();
|
|
|
|
mesh.vertices = vertices;
|
|
mesh.uv = uv;
|
|
mesh.triangles = triangles;
|
|
|
|
gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
|
|
gameObject.transform.parent = parent;
|
|
gameObject.transform.localPosition = localPosition;
|
|
gameObject.transform.localScale = localScale;
|
|
gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
|
|
|
|
gameObject.GetComponent<MeshFilter>().mesh = mesh;
|
|
gameObject.GetComponent<MeshRenderer>().material = material;
|
|
|
|
transform = gameObject.transform;
|
|
|
|
SetSortingOrderOffset(sortingOrderOffset);
|
|
}
|
|
|
|
private Vector2 ConvertPixelsToUVCoordinates(int x, int y, int textureWidth, int textureHeight) {
|
|
return new Vector2((float)x / textureWidth, (float)y / textureHeight);
|
|
}
|
|
|
|
private Vector2[] GetUVRectangleFromPixels(int x, int y, int width, int height, int textureWidth, int textureHeight) {
|
|
/* 0, 1
|
|
* 1, 1
|
|
* 0, 0
|
|
* 1, 0
|
|
* */
|
|
return new Vector2[] {
|
|
ConvertPixelsToUVCoordinates(x, y + height, textureWidth, textureHeight),
|
|
ConvertPixelsToUVCoordinates(x + width, y + height, textureWidth, textureHeight),
|
|
ConvertPixelsToUVCoordinates(x, y, textureWidth, textureHeight),
|
|
ConvertPixelsToUVCoordinates(x + width, y, textureWidth, textureHeight)
|
|
};
|
|
}
|
|
|
|
private void ApplyUVToUVArray(Vector2[] uv, ref Vector2[] mainUV) {
|
|
if (uv == null || uv.Length < 4 || mainUV == null || mainUV.Length < 4) throw new System.Exception();
|
|
mainUV[0] = uv[0];
|
|
mainUV[1] = uv[1];
|
|
mainUV[2] = uv[2];
|
|
mainUV[3] = uv[3];
|
|
}
|
|
|
|
public void SetUVCoords(UVCoords uvCoords) {
|
|
Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
|
|
ApplyUVToUVArray(uvArray, ref uv);
|
|
mesh.uv = uv;
|
|
}
|
|
|
|
public void SetSortingOrderOffset(int sortingOrderOffset) {
|
|
SetSortingOrder(GetSortingOrder(gameObject.transform.position, sortingOrderOffset));
|
|
}
|
|
|
|
public void SetSortingOrder(int sortingOrder) {
|
|
gameObject.GetComponent<Renderer>().sortingOrder = sortingOrder;
|
|
}
|
|
|
|
public void SetLocalScale(Vector3 localScale) {
|
|
transform.localScale = localScale;
|
|
}
|
|
|
|
public void SetPosition(Vector3 localPosition) {
|
|
transform.localPosition = localPosition;
|
|
}
|
|
|
|
public void AddPosition(Vector3 addPosition) {
|
|
transform.localPosition += addPosition;
|
|
}
|
|
|
|
public Vector3 GetPosition() {
|
|
return transform.localPosition;
|
|
}
|
|
|
|
public int GetSortingOrder() {
|
|
return gameObject.GetComponent<Renderer>().sortingOrder;
|
|
}
|
|
|
|
public Mesh GetMesh() {
|
|
return mesh;
|
|
}
|
|
|
|
public void Show() {
|
|
gameObject.SetActive(true);
|
|
}
|
|
|
|
public void Hide() {
|
|
gameObject.SetActive(false);
|
|
}
|
|
|
|
public void DestroySelf() {
|
|
Object.Destroy(gameObject);
|
|
}
|
|
|
|
public static void CreateMesh() {
|
|
}
|
|
|
|
}
|
|
|
|
} |