From fdaac290ac3bb17513fb15bd4bd38ef07cf402e6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 26 Feb 2020 14:44:06 -0500 Subject: [PATCH] Better previews --- core/assets/shaders/planet.fragment.glsl | 2 +- core/assets/shaders/planetgrid.fragment.glsl | 14 ++++ core/assets/shaders/planetgrid.vertex.glsl | 12 ++++ core/src/mindustry/graphics/PlanetMesh.java | 19 ++++-- core/src/mindustry/graphics/Shaders.java | 16 +++++ .../mindustry/ui/dialogs/PlanetDialog.java | 68 +++++++++++++++---- gradle.properties | 2 +- 7 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 core/assets/shaders/planetgrid.fragment.glsl create mode 100644 core/assets/shaders/planetgrid.vertex.glsl diff --git a/core/assets/shaders/planet.fragment.glsl b/core/assets/shaders/planet.fragment.glsl index 17602c704f..fbd1548992 100755 --- a/core/assets/shaders/planet.fragment.glsl +++ b/core/assets/shaders/planet.fragment.glsl @@ -5,5 +5,5 @@ precision mediump float; varying vec4 v_col; void main(){ - gl_FragColor = v_col; + gl_FragColor = v_col; } diff --git a/core/assets/shaders/planetgrid.fragment.glsl b/core/assets/shaders/planetgrid.fragment.glsl new file mode 100644 index 0000000000..ccdf82998a --- /dev/null +++ b/core/assets/shaders/planetgrid.fragment.glsl @@ -0,0 +1,14 @@ +#ifdef GL_ES +precision mediump float; +#endif + +varying vec4 v_col; +varying vec4 v_position; + +uniform vec3 u_mouse; + +const vec4 shadow = vec4(0, 0, 0, 0); + +void main(){ + gl_FragColor = mix(v_col, shadow, distance(u_mouse, v_position.xyz)); +} diff --git a/core/assets/shaders/planetgrid.vertex.glsl b/core/assets/shaders/planetgrid.vertex.glsl new file mode 100644 index 0000000000..34e7c73a2e --- /dev/null +++ b/core/assets/shaders/planetgrid.vertex.glsl @@ -0,0 +1,12 @@ +attribute vec4 a_position; +attribute vec4 a_color; + +uniform mat4 u_projModelView; +varying vec4 v_col; +varying vec4 v_position; + +void main() { + gl_Position = u_projModelView * a_position; + v_col = a_color; + v_position = a_position; +} diff --git a/core/src/mindustry/graphics/PlanetMesh.java b/core/src/mindustry/graphics/PlanetMesh.java index 1f1c883536..2200ecd243 100644 --- a/core/src/mindustry/graphics/PlanetMesh.java +++ b/core/src/mindustry/graphics/PlanetMesh.java @@ -43,6 +43,12 @@ public class PlanetMesh{ generateMesh(); } + public @Nullable Vec3 intersect(Ray ray){ + boolean found = Intersector3D.intersectRaySphere(ray, center, radius, Tmp.v33); + if(!found) return null; + return Tmp.v33; + } + /** @return the sector that is hit by this ray, or null if nothing intersects it. */ public @Nullable Ptile getTile(Ray ray){ boolean found = Intersector3D.intersectRaySphere(ray, center, radius, Tmp.v33); @@ -51,10 +57,15 @@ public class PlanetMesh{ } public void render(Mat3D mat){ - Shaders.planet.begin(); - Shaders.planet.setUniformMatrix4("u_projModelView", mat.val); - mesh.render(Shaders.planet, lines ? Gl.lines : Gl.triangles); - Shaders.planet.end(); + render(mat, Shaders.planet); + } + + public void render(Mat3D mat, Shader shader){ + shader.begin(); + shader.setUniformMatrix4("u_projModelView", mat.val); + shader.apply(); + mesh.render(shader, lines ? Gl.lines : Gl.triangles); + shader.end(); } private void generateMesh(){ diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 0aa0d7c4af..adc80ea0b4 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -4,6 +4,7 @@ import arc.Core; import arc.graphics.Color; import arc.graphics.g2d.TextureRegion; import arc.graphics.gl.Shader; +import arc.math.geom.*; import arc.scene.ui.layout.Scl; import arc.util.ArcAnnotate.*; import arc.util.Time; @@ -18,6 +19,7 @@ public class Shaders{ public static LightShader light; public static SurfaceShader water, tar, slag; public static Shader planet; + public static PlanetGridShader planetGrid; public static void init(){ shadow = new Shadow(); @@ -37,6 +39,20 @@ public class Shaders{ tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); planet = new LoadShader("planet", "planet"); + planetGrid = new PlanetGridShader(); + } + + public static class PlanetGridShader extends LoadShader{ + public Vec3 mouse = new Vec3(); + + public PlanetGridShader(){ + super("planetgrid", "planetgrid"); + } + + @Override + public void apply(){ + setUniformf("u_mouse", mouse); + } } public static class LightShader extends LoadShader{ diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index b4a201e9d8..299955f6a1 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -22,7 +22,11 @@ import mindustry.ui.*; import static mindustry.Vars.*; public class PlanetDialog extends FloatingDialog{ - private static final Color outlineColor = Pal.accent.cpy().a(0.6f), shadowColor = new Color(0, 0, 0, 0.7f); + private static final Color + outlineColor = Pal.accent.cpy().a(1f), + hoverColor = Pal.accent.cpy().a(0.5f), + borderColor = Pal.accent.cpy().a(0.3f), + shadowColor = new Color(0, 0, 0, 0.7f); private static final float camLength = 4f; float outlineRad = 1.15f; @@ -126,9 +130,11 @@ public class PlanetDialog extends FloatingDialog{ batch.proj(cam.combined()); PlanetMesh outline = outline(planet.size); + Vec3 tile = outline.intersect(cam.getPickRay(Core.input.mouseX(), Core.input.mouseY())); + Shaders.planetGrid.mouse.lerp(tile == null ? Vec3.Zero : tile, 0.2f); planet.mesh.render(cam.combined()); - outline.render(cam.combined()); + outline.render(cam.combined(), Shaders.planetGrid); for(Sector sec : planet.sectors){ if(sec.save == null){ @@ -137,20 +143,24 @@ public class PlanetDialog extends FloatingDialog{ } if(hovered != null){ - draw(hovered, outlineColor, 0.001f); - - //if(Core.input.keyTap(KeyCode.SPACE)){ - // control.playSector(hovered); - // ui.planet.hide(); - //} + draw(hovered, hoverColor, -0.001f); + drawBorders(hovered, borderColor); } if(selected != null){ drawSelection(selected); + drawBorders(selected, borderColor); + + //TODO use better input + if(Core.input.keyTap(KeyCode.SPACE)){ + control.playSector(selected); + ui.planet.hide(); + } } batch.flush(Gl.triangles); + if(true) Draw.batch(projector, () -> { if(hovered != null){ setPlane(hovered); @@ -163,13 +173,43 @@ public class PlanetDialog extends FloatingDialog{ } }); - /* - Vec3 pos = cam.project(Tmp.v31.set(selected.tile.v).setLength(outlineRad)); - selectTable.setPosition(pos.x, pos.y, Align.center); - selectTable.draw(); - */ + //3D aligned table + Gl.disable(Gl.cullFace); Gl.disable(Gl.depthTest); + + if(false && selected != null){ + Vec3 pos = cam.project(Tmp.v31.set(selected.tile.v).setLength(outlineRad)); + stable.setPosition(pos.x, pos.y, Align.center); + stable.draw(); + } + } + + private void drawBorders(Sector sector, Color base){ + Color color = Tmp.c1.set(base).a(base.a + 0.3f + Mathf.absin(Time.globalTime(), 5f, 0.3f)); + + float r1 = 1f; + float r2 = outlineRad + 0.001f; + + for(int i = 0; i < sector.tile.corners.length; i++){ + Corner c = sector.tile.corners[i], next = sector.tile.corners[(i+1) % sector.tile.corners.length]; + + Tmp.v31.set(c.v).setLength(r2); + Tmp.v32.set(next.v).setLength(r2); + Tmp.v33.set(c.v).setLength(r1); + + batch.tri2(Tmp.v31, Tmp.v32, Tmp.v33, color); + + Tmp.v31.set(next.v).setLength(r2); + Tmp.v32.set(next.v).setLength(r1); + Tmp.v33.set(c.v).setLength(r1); + + batch.tri2(Tmp.v31, Tmp.v32, Tmp.v33, color); + } + + if(batch.getNumVertices() >= batch.getMaxVertices() - 6 * 6){ + batch.flush(Gl.triangles); + } } private void updateSelected(){ @@ -205,7 +245,7 @@ public class PlanetDialog extends FloatingDialog{ private void setPlane(Sector sector){ projector.setPlane( //origin on sector position - Tmp.v33.set(sector.tile.v).setLength(outlineRad + 0.001f), + Tmp.v33.set(sector.tile.v).setLength(outlineRad + 0.1f), //face up sector.plane.project(Tmp.v32.set(sector.tile.v).add(Vec3.Y)).sub(sector.tile.v).nor(), //right vector diff --git a/gradle.properties b/gradle.properties index 4a26a2fcbf..675667516d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=7dd0965f3ca6684d3bd78b821c5a69e8922fa71b +archash=4db0d154520aa33bbd35c0a71a6e1d9794f3f403