diff --git a/src/screenComponents/radarView.cpp b/src/screenComponents/radarView.cpp index cc48083e7b..3466414d63 100644 --- a/src/screenComponents/radarView.cpp +++ b/src/screenComponents/radarView.cpp @@ -802,6 +802,14 @@ void GuiRadarView::drawHeadingIndicators(sp::RenderTarget& renderer) radar_screen_center + vec2FromAngle(float(n) - 90 - view_rotation) * (scale - 50), n-view_rotation, string(n), 15.0f, main_font, {255, 255, 255, 255}); } + + if (show_target_heading) + { + renderer.drawLine( + radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 0), + radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 40), + {255, 255, 255, 255}); + } } glm::vec2 GuiRadarView::worldToScreen(glm::vec2 world_position) diff --git a/src/screenComponents/radarView.h b/src/screenComponents/radarView.h index 11377f26ef..8ae165bd01 100644 --- a/src/screenComponents/radarView.h +++ b/src/screenComponents/radarView.h @@ -58,6 +58,8 @@ class GuiRadarView : public GuiElement bool show_callsigns; bool show_heading_indicators; bool show_game_master_data; + float target_heading; + bool show_target_heading = false; float range_indicator_step_size; uint8_t background_alpha; ERadarStyle style; @@ -105,6 +107,8 @@ class GuiRadarView : public GuiElement glm::vec2 getViewPosition() { return view_position; } GuiRadarView* setViewRotation(float view_rotation) { this->view_rotation = view_rotation; return this; } float getViewRotation() { return view_rotation; } + GuiRadarView* showTargetHeading(bool value) { show_target_heading = value; return this; } + GuiRadarView* setTargetHeading(float value) { show_target_heading = true; target_heading = value; return this; } glm::vec2 worldToScreen(glm::vec2 world_position); glm::vec2 screenToWorld(glm::vec2 screen_position); diff --git a/src/screens/crew1/singlePilotScreen.cpp b/src/screens/crew1/singlePilotScreen.cpp index 6346025d09..bb88df1e35 100644 --- a/src/screens/crew1/singlePilotScreen.cpp +++ b/src/screens/crew1/singlePilotScreen.cpp @@ -67,18 +67,23 @@ SinglePilotScreen::SinglePilotScreen(GuiContainer* owner) my_player_info->commandSetTarget(targets.get()); drag_rotate = false; } else if (auto transform = my_spaceship.getComponent()) { - my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); + float angle = vec2ToAngle(position - transform->getPosition()); + my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); drag_rotate = true; } }, [this](glm::vec2 position) { if (drag_rotate) { - if (auto transform = my_spaceship.getComponent()) - my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); + if (auto transform = my_spaceship.getComponent()) { + float angle = vec2ToAngle(position - transform->getPosition()); + my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); + } } }, [this](glm::vec2 position) { - drag_rotate=false; + drag_rotate=false; } ); radar->setAutoRotating(PreferencesManager::get("single_pilot_radar_lock","0")=="1"); @@ -166,7 +171,10 @@ void SinglePilotScreen::onUpdate() if (angle != 0.0f) { if (auto transform = my_spaceship.getComponent()) + { my_player_info->commandTargetRotation(transform->getRotation() + angle); + radar->setTargetHeading(transform->getRotation()+angle+90); + } } if (keys.weapons_enemy_next_target.getDown()) diff --git a/src/screens/crew4/tacticalScreen.cpp b/src/screens/crew4/tacticalScreen.cpp index e727013544..6325375b57 100644 --- a/src/screens/crew4/tacticalScreen.cpp +++ b/src/screens/crew4/tacticalScreen.cpp @@ -61,14 +61,19 @@ TacticalScreen::TacticalScreen(GuiContainer* owner) my_player_info->commandSetTarget(targets.get()); drag_rotate = false; } else if (auto transform = my_spaceship.getComponent()) { - my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); + float angle = vec2ToAngle(position - transform->getPosition()); + my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); drag_rotate = true; } }, [this](glm::vec2 position) { if (drag_rotate) { - if (auto transform = my_spaceship.getComponent()) - my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); + if (auto transform = my_spaceship.getComponent()) { + float angle = vec2ToAngle(position - transform->getPosition()); + my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); + } } }, [this](glm::vec2 position) { @@ -146,8 +151,10 @@ void TacticalScreen::onUpdate() auto angle = (keys.helms_turn_right.getValue() - keys.helms_turn_left.getValue()) * 5.0f; if (angle != 0.0f) { - if (auto transform = my_spaceship.getComponent()) + if (auto transform = my_spaceship.getComponent()) { my_player_info->commandTargetRotation(transform->getRotation() + angle); + radar->setTargetHeading(transform->getRotation()+angle+90); + } } if (keys.weapons_enemy_next_target.getDown()) diff --git a/src/screens/crew6/helmsScreen.cpp b/src/screens/crew6/helmsScreen.cpp index f47299fd31..f9fc57a644 100644 --- a/src/screens/crew6/helmsScreen.cpp +++ b/src/screens/crew6/helmsScreen.cpp @@ -12,7 +12,6 @@ #include "components/docking.h" #include "screenComponents/combatManeuver.h" -#include "screenComponents/radarView.h" #include "screenComponents/impulseControls.h" #include "screenComponents/warpControls.h" #include "screenComponents/jumpControls.h" @@ -38,7 +37,7 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) // Render the alert level color overlay. (new AlertLevelOverlay(this)); - GuiRadarView* radar = new GuiRadarView(this, "HELMS_RADAR", nullptr); + radar = new GuiRadarView(this, "HELMS_RADAR", nullptr); combat_maneuver = new GuiCombatManeuver(this, "COMBAT_MANEUVER"); combat_maneuver->setPosition(-20, -20, sp::Alignment::BottomRight)->setSize(280, 215)->setVisible(my_spaceship.hasComponent()); @@ -47,7 +46,7 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) radar->setRangeIndicatorStepSize(1000.0)->shortRange()->enableGhostDots()->enableWaypoints()->enableCallsigns()->enableHeadingIndicators()->setStyle(GuiRadarView::Circular); radar->enableMissileTubeIndicators(); radar->setCallbacks( - [radar, this](sp::io::Pointer::Button button, glm::vec2 position) { + [this](sp::io::Pointer::Button button, glm::vec2 position) { if (auto transform = my_spaceship.getComponent()) { auto r = radar->getRect(); @@ -68,9 +67,10 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) draw_position = rect.center() + draw_position / radar->getDistance() * std::min(r.size.x, r.size.y) * 0.5f; heading_hint->setText(string(fmodf(angle + 90.f + 360.f, 360.f), 1))->setPosition(draw_position - rect.position - glm::vec2(0, 50))->show(); my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); } }, - [radar, this](glm::vec2 position) { + [this](glm::vec2 position) { if (auto transform = my_spaceship.getComponent()) { auto r = radar->getRect(); @@ -88,8 +88,10 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) else{ draw_position = (position - transform->getPosition()); } - draw_position = rect.center() + draw_position / radar->getDistance() * std::min(r.size.x, r.size.y) * 0.5f; heading_hint->setText(string(fmodf(angle + 90.f + 360.f, 360.f), 1))->setPosition(draw_position - rect.position - glm::vec2(0, 50))->show(); + draw_position = rect.center() + draw_position / radar->getDistance() * std::min(r.size.x, r.size.y) * 0.5f; + heading_hint->setText(string(fmodf(angle + 90.f + 360.f, 360.f), 1))->setPosition(draw_position - rect.position - glm::vec2(0, 50))->show(); my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); } }, [this](glm::vec2 position) { @@ -141,7 +143,10 @@ void HelmsScreen::onUpdate() { auto transform = my_spaceship.getComponent(); if (transform) + { my_player_info->commandTargetRotation(transform->getRotation() + angle); + radar->setTargetHeading(transform->getRotation() + angle + 90); + } } } } diff --git a/src/screens/crew6/helmsScreen.h b/src/screens/crew6/helmsScreen.h index 8c3feb40e4..7a63bfbe34 100644 --- a/src/screens/crew6/helmsScreen.h +++ b/src/screens/crew6/helmsScreen.h @@ -3,6 +3,7 @@ #include "gui/gui2_overlay.h" #include "gui/joystickConfig.h" +#include "screenComponents/radarView.h" class GuiKeyValueDisplay; class GuiLabel; @@ -19,6 +20,7 @@ class HelmsScreen : public GuiOverlay GuiLabel* heading_hint; GuiCombatManeuver* combat_maneuver; GuiDockingButton* docking_button; + GuiRadarView* radar; public: HelmsScreen(GuiContainer* owner);