Advertisement
chunkyguy

Texture loading with GLKTextureLoader

Jan 15th, 2012
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  GameController.m
  3. //
  4. //  Created by Sidharth Juyal on 13/01/12.
  5. //  Copyright (c) 2012 whackylabs. All rights reserved.
  6. //
  7.  
  8. #import "GameController.h"
  9. #import "Scene.h"
  10. #import "GameScene.h"
  11. //#import "ResourceManager.h"
  12.  
  13. @implementation GameController
  14. -(void)dealloc{
  15.     free(data);
  16.     [context_ release];
  17.     [super dealloc];
  18. }
  19.  
  20. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
  21. {
  22.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  23.     if (self) {
  24.         self.preferredFramesPerSecond = 30;
  25.         data = nil;
  26.     }
  27.     return self;
  28. }
  29.  
  30. -(void)loadView{
  31.     [super loadView];
  32.    
  33.     context_ = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
  34. //  GameScene *scene = [[GameScene alloc] initWithFrame:[[UIScreen mainScreen]bounds] context:context_];
  35. //  [self setView:scene];
  36. //  [scene release];
  37.  
  38.    
  39.     [(GLKView *)self.view setContext:context_];
  40.     [(GLKView *)self.view setDelegate:self];
  41.  
  42. }
  43.  
  44. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
  45.     return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
  46. }
  47.  
  48. -(void)loadData{
  49.     data = (UserData *)malloc(sizeof(UserData));
  50.    
  51.     glClearColor(131.0f/255.0f, 151.0f/255.0f, 188.0f/255.0f, 1.0f);
  52.     CGSize winSz = self.view.bounds.size;
  53.     glViewport(0, 0, (GLsizei)winSz.width, (GLsizei)winSz.height);
  54.    
  55.     //build shader
  56.     GLuint vShader = [self buildShaderType:GL_VERTEX_SHADER path:[[NSBundle mainBundle] pathForResource:@"texture" ofType:@"vsh"]];
  57.     GLuint fShader = [self buildShaderType:GL_FRAGMENT_SHADER path:[[NSBundle mainBundle]pathForResource:@"texture" ofType:@"fsh"]];
  58.     [self compileProgramForVertexShader:vShader fragShader:fShader];
  59.    
  60.     data->positionLoc = glGetAttribLocation ( data->programObject, "a_position" );
  61.     data->texCoordLoc = glGetAttribLocation ( data->programObject, "a_texCoord" );
  62.    
  63.     // Get the sampler location
  64.     data->samplerLoc = glGetUniformLocation ( data->programObject, "s_texture" );
  65.     data->textureId = 0;
  66. }
  67.  
  68. -(void)update{
  69.     //[(GameScene *)self.view update:self.timeSinceLastUpdate];
  70.     if(!data)
  71.         [self loadData];
  72.    
  73.     [(GLKView *)self.view setNeedsDisplay];
  74. }
  75.  
  76.  
  77. -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
  78.    
  79.     if(!data)
  80.         [self loadData];
  81.  
  82.     GLfloat vVertices[] = { -0.5f,  0.5f, 0.0f,  // Position 0
  83.         0.0f,  0.0f,        // TexCoord 0
  84.         -0.5f, -0.5f, 0.0f,  // Position 1
  85.         0.0f,  1.0f,        // TexCoord 1
  86.         0.5f, -0.5f, 0.0f,  // Position 2
  87.         1.0f,  1.0f,        // TexCoord 2
  88.         0.5f,  0.5f, 0.0f,  // Position 3
  89.         1.0f,  0.0f         // TexCoord 3
  90.     };
  91.     GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
  92.  
  93.     // Load the vertex position
  94.     glVertexAttribPointer ( data->positionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vVertices );
  95.     // Load the texture coordinate
  96.     glVertexAttribPointer ( data->texCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &vVertices[3] );
  97.     glEnableVertexAttribArray ( data->positionLoc );
  98.     glEnableVertexAttribArray ( data->texCoordLoc );
  99.     // Bind the texture
  100.     if(data->textureId == 0){
  101.         data->textureId = [[GLKTextureLoader textureWithCGImage:[[UIImage imageNamed:@"Tree Short.png"]CGImage] options:nil error:nil] name];
  102.     }
  103.     glActiveTexture ( GL_TEXTURE0 );
  104.     glBindTexture ( GL_TEXTURE_2D, data->textureId );  
  105.     // Set the sampler texture unit to 0
  106.     glUniform1i ( data->samplerLoc, 0 );
  107.     glDrawElements ( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices );
  108.    
  109. }
  110.  
  111. #pragma mark - Build Shader -
  112. -(void)compileProgramForVertexShader:(GLuint)vShader fragShader:(GLuint)fShader{
  113.     NSLog(@"compiling shaders");
  114.     data->programObject = glCreateProgram();
  115.     glAttachShader(data->programObject, vShader);
  116.     glAttachShader(data->programObject, fShader);
  117.     glLinkProgram(data->programObject);
  118.    
  119.     GLint logLength;
  120.     glGetProgramiv(data->programObject, GL_INFO_LOG_LENGTH, &logLength);
  121.     if (logLength > 0)
  122.     {
  123.         GLchar *log = (GLchar *)malloc(logLength);
  124.         glGetProgramInfoLog(data->programObject, logLength, &logLength, log);
  125.         NSLog(@"Program link log:\n%s", log);
  126.         free(log);
  127.     }
  128.    
  129.     GLint status;
  130.     glGetProgramiv(data->programObject, GL_LINK_STATUS, &status);
  131.     if (status == GL_FALSE)
  132.         NSLog(@"Failed to link program %d", data->programObject);
  133.    
  134.     glUseProgram(data->programObject);
  135. }
  136.  
  137. -(GLuint)buildShaderType:(GLenum)shaderType path:(NSString *)path{
  138.     NSError *error = nil;
  139.     NSString *shaderStr = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
  140.     if(error)
  141.         NSLog(@"shader string invalid: %@",[error debugDescription]);
  142.     const GLchar *shaderStrPtr = (GLchar *)[shaderStr UTF8String];
  143.     GLint len = (GLint)[shaderStr length];
  144.     GLuint shader = glCreateShader(shaderType);
  145.     glShaderSource(shader, 1, &shaderStrPtr, &len);
  146.     glCompileShader(shader);
  147.    
  148.     GLint logLength;
  149.     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
  150.     if (logLength > 0)
  151.     {
  152.         GLchar *log = (GLchar *)malloc(logLength);
  153.         glGetShaderInfoLog(shader, logLength, &logLength, log);
  154.         NSLog(@"Shader compile log:\n%s", log);
  155.         free(log);
  156.     }
  157.    
  158.     GLint status;
  159.     glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  160.     if (status == GL_FALSE){
  161.         NSLog(@"Failed to compile shader:\n");
  162.     }
  163.    
  164.     return shader;
  165. }
  166.  
  167. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement