Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

113 Zeilen
3.2 KiB

  1. use glc::{
  2. matrix::Matrix4f,
  3. misc::{BindGuard, Bindable},
  4. shader::{Program, Type, Uniform},
  5. texture::Texture,
  6. vector::Vector4f,
  7. };
  8. use space_crush_common::{
  9. components::{Owned, Planet, Player, Position},
  10. misc::LogResult,
  11. };
  12. use specs::{prelude::*, ReadExpect, ReadStorage, System, World};
  13. use crate::{
  14. constants::{PLAYER_COLOR_DEFAULT, UNIFORM_BUFFER_INDEX_CAMERA, UNIFORM_BUFFER_INDEX_UNIFORM},
  15. misc::WorldHelper,
  16. resources::Geometry,
  17. Error,
  18. };
  19. pub struct Planets {
  20. program: Program,
  21. texture: Texture,
  22. location_model: gl::GLint,
  23. location_glow_color: gl::GLint,
  24. }
  25. impl Planets {
  26. pub fn new(world: &World) -> Result<Self, Error> {
  27. let program = world.load_program(vec![
  28. (Type::Vertex, "resources/shader/planet/vert.glsl"),
  29. (Type::Fragment, "resources/shader/planet/frag.glsl"),
  30. ])?;
  31. program.uniform_block_binding("Camera", UNIFORM_BUFFER_INDEX_CAMERA)?;
  32. program.uniform_block_binding("Global", UNIFORM_BUFFER_INDEX_UNIFORM)?;
  33. let location_model = program.uniform_location("uModel")?;
  34. let location_glow_color = program.uniform_location("uGlowColor")?;
  35. program.bind();
  36. program.uniform("uTexture", Uniform::Texture(0))?;
  37. program.unbind();
  38. let texture = world.load_texture("resources/textures/planet01.png")?;
  39. Ok(Self {
  40. program,
  41. texture,
  42. location_model,
  43. location_glow_color,
  44. })
  45. }
  46. }
  47. #[derive(SystemData)]
  48. pub struct PlanetsData<'a> {
  49. geometry: ReadExpect<'a, Geometry>,
  50. position: ReadStorage<'a, Position>,
  51. planet: ReadStorage<'a, Planet>,
  52. owned: ReadStorage<'a, Owned>,
  53. player: ReadStorage<'a, Player>,
  54. }
  55. impl<'a> System<'a> for Planets {
  56. type SystemData = PlanetsData<'a>;
  57. fn run(&mut self, data: Self::SystemData) {
  58. let PlanetsData {
  59. geometry,
  60. position,
  61. planet,
  62. owned,
  63. player,
  64. } = data;
  65. gl::enable(gl::BLEND);
  66. gl::blend_func(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA);
  67. let _guard = BindGuard::new(&self.program);
  68. let _guard = BindGuard::new(&self.texture);
  69. for (p, _, owned) in (&position, &planet, owned.maybe()).join() {
  70. let p_x = p.pos.x;
  71. let p_y = p.pos.y;
  72. let s = p.size;
  73. let c = match owned.and_then(|owned| player.get(owned.owner)) {
  74. Some(pv) => &pv.color,
  75. None => &*PLAYER_COLOR_DEFAULT,
  76. };
  77. let m = Matrix4f::new(
  78. Vector4f::new(s, 0.0, 0.0, 0.0),
  79. Vector4f::new(0.0, s, 0.0, 0.0),
  80. Vector4f::new(0.0, 0.0, s, 0.0),
  81. Vector4f::new(p_x, p_y, 0.0, 1.0),
  82. );
  83. self.program
  84. .uniform(self.location_glow_color, Uniform::Vector4f(&c))
  85. .error("Error while updating glow color");
  86. self.program
  87. .uniform(self.location_model, Uniform::Matrix4f(&m))
  88. .error("Error while updating model matrix");
  89. geometry.render_quad();
  90. }
  91. gl::disable(gl::BLEND);
  92. }
  93. }