You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.3 KiB

  1. use glc::vector::{Vector2f, Vector4f};
  2. use space_crush_common::resources::Raster as RasterResource;
  3. use specs::{prelude::*, ReadExpect, System, World, WriteExpect};
  4. use crate::resources::Geometry;
  5. #[derive(Default)]
  6. pub struct Raster;
  7. #[derive(SystemData)]
  8. pub struct FleetData<'a> {
  9. geometry: WriteExpect<'a, Geometry>,
  10. raster: ReadExpect<'a, RasterResource>,
  11. }
  12. impl<'a> System<'a> for Raster {
  13. type SystemData = FleetData<'a>;
  14. fn run(&mut self, data: Self::SystemData) {
  15. let FleetData {
  16. mut geometry,
  17. raster,
  18. } = data;
  19. let s = raster.size();
  20. gl::enable(gl::BLEND);
  21. gl::blend_func(gl::SRC_ALPHA, gl::ONE);
  22. for (x, y, q) in raster.quads() {
  23. let a = if q.is_empty() { 0.05 } else { 0.5 };
  24. geometry.render_lines(
  25. Vector4f::new(1.0, 1.0, 1.0, a),
  26. &create_quad(x as _, y as _, s),
  27. );
  28. }
  29. gl::disable(gl::BLEND);
  30. }
  31. }
  32. fn create_quad(x: f32, y: f32, s: f32) -> Vec<Vector2f> {
  33. let f = s / 2.0;
  34. vec![
  35. Vector2f::new(x * s + f, y * s + f),
  36. Vector2f::new(x * s + f, y * s - f),
  37. Vector2f::new(x * s - f, y * s - f),
  38. Vector2f::new(x * s - f, y * s + f),
  39. Vector2f::new(x * s + f, y * s + f),
  40. ]
  41. }