Snippets

ömer faruk sayılır UIMeshRenderer

Created by Omer F. Sayilir last modified
// UIMeshRenderer.cs
//
// Author:
//       Ömer Faruk Sayılır <sayiliromer@gmail.com>
//
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

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.