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