Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
075873c
SSBO Support with Distance Fade added
RuffledPlume Nov 19, 2025
8d3b68e
Moved Zone Data to UBO instead of VBO
RuffledPlume Dec 5, 2025
25da4c4
Tweaks
RuffledPlume Dec 5, 2025
01e4919
Tweaks reduce reveal time to 0.25 seconds, rather than a full second
RuffledPlume Dec 5, 2025
e2a8de2
Sync
RuffledPlume Dec 5, 2025
f564621
Fixes
RuffledPlume Dec 5, 2025
e7d461f
Shadow dither fades in
RuffledPlume Dec 5, 2025
448d2e6
Fade Fog Color in instead of dither
RuffledPlume Dec 5, 2025
2119476
SSBO Support with Distance Fade added
RuffledPlume Nov 19, 2025
1bfe0e5
Moved Zone Data to UBO instead of VBO
RuffledPlume Dec 5, 2025
0076665
Tweaks
RuffledPlume Dec 5, 2025
dd6a324
Tweaks reduce reveal time to 0.25 seconds, rather than a full second
RuffledPlume Dec 5, 2025
0ea4722
Sync
RuffledPlume Dec 5, 2025
42ec28b
Fixes
RuffledPlume Dec 5, 2025
7685d33
Shadow dither fades in
RuffledPlume Dec 5, 2025
4cc7a11
Fade Fog Color in instead of dither
RuffledPlume Dec 5, 2025
c41f68d
Merge remote-tracking branch 'origin/ZoneSSBO' into ZoneSSBO
RuffledPlume Dec 6, 2025
863945d
Tweaks
RuffledPlume Dec 6, 2025
dac5b1c
Tweaks and fixes
RuffledPlume Dec 6, 2025
4203bec
More tweaks
RuffledPlume Dec 6, 2025
35f7a21
Split Model Fade & Zone Reveal into two fades
RuffledPlume Dec 6, 2025
46462ee
Merge remote-tracking branch '117HD/master' into ZoneSSBO
RuffledPlume Dec 6, 2025
a6bb570
Merge branch 'master' into ZoneSSBO
RuffledPlume Dec 7, 2025
c2877b1
Fix Merge conflicts
RuffledPlume Dec 7, 2025
e3ed3a7
Added options for the fade type
RuffledPlume Dec 7, 2025
fa1a8d4
Fade using FogColor for the TopLevel & Alpha for SubScenes
RuffledPlume Dec 7, 2025
b853446
Merge branch 'master' into ZoneSSBO
RuffledPlume Dec 11, 2025
194715a
Merge remote-tracking branch '117HD/master' into ZoneSSBO
RuffledPlume Dec 11, 2025
02a25d4
Merge branch 'master' into ZoneSSBO
RuffledPlume Dec 14, 2025
84ab8ef
VersionHeader will now be printed out
RuffledPlume Dec 14, 2025
3036c01
Merge remote-tracking branch '117HD/master' into ZoneSSBO
RuffledPlume Dec 22, 2025
59daff1
Tweaks
RuffledPlume Dec 22, 2025
4db7c63
Fixed Race condition where the underlying data structure is being res…
RuffledPlume Dec 22, 2025
ee1ba2a
Fixed Zone Fade for top level
RuffledPlume Dec 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 58 additions & 54 deletions src/main/java/rs117/hd/HdPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,16 @@
import rs117.hd.config.ShadowMode;
import rs117.hd.config.VanillaShadowMode;
import rs117.hd.opengl.AsyncUICopy;
import rs117.hd.opengl.GLBinding;
import rs117.hd.opengl.buffer.ShaderStructuredBuffer;
import rs117.hd.opengl.buffer.uniforms.UBODisplacement;
import rs117.hd.opengl.buffer.uniforms.UBOGlobal;
import rs117.hd.opengl.buffer.uniforms.UBOLights;
import rs117.hd.opengl.buffer.uniforms.UBOUI;
import rs117.hd.opengl.shader.ShaderException;
import rs117.hd.opengl.shader.ShaderIncludes;
import rs117.hd.opengl.shader.TiledLightingShaderProgram;
import rs117.hd.opengl.shader.UIShaderProgram;
import rs117.hd.opengl.uniforms.UBOCompute;
import rs117.hd.opengl.uniforms.UBOGlobal;
import rs117.hd.opengl.uniforms.UBOLights;
import rs117.hd.opengl.uniforms.UBOUI;
import rs117.hd.overlays.FrameTimer;
import rs117.hd.overlays.GammaCalibrationOverlay;
import rs117.hd.overlays.ShadowMapOverlay;
Expand Down Expand Up @@ -127,6 +129,13 @@
import static net.runelite.api.Constants.*;
import static org.lwjgl.opengl.GL33C.*;
import static rs117.hd.HdPluginConfig.*;
import static rs117.hd.opengl.GLBinding.BINDING_IMG_TILE_LIGHTING_MAP;
import static rs117.hd.opengl.GLBinding.BINDING_TEX_SHADOW_MAP;
import static rs117.hd.opengl.GLBinding.BINDING_TEX_UI;
import static rs117.hd.opengl.GLBinding.BINDING_UBO_GLOBAL;
import static rs117.hd.opengl.GLBinding.BINDING_UBO_LIGHTS;
import static rs117.hd.opengl.GLBinding.BINDING_UBO_LIGHTS_CULLING;
import static rs117.hd.opengl.GLBinding.BINDING_UBO_UI;
import static rs117.hd.utils.MathUtils.*;
import static rs117.hd.utils.ResourcePath.path;

