package renderer import "core:fmt" import gl "vendor:OpenGL" import win "core:sys/windows" when RENDER_BACKEND_OPENGL { Backend_OpenGL_Windows :: struct { hwnd: win.HWND, hdc: win.HDC, gl_context: win.HGLRC, } backend: Backend_OpenGL_Windows opengl_init :: proc(renderer: ^Renderer) -> bool { renderer.backend = &backend backend.hwnd = win.HWND(renderer.surface_ptr) backend.hdc = win.GetDC(backend.hwnd) pfd := win.PIXELFORMATDESCRIPTOR { nSize = size_of(win.PIXELFORMATDESCRIPTOR), nVersion = 1, dwFlags = win.PFD_DRAW_TO_WINDOW | win.PFD_SUPPORT_OPENGL | win.PFD_DOUBLEBUFFER, iPixelType = win.PFD_TYPE_RGBA, cColorBits = 32, cDepthBits = 24, cStencilBits = 8, iLayerType = win.PFD_MAIN_PLANE, } format_index := win.ChoosePixelFormat(backend.hdc, &pfd) assert(format_index != 0, "ChoosePixelFormat failed") set_pixel_format_ok := win.SetPixelFormat(backend.hdc, format_index, &pfd) assert(set_pixel_format_ok == win.TRUE, "SetPixelFormat failed") backend.gl_context = win.wglCreateContext(backend.hdc) assert(backend.gl_context != nil, "Failed to create OpenGL context") win.wglMakeCurrent(backend.hdc, backend.gl_context) // fmt.printfln("GL Context: %v", backend.gl_context) gl.load_up_to(3, 3, proc(p: rawptr, name: cstring) { addr := win.wglGetProcAddress(name) if addr == nil { dll := win.LoadLibraryW(win.utf8_to_wstring("opengl32.dll")) addr = win.GetProcAddress(dll, name) } (^rawptr)(p)^ = addr }) opengl_swap_buffers(renderer) return true } opengl_viewport_changed :: proc(renderer: ^Renderer) { gl.Clear(gl.COLOR_BUFFER_BIT) gl.Viewport( i32(renderer.viewport.x), i32(renderer.viewport.y), i32(renderer.viewport.width), i32(renderer.viewport.height) ) } opengl_set_clear_color :: proc(renderer: ^Renderer, color: [3]u8) { gl.ClearColor( f32(color.r) / f32(max(u8)), f32(color.g) / f32(max(u8)), f32(color.b) / f32(max(u8)), 1.0 ) } opengl_swap_buffers :: proc(renderer: ^Renderer) { gl.Clear(gl.COLOR_BUFFER_BIT) win.SwapBuffers(backend.hdc) } opengl_destroy :: proc(renderer: ^Renderer) { win.wglMakeCurrent(nil, nil) win.wglDeleteContext(backend.gl_context) win.ReleaseDC(backend.hwnd, backend.hdc) backend = {} } }