/// <summary>
		/// Loads the GL objects into OpenGL buffer.
		/// </summary>
		/// <returns>The GL objects.</returns>
		/// <param name="objects">Objects.</param>
		/// <param name="nObject">N object.</param>
		public static int[][] LoadGLObjects(
			LoadResult[][] objects,
			PhysicsEngineMathUtility.Vector3[][] translate,
			int nObject,
			bool GLM_TEXTURE = false, 
			bool GLM_FLAT = false,
			bool GLM_SMOOTH = false )
		{
			int[][] displayList = new int[nObject][]; 

			for (int i = 0; i < nObject; i++) 
			{
                displayList[i] = new int[objects[i].Length];

                for (int j = 0; j < objects[i].Length; j++)
                {
                    displayList[i][j] = GL.GenLists(1);

                    GL.NewList(displayList[i][j], ListMode.CompileAndExecute);

                    GLDrawSolid(objects[i][j], translate[i][j], GLM_TEXTURE, GLM_FLAT, GLM_SMOOTH);

                    GL.EndList();
                }
			}

			return displayList;
		}
		/// <summary>
		/// GL draw solid.
		/// </summary>
		/// <param name="solid">Solid.</param>
		/// <param name="GLM_TEXTURE">If set to <c>true</c> GL add texture coordinates.</param>
		/// <param name="GLM_FLAT">If set to <c>true</c> GL add plane normal.</param>
		private static void GLDrawSolid(
			LoadResult solid,
			PhysicsEngineMathUtility.Vector3 translate,
			bool GLM_TEXTURE, 
			bool GLM_FLAT,
			bool GLM_SMOOTH)
		{
			int[] indicedata = new int[solid.Groups [0].Faces.Count * 3];
			int[] textureData = new int[solid.Groups [0].Faces.Count * 3];
			int[] normalData = new int[solid.Groups [0].Faces.Count * 3]; 

			GL.Begin (PrimitiveType.Triangles);

			for (int i = 0; i < solid.Groups [0].Faces.Count; i++) 
			{
				int index = i * 3;
				indicedata [index] = solid.Groups [0].Faces [i] [0].VertexIndex - 1;
				indicedata [index + 1] = solid.Groups [0].Faces [i] [1].VertexIndex - 1;
				indicedata [index + 2] = solid.Groups [0].Faces [i] [2].VertexIndex - 1;

				textureData [index] = solid.Groups [0].Faces [i] [0].TextureIndex - 1;
				textureData [index + 1] = solid.Groups [0].Faces [i] [1].TextureIndex - 1;
				textureData [index + 2] = solid.Groups [0].Faces [i] [2].TextureIndex - 1;

				normalData [index] = solid.Groups [0].Faces [i] [0].NormalIndex - 1;
				normalData [index + 1] = solid.Groups [0].Faces [i] [1].NormalIndex - 1;
				normalData [index + 2] = solid.Groups [0].Faces [i] [2].NormalIndex - 1;

				if (GLM_FLAT) 
				{
					var a = new PhysicsEngineMathUtility.Vector3 (
						solid.Vertices [indicedata [index]].X, 
						solid.Vertices [indicedata [index]].Y, 
						solid.Vertices [indicedata [index]].Z);
					
					var b = new PhysicsEngineMathUtility.Vector3 (
						solid.Vertices [indicedata [index + 1]].X, 
						solid.Vertices [indicedata [index + 1]].Y, 
						solid.Vertices [indicedata [index + 1]].Z);

					var c = new PhysicsEngineMathUtility.Vector3 (
						solid.Vertices [indicedata [index + 2]].X, 
						solid.Vertices [indicedata [index + 2]].Y, 
						solid.Vertices [indicedata [index + 2]].Z);

					PhysicsEngineMathUtility.Vector3 normal = 
						PhysicsEngineMathUtility.GeometryUtilities.CalculateNormal (a, b, c);

					GL.Normal3 (normal.x, normal.y, normal.z);	
				}

				if (GLM_SMOOTH)
					GL.Normal3 (solid.Normals[normalData[index]].X, 
						solid.Normals[normalData[index]].Y, 
						solid.Normals[normalData[index]].Z);

				if (GLM_TEXTURE && solid.Textures.Count > 0)
					GL.TexCoord2 (solid.Textures [textureData [index]].X,
						solid.Textures [textureData [index]].Y);

				GL.Vertex3 (solid.Vertices [indicedata [index]].X - translate.x, 
					solid.Vertices [indicedata [index]].Y - translate.y,
					solid.Vertices [indicedata [index]].Z - translate.z);

				if (GLM_SMOOTH)
					GL.Normal3 (solid.Normals[normalData[index + 1]].X, 
						solid.Normals[normalData[index + 1]].Y, 
						solid.Normals[normalData[index + 1]].Z);

				if (GLM_TEXTURE && solid.Textures.Count > 0)
					GL.TexCoord2 (solid.Textures [textureData [index + 1]].X,
						solid.Textures [textureData [index + 1]].Y);

				GL.Vertex3 (solid.Vertices [indicedata [index + 1]].X - translate.x, 
					solid.Vertices [indicedata [index + 1]].Y - translate.y,
					solid.Vertices [indicedata [index + 1]].Z - translate.z);

				if (GLM_SMOOTH)
					GL.Normal3 (solid.Normals[normalData[index + 2]].X, 
						solid.Normals[normalData[index + 2]].Y, 
						solid.Normals[normalData[index + 2]].Z);

				if (GLM_TEXTURE && solid.Textures.Count > 0)
					GL.TexCoord2 (solid.Textures [textureData [index + 2]].X,
						solid.Textures [textureData [index + 2]].Y);

				GL.Vertex3 (solid.Vertices [indicedata [index + 2]].X - translate.x, 
					solid.Vertices [indicedata [index + 2]].Y - translate.y,
					solid.Vertices [indicedata [index + 2]].Z - translate.z);

			}

			GL.End ();
		}
		public static void glLookAt(
			PhysicsEngineMathUtility.Vector3 eye,
			PhysicsEngineMathUtility.Vector3 center,
			PhysicsEngineMathUtility.Vector3 up)
		{
			PhysicsEngineMathUtility.Vector3 forward = center - eye;

			forward = PhysicsEngineMathUtility.Vector3.Normalize(forward);

			var upBuf = new PhysicsEngineMathUtility.Vector3(up.x, up.y, up.z);

			var side = PhysicsEngineMathUtility.Vector3.Cross(forward, upBuf);

			side = PhysicsEngineMathUtility.Vector3.Normalize(side);

			upBuf = PhysicsEngineMathUtility.Vector3.Cross(side, forward);

			var matrix = new float[] {
				Convert.ToSingle (side.x), Convert.ToSingle (up.x), Convert.ToSingle (-forward.x),
				Convert.ToSingle (side.y), Convert.ToSingle (up.y), Convert.ToSingle (-forward.y),
				Convert.ToSingle (side.z), Convert.ToSingle (up.z), Convert.ToSingle (-forward.z)
			};

			GL.MultMatrix(matrix);
			GL.Translate(-eye.x, -eye.y, -eye.z);
		}