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.

59 line
1.6 KiB

  1. use glc::vector::{Angle, Vector2f, Vector4f};
  2. use space_crush_common::components::{MeetingPoint, Position};
  3. use specs::{prelude::*, ReadStorage, System, World, WriteExpect};
  4. use crate::resources::Geometry;
  5. #[derive(Default)]
  6. pub struct MeetingPoints {}
  7. #[derive(SystemData)]
  8. pub struct MeetingPointsData<'a> {
  9. geometry: WriteExpect<'a, Geometry>,
  10. positions: ReadStorage<'a, Position>,
  11. meeting_points: ReadStorage<'a, MeetingPoint>,
  12. }
  13. impl<'a> System<'a> for MeetingPoints {
  14. type SystemData = MeetingPointsData<'a>;
  15. fn run(&mut self, data: Self::SystemData) {
  16. let MeetingPointsData {
  17. mut geometry,
  18. positions,
  19. meeting_points,
  20. } = data;
  21. gl::enable(gl::BLEND);
  22. for (position, meeting_point) in (&positions, &meeting_points).join() {
  23. gl::blend_func(gl::SRC_ALPHA, gl::ONE);
  24. gl::blend_equation(gl::FUNC_ADD);
  25. geometry.render_lines(
  26. Vector4f::new(0.5, 0.5, 0.5, 0.05),
  27. &create_circle(position.get(), meeting_point.min()),
  28. );
  29. geometry.render_lines(
  30. Vector4f::new(0.5, 0.5, 0.5, 0.05),
  31. &create_circle(position.get(), meeting_point.max()),
  32. );
  33. }
  34. gl::blend_equation(gl::FUNC_ADD);
  35. gl::disable(gl::BLEND);
  36. }
  37. }
  38. fn create_circle(p: &Vector2f, r: f32) -> Vec<Vector2f> {
  39. let mut points = Vec::new();
  40. for i in 0..=180 {
  41. points.push(Vector2f::new(
  42. p.x + r * Angle::Deg(i as f32 * 2.0).cos(),
  43. p.y + r * Angle::Deg(i as f32 * 2.0).sin(),
  44. ));
  45. }
  46. points
  47. }