gutter_runner/game/render/render.odin
2025-05-23 17:42:10 +04:00

94 lines
2.1 KiB
Odin

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(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)
}
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, color)
}
draw_mesh_light :: proc(model: rl.Model, transform: rl.Matrix, color: rl.Color) {
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)
draw_model(model, {}, transform, color)
rlgl.DrawRenderBatchActive()
}
// 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)
draw_model(model, {}, transform, color)
rlgl.DrawRenderBatchActive()
}
// Light when camera is inside
if true {
gl.StencilOp(gl.KEEP, gl.KEEP, gl.ZERO)
gl.DepthFunc(gl.GREATER)
rlgl.SetCullFace(.FRONT)
draw_model(model, {}, transform, color)
rlgl.DrawRenderBatchActive()
}
gl.Clear(gl.STENCIL_BUFFER_BIT)
gl.StencilFunc(gl.ALWAYS, 0, ~u32(0))
gl.StencilOp(gl.KEEP, gl.KEEP, gl.KEEP)
rlgl.SetCullFace(.BACK)
gl.DepthFunc(gl.LEQUAL)
rlgl.EnableDepthMask()
}