// NewTrainingFramework.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "../Utilities/utilities.h"
#include "Vertex.h"
#include "Shaders.h"
#include "Globals.h"
#include <conio.h>
int COLOR = 3;
GLuint vboId;
Shaders myShaders;
Matrix m;
float m_time;
GLuint textureHandle;
int uniformLocation;
int Init ( ESContext *esContext )
{
m.SetIdentity();
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
//triangle data (heap)
Vertex verticesData[3];
verticesData[0].pos.x = 0.0f; verticesData[0].pos.y = 0.5f; verticesData[0].pos.z = 0.0f;
verticesData[0].color.x = 0.5f; verticesData[0].color.y = 0.0f; verticesData[0].color.z = 0.0f;
verticesData[0].uv.x = 0.0f; //u
verticesData[0].uv.y = 0.0f; //v
verticesData[1].pos.x = -0.5f; verticesData[1].pos.y = -0.5f; verticesData[1].pos.z = 0.0f;
verticesData[1].color.x = 0.0f; verticesData[1].color.y = 0.5f; verticesData[1].color.z = 0.0f;
verticesData[1].uv.x = 0.5f;
verticesData[1].uv.y = 1.0f;
verticesData[2].pos.x = 0.5f; verticesData[2].pos.y = -0.5f; verticesData[2].pos.z = 0.0f;
verticesData[2].color.x = 0.0f; verticesData[2].color.y = 0.0f; verticesData[2].color.z = 0.5f;
verticesData[2].uv.x = 1.0f;
verticesData[2].uv.y = 0.0f;
//buffer object
glGenBuffers(1, &vboId); //buffer object name generation
glBindBuffer(GL_ARRAY_BUFFER, vboId); //buffer object binding
glBufferData(GL_ARRAY_BUFFER, sizeof(verticesData), verticesData, GL_STATIC_DRAW); //creation and initializion of buffer onject storage
glBindBuffer(GL_ARRAY_BUFFER, 0);
//creation of shaders and program
return myShaders.Init("../Resources/Shaders/TriangleShaderVS.vs", "../Resources/Shaders/TriangleShaderFS.fs");
}
void InitTexture ( char *filepath, char * wrapmode)
{
// create the OpenGL ES texture resource and get the handle
glGenTextures(1, &textureHandle);
// bind the texture to the 2D texture type
glBindTexture(GL_TEXTURE_2D, textureHandle);
// create CPU buffer and load it with the image data
int width, height, bpp;
char * bufferTGA = LoadTGA(filepath, &width, &height, &bpp );
// load the image data into OpenGL ES texture resource
if (bpp == 24)
{ //bpp = bits per pixel (8*number of channels, for RGBA = 8*4=32)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, bufferTGA);
}
else
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bufferTGA);
}
// free the client memory
delete [] bufferTGA;
//set the filters for minification and magnification
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// generate the mipmap chain
glGenerateMipmap(GL_TEXTURE_2D);
if (wrapmode == "REPEAT")
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
if (wrapmode == "CLAMP_TO_EDGE")
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
uniformLocation = glGetUniformLocation(myShaders.program, filepath);
}
void Draw ( ESContext *esContext )
{
glUseProgram(myShaders.program);
glUniformMatrix4fv( myShaders.matrixTransform, 1, false, (GLfloat *)&m );
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
GLfloat* ptr = (GLfloat *)0;
if(myShaders.positionAttribute != -1) //attribute passing to shader, for uniforms use glUniform1f(time, deltaT); glUniformMatrix4fv( m_pShader->matrixWVP, 1, false, (GLfloat *)&rotationMat );
{
glEnableVertexAttribArray(myShaders.positionAttribute);
glVertexAttribPointer(myShaders.positionAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), ptr);
}
if(myShaders.colorAttribute != -1)
{
glEnableVertexAttribArray(myShaders.colorAttribute);
glVertexAttribPointer(myShaders.colorAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), ptr+COLOR);
}
if(myShaders.uvAttrib != -1)
{
glEnableVertexAttribArray(myShaders.uvAttrib);
glVertexAttribPointer(myShaders.uvAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), ptr+uvCOOR);
}
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0);
eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
unsigned short textureUnit = 0;
// make active a texture unit
glActiveTexture(GL_TEXTURE0 + textureUnit);
// bind the texture to the currently active texture unit
glBindTexture(GL_TEXTURE_2D, textureHandle);
// set the uniform sampler
glUniform1i(uniformLocation, textureHandle);
}
void CleanUp()
{
glDeleteBuffers(1, &vboId);
}
int _tmain(int argc, _TCHAR* argv[])
{
ESContext esContext;
esInitContext ( &esContext );
esCreateWindow ( &esContext, "Hello Triangle", Globals::screenWidth, Globals::screenHeight, ES_WINDOW_RGB | ES_WINDOW_DEPTH);
if ( Init ( &esContext ) != 0 )
return 0;
InitTexture("../Resources/Textures/Rock.tga", "REPEAT" );
esRegisterDrawFunc ( &esContext, Draw );
esMainLoop ( &esContext );
//releasing OpenGL resources
CleanUp();
//identifying memory leaks
MemoryDump();
printf("Press any key...\n");
_getch();
return 0;
}
Ly8gTmV3VHJhaW5pbmdGcmFtZXdvcmsuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgovLwoKI2luY2x1ZGUgInN0ZGFmeC5oIgojaW5jbHVkZSAiLi4vVXRpbGl0aWVzL3V0aWxpdGllcy5oIiAKI2luY2x1ZGUgIlZlcnRleC5oIgojaW5jbHVkZSAiU2hhZGVycy5oIgojaW5jbHVkZSAiR2xvYmFscy5oIgojaW5jbHVkZSA8Y29uaW8uaD4KCmludCBDT0xPUiA9IDM7CkdMdWludCB2Ym9JZDsKU2hhZGVycyBteVNoYWRlcnM7Ck1hdHJpeCBtOwpmbG9hdCBtX3RpbWU7CkdMdWludCB0ZXh0dXJlSGFuZGxlOwppbnQgdW5pZm9ybUxvY2F0aW9uOwoKaW50IEluaXQgKCBFU0NvbnRleHQgKmVzQ29udGV4dCApCnsKCW0uU2V0SWRlbnRpdHkoKTsKCWdsQ2xlYXJDb2xvciAoIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYgKTsKCgkvL3RyaWFuZ2xlIGRhdGEgKGhlYXApCglWZXJ0ZXggdmVydGljZXNEYXRhWzNdOwoJCgl2ZXJ0aWNlc0RhdGFbMF0ucG9zLnggPSAgMC4wZjsgIHZlcnRpY2VzRGF0YVswXS5wb3MueSA9ICAwLjVmOyAgdmVydGljZXNEYXRhWzBdLnBvcy56ID0gIDAuMGY7Cgl2ZXJ0aWNlc0RhdGFbMF0uY29sb3IueCA9ICAwLjVmOyAgdmVydGljZXNEYXRhWzBdLmNvbG9yLnkgPSAgMC4wZjsgIHZlcnRpY2VzRGF0YVswXS5jb2xvci56ID0gIDAuMGY7Cgl2ZXJ0aWNlc0RhdGFbMF0udXYueCA9IDAuMGY7IC8vdQoJdmVydGljZXNEYXRhWzBdLnV2LnkgPSAwLjBmOyAvL3YKCgl2ZXJ0aWNlc0RhdGFbMV0ucG9zLnggPSAtMC41ZjsgIHZlcnRpY2VzRGF0YVsxXS5wb3MueSA9IC0wLjVmOyAgdmVydGljZXNEYXRhWzFdLnBvcy56ID0gIDAuMGY7Cgl2ZXJ0aWNlc0RhdGFbMV0uY29sb3IueCA9ICAwLjBmOyAgdmVydGljZXNEYXRhWzFdLmNvbG9yLnkgPSAgMC41ZjsgIHZlcnRpY2VzRGF0YVsxXS5jb2xvci56ID0gIDAuMGY7Cgl2ZXJ0aWNlc0RhdGFbMV0udXYueCA9IDAuNWY7Cgl2ZXJ0aWNlc0RhdGFbMV0udXYueSA9IDEuMGY7CgoJdmVydGljZXNEYXRhWzJdLnBvcy54ID0gIDAuNWY7ICB2ZXJ0aWNlc0RhdGFbMl0ucG9zLnkgPSAtMC41ZjsgIHZlcnRpY2VzRGF0YVsyXS5wb3MueiA9ICAwLjBmOwoJdmVydGljZXNEYXRhWzJdLmNvbG9yLnggPSAgMC4wZjsgIHZlcnRpY2VzRGF0YVsyXS5jb2xvci55ID0gIDAuMGY7ICB2ZXJ0aWNlc0RhdGFbMl0uY29sb3IueiA9ICAwLjVmOwoJdmVydGljZXNEYXRhWzJdLnV2LnggPSAxLjBmOwoJdmVydGljZXNEYXRhWzJdLnV2LnkgPSAwLjBmOwoJCQoKCS8vYnVmZmVyIG9iamVjdAoJZ2xHZW5CdWZmZXJzKDEsICZ2Ym9JZCk7IC8vYnVmZmVyIG9iamVjdCBuYW1lIGdlbmVyYXRpb24KCWdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIHZib0lkKTsgLy9idWZmZXIgb2JqZWN0IGJpbmRpbmcKCWdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIHNpemVvZih2ZXJ0aWNlc0RhdGEpLCB2ZXJ0aWNlc0RhdGEsIEdMX1NUQVRJQ19EUkFXKTsgLy9jcmVhdGlvbiBhbmQgaW5pdGlhbGl6aW9uIG9mIGJ1ZmZlciBvbmplY3Qgc3RvcmFnZQoJZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CgoJLy9jcmVhdGlvbiBvZiBzaGFkZXJzIGFuZCBwcm9ncmFtIAoJcmV0dXJuIG15U2hhZGVycy5Jbml0KCIuLi9SZXNvdXJjZXMvU2hhZGVycy9UcmlhbmdsZVNoYWRlclZTLnZzIiwgIi4uL1Jlc291cmNlcy9TaGFkZXJzL1RyaWFuZ2xlU2hhZGVyRlMuZnMiKTsKCn0Kdm9pZCBJbml0VGV4dHVyZSAoIGNoYXIgKmZpbGVwYXRoLCBjaGFyICogd3JhcG1vZGUpCnsKCQoJLy8gY3JlYXRlIHRoZSBPcGVuR0wgRVMgdGV4dHVyZSByZXNvdXJjZSBhbmQgZ2V0IHRoZSBoYW5kbGUgIAoJZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZUhhbmRsZSk7CgkvLyBiaW5kIHRoZSB0ZXh0dXJlIHRvIHRoZSAyRCB0ZXh0dXJlIHR5cGUgIAoJZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSGFuZGxlKTsKCS8vIGNyZWF0ZSBDUFUgYnVmZmVyIGFuZCBsb2FkIGl0IHdpdGggdGhlIGltYWdlIGRhdGEgCglpbnQgd2lkdGgsIGhlaWdodCwgYnBwOwoJY2hhciAqIGJ1ZmZlclRHQSA9IExvYWRUR0EoZmlsZXBhdGgsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApOwoJLy8gbG9hZCB0aGUgaW1hZ2UgZGF0YSBpbnRvIE9wZW5HTCBFUyB0ZXh0dXJlIHJlc291cmNlIAoJaWYgKGJwcCA9PSAyNCkgCgl7IC8vYnBwID0gYml0cyBwZXIgcGl4ZWwgKDgqbnVtYmVyIG9mIGNoYW5uZWxzLCBmb3IgUkdCQSA9IDgqND0zMikgCgkJZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgd2lkdGgsIGhlaWdodCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9CWVRFLCBidWZmZXJUR0EpOwoJfSAKCWVsc2UKCXsKCQlnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgYnVmZmVyVEdBKTsKCX0gIAoJLy8gZnJlZSB0aGUgY2xpZW50IG1lbW9yeSAgCglkZWxldGUgW10gYnVmZmVyVEdBOwoKCS8vc2V0IHRoZSBmaWx0ZXJzIGZvciBtaW5pZmljYXRpb24gYW5kIG1hZ25pZmljYXRpb24KCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSKTsKCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CgoJLy8gZ2VuZXJhdGUgdGhlIG1pcG1hcCBjaGFpbiAKCSBnbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOwoJCglpZiAod3JhcG1vZGUgPT0gIlJFUEVBVCIpIAoJewoJCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKCQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Cgl9IAoJCglpZiAod3JhcG1vZGUgPT0gIkNMQU1QX1RPX0VER0UiKQoJeyAKCQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwoJCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cgl9CgkKCXVuaWZvcm1Mb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG15U2hhZGVycy5wcm9ncmFtLCBmaWxlcGF0aCk7CgkKfQoKdm9pZCBEcmF3ICggRVNDb250ZXh0ICplc0NvbnRleHQgKQp7CglnbFVzZVByb2dyYW0obXlTaGFkZXJzLnByb2dyYW0pOwoJZ2xVbmlmb3JtTWF0cml4NGZ2KCBteVNoYWRlcnMubWF0cml4VHJhbnNmb3JtLCAxLCBmYWxzZSwgKEdMZmxvYXQgKikmbSApOwoJZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKCWdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIHZib0lkKTsKCglHTGZsb2F0KiBwdHIgPSAoR0xmbG9hdCAqKTA7IAoJaWYobXlTaGFkZXJzLnBvc2l0aW9uQXR0cmlidXRlICE9IC0xKSAvL2F0dHJpYnV0ZSBwYXNzaW5nIHRvIHNoYWRlciwgZm9yIHVuaWZvcm1zIHVzZSBnbFVuaWZvcm0xZih0aW1lLCBkZWx0YVQpOyBnbFVuaWZvcm1NYXRyaXg0ZnYoIG1fcFNoYWRlci0+bWF0cml4V1ZQLCAxLCBmYWxzZSwgKEdMZmxvYXQgKikmcm90YXRpb25NYXQgKTsKCXsKCQlnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG15U2hhZGVycy5wb3NpdGlvbkF0dHJpYnV0ZSk7CgkJZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG15U2hhZGVycy5wb3NpdGlvbkF0dHJpYnV0ZSwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLCBzaXplb2YoVmVydGV4KSwgcHRyKTsKCX0KCglpZihteVNoYWRlcnMuY29sb3JBdHRyaWJ1dGUgIT0gLTEpCgl7CgkJZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShteVNoYWRlcnMuY29sb3JBdHRyaWJ1dGUpOwoJCQoJCWdsVmVydGV4QXR0cmliUG9pbnRlcihteVNoYWRlcnMuY29sb3JBdHRyaWJ1dGUsIDMsIEdMX0ZMT0FULCBHTF9GQUxTRSwgc2l6ZW9mKFZlcnRleCksIHB0citDT0xPUik7Cgl9CgkKCWlmKG15U2hhZGVycy51dkF0dHJpYiAhPSAtMSkKCXsKCQlnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG15U2hhZGVycy51dkF0dHJpYik7CgkJCgkJZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG15U2hhZGVycy51dkF0dHJpYiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCBzaXplb2YoVmVydGV4KSwgcHRyK3V2Q09PUik7Cgl9CgkKCWdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDMpOwoJZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CgllZ2xTd2FwQnVmZmVycyAoIGVzQ29udGV4dC0+ZWdsRGlzcGxheSwgZXNDb250ZXh0LT5lZ2xTdXJmYWNlICk7CgoJdW5zaWduZWQgc2hvcnQgdGV4dHVyZVVuaXQgPSAwOwoJLy8gbWFrZSBhY3RpdmUgYSB0ZXh0dXJlIHVuaXQgCglnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyB0ZXh0dXJlVW5pdCk7CgkvLyBiaW5kIHRoZSB0ZXh0dXJlIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRleHR1cmUgdW5pdAoJZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSGFuZGxlKTsgCgkvLyBzZXQgdGhlIHVuaWZvcm0gc2FtcGxlcgoJZ2xVbmlmb3JtMWkodW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlSGFuZGxlKTsKCn0KCgp2b2lkIENsZWFuVXAoKQp7CglnbERlbGV0ZUJ1ZmZlcnMoMSwgJnZib0lkKTsKfQoKaW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCnsKCUVTQ29udGV4dCBlc0NvbnRleHQ7CgogICAgZXNJbml0Q29udGV4dCAoICZlc0NvbnRleHQgKTsKCQoJZXNDcmVhdGVXaW5kb3cgKCAmZXNDb250ZXh0LCAiSGVsbG8gVHJpYW5nbGUiLCBHbG9iYWxzOjpzY3JlZW5XaWR0aCwgR2xvYmFsczo6c2NyZWVuSGVpZ2h0LCBFU19XSU5ET1dfUkdCIHwgRVNfV0lORE9XX0RFUFRIKTsKCglpZiAoIEluaXQgKCAmZXNDb250ZXh0ICkgIT0gMCApCgkJcmV0dXJuIDA7CgoJCglJbml0VGV4dHVyZSgiLi4vUmVzb3VyY2VzL1RleHR1cmVzL1JvY2sudGdhIiwgICJSRVBFQVQiICk7CgoJZXNSZWdpc3RlckRyYXdGdW5jICggJmVzQ29udGV4dCwgRHJhdyApOwoJZXNNYWluTG9vcCAoICZlc0NvbnRleHQgKTsKCQoJLy9yZWxlYXNpbmcgT3BlbkdMIHJlc291cmNlcwoJQ2xlYW5VcCgpOwoKCS8vaWRlbnRpZnlpbmcgbWVtb3J5IGxlYWtzCglNZW1vcnlEdW1wKCk7CglwcmludGYoIlByZXNzIGFueSBrZXkuLi5cbiIpOwoJX2dldGNoKCk7CgoJcmV0dXJuIDA7Cn0=