Skip to content

Instantly share code, notes, and snippets.

@cuongnmx
Forked from reveriejake/MeshBuffer.cs
Created November 12, 2020 02:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cuongnmx/67805a1b4717cad1cba45ca8b44d7c98 to your computer and use it in GitHub Desktop.
Save cuongnmx/67805a1b4717cad1cba45ca8b44d7c98 to your computer and use it in GitHub Desktop.
Pico Games - Unity MeshBuffer Class
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace PicoGames.Common
{
[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class MeshBuffer : MonoBehaviour
{
public Material material;
public int VertexCount { get { return vertices.Count; } }
public Mesh Mesh { get { if (mesh == null) { mesh = new Mesh(); mesh.name = GetInstanceID().ToString() + "_Mesh"; mesh.hideFlags = HideFlags.HideAndDontSave; } return mesh; } }
public MeshFilter Filter { get { if (mFilter == null) mFilter = GetComponent<MeshFilter>(); return mFilter; } }
public MeshRenderer Renderer { get { if (mRenderer == null) mRenderer = GetComponent<MeshRenderer>(); return mRenderer; } }
private Mesh mesh;
private MeshRenderer mRenderer;
private MeshFilter mFilter;
private List<Vector3> vertices = new List<Vector3>();
private List<Vector3> normals = new List<Vector3>();
private List<Vector2> uvs = new List<Vector2>();
private List<int> triangles = new List<int>();
private List<Color> colors = new List<Color>();
private static Material defaultMaterial;
private static Material DefaultMaterial()
{
if (defaultMaterial == null)
defaultMaterial = new Material(Shader.Find("Sprites/Default"));
return defaultMaterial;
}
public void Awake()
{
mRenderer = GetComponent<MeshRenderer>();
mFilter = GetComponent<MeshFilter>();
Renderer.material = material ? material : DefaultMaterial();
}
public void Clear()
{
vertices.Clear();
triangles.Clear();
normals.Clear();
uvs.Clear();
colors.Clear();
}
public void AddTriangle(Vector3 p0, Vector3 p1, Vector3 p2)
{
var vCount = vertices.Count;
vertices.Add(p0);
vertices.Add(p1);
vertices.Add(p2);
triangles.Add(vCount + 2);
triangles.Add(vCount + 1);
triangles.Add(vCount + 0);
}
public void AddQuad(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
var vCount = vertices.Count;
vertices.Add(p0);
vertices.Add(p1);
vertices.Add(p2);
vertices.Add(p3);
triangles.Add(vCount + 3);
triangles.Add(vCount + 1);
triangles.Add(vCount + 0);
triangles.Add(vCount + 3);
triangles.Add(vCount + 2);
triangles.Add(vCount + 1);
}
public void AddPentagon(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4)
{
var vCount = vertices.Count;
vertices.Add(p0);
vertices.Add(p1);
vertices.Add(p2);
vertices.Add(p3);
vertices.Add(p4);
triangles.Add(vCount + 4);
triangles.Add(vCount + 1);
triangles.Add(vCount + 0);
triangles.Add(vCount + 4);
triangles.Add(vCount + 2);
triangles.Add(vCount + 1);
triangles.Add(vCount + 4);
triangles.Add(vCount + 3);
triangles.Add(vCount + 2);
}
public void AddHexagon(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, Vector3 p5)
{
var vCount = vertices.Count;
vertices.Add(p0);
vertices.Add(p1);
vertices.Add(p2);
vertices.Add(p3);
vertices.Add(p4);
vertices.Add(p5);
triangles.Add(vCount + 5);
triangles.Add(vCount + 1);
triangles.Add(vCount + 0);
triangles.Add(vCount + 5);
triangles.Add(vCount + 2);
triangles.Add(vCount + 1);
triangles.Add(vCount + 5);
triangles.Add(vCount + 3);
triangles.Add(vCount + 2);
triangles.Add(vCount + 5);
triangles.Add(vCount + 4);
triangles.Add(vCount + 3);
}
public void AddColor(params Color[] colors)
{
for (int i = 0; i < colors.Length; i++)
this.colors.Add(colors[i]);
}
public void AddNormal(params Vector3[] normals)
{
for (int i = 0; i < normals.Length; i++)
this.normals.Add(normals[i]);
}
public void AddUVs(params Vector3[] uvs)
{
for (int i = 0; i < uvs.Length; i++)
this.uvs.Add(uvs[i]);
}
public void Apply(bool isDynamic = false)
{
Apply(null, isDynamic);
}
public void Apply(Material material, bool isDynamic = false)
{
Mesh.Clear();
if (isDynamic)
Mesh.MarkDynamic();
Mesh.vertices = vertices.ToArray();
Mesh.triangles = triangles.ToArray();
if (colors.Count > 0)
Mesh.colors = colors.ToArray();
if (uvs.Count > 0)
Mesh.uv = uvs.ToArray();
if (normals.Count > 0)
Mesh.normals = normals.ToArray();
else
Mesh.RecalculateNormals();
Mesh.RecalculateBounds();
Filter.mesh = Mesh;
this.material = material;
Renderer.material = this.material ? this.material : DefaultMaterial();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment