From 732b7624e8f435ccf3caa46104854c07d2674df7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 25 Jul 2025 16:24:38 -0400 Subject: [PATCH] Clearer indication of launch origin sector --- .../graphics/g3d/PlanetRenderer.java | 12 ++++++++ core/src/mindustry/type/Planet.java | 29 +++++++++++++++++++ .../mindustry/ui/dialogs/PlanetDialog.java | 24 +++++++++------ 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index ba2d66fefd..fe0c9febcf 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -114,6 +114,9 @@ public class PlanetRenderer implements Disposable{ if(params.renderer != null){ params.renderer.renderProjections(params.planet); + + batch.proj().mul(params.planet.getTransform(mat)); + params.renderer.renderOverProjections(params.planet); } Gl.disable(Gl.cullFace); @@ -176,6 +179,10 @@ public class PlanetRenderer implements Disposable{ planet.renderSectors(batch, cam, params); } + public void drawArcLine(Planet planet, Vec3 a, Vec3 b){ + drawArcLine(planet, a, b, Pal.accent, Tmp.c3.set(Pal.accent).a(0f), 1f, 80f, 25, 0.006f); + } + public void drawArc(Planet planet, Vec3 a, Vec3 b){ drawArc(planet, a, b, Pal.accent, Color.clear, 1f); } @@ -188,6 +195,10 @@ public class PlanetRenderer implements Disposable{ planet.drawArc(batch, a, b, from, to, length, timeScale, pointCount); } + public void drawArcLine(Planet planet, Vec3 a, Vec3 b, Color from, Color to, float length, float timeScale, int pointCount, float stroke){ + planet.drawArcLine(batch, a, b, from, to, length, timeScale, pointCount, stroke); + } + public void drawBorders(Sector sector, Color base, float alpha){ sector.planet.drawBorders(batch, sector, base, alpha); if(batch.getNumVertices() >= batch.getMaxVertices() - 6 * 6){ @@ -230,5 +241,6 @@ public class PlanetRenderer implements Disposable{ public interface PlanetInterfaceRenderer{ void renderSectors(Planet planet); void renderProjections(Planet planet); + default void renderOverProjections(Planet planet){} } } diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 1b4e1cdafc..6ac860aaa6 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -35,6 +35,7 @@ public class Planet extends UnlockableContent{ private static final Mat3D mat = new Mat3D(); /** drawArc() temp curve points. */ private static final Seq points = new Seq<>(); + private static final Vec3 tmpNormal = new Vec3(); /** Mesh used for rendering. Created on load() - will be null on the server! */ public @Nullable GenericMesh mesh; @@ -601,6 +602,34 @@ public class Planet extends UnlockableContent{ batch.flush(Gl.lineStrip); } + /** Draws an arc from one point to another on the planet. Has thickness. */ + public void drawArcLine(VertexBatch3D batch, Vec3 a, Vec3 b, Color from, Color to, float length, float timeScale, int pointCount, float stroke){ + //increase curve height when on opposite side of planet, so it doesn't tunnel through + float scaledOutlineRad = outlineRad * radius; + float dot = 1f - (Tmp.v32.set(a).nor().dot(Tmp.v33.set(b).nor()) + 1f)/2f; + + Vec3 avg = Tmp.v31.set(b).add(a).scl(0.5f); + avg.setLength(radius * (1f + length) + dot * 1.35f); + + points.clear(); + points.addAll(Tmp.v33.set(b).setLength(scaledOutlineRad), Tmp.v31, Tmp.v34.set(a).setLength(scaledOutlineRad)); + Tmp.bz3.set(points); + + Vec3 normal = tmpNormal; + Vec3 point1 = points.get(0), point2 = points.get(1), point3 = points.get(2); + normal.set(point1).sub(point2).crs(point2.x - point3.x, point2.y - point3.y, point2.z - point3.z).nor(); + + for(int i = 0; i < pointCount + 1; i++){ + float f = i / (float)pointCount; + Tmp.c1.set(from).lerp(to, (f + Time.globalTime / timeScale) % 1f); + batch.color(Tmp.c1); + batch.vertex(Tmp.bz3.valueAt(Tmp.v32, f).add(normal, stroke)); + batch.color(Tmp.c1); + batch.vertex(Tmp.bz3.valueAt(Tmp.v32, f).add(normal, -stroke)); + } + batch.flush(Gl.triangleStrip); + } + public Vec3 lookAt(Sector sector, Vec3 out){ return out.set(sector.tile.v).rotate(Vec3.Y, -getRotation()); } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index f208886bba..f18bb45e7a 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -483,6 +483,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } + Sector hoverOrSelect = hovered != null ? hovered : selected; + Sector launchFrom = hoverOrSelect != null && !hoverOrSelect.hasBase() ? findLauncher(hoverOrSelect) : null; + Sector current = Vars.state.getSector() != null && Vars.state.getSector().isBeingPlayed() && Vars.state.getSector().planet == state.planet ? Vars.state.getSector() : null; if(current != null){ @@ -502,25 +505,29 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } planets.batch.flush(Gl.triangles); + } - if(hovered != null && !hovered.hasBase()){ - Sector launchFrom = findLauncher(hovered); - if(launchFrom != null && hovered != launchFrom && canSelect(hovered)){ - planets.drawArc(planet, launchFrom.tile.v, hovered.tile.v); - } + @Override + public void renderOverProjections(Planet planet){ + Sector hoverOrSelect = hovered != null ? hovered : selected; + Sector launchFrom = hoverOrSelect != null && !hoverOrSelect.hasBase() ? findLauncher(hoverOrSelect) : null; + + if(hoverOrSelect != null && !hoverOrSelect.hasBase() && launchFrom != null && hoverOrSelect != launchFrom && canSelect(hoverOrSelect)){ + planets.drawArcLine(planet, launchFrom.tile.v, hoverOrSelect.tile.v); } if(mode == planetLaunch && launchSector != null && selected != null && hovered == null){ - planets.drawArc(planet, launchSector.tile.v, selected.tile.v); + planets.drawArcLine(planet, launchSector.tile.v, selected.tile.v); } if(state.uiAlpha > 0.001f){ for(Sector sec : planet.sectors){ if(sec.hasBase()){ + //draw vulnerable sector attack arc if(planet.campaignRules.sectorInvasion){ for(Sector enemy : sec.near()){ - if(enemy.hasEnemyBase()){ - planets.drawArc(planet, enemy.tile.v, sec.tile.v, Team.crux.color.write(Tmp.c2).a(state.uiAlpha), Color.clear, 0.24f, 110f, 25); + if(enemy.hasEnemyBase() && (enemy.preset == null || !enemy.preset.requireUnlock)){ + planets.drawArcLine(planet, enemy.tile.v, sec.tile.v, Team.crux.color.write(Tmp.c2).a(state.uiAlpha), Color.clear, 0.24f, 110f, 25, 0.005f); } } } @@ -538,7 +545,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } } - } @Override