Letterbox, maintain render-resolution's aspect ratio

This commit is contained in:
2026-02-05 17:00:21 +01:00
parent 3b32097c56
commit cb19295575
6 changed files with 153 additions and 47 deletions

View File

@@ -90,21 +90,23 @@ when RENDER_BACKEND_OPENGL {
return true
}
opengl_viewport_changed :: proc(renderer: ^Renderer) {
@(private) opengl_apply_renderer_viewport :: proc(renderer: ^Renderer) {
gl.Viewport(
i32(renderer.viewport.x), i32(renderer.viewport.y),
i32(renderer.viewport.width), i32(renderer.viewport.height)
i32(renderer.viewport.res.width), i32(renderer.viewport.res.height)
)
}
opengl_viewport_changed :: proc(renderer: ^Renderer) {
opengl_apply_renderer_viewport(renderer)
}
opengl_set_vsync :: proc(renderer: ^Renderer, on: bool) -> bool {
if win.wglSwapIntervalEXT == nil {
fmt.printfln("'wglSwapIntervalEXT' is nil.")
return false
}
// Kommer inte in hit.
win.wglSwapIntervalEXT(on ? 1 : 0)
return true
@@ -121,7 +123,17 @@ when RENDER_BACKEND_OPENGL {
gl.ClearColor(r, g, b, a)
}
opengl_clear_screen :: proc(renderer: ^Renderer, clear_color: bool, clear_depth: bool) {
opengl_clear_screen :: proc(renderer: ^Renderer, clear_color, clear_depth, scissor: bool) {
if scissor {
gl.Enable(gl.SCISSOR_TEST)
gl.Scissor(
i32(renderer.viewport.x),
i32(renderer.viewport.y),
i32(renderer.viewport.res.width),
i32(renderer.viewport.res.height)
)
}
flags := u32(0)
if clear_color {
flags |= gl.COLOR_BUFFER_BIT
@@ -130,6 +142,10 @@ when RENDER_BACKEND_OPENGL {
flags |= gl.DEPTH_BUFFER_BIT
}
gl.Clear(flags)
if scissor {
gl.Disable(gl.SCISSOR_TEST)
}
}
opengl_swap_buffers :: proc(renderer: ^Renderer) {
@@ -208,6 +224,18 @@ when RENDER_BACKEND_OPENGL {
return m, true
}
opengl_delete_mesh :: proc(renderer: ^Renderer, mesh: ^Mesh) {
if mesh == nil { return }
gl.DeleteBuffers(1, &mesh.backend.vbo)
gl.DeleteBuffers(1, &mesh.backend.ebo)
gl.DeleteVertexArrays(1, &mesh.backend.vao)
mesh.backend.vbo = 0
mesh.backend.ebo = 0
mesh.backend.vao = 0
}
opengl_create_shader :: proc(renderer: ^Renderer, type: Shader_Type, path: string, data: []u8) -> (Shader_OpenGL, bool) {
handle: u32
@@ -544,12 +572,7 @@ when RENDER_BACKEND_OPENGL {
if rt == nil {
gl.BindFramebuffer(gl.FRAMEBUFFER, 0)
gl.Viewport(
0,
0,
i32(renderer.viewport.width),
i32(renderer.viewport.height),
)
opengl_apply_renderer_viewport(renderer)
return
}