Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/systems/beamweapon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<sp::Transform>())
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<sp::Transform>())
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<int>(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);
}
3 changes: 2 additions & 1 deletion src/systems/beamweapon.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
#include "systems/radar.h"
#include "components/beamweapon.h"

class BeamWeaponSystem : public sp::ecs::System, public Render3DInterface<BeamEffect, true>, public RenderRadarInterface<BeamWeaponSys, 20, RadarRenderSystem::FlagShortRange>
class BeamWeaponSystem : public sp::ecs::System, public Render3DInterface<BeamEffect, true>, public RenderRadarInterface<BeamWeaponSys, 20, RadarRenderSystem::FlagShortRange>, public RenderRadarInterface<BeamEffect, 21, RadarRenderSystem::FlagNone>
{
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;
};
Loading