Created
May 3, 2015 19:55
-
-
Save zainab-ali/a617da585691d9ed2ac8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import GLKit | |
import OpenGLES | |
let GLENUM_GL_RENDERBUFFER = GLenum(GL_RENDERBUFFER) | |
let INT_GL_RENDERBUFFER = Int(GL_RENDERBUFFER) | |
let GLUINT_GL_FRAMEBUFFER = GLuint(GL_FRAMEBUFFER) | |
let GLENUM_GL_FRAMEBUFFER = GLenum(GL_FRAMEBUFFER) | |
let GLENUM_GL_COLOR_ATTACHMENT0 = GLenum(GL_COLOR_ATTACHMENT0) | |
let GLENUM_GL_VERTEX_SHADER = GLenum(GL_VERTEX_SHADER) | |
let GLENUM_GL_COMPILE_STATUS = GLenum(GL_COMPILE_STATUS) | |
let GLENUM_GL_FRAGMENT_SHADER = GLenum(GL_FRAGMENT_SHADER) | |
let GLENUM_GL_LINK_STATUS = GLenum(GL_LINK_STATUS) | |
let GLENUM_GL_ARRAY_BUFFER = GLenum(GL_ARRAY_BUFFER) | |
let GLENUM_GL_STATIC_DRAW = GLenum(GL_STATIC_DRAW) | |
let GLENUM_GL_FLOAT = GLenum(GL_FLOAT) | |
let GLENUM_GL_ELEMENT_ARRAY_BUFFER = GLenum(GL_ELEMENT_ARRAY_BUFFER) | |
let GLBOOLEAN_GL_FALSE = GLboolean(GL_FALSE) | |
let GLENUM_GL_TRIANGLES = GLenum(GL_TRIANGLES) | |
let GLENUM_GL_UNSIGNED_BYTE = GLenum(GL_UNSIGNED_BYTE) | |
let GLENUM_GL_DEPTH_TEST = GLenum(GL_DEPTH_TEST) | |
let GLKVertexAttribPosition: GLuint = GLuint(0) | |
let GLKVertexAttribNormal: GLuint = GLuint(1) | |
class GameViewController: UIViewController, GLKViewDelegate { | |
var context: EAGLContext! | |
var _rotation: CGFloat = 0.0 | |
var _renderBuffer: GLuint = 0 | |
var _vertexArray: GLuint = 0 | |
var _vertexBuffer: GLuint = 0 | |
var _program: GLuint = 0 | |
var _modelViewProjectionMatrix: GLint = 0 | |
var _normalMatrix: GLint = 0 | |
var glCubeVertexData: [GLfloat] = [GLfloat]() | |
@IBOutlet var openGlView: GLKView? | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
NSLog("View did load") | |
setupContext() | |
setupGL() | |
} | |
override func didReceiveMemoryWarning() { | |
super.didReceiveMemoryWarning() | |
} | |
func setupContext() { | |
openGlView!.enableSetNeedsDisplay = false; | |
var api: EAGLRenderingAPI = EAGLRenderingAPI.OpenGLES3 | |
self.context = EAGLContext(API: api) | |
EAGLContext.setCurrentContext(self.context) | |
openGlView!.context = self.context | |
openGlView!.drawableDepthFormat = GLKViewDrawableDepthFormat.Format24 | |
} | |
func setupGL() { | |
self.setupVertexData() | |
self.loadShaders() | |
glEnable(GLENUM_GL_DEPTH_TEST); | |
glGenRenderbuffers(1, &_renderBuffer); | |
glGenVertexArraysOES(1, &_vertexArray); | |
glBindVertexArrayOES(_vertexArray); | |
glGenBuffers(1, &_vertexBuffer); | |
glBindBuffer(GLENUM_GL_ARRAY_BUFFER, _vertexBuffer); | |
glBufferData(GLENUM_GL_ARRAY_BUFFER, glCubeVertexData.size(), glCubeVertexData, GLENUM_GL_STATIC_DRAW); | |
glEnableVertexAttribArray(GLKVertexAttribPosition); | |
glVertexAttribPointer(GLKVertexAttribPosition, 3, GLENUM_GL_FLOAT, GLBOOLEAN_GL_FALSE, 24, UnsafePointer<Int>(bitPattern: 0)); | |
glEnableVertexAttribArray(GLKVertexAttribNormal); | |
glVertexAttribPointer(GLKVertexAttribNormal, 3, GLENUM_GL_FLOAT, GLBOOLEAN_GL_FALSE, 24, UnsafePointer<Int>(bitPattern: 12)); | |
glBindVertexArrayOES(0) | |
} | |
func setupVertexData() { | |
glCubeVertexData += [ | |
0.5, -0.5, -0.5, 1.0, 0.0, 0.0, | |
0.5, 0.5, -0.5, 1.0, 0.0, 0.0, | |
0.5, -0.5, 0.5, 1.0, 0.0, 0.0, | |
0.5, -0.5, 0.5, 1.0, 0.0, 0.0, | |
0.5, 0.5, -0.5, 1.0, 0.0, 0.0, | |
0.5, 0.5, 0.5, 1.0, 0.0, 0.0] | |
glCubeVertexData += [ | |
0.5, 0.5, -0.5, 0.0, 1.0, 0.0, | |
-0.5, 0.5, -0.5, 0.0, 1.0, 0.0, | |
0.5, 0.5, 0.5, 0.0, 1.0, 0.0, | |
0.5, 0.5, 0.5, 0.0, 1.0, 0.0, | |
-0.5, 0.5, -0.5, 0.0, 1.0, 0.0, | |
-0.5, 0.5, 0.5, 0.0, 1.0, 0.0] | |
glCubeVertexData += [-0.5, 0.5, -0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, -0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, 0.5, 0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, 0.5, 0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, -0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, 0.5, -1.0, 0.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, -0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [0.5, -0.5, -0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, 0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [-0.5, -0.5, 0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [0.5, -0.5, -0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [0.5, -0.5, 0.5, 0.0, -1.0, 0.0] | |
glCubeVertexData += [ | |
0.5, 0.5, 0.5, 0.0, 0.0, 1.0, | |
-0.5, 0.5, 0.5, 0.0, 0.0, 1.0, | |
0.5, -0.5, 0.5, 0.0, 0.0, 1.0, | |
0.5, -0.5, 0.5, 0.0, 0.0, 1.0, | |
-0.5, 0.5, 0.5, 0.0, 0.0, 1.0, | |
-0.5, -0.5, 0.5, 0.0, 0.0, 1.0] | |
glCubeVertexData += [0.5, -0.5, -0.5, 0.0, 0.0, -1.0] | |
glCubeVertexData += [-0.5, -0.5, -0.5, 0.0, 0.0, -1.0] | |
glCubeVertexData += [0.5, 0.5, -0.5, 0.0, 0.0, -1.0] | |
glCubeVertexData += [0.5, 0.5, -0.5, 0.0, 0.0, -1.0] | |
glCubeVertexData += [-0.5, -0.5, -0.5, 0.0, 0.0, -1.0] | |
glCubeVertexData += [-0.5, 0.5, -0.5, 0.0, 0.0, -1.0] | |
} | |
@IBAction func startDrawOperations(sender: UIButton) { | |
NSLog("start draw operations") | |
openGlView!.display() | |
} | |
func glkView(view: GLKView!, drawInRect rect: CGRect) { | |
NSLog("glkViewDrawInRect") | |
glClearColor(0.65, 0.65, 0.65, 1.0) | |
let combinedbits = Int16(GL_COLOR_BUFFER_BIT) | Int16(GL_DEPTH_BUFFER_BIT) // equals 11111110 | |
glClear(GLuint(combinedbits)) | |
glBindVertexArrayOES(_vertexArray) | |
glUseProgram(_program) | |
glUniformMatrix4fv(_modelViewProjectionMatrix, 1, 0, [2.77643108, 0.0459479354, 0.0784977376, 0.0783408954, -0.0750610456, 1.56837773, -0.0307182074, -0.0306568332, 0.220591173, -0.0446401462, -0.99845004, -0.996455132, 0.208877325, 0, 2.30668306, 2.50187445]) | |
glUniformMatrix3fv(_normalMatrix, 1, 0, [0.996496737, 0.0292720664, -0.078340888, -0.0269403681, 0.999166905, 0.0306568407, 0.0791730061, -0.0284389053, 0.996455192]) | |
glDrawArrays(GLENUM_GL_TRIANGLES, 0, 36) | |
openGlView!.bindDrawable() | |
} | |
func loadShaders() { | |
_program = glCreateProgram() | |
var vertShaderPathname: NSString = NSBundle.mainBundle().pathForResource("Shader", ofType: "vsh")! | |
var vertShader: GLuint = compileShader(vertShaderPathname, type: GLENUM_GL_VERTEX_SHADER) | |
var fragShaderPathname: NSString = NSBundle.mainBundle().pathForResource("Shader", ofType: "fsh")! | |
var fragShader: GLuint = compileShader(fragShaderPathname, type: GLENUM_GL_FRAGMENT_SHADER) | |
glAttachShader(_program, vertShader) | |
glAttachShader(_program, fragShader) | |
glBindAttribLocation(_program, GLKVertexAttribPosition, "position") | |
glBindAttribLocation(_program, GLKVertexAttribNormal, "normal") | |
glLinkProgram(_program) | |
_modelViewProjectionMatrix = GLint(glGetUniformLocation(_program, "modelViewProjectionMatrix")) | |
_normalMatrix = GLint(glGetUniformLocation(_program, "normalMatrix")) | |
} | |
func compileShader(path: NSString, type: GLenum) -> GLuint { | |
var shaderString = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) | |
var shaderHandle: GLuint = glCreateShader(type) | |
var shaderStringUTF8 = shaderString!.UTF8String | |
glShaderSource(shaderHandle, 1, &shaderStringUTF8, nil) | |
glCompileShader(shaderHandle) | |
return shaderHandle | |
} | |
} | |
extension Array { | |
func size () -> Int { | |
return self.count * sizeofValue(self[0]) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment