bowtie/bowtie/
controller.rs

1use 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
15/// Public interface for the game engine's capabilities
16/// Will be responsible for rendering, handling physics systems
17/// And controlling the game's state through entitiy data
18pub struct BowTie<'d> {
19  entities: Vec<*mut dyn Entity<'d>>,
20  drawer: Drawer<'d>,
21  shading_program: ShaderProgram,
22  _vao: VertexArrayObject,
23}
24
25/// Initiates a shader program with pre-defined vertex attributes
26// TODO: This needs to be more flexible
27fn 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  /// Loads the entity into the drawer and the game's state
97  /// To handle rendering and physics
98  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  /// Updates the entities with the existing systems
123  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  /// Prepares the god object to draw stuff.
141  /// Has to be called before the main draw call
142  pub fn prep_for_render(&self) {
143    self.shading_program.use_program();
144    self.drawer.prep_textures(&self.shading_program);
145  }
146
147  /// Draws the entities with an actual clear screen refresh
148  pub fn draw_entities(&mut self) {
149    self.drawer.clear_screen(COLORS::White.into());
150    self.drawer.draw(DrawingMode::Triangles);
151  }
152}