Clearer indication of launch origin sector

This commit is contained in:
Anuken
2025-07-25 16:24:38 -04:00
parent 982e072603
commit 732b7624e8
3 changed files with 56 additions and 9 deletions

View File

@@ -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){}
}
}

View File

@@ -35,6 +35,7 @@ public class Planet extends UnlockableContent{
private static final Mat3D mat = new Mat3D();
/** drawArc() temp curve points. */
private static final Seq<Vec3> 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());
}

View File

@@ -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