Пример #1
0
        static WebGLProgram InternalConstructor(WebGLRenderingContext gl)
        {
            // X:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeShaderToyColumns\ChromeShaderToyColumns\Library\ShaderToy.cs
            var p = gl.createProgram();

            return(p);
        }
Пример #2
0
        static WebGLDebugShaders InternalConstructor(WebGLRenderingContext gl)
        {
            // X:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeShaderToyColumns\ChromeShaderToyColumns\Library\ShaderToy.cs
            var p = (WebGLDebugShaders)gl.getExtension("WEBGL_debug_shaders");

            return(p);
        }
Пример #3
0
        static WebGLShader InternalConstructor(WebGLRenderingContext gl, uint type = WebGLRenderingContext.VERTEX_SHADER)
        {
            // X:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeShaderToyColumns\ChromeShaderToyColumns\Library\ShaderToy.cs
            var p = gl.createShader(type);

            return(p);
        }
Пример #4
0
 /// <summary>
 /// http://go.jsc-solutions.net/Uniforms Access GLSL uniforms via dynamic dispatch.
 /// </summary>
 public static dynamic Uniforms(this WebGLProgram program, WebGLRenderingContext gl)
 {
     return(new WebGLDynamicUniforms
     {
         gl = gl,
         program = program
     });
 }
Пример #5
0
        static WebGLFramebuffer InternalConstructor(WebGLRenderingContext gl)
        {
            // X:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeWebGLFrameBuffer\ChromeWebGLFrameBuffer\Application.cs
            // X:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeShaderToyColumns\ChromeShaderToyColumns\Library\ShaderToy.cs
            var p = gl.createFramebuffer();

            return(p);
        }
Пример #6
0
        // we are defining extensions for a class generated from IDL

        public static WebGLProgram createProgram(this WebGLRenderingContext gl, VertexShader v, FragmentShader f)
        {
            var programHandle = gl.createProgram();

            var vs = gl.createShader(v);
            var fs = gl.createShader(f);

            gl.attachShader(programHandle, vs);
            gl.attachShader(programHandle, fs);

            gl.deleteShader(vs);
            gl.deleteShader(fs);
            // http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-ANGLE.pdf
            // are implicitly linked when the shaders are made active.

            return(programHandle);
        }
