Added camera, use MVP.
This commit is contained in:
@@ -15,12 +15,21 @@ Renderer :: struct {
|
||||
backend: rawptr,
|
||||
|
||||
pipeline: Pipeline,
|
||||
|
||||
active_camera: ^Camera,
|
||||
}
|
||||
|
||||
Viewport :: struct {
|
||||
x, y, width, height: u16,
|
||||
}
|
||||
|
||||
get_aspect_ratio :: proc(renderer: ^Renderer) -> f32 {
|
||||
assert(renderer != nil)
|
||||
|
||||
viewport := &renderer.viewport
|
||||
return f32(viewport.width) / f32(viewport.height)
|
||||
}
|
||||
|
||||
RGB_Color :: [3]u8
|
||||
RGBA_Color :: [4]u8
|
||||
|
||||
@@ -46,7 +55,7 @@ create :: proc(surface_ptr: rawptr) -> (^Renderer, bool) {
|
||||
}
|
||||
|
||||
set_viewport :: proc(renderer: ^Renderer, x, y, width, height: u16) {
|
||||
fmt.printfln("Setting viewport to %v:%v, %vx%v.", x, y, width, height)
|
||||
log.infof("Setting viewport to %v:%v, %vx%v.", x, y, width, height)
|
||||
|
||||
renderer.viewport = {
|
||||
x = x,
|
||||
@@ -66,39 +75,50 @@ set_viewport :: proc(renderer: ^Renderer, x, y, width, height: u16) {
|
||||
}
|
||||
}
|
||||
|
||||
@(private="file") clear_screen :: proc(renderer: ^Renderer) { // TODO: SS - Add options here to say if you want to clear depth or not, for example.
|
||||
@(private="file") clear_screen :: proc(renderer: ^Renderer, clear_depth: bool) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_clear_screen(renderer)
|
||||
opengl_clear_screen(renderer, clear_depth)
|
||||
}
|
||||
}
|
||||
|
||||
render_frame :: proc(renderer: ^Renderer) {
|
||||
if renderer.active_camera == nil {
|
||||
fmt.printfln("No active camera!")
|
||||
return
|
||||
}
|
||||
|
||||
view_matrix, view_matrix_ok := get_camera_view_matrix(renderer.active_camera)
|
||||
assert(view_matrix_ok)
|
||||
projection_matrix, projection_matrix_ok := get_camera_projection_matrix(renderer, renderer.active_camera)
|
||||
assert(projection_matrix_ok)
|
||||
|
||||
pipeline := &renderer.pipeline
|
||||
for i in 0 ..< pipeline.amount_of_passes {
|
||||
pass := pipeline.passes[i]
|
||||
|
||||
set_clear_color(renderer, pass.clear_color)
|
||||
clear_screen(renderer)
|
||||
clear_screen(renderer, pass.should_clear_depth)
|
||||
enable_depth_testing(renderer, pass.should_test_depth)
|
||||
|
||||
for i in 0..<pass.draw_command_count {
|
||||
command := &pass.draw_commands[i]
|
||||
|
||||
transform := linalg.identity(linalg.Matrix4x4f32)
|
||||
model_matrix := linalg.identity(linalg.Matrix4x4f32)
|
||||
|
||||
scale := linalg.matrix4_scale(command.scale)
|
||||
rotation := linalg.matrix4_rotate(0, [3]f32 { 0, 0, 1 })
|
||||
rotation := linalg.matrix4_rotate(linalg.to_radians(f32(0.0)), [3]f32 { 1, 0, 0 })
|
||||
translation := linalg.matrix4_translate(command.position)
|
||||
|
||||
// Scale.
|
||||
transform *= scale
|
||||
model_matrix *= scale
|
||||
|
||||
// Rotate.
|
||||
transform *= rotation
|
||||
model_matrix *= rotation
|
||||
|
||||
// Translate.
|
||||
transform *= translation
|
||||
model_matrix *= translation
|
||||
|
||||
activate_material(&command.material, transform)
|
||||
activate_material(&command.material, model_matrix, view_matrix, projection_matrix)
|
||||
|
||||
draw_mesh(&command.mesh)
|
||||
}
|
||||
@@ -112,6 +132,8 @@ render_frame :: proc(renderer: ^Renderer) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_swap_buffers(renderer)
|
||||
}
|
||||
|
||||
clear_screen(renderer, true)
|
||||
}
|
||||
|
||||
destroy :: proc(renderer: ^Renderer) {
|
||||
@@ -123,11 +145,11 @@ destroy :: proc(renderer: ^Renderer) {
|
||||
free(renderer)
|
||||
}
|
||||
|
||||
@(private) activate_material :: proc(material: ^Material, transform: linalg.Matrix4x4f32) {
|
||||
@(private) activate_material :: proc(material: ^Material, model_matrix, view_matrix, projection_matrix: linalg.Matrix4x4f32) {
|
||||
assert(material != nil)
|
||||
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_activate_material(material, transform)
|
||||
opengl_activate_material(material, model_matrix, view_matrix, projection_matrix)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,4 +159,10 @@ destroy :: proc(renderer: ^Renderer) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_draw_mesh(mesh)
|
||||
}
|
||||
}
|
||||
|
||||
@(private) enable_depth_testing :: proc(renderer: ^Renderer, enable: bool) {
|
||||
when RENDER_BACKEND_OPENGL {
|
||||
opengl_enable_depth_testing(renderer, true)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user