using UnityEngine;

// @kurtdekker - simple runtime geometry double-siding mechanism.
//
// Place or add this Component to things with at
// least a MeshFilter on them.
//
// Presently only for single-submesh geometry.
//
// Copies vertex position and uv, then recalculates
// all the normals. You could add a normal copy-over
// if you wish to preserve normals on the new geometry.

[RequireComponent( typeof( MeshFilter))]
public class MakeGeometryDoubleSided : MonoBehaviour
{
	void Awake()
	{
		MeshFilter mf = GetComponent<MeshFilter>();

		// If this blows up you failed to meet the documented
		// requirement above that a MeshFilter be present.
		Mesh mesh = mf.mesh;

		Vector3[] originalVerts = mesh.vertices;
		Vector2[] originalUVs = mesh.uv;

		int vertCount = originalVerts.Length;

		// original vertices will be copied over first,
		// then the duplicated ones will be added.
		Vector3[] verts = new Vector3[ vertCount * 2];
		Vector2[] uvs = new Vector2[ vertCount * 2];

		for (int i = 0; i < vertCount; i++)
		{
			Vector3 vertex = originalVerts[i];
			verts [i] = vertex;
			verts [i + vertCount] = vertex;

			Vector2 uv = originalUVs[i];
			uvs [i] = uv;
			uvs [i + vertCount] = uv;
		}

		int[] originalTriangles = mesh.triangles;
		int triCount = originalTriangles.Length;

		// original triangles will be copied over first,
		// then the flipped-over versions will be added.
		int[] tris = new int[ triCount * 2];

		for (int i = 0; i < triCount; i += 3)
		{
			int index0 = originalTriangles[i + 0];
			int index1 = originalTriangles[i + 1];
			int index2 = originalTriangles[i + 2];

			// re-add the original triangles, no change
			tris[i + 0] = index0;
			tris[i + 1] = index1;
			tris[i + 2] = index2;

			// now add triangles flipped the opposite way
			tris[i + triCount + 0] = index0 + vertCount;
			tris[i + triCount + 1] = index2 + vertCount;	// <-- reverse!
			tris[i + triCount + 2] = index1 + vertCount;	// <-- reverse!
		}

		mesh.vertices = verts;
		mesh.uv = uvs;

		mesh.triangles = tris;

		// remove this if you add normal-copying above!
		mesh.RecalculateNormals ();
	}
}