Пример #7
0
        public static WebGLShader createShader(this WebGLRenderingContext gl, Shader source)
        {
            // jsc/java should pick this up!
            FragmentShader refhack;

            var type = gl.VERTEX_SHADER;

            //if (source is FragmentShader)
            var IsFragmentShader = source is FragmentShader;

            if (IsFragmentShader)
            {
                type = gl.FRAGMENT_SHADER;
            }

            var shader = gl.createShader(type);



            // we could just use object.ToString

            // later we might want to update jsc to create a special interface method for that..

            var code = source.ToString();

            // or jsc could replace a method to "compile" a type into actual source code :)
            // ahead of time or on runtime? (.net 5 code expressions?)

            // how do WebGLShader and Shader relate?

            // will actionscript require the same extensions?

            gl.shaderSource(shader, code);

            gl.compileShader(shader);

            return(shader);
        }
            //script: error JSC1000: Java : Opcode not implemented: stelem.r4 at AndroidOpenGLESLesson5Activity.Activities.AndroidOpenGLESLesson5Activity+LessonFiveRenderer+<>c.<.ctor>b__17_0

            public LessonFiveRenderer(Context activityContext)
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object) __gl;

                mActivityContext = activityContext;

                #region generateCubeData
                Func <f[], f[], f[], f[], f[], f[], f[], f[], int, f[]> generateCubeData =
                    (f[] point1,
                     f[] point2,
                     f[] point3,
                     f[] point4,
                     f[] point5,
                     f[] point6,
                     f[] point7,
                     f[] point8,
                     int elementsPerPoint) =>
                {
                    // Given a cube with the points defined as follows:
                    // front left top, front right top, front left bottom, front right bottom,
                    // back left top, back right top, back left bottom, back right bottom,
                    // return an array of 6 sides, 2 triangles per side, 3 vertices per triangle, and 4 floats per vertex.
                    int FRONT  = 0;
                    int RIGHT  = 1;
                    int BACK   = 2;
                    int LEFT   = 3;
                    int TOP    = 4;
                    int BOTTOM = 5;

                    int     size     = elementsPerPoint * 6 * 6;
                    float[] cubeData = new float[size];

                    for (int face = 0; face < 6; face++)
                    {
                        // Relative to the side, p1 = top left, p2 = top right, p3 = bottom left, p4 = bottom right
                        float[] p1, p2, p3, p4;

                        // Select the points for this face
                        if (face == FRONT)
                        {
                            p1 = point1; p2 = point2; p3 = point3; p4 = point4;
                        }
                        else if (face == RIGHT)
                        {
                            p1 = point2; p2 = point6; p3 = point4; p4 = point8;
                        }
                        else if (face == BACK)
                        {
                            p1 = point6; p2 = point5; p3 = point8; p4 = point7;
                        }
                        else if (face == LEFT)
                        {
                            p1 = point5; p2 = point1; p3 = point7; p4 = point3;
                        }
                        else if (face == TOP)
                        {
                            p1 = point5; p2 = point6; p3 = point1; p4 = point2;
                        }
                        else                                 // if (side == BOTTOM)
                        {
                            p1 = point8; p2 = point7; p3 = point4; p4 = point3;
                        }

                        // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle,
                        // if the points are counter-clockwise we are looking at the "front". If not we are looking at
                        // the back. OpenGL has an optimization where all back-facing triangles are culled, since they
                        // usually represent the backside of an object and aren't visible anyways.

                        // Build the triangles
                        //  1---3,6
                        //  | / |
                        // 2,4--5
                        int offset = face * elementsPerPoint * 6;

                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p1[i];
                        }
                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p3[i];
                        }
                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p2[i];
                        }
                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p3[i];
                        }
                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p4[i];
                        }
                        for (int i = 0; i < elementsPerPoint; i++)
                        {
                            cubeData[offset++] = p2[i];
                        }
                    }

                    return(cubeData);
                };
                #endregion


                // Define points for a cube.
                // X, Y, Z
                float[] p1p = { -1.0f, 1.0f, 1.0f };
                float[] p2p = { 1.0f, 1.0f, 1.0f };
                float[] p3p = { -1.0f, -1.0f, 1.0f };
                float[] p4p = { 1.0f, -1.0f, 1.0f };
                float[] p5p = { -1.0f, 1.0f, -1.0f };
                float[] p6p = { 1.0f, 1.0f, -1.0f };
                float[] p7p = { -1.0f, -1.0f, -1.0f };
                float[] p8p = { 1.0f, -1.0f, -1.0f };

                float[] cubePositionData = generateCubeData(p1p, p2p, p3p, p4p, p5p, p6p, p7p, p8p, p1p.Length);

                // Points of the cube: color information
                // R, G, B, A
                float[] p1c = { 1.0f, 0.0f, 0.0f, 1.0f };                               // red
                float[] p2c = { 1.0f, 0.0f, 1.0f, 1.0f };                               // magenta
                float[] p3c = { 0.0f, 0.0f, 0.0f, 1.0f };                               // black
                float[] p4c = { 0.0f, 0.0f, 1.0f, 1.0f };                               // blue
                float[] p5c = { 1.0f, 1.0f, 0.0f, 1.0f };                               // yellow
                float[] p6c = { 1.0f, 1.0f, 1.0f, 1.0f };                               // white
                float[] p7c = { 0.0f, 1.0f, 0.0f, 1.0f };                               // green
                float[] p8c = { 0.0f, 1.0f, 1.0f, 1.0f };                               // cyan

                float[] cubeColorData = generateCubeData(p1c, p2c, p3c, p4c, p5c, p6c, p7c, p8c, p1c.Length);

                // Initialize the buffers.
                mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
                                 .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubePositions.put(cubePositionData).position(0);

                mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
                              .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeColors.put(cubeColorData).position(0);
            }
Пример #9
0
 public WebGLShader(WebGLRenderingContext gl, uint type = WebGLRenderingContext.VERTEX_SHADER)
 {
     // InternalConstructor
 }
Пример #10
0
 public WebGLFramebuffer(WebGLRenderingContext gl)
 {
     // InternalConstructor
 }
