77 lines
1.7 KiB
Odin
77 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_mesh_light :: proc(model: rl.Model, transform: rl.Matrix, color: rl.Color) {
|
|
model := model
|
|
model.transform = transform
|
|
|
|
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.DrawModel(model, {}, 1, 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.DrawModel(model, {}, 1, color)
|
|
rlgl.DrawRenderBatchActive()
|
|
}
|
|
|
|
{
|
|
gl.StencilOp(gl.KEEP, gl.KEEP, gl.ZERO)
|
|
gl.DepthFunc(gl.GREATER)
|
|
rlgl.SetCullFace(.FRONT)
|
|
|
|
rl.DrawModel(model, {}, 1, 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()
|
|
}
|