rafaelvasco

nimrod opengl test

Sep 30th, 2012
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.75 KB | None | 0 0
  1. import glfw
  2. import opengl
  3. import strutils
  4. import typeinfo
  5.  
  6. ## -------------------------------------------------------------------------------
  7.  
  8. var
  9. running : bool = true
  10. frameCount: int = 0
  11. lastTime: float = 0.0
  12. lastFPSTime: float = 0.0
  13. currentTime: float = 0.0
  14. frameRate: int = 0
  15. frameDelta: float = 0.0
  16.  
  17. windowW: int = 640
  18. windowH: int = 480
  19.  
  20. vshaderID: int
  21. fshaderID: int
  22. shaderProg: int
  23.  
  24. vertexPosAttrLoc: int
  25.  
  26. pMatrixUniLoc: int
  27. mvMatrixUniLoc: int
  28.  
  29. mvMatrix: array[0..15, float32] = [1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32]
  30. pMatrix: array[0..15, float32] = [1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 0.0'f32, 1.0'f32]
  31.  
  32. vbo: int
  33.  
  34. type
  35. ShaderType = enum
  36. VertexShader,
  37. FragmentShader
  38.  
  39.  
  40. ## -------------------------------------------------------------------------------
  41.  
  42. proc GenOrthoMatrix(width: int, height: int, matrix: var array[0..15, float32]) =
  43.  
  44. matrix[0] = 2.0 / float(width)
  45. matrix[1] = 0.0
  46. matrix[2] = 0.0
  47. matrix[3] = 0.0
  48.  
  49. matrix[4] = 0.0
  50. matrix[5] = 2.0 / float(-height)
  51. matrix[6] = 0.0
  52. matrix[7] = 0.0
  53.  
  54. matrix[8] = 0.0
  55. matrix[9] = 0.0
  56. matrix[10] = -1.0
  57. matrix[11] = 0.0
  58.  
  59. matrix[12] = -1.0
  60. matrix[13] = 1.0
  61. matrix[14] = 0.0
  62. matrix[15] = 1.0
  63.  
  64.  
  65.  
  66.  
  67.  
  68. proc Resize(width: int, height: int) =
  69.  
  70. glViewport(0, 0, width, height)
  71.  
  72. GenOrthoMatrix(width, height, pMatrix)
  73.  
  74.  
  75.  
  76.  
  77. ## -------------------------------------------------------------------------------
  78.  
  79. proc LoadShader(shaderType: ShaderType, file: string ): int =
  80.  
  81.  
  82.  
  83. if shaderType == VertexShader:
  84. result = glCreateShader(GL_VERTEX_SHADER)
  85.  
  86. else:
  87. result = glCreateShader(GL_FRAGMENT_SHADER)
  88.  
  89.  
  90. var shaderSrc = readFile(file)
  91.  
  92. var shader = result
  93.  
  94. var stringArray = allocCStringArray([shaderSrc])
  95.  
  96. glShaderSource(shader, 1 , stringArray, nil)
  97.  
  98. deallocCStringArray(stringArray)
  99.  
  100. glCompileShader(shader)
  101.  
  102. var compileResult = -1
  103.  
  104. glGetShaderiv(shader, GL_COMPILE_STATUS, addr(compileResult))
  105.  
  106. if compileResult != GL_TRUE:
  107. result = -1
  108.  
  109. ## ---------------------------------------------------------------------
  110.  
  111.  
  112. proc InitializeGL() =
  113.  
  114.  
  115. glClearColor(0.1,0.1,0.1,1.0)
  116. glClearDepth(1.0)
  117. glEnable(GL_BLEND)
  118. glDisable(GL_DEPTH_TEST)
  119.  
  120.  
  121. ## ---------------------------------------------------------------------
  122.  
  123. proc InitializeShaders() =
  124.  
  125. vshaderID = LoadShader(ShaderType.VertexShader, "vertexshader.vert")
  126. fshaderID = LoadShader(ShaderType.FragmentShader, "fragshader.frag")
  127.  
  128. if vshaderID == -1 or fshaderID == -1:
  129. quit("Error compiling shaders!")
  130.  
  131. shaderProg = glCreateProgram()
  132.  
  133. glAttachShader(shaderProg, vshaderID)
  134. glAttachShader(shaderProg, fshaderID)
  135.  
  136. glLinkProgram(shaderProg)
  137.  
  138. var linkStatus = -1
  139.  
  140. glGetProgramiv(shaderProg, GL_LINK_STATUS, addr(linkStatus))
  141.  
  142. if linkStatus != GL_TRUE:
  143. quit("Error linking shader program!")
  144.  
  145. glUseProgram(shaderProg)
  146.  
  147. vertexPosAttrLoc = glGetAttribLocation(shaderProg, "aVertexPosition")
  148.  
  149. glEnableVertexAttribArray(vertexPosAttrLoc)
  150.  
  151. pMatrixUniLoc = glGetUniformLocation(shaderProg, "uPMatrix")
  152. mvMatrixUniLoc = glGetUniformLocation(shaderProg, "uMVMatrix")
  153.  
  154.  
  155. ## -----------------------------------------------------------------------------
  156.  
  157. proc InitializeBuffers() =
  158.  
  159. glGenBuffers(1, addr(vbo))
  160.  
  161. glBindBuffer(GL_ARRAY_BUFFER, vbo)
  162.  
  163. var vertices = [0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0]
  164.  
  165. glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT) * vertices.len, addr(vertices[0]), GL_STATIC_DRAW)
  166.  
  167.  
  168. ## -------------------------------------------------------------------------------
  169.  
  170. proc SetMatrixUniforms() =
  171. glUniformMatrix4fv(pMatrixUniLoc, 16, false, addr(pMatrix[0]))
  172. glUniformMatrix4fv(mvMatrixUniLoc, 16, false, addr(mvMatrix[0]))
  173.  
  174.  
  175.  
  176. ## -------------------------------------------------------------------------------
  177.  
  178. proc Initialize() =
  179.  
  180. if Init() == 0:
  181. write(stdout, "Could not initialize GLFW! \n")
  182.  
  183. OpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE)
  184.  
  185. if OpenWindow(cint(windowW), cint(windowH), 0, 0, 0, 0, 0, 0, GLFW_WINDOW) == 0:
  186. Terminate()
  187.  
  188.  
  189. SwapInterval(0)
  190.  
  191. openglInit()
  192.  
  193. InitializeGL()
  194.  
  195.  
  196. Resize(windowW, windowH)
  197.  
  198. lastTime = GetTime()
  199. lastFPSTime = lastTime
  200.  
  201.  
  202.  
  203. InitializeShaders()
  204.  
  205. InitializeBuffers()
  206.  
  207.  
  208.  
  209. ## -------------------------------------------------------------------------------
  210. proc Update() =
  211.  
  212. currentTime = GetTime()
  213.  
  214. frameDelta = currentTime - lastTime
  215.  
  216. lastTime = currentTime
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223. ## --------------------------------------------------------------------------------
  224.  
  225. proc Render() =
  226.  
  227. glClear(GL_COLOR_BUFFER_BIT)
  228.  
  229. glBindBuffer(GL_ARRAY_BUFFER, vbo)
  230.  
  231. glVertexAttribPointer(vertexPosAttrLoc, 3, cGL_FLOAT, false, 0, nil)
  232.  
  233. SetMatrixUniforms()
  234.  
  235. glDrawArrays(GL_TRIANGLES, 0, 3)
  236.  
  237. SwapBuffers()
  238.  
  239.  
  240.  
  241. ## --------------------------------------------------------------------------------
  242.  
  243. proc Run() =
  244.  
  245. while running:
  246.  
  247. Update()
  248.  
  249. Render()
  250.  
  251. running = GetKey(GLFW_KEY_ESC) == GLFW_RELEASE and
  252. GetWindowParam(GLFW_OPENED) == GL_TRUE
  253.  
  254.  
  255. ## ==============================================================================
  256.  
  257.  
  258.  
  259. Initialize()
  260.  
  261. Run()
  262.  
  263. Terminate()
Advertisement
Add Comment
Please, Sign In to add comment