From 85460f16c336e7362767ec96bf253fbdea9a069b Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 7 Jan 2019 13:40:37 -0500 Subject: [PATCH] gpu plugin: add fog Co-authored-by: logarithm --- .../client/plugins/gpu/GpuPlugin.java | 16 ++++++++- .../client/plugins/gpu/GpuPluginConfig.java | 11 ++++++ .../net/runelite/client/plugins/gpu/frag.glsl | 9 +++-- .../net/runelite/client/plugins/gpu/geom.glsl | 5 +++ .../net/runelite/client/plugins/gpu/vert.glsl | 35 +++++++++++++++++++ 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 68209ba82d..fec46b134e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -215,6 +215,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int centerY; // Uniforms + private int uniUseFog; + private int uniFogColor; + private int uniFogDepth; + private int uniDrawDistance; private int uniProjectionMatrix; private int uniBrightness; private int uniTex; @@ -506,6 +510,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks uniProjectionMatrix = gl.glGetUniformLocation(glProgram, "projectionMatrix"); uniBrightness = gl.glGetUniformLocation(glProgram, "brightness"); uniSmoothBanding = gl.glGetUniformLocation(glProgram, "smoothBanding"); + uniUseFog = gl.glGetUniformLocation(glProgram, "useFog"); + uniFogColor = gl.glGetUniformLocation(glProgram, "fogColor"); + uniFogDepth = gl.glGetUniformLocation(glProgram, "fogDepth"); + uniDrawDistance = gl.glGetUniformLocation(glProgram, "drawDistance"); uniTex = gl.glGetUniformLocation(glUiProgram, "tex"); uniTextures = gl.glGetUniformLocation(glProgram, "textures"); @@ -723,7 +731,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks scene.setDrawDistance(drawDistance); } - public void drawScenePaint(int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, SceneTilePaint paint, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY) @@ -1016,6 +1023,13 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glUseProgram(glProgram); + final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, config.drawDistance())); + final int fogDepth = config.fogDepth(); + gl.glUniform1i(uniUseFog, fogDepth > 0 ? 1 : 0); + gl.glUniform4f(uniFogColor, (sky >> 16 & 0xFF) / 255f, (sky >> 8 & 0xFF) / 255f, (sky & 0xFF) / 255f, 1f); + gl.glUniform1i(uniFogDepth, fogDepth); + gl.glUniform1i(uniDrawDistance, drawDistance * Perspective.LOCAL_TILE_SIZE); + // Brightness happens to also be stored in the texture provider, so we use that gl.glUniform1f(uniBrightness, (float) textureProvider.getBrightness()); gl.glUniform1f(uniSmoothBanding, config.smoothBanding() ? 0f : 1f); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java index cdfa6ddd05..33900e70cb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java @@ -64,4 +64,15 @@ public interface GpuPluginConfig extends Config { return AntiAliasingMode.DISABLED; } + + @ConfigItem( + keyName = "fogDepth", + name = "Fog depth", + description = "Distance from the scene edge the fog starts", + position = 4 + ) + default int fogDepth() + { + return 0; + } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl index 8973b8b7e9..03d8464642 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl @@ -28,10 +28,12 @@ uniform sampler2DArray textures; uniform vec2 textureOffsets[64]; uniform float brightness; uniform float smoothBanding; +uniform vec4 fogColor; in vec4 Color; in float fHsl; in vec4 fUv; +in float fogAmount; out vec4 FragColor; @@ -54,8 +56,9 @@ void main() { vec4 textureColor = texture(textures, vec3(animatedUv, n)); vec4 textureColorBrightness = pow(textureColor, vec4(brightness, brightness, brightness, 1.0f)); - FragColor = textureColorBrightness * smoothColor; - } else { - FragColor = smoothColor; + smoothColor = textureColorBrightness * smoothColor; } + + vec3 mixedColor = mix(smoothColor.rgb, fogColor.rgb, fogAmount); + FragColor = vec4(mixedColor, smoothColor.a); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl index b9b328d62e..c644b1960e 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl @@ -49,10 +49,12 @@ in ivec3 vPosition[]; in vec4 vColor[]; in float vHsl[]; in vec4 vUv[]; +in float vFogAmount[]; out vec4 Color; out float fHsl; out vec4 fUv; +out float fogAmount; #include to_screen.glsl @@ -71,6 +73,7 @@ void main() { Color = vColor[0]; fHsl = vHsl[0]; fUv = vUv[0]; + fogAmount = vFogAmount[0]; gl_Position = projectionMatrix * tmp; EmitVertex(); @@ -78,6 +81,7 @@ void main() { Color = vColor[1]; fHsl = vHsl[1]; fUv = vUv[1]; + fogAmount = vFogAmount[1]; gl_Position = projectionMatrix * tmp; EmitVertex(); @@ -85,6 +89,7 @@ void main() { Color = vColor[2]; fHsl = vHsl[2]; fUv = vUv[2]; + fogAmount = vFogAmount[2]; gl_Position = projectionMatrix * tmp; EmitVertex(); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl index e9205ba81d..bdce8dd2ab 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl @@ -25,18 +25,43 @@ #version 330 +#define TILE_SIZE 128 + +#define FOG_SCENE_EDGE_MIN TILE_SIZE +#define FOG_SCENE_EDGE_MAX (103 * TILE_SIZE) + layout (location = 0) in ivec4 VertexPosition; layout (location = 1) in vec4 uv; +layout(std140) uniform uniforms { + int cameraYaw; + int cameraPitch; + int centerX; + int centerY; + int zoom; + int cameraX; + int cameraY; + int cameraZ; + ivec2 sinCosTable[2048]; +}; + uniform float brightness; +uniform int useFog; +uniform int fogDepth; +uniform int drawDistance; out ivec3 vPosition; out vec4 vColor; out float vHsl; out vec4 vUv; +out float vFogAmount; #include hsl_to_rgb.glsl +float fogFactorLinear(const float dist, const float start, const float end) { + return 1.0 - clamp((dist - start) / (end - start), 0.0, 1.0); +} + void main() { ivec3 vertex = VertexPosition.xyz; @@ -50,4 +75,14 @@ void main() vColor = vec4(rgb, 1.f - a); vHsl = float(hsl); vUv = uv; + + int fogWest = max(FOG_SCENE_EDGE_MIN, cameraX - drawDistance); + int fogEast = min(FOG_SCENE_EDGE_MAX, cameraX + drawDistance - TILE_SIZE); + int fogSouth = max(FOG_SCENE_EDGE_MIN, cameraZ - drawDistance); + int fogNorth = min(FOG_SCENE_EDGE_MAX, cameraZ + drawDistance - TILE_SIZE); + + // Calculate distance from the scene edge + float fogDistance = min(min(vertex.x - fogWest, fogEast - vertex.x), min(vertex.z - fogSouth, fogNorth - vertex.z)); + + vFogAmount = fogFactorLinear(fogDistance, 0, fogDepth * TILE_SIZE) * useFog; }