diff --git a/src/systems/beamweapon.cpp b/src/systems/beamweapon.cpp index 4d36a684a1..63bd78dd0d 100644 --- a/src/systems/beamweapon.cpp +++ b/src/systems/beamweapon.cpp @@ -396,4 +396,30 @@ void BeamWeaponSystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity drawArc(renderer, arc_center, rotation + (turret_direction - turret_arc / 2.0f), turret_arc, beam_range * scale, color); } +} + +void BeamWeaponSystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity entity, glm::vec2 screen_position, float scale, float rotation, BeamEffect& beam_effect) +{ + // Initialize beam origin and impact positions. + glm::vec2 source_position = screen_position; + glm::vec2 target_position = screen_position; + + // Calculate source position with offset. + if (beam_effect.source) + { + if (auto source_transform = beam_effect.source.getComponent()) + source_position = screen_position + (rotateVec2(glm::vec2(beam_effect.source_offset.x, beam_effect.source_offset.y), source_transform->getRotation())) * scale; + } + + // Calculate target position. + if (auto entity_transform = entity.getComponent()) + target_position = screen_position + (beam_effect.target_location - entity_transform->getPosition()) * scale; + + // Draw beam ray as a line that fades over lifetime. + glm::u8vec4 beam_color(255, 200, 0, static_cast(std::min(255.0f, beam_effect.lifetime * 255.0f))); + renderer.drawLine(source_position, target_position, beam_color); + + // Draw impact circle at target location. + float impact_radius = 15.0f * scale; + renderer.fillCircle(target_position, impact_radius, beam_color); } \ No newline at end of file diff --git a/src/systems/beamweapon.h b/src/systems/beamweapon.h index 3f10711094..44b1e7f1bf 100644 --- a/src/systems/beamweapon.h +++ b/src/systems/beamweapon.h @@ -5,11 +5,12 @@ #include "systems/radar.h" #include "components/beamweapon.h" -class BeamWeaponSystem : public sp::ecs::System, public Render3DInterface, public RenderRadarInterface +class BeamWeaponSystem : public sp::ecs::System, public Render3DInterface, public RenderRadarInterface, public RenderRadarInterface { public: void update(float delta) override; void render3D(sp::ecs::Entity e, sp::Transform& transform, BeamEffect& be) override; void renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity entity, glm::vec2 screen_position, float scale, float rotation, BeamWeaponSys& beamsystem) override; + void renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity entity, glm::vec2 screen_position, float scale, float rotation, BeamEffect& beam_effect) override; };