Finally implemented lights like in zelda windwaker

This commit is contained in:
sergeypdev 2025-05-03 00:51:05 +04:00
parent 8fe95ce5a0
commit 19ca2f28b8
2 changed files with 45 additions and 7 deletions

View File

@ -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})
}
{

View File

@ -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)
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()
// rl.DrawMesh(mesh, rl.LoadMaterialDefault(), transform)
}