void Draw ( AAContext *aaContext ) { UserData *userData = (UserData*) aaContext->userData; if(userData->animation->animating) UpdateAnimation(aaContext); MMatrix view; MViewingOrigin(&view, userData->eye); MMatrix mv; MMatrix model; MMultiply(&model, userData->sphere->modelT, userData->sphere->modelR); MMultiply(&mv, &view, &model); float aspect = 1.0; float fov = 90.0f; float n = 1.0; float f = 80.0; MMatrix perspective; MPerspective(&perspective, aspect, fov, n, f); MMatrix mvp; MMultiply(&mvp, &perspective, &mv); // Set the viewport glViewport ( 0, 0, aaContext->width, aaContext->height ); // Clear the color buffer glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Use the program object glUseProgram ( userData->programObject ); glUniformMatrix4fv(userData->mvpLoc,1, GL_FALSE, mvp.m[0]); glUniform1i(userData->texLoc, 0); glActiveTexture ( GL_TEXTURE0 ); glBindTexture ( GL_TEXTURE_2D, userData->earth_texture ); glVertexAttribPointer(userData->texCoordsLoc, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), userData->sphere->texCoords); glEnableVertexAttribArray ( userData->texCoordsLoc); glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), userData->sphere->vertices); glEnableVertexAttribArray ( userData->positionLoc); glDrawBuffer(GL_FRONT); glDrawElements ( GL_TRIANGLES, userData->sphere->numIndices, GL_UNSIGNED_INT, userData->sphere->indices); glFlush(); BOOL swap_success = SwapBuffers(aaContext->display); }
GLuint SetupGraphics(struct engine * engine){ const char vShader[] = "attribute vec3 vPosition; \n" "attribute vec3 vColor; \n" "varying vec4 Color; \n" "uniform mat4 uMVMatrix; \n" "uniform mat4 uPMatrix; \n" "void main(void) { \n" " gl_Position = uPMatrix * uMVMatrix * vec4(vPosition, 1.0); \n" " Color = vec4( vColor, 1.0); \n" "} \n"; const char fShader[] = "precision mediump float; \n" "varying vec4 Color; \n" "void main() { \n" " gl_FragColor = Color; \n" "} \n"; LOGI("Init Graphics"); printGLString("Version", GL_VERSION); printGLString("Vendor", GL_VENDOR); printGLString("Renderer", GL_RENDERER); printGLString("Extensions", GL_EXTENSIONS); LOGI("setupGraphics(%d, %d)", engine->Scr.width, engine->Scr.height); engine->GLData.pObject = CreateGLProgram(vShader, fShader); if(!engine->GLData.pObject) { LOGE("Could not create program."); return 0; } engine->GLData.gPositionAttribute = glGetAttribLocation( engine->GLData.pObject, "vPosition"); checkGlError("glGetAttribLocation"); LOGI("glGetAttribLocation(\"vPosition\") = %d\n", engine->GLData.gPositionAttribute); glEnableVertexAttribArray(engine->GLData.gPositionAttribute); checkGlError("glenableVertexAttribArray"); engine->GLData.gColorsAttribute = glGetAttribLocation( engine->GLData.pObject, "vColor"); checkGlError("glGetAttribLocation"); LOGI("glGetAttribLocation(\"vColor\") = %d\n", engine->GLData.gColorsAttribute); glEnableVertexAttribArray(engine->GLData.gColorsAttribute); checkGlError("glenableVertexAttribArray"); LOGI("Get Uniform Locations"); engine->GLData.p_Matrix = glGetUniformLocation(engine->GLData.pObject, "uPMatrix"); checkGlError("glgetUniformLocation uPMatrix"); engine->GLData.u_Matrix = glGetUniformLocation(engine->GLData.pObject, "uMVMatrix"); checkGlError("glgetUniformLocation uMVMatrix"); LOGI("Uniform modelview at %d\n", engine->GLData.u_Matrix); LOGI("Uniform Projection at %d\n", engine->GLData.p_Matrix); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glDepthMask( GL_TRUE ); glClearDepthf(1.0f); // Load identities LoadIdentity( engine->Matrices.cMatrix); LoadIdentity( engine->Matrices.pMatrix); //~ 1280×800 1.6 //~ 1280x960 1.3333 //~ 1280x1024 1.25 MPerspective( engine->Matrices.pMatrix, 1.25, 1.0f, 1000.0f); glViewport(0, 0, engine->Scr.width, engine->Scr.height); checkGlError("glViewport"); GLfloat _Pose[] = { 0.0, 0.1, 0.0}; GLfloat _View[] = { 0.0, 0.0, 5.0}; GLfloat _UpVx[] = { 0.0, 1.0, 0.0}; LookAtM( engine->Matrices.cMatrix, _Pose, _View, _UpVx); return 1; }