Initial commit.
This commit is contained in:
90
renderer.odin
Normal file
90
renderer.odin
Normal file
@@ -0,0 +1,90 @@
|
||||
package renderer
|
||||
|
||||
import "core:fmt"
|
||||
|
||||
RENDER_BACKEND_OPENGL :: #config(RENDER_BACKEND_OPENGL, false)
|
||||
RENDER_BACKEND_VULKAN :: #config(RENDER_BACKEND_VULKAN, false)
|
||||
RENDER_BACKEND_DIRECTX11 :: #config(RENDER_BACKEND_DIRECTX11, false)
|
||||
RENDER_BACKEND_METAL :: #config(RENDER_BACKEND_METAL, false)
|
||||
|
||||
Renderer :: struct {
|
||||
api: Renderer_API,
|
||||
|
||||
viewport: Viewport,
|
||||
surface_ptr: rawptr,
|
||||
backend: rawptr,
|
||||
}
|
||||
|
||||
Viewport :: struct {
|
||||
x, y, width, height: u16,
|
||||
}
|
||||
|
||||
Renderer_API :: enum {
|
||||
OpenGL,
|
||||
Vulkan,
|
||||
DirectX11,
|
||||
Metal,
|
||||
}
|
||||
|
||||
|
||||
create :: proc(surface_ptr: rawptr) -> (^Renderer, bool) {
|
||||
renderer := new(Renderer)
|
||||
renderer.surface_ptr = surface_ptr
|
||||
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
if !opengl_init(renderer) {
|
||||
fmt.printfln("Failed to initialize OpenGL.")
|
||||
destroy(renderer)
|
||||
return nil, false
|
||||
}
|
||||
}
|
||||
else {
|
||||
destroy(renderer)
|
||||
|
||||
fmt.printfln("Unhandled backend or no backend selected.")
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// TODO: SS - Init renderer using 'api'.
|
||||
return renderer, true
|
||||
}
|
||||
|
||||
set_viewport :: proc(renderer: ^Renderer, x, y, width, height: u16) {
|
||||
fmt.printfln("Setting viewport to %v:%v, %vx%v.", x, y, width, height)
|
||||
|
||||
renderer.viewport = {
|
||||
x = x,
|
||||
y = y,
|
||||
width = width,
|
||||
height = height,
|
||||
}
|
||||
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_viewport_changed(renderer)
|
||||
}
|
||||
}
|
||||
|
||||
set_clear_color :: proc(renderer: ^Renderer, color: [3]u8) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_set_clear_color(renderer, color)
|
||||
}
|
||||
}
|
||||
|
||||
render_frame :: proc(renderer: ^Renderer) {
|
||||
|
||||
}
|
||||
|
||||
swap_buffers :: proc(renderer: ^Renderer) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_swap_buffers(renderer)
|
||||
}
|
||||
}
|
||||
|
||||
destroy :: proc(renderer: ^Renderer) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_destroy(renderer)
|
||||
}
|
||||
|
||||
free(renderer)
|
||||
renderer^ = {}
|
||||
}
|
||||
Reference in New Issue
Block a user