tiny_game_framework/graphics/
light.rs1use 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}