bowtie/bowtie/
controller.rs1use crate::{
2 general::color::COLORS,
3 gl_utils::{
4 gl_translation::{DataType, DrawingMode, UsageMode},
5 shader_creator::{
6 Shader, ShaderProgram, VertexShaderAttribute, VertexShaderAttributeType,
7 },
8 vertex_array_object_handler::VertexArrayObject,
9 },
10 rendering::drawer::Drawer,
11};
12
13use super::entity::Entity;
14
15pub struct BowTie<'d> {
19 entities: Vec<*mut dyn Entity<'d>>,
20 drawer: Drawer<'d>,
21 shading_program: ShaderProgram,
22 _vao: VertexArrayObject,
23}
24
25fn get_program() -> ShaderProgram {
28 let mut program = ShaderProgram::new();
29 program.load_shaders(vec![
30 Shader::VertexShader(
31 String::from("main"),
32 vec![
33 VertexShaderAttribute::new(
34 String::from("position"),
35 DataType::Float32,
36 2,
37 9 + (4 * 4),
38 true,
39 0,
40 VertexShaderAttributeType::Vector,
41 ),
42 VertexShaderAttribute::new(
43 String::from("targetColor"),
44 DataType::Float32,
45 4,
46 9 + (4 * 4),
47 true,
48 2,
49 VertexShaderAttributeType::Vector,
50 ),
51 VertexShaderAttribute::new(
52 String::from("tex_cords_in"),
53 DataType::Float32,
54 2,
55 9 + (4 * 4),
56 true,
57 6,
58 VertexShaderAttributeType::Vector,
59 ),
60 VertexShaderAttribute::new(
61 String::from("tex_id"),
62 DataType::Float32,
63 1,
64 9 + (4 * 4),
65 true,
66 8,
67 VertexShaderAttributeType::Vector,
68 ),
69 VertexShaderAttribute::new(
70 String::from("trans"),
71 DataType::Float32,
72 4,
73 9 + (4 * 4),
74 true,
75 9,
76 VertexShaderAttributeType::Matrix4,
77 ),
78 ],
79 ),
80 Shader::FragmentShader(String::from("main")),
81 ]);
82 program
83}
84
85impl<'d> BowTie<'d> {
86 pub fn new() -> BowTie<'d> {
87 let _vao = VertexArrayObject::new();
88 BowTie {
89 entities: vec![],
90 drawer: Drawer::new(UsageMode::StaticDraw),
91 shading_program: get_program(),
92 _vao,
93 }
94 }
95
96 pub fn load_entity<'g>(&'g mut self, entity: *mut dyn Entity<'d>) {
99 self.entities.push(entity);
100 unsafe {
101 let drawable = (*self.entities[self.entities.len() - 1]).get_drawable();
102 self.drawer.load_sprite_dynamic(drawable);
103 }
104 }
105
106 pub fn unload_entity<'g>(&'g mut self, entity: *mut dyn Entity<'d>) {
107 let pos_option = self.entities.iter().position(|entity_ref| entity_ref.to_owned() == entity.to_owned());
108
109 match pos_option {
110 Some(pos) => {
111 unsafe {
112 let drawable = (*self.entities[pos]).get_drawable();
113 self.drawer.unload_sprite_dynamic(drawable);
114 }
115 self.entities.remove(pos);
116 }
117 None => {}
118 }
119
120 }
121
122 pub fn update_entities(&mut self) {
124 for entity in self.entities.to_owned() {
125 unsafe {
126 for comp in entity.as_mut().unwrap().get_components() {
127 let mut entities_copy = self.entities.to_owned();
128 let entity_clown = entity.to_owned();
129 let message =
130 comp.as_mut().unwrap().act(&mut entities_copy, entity_clown);
131 match message {
132 Some(m) => entity.as_mut().unwrap().recieve_message(m),
133 None => {}
134 }
135 }
136 }
137 }
138 }
139
140 pub fn prep_for_render(&self) {
143 self.shading_program.use_program();
144 self.drawer.prep_textures(&self.shading_program);
145 }
146
147 pub fn draw_entities(&mut self) {
149 self.drawer.clear_screen(COLORS::White.into());
150 self.drawer.draw(DrawingMode::Triangles);
151 }
152}