Snippets

ömer faruk sayılır UI Mesh Renderer

Created by Omer F. Sayilir
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class UIMeshRenderer : MaskableGraphic {

	[SerializeField]
	Mesh m_mesh;

	public Mesh Mesh {
		get {
			return m_mesh;
		}
		set {
			m_mesh = value;
			rebuildMesh = true;
			SetVerticesDirty ();
		}
	}

	public float size = 1;

	public Vector3 rot;

	public Vector3 Rot {
		get {
			return rot;
		}
		set {
			rot = value;
			SetVerticesDirty ();
		}
	}

	[SerializeField]
	public MeshProjection projection = new MeshProjection();

	public bool rebuildMesh ;

	protected override void OnPopulateMesh (VertexHelper vh)
	{
		if (m_mesh != null) {
			if (vh.currentVertCount != projection.verts.Length) {
				rebuildMesh = true;
			}
			if (rebuildMesh) {
				RebuildMesh (vh);
				rebuildMesh = false;
			}else {
				UpdateMesh (vh);
			}

		} else {
			vh.Clear ();
		}
	}

	void RebuildMesh(VertexHelper vh) {
		vh.Clear ();
		if (m_mesh != null) {
			UIVertex vert = UIVertex.simpleVert;
			projection.GetMeshValues (m_mesh);
			projection.UpdateProjection (rot,size,rectTransform);
			int ds = projection.verts.Length;
			int tris = projection.triangles.Length;
			for (int i = 0; i < ds; i++) {
				vert.color = color;
				vert.position = projection.verts [i];
				vert.uv0 = projection.uv [i];
				vh.AddVert (vert);
			}
			for (int i = 0; i < tris-1; i +=3) {
				vh.AddTriangle (projection.triangles[i],projection.triangles[i+1],projection.triangles[i+2]);
			}
		}
	}

	void UpdateMesh(VertexHelper vh) {
		UIVertex vert = UIVertex.simpleVert;
		projection.UpdateProjection (rot,size,rectTransform);
		for (int i = 0; i < projection.verts.Length; i++) {
			vert.color = color;
			vert.position = projection.verts [i];
			vert.uv0 = projection.uv [i];
			vh.SetUIVertex (vert, i);
		}
	}

		
}
[System.Serializable]
public class MeshProjection {
	public Vector3[] verts;
	public Vector2[] uv;
	public int[] triangles;
	[Range(0,2)]
	public float perspectivePower = 1;

	[SerializeField] Vector3[] Overts;
	Quaternion newrot = new Quaternion();
	public void GetMeshValues(Mesh mesh) {
		Overts = mesh.vertices;

		verts = mesh.vertices;
		uv = mesh.uv;
		triangles = mesh.triangles;
	}

	public void UpdateProjection(Vector3 rotation,float scale,RectTransform rectTransform) {
		
		newrot.eulerAngles = rotation;

		for (int i = 0; i < verts.Length; i++)
		{
			verts[i] = newrot*Overts[i]*scale;
			verts[i].x *=rectTransform.rect.width;
			verts[i].y *= rectTransform.rect.height;
			verts[i].z *= perspectivePower*(rectTransform.rect.height+rectTransform.rect.width)/2 ;
		}
	}
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.