Пример #11
0
            public LessonTwoRenderer()
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object) __gl;

                #region  Define points for a cube.

                // X, Y, Z
                float[] cubePositionData =
                {
                    // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle,
                    // if the points are counter-clockwise we are looking at the "front". If not we are looking at
                    // the back. OpenGL has an optimization where all back-facing triangles are culled, since they
                    // usually represent the backside of an object and aren't visible anyways.

                    // Front face
                    -1.0f,  1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,

                    // Right face
                    1.0f,   1.0f,  1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,  -1.0f, -1.0f,
                    1.0f,   1.0f, -1.0f,

                    // Back face
                    1.0f,   1.0f, -1.0f,
                    1.0f,  -1.0f, -1.0f,
                    -1.0f,  1.0f, -1.0f,
                    1.0f,  -1.0f, -1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f,  1.0f, -1.0f,

                    // Left face
                    -1.0f,  1.0f, -1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f, -1.0f,  1.0f,
                    -1.0f,  1.0f,  1.0f,

                    // Top face
                    -1.0f,  1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,

                    // Bottom face
                    1.0f,  -1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                };

                // R, G, B, A
                float[] cubeColorData =
                {
                    // Front face (red)
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,

                    // Right face (green)
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,

                    // Back face (blue)
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,

                    // Left face (yellow)
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,

                    // Top face (cyan)
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,

                    // Bottom face (magenta)
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f
                };

                // X, Y, Z
                // The normal is used in light calculations and is a vector which points
                // orthogonal to the plane of the surface. For a cube model, the normals
                // should be orthogonal to the points of each face.
                float[] cubeNormalData =
                {
                    // Front face
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,

                    // Right face
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,

                    // Back face
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,

                    // Left face
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,

                    // Top face
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,

                    // Bottom face
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f, 0.0f
                };
                #endregion

                // Initialize the buffers.
                mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
                                 .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubePositions.put(cubePositionData).position(0);

                mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
                              .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeColors.put(cubeColorData).position(0);

                mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.Length * mBytesPerFloat)
                               .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeNormals.put(cubeNormalData).position(0);
            }
Пример #12
0
 public WebGLProgram(WebGLRenderingContext gl)
 {
     // InternalConstructor
 }
