#define PROTOTYPE
#if UNITY_EDITOR || UNITY_STANDALONE
using UnityEngine;
using System.Collections;
using ProBuilder2.Common;
using System.Collections.Generic;

namespace ProBuilder2.Examples
{
	/**
	 * Creates a cube on start and colors it's vertices programmitically.
	 */
	public class HueCube : MonoBehaviour
	{
		pb_Object pb;

		void Start()
		{
			// Create a new ProBuilder cube to work with.
			pb = pb_ShapeGenerator.CubeGenerator(Vector3.one);

			// Cycle through each unique vertex in the cube (8 total), and assign a color
			// to the index in the sharedIndices array.
			int si_len = pb.sharedIndices.Length;
			Color[] vertexColors = new Color[si_len];
			for(int i = 0; i < si_len; i++)
			{
				vertexColors[i] = HSVtoRGB( (i/(float)si_len) * 360f, 1f, 1f);
			}

			// Now go through each face (vertex colors are stored the pb_Face class) and
			// assign the pre-calculated index color to each index in the triangles array.
			Color[] colors = pb.colors;

			for(int CurSharedIndex = 0; CurSharedIndex < pb.sharedIndices.Length; CurSharedIndex++)
			{
				foreach(int CurIndex in pb.sharedIndices[CurSharedIndex].array)
				{
					colors[CurIndex] = vertexColors[CurSharedIndex];
				}
			}

			pb.SetColors(colors);

			// In order for these changes to take effect, you must refresh the mesh
			// object.
			pb.Refresh();
		}

		/**
		 * Convert HSV to RGB.
		 *  http://www.cs.rit.edu/~ncs/color/t_convert.html
		 *	r,g,b values are from 0 to 1
		 *	h = [0,360], s = [0,1], v = [0,1]
		 *	if s == 0, then h = -1 (undefined)
		 */
		static Color HSVtoRGB(float h, float s, float v )
		{
			float r, g, b;
			int i;
			float f, p, q, t;
			if( s == 0 ) {
				// achromatic (grey)
				return new Color(v, v, v, 1f);
			}
			h /= 60;			// sector 0 to 5
			i = (int)Mathf.Floor( h );
			f = h - i;			// factorial part of h
			p = v * ( 1 - s );
			q = v * ( 1 - s * f );
			t = v * ( 1 - s * ( 1 - f ) );

			switch( i )
			{
				case 0:
					r = v;
					g = t;
					b = p;
					break;
				case 1:
					r = q;
					g = v;
					b = p;
					break;
				case 2:
					r = p;
					g = v;
					b = t;
					break;
				case 3:
					r = p;
					g = q;
					b = v;
					break;
				case 4:
					r = t;
					g = p;
					b = v;
					break;
				default:		// case 5:
					r = v;
					g = p;
					b = q;
					break;
			}
			
			return new Color(r, g, b, 1f);
		}
	}
}
#endif
