nuclear@0: // nuclear@0: // ES1Renderer.m nuclear@0: // istereo nuclear@0: // nuclear@0: // Created by nuclear on 9/6/11. nuclear@0: // Copyright __MyCompanyName__ 2011. All rights reserved. nuclear@0: // nuclear@0: nuclear@0: #import "ES1Renderer.h" nuclear@0: nuclear@0: @implementation ES1Renderer nuclear@0: nuclear@0: // Create an OpenGL ES 1.1 context nuclear@0: - (id)init nuclear@0: { nuclear@0: if ((self = [super init])) nuclear@0: { nuclear@0: context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; nuclear@0: nuclear@0: if (!context || ![EAGLContext setCurrentContext:context]) nuclear@0: { nuclear@0: [self release]; nuclear@0: return nil; nuclear@0: } nuclear@0: nuclear@0: // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer nuclear@0: glGenFramebuffersOES(1, &defaultFramebuffer); nuclear@0: glGenRenderbuffersOES(1, &colorRenderbuffer); nuclear@0: glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); nuclear@0: glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); nuclear@0: glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); nuclear@0: } nuclear@0: nuclear@0: return self; nuclear@0: } nuclear@0: nuclear@0: - (void)render nuclear@0: { nuclear@0: // Replace the implementation of this method to do your own custom drawing nuclear@0: nuclear@0: static const GLfloat squareVertices[] = { nuclear@0: -0.5f, -0.33f, nuclear@0: 0.5f, -0.33f, nuclear@0: -0.5f, 0.33f, nuclear@0: 0.5f, 0.33f, nuclear@0: }; nuclear@0: nuclear@0: static const GLubyte squareColors[] = { nuclear@0: 255, 255, 0, 255, nuclear@0: 0, 255, 255, 255, nuclear@0: 0, 0, 0, 0, nuclear@0: 255, 0, 255, 255, nuclear@0: }; nuclear@0: nuclear@0: static float transY = 0.0f; nuclear@0: nuclear@0: // This application only creates a single context which is already set current at this point. nuclear@0: // This call is redundant, but needed if dealing with multiple contexts. nuclear@0: [EAGLContext setCurrentContext:context]; nuclear@0: nuclear@0: // This application only creates a single default framebuffer which is already bound at this point. nuclear@0: // This call is redundant, but needed if dealing with multiple framebuffers. nuclear@0: glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); nuclear@0: glViewport(0, 0, backingWidth, backingHeight); nuclear@0: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glLoadIdentity(); nuclear@0: glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); nuclear@0: transY += 0.075f; nuclear@0: nuclear@0: glClearColor(0.5f, 0.5f, 0.5f, 1.0f); nuclear@0: glClear(GL_COLOR_BUFFER_BIT); nuclear@0: nuclear@0: glVertexPointer(2, GL_FLOAT, 0, squareVertices); nuclear@0: glEnableClientState(GL_VERTEX_ARRAY); nuclear@0: glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); nuclear@0: glEnableClientState(GL_COLOR_ARRAY); nuclear@0: nuclear@0: glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); nuclear@0: nuclear@0: // This application only creates a single color renderbuffer which is already bound at this point. nuclear@0: // This call is redundant, but needed if dealing with multiple renderbuffers. nuclear@0: glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); nuclear@0: [context presentRenderbuffer:GL_RENDERBUFFER_OES]; nuclear@0: } nuclear@0: nuclear@0: - (BOOL)resizeFromLayer:(CAEAGLLayer *)layer nuclear@0: { nuclear@0: // Allocate color buffer backing based on the current layer size nuclear@0: glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); nuclear@0: [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer]; nuclear@0: glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); nuclear@0: glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); nuclear@0: nuclear@0: if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) nuclear@0: { nuclear@0: NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); nuclear@0: return NO; nuclear@0: } nuclear@0: nuclear@0: return YES; nuclear@0: } nuclear@0: nuclear@0: - (void)dealloc nuclear@0: { nuclear@0: // Tear down GL nuclear@0: if (defaultFramebuffer) nuclear@0: { nuclear@0: glDeleteFramebuffersOES(1, &defaultFramebuffer); nuclear@0: defaultFramebuffer = 0; nuclear@0: } nuclear@0: nuclear@0: if (colorRenderbuffer) nuclear@0: { nuclear@0: glDeleteRenderbuffersOES(1, &colorRenderbuffer); nuclear@0: colorRenderbuffer = 0; nuclear@0: } nuclear@0: nuclear@0: // Tear down context nuclear@0: if ([EAGLContext currentContext] == context) nuclear@0: [EAGLContext setCurrentContext:nil]; nuclear@0: nuclear@0: [context release]; nuclear@0: context = nil; nuclear@0: nuclear@0: [super dealloc]; nuclear@0: } nuclear@0: nuclear@0: @end