Пример #13
0
 public WebGLDebugShaders(WebGLRenderingContext gl)
 {
     // InternalConstructor
 }
			//script: error JSC1000: Java : Opcode not implemented: stelem.r4 at AndroidOpenGLESLesson5Activity.Activities.AndroidOpenGLESLesson5Activity+LessonFiveRenderer+<>c.<.ctor>b__17_0

			public LessonFiveRenderer(Context activityContext)
			{
				this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object)__gl;

				mActivityContext = activityContext;

				#region generateCubeData
				Func<f[], f[], f[], f[], f[], f[], f[], f[], int, f[]> generateCubeData =
					(f[] point1,
					 f[] point2,
					 f[] point3,
					 f[] point4,
					 f[] point5,
					 f[] point6,
					 f[] point7,
					 f[] point8,
					 int elementsPerPoint) =>
					{
						// Given a cube with the points defined as follows:
						// front left top, front right top, front left bottom, front right bottom,
						// back left top, back right top, back left bottom, back right bottom,		
						// return an array of 6 sides, 2 triangles per side, 3 vertices per triangle, and 4 floats per vertex.
						int FRONT = 0;
						int RIGHT = 1;
						int BACK = 2;
						int LEFT = 3;
						int TOP = 4;
						int BOTTOM = 5;

						int size = elementsPerPoint * 6 * 6;
						float[] cubeData = new float[size];

						for (int face = 0; face < 6; face++)
						{
							// Relative to the side, p1 = top left, p2 = top right, p3 = bottom left, p4 = bottom right
							float[] p1, p2, p3, p4;

							// Select the points for this face
							if (face == FRONT)
							{
								p1 = point1; p2 = point2; p3 = point3; p4 = point4;
							}
							else if (face == RIGHT)
							{
								p1 = point2; p2 = point6; p3 = point4; p4 = point8;
							}
							else if (face == BACK)
							{
								p1 = point6; p2 = point5; p3 = point8; p4 = point7;
							}
							else if (face == LEFT)
							{
								p1 = point5; p2 = point1; p3 = point7; p4 = point3;
							}
							else if (face == TOP)
							{
								p1 = point5; p2 = point6; p3 = point1; p4 = point2;
							}
							else // if (side == BOTTOM)
							{
								p1 = point8; p2 = point7; p3 = point4; p4 = point3;
							}

							// In OpenGL counter-clockwise winding is default. This means that when we look at a triangle, 
							// if the points are counter-clockwise we are looking at the "front". If not we are looking at
							// the back. OpenGL has an optimization where all back-facing triangles are culled, since they
							// usually represent the backside of an object and aren't visible anyways.

							// Build the triangles
							//  1---3,6
							//  | / |
							// 2,4--5
							int offset = face * elementsPerPoint * 6;

							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p1[i]; }
							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p3[i]; }
							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p2[i]; }
							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p3[i]; }
							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p4[i]; }
							for (int i = 0; i < elementsPerPoint; i++) { cubeData[offset++] = p2[i]; }
						}

						return cubeData;
					};
				#endregion


				// Define points for a cube.
				// X, Y, Z
				float[] p1p = { -1.0f, 1.0f, 1.0f };
				float[] p2p = { 1.0f, 1.0f, 1.0f };
				float[] p3p = { -1.0f, -1.0f, 1.0f };
				float[] p4p = { 1.0f, -1.0f, 1.0f };
				float[] p5p = { -1.0f, 1.0f, -1.0f };
				float[] p6p = { 1.0f, 1.0f, -1.0f };
				float[] p7p = { -1.0f, -1.0f, -1.0f };
				float[] p8p = { 1.0f, -1.0f, -1.0f };

				float[] cubePositionData = generateCubeData(p1p, p2p, p3p, p4p, p5p, p6p, p7p, p8p, p1p.Length);

				// Points of the cube: color information
				// R, G, B, A
				float[] p1c = { 1.0f, 0.0f, 0.0f, 1.0f };		// red			
				float[] p2c = { 1.0f, 0.0f, 1.0f, 1.0f };		// magenta
				float[] p3c = { 0.0f, 0.0f, 0.0f, 1.0f };		// black
				float[] p4c = { 0.0f, 0.0f, 1.0f, 1.0f };		// blue
				float[] p5c = { 1.0f, 1.0f, 0.0f, 1.0f };		// yellow
				float[] p6c = { 1.0f, 1.0f, 1.0f, 1.0f };		// white
				float[] p7c = { 0.0f, 1.0f, 0.0f, 1.0f };		// green
				float[] p8c = { 0.0f, 1.0f, 1.0f, 1.0f };		// cyan

				float[] cubeColorData = generateCubeData(p1c, p2c, p3c, p4c, p5c, p6c, p7c, p8c, p1c.Length);

				// Initialize the buffers.
				mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
				.order(ByteOrder.nativeOrder()).asFloatBuffer();
				mCubePositions.put(cubePositionData).position(0);

				mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
				.order(ByteOrder.nativeOrder()).asFloatBuffer();
				mCubeColors.put(cubeColorData).position(0);
			}
