From a26cd46a7e93d2a03be74071e738c1de31e309c3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 2 Apr 2020 12:32:55 -0400 Subject: [PATCH] Reflective planet water --- core/assets/shaders/planet.vert | 9 +++++++-- core/src/mindustry/content/Blocks.java | 6 ++++++ core/src/mindustry/graphics/Shaders.java | 2 ++ core/src/mindustry/maps/planet/TODOPlanetGenerator.java | 3 +-- core/src/mindustry/ui/dialogs/PlanetDialog.java | 3 +++ core/src/mindustry/world/Block.java | 2 ++ gradle.properties | 2 +- 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/assets/shaders/planet.vert b/core/assets/shaders/planet.vert index 32f4605cb3..9623b2d125 100755 --- a/core/assets/shaders/planet.vert +++ b/core/assets/shaders/planet.vert @@ -5,7 +5,7 @@ attribute vec4 a_color; uniform mat4 u_proj; uniform mat4 u_trans; uniform vec3 u_lightdir; -//uniform vec3 u_camdir; +uniform vec3 u_camdir; uniform vec3 u_ambientColor; varying vec4 v_col; @@ -14,7 +14,12 @@ const vec3 diffuse = vec3(0); void main(){ vec3 norc = u_ambientColor * (diffuse + vec3(clamp((dot(a_normal, u_lightdir) + 1.0) / 2.0, 0.0, 1.0))); + float falloff = 4.0; + float shinelen = 0.2; + float shinedot = max((-dot(u_camdir, a_normal) - (1.0 - shinelen)) / shinelen, 0.0); + float shinyness = (1.0 - a_color.a) * pow(shinedot, falloff); + vec4 baseCol = vec4(a_color.rgb, 1.0); - v_col = a_color * vec4(norc, 1.0); + v_col = lerp(baseCol * vec4(norc, 1.0), vec4(1.0), shinyness * norc.r); gl_Position = u_proj * u_trans * a_position; } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 0554a22f7e..08cce13b7c 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -133,6 +133,7 @@ public class Blocks implements ContentList{ statusDuration = 120f; drownTime = 140f; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; water = new Floor("water"){{ @@ -143,6 +144,7 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.water; isLiquid = true; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; taintedWater = new Floor("tainted-water"){{ @@ -154,6 +156,7 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.water; isLiquid = true; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; darksandTaintedWater = new Floor("darksand-tainted-water"){{ @@ -164,6 +167,7 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.water; isLiquid = true; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; sandWater = new Floor("sand-water"){{ @@ -174,6 +178,7 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.water; isLiquid = true; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; darksandWater = new Floor("darksand-water"){{ @@ -184,6 +189,7 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.water; isLiquid = true; cacheLayer = CacheLayer.water; + albedo = 0.5f; }}; tar = new Floor("tar"){{ diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index c2509b73fe..3f4b7c6208 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -80,6 +80,7 @@ public class Shaders{ public static class PlanetShader extends LoadShader{ public Vec3 lightDir = new Vec3(1, 1, 1).nor(); public Color ambientColor = Color.white.cpy(); + public Vec3 camDir = new Vec3(); public PlanetShader(){ super("planet", "planet"); @@ -89,6 +90,7 @@ public class Shaders{ public void apply(){ setUniformf("u_lightdir", lightDir); setUniformf("u_ambientColor", ambientColor.r, ambientColor.g, ambientColor.b); + setUniformf("u_camdir", camDir); } } diff --git a/core/src/mindustry/maps/planet/TODOPlanetGenerator.java b/core/src/mindustry/maps/planet/TODOPlanetGenerator.java index c5d8201d97..afd25bc57d 100644 --- a/core/src/mindustry/maps/planet/TODOPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/TODOPlanetGenerator.java @@ -60,8 +60,7 @@ public class TODOPlanetGenerator extends PlanetGenerator{ Block block = getBlock(position); //replace salt with sand color if(block == Blocks.salt) return Blocks.sand.mapColor; - //return block.asFloor().isLiquid ? Tmp.c1.set(block.mapColor).a(0.5f) : block.mapColor; - return block.mapColor; + return Tmp.c1.set(block.mapColor).a(1f - block.albedo); } @Override diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 7b603ecb18..d9a8c96521 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -177,6 +177,9 @@ public class PlanetDialog extends FloatingDialog{ cam.lookAt(planet.position); cam.update(); + //TODO hacky + Shaders.planet.camDir.set(cam.direction).rotate(Vec3.Y, planet.getRotation()); + projector.proj(cam.combined()); batch.proj(cam.combined()); diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 9f2d595d06..b7a304b816 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -129,6 +129,8 @@ public class Block extends UnlockableContent{ public boolean hasShadow = true; /** Sounds made when this block breaks.*/ public Sound breakSound = Sounds.boom; + /** How reflective this block is. */ + public float albedo = 0f; /** The sound that this block makes while active. One sound loop. Do not overuse.*/ public Sound activeSound = Sounds.none; diff --git a/gradle.properties b/gradle.properties index e669c5abfc..9624095f00 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=50df607c88d697dc42b29b56947cda318f90d71b +archash=da2913187aa724da769c6a80bc709eebb5bc0888