tiny_game_framework/graphics/
light.rs

1use gl::UseProgram;
2use glam::{vec3, Vec3};
3
4use std::ffi::CString;
5
6use crate::{cstr, Renderer, Shader};
7
8#[derive(Copy, Clone)]
9pub struct Light {
10    pub position: Vec3,
11    pub color: Vec3,
12}
13
14impl Renderer {
15    pub unsafe fn send_light_uniforms(&self, shader: &Shader) {
16        shader.use_shader();
17        shader.uniform_vec3f(cstr!("viewPos"), &self.camera.pos);
18        shader.uniform_1i(cstr!("num_lights"), self.lights.len() as i32);
19        let mut i = 0;
20        for light in self.lights.values() {
21            shader.uniform_vec3f(cstr!(format!("lightColor[{}]", i)), &light.color);
22            shader.uniform_vec3f(cstr!(format!("lightPos[{}]", i)), &light.position);
23
24            i+=1;
25        }
26        UseProgram(0);
27    }
28
29    pub fn add_light(&mut self, name: &str, light: Light) {
30        self.lights.insert(name.to_string(), light);
31    }
32
33    pub fn get_light(&self, name: &str) -> Option<&Light> {
34        self.lights.get(name)
35    }
36
37    pub fn get_light_mut(&mut self, name: &str) -> Option<&mut Light> {
38        self.lights.get_mut(name)
39    }
40}