Advertisement
Guest User

Untitled

a guest
May 30th, 2015
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.60 KB | None | 0 0
  1. //This was taken from the Swift OpenGL Example on GitHub
  2.  
  3. // View code
  4. import Foundation
  5. import UIKit
  6. import QuartzCore
  7. import OpenGLES
  8. import GLKit
  9.  
  10.  
  11.  
  12. struct Vertex {
  13. var Position: (CFloat, CFloat, CFloat)
  14. var Color: (CFloat, CFloat, CFloat, CFloat)
  15. }
  16.  
  17. var Vertices = [
  18. Vertex(Position: (1, -1, 0) , Color: (1, 0, 0, 1)),
  19. Vertex(Position: (1, 1, 0) , Color: (0, 1, 0, 1)),
  20. Vertex(Position: (-1, 1, 0) , Color: (0, 0, 1, 1)),
  21. Vertex(Position: (-1, -1, 0), Color: (0, 0, 0, 1))
  22. ]
  23.  
  24. var Indices: [GLubyte] = [
  25. 0, 1, 2,
  26. 2, 3, 0
  27. ]
  28.  
  29. let GLENUM_GL_RENDERBUFFER = GLenum(GL_RENDERBUFFER)
  30. let INT_GL_RENDERBUFFER = Int(GL_RENDERBUFFER)
  31. let GLUINT_GL_FRAMEBUFFER = GLuint(GL_FRAMEBUFFER)
  32. let GLENUM_GL_FRAMEBUFFER = GLenum(GL_FRAMEBUFFER)
  33. let GLENUM_GL_COLOR_ATTACHMENT0 = GLenum(GL_COLOR_ATTACHMENT0)
  34. let GLENUM_GL_VERTEX_SHADER = GLenum(GL_VERTEX_SHADER)
  35. let GLENUM_GL_COMPILE_STATUS = GLenum(GL_COMPILE_STATUS)
  36. let GLENUM_GL_FRAGMENT_SHADER = GLenum(GL_FRAGMENT_SHADER)
  37. let GLENUM_GL_LINK_STATUS = GLenum(GL_LINK_STATUS)
  38. let GLENUM_GL_ARRAY_BUFFER = GLenum(GL_ARRAY_BUFFER)
  39. let GLENUM_GL_STATIC_DRAW = GLenum(GL_STATIC_DRAW)
  40. let GLENUM_GL_FLOAT = GLenum(GL_FLOAT)
  41. let GLENUM_GL_ELEMENT_ARRAY_BUFFER = GLenum(GL_ELEMENT_ARRAY_BUFFER)
  42. let GLBOOLEAN_GL_FALSE = GLboolean(GL_FALSE)
  43. let GLENUM_GL_TRIANGLES = GLenum(GL_TRIANGLES)
  44. let GLENUM_GL_UNSIGNED_BYTE = GLenum(GL_UNSIGNED_BYTE)
  45.  
  46. @objc(OpenGLView) class OpenGLView: UIView {
  47.  
  48. var eaglLayer: CAEAGLLayer!
  49. var context: EAGLContext!
  50. var colorRenderBuffer: GLuint = GLuint()
  51. var positionSlot: GLuint = GLuint()
  52. var colorSlot: GLuint = GLuint()
  53. var indexBuffer: GLuint = GLuint()
  54. var vertexBuffer: GLuint = GLuint()
  55. var VAO:GLuint = GLuint()
  56.  
  57.  
  58. /* Class Methods
  59. ------------------------------------------*/
  60.  
  61. override class func layerClass() -> AnyClass {
  62. // In order for our view to display OpenGL content, we need to set it's
  63. // default layer to be a CAEAGLayer
  64. return CAEAGLLayer.self
  65. }
  66.  
  67.  
  68. /* Lifecycle
  69. ------------------------------------------*/
  70.  
  71. required init(coder aDecoder: NSCoder) {
  72. super.init(coder: aDecoder)
  73.  
  74. self.setupLayer()
  75. self.setupContext()
  76. self.setupRenderBuffer()
  77. self.setupFrameBuffer()
  78. self.compileShaders()
  79. self.setupVBOs()
  80. self.render()
  81. }
  82.  
  83.  
  84.  
  85. /* Instance Methods
  86. ------------------------------------------*/
  87.  
  88. func setupLayer() {
  89. // CALayer's are, by default, non-opaque, which is 'bad for performance with OpenGL',
  90. // so let's set our CAEAGLLayer layer to be opaque.
  91. self.eaglLayer = self.layer as CAEAGLLayer
  92. self.eaglLayer.opaque = true
  93. }
  94.  
  95. func setupContext() {
  96. // Just like with CoreGraphics, in order to do much with OpenGL, we need a context.
  97. // Here we create a new context with the version of the rendering API we want and
  98. // tells OpenGL that when we draw, we want to do so within this context.
  99. var api: EAGLRenderingAPI = EAGLRenderingAPI.OpenGLES3
  100. self.context = EAGLContext(API: api)
  101. EAGLContext.setCurrentContext(self.context)
  102. }
  103.  
  104. func setupRenderBuffer() {
  105. glGenRenderbuffers(1, &self.colorRenderBuffer)
  106.  
  107. glBindRenderbuffer(GLENUM_GL_RENDERBUFFER, self.colorRenderBuffer)
  108. self.context.renderbufferStorage(INT_GL_RENDERBUFFER, fromDrawable:self.eaglLayer)
  109. }
  110.  
  111. func setupFrameBuffer() {
  112. var frameBuffer: GLuint = GLuint()
  113. glGenFramebuffers(1, &frameBuffer)
  114. glBindFramebuffer(GLUINT_GL_FRAMEBUFFER, frameBuffer)
  115. glFramebufferRenderbuffer(GLENUM_GL_FRAMEBUFFER, GLENUM_GL_COLOR_ATTACHMENT0, GLENUM_GL_RENDERBUFFER, self.colorRenderBuffer)
  116. }
  117.  
  118. func compileShader(shaderName: NSString, shaderType: GLenum) -> GLuint {
  119.  
  120. // Get NSString with contents of our shader file.
  121. var shaderPath: NSString = NSBundle.mainBundle().pathForResource(shaderName, ofType: "glsl")!
  122. var error: NSError? = nil
  123. var shaderString = NSString(contentsOfFile:shaderPath, encoding: NSUTF8StringEncoding, error: &error)
  124.  
  125. // Tell OpenGL to create an OpenGL object to represent the shader, indicating if it's a vertex or a fragment shader.
  126. var shaderHandle: GLuint = glCreateShader(shaderType)
  127.  
  128. // Conver shader string to CString and call glShaderSource to give OpenGL the source for the shader.
  129. var shaderStringUTF8 = shaderString!.UTF8String
  130. var shaderStringLength: GLint = GLint(Int32(shaderString!.length))
  131. glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength)
  132.  
  133. // Tell OpenGL to compile the shader.
  134. glCompileShader(shaderHandle)
  135.  
  136. return shaderHandle
  137. }
  138.  
  139. func compileShaders() {
  140.  
  141. // Compile our vertex and fragment shaders.
  142. var vertexShader: GLuint = self.compileShader("SimpleVertex", shaderType: GLENUM_GL_VERTEX_SHADER)
  143. var fragmentShader: GLuint = self.compileShader("SimpleFragment", shaderType: GLENUM_GL_FRAGMENT_SHADER)
  144.  
  145. // Call glCreateProgram, glAttachShader, and glLinkProgram to link the vertex and fragment shaders into a complete program.
  146. var programHandle: GLuint = glCreateProgram()
  147. glAttachShader(programHandle, vertexShader)
  148. glAttachShader(programHandle, fragmentShader)
  149. glLinkProgram(programHandle)
  150.  
  151. // Call glUseProgram to tell OpenGL to actually use this program when given vertex info.
  152. glUseProgram(programHandle)
  153.  
  154. // Finally, call glGetAttribLocation to get a pointer to the input values for the vertex shader, so we
  155. // can set them in code. Also call glEnableVertexAttribArray to enable use of these arrays (they are disabled by default).
  156. self.positionSlot = GLuint(glGetAttribLocation(programHandle, "Position"))
  157. self.colorSlot = GLuint(glGetAttribLocation(programHandle, "SourceColor"))
  158. glEnableVertexAttribArray(self.positionSlot)
  159. glEnableVertexAttribArray(self.colorSlot)
  160. }
  161.  
  162. // Setup Vertex Buffer Objects
  163. func setupVBOs() {
  164.  
  165. glGenVertexArraysOES(1, &VAO);
  166. glBindVertexArrayOES(VAO);
  167.  
  168. glGenBuffers(1, &vertexBuffer)
  169. glBindBuffer(GLENUM_GL_ARRAY_BUFFER, vertexBuffer)
  170. glBufferData(GLENUM_GL_ARRAY_BUFFER, Vertices.size(), Vertices, GLENUM_GL_STATIC_DRAW)
  171.  
  172. let positionSlotFirstComponent = UnsafePointer<Int>(bitPattern:0)
  173. glEnableVertexAttribArray(positionSlot)
  174. glVertexAttribPointer(positionSlot, 3, GLENUM_GL_FLOAT, GLBOOLEAN_GL_FALSE, GLsizei(sizeof(Vertex)), positionSlotFirstComponent)
  175.  
  176. glEnableVertexAttribArray(colorSlot)
  177. let colorSlotFirstComponent = UnsafePointer<Int>(bitPattern:sizeof(Float) * 3)
  178. glVertexAttribPointer(colorSlot, 4, GLENUM_GL_FLOAT, GLBOOLEAN_GL_FALSE, GLsizei(sizeof(Vertex)), colorSlotFirstComponent)
  179.  
  180. glGenBuffers(1, &indexBuffer)
  181. glBindBuffer(GLENUM_GL_ELEMENT_ARRAY_BUFFER, indexBuffer)
  182. glBufferData(GLENUM_GL_ELEMENT_ARRAY_BUFFER, Indices.size(), Indices, GLENUM_GL_STATIC_DRAW)
  183.  
  184. glBindBuffer(GLENUM_GL_ARRAY_BUFFER, 0)
  185. glBindVertexArrayOES(0)
  186. }
  187.  
  188. func render() {
  189. glBindVertexArrayOES(VAO);
  190. glViewport(0, 0, GLint(self.frame.size.width), GLint(self.frame.size.height));
  191.  
  192. glDrawElements(GLENUM_GL_TRIANGLES, GLsizei(Indices.count), GLENUM_GL_UNSIGNED_BYTE, nil)
  193.  
  194. self.context.presentRenderbuffer(INT_GL_RENDERBUFFER)
  195.  
  196. glBindVertexArrayOES(0)
  197. }
  198. }
  199.  
  200.  
  201. //helper extensions to pass arguments to GL land
  202. extension Array {
  203. func size () -> Int {
  204. return self.count * sizeofValue(self[0])
  205. }
  206. }
  207.  
  208. //View controller code
  209.  
  210. import UIKit
  211.  
  212. class GameViewController: UIViewController {
  213.  
  214. override func viewDidLoad() {
  215. super.viewDidLoad()
  216. // Do any additional setup after loading the view, typically from a nib.
  217. }
  218.  
  219. override func didReceiveMemoryWarning() {
  220. super.didReceiveMemoryWarning()
  221. // Dispose of any resources that can be recreated.
  222. }
  223.  
  224.  
  225. }
  226.  
  227. //App delegate code
  228. import UIKit
  229. import CoreData
  230.  
  231. @UIApplicationMain
  232. class AppDelegate: UIResponder, UIApplicationDelegate {
  233.  
  234. var window: UIWindow?
  235.  
  236.  
  237. func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
  238. return true
  239. }
  240.  
  241. func applicationWillResignActive(application: UIApplication) {
  242. }
  243.  
  244. func applicationDidEnterBackground(application: UIApplication) {
  245. }
  246.  
  247. func applicationWillEnterForeground(application: UIApplication) {
  248. }
  249.  
  250. func applicationDidBecomeActive(application: UIApplication) {
  251. }
  252.  
  253. func applicationWillTerminate(application: UIApplication) {
  254. }
  255.  
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement