Guest User

Untitled

a guest
Feb 22nd, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. import os
  2. import opengl
  3. import glfw/wrapper as glfw
  4.  
  5. var
  6. win: GLFWwindow
  7. vaoID: GLuint
  8. vboID: GLuint
  9. cboID: GLuint
  10. vertexShaderID: GLuint
  11. vertexShaderSrc: cstringArray
  12. fragmentShaderSrc: cstringArray
  13. fragmentShaderID: GLuint
  14. programID: GLuint
  15. vertices: array[12, GLdouble] =
  16. [ -0.8, -0.8, 0.0, 1.0, # Vertex 1
  17. 0.0, 0.8, 0.0, 1.0, # Vertex 2
  18. 0.8, -0.8, 0.0, 1.0 ] # Vertex 3
  19. colors: array[12, GLdouble] =
  20. [ 1.0, 0.0, 0.0, 1.0, # Red
  21. 0.0, 1.0, 0.0, 1.0, # Green
  22. 0.0, 0.0, 1.0, 1.0 ] # Blue
  23.  
  24. proc createContext =
  25. if glfw.init() != 1:
  26. stderr.writeln("Failed to initialize GLFW")
  27. stderr.flushFile
  28.  
  29. glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 4)
  30. glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 0)
  31. glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
  32. glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)
  33. glfw.windowHint(glfw.OPENGL_DEBUG_CONTEXT, GL_TRUE)
  34. glfw.windowHint(glfw.RESIZABLE, GL_FALSE)
  35. glfw.windowHint(glfw.REFRESH_RATE, 1000)
  36.  
  37. win = glfw.createWindow(width = 800, height = 600, title = "GLFW Nim", nil, nil)
  38.  
  39. glfw.makeContextCurrent(win)
  40.  
  41.  
  42. proc createVertexShader =
  43. vertexShaderID = glCreateShader(GL_VERTEX_SHADER)
  44. vertexShaderSrc = allocCStringArray([
  45. """
  46. #version 400
  47.  
  48. layout(location=0) in vec4 inPosition;
  49. layout(location=1) in vec4 inColor;
  50.  
  51. out vec4 exColor;
  52.  
  53. void main() {
  54. exColor = inColor;
  55. gl_Position = inPosition;
  56. }
  57. """])
  58.  
  59. glShaderSource(vertexShaderID, 1, vertexShaderSrc, nil)
  60. glCompileShader(vertexShaderID)
  61.  
  62. var status: GLint
  63.  
  64. glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, addr status)
  65.  
  66. if status == GL_FALSE:
  67. var logLength: GLint
  68. glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, addr logLength)
  69.  
  70. var errorLog: cstring = cast[cstring](alloc(logLength))
  71. glGetShaderInfoLog(vertexShaderID, logLength, addr logLength, errorLog)
  72.  
  73. stderr.writeln(errorLog)
  74. stderr.writeln(vertexShaderSrc[0])
  75.  
  76. proc createFragmentShader =
  77. fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER)
  78. fragmentShaderSrc = allocCStringArray([
  79. """
  80. #version 400
  81.  
  82. in vec4 exColor;
  83. out vec4 outColor;
  84.  
  85. void main() {
  86. outColor = exColor;
  87. }
  88. """])
  89.  
  90. glShaderSource(fragmentShaderID, 1, fragmentShaderSrc, nil)
  91. glCompileShader(fragmentShaderID)
  92.  
  93. var status: GLint
  94.  
  95. glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, addr status)
  96.  
  97. if status == GL_FALSE:
  98. var logLength: GLint
  99. glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, addr logLength)
  100.  
  101. var errorLog: cstring = cast[cstring](alloc(logLength))
  102. glGetShaderInfoLog(fragmentShaderID, logLength, addr logLength, errorLog)
  103.  
  104. stderr.writeln(errorLog)
  105. stderr.writeln(fragmentShaderSrc[0])
  106.  
  107. proc linkShaders =
  108. # Link the vertex and fragment shader into a shader program
  109. programID = glCreateProgram()
  110. glAttachShader(programID, vertexShaderID)
  111. glAttachShader(programID, fragmentShaderID)
  112. glBindFragDataLocation(programID, 0, "outColor")
  113. glLinkProgram(programID)
  114.  
  115. var status: GLint
  116.  
  117. glGetProgramiv(programID, GL_LINK_STATUS, addr status)
  118.  
  119. if status == GL_FALSE:
  120. var logLength: GLint
  121. glGetProgramiv(programID, GL_INFO_LOG_LENGTH, addr logLength)
  122.  
  123. var errorLog: cstring = cast[cstring](alloc(logLength))
  124. glGetProgramInfoLog(programID, logLength, addr logLength, errorLog)
  125.  
  126. stderr.writeln(errorLog)
  127.  
  128. glUseProgram(programID)
  129.  
  130.  
  131. proc createShaders =
  132. createVertexShader()
  133. createFragmentShader()
  134. linkShaders()
  135.  
  136.  
  137. proc createBuffers =
  138. glGenVertexArrays(1, addr vaoID)
  139. glBindVertexArray(vaoID)
  140.  
  141. glGenBuffers(1, addr vboID)
  142. glBindBuffer(GL_ARRAY_BUFFER, vboID)
  143. glBufferData(GL_ARRAY_BUFFER, cast[GLsizeiptrArb](sizeof(vertices)), cast[pointer](addr vertices), GL_STATIC_DRAW)
  144. glEnableVertexAttribArray(0)
  145. glVertexAttribPointer(0, 4, cGL_DOUBLE, false, 0, nil)
  146.  
  147. glGenBuffers(1, addr cboID)
  148. glBindBuffer(GL_ARRAY_BUFFER, cboID)
  149. glBufferData(GL_ARRAY_BUFFER, cast[GLsizeiptrArb](sizeof(colors)), cast[pointer](addr colors), GL_STATIC_DRAW)
  150. glEnableVertexAttribArray(1)
  151. glVertexAttribPointer(1, 4, cGL_DOUBLE, false, 0, nil)
  152.  
  153. proc initGL =
  154. glEnable(GL_DEPTH_TEST)
  155. glClearColor(0.0, 0.0, 0.0, 1.0)
  156.  
  157. proc init =
  158. createContext()
  159. loadExtensions()
  160. createShaders()
  161. createBuffers()
  162. initGL()
  163. stderr.writeln("INFO: OpenGL version ", cast[cstring](glGetString(GL_VERSION)))
  164.  
  165.  
  166. proc render =
  167. while glfw.windowShouldClose(win) == GL_FALSE:
  168. # Clear the screen to black
  169. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
  170.  
  171. # Draw a triangle from the 3 vertices
  172. glDrawArrays(GL_TRIANGLES, 0, 3)
  173.  
  174. # Swap buffers and poll window events
  175. glfw.swapBuffers(win)
  176. glfw.pollEvents()
  177.  
  178. if glfw.getKey(win, glfw.KEY_Q) == glfw.PRESS:
  179. glfw.setWindowShouldClose(win, GL_TRUE)
  180.  
  181. sleep(30)
  182.  
  183. proc destroyShaders =
  184. glUseProgram(0)
  185. glDetachShader(programID, vertexShaderID)
  186. glDetachShader(programID, fragmentShaderiD)
  187. glDeleteProgram(programID)
  188. glDeleteShader(fragmentShaderID)
  189. glDeleteShader(vertexShaderID)
  190.  
  191. proc destroyBuffers =
  192. glDisableVertexAttribArray(0)
  193. glDisableVertexAttribArray(1)
  194.  
  195. glBindBuffer(GL_ARRAY_BUFFER, 0)
  196. glDeleteBuffers(1, addr vboID)
  197. glDeleteBuffers(1, addr cboID)
  198.  
  199. glBindVertexArray(0)
  200. glDeleteVertexArrays(1, addr vaoID)
  201.  
  202. proc cleanup =
  203. destroyShaders()
  204. destroyBuffers()
  205. deallocCStringArray(vertexShaderSrc)
  206. deallocCStringArray(fragmentShaderSrc)
  207.  
  208. proc exit =
  209. glfw.destroyWindow(win)
  210. glfw.terminate()
  211.  
  212.  
  213. init()
  214. render()
  215. cleanup()
  216. exit()
Add Comment
Please, Sign In to add comment