diff --git a/game/game.odin b/game/game.odin index 31b35fb..3688e7c 100644 --- a/game/game.odin +++ b/game/game.odin @@ -712,6 +712,7 @@ draw :: proc() { rl.BeginDrawing() defer rl.EndDrawing() rl.ClearBackground(rl.GRAY) + render.clear_stencil() runtime_world := get_runtime_world() world := get_world() @@ -821,7 +822,7 @@ draw :: proc() { render.draw_model(car_model, basic_shader.shader, car_matrix) - render.draw_point_light(0, 2, rl.YELLOW) + render.draw_point_light(0, 2, rl.Color{255, 255, 255, 69}) } { diff --git a/game/render/render.odin b/game/render/render.odin index d1b879e..d5e00fb 100644 --- a/game/render/render.odin +++ b/game/render/render.odin @@ -13,6 +13,10 @@ init :: proc() { gl.load_up_to(3, 3, rlgl_set_proc_address) } +clear_stencil :: proc() { + gl.Clear(gl.STENCIL_BUFFER_BIT) +} + draw_model :: proc(model: rl.Model, shader: rl.Shader, transform: rl.Matrix) { model := model for i in 0 ..< model.materialCount { @@ -26,13 +30,46 @@ draw_model :: proc(model: rl.Model, shader: rl.Shader, transform: rl.Matrix) { draw_point_light :: proc(pos: rl.Vector3, radius: f32, color: rl.Color) { rlgl.DrawRenderBatchActive() - gl.StencilFunc(gl.ALWAYS, 1, 0) - defer gl.StencilFunc(gl.ALWAYS, 0, 0) + 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) - rlgl.SetCullFace(.FRONT) - rl.DrawSphere(pos, radius, color) + rl.DrawSphere(pos, radius, 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) + + rl.DrawSphere(pos, radius, color) + rlgl.DrawRenderBatchActive() + } + + { + gl.StencilOp(gl.KEEP, gl.KEEP, gl.ZERO) + gl.DepthFunc(gl.GREATER) + rlgl.SetCullFace(.FRONT) + + rl.DrawSphere(pos, radius, 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) + + rlgl.EnableDepthMask() - rlgl.DrawRenderBatchActive() - rlgl.SetCullFace(.BACK) // rl.DrawMesh(mesh, rl.LoadMaterialDefault(), transform) }