use glc::vector::Vector4f; use space_crush_common::components::{Player, PlayerOwned, Position, Ship, ShipObstacle}; use specs::{prelude::*, ReadStorage, System, World, WriteExpect}; use crate::resources::Geometry; #[derive(Default)] pub struct Ships; #[derive(SystemData)] pub struct ShipsData<'a> { geometry: WriteExpect<'a, Geometry>, positions: ReadStorage<'a, Position>, player_owned: ReadStorage<'a, PlayerOwned>, players: ReadStorage<'a, Player>, ships: ReadStorage<'a, Ship>, } impl<'a> System<'a> for Ships { type SystemData = ShipsData<'a>; fn run(&mut self, data: Self::SystemData) { let ShipsData { mut geometry, positions, player_owned, players, ships, } = data; gl::enable(gl::BLEND); gl::blend_func(gl::SRC_ALPHA, gl::ONE); for (position, player_owned, ship) in (&positions, &player_owned, &ships).join() { let ship_pos = position.get(); let type_ = ship.type_(); let player_id = player_owned.owner(); let player = players.get(player_id).unwrap(); let ship_data = player.ship_data(type_); geometry.render_lines( Vector4f::new(0.0, 0.0, 1.0, 0.2), &[*ship_pos, ship_pos + ship.dir() * ship_data.speed], ); geometry.render_lines( Vector4f::new(1.0, 0.0, 0.0, 0.2), &[*ship_pos, ship_pos + ship.target_dir() * 100.0], ); geometry.render_lines( Vector4f::new(1.0, 1.0, 1.0, 0.2), &[*ship_pos, *ship.target_pos()], ); if let ShipObstacle::Known(obstacle) = ship.obstacle() { let obstacle_pos = positions.get(obstacle).unwrap().get(); geometry.render_lines( Vector4f::new(0.0, 1.0, 0.0, 0.2), &[*ship_pos, *obstacle_pos], ); } } gl::disable(gl::BLEND); } }