From ef3622c05ae497d264d72330c9d5b5fc20906801 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 3 Sep 2021 13:21:32 -0400 Subject: [PATCH] api: flatten model uvs This drastically reduces the number of allocated float arrays on the heap just by flattening the uvs into a single array per model --- .../src/main/java/net/runelite/api/Model.java | 3 +-- .../client/plugins/gpu/SceneUploader.java | 21 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Model.java b/runelite-api/src/main/java/net/runelite/api/Model.java index 4e5332e2f2..441577caea 100644 --- a/runelite-api/src/main/java/net/runelite/api/Model.java +++ b/runelite-api/src/main/java/net/runelite/api/Model.java @@ -72,8 +72,7 @@ public interface Model extends Renderable short[] getFaceTextures(); - float[][] getFaceTextureUCoordinates(); - float[][] getFaceTextureVCoordinates(); + float[] getFaceTextureUVCoordinates(); void calculateExtreme(int orientation); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java index 548eca7589..675381053d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java @@ -389,8 +389,7 @@ class SceneUploader final short[] faceTextures = model.getFaceTextures(); final byte[] facePriorities = model.getFaceRenderPriorities(); - float[][] u = model.getFaceTextureUCoordinates(); - float[][] v = model.getFaceTextureVCoordinates(); + float[] uv = model.getFaceTextureUVCoordinates(); int len = 0; for (int face = 0; face < triangleCount; ++face) @@ -432,7 +431,7 @@ class SceneUploader if (faceTextures != null) { - pushUvForFace(faceTextures, u, v, face, uvBuffer); + pushUvForFace(faceTextures, uv, face, uvBuffer); } len += 3; @@ -559,11 +558,9 @@ class SceneUploader vertexBuffer.put(a, b, c, packedAlphaPriority | color3); - float[][] u = model.getFaceTextureUCoordinates(); - float[][] v = model.getFaceTextureVCoordinates(); if (padUvs || faceTextures != null) { - pushUvForFace(faceTextures, u, v, face, uvBuffer); + pushUvForFace(faceTextures, model.getFaceTextureUVCoordinates(), face, uvBuffer); } return 3; @@ -584,15 +581,15 @@ class SceneUploader return alpha | priority; } - private static void pushUvForFace(short[] faceTextures, float[][] u, float[][] v, int face, GpuFloatBuffer uvBuffer) + private static void pushUvForFace(short[] faceTextures, float[] uv, int face, GpuFloatBuffer uvBuffer) { - float[] uf, vf; - if (faceTextures != null && u != null && v != null && (uf = u[face]) != null && (vf = v[face]) != null) + if (faceTextures != null && faceTextures[face] != -1 && uv != null) { + int idx = face * 6; float texture = faceTextures[face] + 1f; - uvBuffer.put(texture, uf[0], vf[0], 0f); - uvBuffer.put(texture, uf[1], vf[1], 0f); - uvBuffer.put(texture, uf[2], vf[2], 0f); + uvBuffer.put(texture, uv[idx], uv[idx + 1], 0f); + uvBuffer.put(texture, uv[idx + 2], uv[idx + 3], 0f); + uvBuffer.put(texture, uv[idx + 4], uv[idx + 5], 0f); } else {