Advertisement
Guest User

MachCUBED

a guest
Feb 18th, 2011
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #import "ES2Renderer.h"
  3.  
  4. float min(float a, float b)
  5. {
  6.     return a<b?a:b;
  7. }
  8. float sign(float a)
  9. {
  10.     return a<0?-1:1;
  11. }
  12.  
  13. @interface ES2Renderer ()
  14. //these next 3 vars should really be tied to the state that we get bound to.  Since we only have
  15. //one set of these for now, there is a white flash when changing between two GLESGameStates.
  16. GLuint                  gles_framebuffer;
  17. GLuint                  gles_renderbuffer;
  18. CGSize                  _size;
  19.  
  20. - (BOOL) loadShaders;
  21. - (BOOL) compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
  22. - (BOOL) linkProgram:(GLuint)prog;
  23. - (BOOL) validateProgram:(GLuint)prog;
  24. @end
  25.  
  26. @implementation ES2Renderer
  27.  
  28.  
  29. #pragma mark -
  30. #pragma mark Helper Methods
  31.  
  32. -(void)setupBuffers
  33. {
  34.     // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
  35.     //Also create depth buffer and color buffer
  36.     glGenFramebuffers(1, &defaultFramebuffer);
  37.     glGenRenderbuffers(1, &colorRenderbuffer);
  38.     glGenRenderbuffers(1, &depthRenderbuffer);
  39.    
  40.     //Bind buffers to targets
  41.     glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
  42.     glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
  43.     glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
  44.    
  45.     //Bind color and depth framebuffers to the renderbuffer as logic buffer
  46.     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
  47.     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
  48. }
  49.  
  50. -(void)setupViewport
  51. {
  52.     glViewport(0, 0, backingWidth, backingHeight)
  53. }
  54.  
  55. -(void)setupWorld
  56. {
  57.     NSLog(@"This is a model class.  Use a subclass to render game environments.");
  58. }
  59.  
  60. #pragma mark Shader Setup Methods
  61.  
  62. - (BOOL) compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file
  63. {
  64.     GLint status;
  65.     const GLchar *source;
  66.    
  67.     source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];
  68.     if (!source)
  69.     {
  70.         NSLog(@"Failed to load vertex shader");
  71.         return FALSE;
  72.     }
  73.    
  74.     *shader = glCreateShader(type);
  75.     glShaderSource(*shader, 1, &source, NULL);
  76.     glCompileShader(*shader);
  77.    
  78. #if defined(DEBUG)
  79.     GLint logLength;
  80.     glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
  81.     if (logLength > 0)
  82.     {
  83.         GLchar *log = (GLchar *)malloc(logLength);
  84.         glGetShaderInfoLog(*shader, logLength, &logLength, log);
  85.         NSLog(@"Shader compile log:\n%s", log);
  86.         free(log);
  87.     }
  88. #endif
  89.    
  90.     glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
  91.     if (status == 0)
  92.     {
  93.         glDeleteShader(*shader);
  94.         return FALSE;
  95.     }
  96.    
  97.     return TRUE;
  98. }
  99.  
  100. - (BOOL) linkProgram:(GLuint)prog
  101. {
  102.     GLint status;
  103.    
  104.     glLinkProgram(prog);
  105.    
  106. #if defined(DEBUG)
  107.     GLint logLength;
  108.     glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
  109.     if (logLength > 0)
  110.     {
  111.         GLchar *log = (GLchar *)malloc(logLength);
  112.         glGetProgramInfoLog(prog, logLength, &logLength, log);
  113.         NSLog(@"Program link log:\n%s", log);
  114.         free(log);
  115.     }
  116. #endif
  117.    
  118.     glGetProgramiv(prog, GL_LINK_STATUS, &status);
  119.     if (status == 0)
  120.         return FALSE;
  121.    
  122.     return TRUE;
  123. }
  124.  
  125. - (BOOL) validateProgram:(GLuint)prog
  126. {
  127.     GLint logLength, status;
  128.    
  129.     glValidateProgram(prog);
  130.     glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
  131.     if (logLength > 0)
  132.     {
  133.         GLchar *log = (GLchar *)malloc(logLength);
  134.         glGetProgramInfoLog(prog, logLength, &logLength, log);
  135.         NSLog(@"Program validate log:\n%s", log);
  136.         free(log);
  137.     }
  138.    
  139.     glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
  140.     if (status == 0)
  141.         return FALSE;
  142.    
  143.     return TRUE;
  144. }
  145.  
  146. - (BOOL) loadShaders
  147. {
  148.     GLuint vertShader, fragShader;
  149.     NSString *vertShaderPathname, *fragShaderPathname;
  150.    
  151.     // create shader program
  152.     program = glCreateProgram();
  153.    
  154.     // create and compile vertex shader
  155.     vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];
  156.     if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname])
  157.     {
  158.         NSLog(@"Failed to compile vertex shader");
  159.         return FALSE;
  160.     }
  161.    
  162.     // create and compile fragment shader
  163.     fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
  164.     if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname])
  165.     {
  166.         NSLog(@"Failed to compile fragment shader");
  167.         return FALSE;
  168.     }
  169.    
  170.     // attach vertex shader to program
  171.     glAttachShader(program, vertShader);
  172.    
  173.     // attach fragment shader to program
  174.     glAttachShader(program, fragShader);
  175.    
  176.     // bind attribute locations
  177.     // this needs to be done prior to linking
  178.     glBindAttribLocation(program, ATTRIB_VERTEX, "position");
  179.     glBindAttribLocation(program, ATTRIB_COLOR, "color");
  180.    
  181.     // link program
  182.     if (![self linkProgram:program])
  183.     {
  184.         NSLog(@"Failed to link program: %d", program);
  185.         return FALSE;
  186.     }
  187.    
  188.     // get uniform locations
  189.     uniforms[UNIFORM_TRANSLATE] = glGetUniformLocation(program, "translate");
  190.    
  191.     // ADDED DEPTH BEGIN
  192.     uniforms[UNIFORM_DEPTH] = glGetUniformLocation(program, "depth");
  193.     uniforms[UNIFORM_SIDE] = glGetUniformLocation(program, "side");
  194.     // ADDED DEPTH END
  195.    
  196.     // release vertex and fragment shaders
  197.     if (vertShader)
  198.         glDeleteShader(vertShader);
  199.     if (fragShader)
  200.         glDeleteShader(fragShader);
  201.    
  202.     return TRUE;
  203. }
  204.  
  205. #pragma mark -
  206. #pragma mark Initialization
  207.  
  208.  
  209. // Create an ES 2.0 context
  210. - (id) init
  211. {
  212.     if (self = [super init])
  213.     {
  214.         context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
  215.        
  216.         if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders])
  217.         {
  218.             [self release];
  219.             return nil;
  220.         }
  221.        
  222.         [self setupBuffers];
  223.         [self setupViewport];
  224.         [self setupWorld];
  225.     }
  226.    
  227.     return self;
  228. }
  229.  
  230.  
  231. #pragma mark -
  232. #pragma mark Graphics Methods
  233.  
  234.  
  235. - (void) render
  236. {
  237.     // Replace the implementation of this method to do your own custom drawing
  238.    
  239.     static const GLfloat squareVertices[] = {
  240.         -0.5f, -0.33f,
  241.         0.5f, -0.33f,
  242.         -0.5f,  0.33f,
  243.         0.5f,  0.33f,
  244.     };
  245.    
  246.     static const GLubyte squareColors[] = {
  247.         255, 255,   0, 255,
  248.         0,   255, 255, 255,
  249.         0,     0,   0,   0,
  250.         255,   0, 255, 255,
  251.     };
  252.    
  253.     static float transY = 0.0f;
  254.    
  255.     // This application only creates a single context which is already set current at this point.
  256.     // This call is redundant, but needed if dealing with multiple contexts.
  257.     [EAGLContext setCurrentContext:context];
  258.    
  259.     // This application only creates a single default framebuffer which is already bound at this point.
  260.     // This call is redundant, but needed if dealing with multiple framebuffers.
  261.     glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
  262.     glViewport(0, 0, backingWidth, backingHeight);
  263.    
  264.     // ADDED DEPTH BEGIN
  265.     glEnable(GL_DEPTH_TEST);
  266.     // ADDED DEPTH END
  267.    
  268.     glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
  269.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  270.     // ADDED DEPTH -------------^^^^^^^^^^^^^^^^^^^^^
  271.    
  272.     // Use shader program
  273.     glUseProgram(program);
  274.    
  275.     // Update uniform value
  276.     glUniform1f(uniforms[UNIFORM_TRANSLATE], (GLfloat)transY);
  277.     transY += 0.075f;  
  278.    
  279.     // Update attribute values
  280.     glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
  281.     glEnableVertexAttribArray(ATTRIB_VERTEX);
  282.     glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors);
  283.     glEnableVertexAttribArray(ATTRIB_COLOR);
  284.    
  285.     // Validate program before drawing. This is a good check, but only really necessary in a debug build.
  286.     // DEBUG macro must be defined in your debug configurations if that's not already the case.
  287. #if defined(DEBUG)
  288.     if (![self validateProgram:program])
  289.     {
  290.         NSLog(@"Failed to validate program: %d", program);
  291.         return;
  292.     }
  293. #endif
  294.    
  295.     // Draw
  296.     // ADDED DEPTH BEGIN
  297.     glUniform1f(uniforms[UNIFORM_DEPTH], (GLfloat)-0.01);
  298.     glUniform1f(uniforms[UNIFORM_SIDE], (GLfloat)-0.5);
  299.    
  300.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  301.    
  302.     glUniform1f(uniforms[UNIFORM_DEPTH], (GLfloat)0.0);
  303.     glUniform1f(uniforms[UNIFORM_SIDE], (GLfloat)0.0);
  304.    
  305.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  306.    
  307.     glUniform1f(uniforms[UNIFORM_DEPTH], (GLfloat)0.1);
  308.     glUniform1f(uniforms[UNIFORM_SIDE], (GLfloat)0.5);
  309.     // ADDED DEPTH END
  310.    
  311.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  312.    
  313.     // This application only creates a single color renderbuffer which is already bound at this point.
  314.     // This call is redundant, but needed if dealing with multiple renderbuffers.
  315.     glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
  316.     [context presentRenderbuffer:GL_RENDERBUFFER];
  317. }
  318.  
  319. - (BOOL) resizeFromLayer:(CAEAGLLayer *)layer
  320. {
  321.     // Allocate color buffer backing based on the current layer size
  322.     glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
  323.     [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];
  324.     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
  325.     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
  326.     glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
  327.     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
  328.    
  329.     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  330.     {
  331.         NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
  332.         return NO;
  333.     }
  334.    
  335.     return YES;
  336. }
  337.  
  338. /*
  339. //finish opengl calls and send the results to the screen.  should be
  340. //called to end the rendering of a frame.
  341. - (void) swapBuffers
  342. {
  343.     EAGLContext *oldContext = [EAGLContext currentContext];
  344.     GLuint oldRenderbuffer;
  345.    
  346.     if(oldContext != context)
  347.         [EAGLContext setCurrentContext:context];
  348.    
  349.     glGetIntegerv(GL_RENDERBUFFER_BINDING, (GLint *) &oldRenderbuffer);
  350.     glBindRenderbuffer(GL_RENDERBUFFER, gles_renderbuffer);
  351.    
  352.     NSLog(@"oldrenderbuffer %d, renderbuffer %d", oldRenderbuffer, gles_renderbuffer);
  353.    
  354.     glFinish();
  355.    
  356.     if(![context presentRenderbuffer:GL_RENDERBUFFER])
  357.         printf("Failed to swap renderbuffer in %s\n", __FUNCTION__);
  358.    
  359. }
  360.  */
  361.  
  362. #pragma mark -
  363. #pragma mark Memory Management
  364.  
  365.  
  366. - (void) dealloc
  367. {
  368.     // Tear down GL
  369.     if (defaultFramebuffer)
  370.     {
  371.         glDeleteFramebuffers(1, &defaultFramebuffer);
  372.         defaultFramebuffer = 0;
  373.     }
  374.    
  375.     if (colorRenderbuffer)
  376.     {
  377.         glDeleteRenderbuffers(1, &colorRenderbuffer);
  378.         colorRenderbuffer = 0;
  379.     }
  380.    
  381.     // ADDED DEPTH BEGIN
  382.     if (depthRenderbuffer)
  383.     {
  384.         glDeleteRenderbuffers(1, &depthRenderbuffer);
  385.         depthRenderbuffer = 0;
  386.     }
  387.     // ADDED DEPTH END
  388.    
  389.     if (program)
  390.     {
  391.         glDeleteProgram(program);
  392.         program = 0;
  393.     }
  394.    
  395.     // Tear down context
  396.     if ([EAGLContext currentContext] == context)
  397.         [EAGLContext setCurrentContext:nil];
  398.    
  399.     [context release];
  400.     context = nil;
  401.    
  402.     [super dealloc];
  403. }
  404.  
  405. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement