nuclear@0: #import "ES2Renderer.h" nuclear@0: #include "istereo.h" nuclear@0: nuclear@0: @implementation ES2Renderer nuclear@0: nuclear@0: // Create an OpenGL ES 2.0 context nuclear@0: - (id)init nuclear@0: { nuclear@0: if ((self = [super init])) nuclear@0: { nuclear@0: context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 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: glGenFramebuffers(1, &defaultFramebuffer); nuclear@0: glGenRenderbuffers(1, &colorRenderbuffer); nuclear@0: glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); nuclear@0: glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); nuclear@0: glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); nuclear@12: nuclear@0: init(); nuclear@0: } nuclear@0: nuclear@0: return self; nuclear@0: } nuclear@0: nuclear@0: - (void)render nuclear@0: { nuclear@0: redraw(); 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: //glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); nuclear@0: //glViewport(0, 0, backingWidth, backingHeight); nuclear@0: nuclear@0: // This call is redundant, but needed if dealing with multiple renderbuffers. nuclear@0: //glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); nuclear@0: [context presentRenderbuffer:GL_RENDERBUFFER]; 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: glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); nuclear@0: [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; nuclear@0: glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); nuclear@0: glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); nuclear@0: nuclear@0: if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) nuclear@0: { nuclear@0: NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); nuclear@0: return NO; nuclear@0: } nuclear@0: nuclear@13: reshape(backingWidth, backingHeight); nuclear@12: 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: glDeleteFramebuffers(1, &defaultFramebuffer); nuclear@0: defaultFramebuffer = 0; nuclear@0: } nuclear@0: nuclear@0: if (colorRenderbuffer) nuclear@0: { nuclear@0: glDeleteRenderbuffers(1, &colorRenderbuffer); nuclear@0: colorRenderbuffer = 0; nuclear@0: } nuclear@0: nuclear@0: if (program) nuclear@0: { nuclear@0: glDeleteProgram(program); nuclear@0: program = 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