| /****************************************************************************** | |
| @File OGLESBasicTnL.cpp | |
| @Title Shows basic transformations and lighting | |
| @Version | |
| @Copyright Copyright (c) Imagination Technologies Limited. | |
| @Platform Independant | |
| @Description Shows basic transformations and lighting | |
| ******************************************************************************/ | |
| #include "PVRShell.h" | |
| #include <math.h> | |
| #if defined(__APPLE__) && defined (TARGET_OS_IPHONE) | |
| #import <OpenGLES/ES1/gl.h> | |
| #import <OpenGLES/ES1/glext.h> | |
| #else | |
| #include <GLES/gl.h> | |
| #endif | |
| /****************************************************************************** | |
| Defines | |
| ******************************************************************************/ | |
| // Size of the texture we create | |
| const int g_i32TexSize = 128; | |
| /*!**************************************************************************** | |
| Class implementing the PVRShell functions. | |
| ******************************************************************************/ | |
| class OGLESBasicTnL : public PVRShell | |
| { | |
| // Texture handle | |
| GLuint m_ui32Texture; | |
| // Angle to rotate the triangle | |
| float m_fAngle; | |
| // Vertex Buffer Object (VBO) handle | |
| GLuint m_ui32Vbo; | |
| public: | |
| virtual bool InitApplication(); | |
| virtual bool InitView(); | |
| virtual bool ReleaseView(); | |
| virtual bool QuitApplication(); | |
| virtual bool RenderScene(); | |
| }; | |
| /*!**************************************************************************** | |
| @Function InitApplication | |
| @Return bool true if no error occured | |
| @Description Code in InitApplication() will be called by PVRShell once per | |
| run, before the rendering context is created. | |
| Used to initialize variables that are not dependant on it | |
| (e.g. external modules, loading meshes, etc.) | |
| If the rendering context is lost, InitApplication() will | |
| not be called again. | |
| ******************************************************************************/ | |
| bool OGLESBasicTnL::InitApplication() | |
| { | |
| m_fAngle = 0; | |
| return true; | |
| } | |
| /*!**************************************************************************** | |
| @Function QuitApplication | |
| @Return bool true if no error occured | |
| @Description Code in QuitApplication() will be called by PVRShell once per | |
| run, just before exiting the program. | |
| If the rendering context is lost, QuitApplication() will | |
| not be called. | |
| ******************************************************************************/ | |
| bool OGLESBasicTnL::QuitApplication() | |
| { | |
| return true; | |
| } | |
| /*!**************************************************************************** | |
| @Function InitView | |
| @Return bool true if no error occured | |
| @Description Code in InitView() will be called by PVRShell upon | |
| initialization or after a change in the rendering context. | |
| Used to initialize variables that are dependant on the rendering | |
| context (e.g. textures, vertex buffers, etc.) | |
| ******************************************************************************/ | |
| bool OGLESBasicTnL::InitView() | |
| { | |
| // Sets the clear color | |
| glClearColor(0.6f, 0.8f, 1.0f, 1.0f); | |
| // Enables texturing | |
| glEnable(GL_TEXTURE_2D); | |
| /* | |
| Creates the texture. | |
| Please refer to the training course "Texturing" for a detailed explanation. | |
| */ | |
| glGenTextures(1, &m_ui32Texture); | |
| glBindTexture(GL_TEXTURE_2D, m_ui32Texture); | |
| GLuint* pTexData = new GLuint[g_i32TexSize*g_i32TexSize]; | |
| for(int i = 0; i < g_i32TexSize; ++i) | |
| { | |
| for(int j = 0; j < g_i32TexSize; ++j) | |
| { | |
| GLuint col = (255<<24) + ((255-j*2)<<16) + ((255-i)<<8) + (255-i*2); | |
| if ( ((i*j)/8) % 2 ) | |
| col = 0xffff00ff; | |
| pTexData[j*g_i32TexSize+i] = col; | |
| } | |
| } | |
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g_i32TexSize, g_i32TexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData); | |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); | |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); | |
| delete[] pTexData; | |
| // Enables lighting and light 0 | |
| glEnable(GL_LIGHTING); | |
| glEnable(GL_LIGHT0); | |
| /* | |
| Specifies the light direction. | |
| If the 4th component is 0, it's a parallel light (the case here). | |
| If the 4th component is not 0, it's a point light. | |
| */ | |
| float aLightPosition[] = {0.0f,0.0f,1.0f,0.0f}; | |
| /* | |
| Assigns the light direction to the light number 0. | |
| This function allows you to set also the ambiant, diffuse, | |
| specular, emission colors of the light as well as attenuation parameters. | |
| We keep the other parameters to their default value in this demo. | |
| */ | |
| glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, aLightPosition); | |
| // Create VBO for the triangle from our data | |
| // Interleaved vertex data | |
| float afVertices[] = { -0.4f,-0.4f,0.0f, // Position | |
| 0.0f,0.0f, // UV | |
| 0,0,1, // Normal | |
| 0.4f,-0.4f,0.0f, | |
| 1.0f,0.0f, | |
| 0,0,1, | |
| 0.0f,0.4f,0.0f, | |
| 0.5f,1.0f, | |
| 0,0,1}; | |
| glGenBuffers(1, &m_ui32Vbo); | |
| unsigned int uiSize = 3 * (sizeof(float) * 8); // 3 vertices * stride (8 verttypes per vertex) | |
| // Bind the VBO | |
| glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo); | |
| // Set the buffer's data | |
| glBufferData(GL_ARRAY_BUFFER, uiSize, afVertices, GL_STATIC_DRAW); | |
| // Unbind the VBO | |
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |
| return true; | |
| } | |
| /*!**************************************************************************** | |
| @Function ReleaseView | |
| @Return bool true if no error occured | |
| @Description Code in ReleaseView() will be called by PVRShell when the | |
| application quits or before a change in the rendering context. | |
| ******************************************************************************/ | |
| bool OGLESBasicTnL::ReleaseView() | |
| { | |
| // Frees the texture | |
| glDeleteTextures(1, &m_ui32Texture); | |
| return true; | |
| } | |
| /*!**************************************************************************** | |
| @Function RenderScene | |
| @Return bool true if no error occured | |
| @Description Main rendering loop function of the program. The shell will | |
| call this function every frame. | |
| eglSwapBuffers() will be performed by PVRShell automatically. | |
| PVRShell will also manage important OS events. | |
| Will also manage relevent OS events. The user has access to | |
| these events through an abstraction layer provided by PVRShell. | |
| ******************************************************************************/ | |
| bool OGLESBasicTnL::RenderScene() | |
| { | |
| // Clears the color and depth buffer | |
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
| // Model view matrix | |
| float aModelView[] = | |
| { | |
| (float)cos(m_fAngle), 0, (float)sin(m_fAngle), 0, | |
| 0, 1, 0, 0, | |
| -(float)sin(m_fAngle), 0, (float)cos(m_fAngle), 0, | |
| 0, 0, 0, 1 | |
| }; | |
| // Sets the matrix mode to modify the Model View matrix | |
| glMatrixMode(GL_MODELVIEW); | |
| // Loads our matrix into OpenGL Model View matrix | |
| glLoadMatrixf(aModelView); | |
| // Increments the angle of the view | |
| m_fAngle += .02f; | |
| /* | |
| Draw a triangle. | |
| Please refer to the training course IntroducingPVRShell for a detailed explanation. | |
| */ | |
| // bind the VBO for the triangle | |
| glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo); | |
| glEnableClientState(GL_VERTEX_ARRAY); | |
| glVertexPointer(3,GL_FLOAT,sizeof(float) * 8, 0); | |
| // Pass the texture coordinates data | |
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |
| glTexCoordPointer(2,GL_FLOAT,sizeof(float) * 8, (unsigned char*) (sizeof(float) * 3)); | |
| // Pass the normals data | |
| glEnableClientState(GL_NORMAL_ARRAY); | |
| glNormalPointer(GL_FLOAT,sizeof(float) * 8, (unsigned char*) (sizeof(float) * 5)); | |
| // Draws a non-indexed triangle array | |
| glDrawArrays(GL_TRIANGLES, 0, 3); | |
| // unbind the vertex buffer as we don't need it bound anymore | |
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |
| return true; | |
| } | |
| /*!**************************************************************************** | |
| @Function NewDemo | |
| @Return PVRShell* The demo supplied by the user | |
| @Description This function must be implemented by the user of the shell. | |
| The user should return its PVRShell object defining the | |
| behaviour of the application. | |
| ******************************************************************************/ | |
| PVRShell* NewDemo() | |
| { | |
| return new OGLESBasicTnL(); | |
| } | |
| /****************************************************************************** | |
| End of file (OGLESBasicTnL.cpp) | |
| ******************************************************************************/ | |