Expand All @@ -148,26 +157,6 @@ public class HdPlugin extends Plugin {
public static final String INTEL_DRIVER_URL = "https://www.intel.com/content/www/us/en/support/detect.html";
public static final String NVIDIA_DRIVER_URL = "https://www.nvidia.com/en-us/geforce/drivers/";

public static int MAX_TEXTURE_UNITS;
public static int TEXTURE_UNIT_COUNT = 0;
public static final int TEXTURE_UNIT_UI = GL_TEXTURE0 + TEXTURE_UNIT_COUNT++;
public static final int TEXTURE_UNIT_GAME = GL_TEXTURE0 + TEXTURE_UNIT_COUNT++;
public static final int TEXTURE_UNIT_SHADOW_MAP = GL_TEXTURE0 + TEXTURE_UNIT_COUNT++;
public static final int TEXTURE_UNIT_TILE_HEIGHT_MAP = GL_TEXTURE0 + TEXTURE_UNIT_COUNT++;
public static final int TEXTURE_UNIT_TILED_LIGHTING_MAP = GL_TEXTURE0 + TEXTURE_UNIT_COUNT++;

public static int MAX_IMAGE_UNITS;
public static int IMAGE_UNIT_COUNT = 0;
public static final int IMAGE_UNIT_TILED_LIGHTING = IMAGE_UNIT_COUNT++;

public static int UNIFORM_BLOCK_COUNT = 0;
public static final int UNIFORM_BLOCK_GLOBAL = UNIFORM_BLOCK_COUNT++;
public static final int UNIFORM_BLOCK_MATERIALS = UNIFORM_BLOCK_COUNT++;
public static final int UNIFORM_BLOCK_WATER_TYPES = UNIFORM_BLOCK_COUNT++;
public static final int UNIFORM_BLOCK_LIGHTS = UNIFORM_BLOCK_COUNT++;
public static final int UNIFORM_BLOCK_LIGHTS_CULLING = UNIFORM_BLOCK_COUNT++;
public static final int UNIFORM_BLOCK_UI = UNIFORM_BLOCK_COUNT++;

public static final float NEAR_PLANE = 50;
public static final int MAX_FACE_COUNT = 6144;
public static final int MAX_DISTANCE = EXTENDED_SCENE_SIZE;
Expand Down Expand Up @@ -323,13 +312,6 @@ public class HdPlugin extends Plugin {
public AWTContext awtContext;
private Callback debugCallback;

private static final String LINUX_VERSION_HEADER =
"#version 420\n" +
"#extension GL_ARB_compute_shader : require\n" +
"#extension GL_ARB_shader_storage_buffer_object : require\n" +
"#extension GL_ARB_explicit_attrib_location : require\n";
private static final String WINDOWS_VERSION_HEADER = "#version 430\n";

private static final ResourcePath SHADER_PATH = Props
.getFolder("rlhd.shader-path", () -> path(HdPlugin.class));

Expand Down Expand Up @@ -368,6 +350,7 @@ public class HdPlugin extends Plugin {
public int texTiledLighting;

public final UBOGlobal uboGlobal = new UBOGlobal();
public final UBODisplacement uboDisplacement = new UBODisplacement();
public final UBOLights uboLights = new UBOLights(false);
public final UBOLights uboLightsCulling = new UBOLights(true);
public final UBOUI uboUI = new UBOUI();
Expand Down Expand Up @@ -434,6 +417,10 @@ public class HdPlugin extends Plugin {
@Getter
public int drawnTileCount;
@Getter
public int drawnZoneCount;
@Getter
public int drawCallCount;
@Getter
public int drawnStaticRenderableCount;
@Getter
public int drawnDynamicRenderableCount;
Expand Down Expand Up @@ -562,14 +549,6 @@ protected void startUp() {
lwjglInitialized = true;
checkGLErrors();

MAX_TEXTURE_UNITS = glGetInteger(GL_MAX_TEXTURE_IMAGE_UNITS); // Not the fixed pipeline MAX_TEXTURE_UNITS
if (MAX_TEXTURE_UNITS < TEXTURE_UNIT_COUNT)
log.warn("The GPU only supports {} texture units", MAX_TEXTURE_UNITS);
MAX_IMAGE_UNITS = GL_CAPS.GL_ARB_shader_image_load_store ?
glGetInteger(ARBShaderImageLoadStore.GL_MAX_IMAGE_UNITS) : 0;
if (MAX_IMAGE_UNITS < IMAGE_UNIT_COUNT)
log.warn("The GPU only supports {} image units", MAX_IMAGE_UNITS);

if (log.isDebugEnabled() && GL_CAPS.glDebugMessageControl != 0) {
debugCallback = GLUtil.setupDebugMessageCallback();
if (debugCallback != null) {
Expand Down Expand Up @@ -706,6 +685,8 @@ protected void shutDown() {
if (lwjglInitialized) {
lwjglInitialized = false;
renderer.waitUntilIdle();
GLBinding.reset();


destroyUiTexture();
destroyShaders();
Expand Down Expand Up @@ -826,12 +807,22 @@ public String generateGetter(String type, int arrayLength) {
}

public ShaderIncludes getShaderIncludes() {
String versionHeader = "#version 330";
if (ShaderStructuredBuffer.supportsShaderStorage()) {
if (GL_CAPS.OpenGL45) versionHeader = "#version 450";
else if (GL_CAPS.OpenGL44) versionHeader = "#version 440";
else if (GL_CAPS.OpenGL43) versionHeader = "#version 430";
else if (GL_CAPS.OpenGL42) versionHeader = "#version 420";
else if (GL_CAPS.OpenGL41) versionHeader = "#version 410";
}
log.debug("VersionHeader: {}", versionHeader);
var includes = new ShaderIncludes()
.addIncludePath(SHADER_PATH)
.addInclude("VERSION_HEADER", OSType.getOSType() == OSType.Linux ? LINUX_VERSION_HEADER : WINDOWS_VERSION_HEADER)
.addInclude("VERSION_HEADER", versionHeader)
.define("UI_SCALING_MODE", config.uiScalingMode())
.define("COLOR_BLINDNESS", config.colorBlindness())
.define("APPLY_COLOR_FILTER", configColorFilter != ColorFilter.NONE)
.define("FADE_TYPE", config.fadeType())
.define("MATERIAL_COUNT", MaterialManager.MATERIALS.length)
.define("WATER_TYPE_COUNT", waterTypeManager.uboWaterTypes.getCount())
.define("DYNAMIC_LIGHTS", configDynamicLights != DynamicLights.NONE)
Expand All @@ -852,13 +843,14 @@ public ShaderIncludes getShaderIncludes() {
.define("WIND_DISPLACEMENT", configWindDisplacement)
.define("WIND_DISPLACEMENT_NOISE_RESOLUTION", WIND_DISPLACEMENT_NOISE_RESOLUTION)
.define("CHARACTER_DISPLACEMENT", configCharacterDisplacement)
.define("MAX_CHARACTER_POSITION_COUNT", max(1, UBOCompute.MAX_CHARACTER_POSITION_COUNT))
.define("MAX_CHARACTER_POSITION_COUNT", max(1, UBODisplacement.MAX_CHARACTER_POSITION_COUNT))
.define("WIREFRAME", config.wireframe())
.define("WINDOWS_HDR_CORRECTION", config.windowsHdrCorrection())
.define("LEGACY_RENDERER", renderer instanceof LegacyRenderer)
.define("ZONE_RENDERER", renderer instanceof ZoneRenderer)
.define("MAX_SIMULTANEOUS_WORLD_VIEWS", 0)
.define("WORLD_VIEW_GETTER", "")
.define("MODEL_DATA_GETTER", "")
.addInclude(
"MATERIAL_CONSTANTS", () -> {
StringBuilder include = new StringBuilder();
Expand All @@ -879,6 +871,7 @@ public ShaderIncludes getShaderIncludes() {
.addUniformBuffer(uboLights)
.addUniformBuffer(uboLightsCulling)
.addUniformBuffer(uboUI)
.addUniformBuffer(uboDisplacement)
.addUniformBuffer(materialManager.uboMaterials)
.addUniformBuffer(waterTypeManager.uboWaterTypes);
renderer.addShaderIncludes(includes);
Expand Down Expand Up @@ -1053,10 +1046,10 @@ private void destroyVaos() {
}

private void initializeUbos() {
uboGlobal.initialize(HdPlugin.UNIFORM_BLOCK_GLOBAL);
uboLights.initialize(HdPlugin.UNIFORM_BLOCK_LIGHTS);
uboLightsCulling.initialize(HdPlugin.UNIFORM_BLOCK_LIGHTS_CULLING);
uboUI.initialize(HdPlugin.UNIFORM_BLOCK_UI);
uboGlobal.initialize(BINDING_UBO_GLOBAL);
uboLights.initialize(BINDING_UBO_LIGHTS);
uboLightsCulling.initialize(BINDING_UBO_LIGHTS_CULLING);
uboUI.initialize(BINDING_UBO_UI);
}

private void destroyUbos() {
Expand All @@ -1070,7 +1063,7 @@ private void initializeUiTexture() {
pboUi = glGenBuffers();

texUi = glGenTextures();
glActiveTexture(TEXTURE_UNIT_UI);
BINDING_TEX_UI.setActive();
glBindTexture(GL_TEXTURE_2D, texUi);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Expand Down Expand Up @@ -1105,7 +1098,7 @@ public void updateTiledLightingFbo() {

fboTiledLighting = glGenFramebuffers();
texTiledLighting = glGenTextures();
glActiveTexture(TEXTURE_UNIT_TILED_LIGHTING_MAP);
BINDING_IMG_TILE_LIGHTING_MAP.setActive();
glBindTexture(GL_TEXTURE_2D_ARRAY, texTiledLighting);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Expand All @@ -1130,7 +1123,7 @@ public void updateTiledLightingFbo() {

if (tiledLightingImageStoreProgram.isValid())
ARBShaderImageLoadStore.glBindImageTexture(
IMAGE_UNIT_TILED_LIGHTING, texTiledLighting, 0, true, 0, GL_WRITE_ONLY, GL_RGBA16UI);
BINDING_IMG_TILE_LIGHTING_MAP.getImageUnit(), texTiledLighting, 0, true, 0, GL_WRITE_ONLY, GL_RGBA16UI);

glBindFramebuffer(GL_FRAMEBUFFER, awtContext.getFramebuffer(false));

Expand Down Expand Up @@ -1299,7 +1292,7 @@ private void initializeShadowMapFbo() {

// Create texture
texShadowMap = glGenTextures();
glActiveTexture(TEXTURE_UNIT_SHADOW_MAP);
BINDING_TEX_SHADOW_MAP.setActive();
glBindTexture(GL_TEXTURE_2D, texShadowMap);

shadowMapResolution = config.shadowResolution().getValue();
Expand Down Expand Up @@ -1340,7 +1333,7 @@ private void initializeShadowMapFbo() {
private void initializeDummyShadowMap() {
// Create dummy texture
texShadowMap = glGenTextures();
glActiveTexture(TEXTURE_UNIT_SHADOW_MAP);
BINDING_TEX_SHADOW_MAP.setActive();
glBindTexture(GL_TEXTURE_2D, texShadowMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Expand Down Expand Up @@ -1379,7 +1372,7 @@ public void prepareInterfaceTexture() {
glBufferData(GL_PIXEL_UNPACK_BUFFER, uiResolution[0] * uiResolution[1] * 4L, GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

glActiveTexture(TEXTURE_UNIT_UI);
BINDING_TEX_UI.setActive();
glBindTexture(GL_TEXTURE_2D, texUi);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiResolution[0], uiResolution[1], 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
}
Expand Down Expand Up @@ -1422,7 +1415,7 @@ public void prepareInterfaceTexture() {

frameTimer.begin(Timer.UPLOAD_UI);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
glActiveTexture(TEXTURE_UNIT_UI);
BINDING_TEX_UI.setActive();
glBindTexture(GL_TEXTURE_2D, texUi);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
frameTimer.end(Timer.UPLOAD_UI);
Expand Down Expand Up @@ -1465,7 +1458,7 @@ public void drawUi(int overlayColor) {
// See https://www.khronos.org/opengl/wiki/Sampler_Object for details.
// GL_NEAREST makes sampling for bicubic/xBR simpler, so it should be used whenever linear/pixel isn't
final int function = config.uiScalingMode().glSamplingFunction;
glActiveTexture(TEXTURE_UNIT_UI);
BINDING_TEX_UI.setActive();
glBindTexture(GL_TEXTURE_2D, texUi);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, function);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, function);
Expand Down Expand Up @@ -1701,6 +1694,7 @@ public void processPendingConfigChanges() {
case KEY_CHARACTER_DISPLACEMENT:
case KEY_WIREFRAME:
case KEY_PIXELATED_SHADOWS:
case KEY_FADE_TYPE:
case KEY_WINDOWS_HDR_CORRECTION:
recompilePrograms = true;
break;
Expand Down Expand Up @@ -1916,7 +1910,13 @@ public static void clearGLErrors() {
// @formatter:on
}

public interface IGetContextFunction { String get(); }

public static void checkGLErrors() {
checkGLErrors(null);
}

public static void checkGLErrors(IGetContextFunction ctxDelegate) {
if (SKIP_GL_ERROR_CHECKS)
return;

Expand Down Expand Up @@ -1950,7 +1950,11 @@ public static void checkGLErrors() {
break;
}

log.debug("glGetError:", new Exception(errStr));
if (ctxDelegate != null) {
log.debug("{} - glGetError:", ctxDelegate.get(), new Exception(errStr));
} else {
log.debug("glGetError:", new Exception(errStr));
}
}
}

Expand Down
12 changes: 12 additions & 0 deletions src/main/java/rs117/hd/HdPluginConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import rs117.hd.config.Contrast;
import rs117.hd.config.DefaultSkyColor;
import rs117.hd.config.DynamicLights;
import rs117.hd.config.FadeType;
import rs117.hd.config.FogDepthMode;
import rs117.hd.config.Saturation;
import rs117.hd.config.SceneScalingMode;
Expand Down Expand Up @@ -842,6 +843,17 @@ default ColorFilter colorFilter() {
return ColorFilter.NONE;
}

String KEY_FADE_TYPE = "fadeType";
@ConfigItem(
keyName = KEY_FADE_TYPE,
name = "Fade Type",
description = "",
section = miscellaneousSettings
)
default FadeType fadeType() {
return FadeType.ALPHA;
}

String KEY_REMOVE_VERTEX_SNAPPING = "removeVertexSnapping";
@ConfigItem(
keyName = KEY_REMOVE_VERTEX_SNAPPING,
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/rs117/hd/config/FadeType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package rs117.hd.config;

public enum FadeType {
ALPHA,
DITHER
}
3 changes: 2 additions & 1 deletion src/main/java/rs117/hd/opengl/AsyncUICopy.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import rs117.hd.utils.jobs.Job;

import static org.lwjgl.opengl.GL33C.*;
import static rs117.hd.opengl.GLBinding.BINDING_TEX_UI;

@Slf4j
public final class AsyncUICopy extends Job {
Expand Down Expand Up @@ -85,7 +86,7 @@ public boolean complete() {
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, interfacePbo);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);

glActiveTexture(HdPlugin.TEXTURE_UNIT_UI);
BINDING_TEX_UI.setActive();
glBindTexture(GL_TEXTURE_2D, interfaceTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
timer.add(Timer.COPY_UI, System.nanoTime() - timestamp);
Expand Down
Loading