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 5c4b86dd58..e1b36229a5 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 @@ -152,7 +152,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int textureArrayId; - private final IntBuffer uniformBuffer = GpuIntBuffer.allocateDirect(5); + private int uniformBufferId; + private final IntBuffer uniformBuffer = GpuIntBuffer.allocateDirect(5 + 3 + 2048 * 4); private final float[] textureOffsets = new float[128]; private GpuIntBuffer vertexBuffer; @@ -211,7 +212,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { try { - bufferId = uvBufferId = -1; + bufferId = uvBufferId = uniformBufferId = -1; vertexBuffer = new GpuIntBuffer(); uvBuffer = new GpuFloatBuffer(); @@ -265,6 +266,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks initVao(); initProgram(); initInterfaceTexture(); + initUniformBuffer(); client.setDrawCallbacks(this); client.setGpu(true); @@ -338,6 +340,12 @@ public class GpuPlugin extends Plugin implements DrawCallbacks uvBufferId = -1; } + if (uniformBufferId != -1) + { + GLUtil.glDeleteBuffer(gl, uniformBufferId); + uniformBufferId = -1; + } + shutdownInterfaceTexture(); shutdownProgram(); shutdownVao(); @@ -522,6 +530,25 @@ public class GpuPlugin extends Plugin implements DrawCallbacks interfaceTexture = -1; } + private void initUniformBuffer() + { + uniformBufferId = glGenBuffers(gl); + gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); + uniformBuffer.clear(); + uniformBuffer.put(new int[8]); + final int[] pad = new int[2]; + for (int i = 0; i < 2048; i++) + { + uniformBuffer.put(Perspective.SINE[i]); + uniformBuffer.put(Perspective.COSINE[i]); + uniformBuffer.put(pad); + } + uniformBuffer.flip(); + + gl.glBufferData(gl.GL_UNIFORM_BUFFER, uniformBuffer.limit() * Integer.BYTES, uniformBuffer, gl.GL_STATIC_DRAW); + gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, 0); + } + private void createProjectionMatrix(float left, float right, float bottom, float top, float near, float far) { // create a standard orthographic projection @@ -695,7 +722,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.GL_STREAM_DRAW); // UBO - int uniformBufferId = glGenBuffers(gl); gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); uniformBuffer.clear(); uniformBuffer @@ -706,7 +732,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks .put(client.getScale()); uniformBuffer.flip(); - gl.glBufferData(gl.GL_UNIFORM_BUFFER, uniformBuffer.limit() * Integer.BYTES, uniformBuffer, gl.GL_STATIC_DRAW); + gl.glBufferSubData(gl.GL_UNIFORM_BUFFER, 0, uniformBuffer.limit() * Integer.BYTES, uniformBuffer); gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, 0); gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); @@ -815,8 +841,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glUseProgram(0); } - glDeleteBuffer(gl, uniformBufferId); - vertexBuffer.clear(); uvBuffer.clear(); modelBuffer.clear(); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl index e93d66abe0..cb55bf0baa 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl @@ -29,8 +29,9 @@ * Rotate a vertex by a given orientation in JAU */ ivec4 rotate(ivec4 vertex, int orientation) { - int s = int(65536.0f * sin(orientation * UNIT)); - int c = int(65536.0f * cos(orientation * UNIT)); + ivec2 sinCos = sinCosTable[orientation]; + int s = sinCos.x; + int c = sinCos.y; int x = vertex.z * s + vertex.x * c >> 16; int z = vertex.z * c - vertex.x * s >> 16; return ivec4(x, vertex.y, z, vertex.w); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl index 35b257a226..1ecde8126d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl @@ -33,6 +33,7 @@ layout(std140) uniform uniforms { int centerX; int centerY; int zoom; + ivec2 sinCosTable[2048]; }; shared int totalNum[12]; // number of faces with a given priority diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl index c486c4c02c..9548de5435 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl @@ -33,6 +33,7 @@ layout(std140) uniform uniforms { int centerX; int centerY; int zoom; + ivec2 sinCosTable[2048]; }; shared int totalNum[12]; // number of faces with a given priority 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 c5fd56da66..b00ef87962 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 @@ -37,6 +37,7 @@ layout(std140) uniform Uniforms { int centerX; int centerY; int zoom; + ivec2 sinCosTable[2048]; }; uniform mat4 projectionMatrix;