nuclear@30: #include 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@30: glGenFramebuffers(1, &fbo); nuclear@30: glBindFramebuffer(GL_FRAMEBUFFER, fbo); nuclear@30: nuclear@30: glGenRenderbuffers(1, &rbuf_color); nuclear@30: glBindRenderbuffer(GL_RENDERBUFFER, rbuf_color); nuclear@30: glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbuf_color); nuclear@30: nuclear@30: glGenRenderbuffers(1, &rbuf_depth); nuclear@30: glBindRenderbuffer(GL_RENDERBUFFER, rbuf_depth); nuclear@30: glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_depth); nuclear@30: assert(glGetError() == GL_NO_ERROR); 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@30: //glBindFramebuffer(GL_FRAMEBUFFER, fbo); nuclear@30: //glViewport(0, 0, xsz, ysz); nuclear@0: nuclear@0: // This call is redundant, but needed if dealing with multiple renderbuffers. nuclear@30: glBindRenderbuffer(GL_RENDERBUFFER, rbuf_color); 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@30: glBindRenderbuffer(GL_RENDERBUFFER, rbuf_color); nuclear@0: [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; nuclear@30: glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &xsz); nuclear@30: glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &ysz); nuclear@30: nuclear@30: glBindRenderbuffer(GL_RENDERBUFFER, rbuf_depth); nuclear@30: glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, xsz, ysz); 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@30: assert(glGetError() == GL_NO_ERROR); nuclear@0: nuclear@30: reshape(xsz, ysz); nuclear@12: nuclear@0: return YES; nuclear@0: } nuclear@0: nuclear@30: nuclear@0: - (void)dealloc nuclear@0: { nuclear@0: // Tear down GL nuclear@30: if (fbo) nuclear@0: { nuclear@30: glDeleteFramebuffers(1, &fbo); nuclear@30: fbo = 0; nuclear@0: } nuclear@0: nuclear@30: if (rbuf_color) nuclear@0: { nuclear@30: glDeleteRenderbuffers(1, &rbuf_color); nuclear@30: rbuf_color = 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