Пример #15
0
 public static void bufferData(this WebGLRenderingContext gl, uint target, float[] vertices, uint usage)
 {
     gl.bufferData(target, new Float32Array(vertices), usage);
 }
            public LessonTwoRenderer()
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object)__gl;

                #region  Define points for a cube.

                // X, Y, Z
                float[] cubePositionData =
		        {
				        // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle, 
				        // if the points are counter-clockwise we are looking at the "front". If not we are looking at
				        // the back. OpenGL has an optimization where all back-facing triangles are culled, since they
				        // usually represent the backside of an object and aren't visible anyways.
				
				        // Front face
				        -1.0f, 1.0f, 1.0f,				
				        -1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, 1.0f, 
				        -1.0f, -1.0f, 1.0f, 				
				        1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, 1.0f,
				
				        // Right face
				        1.0f, 1.0f, 1.0f,				
				        1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, -1.0f,
				        1.0f, -1.0f, 1.0f,				
				        1.0f, -1.0f, -1.0f,
				        1.0f, 1.0f, -1.0f,
				
				        // Back face
				        1.0f, 1.0f, -1.0f,				
				        1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, -1.0f,
				        1.0f, -1.0f, -1.0f,				
				        -1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, -1.0f,
				
				        // Left face
				        -1.0f, 1.0f, -1.0f,				
				        -1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, 1.0f, 
				        -1.0f, -1.0f, -1.0f,				
				        -1.0f, -1.0f, 1.0f, 
				        -1.0f, 1.0f, 1.0f, 
				
				        // Top face
				        -1.0f, 1.0f, -1.0f,				
				        -1.0f, 1.0f, 1.0f, 
				        1.0f, 1.0f, -1.0f, 
				        -1.0f, 1.0f, 1.0f, 				
				        1.0f, 1.0f, 1.0f, 
				        1.0f, 1.0f, -1.0f,
				
				        // Bottom face
				        1.0f, -1.0f, -1.0f,				
				        1.0f, -1.0f, 1.0f, 
				        -1.0f, -1.0f, -1.0f,
				        1.0f, -1.0f, 1.0f, 				
				        -1.0f, -1.0f, 1.0f,
				        -1.0f, -1.0f, -1.0f,
		        };

                // R, G, B, A
                float[] cubeColorData =
		        {				
				        // Front face (red)
				        1.0f, 0.0f, 0.0f, 1.0f,				
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,				
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,
				
				        // Right face (green)
				        0.0f, 1.0f, 0.0f, 1.0f,				
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,				
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,
				
				        // Back face (blue)
				        0.0f, 0.0f, 1.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,
				
				        // Left face (yellow)
				        1.0f, 1.0f, 0.0f, 1.0f,				
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,				
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,
				
				        // Top face (cyan)
				        0.0f, 1.0f, 1.0f, 1.0f,				
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,				
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,
				
				        // Bottom face (magenta)
				        1.0f, 0.0f, 1.0f, 1.0f,				
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f,				
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f
		        };

                // X, Y, Z
                // The normal is used in light calculations and is a vector which points
                // orthogonal to the plane of the surface. For a cube model, the normals
                // should be orthogonal to the points of each face.
                float[] cubeNormalData =
		        {												
				        // Front face
				        0.0f, 0.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,
				
				        // Right face 
				        1.0f, 0.0f, 0.0f,				
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,				
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,
				
				        // Back face 
				        0.0f, 0.0f, -1.0f,				
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,				
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,
				
				        // Left face 
				        -1.0f, 0.0f, 0.0f,				
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,				
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,
				
				        // Top face 
				        0.0f, 1.0f, 0.0f,			
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,				
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,
				
				        // Bottom face 
				        0.0f, -1.0f, 0.0f,			
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f,				
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f
		        };
                #endregion

                // Initialize the buffers.
                mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubePositions.put(cubePositionData).position(0);

                mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeColors.put(cubeColorData).position(0);

                mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeNormals.put(cubeNormalData).position(0);
            }
