egl/sfegltest/src/gles1cube.cpp
branchbug235_bringup_0
changeset 215 097e92a68d68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/sfegltest/src/gles1cube.cpp	Fri Nov 05 17:31:20 2010 +0000
@@ -0,0 +1,240 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+
+#include "gles1cube.h"
+
+_LIT(KGLES1CubeName, "gles1cube");
+
+CEGLRendering* CGLES1Cube::NewL(RWindow& aWindow)
+    {
+    CGLES1Cube* self = new (ELeave) CGLES1Cube(aWindow);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+const TDesC& CGLES1Cube::Name()
+	{
+	return KGLES1CubeName;
+	}
+
+CGLES1Cube::CGLES1Cube(RWindow& aWindow)
+    :   CEGLRendering(aWindow, EGL_OPENGL_ES_API)
+    {
+
+    }
+
+CGLES1Cube::~CGLES1Cube()
+	{
+	RDebug::Printf("[EBT] CGLES1Cube::~CGLES1Cube");
+	glDeleteBuffers(1, &iCoordinateColorBuffer);
+	glDeleteBuffers(1, &iIndexBuffer);
+	}
+
+/*
+    v6----- v4
+   /|      /|
+  v0------v2|
+  | |     | |
+  | |v7---|-|v5
+  |/      |/
+  v1------v3
+
+v0: -1.0, +1.0, +1.0,
+v1: -1.0, -1.0, +1.0,
+v2: +1.0, +1.0, +1.0,
+v3: +1.0, -1.0, +1.0,
+v4: +1.0, +1.0, -1.0,
+v5: +1.0, -1.0, -1.0,
+v6: -1.0, +1.0, -1.0,
+v7: -1.0, -1.0, -1.0,
+*/
+
+static GLfloat CoordinateData[] =
+	{
+	-1.0, +1.0, +1.0,	// v0
+	-1.0, -1.0, +1.0,	// v1
+	+1.0, +1.0, +1.0,	// v2
+	+1.0, -1.0, +1.0,	// v3
+	+1.0, +1.0, -1.0,	// v4
+	+1.0, -1.0, -1.0,	// v5
+	-1.0, +1.0, -1.0,	// v6
+	-1.0, -1.0, -1.0	// v7
+	};
+
+static const TInt CoordinateElementCount = 3; // XYZ
+
+static GLfloat ColorData[] =
+	{
+	 0.0,  1.0,  1.0,  1.0,	// v0
+	 0.0,  0.0,  1.0,  1.0,	// v1
+	 1.0,  1.0,  1.0,  1.0,	// v2
+	 1.0,  0.0,  1.0,  1.0,	// v3
+	 1.0,  1.0,  0.0,  1.0,	// v4
+	 1.0,  0.0,  0.0,  1.0,	// v5
+	 0.0,  1.0,  0.0,  1.0,	// v6
+	 0.0,  0.0,  0.0,  1.0	// v7
+	};
+
+static const TInt ColorElementCount = 4; // RGBA
+
+static GLubyte FaceData[] =
+	{
+	0, 1, 3, 2, // front
+	2, 3, 5, 4, // right
+	4, 5, 7, 6, // left
+	6, 7, 1, 0, // back
+	6, 0, 2, 4, // top
+	1, 7, 5, 3
+	};
+
+static const TInt VerticesPerFace = 4;
+static const TInt VertexCount = sizeof(FaceData) / sizeof(GLubyte);
+static const TInt FaceCount = VertexCount / VerticesPerFace;
+
+static const TInt TrianglesPerFace = 2;
+static const TInt VerticesPerTriangle = 3;
+
+static const TInt IndexCount = FaceCount * TrianglesPerFace * VerticesPerTriangle;
+
+static GLubyte FaceIndexData[] =
+	{
+	0, 2, 1,
+	0, 3, 2
+	};
+
+void CGLES1Cube::KhrSetup()
+    {
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup");
+
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup vertexCount %d", VertexCount);
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup faceCount %d", FaceCount);
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup indexCount %d", IndexCount);
+
+	const GLsizeiptr coordinateSize = CoordinateElementCount * sizeof(GLfloat);
+	const GLsizeiptr coordinateDataSize = VertexCount * coordinateSize;
+	const GLsizeiptr colorSize = ColorElementCount * sizeof(GLfloat);
+	const GLsizeiptr colorDataSize = VertexCount * colorSize;
+
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glViewport %d x %d", WindowSize().iWidth, WindowSize().iHeight);
+	glViewport(0, 0, WindowSize().iWidth, WindowSize().iHeight);
+	GLCheckError();
+
+	glEnable(GL_DEPTH_TEST);
+	glEnable(GL_CULL_FACE);
+	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
+
+	// Create coordinate/color buffer
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glGenBuffers vertex/color");
+	glGenBuffers(1, &iCoordinateColorBuffer);
+	GLCheckError();
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glBindBuffer vertex/color");
+	glBindBuffer(GL_ARRAY_BUFFER, iCoordinateColorBuffer);
+	GLCheckError();
+
+	// Allocate memory for coordinate/color buffer
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glBufferData coordinate/color");
+	glBufferData(GL_ARRAY_BUFFER, coordinateDataSize + colorDataSize, 0, GL_STATIC_DRAW);
+	GLCheckError();
+
+	// Upload coordinate/color data
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup supply coordinate/color data");
+	GLubyte indexData[IndexCount];
+	for (TInt i=0; i<FaceCount; ++i)
+		{
+		RDebug::Printf("[EBT] CGLES1Cube::KhrSetup face %d", i);
+		// Upload coordinate/color data for this face
+		for (TInt j=0; j<VerticesPerFace; ++j)
+			{
+			const TInt vertexIndex = FaceData[i * VerticesPerFace + j];
+			const TInt destIndex = (i * VerticesPerFace) + j;
+			const GLfloat *coordSrc = CoordinateData + vertexIndex * CoordinateElementCount;
+			const TInt coordDest = destIndex * coordinateSize;
+			const GLfloat *colorSrc = ColorData + vertexIndex * ColorElementCount;
+			const TInt colorDest = coordinateDataSize + destIndex * colorSize;
+			RDebug::Printf("[EBT] CGLES1Cube::KhrSetup vertex %d (%d) destIndex %d coordDest %d colorDest %d",
+					       j, vertexIndex, destIndex, coordDest, colorDest);
+			RDebug::Printf("[EBT] CGLES1Cube::KhrSetup coord %3.1f %3.1f %3.1f",
+						   *(coordSrc), *(coordSrc + 1), *(coordSrc + 2));
+			RDebug::Printf("[EBT] CGLES1Cube::KhrSetup color %3.1f %3.1f %3.1f",
+						   *(colorSrc), *(colorSrc + 1), *(colorSrc + 2));
+			glBufferSubData(GL_ARRAY_BUFFER, coordDest, coordinateSize, coordSrc);
+			GLCheckError();
+			glBufferSubData(GL_ARRAY_BUFFER, colorDest, colorSize, colorSrc);
+			GLCheckError();
+			}
+
+		// Store vertex indices for this face
+		TInt indexDataOffset = i * TrianglesPerFace * VerticesPerTriangle;
+		TInt indexBase = i * VerticesPerFace;
+		for (TInt j=0; j<TrianglesPerFace * VerticesPerTriangle; ++j)
+			{
+			RDebug::Printf("[EBT] CGLES1Cube::KhrSetup index %d offset %d value %d",
+						   j, indexDataOffset, indexBase + FaceIndexData[j]);
+			indexData[indexDataOffset++] = indexBase + FaceIndexData[j];
+			}
+		}
+
+	// Tell GL engine how to unpack coordinate/color buffer
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glVertexPointer");
+	glVertexPointer(CoordinateElementCount, GL_FLOAT, 0, 0);
+	GLCheckError();
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glColorPointer");
+	glColorPointer(ColorElementCount, GL_FLOAT, 0, reinterpret_cast<GLvoid*>(coordinateDataSize));
+	GLCheckError();
+
+	// Create index buffer
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glGenBuffers index");
+	glGenBuffers(1, &iIndexBuffer);
+	GLCheckError();
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glBindBuffer index");
+	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iIndexBuffer);
+	GLCheckError();
+
+	// Allocate memory for index buffer and upload index data
+	RDebug::Printf("[EBT] CGLES1Cube::KhrSetup glBufferData index");
+	glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexCount, indexData, GL_STATIC_DRAW);
+	GLCheckError();
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	GLCheckError();
+	glEnableClientState(GL_COLOR_ARRAY);
+	GLCheckError();
+
+	StartRedrawTimer();
+    }
+
+void CGLES1Cube::KhrPaint()
+	{
+	RDebug::Printf("[EBT] CGLES1Cube::KhrPaint");
+
+	glLoadIdentity();
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+	glOrthof(-1.5f, 1.5f, -2.5f, 2.5f, -10.5f, 10.5f);
+
+	glMatrixMode(GL_MODELVIEW);
+	iAngle = (iAngle + 1.0f);
+	if (iAngle > 360.0f)
+		{
+		iAngle -= 360.0f;
+		}
+	glRotatef(iAngle, 0.0f, 1.0f, 0.5f);
+
+	glDrawElements(GL_TRIANGLES, IndexCount, GL_UNSIGNED_BYTE, 0);
+    }
+