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