Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import nimgl/[glfw, opengl]
- import glm
- import shader
- type Vertex {.packed.} = object
- color: array[4, GLfloat]
- position: array[3, GLfloat]
- proc newVertex(color: array[4, GLfloat], position: array[3, GLfloat]): Vertex = Vertex(color: color, position: position)
- var vertssep: array[4, Vertex] = [
- newVertex([0.11f, 0.8f, 0.76f, 1.0f], [-0.5f, -0.5f, 0.0f]),
- newVertex([0.1f, 0.9f, 0.12f, 1.0f], [-0.5f, 0.5f, 0.0f]),
- newVertex([0.12f, 0.9f, 0.1f, 1.0f], [0.5f, 0.5f, 0.0f]),
- newVertex([0.12f, 0.1f, 0.9f, 1.0f], [0.5f, -0.5f, 0.0f])
- ]
- var verts = cast[array[(sizeof(vertssep) / sizeof(GLfloat)).int, GLfloat]](vertssep)
- var elems: array[6, GLuint] = [
- 0'u32, 1'u32, 2'u32,
- 0'u32, 2'u32, 3'u32
- ]
- echo offsetOf(Vertex, position)
- echo GLfloat.sizeof * 4
- echo verts.repr
- proc main: void =
- assert glfwInit()
- glfwWindowHint(GLFWContextVersionMajor, 3)
- glfwWindowHint(GLFWContextVersionMinor, 3)
- glfwWindowHint(GLFWOpenglForwardCompat, GLFW_TRUE) # Used for Mac
- glfwWindowHint(GLFWOpenglProfile, GLFW_OPENGL_CORE_PROFILE)
- glfwWindowHint(GLFWResizable, GLFW_FALSE)
- let w: GLFWWindow = glfwCreateWindow(800, 600, "NimGL", nil, nil)
- assert w != nil
- w.makeContextCurrent()
- assert glInit()
- # create vertex array object
- var vao: GLuint
- glGenVertexArrays(1, vao.addr)
- glBindVertexArray(vao)
- # create vertex buffer object, and copy vertex data
- var vbo: GLuint
- glGenBuffers(1, vbo.addr)
- glBindBuffer(GL_ARRAY_BUFFER, vbo)
- glBufferData(GL_ARRAY_BUFFER, cint(GLFloat.sizeof * verts.len), verts[0].addr, GL_STATIC_DRAW)
- # create an element arrray
- var ebo: GLuint
- glGenBuffers(1, ebo.addr)
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, cint(GLuint.sizeof * elems.len), elems[0].addr, GL_STATIC_DRAW)
- var pid = compileShader()
- glUseProgram(pid)
- # Colour
- glEnableVertexAttribArray(0)
- glVertexAttribPointer(0, 4, EGL_FLOAT, false, GLfloat.sizeof * 7, cast[pointer](offsetOf(Vertex, color)))
- # Position
- glEnableVertexAttribArray(1)
- glVertexAttribPointer(1, 3, EGL_FLOAT, false, GLfloat.sizeof * 7, cast[pointer](offsetOf(Vertex, position)))
- while not w.windowShouldClose:
- glClearColor(0.266f, 0.466f, 0.698f, 1.0f)
- glClear(GL_COLOR_BUFFER_BIT)
- glBindVertexArray(vao)
- glDrawElements(GL_TRIANGLES, elems.len.cint, GL_UNSIGNED_INT, cast[pointer](0))
- w.swapBuffers()
- glfwPollEvents()
- w.destroyWindow()
- glfwTerminate()
- glDeleteVertexArrays(1, vao.addr)
- glDeleteBuffers(1, vbo.addr)
- main()
Advertisement
Add Comment
Please, Sign In to add comment