94 lines
2.1 KiB
Odin
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, light_shader, 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, light_shader, 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, light_shader, 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()
|
|
}
|