gutter_runner/game/render/render.odin

76 lines
1.7 KiB
Odin

package render
import rl "libs:raylib"
import rlgl "libs:raylib/rlgl"
import gl "vendor:OpenGL"
// Used by vendor:OpenGL
rlgl_set_proc_address :: proc(p: rawptr, name: cstring) {
(^rawptr)(p)^ = rl.GetGLProcAddress(name)
}
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 {
model.materials[i].shader = shader
}
model.transform = transform
rl.DrawModel(model, rl.Vector3{}, 1, rl.WHITE)
}
draw_point_light :: proc(pos: rl.Vector3, radius: f32, color: rl.Color) {
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)
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)
}