Merge remote-tracking branch 'runelite/master'
This commit is contained in:
@@ -194,6 +194,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
private int vaoHandle;
|
private int vaoHandle;
|
||||||
|
|
||||||
private int interfaceTexture;
|
private int interfaceTexture;
|
||||||
|
private int interfacePbo;
|
||||||
|
|
||||||
private int vaoUiHandle;
|
private int vaoUiHandle;
|
||||||
private int vboUiHandle;
|
private int vboUiHandle;
|
||||||
@@ -726,6 +727,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
|
|
||||||
private void initInterfaceTexture()
|
private void initInterfaceTexture()
|
||||||
{
|
{
|
||||||
|
interfacePbo = glGenBuffers(gl);
|
||||||
|
|
||||||
interfaceTexture = glGenTexture(gl);
|
interfaceTexture = glGenTexture(gl);
|
||||||
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
||||||
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE);
|
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE);
|
||||||
@@ -737,6 +740,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
|
|
||||||
private void shutdownInterfaceTexture()
|
private void shutdownInterfaceTexture()
|
||||||
{
|
{
|
||||||
|
glDeleteBuffer(gl, interfacePbo);
|
||||||
glDeleteTexture(gl, interfaceTexture);
|
glDeleteTexture(gl, interfaceTexture);
|
||||||
interfaceTexture = -1;
|
interfaceTexture = -1;
|
||||||
}
|
}
|
||||||
@@ -1037,15 +1041,19 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
invokeOnMainThread(() -> drawFrame(overlayColor));
|
invokeOnMainThread(() -> drawFrame(overlayColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resize(int canvasWidth, int canvasHeight, int viewportWidth, int viewportHeight)
|
private void prepareInterfaceTexture(int canvasWidth, int canvasHeight)
|
||||||
{
|
{
|
||||||
if (canvasWidth != lastCanvasWidth || canvasHeight != lastCanvasHeight)
|
if (canvasWidth != lastCanvasWidth || canvasHeight != lastCanvasHeight)
|
||||||
{
|
{
|
||||||
lastCanvasWidth = canvasWidth;
|
lastCanvasWidth = canvasWidth;
|
||||||
lastCanvasHeight = canvasHeight;
|
lastCanvasHeight = canvasHeight;
|
||||||
|
|
||||||
|
gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, interfacePbo);
|
||||||
|
gl.glBufferData(gl.GL_PIXEL_UNPACK_BUFFER, canvasWidth * canvasHeight * 4L, null, gl.GL_STREAM_DRAW);
|
||||||
|
gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, 0);
|
||||||
|
|
||||||
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
||||||
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, canvasWidth, canvasHeight, 0, gl.GL_BGRA, gl.GL_UNSIGNED_INT_8_8_8_8_REV, null);
|
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, canvasWidth, canvasHeight, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, null);
|
||||||
gl.glBindTexture(gl.GL_TEXTURE_2D, 0);
|
gl.glBindTexture(gl.GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
if (OSType.getOSType() == OSType.MacOS && glDrawable instanceof GLFBODrawable)
|
if (OSType.getOSType() == OSType.MacOS && glDrawable instanceof GLFBODrawable)
|
||||||
@@ -1058,6 +1066,21 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
glfboDrawable.resetSize(gl);
|
glfboDrawable.resetSize(gl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final BufferProvider bufferProvider = client.getBufferProvider();
|
||||||
|
final int[] pixels = bufferProvider.getPixels();
|
||||||
|
final int width = bufferProvider.getWidth();
|
||||||
|
final int height = bufferProvider.getHeight();
|
||||||
|
|
||||||
|
gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, interfacePbo);
|
||||||
|
gl.glMapBuffer(gl.GL_PIXEL_UNPACK_BUFFER, gl.GL_WRITE_ONLY)
|
||||||
|
.asIntBuffer()
|
||||||
|
.put(pixels, 0, width * height);
|
||||||
|
gl.glUnmapBuffer(gl.GL_PIXEL_UNPACK_BUFFER);
|
||||||
|
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
||||||
|
gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, width, height, gl.GL_BGRA, gl.GL_UNSIGNED_INT_8_8_8_8_REV, 0);
|
||||||
|
gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, 0);
|
||||||
|
gl.glBindTexture(gl.GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawFrame(int overlayColor)
|
private void drawFrame(int overlayColor)
|
||||||
@@ -1072,7 +1095,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
final int viewportHeight = client.getViewportHeight();
|
final int viewportHeight = client.getViewportHeight();
|
||||||
final int viewportWidth = client.getViewportWidth();
|
final int viewportWidth = client.getViewportWidth();
|
||||||
|
|
||||||
resize(canvasWidth, canvasHeight, viewportWidth, viewportHeight);
|
prepareInterfaceTexture(canvasWidth, canvasHeight);
|
||||||
|
|
||||||
// Setup anti-aliasing
|
// Setup anti-aliasing
|
||||||
final AntiAliasingMode antiAliasingMode = config.antiAliasingMode();
|
final AntiAliasingMode antiAliasingMode = config.antiAliasingMode();
|
||||||
@@ -1312,25 +1335,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
|
|
||||||
private void drawUi(final int overlayColor, final int canvasHeight, final int canvasWidth)
|
private void drawUi(final int overlayColor, final int canvasHeight, final int canvasWidth)
|
||||||
{
|
{
|
||||||
final BufferProvider bufferProvider = client.getBufferProvider();
|
|
||||||
final int[] pixels = bufferProvider.getPixels();
|
|
||||||
final int width = bufferProvider.getWidth();
|
|
||||||
final int height = bufferProvider.getHeight();
|
|
||||||
|
|
||||||
gl.glEnable(gl.GL_BLEND);
|
gl.glEnable(gl.GL_BLEND);
|
||||||
|
|
||||||
vertexBuffer.clear(); // reuse vertex buffer for interface
|
|
||||||
vertexBuffer.ensureCapacity(pixels.length);
|
|
||||||
|
|
||||||
IntBuffer interfaceBuffer = vertexBuffer.getBuffer();
|
|
||||||
interfaceBuffer.put(pixels);
|
|
||||||
vertexBuffer.flip();
|
|
||||||
|
|
||||||
gl.glBlendFunc(gl.GL_ONE, gl.GL_ONE_MINUS_SRC_ALPHA);
|
gl.glBlendFunc(gl.GL_ONE, gl.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
|
||||||
|
|
||||||
gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, width, height, gl.GL_BGRA, gl.GL_UNSIGNED_INT_8_8_8_8_REV, interfaceBuffer);
|
|
||||||
|
|
||||||
// Use the texture bound in the first pass
|
// Use the texture bound in the first pass
|
||||||
final UIScalingMode uiScalingMode = config.uiScalingMode();
|
final UIScalingMode uiScalingMode = config.uiScalingMode();
|
||||||
gl.glUseProgram(glUiProgram);
|
gl.glUseProgram(glUiProgram);
|
||||||
@@ -1626,16 +1634,9 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
|
|
||||||
boolean hasUv = model.getFaceTextures() != null;
|
boolean hasUv = model.getFaceTextures() != null;
|
||||||
|
|
||||||
int faces = Math.min(MAX_TRIANGLE, model.getTrianglesCount());
|
int len = sceneUploader.pushModel(model, vertexBuffer, uvBuffer);
|
||||||
vertexBuffer.ensureCapacity(12 * faces);
|
|
||||||
uvBuffer.ensureCapacity(12 * faces);
|
|
||||||
int len = 0;
|
|
||||||
for (int i = 0; i < faces; ++i)
|
|
||||||
{
|
|
||||||
len += sceneUploader.pushFace(model, i, false, vertexBuffer, uvBuffer, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
GpuIntBuffer b = bufferForTriangles(faces);
|
GpuIntBuffer b = bufferForTriangles(len / 3);
|
||||||
|
|
||||||
b.ensureCapacity(8);
|
b.ensureCapacity(8);
|
||||||
IntBuffer buffer = b.getBuffer();
|
IntBuffer buffer = b.getBuffer();
|
||||||
|
|||||||
@@ -147,13 +147,13 @@ class SceneUploader
|
|||||||
Renderable renderable1 = wallObject.getRenderable1();
|
Renderable renderable1 = wallObject.getRenderable1();
|
||||||
if (renderable1 instanceof Model)
|
if (renderable1 instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) renderable1, vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) renderable1, vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderable renderable2 = wallObject.getRenderable2();
|
Renderable renderable2 = wallObject.getRenderable2();
|
||||||
if (renderable2 instanceof Model)
|
if (renderable2 instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) renderable2, vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) renderable2, vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ class SceneUploader
|
|||||||
Renderable renderable = groundObject.getRenderable();
|
Renderable renderable = groundObject.getRenderable();
|
||||||
if (renderable instanceof Model)
|
if (renderable instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) renderable, vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) renderable, vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,13 +173,13 @@ class SceneUploader
|
|||||||
Renderable renderable = decorativeObject.getRenderable();
|
Renderable renderable = decorativeObject.getRenderable();
|
||||||
if (renderable instanceof Model)
|
if (renderable instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) renderable, vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) renderable, vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderable renderable2 = decorativeObject.getRenderable2();
|
Renderable renderable2 = decorativeObject.getRenderable2();
|
||||||
if (renderable2 instanceof Model)
|
if (renderable2 instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) renderable2, vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) renderable2, vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ class SceneUploader
|
|||||||
Renderable renderable = gameObject.getRenderable();
|
Renderable renderable = gameObject.getRenderable();
|
||||||
if (renderable instanceof Model)
|
if (renderable instanceof Model)
|
||||||
{
|
{
|
||||||
uploadModel((Model) gameObject.getRenderable(), vertexBuffer, uvBuffer);
|
uploadSceneModel((Model) gameObject.getRenderable(), vertexBuffer, uvBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -350,7 +350,7 @@ class SceneUploader
|
|||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void uploadModel(Model model, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer)
|
private void uploadSceneModel(Model model, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer)
|
||||||
{
|
{
|
||||||
if (model.getSceneId() == sceneId)
|
if (model.getSceneId() == sceneId)
|
||||||
{
|
{
|
||||||
@@ -368,7 +368,18 @@ class SceneUploader
|
|||||||
}
|
}
|
||||||
model.setSceneId(sceneId);
|
model.setSceneId(sceneId);
|
||||||
|
|
||||||
final int triangleCount = model.getTrianglesCount();
|
int len = pushModel(model, vertexBuffer, uvBuffer);
|
||||||
|
|
||||||
|
offset += len;
|
||||||
|
if (model.getFaceTextures() != null)
|
||||||
|
{
|
||||||
|
uvoffset += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int pushModel(Model model, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer)
|
||||||
|
{
|
||||||
|
final int triangleCount = Math.min(model.getTrianglesCount(), GpuPlugin.MAX_TRIANGLE);
|
||||||
|
|
||||||
vertexBuffer.ensureCapacity(triangleCount * 12);
|
vertexBuffer.ensureCapacity(triangleCount * 12);
|
||||||
uvBuffer.ensureCapacity(triangleCount * 12);
|
uvBuffer.ensureCapacity(triangleCount * 12);
|
||||||
@@ -437,11 +448,7 @@ class SceneUploader
|
|||||||
len += 3;
|
len += 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += len;
|
return len;
|
||||||
if (model.getFaceTextures() != null)
|
|
||||||
{
|
|
||||||
uvoffset += len;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pushFace(Model model, int face, boolean padUvs, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer,
|
int pushFace(Model model, int face, boolean padUvs, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer,
|
||||||
|
|||||||
Reference in New Issue
Block a user