Senior software engineer with 9+ years of experience. Eschew hype; focus on delivery and performance.
Living in Switzerland 🇨🇠since 2017.
Senior software engineer with 9+ years of experience. Eschew hype; focus on delivery and 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.