Advertisement
Guest User

Untitled

a guest
Jun 9th, 2012
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  ViewController.m
  3. //  OrthoTest
  4. //
  5. //
  6.  
  7. #import "ViewController.h"
  8.  
  9. #define BUFFER_OFFSET(i) ((char *)NULL + (i))
  10.  
  11. // Uniform index.
  12. enum
  13. {
  14.     UNIFORM_MODELVIEWPROJECTION_MATRIX,
  15.     UNIFORM_NORMAL_MATRIX,
  16.     NUM_UNIFORMS
  17. };
  18. GLint uniforms[NUM_UNIFORMS];
  19.  
  20. // Attribute index.
  21. enum
  22. {
  23.     ATTRIB_VERTEX,
  24.     NUM_ATTRIBUTES
  25. };
  26. GLint attributes[NUM_ATTRIBUTES];
  27.  
  28.  
  29.  
  30.  
  31. GLKVector2 vertices[4];
  32. GLushort indices[6];
  33.  
  34.  
  35. @interface ViewController () {
  36.     GLuint _program;
  37.    
  38.     GLKMatrix4 _modelViewProjectionMatrix;
  39.    
  40.     GLuint _vertexBuffer;
  41.     GLuint _indexBuffer;
  42. }
  43. @property (strong, nonatomic) EAGLContext *context;
  44. @property (strong, nonatomic) GLKBaseEffect *effect;
  45.  
  46. - (void)setupGL;
  47. - (void)tearDownGL;
  48.  
  49. - (BOOL)loadShaders;
  50. - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
  51. - (BOOL)linkProgram:(GLuint)prog;
  52. - (BOOL)validateProgram:(GLuint)prog;
  53. @end
  54.  
  55. @implementation ViewController
  56.  
  57. @synthesize context = _context;
  58. @synthesize effect = _effect;
  59.  
  60. - (void)dealloc
  61. {
  62.     [_context release];
  63.     [_effect release];
  64.     [super dealloc];
  65. }
  66.  
  67. - (void)viewDidLoad
  68. {
  69.     [super viewDidLoad];
  70.    
  71.     self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
  72.  
  73.     if (!self.context) {
  74.         NSLog(@"Failed to create ES context");
  75.     }
  76.    
  77.     GLKView *view = (GLKView *)self.view;
  78.     view.context = self.context;
  79.    
  80.     [self setupGL];
  81. }
  82.  
  83. - (void)viewDidUnload
  84. {    
  85.     [super viewDidUnload];
  86.    
  87.     [self tearDownGL];
  88.    
  89.     if ([EAGLContext currentContext] == self.context) {
  90.         [EAGLContext setCurrentContext:nil];
  91.     }
  92.     self.context = nil;
  93. }
  94.  
  95. - (void)didReceiveMemoryWarning
  96. {
  97.     [super didReceiveMemoryWarning];
  98.     // Release any cached data, images, etc. that aren't in use.
  99. }
  100.  
  101. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  102. {
  103.     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
  104.         return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  105.     } else {
  106.         return YES;
  107.     }
  108. }
  109.  
  110. - (void)setupGL
  111. {
  112.     [EAGLContext setCurrentContext:self.context];
  113.    
  114.     [self loadShaders];
  115.    
  116.     float width = 2;
  117.     float height = 2;
  118.     vertices[0] = GLKVector2Make(-width/2.0, -height/2.0);
  119.     vertices[1] = GLKVector2Make( width/2.0, -height/2.0);
  120.     vertices[2] = GLKVector2Make( width/2.0,  height/2.0);
  121.     vertices[3] = GLKVector2Make(-width/2.0,  height/2.0);
  122.  
  123.    
  124.     indices[0] = 0;
  125.     indices[1] = 1;
  126.     indices[2] = 2;
  127.     indices[3] = 0;
  128.     indices[4] = 2;
  129.     indices[5] = 3;
  130.    
  131.     glGenBuffers(1, &_vertexBuffer);
  132.     glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
  133.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  134.    
  135.     glGenBuffers(1, &_indexBuffer);
  136.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
  137.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  138.    
  139.  
  140.     GLenum err = glGetError();
  141.     if (err != GL_NO_ERROR)
  142.     {
  143.         NSLog(@"0 err = %u", err);
  144.     }
  145. }
  146.  
  147. - (void)tearDownGL
  148. {
  149.     [EAGLContext setCurrentContext:self.context];
  150.    
  151.     glDeleteBuffers(1, &_vertexBuffer);
  152.    
  153.     self.effect = nil;
  154.    
  155.     if (_program) {
  156.         glDeleteProgram(_program);
  157.         _program = 0;
  158.     }
  159. }
  160.  
  161. #pragma mark - GLKView and GLKViewController delegate methods
  162.  
  163. - (void)update
  164. {
  165.     GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, 6, 0, 4, -1, 1);
  166.     // Compute the model view matrix for the object rendered with GLKit
  167.     GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;
  168.  
  169.     _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);
  170.  
  171. }
  172.  
  173. - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
  174. {
  175.     glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
  176.     glClear(GL_COLOR_BUFFER_BIT);
  177.    
  178.     // Render the object again with ES2
  179.     glUseProgram(_program);
  180.     glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
  181.     glVertexAttribPointer(attributes[ATTRIB_VERTEX], 2, GL_FLOAT, GL_FALSE, 0, NULL);
  182.     glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
  183.  
  184.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
  185.     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);
  186.     GLenum err = glGetError();
  187.     if (err != GL_NO_ERROR)
  188.     {
  189.         NSLog(@"1 err = %u", err);
  190.     }
  191. }
  192.  
  193. #pragma mark -  OpenGL ES 2 shader compilation
  194.  
  195. - (BOOL)loadShaders
  196. {
  197.     GLuint vertShader, fragShader;
  198.     NSString *vertShaderPathname, *fragShaderPathname;
  199.    
  200.     // Create shader program.
  201.     _program = glCreateProgram();
  202.    
  203.     // Create and compile vertex shader.
  204.     vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];
  205.     if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {
  206.         NSLog(@"Failed to compile vertex shader");
  207.         return NO;
  208.     }
  209.    
  210.     // Create and compile fragment shader.
  211.     fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
  212.     if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {
  213.         NSLog(@"Failed to compile fragment shader");
  214.         return NO;
  215.     }
  216.    
  217.     // Attach vertex shader to program.
  218.     glAttachShader(_program, vertShader);
  219.    
  220.     // Attach fragment shader to program.
  221.     glAttachShader(_program, fragShader);
  222.    
  223.    
  224.     // Link program.
  225.     if (![self linkProgram:_program]) {
  226.         NSLog(@"Failed to link program: %d", _program);
  227.        
  228.         if (vertShader) {
  229.             glDeleteShader(vertShader);
  230.             vertShader = 0;
  231.         }
  232.         if (fragShader) {
  233.             glDeleteShader(fragShader);
  234.             fragShader = 0;
  235.         }
  236.         if (_program) {
  237.             glDeleteProgram(_program);
  238.             _program = 0;
  239.         }
  240.        
  241.         return NO;
  242.     }
  243.    
  244.     // Get uniform locations.
  245.     uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix");
  246.  
  247.     attributes[ATTRIB_VERTEX] = glGetAttribLocation(_program, "position");
  248.    
  249.     // Release vertex and fragment shaders.
  250.     if (vertShader) {
  251.         glDetachShader(_program, vertShader);
  252.         glDeleteShader(vertShader);
  253.     }
  254.     if (fragShader) {
  255.         glDetachShader(_program, fragShader);
  256.         glDeleteShader(fragShader);
  257.     }
  258.    
  259.     return YES;
  260. }
  261.  
  262. - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file
  263. {
  264.     GLint status;
  265.     const GLchar *source;
  266.    
  267.     source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];
  268.     if (!source) {
  269.         NSLog(@"Failed to load vertex shader");
  270.         return NO;
  271.     }
  272.    
  273.     *shader = glCreateShader(type);
  274.     glShaderSource(*shader, 1, &source, NULL);
  275.     glCompileShader(*shader);
  276.    
  277. #if defined(DEBUG)
  278.     GLint logLength;
  279.     glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
  280.     if (logLength > 0) {
  281.         GLchar *log = (GLchar *)malloc(logLength);
  282.         glGetShaderInfoLog(*shader, logLength, &logLength, log);
  283.         NSLog(@"Shader compile log:\n%s", log);
  284.         free(log);
  285.     }
  286. #endif
  287.    
  288.     glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
  289.     if (status == 0) {
  290.         glDeleteShader(*shader);
  291.         return NO;
  292.     }
  293.    
  294.     return YES;
  295. }
  296.  
  297. - (BOOL)linkProgram:(GLuint)prog
  298. {
  299.     GLint status;
  300.     glLinkProgram(prog);
  301.    
  302. #if defined(DEBUG)
  303.     GLint logLength;
  304.     glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
  305.     if (logLength > 0) {
  306.         GLchar *log = (GLchar *)malloc(logLength);
  307.         glGetProgramInfoLog(prog, logLength, &logLength, log);
  308.         NSLog(@"Program link log:\n%s", log);
  309.         free(log);
  310.     }
  311. #endif
  312.    
  313.     glGetProgramiv(prog, GL_LINK_STATUS, &status);
  314.     if (status == 0) {
  315.         return NO;
  316.     }
  317.    
  318.     return YES;
  319. }
  320.  
  321. - (BOOL)validateProgram:(GLuint)prog
  322. {
  323.     GLint logLength, status;
  324.    
  325.     glValidateProgram(prog);
  326.     glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
  327.     if (logLength > 0) {
  328.         GLchar *log = (GLchar *)malloc(logLength);
  329.         glGetProgramInfoLog(prog, logLength, &logLength, log);
  330.         NSLog(@"Program validate log:\n%s", log);
  331.         free(log);
  332.     }
  333.    
  334.     glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
  335.     if (status == 0) {
  336.         return NO;
  337.     }
  338.    
  339.     return YES;
  340. }
  341.  
  342. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement