From abaff88b068a9e33d1ebc4a31b12ec400a7782fa Mon Sep 17 00:00:00 2001 From: Jonathan Levi Date: Sat, 29 Nov 2025 14:25:43 -0600 Subject: [PATCH 1/2] Target heading indicator on edge of radar. I think this new indicator is nice and helpful. I think it also makes the turning behavior more intuitive (I had a couple new players yesterday on Helms that didn't get it at first, I think this would have helped them.) --- src/screenComponents/radarView.cpp | 13 +++++++++++++ src/screenComponents/radarView.h | 4 ++++ src/screens/crew1/singlePilotScreen.cpp | 16 ++++++++++++---- src/screens/crew4/tacticalScreen.cpp | 15 +++++++++++---- src/screens/crew6/helmsScreen.cpp | 19 +++++++++---------- src/screens/crew6/helmsScreen.h | 3 ++- 6 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/screenComponents/radarView.cpp b/src/screenComponents/radarView.cpp index cc48083e7b..013484d2cf 100644 --- a/src/screenComponents/radarView.cpp +++ b/src/screenComponents/radarView.cpp @@ -802,6 +802,19 @@ 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 - 30), + {255, 255, 255, 255}); + + renderer.drawSprite("redicule.png", radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 50), 48); + renderer.drawRotatedText( + radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 85), target_heading-view_rotation, + string(fmodf(target_heading + 360.f, 360.f), 1), 20.0f, main_font, {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..07b9b7b8fd 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(); @@ -66,11 +65,11 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) 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(); 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,21 +87,18 @@ 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; my_player_info->commandTargetRotation(angle); + radar->setTargetHeading(angle+90); } }, [this](glm::vec2 position) { if (auto transform = my_spaceship.getComponent()) my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); - heading_hint->hide(); } ); radar->setAutoRotating(PreferencesManager::get("helms_radar_lock","0")=="1"); - heading_hint = new GuiLabel(this, "HEADING_HINT", "", 30); - heading_hint->setAlignment(sp::Alignment::Center)->setSize(0, 0); - auto energy_display = new EnergyInfoDisplay(this, "ENERGY_DISPLAY", 0.45); energy_display->setPosition(20, 100, sp::Alignment::TopLeft)->setSize(240, 40); auto heading_display = new HeadingInfoDisplay(this, "HEADING_DISPLAY", 0.45); @@ -141,7 +137,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..5499f22c8a 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; @@ -16,9 +17,9 @@ class HelmsScreen : public GuiOverlay GuiElement* warp_controls; GuiElement* jump_controls; - GuiLabel* heading_hint; GuiCombatManeuver* combat_maneuver; GuiDockingButton* docking_button; + GuiRadarView* radar; public: HelmsScreen(GuiContainer* owner); From e84444b1dea8d6b12c18e3201377787022898cef Mon Sep 17 00:00:00 2001 From: Jonathan Levi Date: Sat, 29 Nov 2025 15:58:16 -0600 Subject: [PATCH 2/2] Remove heading number and target icon to target heading indicator. I think a heading indicator would be good, but not sure how. --- src/screenComponents/radarView.cpp | 7 +------ src/screens/crew6/helmsScreen.cpp | 6 ++++++ src/screens/crew6/helmsScreen.h | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/screenComponents/radarView.cpp b/src/screenComponents/radarView.cpp index 013484d2cf..3466414d63 100644 --- a/src/screenComponents/radarView.cpp +++ b/src/screenComponents/radarView.cpp @@ -807,13 +807,8 @@ void GuiRadarView::drawHeadingIndicators(sp::RenderTarget& renderer) { renderer.drawLine( radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 0), - radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 30), + radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 40), {255, 255, 255, 255}); - - renderer.drawSprite("redicule.png", radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 50), 48); - renderer.drawRotatedText( - radar_screen_center + vec2FromAngle(target_heading - 90 - view_rotation) * (scale - 85), target_heading-view_rotation, - string(fmodf(target_heading + 360.f, 360.f), 1), 20.0f, main_font, {255, 255, 255, 255}); } } diff --git a/src/screens/crew6/helmsScreen.cpp b/src/screens/crew6/helmsScreen.cpp index 07b9b7b8fd..f9fc57a644 100644 --- a/src/screens/crew6/helmsScreen.cpp +++ b/src/screens/crew6/helmsScreen.cpp @@ -65,6 +65,7 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) 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(); my_player_info->commandTargetRotation(angle); radar->setTargetHeading(angle+90); } @@ -88,6 +89,7 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) 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(); my_player_info->commandTargetRotation(angle); radar->setTargetHeading(angle+90); } @@ -95,10 +97,14 @@ HelmsScreen::HelmsScreen(GuiContainer* owner) [this](glm::vec2 position) { if (auto transform = my_spaceship.getComponent()) my_player_info->commandTargetRotation(vec2ToAngle(position - transform->getPosition())); + heading_hint->hide(); } ); radar->setAutoRotating(PreferencesManager::get("helms_radar_lock","0")=="1"); + heading_hint = new GuiLabel(this, "HEADING_HINT", "", 30); + heading_hint->setAlignment(sp::Alignment::Center)->setSize(0, 0); + auto energy_display = new EnergyInfoDisplay(this, "ENERGY_DISPLAY", 0.45); energy_display->setPosition(20, 100, sp::Alignment::TopLeft)->setSize(240, 40); auto heading_display = new HeadingInfoDisplay(this, "HEADING_DISPLAY", 0.45); diff --git a/src/screens/crew6/helmsScreen.h b/src/screens/crew6/helmsScreen.h index 5499f22c8a..7a63bfbe34 100644 --- a/src/screens/crew6/helmsScreen.h +++ b/src/screens/crew6/helmsScreen.h @@ -17,6 +17,7 @@ class HelmsScreen : public GuiOverlay GuiElement* warp_controls; GuiElement* jump_controls; + GuiLabel* heading_hint; GuiCombatManeuver* combat_maneuver; GuiDockingButton* docking_button; GuiRadarView* radar;