Hi! I'm Eduardo Lávaque, and this is my blog.
Writing software for 10+ years. Eschew hype; focus on performance.
Living in Switzerland since 2017.
Hi! I'm Eduardo Lávaque, and this is my blog.
Writing software for 10+ years. Eschew hype; focus on performance.
Living in Switzerland since 2017.
Based in great part on the code in the following Gist, thank you to the original author!
GLFW, OpenGL Window Tutorial in Odin language
package main
import "core:fmt"
import "core:c"
import "vendor:glfw"
import gl "vendor:OpenGL"
GL_MAJOR_VERSION :: 4
GL_MINOR_VERSION :: 1
should_exit := false
main :: proc() {
fmt.println("Hellope!")
if glfw.Init() != glfw.TRUE {
fmt.println("Failed to initialize GLFW")
return
}
defer glfw.Terminate()
glfw.WindowHint(glfw.RESIZABLE, glfw.TRUE)
glfw.WindowHint(glfw.OPENGL_FORWARD_COMPAT, glfw.TRUE)
glfw.WindowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
glfw.WindowHint(glfw.CONTEXT_VERSION_MAJOR, GL_MAJOR_VERSION)
glfw.WindowHint(glfw.CONTEXT_VERSION_MINOR, GL_MINOR_VERSION)
window := glfw.CreateWindow(640, 480, "Todo", nil, nil)
defer glfw.DestroyWindow(window)
if window == nil {
fmt.println("Unable to create window")
return
}
glfw.MakeContextCurrent(window)
// Enable vsync
glfw.SwapInterval(1)
glfw.SetKeyCallback(window, key_callback)
glfw.SetMouseButtonCallback(window, mouse_callback)
glfw.SetCursorPosCallback(window, cursor_position_callback)
glfw.SetFramebufferSizeCallback(window, framebuffer_size_callback)
gl.load_up_to(GL_MAJOR_VERSION, GL_MINOR_VERSION, glfw.gl_set_proc_address)
for !glfw.WindowShouldClose(window) && !should_exit {
gl.ClearColor(0.2, 0.3, 0.3, 1.0)
gl.Clear(gl.COLOR_BUFFER_BIT) // clear with the color set above
glfw.SwapBuffers(window)
glfw.PollEvents()
}
}
key_callback :: proc "c" (window: glfw.WindowHandle, key, scancode, action, mods: i32) {
if key == glfw.KEY_ESCAPE && action == glfw.PRESS {
should_exit = true
}
}
mouse_callback :: proc "c" (window: glfw.WindowHandle, button, action, mods: i32) {}
cursor_position_callback :: proc "c" (window: glfw.WindowHandle, xpos, ypos: f64) {}
scroll_callback :: proc "c" (window: glfw.WindowHandle, xoffset, yoffset: f64) {}
framebuffer_size_callback :: proc "c" (window: glfw.WindowHandle, width, height: i32) {}
There are some changes we need to make from the code in the Gist.
In macOS one needs to specify GLFW_OPENGL_FORWARD_COMPAT and GLFW_OPENGL_PROFILE BEFORE the GLFW_CONTEXT_VERSION_MAJOR and GLFW_CONTEXT_VERSION_MINOR hints.
GLFW docs specify as much:
macOS: The OS only supports forward-compatible core profile contexts for OpenGL versions 3.2 and later. Before creating an OpenGL context of version 3.2 or later you must set the GLFW_OPENGL_FORWARD_COMPAT and GLFW_OPENGL_PROFILE hints accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.