From 1c3810483a7d31eec2c26043a21c5a565df2a135 Mon Sep 17 00:00:00 2001 From: sergeypdev Date: Sat, 3 May 2025 18:24:51 +0400 Subject: [PATCH] Improve headlights, fix z fighting --- assets/ae86_lights.glb | 4 +- assets/shaders/light_ps.glsl | 2 +- game/game.odin | 24 ++++----- game/render/render.odin | 95 +++++++++++++++++++++--------------- libs/raylib/rlgl/rlgl.odin | 4 +- src_assets/ae86.blend | 4 +- src_assets/ae86.blend1 | 4 +- 7 files changed, 74 insertions(+), 63 deletions(-) diff --git a/assets/ae86_lights.glb b/assets/ae86_lights.glb index f51c655..5ddd81d 100644 --- a/assets/ae86_lights.glb +++ b/assets/ae86_lights.glb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f907ceece47f3914bf00d6c5010a41110c5dfda276273a8e0b3c6f68966a5380 -size 3888 +oid sha256:57117bf811097fe2497030cc8db0d02e9f24d9f65c407a58722fdd7403675943 +size 3020 diff --git a/assets/shaders/light_ps.glsl b/assets/shaders/light_ps.glsl index beb3b9d..c3b13c2 100644 --- a/assets/shaders/light_ps.glsl +++ b/assets/shaders/light_ps.glsl @@ -18,5 +18,5 @@ out vec4 finalColor; void main() { - finalColor = colDiffuse*fragColor; + finalColor = vec4(colDiffuse.rgb, colDiffuse.a * fragColor.x); } diff --git a/game/game.odin b/game/game.odin index 55d79c1..56fe0e7 100644 --- a/game/game.odin +++ b/game/game.odin @@ -712,7 +712,7 @@ draw :: proc() { rl.BeginDrawing() defer rl.EndDrawing() rl.ClearBackground(rl.GRAY) - render.clear_stencil() + render.clear_stencil() runtime_world := get_runtime_world() world := get_world() @@ -822,7 +822,11 @@ draw :: proc() { render.draw_model(car_model, basic_shader.shader, car_matrix) - render.draw_mesh_light(assets.get_model(&g_mem.assetman, "assets/ae86_lights.glb"), car_matrix, rl.Color{255, 255, 255, 100}) + render.draw_mesh_light( + assets.get_model(&g_mem.assetman, "assets/ae86_lights.glb"), + car_matrix, + rl.Color{255, 255, 255, 100}, + ) } { @@ -984,11 +988,7 @@ draw :: proc() { new_point_pos := points[0] - tangent * 4 - if (spline_handle( - new_point_pos, - camera, - false, - )) { + if (spline_handle(new_point_pos, camera, false)) { inject_at(&world.track.points, 0, new_point_pos) log.debugf("add point before 0") } @@ -1006,11 +1006,7 @@ draw :: proc() { new_point_pos := points[points_len - 1] + tangent * 4 - if (spline_handle( - new_point_pos, - camera, - false, - )) { + if (spline_handle(new_point_pos, camera, false)) { inject_at(&world.track.points, points_len - 1 + 1, new_point_pos) log.debugf("add point before 0") } @@ -1111,8 +1107,6 @@ game_init_window :: proc(args: []string) { init_physfs(args) - render.init() - rl.SetConfigFlags({.WINDOW_RESIZABLE, .VSYNC_HINT}) rl.InitWindow(1280, 720, "Odin + Raylib + Hot Reload template!") rl.SetExitKey(.KEY_NULL) @@ -1172,7 +1166,7 @@ game_memory_size :: proc() -> int { game_hot_reloaded :: proc(mem: rawptr) { g_mem = (^Game_Memory)(mem) - render.init() + render.init(&g_mem.assetman) g_mem.runtime_world.orbit_camera.distance = 4 } diff --git a/game/render/render.odin b/game/render/render.odin index 8b767d5..bda2ddf 100644 --- a/game/render/render.odin +++ b/game/render/render.odin @@ -1,76 +1,93 @@ package render +import "game:assets" import rl "libs:raylib" import rlgl "libs:raylib/rlgl" import gl "vendor:OpenGL" +@(private = "file") +assetman: ^assets.Asset_Manager + // Used by vendor:OpenGL rlgl_set_proc_address :: proc(p: rawptr, name: cstring) { (^rawptr)(p)^ = rl.GetGLProcAddress(name) } -init :: proc() { +init :: proc(in_assetman: ^assets.Asset_Manager) { + assetman = in_assetman gl.load_up_to(3, 3, rlgl_set_proc_address) + rlgl.SetClipPlanes(0.1, 10000) } clear_stencil :: proc() { - gl.Clear(gl.STENCIL_BUFFER_BIT) + gl.Clear(gl.STENCIL_BUFFER_BIT) } -draw_model :: proc(model: rl.Model, shader: rl.Shader, transform: rl.Matrix) { +draw_model :: proc( + model: rl.Model, + shader: rl.Shader, + transform: rl.Matrix, + color: rl.Color = rl.WHITE, +) { model := model for i in 0 ..< model.materialCount { model.materials[i].shader = shader } model.transform = transform - rl.DrawModel(model, rl.Vector3{}, 1, rl.WHITE) + rl.DrawModel(model, rl.Vector3{}, 1, color) } draw_mesh_light :: proc(model: rl.Model, transform: rl.Matrix, color: rl.Color) { - model := model - model.transform = transform + model := model + model.transform = transform + + light_shader := assets.get_shader(assetman, nil, "assets/shaders/light_ps.glsl", {}).shader rlgl.DrawRenderBatchActive() - gl.Enable(gl.STENCIL_TEST) - defer gl.Disable(gl.STENCIL_TEST) - { - gl.StencilFunc(gl.ALWAYS, 1, ~u32(0)) - gl.StencilOp(gl.KEEP, gl.KEEP, gl.REPLACE) - gl.DepthFunc(gl.GREATER) - rlgl.DisableDepthMask() - gl.ColorMask(false, false, false, false) - rlgl.SetCullFace(.FRONT) + gl.Enable(gl.STENCIL_TEST) + defer gl.Disable(gl.STENCIL_TEST) + { + gl.StencilFunc(gl.ALWAYS, 1, ~u32(0)) + gl.StencilOp(gl.KEEP, gl.KEEP, gl.REPLACE) + gl.DepthFunc(gl.GREATER) + rlgl.DisableDepthMask() + gl.ColorMask(false, false, false, false) + rlgl.SetCullFace(.FRONT) - rl.DrawModel(model, {}, 1, color) - rlgl.DrawRenderBatchActive() - } + draw_model(model, light_shader, transform, color) + rlgl.DrawRenderBatchActive() + } - { - gl.StencilFunc(gl.EQUAL, 1, ~u32(0)) - gl.StencilOp(gl.ZERO, gl.ZERO, gl.ZERO) - gl.DepthFunc(gl.LEQUAL) - gl.ColorMask(true, true, true, true) - rlgl.SetCullFace(.BACK) + // Draw outside light + { + gl.StencilFunc(gl.EQUAL, 1, ~u32(0)) + gl.StencilOp(gl.KEEP, gl.ZERO, gl.ZERO) + gl.DepthFunc(gl.LEQUAL) + gl.ColorMask(true, true, true, true) + rlgl.SetCullFace(.BACK) - rl.DrawModel(model, {}, 1, color) - rlgl.DrawRenderBatchActive() - } + draw_model(model, light_shader, transform, color) + rlgl.DrawRenderBatchActive() + } - { - gl.StencilOp(gl.KEEP, gl.KEEP, gl.ZERO) - gl.DepthFunc(gl.GREATER) - rlgl.SetCullFace(.FRONT) + // Light when camera is inside + if true { + gl.StencilOp(gl.KEEP, gl.KEEP, gl.ZERO) + gl.DepthFunc(gl.GREATER) + rlgl.SetCullFace(.FRONT) - rl.DrawModel(model, {}, 1, color) - rlgl.DrawRenderBatchActive() - } + draw_model(model, light_shader, transform, color) + rlgl.DrawRenderBatchActive() + } - gl.StencilFunc(gl.ALWAYS, 0, ~u32(0)) - gl.StencilOp(gl.KEEP, gl.KEEP, gl.KEEP) - rlgl.SetCullFace(.BACK) - gl.DepthFunc(gl.LEQUAL) + gl.Clear(gl.STENCIL_BUFFER_BIT) - rlgl.EnableDepthMask() + gl.StencilFunc(gl.ALWAYS, 0, ~u32(0)) + gl.StencilOp(gl.KEEP, gl.KEEP, gl.KEEP) + rlgl.SetCullFace(.BACK) + gl.DepthFunc(gl.LEQUAL) + + rlgl.EnableDepthMask() } diff --git a/libs/raylib/rlgl/rlgl.odin b/libs/raylib/rlgl/rlgl.odin index 04b4354..901bf68 100644 --- a/libs/raylib/rlgl/rlgl.odin +++ b/libs/raylib/rlgl/rlgl.odin @@ -125,8 +125,7 @@ when ODIN_OS == .Windows { } else when ODIN_OS == .Linux { foreign import lib {// Note(bumbread): I'm not sure why in `linux/` folder there are // multiple copies of raylib.so, but since these bindings are for - // particular version of the library, I better specify it. Ideally, - "../src/libraylib.so.550" when RAYLIB_SHARED else "../src/libraylib.a", "system:dl", "system:pthread"}// though, it's best specified in terms of major (.so.4) + "../src/libraylib.so.550" when RAYLIB_SHARED else "../src/libraylib.a", "system:dl", "system:pthread"} // particular version of the library, I better specify it. Ideally,// though, it's best specified in terms of major (.so.4) } else when ODIN_OS == .Darwin { foreign import lib {"../macos" + ("-arm64" when ODIN_ARCH == .arm64 else "") + "/libraylib" + (".500.dylib" when RAYLIB_SHARED else ".a"), "system:Cocoa.framework", "system:OpenGL.framework", "system:IOKit.framework"} @@ -364,6 +363,7 @@ foreign lib { Frustum :: proc(left, right, bottom, top, znear, zfar: f64) --- Ortho :: proc(left, right, bottom, top, znear, zfar: f64) --- Viewport :: proc(x, y, width, height: c.int) --- // Set the viewport area + SetClipPlanes :: proc(nearPlane, farPlane: f64) --- // Set clip planes //------------------------------------------------------------------------------------ // Functions Declaration - Vertex level operations diff --git a/src_assets/ae86.blend b/src_assets/ae86.blend index b145880..12cbb14 100644 --- a/src_assets/ae86.blend +++ b/src_assets/ae86.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6904d020be88d9bef859c93370380331f460c980fb16eecd3483a9cb93de1f8 -size 3860409 +oid sha256:29d30226de50e1469bbd3849337c80e9c3586ea60547d8895ccf5721c196acbb +size 3862106 diff --git a/src_assets/ae86.blend1 b/src_assets/ae86.blend1 index 885204f..d8f0fee 100644 --- a/src_assets/ae86.blend1 +++ b/src_assets/ae86.blend1 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbe4c8c906a122a90c6aa2df96b632d160e7133ecfa0d327913e7f4f66110213 -size 3964900 +oid sha256:aa14ad42732cb594747b88c5e64906c4f02598e46f07fa59d9d586f351efbb32 +size 3859839