Guest User

Untitled

a guest
Dec 25th, 2021
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. import nimgl/[glfw, opengl]
  2. import glm
  3. import shader
  4.  
  5. type Vertex {.packed.} = object
  6. color: array[4, GLfloat]
  7. position: array[3, GLfloat]
  8. proc newVertex(color: array[4, GLfloat], position: array[3, GLfloat]): Vertex = Vertex(color: color, position: position)
  9.  
  10. var vertssep: array[4, Vertex] = [
  11. newVertex([0.11f, 0.8f, 0.76f, 1.0f], [-0.5f, -0.5f, 0.0f]),
  12. newVertex([0.1f, 0.9f, 0.12f, 1.0f], [-0.5f, 0.5f, 0.0f]),
  13. newVertex([0.12f, 0.9f, 0.1f, 1.0f], [0.5f, 0.5f, 0.0f]),
  14. newVertex([0.12f, 0.1f, 0.9f, 1.0f], [0.5f, -0.5f, 0.0f])
  15. ]
  16. var verts = cast[array[(sizeof(vertssep) / sizeof(GLfloat)).int, GLfloat]](vertssep)
  17.  
  18. var elems: array[6, GLuint] = [
  19. 0'u32, 1'u32, 2'u32,
  20. 0'u32, 2'u32, 3'u32
  21. ]
  22.  
  23. echo offsetOf(Vertex, position)
  24. echo GLfloat.sizeof * 4
  25. echo verts.repr
  26.  
  27. proc main: void =
  28.  
  29. assert glfwInit()
  30.  
  31. glfwWindowHint(GLFWContextVersionMajor, 3)
  32. glfwWindowHint(GLFWContextVersionMinor, 3)
  33. glfwWindowHint(GLFWOpenglForwardCompat, GLFW_TRUE) # Used for Mac
  34. glfwWindowHint(GLFWOpenglProfile, GLFW_OPENGL_CORE_PROFILE)
  35. glfwWindowHint(GLFWResizable, GLFW_FALSE)
  36.  
  37. let w: GLFWWindow = glfwCreateWindow(800, 600, "NimGL", nil, nil)
  38. assert w != nil
  39.  
  40. w.makeContextCurrent()
  41.  
  42. assert glInit()
  43.  
  44. # create vertex array object
  45. var vao: GLuint
  46. glGenVertexArrays(1, vao.addr)
  47. glBindVertexArray(vao)
  48.  
  49. # create vertex buffer object, and copy vertex data
  50. var vbo: GLuint
  51. glGenBuffers(1, vbo.addr)
  52. glBindBuffer(GL_ARRAY_BUFFER, vbo)
  53. glBufferData(GL_ARRAY_BUFFER, cint(GLFloat.sizeof * verts.len), verts[0].addr, GL_STATIC_DRAW)
  54.  
  55. # create an element arrray
  56. var ebo: GLuint
  57. glGenBuffers(1, ebo.addr)
  58. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
  59. glBufferData(GL_ELEMENT_ARRAY_BUFFER, cint(GLuint.sizeof * elems.len), elems[0].addr, GL_STATIC_DRAW)
  60.  
  61. var pid = compileShader()
  62. glUseProgram(pid)
  63.  
  64. # Colour
  65. glEnableVertexAttribArray(0)
  66. glVertexAttribPointer(0, 4, EGL_FLOAT, false, GLfloat.sizeof * 7, cast[pointer](offsetOf(Vertex, color)))
  67.  
  68. # Position
  69. glEnableVertexAttribArray(1)
  70. glVertexAttribPointer(1, 3, EGL_FLOAT, false, GLfloat.sizeof * 7, cast[pointer](offsetOf(Vertex, position)))
  71.  
  72. while not w.windowShouldClose:
  73. glClearColor(0.266f, 0.466f, 0.698f, 1.0f)
  74. glClear(GL_COLOR_BUFFER_BIT)
  75.  
  76. glBindVertexArray(vao)
  77. glDrawElements(GL_TRIANGLES, elems.len.cint, GL_UNSIGNED_INT, cast[pointer](0))
  78.  
  79. w.swapBuffers()
  80. glfwPollEvents()
  81.  
  82. w.destroyWindow()
  83. glfwTerminate()
  84.  
  85. glDeleteVertexArrays(1, vao.addr)
  86. glDeleteBuffers(1, vbo.addr)
  87.  
  88. main()
Advertisement
Add Comment
Please, Sign In to add comment