Пример #17
0
 public WebGLTexture(WebGLRenderingContext gl)
 {
     // InternalConstructor
 }
            public LessonOneRenderer()
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object) __gl;


                #region Define points for equilateral triangles.

                // This triangle is red, green, and blue.
                float[] triangle1VerticesData =
                {
                    // X, Y, Z,
                    // R, G, B, A
                    -0.5f,       -0.25f, 0.0f,
                    1.0f,          0.0f, 0.0f, 1.0f,

                    0.5f,        -0.25f, 0.0f,
                    0.0f,          0.0f, 1.0f, 1.0f,

                    0.0f,  0.559016994f, 0.0f,
                    0.0f,          1.0f, 0.0f, 1.0f
                };

                // This triangle is yellow, cyan, and magenta.
                float[] triangle2VerticesData =
                {
                    // X, Y, Z,
                    // R, G, B, A
                    -0.5f,       -0.25f, 0.0f,
                    1.0f,          1.0f, 0.0f, 1.0f,

                    0.5f,        -0.25f, 0.0f,
                    0.0f,          1.0f, 1.0f, 1.0f,

                    0.0f,  0.559016994f, 0.0f,
                    1.0f,          0.0f, 1.0f, 1.0f
                };

                // This triangle is white, gray, and black.
                float[] triangle3VerticesData =
                {
                    // X, Y, Z,
                    // R, G, B, A
                    -0.5f,       -0.25f, 0.0f,
                    1.0f,          1.0f, 1.0f, 1.0f,

                    0.5f,        -0.25f, 0.0f,
                    0.5f,          0.5f, 0.5f, 1.0f,

                    0.0f,  0.559016994f, 0.0f,
                    0.0f,          0.0f, 0.0f, 1.0f
                };
                #endregion

                // Initialize the buffers.
                mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.Length * mBytesPerFloat)
                                     .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mTriangle2Vertices = ByteBuffer.allocateDirect(triangle2VerticesData.Length * mBytesPerFloat)
                                     .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mTriangle3Vertices = ByteBuffer.allocateDirect(triangle3VerticesData.Length * mBytesPerFloat)
                                     .order(ByteOrder.nativeOrder()).asFloatBuffer();

                mTriangle1Vertices.put(triangle1VerticesData).position(0);
                mTriangle2Vertices.put(triangle2VerticesData).position(0);
                mTriangle3Vertices.put(triangle3VerticesData).position(0);
            }
            public LessonFourRenderer(Context activityContext)
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object) __gl;


                mActivityContext = activityContext;

                #region Define points for a cube.

                // X, Y, Z
                float[] cubePositionData =
                {
                    // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle,
                    // if the points are counter-clockwise we are looking at the "front". If not we are looking at
                    // the back. OpenGL has an optimization where all back-facing triangles are culled, since they
                    // usually represent the backside of an object and aren't visible anyways.

                    // Front face
                    -1.0f,  1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,

                    // Right face
                    1.0f,   1.0f,  1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    1.0f,  -1.0f, -1.0f,
                    1.0f,   1.0f, -1.0f,

                    // Back face
                    1.0f,   1.0f, -1.0f,
                    1.0f,  -1.0f, -1.0f,
                    -1.0f,  1.0f, -1.0f,
                    1.0f,  -1.0f, -1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f,  1.0f, -1.0f,

                    // Left face
                    -1.0f,  1.0f, -1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                    -1.0f, -1.0f,  1.0f,
                    -1.0f,  1.0f,  1.0f,

                    // Top face
                    -1.0f,  1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,
                    -1.0f,  1.0f,  1.0f,
                    1.0f,   1.0f,  1.0f,
                    1.0f,   1.0f, -1.0f,

                    // Bottom face
                    1.0f,  -1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                    1.0f,  -1.0f,  1.0f,
                    -1.0f, -1.0f,  1.0f,
                    -1.0f, -1.0f, -1.0f,
                };

                // R, G, B, A
                float[] cubeColorData =
                {
                    // Front face (red)
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,
                    1.0f, 0.0f, 0.0f, 1.0f,

                    // Right face (green)
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,
                    0.0f, 1.0f, 0.0f, 1.0f,

                    // Back face (blue)
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,
                    0.0f, 0.0f, 1.0f, 1.0f,

                    // Left face (yellow)
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 0.0f, 1.0f,

                    // Top face (cyan)
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,
                    0.0f, 1.0f, 1.0f, 1.0f,

                    // Bottom face (magenta)
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f,
                    1.0f, 0.0f, 1.0f, 1.0f
                };

                // X, Y, Z
                // The normal is used in light calculations and is a vector which points
                // orthogonal to the plane of the surface. For a cube model, the normals
                // should be orthogonal to the points of each face.
                float[] cubeNormalData =
                {
                    // Front face
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,
                    0.0f,   0.0f,  1.0f,

                    // Right face
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,
                    1.0f,   0.0f,  0.0f,

                    // Back face
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,
                    0.0f,   0.0f, -1.0f,

                    // Left face
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,
                    -1.0f,  0.0f,  0.0f,

                    // Top face
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,
                    0.0f,   1.0f,  0.0f,

                    // Bottom face
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f,  0.0f,
                    0.0f,  -1.0f, 0.0f
                };

                // S, T (or X, Y)
                // Texture coordinate data.
                // Because images have a Y axis pointing downward (values increase as you move down the image) while
                // OpenGL has a Y axis pointing upward, we adjust for that here by flipping the Y axis.
                // What's more is that the texture coordinates are the same for every face.
                float[] cubeTextureCoordinateData =
                {
                    // Front face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f,

                    // Right face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f,

                    // Back face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f,

                    // Left face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f,

                    // Top face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f,

                    // Bottom face
                    0.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f,
                    1.0f, 0.0f
                };
                #endregion

                // Initialize the buffers.
                mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
                                 .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubePositions.put(cubePositionData).position(0);

                mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
                              .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeColors.put(cubeColorData).position(0);

                mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.Length * mBytesPerFloat)
                               .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeNormals.put(cubeNormalData).position(0);

                mCubeTextureCoordinates = ByteBuffer.allocateDirect(cubeTextureCoordinateData.Length * mBytesPerFloat)
                                          .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeTextureCoordinates.put(cubeTextureCoordinateData).position(0);
            }
            public LessonFourRenderer(Context activityContext)
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object)__gl;


                mActivityContext = activityContext;

                #region Define points for a cube.

                // X, Y, Z
                float[] cubePositionData =
		        {
				        // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle, 
				        // if the points are counter-clockwise we are looking at the "front". If not we are looking at
				        // the back. OpenGL has an optimization where all back-facing triangles are culled, since they
				        // usually represent the backside of an object and aren't visible anyways.
				
				        // Front face
				        -1.0f, 1.0f, 1.0f,				
				        -1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, 1.0f, 
				        -1.0f, -1.0f, 1.0f, 				
				        1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, 1.0f,
				
				        // Right face
				        1.0f, 1.0f, 1.0f,				
				        1.0f, -1.0f, 1.0f,
				        1.0f, 1.0f, -1.0f,
				        1.0f, -1.0f, 1.0f,				
				        1.0f, -1.0f, -1.0f,
				        1.0f, 1.0f, -1.0f,
				
				        // Back face
				        1.0f, 1.0f, -1.0f,				
				        1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, -1.0f,
				        1.0f, -1.0f, -1.0f,				
				        -1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, -1.0f,
				
				        // Left face
				        -1.0f, 1.0f, -1.0f,				
				        -1.0f, -1.0f, -1.0f,
				        -1.0f, 1.0f, 1.0f, 
				        -1.0f, -1.0f, -1.0f,				
				        -1.0f, -1.0f, 1.0f, 
				        -1.0f, 1.0f, 1.0f, 
				
				        // Top face
				        -1.0f, 1.0f, -1.0f,				
				        -1.0f, 1.0f, 1.0f, 
				        1.0f, 1.0f, -1.0f, 
				        -1.0f, 1.0f, 1.0f, 				
				        1.0f, 1.0f, 1.0f, 
				        1.0f, 1.0f, -1.0f,
				
				        // Bottom face
				        1.0f, -1.0f, -1.0f,				
				        1.0f, -1.0f, 1.0f, 
				        -1.0f, -1.0f, -1.0f,
				        1.0f, -1.0f, 1.0f, 				
				        -1.0f, -1.0f, 1.0f,
				        -1.0f, -1.0f, -1.0f,
		        };

                // R, G, B, A
                float[] cubeColorData =
		        {				
				        // Front face (red)
				        1.0f, 0.0f, 0.0f, 1.0f,				
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,				
				        1.0f, 0.0f, 0.0f, 1.0f,
				        1.0f, 0.0f, 0.0f, 1.0f,
				
				        // Right face (green)
				        0.0f, 1.0f, 0.0f, 1.0f,				
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,				
				        0.0f, 1.0f, 0.0f, 1.0f,
				        0.0f, 1.0f, 0.0f, 1.0f,
				
				        // Back face (blue)
				        0.0f, 0.0f, 1.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f, 1.0f,
				        0.0f, 0.0f, 1.0f, 1.0f,
				
				        // Left face (yellow)
				        1.0f, 1.0f, 0.0f, 1.0f,				
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,				
				        1.0f, 1.0f, 0.0f, 1.0f,
				        1.0f, 1.0f, 0.0f, 1.0f,
				
				        // Top face (cyan)
				        0.0f, 1.0f, 1.0f, 1.0f,				
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,				
				        0.0f, 1.0f, 1.0f, 1.0f,
				        0.0f, 1.0f, 1.0f, 1.0f,
				
				        // Bottom face (magenta)
				        1.0f, 0.0f, 1.0f, 1.0f,				
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f,				
				        1.0f, 0.0f, 1.0f, 1.0f,
				        1.0f, 0.0f, 1.0f, 1.0f
		        };

                // X, Y, Z
                // The normal is used in light calculations and is a vector which points
                // orthogonal to the plane of the surface. For a cube model, the normals
                // should be orthogonal to the points of each face.
                float[] cubeNormalData =
		        {												
				        // Front face
				        0.0f, 0.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,				
				        0.0f, 0.0f, 1.0f,
				        0.0f, 0.0f, 1.0f,
				
				        // Right face 
				        1.0f, 0.0f, 0.0f,				
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,				
				        1.0f, 0.0f, 0.0f,
				        1.0f, 0.0f, 0.0f,
				
				        // Back face 
				        0.0f, 0.0f, -1.0f,				
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,				
				        0.0f, 0.0f, -1.0f,
				        0.0f, 0.0f, -1.0f,
				
				        // Left face 
				        -1.0f, 0.0f, 0.0f,				
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,				
				        -1.0f, 0.0f, 0.0f,
				        -1.0f, 0.0f, 0.0f,
				
				        // Top face 
				        0.0f, 1.0f, 0.0f,			
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,				
				        0.0f, 1.0f, 0.0f,
				        0.0f, 1.0f, 0.0f,
				
				        // Bottom face 
				        0.0f, -1.0f, 0.0f,			
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f,				
				        0.0f, -1.0f, 0.0f,
				        0.0f, -1.0f, 0.0f
		        };

                // S, T (or X, Y)
                // Texture coordinate data.
                // Because images have a Y axis pointing downward (values increase as you move down the image) while
                // OpenGL has a Y axis pointing upward, we adjust for that here by flipping the Y axis.
                // What's more is that the texture coordinates are the same for every face.
                float[] cubeTextureCoordinateData =
		        {												
				        // Front face
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f,				
				
				        // Right face 
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f,	
				
				        // Back face 
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f,	
				
				        // Left face 
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f,	
				
				        // Top face 
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f,	
				
				        // Bottom face 
				        0.0f, 0.0f, 				
				        0.0f, 1.0f,
				        1.0f, 0.0f,
				        0.0f, 1.0f,
				        1.0f, 1.0f,
				        1.0f, 0.0f
		        };
                #endregion

                // Initialize the buffers.
                mCubePositions = ByteBuffer.allocateDirect(cubePositionData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubePositions.put(cubePositionData).position(0);

                mCubeColors = ByteBuffer.allocateDirect(cubeColorData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeColors.put(cubeColorData).position(0);

                mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeNormals.put(cubeNormalData).position(0);

                mCubeTextureCoordinates = ByteBuffer.allocateDirect(cubeTextureCoordinateData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mCubeTextureCoordinates.put(cubeTextureCoordinateData).position(0);
            }
            public LessonOneRenderer()
            {
                this.gl = (ScriptCoreLib.JavaScript.WebGL.WebGLRenderingContext)(object)__gl;


                #region Define points for equilateral triangles.

                // This triangle is red, green, and blue.
                float[] triangle1VerticesData = {
				// X, Y, Z, 
				// R, G, B, A
	            -0.5f, -0.25f, 0.0f, 
	            1.0f, 0.0f, 0.0f, 1.0f,
	            
	            0.5f, -0.25f, 0.0f,
	            0.0f, 0.0f, 1.0f, 1.0f,
	            
	            0.0f, 0.559016994f, 0.0f, 
	            0.0f, 1.0f, 0.0f, 1.0f};

                // This triangle is yellow, cyan, and magenta.
                float[] triangle2VerticesData = {
				// X, Y, Z, 
				// R, G, B, A
	            -0.5f, -0.25f, 0.0f, 
	            1.0f, 1.0f, 0.0f, 1.0f,
	            
	            0.5f, -0.25f, 0.0f, 
	            0.0f, 1.0f, 1.0f, 1.0f,
	            
	            0.0f, 0.559016994f, 0.0f, 
	            1.0f, 0.0f, 1.0f, 1.0f};

                // This triangle is white, gray, and black.
                float[] triangle3VerticesData = {
				// X, Y, Z, 
				// R, G, B, A
	            -0.5f, -0.25f, 0.0f, 
	            1.0f, 1.0f, 1.0f, 1.0f,
	            
	            0.5f, -0.25f, 0.0f, 
	            0.5f, 0.5f, 0.5f, 1.0f,
	            
	            0.0f, 0.559016994f, 0.0f, 
	            0.0f, 0.0f, 0.0f, 1.0f};
                #endregion

                // Initialize the buffers.
                mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mTriangle2Vertices = ByteBuffer.allocateDirect(triangle2VerticesData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
                mTriangle3Vertices = ByteBuffer.allocateDirect(triangle3VerticesData.Length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();

                mTriangle1Vertices.put(triangle1VerticesData).position(0);
                mTriangle2Vertices.put(triangle2VerticesData).position(0);
                mTriangle3Vertices.put(triangle3VerticesData).position(0);
            }