diff --git a/src/ai/ai.cpp b/src/ai/ai.cpp index 07167a06f3..518aff4624 100644 --- a/src/ai/ai.cpp +++ b/src/ai/ai.cpp @@ -41,12 +41,12 @@ void ShipAI::drawOnGMRadar(sp::RenderTarget& renderer, glm::vec2 draw_position, auto transform = owner.getComponent(); if (!transform) return; auto world_position = transform->getPosition(); - auto target = owner.getComponent(); - if (target) + if (auto target = owner.getComponent()) { - if (auto t = target->entity.getComponent()) { + if (auto t = target->entity.getComponent()) + { auto v = t->getPosition() - world_position; - renderer.drawLine(draw_position, draw_position + v * scale, glm::u8vec4(255, 128, 128, 64)); + renderer.drawLine(draw_position, draw_position + v * scale, 1.0f, glm::u8vec4(255, 128, 128, 64)); } } @@ -54,7 +54,7 @@ void ShipAI::drawOnGMRadar(sp::RenderTarget& renderer, glm::vec2 draw_position, for(unsigned int n=0; nvisible) { renderer.fillRect(element->rect, glm::u8vec4(255, 255, 255, 5)); - renderer.outlineRect(element->rect, glm::u8vec4(255, 0, 255, 255)); + renderer.drawRectOutline(element->rect, 1.0f, glm::u8vec4(255, 0, 255, 255)); element->drawDebugElements(element->rect, renderer); diff --git a/src/gui/mouseRenderer.cpp b/src/gui/mouseRenderer.cpp index 3e5a26eb5a..e68898f10a 100644 --- a/src/gui/mouseRenderer.cpp +++ b/src/gui/mouseRenderer.cpp @@ -26,11 +26,12 @@ void MouseRenderer::render(sp::RenderTarget& renderer) {center.x - bounds, center.y + bounds}, {center.x - bounds, center.y - bounds}, }, + 1.0f, {255, 255, 0, 64}); // Draw white crosshair on cursor hotspot. - renderer.drawLine(position - glm::vec2{2.0f, 0.0f}, position + glm::vec2{2.0f, 0.0f}, {255, 255, 255, 255}); - renderer.drawLine(position - glm::vec2{0.0f, 2.0f}, position + glm::vec2{0.0f, 2.0f}, {255, 255, 255, 255}); + renderer.drawLine(position - glm::vec2{2.0f, 0.0f}, position + glm::vec2{2.0f, 0.0f}, 1.0f, {255, 255, 255, 255}); + renderer.drawLine(position - glm::vec2{0.0f, 2.0f}, position + glm::vec2{0.0f, 2.0f}, 1.0f, {255, 255, 255, 255}); } } diff --git a/src/init/config.cpp b/src/init/config.cpp index 15fba258c0..0dca9791b2 100644 --- a/src/init/config.cpp +++ b/src/init/config.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "gui/hotkeyConfig.h" #include @@ -49,5 +50,6 @@ string initConfiguration(int argc, char** argv) } sp::io::Keybinding::loadKeybindings(configuration_path + "/keybindings.json"); + return configuration_path; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 82d44758ff..b0cc5829fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -276,11 +276,17 @@ int main(int argc, char** argv) engine->runMainLoop(); - // Set FSAA and fullscreen defaults from windowManager. + // Set FSAA and fullscreen defaults from windowManager, and line drawing + // defaults from renderTarget. if (windows.size() > 0) { PreferencesManager::set("fsaa", windows[0]->getFSAA()); PreferencesManager::set("fullscreen", (int)windows[0]->getMode()); + + if (PreferencesManager::get("line_drawing_mode", "quad") == "quad") + sp::RenderTarget::setLineDrawingMode(sp::RenderTarget::LineDrawingMode::Quad); + else + sp::RenderTarget::setLineDrawingMode(sp::RenderTarget::LineDrawingMode::GL); } // Set the default music_, sound_, and engine_volume to the current volume. diff --git a/src/menus/optionsMenu.cpp b/src/menus/optionsMenu.cpp index 3b89f4a786..0785bd1961 100644 --- a/src/menus/optionsMenu.cpp +++ b/src/menus/optionsMenu.cpp @@ -6,6 +6,7 @@ #include "preferenceManager.h" #include "soundManager.h" #include "windowManager.h" +#include "graphics/renderTarget.h" #include "gui/theme.h" #include "gui/gui2_overlay.h" @@ -363,6 +364,26 @@ void OptionsMenu::setupGraphicsOptions() (new GuiLabel(graphics_page, "THEME_APPLICATION_LABEL", tr("Restart EmptyEpsilon to apply FSAA change"), 20.0f)) ->setSize(GuiElement::GuiSizeMax, 30.0f); + // Line drawing mode selector. + int line_mode_index = (sp::RenderTarget::getLineDrawingMode() == sp::RenderTarget::LineDrawingMode::GL) ? 0 : 1; + (new GuiSelector(graphics_page, "GRAPHICS_LINE_DRAWING_MODE", + [](int index, string value) + { + if (index == 1) + { + PreferencesManager::set("line_drawing_mode", "quad"); + sp::RenderTarget::setLineDrawingMode(sp::RenderTarget::LineDrawingMode::Quad); + } + else + { + PreferencesManager::set("line_drawing_mode", "gl"); + sp::RenderTarget::setLineDrawingMode(sp::RenderTarget::LineDrawingMode::GL); + } + } + ))->setOptions({tr("options", "Line rendering: Quads (High quality)"), tr("options", "Line rendering: GL (Low quality)")}) + ->setSelectionIndex(line_mode_index) + ->setSize(GuiElement::GuiSizeMax, 50.0f); + // FoV slider. auto initial_fov = PreferencesManager::get("main_screen_camera_fov", "60").toFloat(); graphics_fov_slider = new GuiBasicSlider(graphics_page, "GRAPHICS_FOV_SLIDER", 30.f, 140.0f, initial_fov, [this](float fov) { diff --git a/src/screenComponents/radarView.cpp b/src/screenComponents/radarView.cpp index b7cd948856..d0f3411b9d 100644 --- a/src/screenComponents/radarView.cpp +++ b/src/screenComponents/radarView.cpp @@ -167,16 +167,14 @@ void GuiRadarView::onDraw(sp::RenderTarget& renderer) glEnable(GL_SCISSOR_TEST); glScissor(origin.x, renderer.getPhysicalSize().y - extents.y, extents.x - origin.x, extents.y - origin.y); - // Draw the "clear" radar background color on rectangular radards. + // Draw the "clear" radar background color on rectangular radars. if (style == Rectangular) drawBackground(renderer); - // Otherwise, draw the radar outline. - if ((style == CircularMasked || style == Circular)) - { - // Draw the radar's outline. First, and before any stencil kicks in. - // this way, the outline is not even a part of the rendering area. - float r = std::min(rect.size.x, rect.size.y) * 0.5f; - renderer.drawCircleOutline(getCenterPoint(), r, 2.0f, radar_outline_style->get(getState()).color); - } + + // Otherwise, draw the radar's outline first, and before any stencil kicks + // in. This way, the outline is not even a part of the rendering area. + const float radar_outline_thickness = 4.0f; + if (style == CircularMasked || style == Circular) + renderer.drawCircleOutline(getCenterPoint(), std::min(rect.size.x, rect.size.y) * 0.5f, radar_outline_thickness, radar_outline_style->get(getState()).color); // Stencil setup. renderer.finish(); @@ -208,7 +206,7 @@ void GuiRadarView::onDraw(sp::RenderTarget& renderer) // Draws the radar circle shape. // Note that this draws both in the stencil and the color buffer! - renderer.fillCircle(getCenterPoint(), std::min(rect.size.x, rect.size.y) / 2.0f - 2.0f, glm::u8vec4{ 20, 20, 20, background_alpha }); + renderer.fillCircle(getCenterPoint(), std::min(rect.size.x, rect.size.y) * 0.5f - radar_outline_thickness, glm::u8vec4{20, 20, 20, background_alpha}); renderer.finish(); } @@ -359,10 +357,10 @@ void GuiRadarView::drawSectorGrid(sp::RenderTarget& renderer) auto radar_screen_center = rect.center(); float scale = std::min(rect.size.x, rect.size.y) / 2.0f / distance; - float sector_size = 20000; - const float super_sector_size = sector_size * 8; + float sector_size = 20000.0f; + const float super_sector_size = sector_size * 8.0f; if (distance > super_sector_size) sector_size = super_sector_size; - const float sub_sector_size = sector_size / 8; + const float sub_sector_size = sector_size / 8.0f; int sector_x_min = floor((view_position.x - (radar_screen_center.x - rect.position.x) / scale) / sector_size) + 1; int sector_x_max = floor((view_position.x + (rect.position.x + rect.size.x - radar_screen_center.x) / scale) / sector_size); @@ -397,12 +395,12 @@ void GuiRadarView::drawSectorGrid(sp::RenderTarget& renderer) for(int sector_x = sector_x_min; sector_x <= sector_x_max; sector_x++) { float x = sector_x * sector_size; - renderer.drawLine(worldToScreen(glm::vec2(x, (sector_y_min-1)*sector_size)), worldToScreen(glm::vec2(x, (sector_y_max+1)*sector_size)), subsector_grid_color); + renderer.drawLine(worldToScreen(glm::vec2(x, (sector_y_min-1)*sector_size)), worldToScreen(glm::vec2(x, (sector_y_max+1)*sector_size)), 1.0f, subsector_grid_color); } for(int sector_y = sector_y_min; sector_y <= sector_y_max; sector_y++) { float y = sector_y * sector_size; - renderer.drawLine(worldToScreen(glm::vec2((sector_x_min-1)*sector_size, y)), worldToScreen(glm::vec2((sector_x_max+1)*sector_size, y)), subsector_grid_color); + renderer.drawLine(worldToScreen(glm::vec2((sector_x_min-1)*sector_size, y)), worldToScreen(glm::vec2((sector_x_max+1)*sector_size, y)), 1.0f, subsector_grid_color); } int sub_sector_x_min = floor((view_position.x - (radar_screen_center.x - rect.position.x) / scale) / sub_sector_size) + 1; @@ -597,7 +595,7 @@ void GuiRadarView::drawTargetProjections(sp::RenderTarget& renderer) missile_path.push_back(worldToScreen(fire_position + (turn_center + vec2FromAngle(fire_angle - angle_diff / 10.0f * cnt - left_or_right) * turn_radius))); missile_path.push_back(worldToScreen(fire_position + turn_exit)); missile_path.push_back(worldToScreen(fire_position + (turn_exit + vec2FromAngle(missile_target_angle) * length_after_turn))); - renderer.drawLine(missile_path, glm::u8vec4(color.r, color.g, color.b, color.a * 0.5f)); + renderer.drawLine(missile_path, 1.0f, glm::u8vec4(color.r, color.g, color.b, color.a / 2)); float offset = seconds_per_distance_tick * data.speed; for(int cnt=0; cntgetPosition()); - renderer.drawLine(start, worldToScreen(transform->getPosition() + physics->getVelocity() * 60.0f), glm::u8vec4(color.r, color.g, color.b, color.a / 2), glm::u8vec4(color.r, color.g, color.b, 0)); + renderer.drawLine(start, worldToScreen(transform->getPosition() + physics->getVelocity() * 60.0f), 2.0f, glm::u8vec4(color.r, color.g, color.b, color.a / 2), glm::u8vec4(color.r, color.g, color.b, 0)); glm::vec2 n = glm::normalize(rotateVec2(glm::vec2(-physics->getVelocity().y, physics->getVelocity().x), -view_rotation)) * 10.0f; for(int cnt=0; cnt<5; cnt++) { auto p = rotateVec2(physics->getVelocity() * (seconds_per_distance_tick * (cnt + 1.0f) * scale), -view_rotation); - renderer.drawLine(start + p + n, start + p - n, glm::u8vec4(color.r, color.g, color.b, color.a / 2 - cnt * 20)); + renderer.drawLine(start + p + n, start + p - n, 2.0f, glm::u8vec4(color.r, color.g, color.b, color.a / 2 - cnt * 20)); } } } @@ -664,7 +662,7 @@ void GuiRadarView::drawMissileTubes(sp::RenderTarget& renderer) float fire_angle = transform->getRotation() + mount.direction - view_rotation; - renderer.drawLine(fire_draw_position, fire_draw_position + (vec2FromAngle(fire_angle) * 1000.0f * scale), color, glm::u8vec4(color.r, color.g, color.b, 0)); + renderer.drawLine(fire_draw_position, fire_draw_position + (vec2FromAngle(fire_angle) * 1000.0f * scale), 2.0f, color, glm::u8vec4(color.r, color.g, color.b, 0)); } } @@ -823,7 +821,7 @@ void GuiRadarView::drawHeadingIndicators(sp::RenderTarget& renderer) renderer.drawLine( radar_screen_center + vec2FromAngle(float(n) - 90 - view_rotation) * (scale - 20), radar_screen_center + vec2FromAngle(float(n) - 90 - view_rotation) * (scale - 40), - {255, 255, 255, 255}); + 2.0f, {255, 255, 255, 255}); } for(unsigned int n = 0; n < 360; n += small_tig_interval) @@ -831,7 +829,7 @@ void GuiRadarView::drawHeadingIndicators(sp::RenderTarget& renderer) renderer.drawLine( radar_screen_center + vec2FromAngle(float(n) - 90 - view_rotation) * (scale - 20), radar_screen_center + vec2FromAngle(float(n) - 90 - view_rotation) * (scale - 30), - {255, 255, 255, 255}); + 1.0f, {255, 255, 255, 255}); } for(unsigned int n = 0; n < 360; n += tig_interval) diff --git a/src/screenComponents/rawScannerDataRadarOverlay.cpp b/src/screenComponents/rawScannerDataRadarOverlay.cpp index 3cb8e00c0e..f32eff69ad 100644 --- a/src/screenComponents/rawScannerDataRadarOverlay.cpp +++ b/src/screenComponents/rawScannerDataRadarOverlay.cpp @@ -169,7 +169,7 @@ void RawScannerDataRadarOverlay::onDraw(sp::RenderTarget& renderer) a_b.push_back(a_b.front()); // Draw each band as a line. - renderer.drawLineBlendAdd(a_r, electrical_band_style->get(getState()).color); // red - renderer.drawLineBlendAdd(a_g, biological_band_style->get(getState()).color); // green - renderer.drawLineBlendAdd(a_b, gravitational_band_style->get(getState()).color); // blue + renderer.drawLineBlendAdd(a_r, 1.0f, electrical_band_style->get(getState()).color); // red + renderer.drawLineBlendAdd(a_g, 1.0f, biological_band_style->get(getState()).color); // green + renderer.drawLineBlendAdd(a_b, 1.0f, gravitational_band_style->get(getState()).color); // blue } diff --git a/src/screenComponents/signalQualityIndicator.cpp b/src/screenComponents/signalQualityIndicator.cpp index 33f208bd9d..fbba9370f2 100644 --- a/src/screenComponents/signalQualityIndicator.cpp +++ b/src/screenComponents/signalQualityIndicator.cpp @@ -51,7 +51,7 @@ void GuiSignalQualityIndicator::onDraw(sp::RenderTarget& renderer) f = (1.0f - noise[2]) * f + noise[2] * random(-1.0, 1.0); b.emplace_back(rect.position.x + 4.0f + n * 4, rect.position.y + rect.size.y / 2.0f + f * amp); } - renderer.drawLineBlendAdd(r, electrical_band_style->get(getState()).color); // red - renderer.drawLineBlendAdd(g, biological_band_style->get(getState()).color); // green - renderer.drawLineBlendAdd(b, gravitational_band_style->get(getState()).color); // blue + renderer.drawLineBlendAdd(r, 1.0f, electrical_band_style->get(getState()).color); // red + renderer.drawLineBlendAdd(g, 1.0f, biological_band_style->get(getState()).color); // green + renderer.drawLineBlendAdd(b, 1.0f, gravitational_band_style->get(getState()).color); // blue } diff --git a/src/screens/gm/chatDialog.cpp b/src/screens/gm/chatDialog.cpp index f2e97838f8..9d83a92dba 100644 --- a/src/screens/gm/chatDialog.cpp +++ b/src/screens/gm/chatDialog.cpp @@ -124,7 +124,7 @@ void GameMasterChatDialog::onDraw(sp::RenderTarget& renderer) } if (auto transform = transmitter->target.getComponent()) - renderer.drawLine(rect.center(), radar->worldToScreen(transform->getPosition()), glm::u8vec4(128, 255, 128, 128)); + renderer.drawLine(rect.center(), radar->worldToScreen(transform->getPosition()), 2.0f, glm::u8vec4(128, 255, 128, 128)); // Hide the use_comms_script button if the comms target can't use it. // TODO: Confirm this works if callback is present @@ -135,7 +135,7 @@ void GameMasterChatDialog::onDraw(sp::RenderTarget& renderer) } if (auto transform = player.getComponent()) - renderer.drawLine(rect.center(), radar->worldToScreen(transform->getPosition()), glm::u8vec4(128, 255, 128, 128)); + renderer.drawLine(rect.center(), radar->worldToScreen(transform->getPosition()), 2.0f, glm::u8vec4(128, 255, 128, 128)); } void GameMasterChatDialog::disableComms(string title) diff --git a/src/systems/beamweapon.cpp b/src/systems/beamweapon.cpp index a233734dbd..27c40aa15f 100644 --- a/src/systems/beamweapon.cpp +++ b/src/systems/beamweapon.cpp @@ -419,7 +419,7 @@ void BeamWeaponSystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity // Draw beam ray as a line that fades over lifetime. glm::u8vec4 beam_color = beam_effect.beam_color; beam_color.a = static_cast(std::min(255.0f, beam_effect.lifetime * beam_color.a)); - renderer.drawLine(source_position, target_position, beam_color); + renderer.drawLine(source_position, target_position, 1.0f, beam_color); // Draw impact circle at target location. float impact_radius = 15.0f * scale; diff --git a/src/systems/debugrender.cpp b/src/systems/debugrender.cpp index 1bd9438ecf..371ec5af80 100644 --- a/src/systems/debugrender.cpp +++ b/src/systems/debugrender.cpp @@ -90,7 +90,7 @@ void DebugRenderSystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entit auto p2 = screen_position - rotateVec2(s0, rotation); auto p3 = screen_position - rotateVec2(s1, rotation); std::vector points{p0, p1, p2, p3, p0}; - renderer.drawLine(points, {255, 255, 255, 128}); + renderer.drawLine(points, 1.0f, {255, 255, 255, 128}); } break; } diff --git a/src/systems/gravity.cpp b/src/systems/gravity.cpp index 539bd771b8..594c11bda5 100644 --- a/src/systems/gravity.cpp +++ b/src/systems/gravity.cpp @@ -79,7 +79,7 @@ void GravitySystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity e, if (game_server && (component.wormhole_target.x != 0.0f || component.wormhole_target.y != 0.0f)) { if (auto transform = e.getComponent()) - renderer.drawLine(screen_position, screen_position + (component.wormhole_target - transform->getPosition()) * scale, glm::u8vec4(255, 255, 255, 32)); + renderer.drawLine(screen_position, screen_position + (component.wormhole_target - transform->getPosition()) * scale, 1.0f, glm::u8vec4(255, 255, 255, 32)); } renderer.drawCircleOutline(screen_position, component.range * scale, 2.0, glm::u8vec4(255, 255, 255, 32)); } diff --git a/src/systems/zone.cpp b/src/systems/zone.cpp index f3781ed3e6..e3b578fc72 100644 --- a/src/systems/zone.cpp +++ b/src/systems/zone.cpp @@ -16,7 +16,7 @@ void ZoneSystem::renderOnRadar(sp::RenderTarget& renderer, sp::ecs::Entity e, gl renderer.drawTriangles(outline_points, zone.triangles, glm::u8vec4(zone.color.r, zone.color.g, zone.color.b, 64)); outline_points.push_back(screen_position + rotateVec2(zone.outline[0] * scale, -rotation)); - renderer.drawLine(outline_points, glm::u8vec4(zone.color.r, zone.color.g, zone.color.b, 128)); + renderer.drawLine(outline_points, 4.0f, glm::u8vec4(zone.color.r, zone.color.g, zone.color.b, 128)); if (zone.label.length() > 0) {