From 446ad2539a4c6395d707ae2ac007819dd31b1d61 Mon Sep 17 00:00:00 2001 From: James Monger Date: Mon, 17 Jul 2023 18:07:10 +0100 Subject: [PATCH 01/45] feat: create dynamic FramePieceRenderer anchoring system --- .../runejs/client/frame/FramePieceAnchor.java | 68 +++++++++++++++++++ .../client/frame/FramePieceRenderer.java | 32 ++++++++- .../java/org/runejs/client/frame/Minimap.java | 14 +++- .../runejs/client/frame/ScreenController.java | 4 +- .../runejs/client/frame/tab/TabProducer.java | 16 ++++- 5 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/runejs/client/frame/FramePieceAnchor.java diff --git a/src/main/java/org/runejs/client/frame/FramePieceAnchor.java b/src/main/java/org/runejs/client/frame/FramePieceAnchor.java new file mode 100644 index 000000000..5f482c434 --- /dev/null +++ b/src/main/java/org/runejs/client/frame/FramePieceAnchor.java @@ -0,0 +1,68 @@ +package org.runejs.client.frame; + +/** + * Represents an anchor for a {@link FramePieceRenderer}, + * i.e. the position of the piece relative to the overall window. + */ +public class FramePieceAnchor { + /** + * The different anchor types. + * + * These are bit flags, so they can be combined. + */ + public static class Anchor { + public static final int LEFT = 0b0001; + public static final int RIGHT = 0b0010; + public static final int TOP = 0b0100; + public static final int BOTTOM = 0b1000; + } + + /** + * The anchor type, composed of the {@link Anchor} flags. + */ + public final int anchor; + + /** + * The margin from the anchor in the X direction. + */ + public final int marginX; + + /** + * The margin from the anchor in the Y direction. + */ + public final int marginY; + + public FramePieceAnchor(int anchor, int marginX, int marginY) { + this.anchor = anchor; + this.marginX = marginX; + this.marginY = marginY; + } + + /** + * Gets the position of the piece relative to the overall window. + * + * @param drawWidth The width of the window. + * @param drawHeight The height of the window. + * @param sizeX The width of the piece. + * @param sizeY The height of the piece. + * @return The position of the piece. + */ + public int[] getPosition(int drawWidth, int drawHeight, int sizeX, int sizeY) { + int x = 0; + int y = 0; + + if ((anchor & Anchor.LEFT) == Anchor.LEFT) { + x = marginX; + } else if ((anchor & Anchor.RIGHT) == Anchor.RIGHT) { + x = drawWidth - sizeX - marginX; + } + + if ((anchor & Anchor.TOP) == Anchor.TOP) { + y = marginY; + } else if ((anchor & Anchor.BOTTOM) == Anchor.BOTTOM) { + y = drawHeight - sizeY - marginY; + } + + return new int[]{x, y}; + } +} diff --git a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java index 57942d714..af9d9c43e 100644 --- a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java +++ b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java @@ -1,11 +1,41 @@ package org.runejs.client.frame; +import org.runejs.client.ProducingGraphicsBuffer; import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.media.RasterizerInstanced; -public class FramePieceRenderer { +public abstract class FramePieceRenderer { public RasterizerInstanced rasterizerInstanced; + public final FramePieceAnchor anchor; + public final int width; + public final int height; + + public FramePieceRenderer(FramePieceAnchor anchor, int width, int height) { + this.anchor = anchor; + this.width = width; + this.height = height; + } + + public abstract ProducingGraphicsBuffer getDrawable(); + + /** + * Draws the piece. + * @param drawWidth The width of the window. + * @param drawHeight The height of the window. + * + * TODO (jkm) refactor this to not use static `ScreenController`. + */ + public void draw(int drawWidth, int drawHeight) { + int[] position = this.anchor.getPosition(drawWidth, drawHeight, this.width, this.height); + + ScreenController.drawFramePiece( + getDrawable(), + position[0], + position[1] + ); + } + public void shapeImageToPixels(ImageRGB image, int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { try { int centerX = -width / 2; diff --git a/src/main/java/org/runejs/client/frame/Minimap.java b/src/main/java/org/runejs/client/frame/Minimap.java index 7f4d4a972..883f00ca9 100644 --- a/src/main/java/org/runejs/client/frame/Minimap.java +++ b/src/main/java/org/runejs/client/frame/Minimap.java @@ -48,6 +48,16 @@ public class Minimap extends FramePieceRenderer { private static int[] resizableMinimapLineOffsets; public Minimap() { + super( + new FramePieceAnchor( + FramePieceAnchor.Anchor.TOP | FramePieceAnchor.Anchor.RIGHT, + 0, + 0 + ), + 210, + 210 + ); + this.tempResizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); resizableMinimapOffsets1 = new int[200]; resizableMinimapOffsets2 = new int[200]; @@ -422,8 +432,8 @@ public static void drawMapBack() { } } - public void drawResizableMiniMapArea(int x, int y) { - ScreenController.drawFramePiece(resizableMiniMapimage, x, y); + public ProducingGraphicsBuffer getDrawable() { + return resizableMiniMapimage; } public void RenderResizableMiniMapArea(int x, int y) { diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index e66eba021..97c9048cc 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -133,11 +133,11 @@ public static void RenderResizableUI() { drawingThread = new Thread(renderer); drawingThread.start(); } - minimap.drawResizableMiniMapArea(drawWidth - 210, 0); RenderTabArea(drawWidth - 234, drawHeight - (337)); RenderChatArea(0, drawHeight - (162)); - tabProducer.drawResizableSideBarArea(drawWidth - 241, drawHeight - (334)); + minimap.draw(drawWidth, drawHeight); + tabProducer.draw(drawWidth, drawHeight); if (DebugView) { int mX = MouseHandler.mouseX; diff --git a/src/main/java/org/runejs/client/frame/tab/TabProducer.java b/src/main/java/org/runejs/client/frame/tab/TabProducer.java index 87f5bb7ca..3c4a0d34a 100644 --- a/src/main/java/org/runejs/client/frame/tab/TabProducer.java +++ b/src/main/java/org/runejs/client/frame/tab/TabProducer.java @@ -5,8 +5,8 @@ import org.runejs.client.ProducingGraphicsBuffer; import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.cache.media.gameInterface.GameInterface; +import org.runejs.client.frame.FramePieceAnchor; import org.runejs.client.frame.FramePieceRenderer; -import org.runejs.client.frame.ScreenController; import org.runejs.client.frame.tab.parts.TabParts; import org.runejs.client.media.RasterizerInstanced; @@ -44,6 +44,16 @@ public class TabProducer extends FramePieceRenderer { public TabProducer() { + super( + new FramePieceAnchor( + FramePieceAnchor.Anchor.BOTTOM | FramePieceAnchor.Anchor.RIGHT, + 0, + 0 + ), + 241, + 334 + ); + this.tempResizableSideBar = MovedStatics.createGraphicsBuffer(241, 334, Game.gameCanvas); resizableSideBarImage = MovedStatics.createGraphicsBuffer(241, 334, Game.gameCanvas); rasterizerInstanced = new RasterizerInstanced(this.tempResizableSideBar); @@ -155,8 +165,8 @@ public int[] getTabButtonBox(int tabButtonIndex) { - public void drawResizableSideBarArea(int x, int y) { - ScreenController.drawFramePiece(resizableSideBarImage, x, y); + public ProducingGraphicsBuffer getDrawable() { + return resizableSideBarImage; } public int[] getTabInterfaceCoordSize(int baseX, int baseY) { From 6da7a2a104e3a439e99f74728e17ae6cb3f1e06b Mon Sep 17 00:00:00 2001 From: James Monger Date: Mon, 17 Jul 2023 18:20:07 +0100 Subject: [PATCH 02/45] refactor: migrate chatbox rendering to FramePieceRenderer --- .../java/org/runejs/client/MovedStatics.java | 8 ++-- .../runejs/client/frame/ChatBoxRenderer.java | 41 +++++++++++++++++++ .../client/frame/FramePieceRenderer.java | 30 ++++++++++++++ .../client/frame/ResizableFrameRenderer.java | 7 ++-- .../runejs/client/frame/ScreenController.java | 23 ++--------- .../client/media/RasterizerInstanced.java | 32 ++++++++++++++- 6 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 src/main/java/org/runejs/client/frame/ChatBoxRenderer.java diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index e7abfb187..a59afa55f 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -314,7 +314,7 @@ public class MovedStatics { public static boolean aBoolean512; public static int[] anIntArray3111; public static Signlink signlink; - public static ProducingGraphicsBuffer tabPieveLowerRight; + public static ProducingGraphicsBuffer tabPieceLowerRight; public static GameSocket lostConnectionSocket; public static ProducingGraphicsBuffer tabPieceLeft; public static int anInt3048 = 1; @@ -1459,7 +1459,7 @@ private static void method344(int arg0) { tabHighlightImageBottomLeft = null; tabHighlightImageBottomLeftEdge = null; fullScreenTextureArray = null; - tabPieveLowerRight = null; + tabPieceLowerRight = null; framePieceTop = null; chatboxBackgroundImage = null; } @@ -1921,7 +1921,7 @@ public static void drawWelcomeScreenGraphics() { framePieceTop.drawGraphics(0, 0, graphics); mapBackRight.drawGraphics(516, 4, graphics); tabPieceUpperRight.drawGraphics(516, 205, graphics); - tabPieveLowerRight.drawGraphics(496, 357, graphics); + tabPieceLowerRight.drawGraphics(496, 357, graphics); chatboxTop.drawGraphics(0, 338, graphics); } } catch(Exception exception) { @@ -1971,7 +1971,7 @@ public static void method763(Component arg0, CacheArchive arg2) { tabPieceUpperRight = createGraphicsBuffer(image.imageWidth, image.imageHeight, arg0); image.drawInverse(0, 0); image = method1028(arg2, Native.imgBackvmid3, Native.aClass1_305); - tabPieveLowerRight = createGraphicsBuffer(image.imageWidth, image.imageHeight, arg0); + tabPieceLowerRight = createGraphicsBuffer(image.imageWidth, image.imageHeight, arg0); image.drawInverse(0, 0); image = method1028(arg2, Native.imgBackhmid2, Native.aClass1_305); chatboxTop = createGraphicsBuffer(image.imageWidth, image.imageHeight, arg0); diff --git a/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java b/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java new file mode 100644 index 000000000..8fde5674d --- /dev/null +++ b/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java @@ -0,0 +1,41 @@ +package org.runejs.client.frame; + +import org.runejs.client.Game; +import org.runejs.client.MovedStatics; +import org.runejs.client.ProducingGraphicsBuffer; +import org.runejs.client.media.RasterizerInstanced; + +/** + * Renders the chat box. + */ +public class ChatBoxRenderer extends FramePieceRenderer { + private final ProducingGraphicsBuffer graphics; + + public ChatBoxRenderer() { + super( + new FramePieceAnchor( + FramePieceAnchor.Anchor.BOTTOM | FramePieceAnchor.Anchor.LEFT, + 0, + -22 + ), + 516, + 184 + ); + + graphics = MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas); + rasterizerInstanced = new RasterizerInstanced(graphics); + } + + public ProducingGraphicsBuffer getDrawable() { + return graphics; + } + + public void render() { + copyProducer(ChatBox.chatBoxImageProducer, 17, 16); + copyProducer(MovedStatics.chatModes, 0, 112); + copyProducerCutOff(MovedStatics.tabBottom, 496, 125, 20, MovedStatics.tabBottom.height, 0, 0); + copyProducer(MovedStatics.chatboxRight, 0, 16); + copyProducerCutOff(MovedStatics.chatboxTop, 0, 0, MovedStatics.chatboxTop.width - 37, MovedStatics.chatboxTop.height - 3, 0, 3); + copyProducerCutOff(MovedStatics.tabPieceLowerRight, 496, 16, 20, MovedStatics.tabPieceLowerRight.height, 0, 0); + } +} diff --git a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java index af9d9c43e..12d4021d7 100644 --- a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java +++ b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java @@ -36,6 +36,36 @@ public void draw(int drawWidth, int drawHeight) { ); } + /** + * Copies the pixels from a ProducingGraphicsBuffer to the rasterizer. + * + * See {@link RasterizerInstanced#copyPixels} for more information. + * + * @param producer The ProducingGraphicsBuffer to copy from. + * @param x The X position to copy to. + * @param y The Y position to copy to. + */ + protected void copyProducer(ProducingGraphicsBuffer producer, int x, int y) { + rasterizerInstanced.copyPixels(producer.pixels, producer.width, producer.height, x, y); + } + + /** + * Copies the pixels from a ProducingGraphicsBuffer to the rasterizer. + * + * See {@link RasterizerInstanced#copyPixelsCutOff} for more information. + * + * @param producer The ProducingGraphicsBuffer to copy from. + * @param x The X position to copy to. + * @param y The Y position to copy to. + * @param width The width of the area to copy. + * @param height The height of the area to copy. + * @param offsetX The X offset to copy from. + * @param offsetY The Y offset to copy from. + */ + protected void copyProducerCutOff(ProducingGraphicsBuffer producer, int x, int y, int width, int height, int offsetX, int offsetY) { + rasterizerInstanced.copyPixelsCutOff(producer.pixels, producer.width, producer.height, x, y, width, height, offsetX, offsetY); + } + public void shapeImageToPixels(ImageRGB image, int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { try { int centerX = -width / 2; diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index 2948c8542..4e212426e 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -6,10 +6,12 @@ public class ResizableFrameRenderer implements FrameRenderer { private final Minimap minimap; private final TabProducer tabProducer; + private final ChatBoxRenderer chatbox; - public ResizableFrameRenderer(Minimap minimap, TabProducer tabProducer) { + public ResizableFrameRenderer(Minimap minimap, TabProducer tabProducer, ChatBoxRenderer chatbox) { this.minimap = minimap; this.tabProducer = tabProducer; + this.chatbox = chatbox; } @Override @@ -17,9 +19,8 @@ public void run() { while(true){ if(Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30){ minimap.RenderResizableMiniMapArea(ScreenController.drawWidth - 210, 0); - } - if(Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30){ tabProducer.RenderResizableSideBarArea(); + chatbox.render(); } try { Thread.sleep(1); diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 97c9048cc..a01100788 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -27,6 +27,7 @@ public class ScreenController { public static int drawHeight = 540; public static Minimap minimap = new Minimap(); public static TabProducer tabProducer = new TabProducer(); + public static ChatBoxRenderer chatBoxRenderer = new ChatBoxRenderer(); private static Thread drawingThread; private static FrameRenderer renderer; public static boolean DebugView = false; @@ -129,15 +130,15 @@ public static void setBounds() { */ public static void RenderResizableUI() { if (drawingThread == null) { - renderer = new ResizableFrameRenderer(minimap, tabProducer); + renderer = new ResizableFrameRenderer(minimap, tabProducer, chatBoxRenderer); drawingThread = new Thread(renderer); drawingThread.start(); } RenderTabArea(drawWidth - 234, drawHeight - (337)); - RenderChatArea(0, drawHeight - (162)); minimap.draw(drawWidth, drawHeight); tabProducer.draw(drawWidth, drawHeight); + chatBoxRenderer.draw(drawWidth, drawHeight); if (DebugView) { int mX = MouseHandler.mouseX; @@ -208,29 +209,13 @@ public static void RenderTabArea(int x, int y) { // width 234 drawFramePiece(MovedStatics.tabPieceLeft, x + 212, y + 39); drawFramePieceCutout(MovedStatics.tabPieceUpperRight, x, y + 39, MovedStatics.tabPieceUpperRight.width - 15, MovedStatics.tabPieceUpperRight.height, 15, 0); - drawFramePieceCutout(MovedStatics.tabPieveLowerRight, x, y + 191, MovedStatics.tabPieveLowerRight.width - 35, MovedStatics.tabPieveLowerRight.height, 35, 0); + drawFramePieceCutout(MovedStatics.tabPieceLowerRight, x, y + 191, MovedStatics.tabPieceLowerRight.width - 35, MovedStatics.tabPieceLowerRight.height, 35, 0); drawFramePieceCutout(MovedStatics.chatboxTop, x, y + 172, MovedStatics.chatboxTop.width - 531, MovedStatics.chatboxTop.height, 531, 0); drawFramePieceCutout(MovedStatics.tabBottom, x, y + 300, MovedStatics.tabBottom.width - 35, MovedStatics.tabBottom.height, 35, 0); drawFramePieceCutout(MovedStatics.tabTop, x, y, MovedStatics.tabTop.width - 15, MovedStatics.tabTop.height - 6, 15, 6); drawFramePiece(MovedStatics.tabImageProducer, x + 22, y + 39); } - /** - * TODO (jkm) move all this to ResizableFrameRenderer - */ - public static void RenderChatArea(int x, int y) { - //width 516 - //height 184 - drawFramePiece(ChatBox.chatBoxImageProducer, x + 17, y + 16); - drawFramePiece(MovedStatics.chatModes, x, y + 112); - drawFramePieceCutout(MovedStatics.tabBottom, x + 496, y + 125, 20, MovedStatics.tabBottom.height, 0, 0); - drawFramePiece(MovedStatics.chatboxRight, x, y + 16); - drawFramePieceCutout(MovedStatics.chatboxTop, x, y, MovedStatics.chatboxTop.width - 37, MovedStatics.chatboxTop.height - 3, 0, 3); - // System.out.println(Class40_Sub5_Sub1.chatboxRight.height + (Class17.chatboxTop.height-3) + HuffmanEncoding.aProducingGraphicsBuffer_1541.height); - - drawFramePieceCutout(MovedStatics.tabPieveLowerRight, x + 496, y + 16, 20, MovedStatics.tabPieveLowerRight.height, 0, 0); - } - public static void drawFramePiece(ProducingGraphicsBuffer framePiece, int x, int y) { Rasterizer.copyPixels(framePiece.pixels, framePiece.width, framePiece.height, x, y); } diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index 6e903f37a..19752ab0b 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -135,7 +135,18 @@ public void method657(int[] arg0) { viewportBottom = arg0[3]; } - + /** + * Copies a given set of pixels into a destination array. This method takes the entire source array + * and fits it into the viewport. If the source image is larger than the viewport, the image will be + * cropped. If the source image starts at coordinates outside the viewport, the image will be adjusted + * to start from the viewport edge. + * + * @param pixels The source pixel array from which to copy pixels. + * @param width The width of the source pixel array. + * @param height The height of the source pixel array. + * @param paintX The x-coordinate at which to start painting pixels in the destination. + * @param paintY The y-coordinate at which to start painting pixels in the destination. + */ public void copyPixels(int[] pixels, int width, int height, int paintX, int paintY) { int sourcePixel = 0; if(paintX < viewportLeft) { @@ -158,7 +169,24 @@ public void copyPixels(int[] pixels, int width, int height, int paintX, int pain pixel += pixelOffset; } } - + + /** + * Copies a specified region of a given set of pixels into a destination array. This method allows to define + * a sub-region within the source array (offsetX, offsetY, drawWidth, drawHeight) to be copied. Similar to + * the copyPixels method, this method adjusts the image position based on viewport boundaries and also crops + * the image if the region is larger than the viewport. However, in contrast to copyPixels, it allows for more + * flexible image manipulation by being able to define a specific region from the source image to copy. + * + * @param pixels The source pixel array from which to copy pixels. + * @param srcWidth The width of the source pixel array. + * @param srcHeight The height of the source pixel array. + * @param paintX The x-coordinate at which to start painting pixels in the destination. + * @param paintY The y-coordinate at which to start painting pixels in the destination. + * @param drawWidth The width of the region of the source array to be copied. + * @param drawHeight The height of the region of the source array to be copied. + * @param offsetX The x-coordinate of the starting point of the region in the source array. + * @param offsetY The y-coordinate of the starting point of the region in the source array. + */ public void copyPixelsCutOff(int[] pixels, int srcWidth, int srcHeight, int paintX, int paintY, int drawWidth, int drawHeight, int offsetX, int offsetY) { int sourcePixel = offsetX + offsetY * srcWidth; if(paintX < viewportLeft) { From 43a88e60009186591015116d0f43d7328740a717 Mon Sep 17 00:00:00 2001 From: James Monger Date: Mon, 17 Jul 2023 18:25:12 +0100 Subject: [PATCH 03/45] refactor: move unnecessary RenderTabArea --- .../runejs/client/frame/ScreenController.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index a01100788..44d918d22 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -134,7 +134,6 @@ public static void RenderResizableUI() { drawingThread = new Thread(renderer); drawingThread.start(); } - RenderTabArea(drawWidth - 234, drawHeight - (337)); minimap.draw(drawWidth, drawHeight); tabProducer.draw(drawWidth, drawHeight); @@ -201,21 +200,6 @@ public static Dimension getInnerSize(Frame frame) { return size; } - /** - * TODO (jkm) move all this to ResizableFrameRenderer - */ - public static void RenderTabArea(int x, int y) { - // height 337 - // width 234 - drawFramePiece(MovedStatics.tabPieceLeft, x + 212, y + 39); - drawFramePieceCutout(MovedStatics.tabPieceUpperRight, x, y + 39, MovedStatics.tabPieceUpperRight.width - 15, MovedStatics.tabPieceUpperRight.height, 15, 0); - drawFramePieceCutout(MovedStatics.tabPieceLowerRight, x, y + 191, MovedStatics.tabPieceLowerRight.width - 35, MovedStatics.tabPieceLowerRight.height, 35, 0); - drawFramePieceCutout(MovedStatics.chatboxTop, x, y + 172, MovedStatics.chatboxTop.width - 531, MovedStatics.chatboxTop.height, 531, 0); - drawFramePieceCutout(MovedStatics.tabBottom, x, y + 300, MovedStatics.tabBottom.width - 35, MovedStatics.tabBottom.height, 35, 0); - drawFramePieceCutout(MovedStatics.tabTop, x, y, MovedStatics.tabTop.width - 15, MovedStatics.tabTop.height - 6, 15, 6); - drawFramePiece(MovedStatics.tabImageProducer, x + 22, y + 39); - } - public static void drawFramePiece(ProducingGraphicsBuffer framePiece, int x, int y) { Rasterizer.copyPixels(framePiece.pixels, framePiece.width, framePiece.height, x, y); } From 23c359f80f1ac3ebf0bed777d097e69d9099123e Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 13:39:09 +0100 Subject: [PATCH 04/45] refactor: split Minimap and MinimapRenderer --- .../java/org/runejs/client/frame/Minimap.java | 236 +----------------- .../runejs/client/frame/MinimapRenderer.java | 222 ++++++++++++++++ .../client/frame/ResizableFrameRenderer.java | 4 +- .../runejs/client/frame/ScreenController.java | 5 +- 4 files changed, 233 insertions(+), 234 deletions(-) create mode 100644 src/main/java/org/runejs/client/frame/MinimapRenderer.java diff --git a/src/main/java/org/runejs/client/frame/Minimap.java b/src/main/java/org/runejs/client/frame/Minimap.java index 883f00ca9..b6cfca852 100644 --- a/src/main/java/org/runejs/client/frame/Minimap.java +++ b/src/main/java/org/runejs/client/frame/Minimap.java @@ -5,8 +5,6 @@ import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.cache.media.IndexedImage; import org.runejs.client.media.Rasterizer; -import org.runejs.client.media.Rasterizer3D; -import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.Model; import org.runejs.client.media.renderable.actor.Npc; import org.runejs.client.media.renderable.actor.Player; @@ -14,7 +12,12 @@ import java.awt.*; -public class Minimap extends FramePieceRenderer { +/** + * Class to store the minimap state + * + * TODO (jkm) Work is in-progress to remove all rendering capability from this class + */ +public class Minimap { public static ImageRGB minimapCompass; public static int minimapState = 0; public static IndexedImage minimapBackgroundImage; @@ -39,37 +42,6 @@ public class Minimap extends FramePieceRenderer { */ public static int[][] anIntArrayArray129 = new int[][]{new int[16], {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}}; public static int minimapLevel = -1; - private static int[] resizableMinimapOffsets1; - private static int[] resizableMinimapOffsets2; - private static ProducingGraphicsBuffer resizableMiniMapimage; - private int[] resizableCompasOffsets1; - private int[] resizableCompasOffsets2; - private ProducingGraphicsBuffer tempResizableMiniMapimage; - private static int[] resizableMinimapLineOffsets; - - public Minimap() { - super( - new FramePieceAnchor( - FramePieceAnchor.Anchor.TOP | FramePieceAnchor.Anchor.RIGHT, - 0, - 0 - ), - 210, - 210 - ); - - this.tempResizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); - resizableMinimapOffsets1 = new int[200]; - resizableMinimapOffsets2 = new int[200]; - for(int i = 0; i < resizableMinimapOffsets2.length; i++) { - resizableMinimapOffsets1[i] = 200; - resizableMinimapOffsets2[i] = 0; - } - - resizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); - rasterizerInstanced = new RasterizerInstanced(this.tempResizableMiniMapimage); - - } public static void drawOnMinimap(int x, int y, ImageRGB sprite) { if (sprite == null) { @@ -431,200 +403,4 @@ public static void drawMapBack() { Game.gameCanvas.repaint(); } } - - public ProducingGraphicsBuffer getDrawable() { - return resizableMiniMapimage; - } - - public void RenderResizableMiniMapArea(int x, int y) { - if(this.resizableCompasOffsets1 == null) { - resizableCompasOffsets1 = new int[33]; - resizableCompasOffsets2 = new int[33]; - for(int y1 = 0; y1 < 33; y1++) { - int i_15_ = 0; - int i_16_ = 999; - for(int x1 = 0; x1 < 34; x1++) { - if(minimapBackgroundImage.imgPixels[minimapBackgroundImage.imgWidth * y1 + x1] == 0) { - if(i_16_ == 999) - i_16_ = x1; - } else if(i_16_ != 999) { - i_15_ = x1; - break; - } - } - resizableCompasOffsets2[y1] = i_16_; - resizableCompasOffsets1[y1] = -i_16_ + i_15_; - } - } - if(minimapState == 2) { - resizableMiniMapimage.prepareRasterizer(); - resizableMinimapLineOffsets = Rasterizer3D.setLineOffsets(resizableMinimapLineOffsets); - byte[] mmBackgroundPixels = minimapBackgroundImage.imgPixels; - int[] rasterPixels = Rasterizer.destinationPixels; - int pixelCount = mmBackgroundPixels.length; - for(int i = 0; i < pixelCount; i++) { - if(mmBackgroundPixels[i] == 0) - rasterPixels[i] = 0; - } - Rasterizer.drawFilledRectangle(0, 0, 210, 210, 0x242017); - Rasterizer.drawFilledRectangle(5, 5, 200, 200, 0x000000); - - // Rasterizer.drawFilledRectangle(x-43,y, 43, 43, 0x242017); - Rasterizer.drawFilledRectangle(0, 0, 20, 42, 0x242017); - Rasterizer.drawFilledRectangle(0, 0, 42, 20, 0x242017); - - Rasterizer.drawCircle(21, 21, 20, 0x242017); - minimapCompass.shapeImageToPixels(5, 5, 33, 33, 25, 25, Game.getMinimapRotation(), 256, resizableCompasOffsets2, resizableCompasOffsets1); - - - MovedStatics.method1018(); - - ScreenController.drawFramePiece(resizableMiniMapimage, x, y); - return; - } - - int i = 48 + Player.localPlayer.worldX / 32; - int i_8_ = 464 + -(Player.localPlayer.worldY / 32); - int i_9_ = Game.getMinimapRotation() & 0x7ff; - int minimapZoom = 0; - - shapeImageToPixels(minimapImage,5, 5, 200, 200, i, i_8_, i_9_, minimapZoom + 256, resizableMinimapOffsets2, resizableMinimapOffsets1); - drawResizableMinimapDots(); - rasterizerInstanced.drawFilledRectangle(105, 105, 3, 3, 16777215); - rasterizerInstanced.drawFilledRectangle(0, 0, 210, 5, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 205, 210, 5, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 5, 210, 0x242017); - rasterizerInstanced.drawFilledRectangle(205, 0, 5, 210, 0x242017); - - // Rasterizer.drawFilledRectangle(x-43,y, 43, 43, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 20, 42, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 42, 20, 0x242017); - - rasterizerInstanced.drawCircle(21, 21, 20, 0x242017); - shapeImageToPixels(minimapCompass, 5, 5, 33, 33, 25, 25, Game.getMinimapRotation(), 256, resizableCompasOffsets2, resizableCompasOffsets1); - - System.arraycopy(tempResizableMiniMapimage.pixels, 0, resizableMiniMapimage.pixels,0, resizableMiniMapimage.pixels.length); -// Class65.method1018(); - - // ScreenController.drawFramePiece(resizableMiniMapimage, x, y); - - } - - private void drawResizableMinimapDots() { - for(int i = 0; minimapHintCount > i; i++) { - int hintX = 2 + 4 * minimapHintX[i] + -(Player.localPlayer.worldX / 32); - int hintY = 2 + 4 * minimapHintY[i] - Player.localPlayer.worldY / 32; - drawOnResizableMinimap(hintX, hintY, minimapHint[i]); - } - for(int x = 0; x < 104; x++) { - for(int y = 0; y < 104; y++) { - LinkedList linkedList = MovedStatics.groundItems[Player.worldLevel][x][y]; - if(linkedList != null) { - int itemY = -(Player.localPlayer.worldY / 32) + 2 + y * 4; - int itemX = -(Player.localPlayer.worldX / 32) + 2 + x * 4; - drawOnResizableMinimap(itemX, itemY, mapDots[0]); - } - } - } - for(int i = 0; Player.npcCount > i; i++) { - Npc npc = Player.npcs[Player.npcIds[i]]; - if(npc != null && npc.isInitialized()) { - ActorDefinition definition = npc.actorDefinition; - if(definition.childIds != null) - definition = definition.getChildDefinition(); - if(definition != null && definition.renderOnMinimap && definition.isClickable) { - int npcX = -(Player.localPlayer.worldX / 32) + npc.worldX / 32; - int npcY = npc.worldY / 32 + -(Player.localPlayer.worldY / 32); - drawOnResizableMinimap(npcX, npcY, mapDots[1]); - } - } - } - for(int i = 0; Player.localPlayerCount > i; i++) { - Player player = Player.trackedPlayers[Player.trackedPlayerIndices[i]]; - if(player != null && player.isInitialized()) { - int playerX = player.worldX / 32 + -(Player.localPlayer.worldX / 32); - int playerY = -(Player.localPlayer.worldY / 32) + player.worldY / 32; - boolean isFriend = Game.friendList.containsPlayerUsername(player.playerName); - boolean isTeammate = false; - if(Player.localPlayer.teamId != 0 && player.teamId != 0 && player.teamId == Player.localPlayer.teamId) - isTeammate = true; - if(isFriend) - drawOnResizableMinimap(playerX, playerY, mapDots[3]); - else if(isTeammate) - drawOnResizableMinimap(playerX, playerY, mapDots[4]); - else - drawOnResizableMinimap(playerX, playerY, mapDots[2]); - } - } - if(Player.headIconDrawType != 0 && MovedStatics.pulseCycle % 20 < 10) { - if(Player.headIconDrawType == 1 && MovedStatics.hintIconNpcTarget >= 0 && Player.npcs.length > MovedStatics.hintIconNpcTarget) { - Npc npc = Player.npcs[MovedStatics.hintIconNpcTarget]; - if(npc != null) { - int npcX = -(Player.localPlayer.worldX / 32) + npc.worldX / 32; - int npcY = npc.worldY / 32 - Player.localPlayer.worldY / 32; - drawMinimapMark(minimapMarkers[1], npcX, npcY); - } - } - if(Player.headIconDrawType == 2) { - int hintY = -(Player.localPlayer.worldY / 32) + 2 + 4 * (-MovedStatics.baseY + MovedStatics.hintIconPosY); - int hintX = 4 * (MovedStatics.hintIconPosX - MovedStatics.baseX) - (-2 + Player.localPlayer.worldX / 32); - drawMinimapMark(minimapMarkers[1], hintX, hintY); - } - if(Player.headIconDrawType == 10 && MovedStatics.hintIconPlayerTarget >= 0 && Player.trackedPlayers.length > MovedStatics.hintIconPlayerTarget) { - Player player = Player.trackedPlayers[MovedStatics.hintIconPlayerTarget]; - if(player != null) { - int playerY = -(Player.localPlayer.worldY / 32) + player.worldY / 32; - int playerX = player.worldX / 32 - Player.localPlayer.worldX / 32; - drawMinimapMark(minimapMarkers[1], playerX, playerY); - } - } - } - if(MovedStatics.destinationX != 0) { - int flagX = 2 + MovedStatics.destinationX * 4 + -(Player.localPlayer.worldX / 32); - int flagY = 2 + 4 * Game.destinationY + -(Player.localPlayer.worldY / 32); - drawOnResizableMinimap(flagX, flagY, minimapMarkers[0]); - } - } - - public void drawOnResizableMinimap(int x, int y, ImageRGB sprite) { - if(sprite == null) { - return; - } - int angle = 0x7ff & Game.getMinimapRotation(); - int l = y * y + x * x; - if(l > 17000) { - return; - } - int sine = Model.SINE[angle]; - int cosine = Model.COSINE[angle]; - int zoom = 0; - - sine = sine * 256 / (zoom + 256); - cosine = cosine * 256 / (zoom + 256); - int i_3_ = cosine * x + y * sine >> 16; - int i_4_ = -(x * sine) + cosine * y >> 16; - drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); - } - - public void drawMinimapMark(ImageRGB sprite, int mapX, int mapY) { - int len = mapX * mapX + mapY * mapY; - if (len > 4225 && len < 90000) { - int theta = 0x7ff & Game.getMinimapRotation(); - int sine = Model.SINE[theta]; - int cosine = Model.COSINE[theta]; - int zoom = 0; - - sine = sine * 256 / (zoom + 256); - cosine = cosine * 256 / (zoom + 256); - int y = cosine * mapY - sine * mapX >> 16; - int x = mapX * cosine + mapY * sine >> 16; - double angle = Math.atan2(x, y); - int drawX = (int) (Math.sin(angle) * 63.0); - int drawY = (int) (57.0 * Math.cos(angle)); - drawRotated(sprite, -10 + 94 + drawX + 4, 83 + -drawY + -20, 15, 15, 20, 20, 256, angle); - } else { - drawOnResizableMinimap(mapY, mapX, sprite); - } - } - } diff --git a/src/main/java/org/runejs/client/frame/MinimapRenderer.java b/src/main/java/org/runejs/client/frame/MinimapRenderer.java new file mode 100644 index 000000000..bc67b94a2 --- /dev/null +++ b/src/main/java/org/runejs/client/frame/MinimapRenderer.java @@ -0,0 +1,222 @@ +package org.runejs.client.frame; + +import org.runejs.client.Game; +import org.runejs.client.LinkedList; +import org.runejs.client.MovedStatics; +import org.runejs.client.ProducingGraphicsBuffer; +import org.runejs.client.cache.def.ActorDefinition; +import org.runejs.client.cache.media.ImageRGB; +import org.runejs.client.media.RasterizerInstanced; +import org.runejs.client.media.renderable.Model; +import org.runejs.client.media.renderable.actor.Npc; +import org.runejs.client.media.renderable.actor.Player; + +/** + * A {@link FramePieceRenderer} that renders the minimap. + * + * TODO (jkm) this currently renders the "resizable" mode (square) minimap only + */ +public class MinimapRenderer extends FramePieceRenderer { + public static int[] resizableMinimapOffsets1; + public static int[] resizableMinimapOffsets2; + public static ProducingGraphicsBuffer resizableMiniMapimage; + public int[] resizableCompasOffsets1; + public int[] resizableCompasOffsets2; + public ProducingGraphicsBuffer tempResizableMiniMapimage; + public static int[] resizableMinimapLineOffsets; + + public MinimapRenderer() { + super( + new FramePieceAnchor( + FramePieceAnchor.Anchor.TOP | FramePieceAnchor.Anchor.RIGHT, + 0, + 0 + ), + 210, + 210 + ); + + this.tempResizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); + resizableMinimapOffsets1 = new int[200]; + resizableMinimapOffsets2 = new int[200]; + for(int i = 0; i < resizableMinimapOffsets2.length; i++) { + resizableMinimapOffsets1[i] = 200; + resizableMinimapOffsets2[i] = 0; + } + + resizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); + + rasterizerInstanced = new RasterizerInstanced(tempResizableMiniMapimage); + } + + public ProducingGraphicsBuffer getDrawable() { + return resizableMiniMapimage; + } + + public void RenderResizableMiniMapArea(int x, int y) { + if(resizableCompasOffsets1 == null) { + resizableCompasOffsets1 = new int[33]; + resizableCompasOffsets2 = new int[33]; + for(int y1 = 0; y1 < 33; y1++) { + int i_15_ = 0; + int i_16_ = 999; + for(int x1 = 0; x1 < 34; x1++) { + if(Minimap.minimapBackgroundImage.imgPixels[Minimap.minimapBackgroundImage.imgWidth * y1 + x1] == 0) { + if(i_16_ == 999) + i_16_ = x1; + } else if(i_16_ != 999) { + i_15_ = x1; + break; + } + } + resizableCompasOffsets2[y1] = i_16_; + resizableCompasOffsets1[y1] = -i_16_ + i_15_; + } + } + + // TODO handle black minimap for Minimap.minimapState == 2 + + int i = 48 + Player.localPlayer.worldX / 32; + int i_8_ = 464 + -(Player.localPlayer.worldY / 32); + int i_9_ = Game.getMinimapRotation() & 0x7ff; + int minimapZoom = 0; + + shapeImageToPixels(Minimap.minimapImage,5, 5, 200, 200, i, i_8_, i_9_, minimapZoom + 256, resizableMinimapOffsets2, resizableMinimapOffsets1); + drawResizableMinimapDots(); + rasterizerInstanced.drawFilledRectangle(105, 105, 3, 3, 16777215); + rasterizerInstanced.drawFilledRectangle(0, 0, 210, 5, 0x242017); + rasterizerInstanced.drawFilledRectangle(0, 205, 210, 5, 0x242017); + rasterizerInstanced.drawFilledRectangle(0, 0, 5, 210, 0x242017); + rasterizerInstanced.drawFilledRectangle(205, 0, 5, 210, 0x242017); + + // Rasterizer.drawFilledRectangle(x-43,y, 43, 43, 0x242017); + rasterizerInstanced.drawFilledRectangle(0, 0, 20, 42, 0x242017); + rasterizerInstanced.drawFilledRectangle(0, 0, 42, 20, 0x242017); + + rasterizerInstanced.drawCircle(21, 21, 20, 0x242017); + shapeImageToPixels(Minimap.minimapCompass, 5, 5, 33, 33, 25, 25, Game.getMinimapRotation(), 256, resizableCompasOffsets2, resizableCompasOffsets1); + + System.arraycopy(tempResizableMiniMapimage.pixels, 0, resizableMiniMapimage.pixels,0, resizableMiniMapimage.pixels.length); +// Class65.method1018(); + + // ScreenController.drawFramePiece(resizableMiniMapimage, x, y); + + } + + private void drawResizableMinimapDots() { + for(int i = 0; Minimap.minimapHintCount > i; i++) { + int hintX = 2 + 4 * Minimap.minimapHintX[i] + -(Player.localPlayer.worldX / 32); + int hintY = 2 + 4 * Minimap.minimapHintY[i] - Player.localPlayer.worldY / 32; + drawOnResizableMinimap(hintX, hintY, Minimap.minimapHint[i]); + } + for(int x = 0; x < 104; x++) { + for(int y = 0; y < 104; y++) { + LinkedList linkedList = MovedStatics.groundItems[Player.worldLevel][x][y]; + if(linkedList != null) { + int itemY = -(Player.localPlayer.worldY / 32) + 2 + y * 4; + int itemX = -(Player.localPlayer.worldX / 32) + 2 + x * 4; + drawOnResizableMinimap(itemX, itemY, Minimap.mapDots[0]); + } + } + } + for(int i = 0; Player.npcCount > i; i++) { + Npc npc = Player.npcs[Player.npcIds[i]]; + if(npc != null && npc.isInitialized()) { + ActorDefinition definition = npc.actorDefinition; + if(definition.childIds != null) + definition = definition.getChildDefinition(); + if(definition != null && definition.renderOnMinimap && definition.isClickable) { + int npcX = -(Player.localPlayer.worldX / 32) + npc.worldX / 32; + int npcY = npc.worldY / 32 + -(Player.localPlayer.worldY / 32); + drawOnResizableMinimap(npcX, npcY, Minimap.mapDots[1]); + } + } + } + for(int i = 0; Player.localPlayerCount > i; i++) { + Player player = Player.trackedPlayers[Player.trackedPlayerIndices[i]]; + if(player != null && player.isInitialized()) { + int playerX = player.worldX / 32 + -(Player.localPlayer.worldX / 32); + int playerY = -(Player.localPlayer.worldY / 32) + player.worldY / 32; + boolean isFriend = Game.friendList.containsPlayerUsername(player.playerName); + boolean isTeammate = false; + if(Player.localPlayer.teamId != 0 && player.teamId != 0 && player.teamId == Player.localPlayer.teamId) + isTeammate = true; + if(isFriend) + drawOnResizableMinimap(playerX, playerY, Minimap.mapDots[3]); + else if(isTeammate) + drawOnResizableMinimap(playerX, playerY, Minimap.mapDots[4]); + else + drawOnResizableMinimap(playerX, playerY, Minimap.mapDots[2]); + } + } + if(Player.headIconDrawType != 0 && MovedStatics.pulseCycle % 20 < 10) { + if(Player.headIconDrawType == 1 && MovedStatics.hintIconNpcTarget >= 0 && Player.npcs.length > MovedStatics.hintIconNpcTarget) { + Npc npc = Player.npcs[MovedStatics.hintIconNpcTarget]; + if(npc != null) { + int npcX = -(Player.localPlayer.worldX / 32) + npc.worldX / 32; + int npcY = npc.worldY / 32 - Player.localPlayer.worldY / 32; + drawMinimapMark(Minimap.minimapMarkers[1], npcX, npcY); + } + } + if(Player.headIconDrawType == 2) { + int hintY = -(Player.localPlayer.worldY / 32) + 2 + 4 * (-MovedStatics.baseY + MovedStatics.hintIconPosY); + int hintX = 4 * (MovedStatics.hintIconPosX - MovedStatics.baseX) - (-2 + Player.localPlayer.worldX / 32); + drawMinimapMark(Minimap.minimapMarkers[1], hintX, hintY); + } + if(Player.headIconDrawType == 10 && MovedStatics.hintIconPlayerTarget >= 0 && Player.trackedPlayers.length > MovedStatics.hintIconPlayerTarget) { + Player player = Player.trackedPlayers[MovedStatics.hintIconPlayerTarget]; + if(player != null) { + int playerY = -(Player.localPlayer.worldY / 32) + player.worldY / 32; + int playerX = player.worldX / 32 - Player.localPlayer.worldX / 32; + drawMinimapMark(Minimap.minimapMarkers[1], playerX, playerY); + } + } + } + if(MovedStatics.destinationX != 0) { + int flagX = 2 + MovedStatics.destinationX * 4 + -(Player.localPlayer.worldX / 32); + int flagY = 2 + 4 * Game.destinationY + -(Player.localPlayer.worldY / 32); + drawOnResizableMinimap(flagX, flagY, Minimap.minimapMarkers[0]); + } + } + + public void drawOnResizableMinimap(int x, int y, ImageRGB sprite) { + if(sprite == null) { + return; + } + int angle = 0x7ff & Game.getMinimapRotation(); + int l = y * y + x * x; + if(l > 17000) { + return; + } + int sine = Model.SINE[angle]; + int cosine = Model.COSINE[angle]; + int zoom = 0; + + sine = sine * 256 / (zoom + 256); + cosine = cosine * 256 / (zoom + 256); + int i_3_ = cosine * x + y * sine >> 16; + int i_4_ = -(x * sine) + cosine * y >> 16; + drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); + } + + public void drawMinimapMark(ImageRGB sprite, int mapX, int mapY) { + int len = mapX * mapX + mapY * mapY; + if (len > 4225 && len < 90000) { + int theta = 0x7ff & Game.getMinimapRotation(); + int sine = Model.SINE[theta]; + int cosine = Model.COSINE[theta]; + int zoom = 0; + + sine = sine * 256 / (zoom + 256); + cosine = cosine * 256 / (zoom + 256); + int y = cosine * mapY - sine * mapX >> 16; + int x = mapX * cosine + mapY * sine >> 16; + double angle = Math.atan2(x, y); + int drawX = (int) (Math.sin(angle) * 63.0); + int drawY = (int) (57.0 * Math.cos(angle)); + drawRotated(sprite, -10 + 94 + drawX + 4, 83 + -drawY + -20, 15, 15, 20, 20, 256, angle); + } else { + drawOnResizableMinimap(mapY, mapX, sprite); + } + } +} diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index 4e212426e..3775cf319 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -4,11 +4,11 @@ import org.runejs.client.frame.tab.TabProducer; public class ResizableFrameRenderer implements FrameRenderer { - private final Minimap minimap; + private final MinimapRenderer minimap; private final TabProducer tabProducer; private final ChatBoxRenderer chatbox; - public ResizableFrameRenderer(Minimap minimap, TabProducer tabProducer, ChatBoxRenderer chatbox) { + public ResizableFrameRenderer(MinimapRenderer minimap, TabProducer tabProducer, ChatBoxRenderer chatbox) { this.minimap = minimap; this.tabProducer = tabProducer; this.chatbox = chatbox; diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 44d918d22..676c8671f 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -26,6 +26,7 @@ public class ScreenController { public static int drawWidth = 765; public static int drawHeight = 540; public static Minimap minimap = new Minimap(); + public static MinimapRenderer minimapRenderer = new MinimapRenderer(); public static TabProducer tabProducer = new TabProducer(); public static ChatBoxRenderer chatBoxRenderer = new ChatBoxRenderer(); private static Thread drawingThread; @@ -130,12 +131,12 @@ public static void setBounds() { */ public static void RenderResizableUI() { if (drawingThread == null) { - renderer = new ResizableFrameRenderer(minimap, tabProducer, chatBoxRenderer); + renderer = new ResizableFrameRenderer(minimapRenderer, tabProducer, chatBoxRenderer); drawingThread = new Thread(renderer); drawingThread.start(); } - minimap.draw(drawWidth, drawHeight); + minimapRenderer.draw(drawWidth, drawHeight); tabProducer.draw(drawWidth, drawHeight); chatBoxRenderer.draw(drawWidth, drawHeight); From c5d918f36916dc3b79999453ad28d5537ae4c03e Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:20:20 +0100 Subject: [PATCH 05/45] refactor: extend FrameRenderer interface and move logic to ResizableFrameRenderer --- .../runejs/client/frame/FrameRenderer.java | 14 ++ .../client/frame/ResizableFrameRenderer.java | 139 +++++++++++++++++- .../runejs/client/frame/ScreenController.java | 90 +++--------- 3 files changed, 165 insertions(+), 78 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/FrameRenderer.java b/src/main/java/org/runejs/client/frame/FrameRenderer.java index 1fac680de..ad0826c91 100644 --- a/src/main/java/org/runejs/client/frame/FrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/FrameRenderer.java @@ -1,4 +1,18 @@ package org.runejs.client.frame; +import org.runejs.client.frame.tab.TabProducer; + public interface FrameRenderer extends Runnable { + void setDrawSize(int drawWidth, int drawHeight); + + boolean isCoordinatesInChatArea(int x, int y); + boolean isCoordinatesIn3dScreen(int x, int y); + boolean isCoordinatesInMinimapArea(int x, int y); + boolean isCoordinatesInTabArea(int x, int y); + boolean isCoordinatesInExtendedTabArea(int x, int y); + boolean isCoordinatesInExtendedChatArea(int x, int y); + + TabProducer getTabProducer(); + + void draw(int mouseX, int mouseY, boolean debugView); } diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index 3775cf319..5890f874f 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -1,23 +1,31 @@ package org.runejs.client.frame; import org.runejs.client.Game; +import org.runejs.client.MovedStatics; import org.runejs.client.frame.tab.TabProducer; +import org.runejs.client.media.Rasterizer; public class ResizableFrameRenderer implements FrameRenderer { - private final MinimapRenderer minimap; - private final TabProducer tabProducer; - private final ChatBoxRenderer chatbox; + public final MinimapRenderer minimap = new MinimapRenderer(); + public final TabProducer tabProducer = new TabProducer(); + public final ChatBoxRenderer chatbox = new ChatBoxRenderer(); - public ResizableFrameRenderer(MinimapRenderer minimap, TabProducer tabProducer, ChatBoxRenderer chatbox) { - this.minimap = minimap; - this.tabProducer = tabProducer; - this.chatbox = chatbox; + private Thread drawingThread; + + private int drawWidth; + private int drawHeight; + + private boolean canDraw; + + public ResizableFrameRenderer() { + drawingThread = new Thread(this); + drawingThread.start(); } @Override public void run() { while(true){ - if(Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30){ + if(canDraw && Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30){ minimap.RenderResizableMiniMapArea(ScreenController.drawWidth - 210, 0); tabProducer.RenderResizableSideBarArea(); chatbox.render(); @@ -27,7 +35,122 @@ public void run() { } catch(InterruptedException e) { e.printStackTrace(); } + } + } + + public void setDrawSize(int drawWidth, int drawHeight) { + this.drawWidth = drawWidth; + this.drawHeight = drawHeight; + } + + private void drawToScreen() { + minimap.draw(drawWidth, drawHeight); + tabProducer.draw(drawWidth, drawHeight); + chatbox.draw(drawWidth, drawHeight); + } + + /** + * Draw the debug view over the top + * + * TODO (jkm) remove static Rasterizer calls here + * + * @param mX Mouse position X + * @param mY Mouse position Y + */ + private void drawDebugView(int mX, int mY) { + int[] tabInterFaceCoords= tabProducer.getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); + int[] tabInterFaceTop = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); + int[] tabInterFaceBottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); + if (isCoordinatesIn3dScreen(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); + } + if (isCoordinatesInExtendedTabArea(mX, mY) && !isCoordinatesInTabArea(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); + Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); + Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); + } + if (isCoordinatesInTabArea(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); + } + if (isCoordinatesInExtendedChatArea(mX, mY) && !isCoordinatesInChatArea(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); + } + if (isCoordinatesInChatArea(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); + } + if (isCoordinatesInMinimapArea(mX, mY)) { + Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); + } else { + Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); + } + + Rasterizer.drawFilledRectangle(mX - 4, mY - 4, 4, 4, 0xFF0000); + } + + public boolean isCoordinatesInChatArea(int x, int y) { + int minX = 17; + int minY = drawHeight - (162) + 16; + // TODO (jkm) point these elsewhere + int maxX = minX + ChatBox.chatBoxImageProducer.width; + int maxY = minY + ChatBox.chatBoxImageProducer.height; + return x > minX && y > minY && x < maxX && y < maxY; + } + + public boolean isCoordinatesIn3dScreen(int x, int y) { + return x > 0 && y > 0 && x < drawWidth && y < drawHeight && !isCoordinatesInExtendedTabArea(x, y) && !isCoordinatesInTabArea(x, y) && !isCoordinatesInMinimapArea(x, y) && !isCoordinatesInExtendedChatArea(x, y); + } + + public boolean isCoordinatesInMinimapArea(int x, int y) { + return x > drawWidth - 210 && y < 210; + } + + public boolean isCoordinatesInTabArea(int x, int y) { + int[] tabInterFaceCoords= tabProducer.getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); + + int minX = tabInterFaceCoords[0]; + int minY = tabInterFaceCoords[1]; + int maxX = minX + tabInterFaceCoords[2]; + int maxY = minY + tabInterFaceCoords[3]; + return x > minX && y > minY && x < maxX && y < maxY; + } + + public boolean isCoordinatesInExtendedTabArea(int x, int y) { + int[] top = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); + int[] bottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); + if(x > top[0] && x < top[0]+top[2] && y > top[1] && y < top[1]+top[3]) { + return true; + } else return x > bottom[0] && x < bottom[0] + bottom[2] && y > bottom[1] && y < bottom[1] + bottom[3]; + } + + public boolean isCoordinatesInExtendedChatArea(int x, int y) { + return x > 0 && y > drawHeight - 184 && x < 516; + } + + public TabProducer getTabProducer() { + return tabProducer; + } + + public void draw(int mouseX, int mouseY, boolean debugView) { + canDraw = true; + + drawToScreen(); + + if (debugView) { + drawDebugView(mouseX, mouseY); + } + if (MovedStatics.menuOpen) { + MovedStatics.drawMenu(0, 0); } } } diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 676c8671f..838c372a2 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -26,13 +26,17 @@ public class ScreenController { public static int drawWidth = 765; public static int drawHeight = 540; public static Minimap minimap = new Minimap(); - public static MinimapRenderer minimapRenderer = new MinimapRenderer(); - public static TabProducer tabProducer = new TabProducer(); - public static ChatBoxRenderer chatBoxRenderer = new ChatBoxRenderer(); - private static Thread drawingThread; private static FrameRenderer renderer; public static boolean DebugView = false; + private static FrameRenderer getRenderer() { + // TODO check frame type etc etc this is just temporary + if (renderer == null) { + renderer = new ResizableFrameRenderer(); + } + + return renderer; + } public static void frameMode(ScreenMode screenMode) { if (frameMode != screenMode) { @@ -90,6 +94,9 @@ public static void setBounds() { Dimension innerSize = getInnerSize(GameShell.clientFrame); drawHeight = innerSize.height; drawWidth = innerSize.width; + + getRenderer().setDrawSize(drawWidth, drawHeight); + Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 512 : drawWidth, frameMode == ScreenMode.FIXED ? 334 : drawHeight); MovedStatics.fullScreenTextureArray = Rasterizer3D.setLineOffsets(null); Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 479 : drawWidth, frameMode == ScreenMode.FIXED ? 96 : drawHeight); @@ -126,68 +133,12 @@ public static void setBounds() { } } - /** - * TODO (jkm) move all this to ResizableFrameRenderer - */ public static void RenderResizableUI() { - if (drawingThread == null) { - renderer = new ResizableFrameRenderer(minimapRenderer, tabProducer, chatBoxRenderer); - drawingThread = new Thread(renderer); - drawingThread.start(); - } - - minimapRenderer.draw(drawWidth, drawHeight); - tabProducer.draw(drawWidth, drawHeight); - chatBoxRenderer.draw(drawWidth, drawHeight); - - if (DebugView) { - int mX = MouseHandler.mouseX; - int mY = MouseHandler.mouseY; - - int[] tabInterFaceCoords= tabProducer.getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); - int[] tabInterFaceTop = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); - int[] tabInterFaceBottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); - if (isCoordinatesIn3dScreen(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); - } - if (isCoordinatesInExtendedTabArea(mX, mY) && !isCoordinatesInTabArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); - Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); - Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); - } - if (isCoordinatesInTabArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); - } - if (isCoordinatesInExtendedChatArea(mX, mY) && !isCoordinatesInChatArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); - } - if (isCoordinatesInChatArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); - } - if (isCoordinatesInMinimapArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); - } else { - Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); - } - - - Rasterizer.drawFilledRectangle(MouseHandler.mouseX - 4, MouseHandler.mouseY - 4, 4, 4, 0xFF0000); - } - - if (MovedStatics.menuOpen) { - MovedStatics.drawMenu(0, 0); - } + // create the render thread if required, and draw the output to screen + int mX = MouseHandler.mouseX; + int mY = MouseHandler.mouseY; + getRenderer().draw(mX, mY, DebugView); } @@ -214,7 +165,6 @@ public static boolean isCoordinatesIn3dScreen(int x, int y) { return x > 4 && y > 4 && x < 516 && y < 338; } else { return x > 0 && y > 0 && x < drawWidth && y < drawHeight && !isCoordinatesInExtendedTabArea(x, y) && !isCoordinatesInTabArea(x, y) && !isCoordinatesInMinimapArea(x, y) && !isCoordinatesInExtendedChatArea(x, y); - } } @@ -222,7 +172,7 @@ public static boolean isCoordinatesInTabArea(int x, int y) { if (frameMode == ScreenMode.FIXED) { return x > 553 && y > 205 && x < 743 && y < 466; } else { - int[] tabInterFaceCoords= tabProducer.getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); + int[] tabInterFaceCoords= getRenderer().getTabProducer().getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); int minX = tabInterFaceCoords[0]; int minY = tabInterFaceCoords[1]; @@ -234,8 +184,8 @@ public static boolean isCoordinatesInTabArea(int x, int y) { public static boolean isCoordinatesInExtendedTabArea(int x, int y) { - int[] top = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); - int[] bottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); + int[] top = getRenderer().getTabProducer().getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); + int[] bottom = getRenderer().getTabProducer().getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); if(x > top[0] && x < top[0]+top[2] && y > top[1] && y < top[1]+top[3]) { return true; } else return x > bottom[0] && x < bottom[0] + bottom[2] && y > bottom[1] && y < bottom[1] + bottom[3]; @@ -274,7 +224,7 @@ else if (Game.tabWidgetIds[Game.currentTabId] != -1) { MovedStatics.handleInterfaceActions(GameInterfaceArea.TAB_AREA, mouseX, mouseY, 553, 205, 743, 466, Game.tabWidgetIds[Game.currentTabId]); } } else { - int[] tabInterFaceCoords= tabProducer.getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); + int[] tabInterFaceCoords= getRenderer().getTabProducer().getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); if (GameInterface.tabAreaInterfaceId != -1) MovedStatics.handleInterfaceActions(GameInterfaceArea.TAB_AREA, mouseX, mouseY, tabInterFaceCoords[0], tabInterFaceCoords[1], tabInterFaceCoords[0]+tabInterFaceCoords[2],tabInterFaceCoords[1]+tabInterFaceCoords[3], GameInterface.tabAreaInterfaceId); @@ -524,7 +474,7 @@ public static void handleTabClick() { } } else { if(isCoordinatesInExtendedTabArea(x, y)) { - tabProducer.clickTabButton(x,y, drawWidth - 241, drawHeight - (334)); + getRenderer().getTabProducer().clickTabButton(x,y, drawWidth - 241, drawHeight - (334)); } } From 8de35eabf523e861ca9916647e426e887ae3145f Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:22:13 +0100 Subject: [PATCH 06/45] refactor: remove drawFramePiece --- .../runejs/client/frame/FramePieceRenderer.java | 17 ++++++++++------- .../runejs/client/frame/ScreenController.java | 8 -------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java index 12d4021d7..d3a821c47 100644 --- a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java +++ b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java @@ -2,6 +2,7 @@ import org.runejs.client.ProducingGraphicsBuffer; import org.runejs.client.cache.media.ImageRGB; +import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; public abstract class FramePieceRenderer { @@ -20,20 +21,22 @@ public FramePieceRenderer(FramePieceAnchor anchor, int width, int height) { public abstract ProducingGraphicsBuffer getDrawable(); /** - * Draws the piece. + * Draws the piece to the game screen. + * * @param drawWidth The width of the window. * @param drawHeight The height of the window. * - * TODO (jkm) refactor this to not use static `ScreenController`. + * TODO (jkm) refactor this to not use static `Rasterizer`. */ public void draw(int drawWidth, int drawHeight) { int[] position = this.anchor.getPosition(drawWidth, drawHeight, this.width, this.height); - ScreenController.drawFramePiece( - getDrawable(), - position[0], - position[1] - ); + ProducingGraphicsBuffer drawable = getDrawable(); + + int x = position[0]; + int y = position[1]; + + Rasterizer.copyPixels(drawable.pixels, drawable.width, drawable.height, x, y); } /** diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 838c372a2..419380b38 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -152,14 +152,6 @@ public static Dimension getInnerSize(Frame frame) { return size; } - public static void drawFramePiece(ProducingGraphicsBuffer framePiece, int x, int y) { - Rasterizer.copyPixels(framePiece.pixels, framePiece.width, framePiece.height, x, y); - } - - public static void drawFramePieceCutout(ProducingGraphicsBuffer framePiece, int x, int y, int width, int height, int offsetX, int offsetY) { - Rasterizer.copyPixelsCutOff(framePiece.pixels, framePiece.width, framePiece.height, x, y, width, height, offsetX, offsetY); - } - public static boolean isCoordinatesIn3dScreen(int x, int y) { if (frameMode == ScreenMode.FIXED) { return x > 4 && y > 4 && x < 516 && y < 338; From d13a4c1410476ecedb00bd95a013e84f2597e0b3 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:30:48 +0100 Subject: [PATCH 07/45] refactor: create FixedFrameRenderer and defer all coords checks --- .../client/frame/FixedFrameRenderer.java | 70 ++++++++++++++++++ .../runejs/client/frame/FrameRenderer.java | 1 + .../client/frame/ResizableFrameRenderer.java | 8 ++- .../runejs/client/frame/ScreenController.java | 71 +++++-------------- 4 files changed, 97 insertions(+), 53 deletions(-) create mode 100644 src/main/java/org/runejs/client/frame/FixedFrameRenderer.java diff --git a/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java b/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java new file mode 100644 index 000000000..a99480861 --- /dev/null +++ b/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java @@ -0,0 +1,70 @@ +package org.runejs.client.frame; + +import org.runejs.client.frame.tab.TabProducer; + +public class FixedFrameRenderer implements FrameRenderer { + public final TabProducer tabProducer = new TabProducer(); + + private int drawWidth; + private int drawHeight; + + @Override + public void setDrawSize(int drawWidth, int drawHeight) { + this.drawWidth = drawWidth; + this.drawHeight = drawHeight; + } + + @Override + public boolean isCoordinatesInChatArea(int x, int y) { + return x > 17 && y > 357 && x < 496 && y < 453; + } + + @Override + public boolean isCoordinatesIn3dScreen(int x, int y) { + return x > 4 && y > 4 && x < 516 && y < 338; + } + + @Override + public boolean isCoordinatesInMinimapArea(int x, int y) { + return x > 575 && y < 156; + } + + @Override + public boolean isCoordinatesInTabArea(int x, int y) { + return x > 553 && y > 205 && x < 743 && y < 466; + } + + @Override + public boolean isCoordinatesInExtendedTabArea(int x, int y) { + int[] top = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); + int[] bottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); + if(x > top[0] && x < top[0]+top[2] && y > top[1] && y < top[1]+top[3]) { + return true; + } else return x > bottom[0] && x < bottom[0] + bottom[2] && y > bottom[1] && y < bottom[1] + bottom[3]; + } + + @Override + public boolean isCoordinatesInExtendedChatArea(int x, int y) { + return x > 0 && y > drawHeight - 184 && x < 516; + } + + @Override + public TabProducer getTabProducer() { + return tabProducer; + } + + @Override + public void draw(int mouseX, int mouseY, boolean debugView) { + + } + + @Override + public void stop() { + + } + + @Override + public void run() { + + } +} diff --git a/src/main/java/org/runejs/client/frame/FrameRenderer.java b/src/main/java/org/runejs/client/frame/FrameRenderer.java index ad0826c91..104de22e5 100644 --- a/src/main/java/org/runejs/client/frame/FrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/FrameRenderer.java @@ -15,4 +15,5 @@ public interface FrameRenderer extends Runnable { TabProducer getTabProducer(); void draw(int mouseX, int mouseY, boolean debugView); + void stop(); } diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index 5890f874f..e613c9512 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -16,6 +16,7 @@ public class ResizableFrameRenderer implements FrameRenderer { private int drawHeight; private boolean canDraw; + private boolean shouldStop = false; public ResizableFrameRenderer() { drawingThread = new Thread(this); @@ -24,7 +25,7 @@ public ResizableFrameRenderer() { @Override public void run() { - while(true){ + while(!shouldStop){ if(canDraw && Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30){ minimap.RenderResizableMiniMapArea(ScreenController.drawWidth - 210, 0); tabProducer.RenderResizableSideBarArea(); @@ -153,4 +154,9 @@ public void draw(int mouseX, int mouseY, boolean debugView) { MovedStatics.drawMenu(0, 0); } } + + @Override + public void stop() { + shouldStop = true; + } } diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 419380b38..bc7e9bc4c 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -26,27 +26,23 @@ public class ScreenController { public static int drawWidth = 765; public static int drawHeight = 540; public static Minimap minimap = new Minimap(); - private static FrameRenderer renderer; + private static FrameRenderer renderer = new FixedFrameRenderer(); public static boolean DebugView = false; - private static FrameRenderer getRenderer() { - // TODO check frame type etc etc this is just temporary - if (renderer == null) { - renderer = new ResizableFrameRenderer(); - } - - return renderer; - } - public static void frameMode(ScreenMode screenMode) { if (frameMode != screenMode) { frameMode = screenMode; + + renderer.stop(); + if (screenMode == ScreenMode.FIXED) { frameWidth = 765; frameHeight = 503; GameShell.clientFrame.setResizable(false); GameShell.clientFrame.setPreferredSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); GameShell.clientFrame.setMinimumSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); + + renderer = new FixedFrameRenderer(); } else if (screenMode == ScreenMode.RESIZABLE) { frameWidth = 900; frameHeight = 637; @@ -54,10 +50,12 @@ public static void frameMode(ScreenMode screenMode) { GameShell.clientFrame.setPreferredSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); GameShell.clientFrame.setMinimumSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); - + renderer = new ResizableFrameRenderer(); } else if (screenMode == ScreenMode.FULLSCREEN) { frameWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); frameHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); + + renderer = new ResizableFrameRenderer(); } GameShell.clientFrame.setSize(ScreenController.frameWidth, ScreenController.frameHeight); Dimension innerSize = getInnerSize(GameShell.clientFrame); @@ -95,7 +93,7 @@ public static void setBounds() { drawHeight = innerSize.height; drawWidth = innerSize.width; - getRenderer().setDrawSize(drawWidth, drawHeight); + renderer.setDrawSize(drawWidth, drawHeight); Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 512 : drawWidth, frameMode == ScreenMode.FIXED ? 334 : drawHeight); MovedStatics.fullScreenTextureArray = Rasterizer3D.setLineOffsets(null); @@ -138,7 +136,7 @@ public static void RenderResizableUI() { int mX = MouseHandler.mouseX; int mY = MouseHandler.mouseY; - getRenderer().draw(mX, mY, DebugView); + renderer.draw(mX, mY, DebugView); } @@ -153,59 +151,28 @@ public static Dimension getInnerSize(Frame frame) { } public static boolean isCoordinatesIn3dScreen(int x, int y) { - if (frameMode == ScreenMode.FIXED) { - return x > 4 && y > 4 && x < 516 && y < 338; - } else { - return x > 0 && y > 0 && x < drawWidth && y < drawHeight && !isCoordinatesInExtendedTabArea(x, y) && !isCoordinatesInTabArea(x, y) && !isCoordinatesInMinimapArea(x, y) && !isCoordinatesInExtendedChatArea(x, y); - } + return renderer.isCoordinatesIn3dScreen(x, y); } public static boolean isCoordinatesInTabArea(int x, int y) { - if (frameMode == ScreenMode.FIXED) { - return x > 553 && y > 205 && x < 743 && y < 466; - } else { - int[] tabInterFaceCoords= getRenderer().getTabProducer().getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); - - int minX = tabInterFaceCoords[0]; - int minY = tabInterFaceCoords[1]; - int maxX = minX + tabInterFaceCoords[2]; - int maxY = minY + tabInterFaceCoords[3]; - return x > minX && y > minY && x < maxX && y < maxY; - } + return renderer.isCoordinatesInTabArea(x, y); } public static boolean isCoordinatesInExtendedTabArea(int x, int y) { - int[] top = getRenderer().getTabProducer().getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); - int[] bottom = getRenderer().getTabProducer().getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); - if(x > top[0] && x < top[0]+top[2] && y > top[1] && y < top[1]+top[3]) { - return true; - } else return x > bottom[0] && x < bottom[0] + bottom[2] && y > bottom[1] && y < bottom[1] + bottom[3]; + return renderer.isCoordinatesInExtendedTabArea(x, y); } public static boolean isCoordinatesInExtendedChatArea(int x, int y) { - return x > 0 && y > drawHeight - 184 && x < 516; + return renderer.isCoordinatesInExtendedChatArea(x, y); } public static boolean isCoordinatesInChatArea(int x, int y) { - if (frameMode == ScreenMode.FIXED) { - return x > 17 && y > 357 && x < 496 && y < 453; - } else { - int minX = 17; - int minY = drawHeight - (162) + 16; - int maxX = minX + ChatBox.chatBoxImageProducer.width; - int maxY = minY + ChatBox.chatBoxImageProducer.height; - return x > minX && y > minY && x < maxX && y < maxY; - } - + return renderer.isCoordinatesInChatArea(x, y); } public static boolean isCoordinatesInMinimapArea(int x, int y) { - if (frameMode == ScreenMode.FIXED) { - return x > 575 && y < 156; - } else { - return x > drawWidth - 210 && y < 210; - } + return renderer.isCoordinatesInMinimapArea(x, y); } public static void handleTabClick(int mouseX, int mouseY) { @@ -216,7 +183,7 @@ else if (Game.tabWidgetIds[Game.currentTabId] != -1) { MovedStatics.handleInterfaceActions(GameInterfaceArea.TAB_AREA, mouseX, mouseY, 553, 205, 743, 466, Game.tabWidgetIds[Game.currentTabId]); } } else { - int[] tabInterFaceCoords= getRenderer().getTabProducer().getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); + int[] tabInterFaceCoords= renderer.getTabProducer().getTabInterfaceCoordSize(drawWidth - 241, drawHeight - (334)); if (GameInterface.tabAreaInterfaceId != -1) MovedStatics.handleInterfaceActions(GameInterfaceArea.TAB_AREA, mouseX, mouseY, tabInterFaceCoords[0], tabInterFaceCoords[1], tabInterFaceCoords[0]+tabInterFaceCoords[2],tabInterFaceCoords[1]+tabInterFaceCoords[3], GameInterface.tabAreaInterfaceId); @@ -466,7 +433,7 @@ public static void handleTabClick() { } } else { if(isCoordinatesInExtendedTabArea(x, y)) { - getRenderer().getTabProducer().clickTabButton(x,y, drawWidth - 241, drawHeight - (334)); + renderer.getTabProducer().clickTabButton(x,y, drawWidth - 241, drawHeight - (334)); } } From 92471369c4609c353e31d5264a5c9375bfe79147 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:32:18 +0100 Subject: [PATCH 08/45] refactor: dont create renderer by default --- src/main/java/org/runejs/client/frame/ScreenController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index bc7e9bc4c..813cc9bd5 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -26,14 +26,16 @@ public class ScreenController { public static int drawWidth = 765; public static int drawHeight = 540; public static Minimap minimap = new Minimap(); - private static FrameRenderer renderer = new FixedFrameRenderer(); + private static FrameRenderer renderer; public static boolean DebugView = false; public static void frameMode(ScreenMode screenMode) { if (frameMode != screenMode) { frameMode = screenMode; - renderer.stop(); + if (renderer != null) { + renderer.stop(); + } if (screenMode == ScreenMode.FIXED) { frameWidth = 765; From c251a09ed713609f09fc97ad551ea67e7ce5cccd Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:33:01 +0100 Subject: [PATCH 09/45] refactor: remove unused minimap instance --- src/main/java/org/runejs/client/frame/ScreenController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 813cc9bd5..5c1450d9a 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -25,7 +25,6 @@ public class ScreenController { public static int frameHeight = 540; public static int drawWidth = 765; public static int drawHeight = 540; - public static Minimap minimap = new Minimap(); private static FrameRenderer renderer; public static boolean DebugView = false; From b1b1c60a82dce1f5e53d7b5326cba8f994ac307f Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 14:42:11 +0100 Subject: [PATCH 10/45] refactor: simplify frame checks in drawGameScreen --- src/main/java/org/runejs/client/Game.java | 111 +++++++++------------- 1 file changed, 43 insertions(+), 68 deletions(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index a88a8cb53..9e2d3dc24 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -977,87 +977,62 @@ public static void drawGameScreen() { GameInterface.drawTabIcons = true; } - if(ScreenController.frameMode == ScreenMode.FIXED) { - - if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 1) { - GameInterface.redrawTabArea = true; - } - method353(); + if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 1) { + GameInterface.redrawTabArea = true; + } - if(GameInterface.atInventoryInterfaceType == -3) { - GameInterface.redrawTabArea = true; - } - if(GameInterface.activeInterfaceType == 2) { - GameInterface.redrawTabArea = true; - } - MovedStatics.drawTabArea(); + if(GameInterface.atInventoryInterfaceType == -3) { + GameInterface.redrawTabArea = true; + } + if(GameInterface.activeInterfaceType == 2) { + GameInterface.redrawTabArea = true; + } - if(GameInterface.atInventoryInterfaceType == 3) { - ChatBox.redrawChatbox = true; - } - if(GameInterface.activeInterfaceType == 3) { - ChatBox.redrawChatbox = true; - } - if(Native.clickToContinueString != null) { - ChatBox.redrawChatbox = true; - } - if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 2) { - ChatBox.redrawChatbox = true; - } - if(ChatBox.redrawChatbox) { - ChatBox.redrawChatbox = false; - ChatBox.renderChatbox(); - // Console.console.drawConsoleArea(); - } + if(GameInterface.atInventoryInterfaceType == 3) { + ChatBox.redrawChatbox = true; + } + if(GameInterface.activeInterfaceType == 3) { + ChatBox.redrawChatbox = true; + } + if(Native.clickToContinueString != null) { + ChatBox.redrawChatbox = true; + } + if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 2) { + ChatBox.redrawChatbox = true; + } + if(ScreenController.frameMode == ScreenMode.FIXED) { Minimap.renderMinimap(); + } - if(GameInterface.drawTabIcons) { - if(flashingTabId != -1 && flashingTabId == currentTabId) { - flashingTabId = -1; - OutgoingPackets.sendMessage(new ClickFlashingTabIconOutboundMessage(currentTabId)); - } - GameInterface.drawTabIcons = false; - MovedStatics.showIconsRedrawnText = true; - MovedStatics.method527(currentTabId, tabWidgetIds, GameInterface.tabAreaInterfaceId == -1, MovedStatics.pulseCycle % 20 >= 10 ? flashingTabId : -1); - } - if(MovedStatics.redrawChatbox) { - MovedStatics.showIconsRedrawnText = true; - MovedStatics.redrawChatbox = false; - method943(ChatBox.tradeMode, MovedStatics.fontNormal, ChatBox.privateChatMode, ChatBox.publicChatMode); - } - - SoundSystem.updateObjectSounds(Player.localPlayer.worldX, Player.worldLevel, MovedStatics.anInt199, Player.localPlayer.worldY); - MovedStatics.anInt199 = 0; + method353(); - } else { - method353(); + if(ChatBox.redrawChatbox) { + ChatBox.redrawChatbox = false; ChatBox.renderChatbox(); + } - MovedStatics.drawTabArea(); - - // this render is handled in `ResizableFrameRenderer` - //Minimap.renderMinimap(); + MovedStatics.drawTabArea(); - if(GameInterface.drawTabIcons) { - if(flashingTabId != -1 && flashingTabId == currentTabId) { - flashingTabId = -1; - OutgoingPackets.sendMessage(new ClickFlashingTabIconOutboundMessage(currentTabId)); - } - GameInterface.drawTabIcons = false; - MovedStatics.showIconsRedrawnText = true; - MovedStatics.method527(currentTabId, tabWidgetIds, GameInterface.tabAreaInterfaceId == -1, MovedStatics.pulseCycle % 20 >= 10 ? flashingTabId : -1); - } - if(MovedStatics.redrawChatbox) { - MovedStatics.showIconsRedrawnText = true; - MovedStatics.redrawChatbox = false; - method943(ChatBox.tradeMode, MovedStatics.fontNormal, ChatBox.privateChatMode, ChatBox.publicChatMode); + if(GameInterface.drawTabIcons) { + if(flashingTabId != -1 && flashingTabId == currentTabId) { + flashingTabId = -1; + OutgoingPackets.sendMessage(new ClickFlashingTabIconOutboundMessage(currentTabId)); } + GameInterface.drawTabIcons = false; + MovedStatics.showIconsRedrawnText = true; + MovedStatics.method527(currentTabId, tabWidgetIds, GameInterface.tabAreaInterfaceId == -1, MovedStatics.pulseCycle % 20 >= 10 ? flashingTabId : -1); + } - SoundSystem.updateObjectSounds(Player.localPlayer.worldX, Player.worldLevel, MovedStatics.anInt199, Player.localPlayer.worldY); - MovedStatics.anInt199 = 0; + if(MovedStatics.redrawChatbox) { + MovedStatics.showIconsRedrawnText = true; + MovedStatics.redrawChatbox = false; + method943(ChatBox.tradeMode, MovedStatics.fontNormal, ChatBox.privateChatMode, ChatBox.publicChatMode); } + SoundSystem.updateObjectSounds(Player.localPlayer.worldX, Player.worldLevel, MovedStatics.anInt199, Player.localPlayer.worldY); + MovedStatics.anInt199 = 0; + } public static void displayMessageForResponseCode(int responseCode) { From 8a0e02ac5f1e4e80e066b3a42171355685c5a32f Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 15:27:41 +0100 Subject: [PATCH 11/45] refactor: rename drawFrame --- src/main/java/org/runejs/client/Game.java | 4 ++-- src/main/java/org/runejs/client/frame/ScreenController.java | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index 9e2d3dc24..19a332164 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -861,16 +861,16 @@ public static void method353() { DebugTools.drawWalkPath(); DebugTools.drawClipping(); + ScreenController.drawFrame(); + if(ScreenController.frameMode == ScreenMode.FIXED) { Console.console.drawConsole(512, 334); Console.console.drawConsoleArea(512, 334); } else { - ScreenController.RenderResizableUI(); Console.console.drawConsole(ScreenController.drawWidth, 334); Console.console.drawConsoleArea(ScreenController.drawWidth, 334); } - if(aBoolean519 && UpdateServer.getActiveCount(false, true) == 0) { aBoolean519 = false; } diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 5c1450d9a..fe9637fb9 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -2,11 +2,9 @@ import org.runejs.client.cache.media.gameInterface.GameInterface; import org.runejs.client.cache.media.gameInterface.GameInterfaceArea; -import org.runejs.client.frame.tab.TabProducer; import org.runejs.client.input.MouseHandler; import org.runejs.client.language.English; import org.runejs.client.language.Native; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.renderable.actor.Pathfinding; import org.runejs.client.media.renderable.actor.Player; @@ -18,8 +16,6 @@ import java.text.MessageFormat; public class ScreenController { - - public static ScreenMode frameMode = null; public static int frameWidth = 765; public static int frameHeight = 540; @@ -132,7 +128,7 @@ public static void setBounds() { } } - public static void RenderResizableUI() { + public static void drawFrame() { // create the render thread if required, and draw the output to screen int mX = MouseHandler.mouseX; int mY = MouseHandler.mouseY; From 350a64c172b4b89f9abb0605afd4c7564c9aae17 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 15:27:48 +0100 Subject: [PATCH 12/45] refactor: move needless if check --- src/main/java/org/runejs/client/frame/Minimap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/runejs/client/frame/Minimap.java b/src/main/java/org/runejs/client/frame/Minimap.java index b6cfca852..ad6c6929d 100644 --- a/src/main/java/org/runejs/client/frame/Minimap.java +++ b/src/main/java/org/runejs/client/frame/Minimap.java @@ -165,7 +165,7 @@ else if(isTeammate) minimapCompass.shapeImageToPixels(0, 0, 33, 33, 25, 25, Game.getMinimapRotation(), 256, MovedStatics.anIntArray62, MovedStatics.anIntArray66); minimapBackgroundImage.drawImage(0, 0); - if(MovedStatics.menuOpen && ScreenController.frameMode == ScreenMode.FIXED && MovedStatics.menuScreenArea == 1) { + if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 1) { MovedStatics.drawMenu(550, 4); } drawMapBack(); From 4a18ad0e9fba58822a7a34dece18fee8487b0a19 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 16:16:06 +0100 Subject: [PATCH 13/45] refactor: move gameScreenImageProducer to ScreenController and add rasterizer --- .../java/org/runejs/client/MovedStatics.java | 10 +++++----- .../runejs/client/frame/ScreenController.java | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index a59afa55f..f19f2108c 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -123,7 +123,6 @@ public class MovedStatics { public static volatile int eventClickY = 0; public static int anInt2628 = 0; public static volatile boolean clearScreen = true; - public static ProducingGraphicsBuffer gameScreenImageProducer; /** * Bit masks for packet buffer */ @@ -1447,7 +1446,8 @@ private static void method344(int arg0) { tabTopBack = null; tabImageProducer = null; tabHighlightImageTopLeftEdge = null; - gameScreenImageProducer = null; + ScreenController.gameScreenImageProducer = null; + ScreenController.gameRasterizer = null; tabHighlightImageBottomRightEdge = null; ChatBox.chatBoxImageProducer = null; mapBackRight = null; @@ -1944,7 +1944,7 @@ public static void method763(Component arg0, CacheArchive arg2) { Minimap.minimapBackgroundImage.drawImage(0, 0); tabImageProducer = createGraphicsBuffer(190, 261, arg0); inventoryBackgroundImage.drawImage(0, 0); - gameScreenImageProducer = createGraphicsBuffer(ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight, arg0); + ScreenController.createGameRasterizer(arg0); Rasterizer.resetPixels(); chatModes = createGraphicsBuffer(496, 50, arg0); tabBottom = createGraphicsBuffer(269, 37, arg0); @@ -2955,7 +2955,7 @@ public static int method988(CacheArchive arg0, CacheArchive arg1) { } public static void method1018() { - gameScreenImageProducer.prepareRasterizer(); + ScreenController.gameScreenImageProducer.prepareRasterizer(); fullScreenTextureArray = Rasterizer3D.setLineOffsets(fullScreenTextureArray); } @@ -3064,7 +3064,7 @@ else if(arg0) public static void drawGameScreenGraphics() { try { Graphics graphics = Game.gameCanvas.getGraphics(); - gameScreenImageProducer.drawGraphics(ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, graphics); + ScreenController.gameScreenImageProducer.drawGraphics(ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, graphics); } catch(Exception exception) { Game.gameCanvas.repaint(); } diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index fe9637fb9..d565260cb 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -6,6 +6,7 @@ import org.runejs.client.language.English; import org.runejs.client.language.Native; import org.runejs.client.media.Rasterizer3D; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.actor.Pathfinding; import org.runejs.client.media.renderable.actor.Player; import org.runejs.client.message.outbound.chat.SetChatOptionsOutboundMessage; @@ -21,9 +22,22 @@ public class ScreenController { public static int frameHeight = 540; public static int drawWidth = 765; public static int drawHeight = 540; + public static ProducingGraphicsBuffer gameScreenImageProducer; + public static RasterizerInstanced gameRasterizer; + private static FrameRenderer renderer; public static boolean DebugView = false; + public static void createGameRasterizer(Component component) { + gameScreenImageProducer = MovedStatics.createGraphicsBuffer( + ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, + ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight, + component + ); + + gameRasterizer = new RasterizerInstanced(gameScreenImageProducer); + } + public static void frameMode(ScreenMode screenMode) { if (frameMode != screenMode) { frameMode = screenMode; @@ -115,7 +129,7 @@ public static void setBounds() { Game.gameCanvas.setSize(ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight); if (Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30) { - MovedStatics.gameScreenImageProducer = MovedStatics.createGraphicsBuffer(ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight, GameShell.clientFrame); + createGameRasterizer(GameShell.clientFrame); } else { Game.gameCanvas.setSize(MovedStatics.width, MovedStatics.height); Game.gameCanvas.setVisible(true); From bd3cbe564fdade8338d62c60d3d3fecf7418b520 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 16:19:19 +0100 Subject: [PATCH 14/45] refactor: convert DebugTools to instanced rasterizer --- .../org/runejs/client/frame/DebugTools.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/DebugTools.java b/src/main/java/org/runejs/client/frame/DebugTools.java index c54725011..8f2eab0f1 100644 --- a/src/main/java/org/runejs/client/frame/DebugTools.java +++ b/src/main/java/org/runejs/client/frame/DebugTools.java @@ -31,7 +31,7 @@ public static void drawWalkPath() { Point2d nextPos = MovedStatics.getProjectedScreenPosition(0, tileY * 128 + 64, tileX * 128 + 64); if (lastTilePos != null && nextPos != null) { - Rasterizer.drawDiagonalLine(lastTilePos.x, lastTilePos.y, nextPos.x, nextPos.y, 0x00FFAC); + ScreenController.gameRasterizer.drawDiagonalLine(lastTilePos.x, lastTilePos.y, nextPos.x, nextPos.y, 0x00FFAC); } // handle final walkpath label separately to avoid clipping issues @@ -46,13 +46,13 @@ public static void drawWalkPath() { } if (pathStartPos != null) { - Rasterizer.drawCircle(pathStartPos.x, pathStartPos.y, 2, 0xE055DE); + ScreenController.gameRasterizer.drawCircle(pathStartPos.x, pathStartPos.y, 2, 0xE055DE); TypeFace.fontSmall.drawStringLeft(walkpathX[0] + "," + walkpathY[0], pathStartPos.x, pathStartPos.y + 1, 0); TypeFace.fontSmall.drawStringLeft(walkpathX[0] + "," + walkpathY[0], pathStartPos.x, pathStartPos.y, 0x00AAFF); } if (pathFinishPos != null) { - Rasterizer.drawCircle(pathFinishPos.x, pathFinishPos.y, 4, 0xE055DE); + ScreenController.gameRasterizer.drawCircle(pathFinishPos.x, pathFinishPos.y, 4, 0xE055DE); TypeFace.fontSmall.drawStringLeft(walkpathX[walkpathX.length - 1] + "," + walkpathY[walkpathY.length - 1], pathFinishPos.x, pathFinishPos.y + 1, 0); TypeFace.fontSmall.drawStringLeft(walkpathX[walkpathX.length - 1] + "," + walkpathY[walkpathY.length - 1], pathFinishPos.x, pathFinishPos.y, 0x00AAFF); } @@ -96,40 +96,40 @@ public static void drawClipping() { if ((data & 0x2) == 0x2) { // north if (posNE != null && posNW != null) { - Rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); } } if ((data & 0x8) == 0x8) { // east if (posSE != null && posNE != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); } } if ((data & 0x20) == 0x20) { // south if (posSE != null && posSW != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); } } if ((data & 0x80) == 0x80) { // west if (posSW != null && posNW != null) { - Rasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); } } if ((data & 0x100) == 0x100) { // total block if (posNE != null && posNW != null) { - Rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); } if (posSE != null && posNE != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); } if (posSE != null && posSW != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); } if (posSW != null && posNW != null) { - Rasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); } } @@ -138,79 +138,79 @@ public static void drawClipping() { if ((data & 0x400) == 0x400) { // north (projectile) if (posNEA != null && posNWA != null) { - Rasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posNE != null) { - Rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } if (posNW != null) { - Rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } } if ((data & 0x1000) == 0x1000) { // east (projectile) if (posSEA != null && posNEA != null) { - Rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); } } if ((data & 0x4000) == 0x4000) { // south (projectile) if (posSEA != null && posSWA != null) { - Rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); } } if ((data & 0x10000) == 0x10000) { // west (projectile) if (posSWA != null && posNWA != null) { - Rasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); } } if ((data & 0x20000) == 0x20000) { // total block (projectile) if (posNEA != null && posNWA != null) { - Rasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posNE != null) { - Rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } if (posNW != null) { - Rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } if (posSEA != null && posNEA != null) { - Rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); if (posSE != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); } if (posNE != null) { - Rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } } if (posSEA != null && posSWA != null) { - Rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); if (posSE != null) { - Rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); } if (posSW != null) { - Rasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); } } if (posSWA != null && posNWA != null) { - Rasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posSW != null) { - Rasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); } if (posNW != null) { - Rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } } From b47b6e6db07b2b6e782b6749b9334fd5718d3dab Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 16:54:40 +0100 Subject: [PATCH 15/45] refactor: pass RasterizerInstanced to FrameRenderer --- .../org/runejs/client/frame/FixedFrameRenderer.java | 6 ++++++ .../java/org/runejs/client/frame/FrameRenderer.java | 3 +++ .../runejs/client/frame/ResizableFrameRenderer.java | 11 ++++++++++- .../org/runejs/client/frame/ScreenController.java | 8 ++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java b/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java index a99480861..0fce74b82 100644 --- a/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/FixedFrameRenderer.java @@ -1,6 +1,7 @@ package org.runejs.client.frame; import org.runejs.client.frame.tab.TabProducer; +import org.runejs.client.media.RasterizerInstanced; public class FixedFrameRenderer implements FrameRenderer { public final TabProducer tabProducer = new TabProducer(); @@ -58,6 +59,11 @@ public void draw(int mouseX, int mouseY, boolean debugView) { } + @Override + public void setRasterizer(RasterizerInstanced rasterizer) { + + } + @Override public void stop() { diff --git a/src/main/java/org/runejs/client/frame/FrameRenderer.java b/src/main/java/org/runejs/client/frame/FrameRenderer.java index 104de22e5..465d86d61 100644 --- a/src/main/java/org/runejs/client/frame/FrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/FrameRenderer.java @@ -1,6 +1,7 @@ package org.runejs.client.frame; import org.runejs.client.frame.tab.TabProducer; +import org.runejs.client.media.RasterizerInstanced; public interface FrameRenderer extends Runnable { void setDrawSize(int drawWidth, int drawHeight); @@ -14,6 +15,8 @@ public interface FrameRenderer extends Runnable { TabProducer getTabProducer(); + void setRasterizer(RasterizerInstanced rasterizer); + void draw(int mouseX, int mouseY, boolean debugView); void stop(); } diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index e613c9512..c9f6e372d 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -4,6 +4,7 @@ import org.runejs.client.MovedStatics; import org.runejs.client.frame.tab.TabProducer; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; public class ResizableFrameRenderer implements FrameRenderer { public final MinimapRenderer minimap = new MinimapRenderer(); @@ -17,10 +18,13 @@ public class ResizableFrameRenderer implements FrameRenderer { private boolean canDraw; private boolean shouldStop = false; + private RasterizerInstanced gameRasterizer; - public ResizableFrameRenderer() { + public ResizableFrameRenderer(RasterizerInstanced gameRasterizer) { drawingThread = new Thread(this); drawingThread.start(); + + this.gameRasterizer = gameRasterizer; } @Override @@ -141,6 +145,11 @@ public TabProducer getTabProducer() { return tabProducer; } + @Override + public void setRasterizer(RasterizerInstanced rasterizer) { + this.gameRasterizer = rasterizer; + } + public void draw(int mouseX, int mouseY, boolean debugView) { canDraw = true; diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index d565260cb..85de2146a 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -36,6 +36,10 @@ public static void createGameRasterizer(Component component) { ); gameRasterizer = new RasterizerInstanced(gameScreenImageProducer); + + if (renderer != null) { + renderer.setRasterizer(gameRasterizer); + } } public static void frameMode(ScreenMode screenMode) { @@ -61,12 +65,12 @@ public static void frameMode(ScreenMode screenMode) { GameShell.clientFrame.setPreferredSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); GameShell.clientFrame.setMinimumSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); - renderer = new ResizableFrameRenderer(); + renderer = new ResizableFrameRenderer(gameRasterizer); } else if (screenMode == ScreenMode.FULLSCREEN) { frameWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); frameHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); - renderer = new ResizableFrameRenderer(); + renderer = new ResizableFrameRenderer(gameRasterizer); } GameShell.clientFrame.setSize(ScreenController.frameWidth, ScreenController.frameHeight); Dimension innerSize = getInnerSize(GameShell.clientFrame); From ac8245a4114888b7012173aa209a0ab85d6fe9bb Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 16:54:52 +0100 Subject: [PATCH 16/45] refactor: convert resizable debug view to instanced rasterizer --- .../client/frame/ResizableFrameRenderer.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index c9f6e372d..d904bed20 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -67,39 +67,39 @@ private void drawDebugView(int mX, int mY) { int[] tabInterFaceTop = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); int[] tabInterFaceBottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); if (isCoordinatesIn3dScreen(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); + gameRasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); } if (isCoordinatesInExtendedTabArea(mX, mY) && !isCoordinatesInTabArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); - Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); - Rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); } if (isCoordinatesInTabArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); } if (isCoordinatesInExtendedChatArea(mX, mY) && !isCoordinatesInChatArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); } if (isCoordinatesInChatArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); } if (isCoordinatesInMinimapArea(mX, mY)) { - Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); + gameRasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); } else { - Rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); + gameRasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); } - Rasterizer.drawFilledRectangle(mX - 4, mY - 4, 4, 4, 0xFF0000); + gameRasterizer.drawFilledRectangle(mX - 4, mY - 4, 4, 4, 0xFF0000); } public boolean isCoordinatesInChatArea(int x, int y) { From b5903000fc0e439f3d79d2397345a93095ae0901 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 17:22:23 +0100 Subject: [PATCH 17/45] refactor: use rasterizer directly, move methods out of FramePieceRenderer --- .../runejs/client/frame/ChatBoxRenderer.java | 12 -- .../client/frame/FramePieceRenderer.java | 126 ++---------------- .../runejs/client/frame/MinimapRenderer.java | 113 +++++++++++++--- .../runejs/client/frame/tab/TabProducer.java | 75 +++++------ .../client/media/RasterizerInstanced.java | 38 +++++- 5 files changed, 174 insertions(+), 190 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java b/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java index 8fde5674d..f6769e86d 100644 --- a/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java +++ b/src/main/java/org/runejs/client/frame/ChatBoxRenderer.java @@ -1,16 +1,11 @@ package org.runejs.client.frame; -import org.runejs.client.Game; import org.runejs.client.MovedStatics; -import org.runejs.client.ProducingGraphicsBuffer; -import org.runejs.client.media.RasterizerInstanced; /** * Renders the chat box. */ public class ChatBoxRenderer extends FramePieceRenderer { - private final ProducingGraphicsBuffer graphics; - public ChatBoxRenderer() { super( new FramePieceAnchor( @@ -21,13 +16,6 @@ public ChatBoxRenderer() { 516, 184 ); - - graphics = MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas); - rasterizerInstanced = new RasterizerInstanced(graphics); - } - - public ProducingGraphicsBuffer getDrawable() { - return graphics; } public void render() { diff --git a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java index d3a821c47..6f378b64a 100644 --- a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java +++ b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java @@ -1,12 +1,13 @@ package org.runejs.client.frame; +import org.runejs.client.Game; +import org.runejs.client.MovedStatics; import org.runejs.client.ProducingGraphicsBuffer; -import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; public abstract class FramePieceRenderer { - public RasterizerInstanced rasterizerInstanced; + protected RasterizerInstanced rasterizerInstanced; public final FramePieceAnchor anchor; public final int width; @@ -16,9 +17,11 @@ public FramePieceRenderer(FramePieceAnchor anchor, int width, int height) { this.anchor = anchor; this.width = width; this.height = height; - } - public abstract ProducingGraphicsBuffer getDrawable(); + // TODO inject this, sometimes needs to be GameShell.game or something + ProducingGraphicsBuffer graphics = MovedStatics.createGraphicsBuffer(width, height, Game.gameCanvas); + this.rasterizerInstanced = new RasterizerInstanced(graphics); + } /** * Draws the piece to the game screen. @@ -29,14 +32,12 @@ public FramePieceRenderer(FramePieceAnchor anchor, int width, int height) { * TODO (jkm) refactor this to not use static `Rasterizer`. */ public void draw(int drawWidth, int drawHeight) { - int[] position = this.anchor.getPosition(drawWidth, drawHeight, this.width, this.height); - - ProducingGraphicsBuffer drawable = getDrawable(); + int[] position = this.anchor.getPosition(drawWidth, drawHeight, width, height); int x = position[0]; int y = position[1]; - Rasterizer.copyPixels(drawable.pixels, drawable.width, drawable.height, x, y); + Rasterizer.copyPixels(rasterizerInstanced.destinationPixels, width, height, x, y); } /** @@ -68,113 +69,4 @@ protected void copyProducer(ProducingGraphicsBuffer producer, int x, int y) { protected void copyProducerCutOff(ProducingGraphicsBuffer producer, int x, int y, int width, int height, int offsetX, int offsetY) { rasterizerInstanced.copyPixelsCutOff(producer.pixels, producer.width, producer.height, x, y, width, height, offsetX, offsetY); } - - public void shapeImageToPixels(ImageRGB image, int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { - try { - int centerX = -width / 2; - int centerY = -height / 2; - int sine = (int) (Math.sin((double) k1 / 326.11) * 65536.0); - int cosine = (int) (Math.cos((double) k1 / 326.11) * 65536.0); - sine = sine * zoom >> 8; - cosine = cosine * zoom >> 8; - int i_125_ = (arg4 << 16) + centerY * sine + centerX * cosine; - int i_126_ = (arg5 << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * rasterizerInstanced.destinationWidth; - - for(y = 0; y < height; y++) { - int i_128_ = arg8[y]; - int i_129_ = destinationOffset + i_128_; - int i_130_ = i_125_ + cosine * i_128_; - int i_131_ = i_126_ - sine * i_128_; - for(x = -arg9[y]; x < 0; x++) { - int pixelToGet = (i_130_ >> 16) + (i_131_ >> 16) * image.imageWidth; - int colour = 0; - if(!(image.pixels.length < pixelToGet || pixelToGet < 0)){ - colour = image.pixels[pixelToGet]; - } - rasterizerInstanced.destinationPixels[i_129_++] = colour; - i_130_ += cosine; - i_131_ -= sine; - } - i_125_ += sine; - i_126_ += cosine; - destinationOffset += rasterizerInstanced.destinationWidth; - } - } catch(Exception exception) { - /* empty */ - exception.printStackTrace(); - } - } - - public void drawImage(ImageRGB image, int x, int y) { - x += image.offsetX; - y += image.offsetY; - int dest_offset = x + y * rasterizerInstanced.destinationWidth; - int source_offset = 0; - int line_count = image.imageHeight; - int line_width = image.imageWidth; - int line_offset_dest = rasterizerInstanced.destinationWidth - line_width; - int line_offset_source = 0; - if(y < rasterizerInstanced.viewportTop) { - int clip_height = rasterizerInstanced.viewportTop - y; - line_count -= clip_height; - y = rasterizerInstanced.viewportTop; - source_offset += clip_height * line_width; - dest_offset += clip_height * rasterizerInstanced.destinationWidth; - } - if(y + line_count > rasterizerInstanced.viewportBottom) - line_count -= y + line_count - rasterizerInstanced.viewportBottom; - if(x < rasterizerInstanced.viewportLeft) { - int clip_width = rasterizerInstanced.viewportLeft - x; - line_width -= clip_width; - x = rasterizerInstanced.viewportLeft; - source_offset += clip_width; - dest_offset += clip_width; - line_offset_source += clip_width; - line_offset_dest += clip_width; - } - if(x + line_width > rasterizerInstanced.viewportRight) { - int clip_width = x + line_width - rasterizerInstanced.viewportRight; - line_width -= clip_width; - line_offset_source += clip_width; - line_offset_dest += clip_width; - } - if(line_width > 0 && line_count > 0) - ImageRGB.blockCopyTrans(rasterizerInstanced.destinationPixels, image.pixels, 0, source_offset, dest_offset, line_width, line_count, line_offset_dest, line_offset_source); - } - - public void drawRotated(ImageRGB image, int x, int y, int pivotX, int pivotY, int width, int height, int zoom, double angle) { - try { - int centerX = -width / 2; - int centerY = -height / 2; - int sine = (int) (Math.sin(angle) * 65536.0); - int cosine = (int) (Math.cos(angle) * 65536.0); - sine = sine * zoom >> 8; - cosine = cosine * zoom >> 8; - int sourceOffsetX = (pivotX << 16) + centerY * sine + centerX * cosine; - int sourceoffsetY = (pivotY << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * rasterizerInstanced.destinationWidth; - for(y = 0; y < height; y++) { - int i = destinationOffset; - int offsetX = sourceOffsetX; - int offsetY = sourceoffsetY; - for(x = -width; x < 0; x++) { - int i_166_ = image.pixels[(offsetX >> 16) + (offsetY >> 16) * image.imageWidth]; - if(i_166_ != 0) - rasterizerInstanced.destinationPixels[i++] = i_166_; - else - i++; - offsetX += cosine; - offsetY -= sine; - } - sourceOffsetX += sine; - sourceoffsetY += cosine; - destinationOffset += rasterizerInstanced.destinationWidth; - } - } catch(Exception exception) { - /* empty */ - exception.printStackTrace(); - } - - } } diff --git a/src/main/java/org/runejs/client/frame/MinimapRenderer.java b/src/main/java/org/runejs/client/frame/MinimapRenderer.java index bc67b94a2..36f09bb94 100644 --- a/src/main/java/org/runejs/client/frame/MinimapRenderer.java +++ b/src/main/java/org/runejs/client/frame/MinimapRenderer.java @@ -3,7 +3,6 @@ import org.runejs.client.Game; import org.runejs.client.LinkedList; import org.runejs.client.MovedStatics; -import org.runejs.client.ProducingGraphicsBuffer; import org.runejs.client.cache.def.ActorDefinition; import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.media.RasterizerInstanced; @@ -19,12 +18,16 @@ public class MinimapRenderer extends FramePieceRenderer { public static int[] resizableMinimapOffsets1; public static int[] resizableMinimapOffsets2; - public static ProducingGraphicsBuffer resizableMiniMapimage; public int[] resizableCompasOffsets1; public int[] resizableCompasOffsets2; - public ProducingGraphicsBuffer tempResizableMiniMapimage; public static int[] resizableMinimapLineOffsets; + /** + * To avoid flickering, we draw to a temporary rasterizer first, + * then flush this to the output rasterizer at once, in its entirety. + */ + private RasterizerInstanced tempRasterizer; + public MinimapRenderer() { super( new FramePieceAnchor( @@ -36,7 +39,6 @@ public MinimapRenderer() { 210 ); - this.tempResizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); resizableMinimapOffsets1 = new int[200]; resizableMinimapOffsets2 = new int[200]; for(int i = 0; i < resizableMinimapOffsets2.length; i++) { @@ -44,13 +46,9 @@ public MinimapRenderer() { resizableMinimapOffsets2[i] = 0; } - resizableMiniMapimage = MovedStatics.createGraphicsBuffer(210, 210, Game.gameCanvas); - - rasterizerInstanced = new RasterizerInstanced(tempResizableMiniMapimage); - } - - public ProducingGraphicsBuffer getDrawable() { - return resizableMiniMapimage; + tempRasterizer = new RasterizerInstanced( + MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas) + ); } public void RenderResizableMiniMapArea(int x, int y) { @@ -83,26 +81,65 @@ public void RenderResizableMiniMapArea(int x, int y) { shapeImageToPixels(Minimap.minimapImage,5, 5, 200, 200, i, i_8_, i_9_, minimapZoom + 256, resizableMinimapOffsets2, resizableMinimapOffsets1); drawResizableMinimapDots(); - rasterizerInstanced.drawFilledRectangle(105, 105, 3, 3, 16777215); - rasterizerInstanced.drawFilledRectangle(0, 0, 210, 5, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 205, 210, 5, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 5, 210, 0x242017); - rasterizerInstanced.drawFilledRectangle(205, 0, 5, 210, 0x242017); + tempRasterizer.drawFilledRectangle(105, 105, 3, 3, 16777215); + tempRasterizer.drawFilledRectangle(0, 0, 210, 5, 0x242017); + tempRasterizer.drawFilledRectangle(0, 205, 210, 5, 0x242017); + tempRasterizer.drawFilledRectangle(0, 0, 5, 210, 0x242017); + tempRasterizer.drawFilledRectangle(205, 0, 5, 210, 0x242017); // Rasterizer.drawFilledRectangle(x-43,y, 43, 43, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 20, 42, 0x242017); - rasterizerInstanced.drawFilledRectangle(0, 0, 42, 20, 0x242017); + tempRasterizer.drawFilledRectangle(0, 0, 20, 42, 0x242017); + tempRasterizer.drawFilledRectangle(0, 0, 42, 20, 0x242017); - rasterizerInstanced.drawCircle(21, 21, 20, 0x242017); + tempRasterizer.drawCircle(21, 21, 20, 0x242017); shapeImageToPixels(Minimap.minimapCompass, 5, 5, 33, 33, 25, 25, Game.getMinimapRotation(), 256, resizableCompasOffsets2, resizableCompasOffsets1); - System.arraycopy(tempResizableMiniMapimage.pixels, 0, resizableMiniMapimage.pixels,0, resizableMiniMapimage.pixels.length); + System.arraycopy(tempRasterizer.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); // Class65.method1018(); // ScreenController.drawFramePiece(resizableMiniMapimage, x, y); } + + + private void shapeImageToPixels(ImageRGB image, int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { + try { + int centerX = -width / 2; + int centerY = -height / 2; + int sine = (int) (Math.sin((double) k1 / 326.11) * 65536.0); + int cosine = (int) (Math.cos((double) k1 / 326.11) * 65536.0); + sine = sine * zoom >> 8; + cosine = cosine * zoom >> 8; + int i_125_ = (arg4 << 16) + centerY * sine + centerX * cosine; + int i_126_ = (arg5 << 16) + centerY * cosine - centerX * sine; + int destinationOffset = x + y * tempRasterizer.destinationWidth; + + for(y = 0; y < height; y++) { + int i_128_ = arg8[y]; + int i_129_ = destinationOffset + i_128_; + int i_130_ = i_125_ + cosine * i_128_; + int i_131_ = i_126_ - sine * i_128_; + for(x = -arg9[y]; x < 0; x++) { + int pixelToGet = (i_130_ >> 16) + (i_131_ >> 16) * image.imageWidth; + int colour = 0; + if(!(image.pixels.length < pixelToGet || pixelToGet < 0)){ + colour = image.pixels[pixelToGet]; + } + tempRasterizer.destinationPixels[i_129_++] = colour; + i_130_ += cosine; + i_131_ -= sine; + } + i_125_ += sine; + i_126_ += cosine; + destinationOffset += tempRasterizer.destinationWidth; + } + } catch(Exception exception) { + /* empty */ + exception.printStackTrace(); + } + } + private void drawResizableMinimapDots() { for(int i = 0; Minimap.minimapHintCount > i; i++) { int hintX = 2 + 4 * Minimap.minimapHintX[i] + -(Player.localPlayer.worldX / 32); @@ -196,7 +233,7 @@ public void drawOnResizableMinimap(int x, int y, ImageRGB sprite) { cosine = cosine * 256 / (zoom + 256); int i_3_ = cosine * x + y * sine >> 16; int i_4_ = -(x * sine) + cosine * y >> 16; - drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); + tempRasterizer.drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); } public void drawMinimapMark(ImageRGB sprite, int mapX, int mapY) { @@ -219,4 +256,38 @@ public void drawMinimapMark(ImageRGB sprite, int mapX, int mapY) { drawOnResizableMinimap(mapY, mapX, sprite); } } + + private void drawRotated(ImageRGB image, int x, int y, int pivotX, int pivotY, int width, int height, int zoom, double angle) { + try { + int centerX = -width / 2; + int centerY = -height / 2; + int sine = (int) (Math.sin(angle) * 65536.0); + int cosine = (int) (Math.cos(angle) * 65536.0); + sine = sine * zoom >> 8; + cosine = cosine * zoom >> 8; + int sourceOffsetX = (pivotX << 16) + centerY * sine + centerX * cosine; + int sourceoffsetY = (pivotY << 16) + centerY * cosine - centerX * sine; + int destinationOffset = x + y * tempRasterizer.destinationWidth; + for(y = 0; y < height; y++) { + int i = destinationOffset; + int offsetX = sourceOffsetX; + int offsetY = sourceoffsetY; + for(x = -width; x < 0; x++) { + int i_166_ = image.pixels[(offsetX >> 16) + (offsetY >> 16) * image.imageWidth]; + if(i_166_ != 0) + tempRasterizer.destinationPixels[i++] = i_166_; + else + i++; + offsetX += cosine; + offsetY -= sine; + } + sourceOffsetX += sine; + sourceoffsetY += cosine; + destinationOffset += tempRasterizer.destinationWidth; + } + } catch(Exception exception) { + /* empty */ + exception.printStackTrace(); + } + } } diff --git a/src/main/java/org/runejs/client/frame/tab/TabProducer.java b/src/main/java/org/runejs/client/frame/tab/TabProducer.java index 3c4a0d34a..04e531ab8 100644 --- a/src/main/java/org/runejs/client/frame/tab/TabProducer.java +++ b/src/main/java/org/runejs/client/frame/tab/TabProducer.java @@ -12,8 +12,6 @@ // TODO: DONT RUN NORMAL TAB RENDERER WHEN THIS IS RUNNING public class TabProducer extends FramePieceRenderer { - private static ProducingGraphicsBuffer resizableSideBarImage; - private ProducingGraphicsBuffer tempResizableSideBar; private ImageRGB edgeLeft; private ImageRGB edgeRight; private ImageRGB combat; @@ -42,6 +40,12 @@ public class TabProducer extends FramePieceRenderer { private static int workingWidth = 232; private static int workingHeight = 334; + /** + * To avoid flickering, we draw to a temporary rasterizer first, + * then flush this to the output rasterizer at once, in its entirety. + */ + private RasterizerInstanced tempRasterizer; + public TabProducer() { super( @@ -54,10 +58,10 @@ public TabProducer() { 334 ); - this.tempResizableSideBar = MovedStatics.createGraphicsBuffer(241, 334, Game.gameCanvas); - resizableSideBarImage = MovedStatics.createGraphicsBuffer(241, 334, Game.gameCanvas); - rasterizerInstanced = new RasterizerInstanced(this.tempResizableSideBar); - rasterizerInstanced.drawFilledRectangle(0, 0, 241, 334, Integer.MAX_VALUE); + tempRasterizer = new RasterizerInstanced( + MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas) + ); + tempRasterizer.drawFilledRectangle(0, 0, 241, 334, Integer.MAX_VALUE); } private void drawActiveTab(int currentTabId, int currentY) { @@ -109,7 +113,7 @@ private void drawActiveTab(int currentTabId, int currentY) { x = 202; break; } - drawImage(part, x,currentY); + tempRasterizer.drawImage(part, x,currentY); } public int[] getTabButtonStartCoords(int tabButtonIndex) { @@ -163,12 +167,6 @@ public int[] getTabButtonBox(int tabButtonIndex) { return new int[] {start[0],start[1], end[0], start[1]+ topbar[3]}; } - - - public ProducingGraphicsBuffer getDrawable() { - return resizableSideBarImage; - } - public int[] getTabInterfaceCoordSize(int baseX, int baseY) { if(MovedStatics.tabImageProducer == null) { return new int[]{0,0,0,0}; @@ -208,14 +206,14 @@ private void drawMiddlePiece(int baseX, int baseY, int width, int height) { if(MovedStatics.tabImageProducer == null) { return; } - rasterizerInstanced.copyPixels( + tempRasterizer.copyPixels( MovedStatics.tabImageProducer.pixels, MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, baseX + width / 2 - MovedStatics.tabImageProducer.width / 2, baseY + height / 2 - MovedStatics.tabImageProducer.height / 2); - drawImage(edgeLeft, baseX, baseY + height / 2 - edgeLeft.imageHeight / 2); - drawImage(edgeRight, baseX + width - edgeRight.imageWidth, baseY + height / 2 - edgeRight.imageHeight / 2); + tempRasterizer.drawImage(edgeLeft, baseX, baseY + height / 2 - edgeLeft.imageHeight / 2); + tempRasterizer.drawImage(edgeRight, baseX + width - edgeRight.imageWidth, baseY + height / 2 - edgeRight.imageHeight / 2); } public void RenderResizableSideBarArea() { @@ -249,24 +247,23 @@ public void RenderResizableSideBarArea() { int y = 0; - drawImage(background, x + 24, y + 20); - drawImage(background, x + 24 + background.imageWidth, y + 20); - drawImage(background, x + 24 + background.imageWidth + 20, y + 20); + tempRasterizer.drawImage(background, x + 24, y + 20); + tempRasterizer.drawImage(background, x + 24 + background.imageWidth, y + 20); + tempRasterizer.drawImage(background, x + 24 + background.imageWidth + 20, y + 20); - drawImage(background, x + 24, y + workingHeight - background.imageHeight - 20); - drawImage(background, x + 24 + background.imageWidth, y + workingHeight - background.imageHeight - 20); - drawImage(background, x + 24 + background.imageWidth + 20, y + workingHeight - background.imageHeight - 20); + tempRasterizer.drawImage(background, x + 24, y + workingHeight - background.imageHeight - 20); + tempRasterizer.drawImage(background, x + 24 + background.imageWidth, y + workingHeight - background.imageHeight - 20); + tempRasterizer.drawImage(background, x + 24 + background.imageWidth + 20, y + workingHeight - background.imageHeight - 20); drawMiddlePiece(x, y, workingWidth, workingHeight); drawTopRow(x, y, workingWidth, workingHeight); drawBottomRow(x, y, workingWidth, workingHeight); - System.arraycopy(tempResizableSideBar.pixels, 0, resizableSideBarImage.pixels, 0, resizableSideBarImage.pixels.length); - + System.arraycopy(tempRasterizer.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); } private void drawBottomRow(int x, int y, int workingWidth, int workingHeight) { - drawImage(bottomRow, x - 4, y + workingHeight - bottomRow.imageHeight); + tempRasterizer.drawImage(bottomRow, x - 4, y + workingHeight - bottomRow.imageHeight); int currentX = x; int currentY = y + workingHeight - bottomRow.imageHeight; if (6 < Game.currentTabId) { @@ -274,40 +271,40 @@ private void drawBottomRow(int x, int y, int workingWidth, int workingHeight) { } currentX += combat.imageWidth; - drawImage(friends, currentX, currentY); + tempRasterizer.drawImage(friends, currentX, currentY); currentX += combat.imageWidth; - drawImage(ignores, currentX, currentY); + tempRasterizer.drawImage(ignores, currentX, currentY); currentX += combat.imageWidth; - drawImage(logout, currentX, currentY); + tempRasterizer.drawImage(logout, currentX, currentY); currentX += combat.imageWidth; - drawImage(options, currentX, currentY); + tempRasterizer.drawImage(options, currentX, currentY); currentX += combat.imageWidth; - drawImage(emotes, currentX, currentY); + tempRasterizer.drawImage(emotes, currentX, currentY); currentX += combat.imageWidth; - drawImage(music, currentX, currentY); + tempRasterizer.drawImage(music, currentX, currentY); } private void drawTopRow(int x, int y, int workingWidth, int workingHeight) { - drawImage(topRow, x - 4, y); + tempRasterizer.drawImage(topRow, x - 4, y); if (Game.currentTabId < 7) { this.drawActiveTab(Game.currentTabId, y); } int currentX = x; - drawImage(combat, currentX, y); + tempRasterizer.drawImage(combat, currentX, y); currentX += stats.imageWidth; - drawImage(stats, currentX, y); + tempRasterizer.drawImage(stats, currentX, y); currentX += stats.imageWidth; - drawImage(quests, currentX, y); + tempRasterizer.drawImage(quests, currentX, y); currentX += stats.imageWidth; - drawImage(inventory, currentX, y); + tempRasterizer.drawImage(inventory, currentX, y); currentX += stats.imageWidth; - drawImage(equipment, currentX, y); + tempRasterizer.drawImage(equipment, currentX, y); currentX += stats.imageWidth; - drawImage(prayer, currentX, y); + tempRasterizer.drawImage(prayer, currentX, y); currentX += stats.imageWidth; - drawImage(magic, currentX, y); + tempRasterizer.drawImage(magic, currentX, y); } private static void RenderCustomTabArea(int baseX, int baseY) { diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index 19752ab0b..313a2bba1 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -1,6 +1,7 @@ package org.runejs.client.media; import org.runejs.client.ProducingGraphicsBuffer; +import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.node.CachedNode; import org.runejs.client.media.renderable.Model; @@ -579,5 +580,40 @@ public void drawVerticalLine(int x, int y, int length, int colour) { destinationPixels[pixelOffset + pixel * destinationWidth] = colour; } - + public void drawImage(ImageRGB image, int x, int y) { + x += image.offsetX; + y += image.offsetY; + int dest_offset = x + y * this.destinationWidth; + int source_offset = 0; + int line_count = image.imageHeight; + int line_width = image.imageWidth; + int line_offset_dest = this.destinationWidth - line_width; + int line_offset_source = 0; + if(y < this.viewportTop) { + int clip_height = this.viewportTop - y; + line_count -= clip_height; + y = this.viewportTop; + source_offset += clip_height * line_width; + dest_offset += clip_height * this.destinationWidth; + } + if(y + line_count > this.viewportBottom) + line_count -= y + line_count - this.viewportBottom; + if(x < this.viewportLeft) { + int clip_width = this.viewportLeft - x; + line_width -= clip_width; + x = this.viewportLeft; + source_offset += clip_width; + dest_offset += clip_width; + line_offset_source += clip_width; + line_offset_dest += clip_width; + } + if(x + line_width > this.viewportRight) { + int clip_width = x + line_width - this.viewportRight; + line_width -= clip_width; + line_offset_source += clip_width; + line_offset_dest += clip_width; + } + if(line_width > 0 && line_count > 0) + ImageRGB.blockCopyTrans(this.destinationPixels, image.pixels, 0, source_offset, dest_offset, line_width, line_count, line_offset_dest, line_offset_source); + } } From 996346c51ca8ce6627a7900c941d9d62e12f5b51 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 17:32:23 +0100 Subject: [PATCH 18/45] fix: add check for MAX_VALUE in RasterizerInstanced.copyPixels @Promises may know why this wasn't originally there.. --- .../org/runejs/client/media/RasterizerInstanced.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index 313a2bba1..09b9aa408 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -165,8 +165,14 @@ public void copyPixels(int[] pixels, int width, int height, int paintX, int pain int pixelOffset = this.destinationWidth - width; int pixel = paintX + paintY * this.destinationWidth; for(int heightCounter = -height; heightCounter < 0; heightCounter++) { - for(int widthCounter = -width; widthCounter < 0; widthCounter++) - destinationPixels[pixel++] = pixels[sourcePixel++]; + for(int widthCounter = -width; widthCounter < 0; widthCounter++) { + // (jkm) this check wasn't in the initial RasterizerInstanced implementation, not sure why ... + if(pixels[sourcePixel] != Integer.MAX_VALUE) { + destinationPixels[pixel] = pixels[sourcePixel]; + } + pixel++; + sourcePixel++; + } pixel += pixelOffset; } } From 9bb6811eb4bad0a7dae9342639ace2cae6b20767 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 17:32:44 +0100 Subject: [PATCH 19/45] refactor: draw to specified RasterizerInstanced --- .../java/org/runejs/client/frame/FramePieceRenderer.java | 7 ++----- .../org/runejs/client/frame/ResizableFrameRenderer.java | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java index 6f378b64a..425e002e4 100644 --- a/src/main/java/org/runejs/client/frame/FramePieceRenderer.java +++ b/src/main/java/org/runejs/client/frame/FramePieceRenderer.java @@ -3,7 +3,6 @@ import org.runejs.client.Game; import org.runejs.client.MovedStatics; import org.runejs.client.ProducingGraphicsBuffer; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; public abstract class FramePieceRenderer { @@ -28,16 +27,14 @@ public FramePieceRenderer(FramePieceAnchor anchor, int width, int height) { * * @param drawWidth The width of the window. * @param drawHeight The height of the window. - * - * TODO (jkm) refactor this to not use static `Rasterizer`. */ - public void draw(int drawWidth, int drawHeight) { + public void draw(RasterizerInstanced destination, int drawWidth, int drawHeight) { int[] position = this.anchor.getPosition(drawWidth, drawHeight, width, height); int x = position[0]; int y = position[1]; - Rasterizer.copyPixels(rasterizerInstanced.destinationPixels, width, height, x, y); + destination.copyPixels(rasterizerInstanced.destinationPixels, width, height, x, y); } /** diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index d904bed20..88f05f6af 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -49,9 +49,9 @@ public void setDrawSize(int drawWidth, int drawHeight) { } private void drawToScreen() { - minimap.draw(drawWidth, drawHeight); - tabProducer.draw(drawWidth, drawHeight); - chatbox.draw(drawWidth, drawHeight); + minimap.draw(this.gameRasterizer, drawWidth, drawHeight); + tabProducer.draw(this.gameRasterizer, drawWidth, drawHeight); + chatbox.draw(this.gameRasterizer, drawWidth, drawHeight); } /** From 15d7bf845d2367ca68235e7d4044f7eaacb43c92 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 17:59:25 +0100 Subject: [PATCH 20/45] refactor: rename createGameRasterizer to setDrawComponent --- .../java/org/runejs/client/MovedStatics.java | 10 ++-- .../org/runejs/client/frame/DebugTools.java | 59 +++++++++---------- .../runejs/client/frame/ScreenController.java | 19 +++--- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index f19f2108c..d92c08bed 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -1446,8 +1446,8 @@ private static void method344(int arg0) { tabTopBack = null; tabImageProducer = null; tabHighlightImageTopLeftEdge = null; - ScreenController.gameScreenImageProducer = null; - ScreenController.gameRasterizer = null; + ScreenController.drawComponent = null; + ScreenController.rasterizer = null; tabHighlightImageBottomRightEdge = null; ChatBox.chatBoxImageProducer = null; mapBackRight = null; @@ -1944,7 +1944,7 @@ public static void method763(Component arg0, CacheArchive arg2) { Minimap.minimapBackgroundImage.drawImage(0, 0); tabImageProducer = createGraphicsBuffer(190, 261, arg0); inventoryBackgroundImage.drawImage(0, 0); - ScreenController.createGameRasterizer(arg0); + ScreenController.setDrawComponent(arg0); Rasterizer.resetPixels(); chatModes = createGraphicsBuffer(496, 50, arg0); tabBottom = createGraphicsBuffer(269, 37, arg0); @@ -2955,7 +2955,7 @@ public static int method988(CacheArchive arg0, CacheArchive arg1) { } public static void method1018() { - ScreenController.gameScreenImageProducer.prepareRasterizer(); + ScreenController.drawComponent.prepareRasterizer(); fullScreenTextureArray = Rasterizer3D.setLineOffsets(fullScreenTextureArray); } @@ -3064,7 +3064,7 @@ else if(arg0) public static void drawGameScreenGraphics() { try { Graphics graphics = Game.gameCanvas.getGraphics(); - ScreenController.gameScreenImageProducer.drawGraphics(ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, graphics); + ScreenController.drawComponent.drawGraphics(ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, ScreenController.frameMode == ScreenMode.FIXED ? 4 : 0, graphics); } catch(Exception exception) { Game.gameCanvas.repaint(); } diff --git a/src/main/java/org/runejs/client/frame/DebugTools.java b/src/main/java/org/runejs/client/frame/DebugTools.java index 8f2eab0f1..3b9135140 100644 --- a/src/main/java/org/runejs/client/frame/DebugTools.java +++ b/src/main/java/org/runejs/client/frame/DebugTools.java @@ -3,7 +3,6 @@ import org.runejs.client.Landscape; import org.runejs.client.MovedStatics; import org.runejs.client.cache.media.TypeFace; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.renderable.actor.Player; import org.runejs.client.scene.Point2d; @@ -31,7 +30,7 @@ public static void drawWalkPath() { Point2d nextPos = MovedStatics.getProjectedScreenPosition(0, tileY * 128 + 64, tileX * 128 + 64); if (lastTilePos != null && nextPos != null) { - ScreenController.gameRasterizer.drawDiagonalLine(lastTilePos.x, lastTilePos.y, nextPos.x, nextPos.y, 0x00FFAC); + ScreenController.rasterizer.drawDiagonalLine(lastTilePos.x, lastTilePos.y, nextPos.x, nextPos.y, 0x00FFAC); } // handle final walkpath label separately to avoid clipping issues @@ -46,13 +45,13 @@ public static void drawWalkPath() { } if (pathStartPos != null) { - ScreenController.gameRasterizer.drawCircle(pathStartPos.x, pathStartPos.y, 2, 0xE055DE); + ScreenController.rasterizer.drawCircle(pathStartPos.x, pathStartPos.y, 2, 0xE055DE); TypeFace.fontSmall.drawStringLeft(walkpathX[0] + "," + walkpathY[0], pathStartPos.x, pathStartPos.y + 1, 0); TypeFace.fontSmall.drawStringLeft(walkpathX[0] + "," + walkpathY[0], pathStartPos.x, pathStartPos.y, 0x00AAFF); } if (pathFinishPos != null) { - ScreenController.gameRasterizer.drawCircle(pathFinishPos.x, pathFinishPos.y, 4, 0xE055DE); + ScreenController.rasterizer.drawCircle(pathFinishPos.x, pathFinishPos.y, 4, 0xE055DE); TypeFace.fontSmall.drawStringLeft(walkpathX[walkpathX.length - 1] + "," + walkpathY[walkpathY.length - 1], pathFinishPos.x, pathFinishPos.y + 1, 0); TypeFace.fontSmall.drawStringLeft(walkpathX[walkpathX.length - 1] + "," + walkpathY[walkpathY.length - 1], pathFinishPos.x, pathFinishPos.y, 0x00AAFF); } @@ -96,40 +95,40 @@ public static void drawClipping() { if ((data & 0x2) == 0x2) { // north if (posNE != null && posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); } } if ((data & 0x8) == 0x8) { // east if (posSE != null && posNE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); } } if ((data & 0x20) == 0x20) { // south if (posSE != null && posSW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); } } if ((data & 0x80) == 0x80) { // west if (posSW != null && posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); } } if ((data & 0x100) == 0x100) { // total block if (posNE != null && posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNW.x, posNW.y, blockWalkColor); } if (posSE != null && posNE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posNE.x, posNE.y, blockWalkColor); } if (posSE != null && posSW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSW.x, posSW.y, blockWalkColor); } if (posSW != null && posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); + ScreenController.rasterizer.drawDiagonalLine(posSW.x, posSW.y, posNW.x, posNW.y, blockWalkColor); } } @@ -138,79 +137,79 @@ public static void drawClipping() { if ((data & 0x400) == 0x400) { // north (projectile) if (posNEA != null && posNWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posNE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } if (posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } } if ((data & 0x1000) == 0x1000) { // east (projectile) if (posSEA != null && posNEA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); } } if ((data & 0x4000) == 0x4000) { // south (projectile) if (posSEA != null && posSWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); } } if ((data & 0x10000) == 0x10000) { // west (projectile) if (posSWA != null && posNWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); } } if ((data & 0x20000) == 0x20000) { // total block (projectile) if (posNEA != null && posNWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNEA.x, posNEA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posNE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } if (posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } if (posSEA != null && posNEA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posNEA.x, posNEA.y, blockProjectileColor); if (posSE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); } if (posNE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNE.x, posNE.y, posNEA.x, posNEA.y, blockProjectileColor); } } if (posSEA != null && posSWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSEA.x, posSEA.y, posSWA.x, posSWA.y, blockProjectileColor); if (posSE != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSE.x, posSE.y, posSEA.x, posSEA.y, blockProjectileColor); } if (posSW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); } } if (posSWA != null && posNWA != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSWA.x, posSWA.y, posNWA.x, posNWA.y, blockProjectileColor); if (posSW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posSW.x, posSW.y, posSWA.x, posSWA.y, blockProjectileColor); } if (posNW != null) { - ScreenController.gameRasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); + ScreenController.rasterizer.drawDiagonalLine(posNW.x, posNW.y, posNWA.x, posNWA.y, blockProjectileColor); } } } diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 85de2146a..dfa101661 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -22,23 +22,23 @@ public class ScreenController { public static int frameHeight = 540; public static int drawWidth = 765; public static int drawHeight = 540; - public static ProducingGraphicsBuffer gameScreenImageProducer; - public static RasterizerInstanced gameRasterizer; + public static ProducingGraphicsBuffer drawComponent; + public static RasterizerInstanced rasterizer; private static FrameRenderer renderer; public static boolean DebugView = false; - public static void createGameRasterizer(Component component) { - gameScreenImageProducer = MovedStatics.createGraphicsBuffer( + public static void setDrawComponent(Component component) { + drawComponent = MovedStatics.createGraphicsBuffer( ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight, component ); - gameRasterizer = new RasterizerInstanced(gameScreenImageProducer); + rasterizer = new RasterizerInstanced(drawComponent); if (renderer != null) { - renderer.setRasterizer(gameRasterizer); + renderer.setRasterizer(rasterizer); } } @@ -65,12 +65,12 @@ public static void frameMode(ScreenMode screenMode) { GameShell.clientFrame.setPreferredSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); GameShell.clientFrame.setMinimumSize(new Dimension(ScreenController.frameWidth, ScreenController.frameHeight)); - renderer = new ResizableFrameRenderer(gameRasterizer); + renderer = new ResizableFrameRenderer(rasterizer); } else if (screenMode == ScreenMode.FULLSCREEN) { frameWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); frameHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); - renderer = new ResizableFrameRenderer(gameRasterizer); + renderer = new ResizableFrameRenderer(rasterizer); } GameShell.clientFrame.setSize(ScreenController.frameWidth, ScreenController.frameHeight); Dimension innerSize = getInnerSize(GameShell.clientFrame); @@ -133,7 +133,8 @@ public static void setBounds() { Game.gameCanvas.setSize(ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight); if (Game.gameStatusCode <= 35 && Game.gameStatusCode >= 30) { - createGameRasterizer(GameShell.clientFrame); + // set to resizable mode + setDrawComponent(GameShell.clientFrame); } else { Game.gameCanvas.setSize(MovedStatics.width, MovedStatics.height); Game.gameCanvas.setVisible(true); From 6c1994945c61983a3508250bc6ed8ee73a9459a1 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 18:01:01 +0100 Subject: [PATCH 21/45] refactor: move genuine statics to top --- .../java/org/runejs/client/media/Rasterizer3D.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/media/Rasterizer3D.java b/src/main/java/org/runejs/client/media/Rasterizer3D.java index 6feae569b..630560de6 100644 --- a/src/main/java/org/runejs/client/media/Rasterizer3D.java +++ b/src/main/java/org/runejs/client/media/Rasterizer3D.java @@ -7,6 +7,13 @@ public class Rasterizer3D extends Rasterizer { * Some kind of colour information, Dane calls this "reciprocal16" */ public static int[] anIntArray2929 = new int[2048]; + public static int[] cosinetable = new int[2048]; + public static int[] sinetable = new int[2048]; + public static int[] shadowDecay = new int[512]; + public static boolean lowMemory = false; + + + public static int bottomY; public static int center_y; public static int[] hsl2rgb = new int[65536]; @@ -27,7 +34,6 @@ public class Rasterizer3D extends Rasterizer { public static int center_x; public static int[] lineOffsets; public static Interface3 interface3; - public static int[] shadowDecay = new int[512]; /** * y position/size info of some kind * @@ -40,15 +46,12 @@ public class Rasterizer3D extends Rasterizer { * TODO rename */ public static int anInt2942; - public static int[] sinetable = new int[2048]; /** * TODO (jkm) investigate and rename, don't think this is accurate */ public static boolean notTextured = true; public static int viewportRx; - public static int[] cosinetable = new int[2048]; public static boolean restrict_edges = false; - public static boolean lowMemory = false; private static boolean useLatestShadeLine = true; static { From c55029f48fbbe27ab4cb5d9e52cf8b8724dffbc8 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 18:40:04 +0100 Subject: [PATCH 22/45] refactor: create rasterizer on ScreenController immediately --- src/main/java/org/runejs/client/MovedStatics.java | 2 -- .../org/runejs/client/frame/ScreenController.java | 12 ++++++------ .../org/runejs/client/media/RasterizerInstanced.java | 4 ++++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index d92c08bed..2be015c3c 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -1446,8 +1446,6 @@ private static void method344(int arg0) { tabTopBack = null; tabImageProducer = null; tabHighlightImageTopLeftEdge = null; - ScreenController.drawComponent = null; - ScreenController.rasterizer = null; tabHighlightImageBottomRightEdge = null; ChatBox.chatBoxImageProducer = null; mapBackRight = null; diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index dfa101661..c090238bc 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -23,7 +23,11 @@ public class ScreenController { public static int drawWidth = 765; public static int drawHeight = 540; public static ProducingGraphicsBuffer drawComponent; - public static RasterizerInstanced rasterizer; + public static RasterizerInstanced rasterizer = new RasterizerInstanced( + null, + ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, + ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight + ); private static FrameRenderer renderer; public static boolean DebugView = false; @@ -35,11 +39,7 @@ public static void setDrawComponent(Component component) { component ); - rasterizer = new RasterizerInstanced(drawComponent); - - if (renderer != null) { - renderer.setRasterizer(rasterizer); - } + rasterizer.setGraphics(drawComponent); } public static void frameMode(ScreenMode screenMode) { diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index 09b9aa408..11e2aa3b7 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -30,6 +30,10 @@ public RasterizerInstanced(int[] pixels, int width, int height) { public RasterizerInstanced(ProducingGraphicsBuffer producingGraphicsBuffer) { + setGraphics(producingGraphicsBuffer); + } + + public void setGraphics(ProducingGraphicsBuffer producingGraphicsBuffer) { this.destinationPixels = producingGraphicsBuffer.pixels; this.destinationWidth = producingGraphicsBuffer.width; this.destinationHeight = producingGraphicsBuffer.height; From 8474afce1058a19c7f5055383c9ddb2be8c92e35 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 18:41:14 +0100 Subject: [PATCH 23/45] refactor: use instanced Rasteriser in Game --- src/main/java/org/runejs/client/Game.java | 47 +++++++++---------- .../client/media/RasterizerInstanced.java | 14 ++++++ 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index 19a332164..8a55084cb 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -13,7 +13,6 @@ import org.runejs.client.io.Buffer; import org.runejs.client.language.English; import org.runejs.client.language.Native; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.VertexNormal; import org.runejs.client.media.renderable.Model; @@ -192,7 +191,7 @@ public static boolean drawParentInterface(int areaId, int minX, int minY, int ma * @return The status of the drawing cycle, true for success and false for failure */ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, int maxY, int scrollPosition, int scrollWidth, GameInterface[] interfaceCollection, int parentId, boolean drawSuccess) { - Rasterizer.setBounds(minX, minY, maxX, maxY); + ScreenController.rasterizer.setBounds(minX, minY, maxX, maxY); boolean result = drawSuccess; for (int i = 0; interfaceCollection.length > i; i++) { @@ -225,7 +224,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in i_6_ = -gameInterface.originalWidth + gameInterface_3_.originalWidth; absoluteX = is[0] + i_6_; } - if (!gameInterface.isNewInterfaceFormat || Rasterizer.viewportRight >= absoluteX && Rasterizer.viewportBottom >= absoluteY && Rasterizer.viewportLeft <= absoluteX + gameInterface.originalWidth && absoluteY + gameInterface.originalHeight >= Rasterizer.viewportTop) { + if (!gameInterface.isNewInterfaceFormat || ScreenController.rasterizer.viewportRight >= absoluteX && ScreenController.rasterizer.viewportBottom >= absoluteY && ScreenController.rasterizer.viewportLeft <= absoluteX + gameInterface.originalWidth && absoluteY + gameInterface.originalHeight >= ScreenController.rasterizer.viewportTop) { if (gameInterface.type == GameInterfaceType.LAYER) { if (gameInterface.isHidden && !GameInterface.isHovering(areaId, i)) continue; @@ -238,7 +237,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in result &= drawInterface(areaId, absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.scrollPosition, gameInterface.scrollWidth, interfaceCollection, i, drawSuccess); if (gameInterface.children != null) result &= drawInterface(areaId, absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, absoluteY + gameInterface.originalHeight, gameInterface.scrollPosition, gameInterface.scrollWidth, gameInterface.children, gameInterface.id, true); - Rasterizer.setBounds(minX, minY, maxX, maxY); + ScreenController.rasterizer.setBounds(minX, minY, maxX, maxY); if (gameInterface.originalHeight < gameInterface.scrollHeight) GameInterface.drawScrollBar(absoluteX + gameInterface.originalWidth, absoluteY, gameInterface.originalHeight, gameInterface.scrollPosition, gameInterface.scrollHeight); } @@ -268,7 +267,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in int i_12_ = 0; int i_13_ = -1 + gameInterface.items[i_7_]; int i_14_ = 0; - if (-32 + Rasterizer.viewportLeft < i_10_ && Rasterizer.viewportRight > i_10_ && Rasterizer.viewportTop + -32 < i_11_ && Rasterizer.viewportBottom > i_11_ || GameInterface.activeInterfaceType != 0 && GameInterface.selectedInventorySlot == i_7_) { + if (-32 + ScreenController.rasterizer.viewportLeft < i_10_ && ScreenController.rasterizer.viewportRight > i_10_ && ScreenController.rasterizer.viewportTop + -32 < i_11_ && ScreenController.rasterizer.viewportBottom > i_11_ || GameInterface.activeInterfaceType != 0 && GameInterface.selectedInventorySlot == i_7_) { int i_15_ = 0; if (GameInterface.itemCurrentlySelected == 1 && i_7_ == GameInterface.itemSelectedContainerSlot && gameInterface.id == GameInterface.itemSelectedWidgetId) i_15_ = 16777215; @@ -290,8 +289,8 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in imageRGB.drawImageWithOpacity(i_12_ + i_10_, i_11_ + i_14_, 128); if (parentId != -1) { GameInterface gameInterface_16_ = interfaceCollection[parentId]; - if (Rasterizer.viewportTop > i_14_ + i_11_ && gameInterface_16_.scrollPosition > 0) { - int i_17_ = MovedStatics.anInt199 * (Rasterizer.viewportTop + -i_11_ - i_14_) / 3; + if (ScreenController.rasterizer.viewportTop > i_14_ + i_11_ && gameInterface_16_.scrollPosition > 0) { + int i_17_ = MovedStatics.anInt199 * (ScreenController.rasterizer.viewportTop + -i_11_ - i_14_) / 3; if (10 * MovedStatics.anInt199 < i_17_) i_17_ = 10 * MovedStatics.anInt199; if (gameInterface_16_.scrollPosition < i_17_) @@ -299,8 +298,8 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in gameInterface_16_.scrollPosition -= i_17_; MovedStatics.anInt2798 += i_17_; } - if (32 + i_11_ + i_14_ > Rasterizer.viewportBottom && -gameInterface_16_.originalHeight + gameInterface_16_.scrollHeight > gameInterface_16_.scrollPosition) { - int i_18_ = MovedStatics.anInt199 * (-Rasterizer.viewportBottom + 32 + i_11_ + i_14_) / 3; + if (32 + i_11_ + i_14_ > ScreenController.rasterizer.viewportBottom && -gameInterface_16_.originalHeight + gameInterface_16_.scrollHeight > gameInterface_16_.scrollPosition) { + int i_18_ = MovedStatics.anInt199 * (-ScreenController.rasterizer.viewportBottom + 32 + i_11_ + i_14_) / 3; if (MovedStatics.anInt199 * 10 < i_18_) i_18_ = 10 * MovedStatics.anInt199; if (-gameInterface_16_.scrollPosition + gameInterface_16_.scrollHeight + -gameInterface_16_.originalHeight < i_18_) @@ -337,13 +336,13 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in } if (opacity == 0) { if (!gameInterface.filled) - Rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); + ScreenController.rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); else - Rasterizer.drawFilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); + ScreenController.rasterizer.drawFilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); } else if (!gameInterface.filled) - Rasterizer.drawUnfilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); + ScreenController.rasterizer.drawUnfilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); else - Rasterizer.drawFilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); + ScreenController.rasterizer.drawFilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); } else if (gameInterface.type == GameInterfaceType.TEXT) { TypeFace font = gameInterface.getTypeFace(); if (font == null) { @@ -375,7 +374,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in textColor = gameInterface.textColor; text = English.pleaseWait; } - if (Rasterizer.destinationWidth == 479) { + if (ScreenController.rasterizer.destinationWidth == 479) { if (textColor == 16776960) textColor = 255; if (textColor == 49152) @@ -409,7 +408,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in if (gameInterface.tiled) { int[] viewportDimensions = new int[4]; - Rasterizer.getViewportDimensions(viewportDimensions); + ScreenController.rasterizer.getViewportDimensions(viewportDimensions); // Cap sprite to viewport dimensions int spriteTopX = absoluteX; @@ -425,7 +424,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in if (spriteBottomY > viewportDimensions[3]) spriteBottomY = viewportDimensions[3]; - Rasterizer.setBounds(spriteTopX, spriteTopY, spriteBottomX, spriteBottomY); + ScreenController.rasterizer.setBounds(spriteTopX, spriteTopY, spriteBottomX, spriteBottomY); int i_31_ = (gameInterface.originalWidth - (1 + -spriteWidth)) / spriteWidth; int i_32_ = (gameInterface.originalHeight - (1 + -spriteHeight)) / spriteHeight; for (int row = 0; i_31_ > row; row++) { @@ -439,7 +438,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in spriteRgb.drawImageWithTexture(spriteWidth / 2 + row * spriteWidth + absoluteX, spriteHeight / 2 + absoluteY + spriteHeight * col, gameInterface.textureId, 4096); } } - Rasterizer.setViewportDimensions(viewportDimensions); + ScreenController.rasterizer.setViewportDimensions(viewportDimensions); } else { int i_26_ = 4096 * gameInterface.originalWidth / spriteWidth; if (gameInterface.textureId == 0) { @@ -596,8 +595,8 @@ else if (gameInterface.xTextAlignment == 1) tooltipX = 5 + absoluteX; if (textWidth + tooltipX > maxX) tooltipX = -textWidth + maxX; - Rasterizer.drawFilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 16777120); - Rasterizer.drawUnfilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 0); + ScreenController.rasterizer.drawFilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 16777120); + ScreenController.rasterizer.drawUnfilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 0); text = gameInterface.disabledText; int tooltipTitleY = 2 + tooltipY + class40_sub5_sub14_sub1.characterDefaultHeight; text = ClientScriptRunner.method532(gameInterface, text); @@ -616,12 +615,12 @@ else if (gameInterface.xTextAlignment == 1) } } if (gameInterface.type == GameInterfaceType.LINE) - Rasterizer.drawDiagonalLine(absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.textColor); + ScreenController.rasterizer.drawDiagonalLine(absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.textColor); } // Draw debug information for non layer widgets and non tooltip widgets if (Configuration.DEBUG_WIDGETS && gameInterface.type != GameInterfaceType.LAYER && gameInterface.type != GameInterfaceType.IF1_TOOLTIP && MovedStatics.hoveredWidgetId == gameInterface.id) { - Rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, 0xffff00); + ScreenController.rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, 0xffff00); } } } @@ -849,7 +848,7 @@ public static void method353() { MouseHandler.gameScreenClickable = true; MouseHandler.cursorX = MouseHandler.mouseX - 4; Model.resourceCount = 0; - Rasterizer.resetPixels(); + ScreenController.rasterizer.resetPixels(); sceneRenderer.render(activeCamera, plane); currentScene.clearInteractiveObjectCache(); @@ -876,7 +875,7 @@ public static void method353() { } if(aBoolean519) { MovedStatics.method1018(); - Rasterizer.resetPixels(); + ScreenController.rasterizer.resetPixels(); MovedStatics.method940(English.loadingPleaseWait, false, null); } @@ -1099,7 +1098,7 @@ public static void method164() { MovedStatics.anInt199 = 0; MovedStatics.aProducingGraphicsBuffer_2213.prepareRasterizer(); Player.viewportOffsets = Rasterizer3D.setLineOffsets(Player.viewportOffsets); - Rasterizer.resetPixels(); + ScreenController.rasterizer.resetPixels(); drawParentInterface(0, 0, 0, 765, 503, GameInterface.fullscreenInterfaceId); if(GameInterface.fullscreenSiblingInterfaceId != -1) drawParentInterface(0, 0, 0, 765, 503, GameInterface.fullscreenSiblingInterfaceId); diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index 11e2aa3b7..bfea72def 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -40,6 +40,20 @@ public void setGraphics(ProducingGraphicsBuffer producingGraphicsBuffer) { setBounds(0, 0, producingGraphicsBuffer.height, producingGraphicsBuffer.width); } + public void getViewportDimensions(int[] arg0) { + arg0[0] = viewportLeft; + arg0[1] = viewportTop; + arg0[2] = viewportRight; + arg0[3] = viewportBottom; + } + + public void setViewportDimensions(int[] arg0) { + viewportLeft = arg0[0]; + viewportTop = arg0[1]; + viewportRight = arg0[2]; + viewportBottom = arg0[3]; + } + public void prepare(int[] pixels, int width, int height) { this.destinationPixels = pixels; this.destinationWidth = width; From d698a7b370301880718f3fa5baa7f202d2a31e36 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 19:58:55 +0100 Subject: [PATCH 24/45] refactor: rename LoginScreen --- src/main/java/org/runejs/client/Game.java | 64 +++++++++---------- .../client/{Class60.java => LoginScreen.java} | 4 +- .../java/org/runejs/client/MovedStatics.java | 46 ++++++------- 3 files changed, 57 insertions(+), 57 deletions(-) rename src/main/java/org/runejs/client/{Class60.java => LoginScreen.java} (99%) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index 8a55084cb..9c57dc2ed 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -1036,57 +1036,57 @@ public static void drawGameScreen() { public static void displayMessageForResponseCode(int responseCode) { if(responseCode == -3) { - Class60.setLoginScreenMessage(English.connectionTimedOut, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.connectionTimedOut, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == -2) { - Class60.setLoginScreenMessage("", English.errorConnectingToServer, ""); + LoginScreen.setLoginScreenMessage("", English.errorConnectingToServer, ""); } else if(responseCode == -1) { - Class60.setLoginScreenMessage(English.noResponseFromServer, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.noResponseFromServer, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 3) { - Class60.setLoginScreenMessage("", English.invalidUsernameOrPassword, ""); + LoginScreen.setLoginScreenMessage("", English.invalidUsernameOrPassword, ""); } else if(responseCode == 4) { - Class60.setLoginScreenMessage(English.yourAccountHasBeenDisabled, English.pleaseCheckYourMessageCenterForDetails, ""); + LoginScreen.setLoginScreenMessage(English.yourAccountHasBeenDisabled, English.pleaseCheckYourMessageCenterForDetails, ""); } else if(responseCode == 5) { - Class60.setLoginScreenMessage(English.yourAccountIsAlreadyLoggedIn, English.tryAgainIn60Secs, ""); + LoginScreen.setLoginScreenMessage(English.yourAccountIsAlreadyLoggedIn, English.tryAgainIn60Secs, ""); } else if(responseCode == 6) { - Class60.setLoginScreenMessage(English.gameHasBeenUpdated, English.pleaseReloadThisPage, ""); + LoginScreen.setLoginScreenMessage(English.gameHasBeenUpdated, English.pleaseReloadThisPage, ""); } else if(responseCode == 7) { - Class60.setLoginScreenMessage(English.theWorldIsFull, English.pleaseUseADifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.theWorldIsFull, English.pleaseUseADifferentWorld, ""); } else if(responseCode == 8) { - Class60.setLoginScreenMessage(English.unableToConnect, English.loginServerOffline, ""); + LoginScreen.setLoginScreenMessage(English.unableToConnect, English.loginServerOffline, ""); } else if(responseCode == 9) { - Class60.setLoginScreenMessage(English.loginLimitExceeded, English.tooManyConnectionsFromYourAddress, ""); + LoginScreen.setLoginScreenMessage(English.loginLimitExceeded, English.tooManyConnectionsFromYourAddress, ""); } else if(responseCode == 10) { - Class60.setLoginScreenMessage(English.unableToConnect, English.badSessionId, ""); + LoginScreen.setLoginScreenMessage(English.unableToConnect, English.badSessionId, ""); } else if(responseCode == 11) { - Class60.setLoginScreenMessage(English.weSuspectSomeoneKnowsYourPassword, English.pressChangeYourPasswordOnFrontPage, ""); + LoginScreen.setLoginScreenMessage(English.weSuspectSomeoneKnowsYourPassword, English.pressChangeYourPasswordOnFrontPage, ""); } else if(responseCode == 12) { - Class60.setLoginScreenMessage(English.youNeedMembersAccountToLoginToThisWorld, English.pleaseSubscribeOrUseDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.youNeedMembersAccountToLoginToThisWorld, English.pleaseSubscribeOrUseDifferentWorld, ""); } else if(responseCode == 13) { - Class60.setLoginScreenMessage(English.couldNotCompleteLogin, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.couldNotCompleteLogin, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 14) { - Class60.setLoginScreenMessage(English.theServerIsBeingUpdated, English.pleaseWait1MinuteAndTryAgain, ""); + LoginScreen.setLoginScreenMessage(English.theServerIsBeingUpdated, English.pleaseWait1MinuteAndTryAgain, ""); } else if(responseCode == 16) { - Class60.setLoginScreenMessage(English.tooManyIncorrectLoginsFromYourAddress, English.pleaseWait5MinutesBeforeTryingAgain, ""); + LoginScreen.setLoginScreenMessage(English.tooManyIncorrectLoginsFromYourAddress, English.pleaseWait5MinutesBeforeTryingAgain, ""); } else if(responseCode == 17) { - Class60.setLoginScreenMessage(English.youAreStandingInMembersOnlyArea, English.toPlayOnThisWorldMoveToFreeArea, ""); + LoginScreen.setLoginScreenMessage(English.youAreStandingInMembersOnlyArea, English.toPlayOnThisWorldMoveToFreeArea, ""); } else if(responseCode == 18) { - Class60.setLoginScreenMessage(English.accountLockedAsWeSuspectItHasBeenStolen, English.pressRecoverLockedAccountOnFrontPage, ""); + LoginScreen.setLoginScreenMessage(English.accountLockedAsWeSuspectItHasBeenStolen, English.pressRecoverLockedAccountOnFrontPage, ""); } else if(responseCode == 20) { - Class60.setLoginScreenMessage(English.invalidLoginserverRequested, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.invalidLoginserverRequested, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 22) { - Class60.setLoginScreenMessage(English.malformedLoginPacket, English.pleaseTryAgain, ""); + LoginScreen.setLoginScreenMessage(English.malformedLoginPacket, English.pleaseTryAgain, ""); } else if(responseCode == 23) { - Class60.setLoginScreenMessage(English.noReplyFromLoginserver, English.pleaseWait1MinuteAndTryAgain, ""); + LoginScreen.setLoginScreenMessage(English.noReplyFromLoginserver, English.pleaseWait1MinuteAndTryAgain, ""); } else if(responseCode == 24) { - Class60.setLoginScreenMessage(English.errorLoadingYourProfile, English.pleaseContactCustomerSupport, ""); + LoginScreen.setLoginScreenMessage(English.errorLoadingYourProfile, English.pleaseContactCustomerSupport, ""); } else if(responseCode == 25) { - Class60.setLoginScreenMessage(English.unexpectedLoginserverResponse, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.unexpectedLoginserverResponse, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 26) { - Class60.setLoginScreenMessage(English.thisComputersAddressHasBeenBlocked, English.asItWasUsedToBreakOurRules, ""); + LoginScreen.setLoginScreenMessage(English.thisComputersAddressHasBeenBlocked, English.asItWasUsedToBreakOurRules, ""); } else if(responseCode == 27) { - Class60.setLoginScreenMessage("", English.serviceUnavailable, ""); + LoginScreen.setLoginScreenMessage("", English.serviceUnavailable, ""); } else { - Class60.setLoginScreenMessage(English.unexpectedServerResponse, English.pleaseTryUsingDifferentWorld, ""); + LoginScreen.setLoginScreenMessage(English.unexpectedServerResponse, English.pleaseTryUsingDifferentWorld, ""); } MovedStatics.processGameStatus(10); } @@ -1709,7 +1709,7 @@ public static void handleLoginScreenActions() { } if (loginStatus == 8) { anInt1756 = 0; - Class60.setLoginScreenMessage(English.youHaveJustLeftAnotherWorld, English.yourProfileWillBeTransferredIn, (anInt784 / 60) + English.suffixSeconds); + LoginScreen.setLoginScreenMessage(English.youHaveJustLeftAnotherWorld, English.yourProfileWillBeTransferredIn, (anInt784 / 60) + English.suffixSeconds); if (--anInt784 <= 0) { loginStatus = 0; } @@ -2143,9 +2143,9 @@ public void processGameLoop() { MovedStatics.startup(); method992(); } else if (gameStatusCode == 10) { - Class60.updateLogin(); + LoginScreen.updateLogin(); } else if (gameStatusCode == 20) { - Class60.updateLogin(); + LoginScreen.updateLogin(); handleLoginScreenActions(); } else if (gameStatusCode == 25) currentScene.landscape.loadRegion(); @@ -2183,11 +2183,11 @@ public void updateStatusText() { if (gameStatusCode == 0) renderer.drawLoadingText(MovedStatics.anInt1607, null, Native.currentLoadingText); else if (gameStatusCode == 5) { - Class60.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 10) { - Class60.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 20) { - Class60.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 25) { if (MovedStatics.anInt1634 == 1) { if (anInt874 > MovedStatics.anInt2231) diff --git a/src/main/java/org/runejs/client/Class60.java b/src/main/java/org/runejs/client/LoginScreen.java similarity index 99% rename from src/main/java/org/runejs/client/Class60.java rename to src/main/java/org/runejs/client/LoginScreen.java index 40056feb8..21e2fc2ea 100644 --- a/src/main/java/org/runejs/client/Class60.java +++ b/src/main/java/org/runejs/client/LoginScreen.java @@ -23,7 +23,7 @@ /** * The class that handles the login screen. */ -public class Class60 { +public class LoginScreen { public static int loginScreenState = 0; public static int loginScreenFocus = 0; public static ProducingGraphicsBuffer muteButton; @@ -411,7 +411,7 @@ private static void method836(int arg0) { } } - public static void renderLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, CacheArchive gameImageCacheArchive) { + public static void createLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, CacheArchive gameImageCacheArchive) { if (!MovedStatics.aBoolean512) { flameLeftBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0); Rasterizer.resetPixels(); diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index 2be015c3c..c6593db12 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -363,28 +363,28 @@ public class MovedStatics { public static void method440() { if (aBoolean512) { - Class60.anIntArray1198 = null; - Class60.flameRightBackground = null; - Class60.aProducingGraphicsBuffer_1631 = null; - Class60.aProducingGraphicsBuffer_1206 = null; - Class60.anIntArray1168 = null; - Class60.anIntArray3255 = null; - Class60.imgLoginScreenButton = null; - Class60.anIntArray1445 = null; - Class60.loginScreenBox = null; - Class60.anIntArray2865 = null; - Class60.flameLeftBackground = null; - Class60.aProducingGraphicsBuffer_907 = null; - Class60.aProducingGraphicsBuffer_2524 = null; - Class60.aClass40_Sub5_Sub14_Sub4_918 = null; - Class60.aClass40_Sub5_Sub14_Sub2Array535 = null; - Class60.anIntArray3248 = null; - Class60.loginBoxGraphics = null; - Class60.aClass40_Sub5_Sub14_Sub4_2043 = null; - Class60.anIntArray178 = null; - Class60.aProducingGraphicsBuffer_1285 = null; - Class60.aProducingGraphicsBuffer_463 = null; - Class60.anIntArray1013 = null; + LoginScreen.anIntArray1198 = null; + LoginScreen.flameRightBackground = null; + LoginScreen.aProducingGraphicsBuffer_1631 = null; + LoginScreen.aProducingGraphicsBuffer_1206 = null; + LoginScreen.anIntArray1168 = null; + LoginScreen.anIntArray3255 = null; + LoginScreen.imgLoginScreenButton = null; + LoginScreen.anIntArray1445 = null; + LoginScreen.loginScreenBox = null; + LoginScreen.anIntArray2865 = null; + LoginScreen.flameLeftBackground = null; + LoginScreen.aProducingGraphicsBuffer_907 = null; + LoginScreen.aProducingGraphicsBuffer_2524 = null; + LoginScreen.aClass40_Sub5_Sub14_Sub4_918 = null; + LoginScreen.aClass40_Sub5_Sub14_Sub2Array535 = null; + LoginScreen.anIntArray3248 = null; + LoginScreen.loginBoxGraphics = null; + LoginScreen.aClass40_Sub5_Sub14_Sub4_2043 = null; + LoginScreen.anIntArray178 = null; + LoginScreen.aProducingGraphicsBuffer_1285 = null; + LoginScreen.aProducingGraphicsBuffer_463 = null; + LoginScreen.anIntArray1013 = null; MusicSystem.method405(10); UpdateServer.resetUpdateServerRequests(true); aBoolean512 = false; @@ -915,7 +915,7 @@ public static void processGameStatus(int statusCode) { if (statusCode == 5 || statusCode == 10 || statusCode == 20) { aProducingGraphicsBuffer_2213 = null; method344(-69); - Class60.renderLoginScreen(Game.gameCanvas, CacheArchive.huffmanCacheArchive, CacheArchive.gameImageCacheArchive); + LoginScreen.createLoginScreen(Game.gameCanvas, CacheArchive.huffmanCacheArchive, CacheArchive.gameImageCacheArchive); } if (statusCode == 25 || statusCode == 30 || statusCode == 40) { aProducingGraphicsBuffer_2213 = null; From 9a82a3af3f1a05606a1a33a5c78717aabefedce7 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 20:01:16 +0100 Subject: [PATCH 25/45] refactor: de-staticify loginscreen --- src/main/java/org/runejs/client/Game.java | 66 +++++------ .../java/org/runejs/client/LoginScreen.java | 107 +++++++++++------- .../java/org/runejs/client/MovedStatics.java | 36 +----- 3 files changed, 106 insertions(+), 103 deletions(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index 9c57dc2ed..d22044aea 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -78,6 +78,8 @@ public class Game { public static FriendList friendList; public static final SocialList ignoreList = new SocialList(100); + + public static final LoginScreen loginScreen = new LoginScreen(); public static int anInt784 = 0; public static GameInterface chatboxInterface; @@ -1036,57 +1038,57 @@ public static void drawGameScreen() { public static void displayMessageForResponseCode(int responseCode) { if(responseCode == -3) { - LoginScreen.setLoginScreenMessage(English.connectionTimedOut, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.connectionTimedOut, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == -2) { - LoginScreen.setLoginScreenMessage("", English.errorConnectingToServer, ""); + loginScreen.setLoginScreenMessage("", English.errorConnectingToServer, ""); } else if(responseCode == -1) { - LoginScreen.setLoginScreenMessage(English.noResponseFromServer, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.noResponseFromServer, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 3) { - LoginScreen.setLoginScreenMessage("", English.invalidUsernameOrPassword, ""); + loginScreen.setLoginScreenMessage("", English.invalidUsernameOrPassword, ""); } else if(responseCode == 4) { - LoginScreen.setLoginScreenMessage(English.yourAccountHasBeenDisabled, English.pleaseCheckYourMessageCenterForDetails, ""); + loginScreen.setLoginScreenMessage(English.yourAccountHasBeenDisabled, English.pleaseCheckYourMessageCenterForDetails, ""); } else if(responseCode == 5) { - LoginScreen.setLoginScreenMessage(English.yourAccountIsAlreadyLoggedIn, English.tryAgainIn60Secs, ""); + loginScreen.setLoginScreenMessage(English.yourAccountIsAlreadyLoggedIn, English.tryAgainIn60Secs, ""); } else if(responseCode == 6) { - LoginScreen.setLoginScreenMessage(English.gameHasBeenUpdated, English.pleaseReloadThisPage, ""); + loginScreen.setLoginScreenMessage(English.gameHasBeenUpdated, English.pleaseReloadThisPage, ""); } else if(responseCode == 7) { - LoginScreen.setLoginScreenMessage(English.theWorldIsFull, English.pleaseUseADifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.theWorldIsFull, English.pleaseUseADifferentWorld, ""); } else if(responseCode == 8) { - LoginScreen.setLoginScreenMessage(English.unableToConnect, English.loginServerOffline, ""); + loginScreen.setLoginScreenMessage(English.unableToConnect, English.loginServerOffline, ""); } else if(responseCode == 9) { - LoginScreen.setLoginScreenMessage(English.loginLimitExceeded, English.tooManyConnectionsFromYourAddress, ""); + loginScreen.setLoginScreenMessage(English.loginLimitExceeded, English.tooManyConnectionsFromYourAddress, ""); } else if(responseCode == 10) { - LoginScreen.setLoginScreenMessage(English.unableToConnect, English.badSessionId, ""); + loginScreen.setLoginScreenMessage(English.unableToConnect, English.badSessionId, ""); } else if(responseCode == 11) { - LoginScreen.setLoginScreenMessage(English.weSuspectSomeoneKnowsYourPassword, English.pressChangeYourPasswordOnFrontPage, ""); + loginScreen.setLoginScreenMessage(English.weSuspectSomeoneKnowsYourPassword, English.pressChangeYourPasswordOnFrontPage, ""); } else if(responseCode == 12) { - LoginScreen.setLoginScreenMessage(English.youNeedMembersAccountToLoginToThisWorld, English.pleaseSubscribeOrUseDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.youNeedMembersAccountToLoginToThisWorld, English.pleaseSubscribeOrUseDifferentWorld, ""); } else if(responseCode == 13) { - LoginScreen.setLoginScreenMessage(English.couldNotCompleteLogin, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.couldNotCompleteLogin, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 14) { - LoginScreen.setLoginScreenMessage(English.theServerIsBeingUpdated, English.pleaseWait1MinuteAndTryAgain, ""); + loginScreen.setLoginScreenMessage(English.theServerIsBeingUpdated, English.pleaseWait1MinuteAndTryAgain, ""); } else if(responseCode == 16) { - LoginScreen.setLoginScreenMessage(English.tooManyIncorrectLoginsFromYourAddress, English.pleaseWait5MinutesBeforeTryingAgain, ""); + loginScreen.setLoginScreenMessage(English.tooManyIncorrectLoginsFromYourAddress, English.pleaseWait5MinutesBeforeTryingAgain, ""); } else if(responseCode == 17) { - LoginScreen.setLoginScreenMessage(English.youAreStandingInMembersOnlyArea, English.toPlayOnThisWorldMoveToFreeArea, ""); + loginScreen.setLoginScreenMessage(English.youAreStandingInMembersOnlyArea, English.toPlayOnThisWorldMoveToFreeArea, ""); } else if(responseCode == 18) { - LoginScreen.setLoginScreenMessage(English.accountLockedAsWeSuspectItHasBeenStolen, English.pressRecoverLockedAccountOnFrontPage, ""); + loginScreen.setLoginScreenMessage(English.accountLockedAsWeSuspectItHasBeenStolen, English.pressRecoverLockedAccountOnFrontPage, ""); } else if(responseCode == 20) { - LoginScreen.setLoginScreenMessage(English.invalidLoginserverRequested, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.invalidLoginserverRequested, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 22) { - LoginScreen.setLoginScreenMessage(English.malformedLoginPacket, English.pleaseTryAgain, ""); + loginScreen.setLoginScreenMessage(English.malformedLoginPacket, English.pleaseTryAgain, ""); } else if(responseCode == 23) { - LoginScreen.setLoginScreenMessage(English.noReplyFromLoginserver, English.pleaseWait1MinuteAndTryAgain, ""); + loginScreen.setLoginScreenMessage(English.noReplyFromLoginserver, English.pleaseWait1MinuteAndTryAgain, ""); } else if(responseCode == 24) { - LoginScreen.setLoginScreenMessage(English.errorLoadingYourProfile, English.pleaseContactCustomerSupport, ""); + loginScreen.setLoginScreenMessage(English.errorLoadingYourProfile, English.pleaseContactCustomerSupport, ""); } else if(responseCode == 25) { - LoginScreen.setLoginScreenMessage(English.unexpectedLoginserverResponse, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.unexpectedLoginserverResponse, English.pleaseTryUsingDifferentWorld, ""); } else if(responseCode == 26) { - LoginScreen.setLoginScreenMessage(English.thisComputersAddressHasBeenBlocked, English.asItWasUsedToBreakOurRules, ""); + loginScreen.setLoginScreenMessage(English.thisComputersAddressHasBeenBlocked, English.asItWasUsedToBreakOurRules, ""); } else if(responseCode == 27) { - LoginScreen.setLoginScreenMessage("", English.serviceUnavailable, ""); + loginScreen.setLoginScreenMessage("", English.serviceUnavailable, ""); } else { - LoginScreen.setLoginScreenMessage(English.unexpectedServerResponse, English.pleaseTryUsingDifferentWorld, ""); + loginScreen.setLoginScreenMessage(English.unexpectedServerResponse, English.pleaseTryUsingDifferentWorld, ""); } MovedStatics.processGameStatus(10); } @@ -1709,7 +1711,7 @@ public static void handleLoginScreenActions() { } if (loginStatus == 8) { anInt1756 = 0; - LoginScreen.setLoginScreenMessage(English.youHaveJustLeftAnotherWorld, English.yourProfileWillBeTransferredIn, (anInt784 / 60) + English.suffixSeconds); + loginScreen.setLoginScreenMessage(English.youHaveJustLeftAnotherWorld, English.yourProfileWillBeTransferredIn, (anInt784 / 60) + English.suffixSeconds); if (--anInt784 <= 0) { loginStatus = 0; } @@ -2143,9 +2145,9 @@ public void processGameLoop() { MovedStatics.startup(); method992(); } else if (gameStatusCode == 10) { - LoginScreen.updateLogin(); + loginScreen.updateLogin(); } else if (gameStatusCode == 20) { - LoginScreen.updateLogin(); + loginScreen.updateLogin(); handleLoginScreenActions(); } else if (gameStatusCode == 25) currentScene.landscape.loadRegion(); @@ -2183,11 +2185,11 @@ public void updateStatusText() { if (gameStatusCode == 0) renderer.drawLoadingText(MovedStatics.anInt1607, null, Native.currentLoadingText); else if (gameStatusCode == 5) { - LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + loginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 10) { - LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + loginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 20) { - LoginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); + loginScreen.drawLoadingScreen(TypeFace.fontBold, TypeFace.fontSmall); } else if (gameStatusCode == 25) { if (MovedStatics.anInt1634 == 1) { if (anInt874 > MovedStatics.anInt2231) diff --git a/src/main/java/org/runejs/client/LoginScreen.java b/src/main/java/org/runejs/client/LoginScreen.java index 21e2fc2ea..631f40295 100644 --- a/src/main/java/org/runejs/client/LoginScreen.java +++ b/src/main/java/org/runejs/client/LoginScreen.java @@ -24,64 +24,64 @@ * The class that handles the login screen. */ public class LoginScreen { - public static int loginScreenState = 0; - public static int loginScreenFocus = 0; - public static ProducingGraphicsBuffer muteButton; + public int loginScreenState = 0; + public int loginScreenFocus = 0; + public ProducingGraphicsBuffer muteButton; /** * Part of login screen */ - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_1631; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_1631; /** * Part of login screen */ - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_1206; - public static ProducingGraphicsBuffer flameRightBackground; - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_1285; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_1206; + public ProducingGraphicsBuffer flameRightBackground; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_1285; /** * Something to do with flames, maybe */ - public static int anInt2452 = 0; + public int anInt2452 = 0; /** * Something to do with flames, maybe */ - public static int anInt2613 = 0; + public int anInt2613 = 0; /** * Something to do with flames, maybe */ - public static int[] anIntArray1013; + public int[] anIntArray1013; /** * Something to do with flames, maybe */ - public static int[] anIntArray1198; - public static int[] anIntArray2865; - public static int[] anIntArray3248; - public static ProducingGraphicsBuffer flameLeftBackground; + public int[] anIntArray1198; + public int[] anIntArray2865; + public int[] anIntArray3248; + public ProducingGraphicsBuffer flameLeftBackground; /** * Something to do with flames, maybe */ - public static ImageRGB aClass40_Sub5_Sub14_Sub4_918; + public ImageRGB aClass40_Sub5_Sub14_Sub4_918; /** * Something to do with flames, maybe */ - public static int[] anIntArray466 = new int[256]; + public int[] anIntArray466 = new int[256]; /** * Something to do with flames, maybe */ - public static int[] anIntArray178; - public static ImageRGB aClass40_Sub5_Sub14_Sub4_2043; - public static ProducingGraphicsBuffer loginBoxGraphics; - public static IndexedImage loginScreenBox; - public static IndexedImage imgLoginScreenButton; - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_907; - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_463; - public static ProducingGraphicsBuffer aProducingGraphicsBuffer_2524; - public static int[] anIntArray3255; - public static int[] anIntArray1168; - public static int anInt1641 = 0; - public static IndexedImage[] aClass40_Sub5_Sub14_Sub2Array535; - public static int[] anIntArray1445; - - public static void updateLogin() { + public int[] anIntArray178; + public ImageRGB aClass40_Sub5_Sub14_Sub4_2043; + public ProducingGraphicsBuffer loginBoxGraphics; + public IndexedImage loginScreenBox; + public IndexedImage imgLoginScreenButton; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_907; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_463; + public ProducingGraphicsBuffer aProducingGraphicsBuffer_2524; + public int[] anIntArray3255; + public int[] anIntArray1168; + public int anInt1641 = 0; + public IndexedImage[] aClass40_Sub5_Sub14_Sub2Array535; + public int[] anIntArray1445; + + public void updateLogin() { method836(1); if(MouseHandler.clickType == 1 && MouseHandler.clickY >= ScreenController.drawHeight-42 && MouseHandler.clickX>=ScreenController.drawWidth-42 ){ @@ -197,7 +197,7 @@ public static void updateLogin() { } } - public static void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { + public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { loginBoxGraphics.prepareRasterizer(); // Rasterizer.drawFilledRectangle(0,0, ScreenController.frameWidth, ScreenController.frameHeight, 0); if (Game.gameStatusCode == 0 || Game.gameStatusCode == 5) { @@ -352,7 +352,7 @@ public static void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { } } - public static void setLoginScreenMessage(String line1, String line2, String line3) { + public void setLoginScreenMessage(String line1, String line2, String line3) { Native.loginScreenMessageLineOne = line1; Native.loginScreenMessageLineTwo = line2; Native.loginScreenMessageLineThree = line3; @@ -361,7 +361,7 @@ public static void setLoginScreenMessage(String line1, String line2, String line /** * Login screen flames? */ - private static void method836(int arg0) { + private void method836(int arg0) { int i = 256; for (int i_0_ = 10; i_0_ < 117; i_0_++) { int i_1_ = (int) (Math.random() * 100.0); @@ -411,7 +411,7 @@ private static void method836(int arg0) { } } - public static void createLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, CacheArchive gameImageCacheArchive) { + public void createLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, CacheArchive gameImageCacheArchive) { if (!MovedStatics.aBoolean512) { flameLeftBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0); Rasterizer.resetPixels(); @@ -548,7 +548,7 @@ public static void createLoginScreen(Component arg0, CacheArchive huffmanCacheAr } } - public static void method879(IndexedImage arg1) { + public void method879(IndexedImage arg1) { int i = 0; for(/**/; i < anIntArray1168.length; i++) anIntArray1168[i] = 0; @@ -583,7 +583,7 @@ public static void method879(IndexedImage arg1) { } } - public static void renderFlames() { + public void renderFlames() { if (anInt2452 <= 0) { if (anInt2613 > 0) { for (int i = 0; i < 256; i++) { @@ -656,8 +656,39 @@ else if (anInt2613 > 256) } } - public static int method614(int arg1, int arg2, int arg3) { + public int method614(int arg1, int arg2, int arg3) { int i_7_ = 256 + -arg3; return (arg3 * (0xff00 & arg2) + i_7_ * (0xff00 & arg1) & 0xff0000) + (~0xff00ff & (0xff00ff & arg1) * i_7_ + arg3 * (0xff00ff & arg2)) >> 8; } + + + public void method440() { + if (MovedStatics.aBoolean512) { + anIntArray1198 = null; + flameRightBackground = null; + aProducingGraphicsBuffer_1631 = null; + aProducingGraphicsBuffer_1206 = null; + anIntArray1168 = null; + anIntArray3255 = null; + imgLoginScreenButton = null; + anIntArray1445 = null; + loginScreenBox = null; + anIntArray2865 = null; + flameLeftBackground = null; + aProducingGraphicsBuffer_907 = null; + aProducingGraphicsBuffer_2524 = null; + aClass40_Sub5_Sub14_Sub4_918 = null; + aClass40_Sub5_Sub14_Sub2Array535 = null; + anIntArray3248 = null; + loginBoxGraphics = null; + aClass40_Sub5_Sub14_Sub4_2043 = null; + anIntArray178 = null; + aProducingGraphicsBuffer_1285 = null; + aProducingGraphicsBuffer_463 = null; + anIntArray1013 = null; + MusicSystem.method405(10); + UpdateServer.resetUpdateServerRequests(true); + MovedStatics.aBoolean512 = false; + } + } } diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index c6593db12..cf50dd2cf 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -361,36 +361,6 @@ public class MovedStatics { */ public static int anInt2869 = 0; - public static void method440() { - if (aBoolean512) { - LoginScreen.anIntArray1198 = null; - LoginScreen.flameRightBackground = null; - LoginScreen.aProducingGraphicsBuffer_1631 = null; - LoginScreen.aProducingGraphicsBuffer_1206 = null; - LoginScreen.anIntArray1168 = null; - LoginScreen.anIntArray3255 = null; - LoginScreen.imgLoginScreenButton = null; - LoginScreen.anIntArray1445 = null; - LoginScreen.loginScreenBox = null; - LoginScreen.anIntArray2865 = null; - LoginScreen.flameLeftBackground = null; - LoginScreen.aProducingGraphicsBuffer_907 = null; - LoginScreen.aProducingGraphicsBuffer_2524 = null; - LoginScreen.aClass40_Sub5_Sub14_Sub4_918 = null; - LoginScreen.aClass40_Sub5_Sub14_Sub2Array535 = null; - LoginScreen.anIntArray3248 = null; - LoginScreen.loginBoxGraphics = null; - LoginScreen.aClass40_Sub5_Sub14_Sub4_2043 = null; - LoginScreen.anIntArray178 = null; - LoginScreen.aProducingGraphicsBuffer_1285 = null; - LoginScreen.aProducingGraphicsBuffer_463 = null; - LoginScreen.anIntArray1013 = null; - MusicSystem.method405(10); - UpdateServer.resetUpdateServerRequests(true); - aBoolean512 = false; - } - } - public static int[] menuActionTypes = new int[500]; public static boolean showSidePanelRedrawnText = false; /** @@ -908,18 +878,18 @@ public static void processGameStatus(int statusCode) { } if (statusCode == 0 || statusCode == 35) { method344(-40); - method440(); + Game.loginScreen.method440(); if (aProducingGraphicsBuffer_2213 == null) aProducingGraphicsBuffer_2213 = createGraphicsBuffer(765, 503, Game.gameCanvas); } if (statusCode == 5 || statusCode == 10 || statusCode == 20) { aProducingGraphicsBuffer_2213 = null; method344(-69); - LoginScreen.createLoginScreen(Game.gameCanvas, CacheArchive.huffmanCacheArchive, CacheArchive.gameImageCacheArchive); + Game.loginScreen.createLoginScreen(Game.gameCanvas, CacheArchive.huffmanCacheArchive, CacheArchive.gameImageCacheArchive); } if (statusCode == 25 || statusCode == 30 || statusCode == 40) { aProducingGraphicsBuffer_2213 = null; - method440(); + Game.loginScreen.method440(); method763(Game.gameCanvas, CacheArchive.gameImageCacheArchive); } Game.gameStatusCode = statusCode; From 8233c9da381bd824c399144044f1e146ee75079b Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 20:01:27 +0100 Subject: [PATCH 26/45] refactor: rename cleanup --- src/main/java/org/runejs/client/LoginScreen.java | 2 +- src/main/java/org/runejs/client/MovedStatics.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/runejs/client/LoginScreen.java b/src/main/java/org/runejs/client/LoginScreen.java index 631f40295..e37ff5a38 100644 --- a/src/main/java/org/runejs/client/LoginScreen.java +++ b/src/main/java/org/runejs/client/LoginScreen.java @@ -662,7 +662,7 @@ public int method614(int arg1, int arg2, int arg3) { } - public void method440() { + public void cleanUp() { if (MovedStatics.aBoolean512) { anIntArray1198 = null; flameRightBackground = null; diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index cf50dd2cf..1836d19c2 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -878,7 +878,7 @@ public static void processGameStatus(int statusCode) { } if (statusCode == 0 || statusCode == 35) { method344(-40); - Game.loginScreen.method440(); + Game.loginScreen.cleanUp(); if (aProducingGraphicsBuffer_2213 == null) aProducingGraphicsBuffer_2213 = createGraphicsBuffer(765, 503, Game.gameCanvas); } @@ -889,7 +889,7 @@ public static void processGameStatus(int statusCode) { } if (statusCode == 25 || statusCode == 30 || statusCode == 40) { aProducingGraphicsBuffer_2213 = null; - Game.loginScreen.method440(); + Game.loginScreen.cleanUp(); method763(Game.gameCanvas, CacheArchive.gameImageCacheArchive); } Game.gameStatusCode = statusCode; From 9960ae95dbd0607a0c6dbda18c694222b9140021 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 20:37:13 +0100 Subject: [PATCH 27/45] refactor: add optional RasterizerInstanced to ProducingGraphicsBuffers --- src/main/java/org/runejs/client/MovedStatics.java | 11 ++++++++--- .../org/runejs/client/ProducingGraphicsBuffer.java | 12 +++++++++++- .../runejs/client/ProducingGraphicsBuffer_Sub1.java | 9 +++++++-- .../runejs/client/ProducingGraphicsBuffer_Sub2.java | 10 ++++++++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index 1836d19c2..e01ad3d8a 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -16,6 +16,7 @@ import org.runejs.client.input.MouseHandler; import org.runejs.client.io.Buffer; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.Item; import org.runejs.client.media.renderable.Model; import org.runejs.client.net.*; @@ -912,18 +913,22 @@ public static void addActionRow(String string, int menuAction, int firstOperand, } - public static ProducingGraphicsBuffer createGraphicsBuffer(int width, int height, Component component) { + public static ProducingGraphicsBuffer createGraphicsBuffer(int width, int height, Component component, RasterizerInstanced rasterizerInstance) { try { ProducingGraphicsBuffer producingGraphicsBuffer = new ProducingGraphicsBuffer_Sub2(); - producingGraphicsBuffer.method1041(13, width, component, height); + producingGraphicsBuffer.method1041(13, width, component, height, rasterizerInstance); return producingGraphicsBuffer; } catch(Throwable throwable) { ProducingGraphicsBuffer_Sub1 class68_sub1 = new ProducingGraphicsBuffer_Sub1(); - class68_sub1.method1041(44, width, component, height); + class68_sub1.method1041(44, width, component, height, rasterizerInstance); return class68_sub1; } } + public static ProducingGraphicsBuffer createGraphicsBuffer(int width, int height, Component component) { + return createGraphicsBuffer(width, height, component, null); + } + /** * Count down any temporary scene objects and remove them if necessary. */ diff --git a/src/main/java/org/runejs/client/ProducingGraphicsBuffer.java b/src/main/java/org/runejs/client/ProducingGraphicsBuffer.java index 9018039e3..adbb1c872 100644 --- a/src/main/java/org/runejs/client/ProducingGraphicsBuffer.java +++ b/src/main/java/org/runejs/client/ProducingGraphicsBuffer.java @@ -1,6 +1,7 @@ package org.runejs.client; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import java.awt.*; @@ -11,11 +12,20 @@ public abstract class ProducingGraphicsBuffer { public Image image; public abstract void method1041(int i, int i_2_, Component component, int i_3_); + public abstract void method1041(int i, int i_2_, Component component, int i_3_, RasterizerInstanced rasterizerInstance); public abstract void drawGraphics(int x, int y, Graphics graphics); public abstract void paintComponent(int x, int y, Graphics graphics); + public void prepareRasterizer(RasterizerInstanced rasterizerInstance) { + if (rasterizerInstance == null) { + Rasterizer.prepare(pixels, width, height); + } else { + rasterizerInstance.prepare(pixels, width, height); + } + } + public void prepareRasterizer() { - Rasterizer.prepare(pixels, width, height); + prepareRasterizer(null); } } diff --git a/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub1.java b/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub1.java index d7cf5ec34..41650b9e3 100644 --- a/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub1.java +++ b/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub1.java @@ -1,6 +1,7 @@ package org.runejs.client; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import java.awt.*; import java.awt.image.*; @@ -50,7 +51,7 @@ public synchronized void addConsumer(ImageConsumer arg0) { arg0.setHints(14); } - public void method1041(int arg0, int arg1, Component arg2, int arg3) { + public void method1041(int arg0, int arg1, Component arg2, int arg3, RasterizerInstanced rasterizerInstanced) { pixels = new int[1 + arg1 * arg3]; width = arg1; height = arg3; @@ -64,7 +65,11 @@ public void method1041(int arg0, int arg1, Component arg2, int arg3) { arg2.prepareImage(image, this); drawPixels(); arg2.prepareImage(image, this); - this.prepareRasterizer(); + this.prepareRasterizer(rasterizerInstanced); + } + + public void method1041(int arg0, int arg1, Component arg2, int arg3) { + method1041(arg0, arg1, arg2, arg3, null); } public void startProduction(ImageConsumer arg0) { diff --git a/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub2.java b/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub2.java index 66b5d3051..bbd39114d 100644 --- a/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub2.java +++ b/src/main/java/org/runejs/client/ProducingGraphicsBuffer_Sub2.java @@ -1,5 +1,7 @@ package org.runejs.client; +import org.runejs.client.media.RasterizerInstanced; + import java.awt.*; import java.awt.image.*; import java.util.Hashtable; @@ -14,7 +16,7 @@ public void paintComponent(int arg1, int arg3, Graphics arg2) { arg2.drawImage(image, arg1, arg3, aComponent2214); } - public void method1041(int arg0, int arg1, Component arg2, int arg3) { + public void method1041(int arg0, int arg1, Component arg2, int arg3, RasterizerInstanced rasterizerInstance) { width = arg1; if(arg0 > 4) { pixels = new int[1 + arg3 * arg1]; @@ -24,7 +26,11 @@ public void method1041(int arg0, int arg1, Component arg2, int arg3) { WritableRaster writableraster = Raster.createWritableRaster(directcolormodel.createCompatibleSampleModel(width, height), databufferint, null); image = new BufferedImage(directcolormodel, writableraster, false, new Hashtable()); aComponent2214 = arg2; - prepareRasterizer(); + prepareRasterizer(rasterizerInstance); } } + + public void method1041(int arg0, int arg1, Component arg2, int arg3) { + method1041(arg0, arg1, arg2, arg3, null); + } } From 75ddfeecdb1c376d55d82453e0e207b28af28b34 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 20:43:47 +0100 Subject: [PATCH 28/45] refactor: convert LoginScreen to use instance rasterizer (except text ...) --- .../java/org/runejs/client/LoginScreen.java | 165 +++++++++--------- .../runejs/client/cache/media/ImageRGB.java | 75 ++++++++ .../client/cache/media/IndexedImage.java | 38 ++++ 3 files changed, 199 insertions(+), 79 deletions(-) diff --git a/src/main/java/org/runejs/client/LoginScreen.java b/src/main/java/org/runejs/client/LoginScreen.java index e37ff5a38..2417cd484 100644 --- a/src/main/java/org/runejs/client/LoginScreen.java +++ b/src/main/java/org/runejs/client/LoginScreen.java @@ -11,6 +11,7 @@ import org.runejs.client.language.English; import org.runejs.client.language.Native; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.VertexNormal; import org.runejs.client.net.UpdateServer; import org.runejs.client.sound.MusicSystem; @@ -198,21 +199,21 @@ public void updateLogin() { } public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { - loginBoxGraphics.prepareRasterizer(); + loginBoxGraphics.prepareRasterizer(rasterizer); // Rasterizer.drawFilledRectangle(0,0, ScreenController.frameWidth, ScreenController.frameHeight, 0); if (Game.gameStatusCode == 0 || Game.gameStatusCode == 5) { int i = 20; fontBold.drawStringLeft(English.gameIsLoadingPleaseWait, 180, 74 + -i, 16777215); int i_89_ = -i + 82; - Rasterizer.drawUnfilledRectangle(28, i_89_, 304, 34, 9179409); - Rasterizer.drawUnfilledRectangle(29, 1 + i_89_, 302, 32, 0); - Rasterizer.drawFilledRectangle(30, 2 + i_89_, MovedStatics.anInt1607 * 3, 30, 9179409); - Rasterizer.drawFilledRectangle(3 * MovedStatics.anInt1607 + 30, i_89_ + 2, -(MovedStatics.anInt1607 * 3) + 300, 30, 0); + rasterizer.drawUnfilledRectangle(28, i_89_, 304, 34, 9179409); + rasterizer.drawUnfilledRectangle(29, 1 + i_89_, 302, 32, 0); + rasterizer.drawFilledRectangle(30, 2 + i_89_, MovedStatics.anInt1607 * 3, 30, 9179409); + rasterizer.drawFilledRectangle(3 * MovedStatics.anInt1607 + 30, i_89_ + 2, -(MovedStatics.anInt1607 * 3) + 300, 30, 0); fontBold.drawStringLeft(Native.currentLoadingText, 180, -i + 105, 16777215); } if (Game.gameStatusCode == 20) { int drawY = 40; - loginScreenBox.drawImage(0, 0); + loginScreenBox.drawImage(rasterizer, 0, 0); fontBold.drawShadowedStringCenter(Native.loginScreenMessageLineOne, 180, drawY, 16776960, true); drawY += 15; fontBold.drawShadowedStringCenter(Native.loginScreenMessageLineTwo, 180, drawY, 16776960, true); @@ -226,7 +227,7 @@ public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { drawY += 15; } if (Game.gameStatusCode == 10) { - loginScreenBox.drawImage(0, 0); + loginScreenBox.drawImage(rasterizer, 0, 0); if (loginScreenState == 0) { /*fontBold.drawShadowedStringCenter(English.welcomeTo, 180, 80, 16776960, true); int drawX = 100; @@ -247,7 +248,7 @@ public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { i_93_ += 15; } - imgLoginScreenButton.drawImage(-73 + i, i_92_ - 20); + imgLoginScreenButton.drawImage(rasterizer, -73 + i, i_92_ - 20); fontBold.drawShadowedStringCenter(English.login, i, 5 + i_92_, 16777215, true); } else if (loginScreenState == 2) { @@ -277,11 +278,11 @@ public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { width = fontBold.getStringWidth(English.password + starredPassword.substring(offset) + Native.justAnotherYellowBar); } fontBold.drawShadowedString(English.password + starredPassword.substring(offset) + (MovedStatics.pulseCycle % 40 < 20 & loginScreenFocus == 1 ? Native.justAnotherYellowBar : ""), 92, y1, true, 16777215); - imgLoginScreenButton.drawImage(-73 + drawX, y2 + -20); + imgLoginScreenButton.drawImage(rasterizer, -73 + drawX, y2 + -20); y1 += 15; fontBold.drawShadowedStringCenter(English.login, drawX, y2 + 5, 16777215, true); drawX = 260; - imgLoginScreenButton.drawImage(-73 + drawX, y2 + -20); + imgLoginScreenButton.drawImage(rasterizer, -73 + drawX, y2 + -20); fontBold.drawShadowedStringCenter(English.cancel, drawX, 5 + y2, 16777215, true); } else if (loginScreenState == 3) { fontBold.drawShadowedStringCenter(English.createAFreeAccount, 180, 40, 16776960, true); @@ -294,24 +295,24 @@ public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { i_93_ += 15; } - imgLoginScreenButton.drawImage(-73 + i, i_92_ - 20); + imgLoginScreenButton.drawImage(rasterizer, -73 + i, i_92_ - 20); fontBold.drawShadowedStringCenter(English.cancel, i, 5 + i_92_, 16777215, true); } } - muteButton.prepareRasterizer(); + muteButton.prepareRasterizer(rasterizer); ImageRGB musicIcon = TabParts.GetPart("music"); if(ScreenController.frameMode == ScreenMode.RESIZABLE) { - Rasterizer.drawFilledRectangle(0, 0, ScreenController.drawWidth, ScreenController.drawHeight, 0); + rasterizer.drawFilledRectangle(0, 0, ScreenController.drawWidth, ScreenController.drawHeight, 0); } - Rasterizer.drawFilledRectangle(0, 0, 42, 42, 0x4d4431); - Rasterizer.drawUnfilledRectangle(0, 0, 42, 42, 0x242017); - musicIcon.drawImage(4, 3); + rasterizer.drawFilledRectangle(0, 0, 42, 42, 0x4d4431); + rasterizer.drawUnfilledRectangle(0, 0, 42, 42, 0x242017); + musicIcon.drawImage(rasterizer, 4, 3); if(MusicSystem.musicVolume == 0) { - Rasterizer.drawDiagonalLine(0,0, 42,42, 0xFF0000); + rasterizer.drawDiagonalLine(0,0, 42,42, 0xFF0000); } renderFlames(); @@ -411,48 +412,54 @@ private void method836(int arg0) { } } + public ProducingGraphicsBuffer graphicsBuffer; + public RasterizerInstanced rasterizer; + public void createLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, CacheArchive gameImageCacheArchive) { if (!MovedStatics.aBoolean512) { - flameLeftBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0); - Rasterizer.resetPixels(); - flameRightBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_907 = MovedStatics.createGraphicsBuffer(509, 171, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_1206 = MovedStatics.createGraphicsBuffer(360, 132, arg0); - Rasterizer.resetPixels(); - loginBoxGraphics = MovedStatics.createGraphicsBuffer(360, 200, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_463 = MovedStatics.createGraphicsBuffer(202, 238, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_1285 = MovedStatics.createGraphicsBuffer(203, 238, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_2524 = MovedStatics.createGraphicsBuffer(74, 94, arg0); - Rasterizer.resetPixels(); - aProducingGraphicsBuffer_1631 = MovedStatics.createGraphicsBuffer(75, 94, arg0); - Rasterizer.resetPixels(); - muteButton = MovedStatics.createGraphicsBuffer(42, 42, arg0); - Rasterizer.resetPixels(); + graphicsBuffer = MovedStatics.createGraphicsBuffer(arg0.getWidth(), arg0.getHeight(), arg0); + rasterizer = new RasterizerInstanced(graphicsBuffer); + + flameLeftBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0, rasterizer); + rasterizer.resetPixels(); + flameRightBackground = MovedStatics.createGraphicsBuffer(128, 265, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_907 = MovedStatics.createGraphicsBuffer(509, 171, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_1206 = MovedStatics.createGraphicsBuffer(360, 132, arg0, rasterizer); + rasterizer.resetPixels(); + loginBoxGraphics = MovedStatics.createGraphicsBuffer(360, 200, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_463 = MovedStatics.createGraphicsBuffer(202, 238, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_1285 = MovedStatics.createGraphicsBuffer(203, 238, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_2524 = MovedStatics.createGraphicsBuffer(74, 94, arg0, rasterizer); + rasterizer.resetPixels(); + aProducingGraphicsBuffer_1631 = MovedStatics.createGraphicsBuffer(75, 94, arg0, rasterizer); + rasterizer.resetPixels(); + muteButton = MovedStatics.createGraphicsBuffer(42, 42, arg0, rasterizer); + rasterizer.resetPixels(); byte[] is = huffmanCacheArchive.method170("", Native.titleImage); ImageRGB titleImg = new ImageRGB(is, arg0); - flameLeftBackground.prepareRasterizer(); - titleImg.drawInverse(0, 0); - flameRightBackground.prepareRasterizer(); - titleImg.drawInverse(-637, 0); - aProducingGraphicsBuffer_907.prepareRasterizer(); - titleImg.drawInverse(-128, 0); - aProducingGraphicsBuffer_1206.prepareRasterizer(); - titleImg.drawInverse(-202, -371); - loginBoxGraphics.prepareRasterizer(); - titleImg.drawInverse(-202, -171); - aProducingGraphicsBuffer_463.prepareRasterizer(); - titleImg.drawInverse(0, -265); - aProducingGraphicsBuffer_1285.prepareRasterizer(); - titleImg.drawInverse(-562, -265); - aProducingGraphicsBuffer_2524.prepareRasterizer(); - titleImg.drawInverse(-128, -171); - aProducingGraphicsBuffer_1631.prepareRasterizer(); - titleImg.drawInverse(-562, -171); + flameLeftBackground.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 0, 0); + flameRightBackground.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -637, 0); + aProducingGraphicsBuffer_907.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -128, 0); + aProducingGraphicsBuffer_1206.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -202, -371); + loginBoxGraphics.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -202, -171); + aProducingGraphicsBuffer_463.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 0, -265); + aProducingGraphicsBuffer_1285.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -562, -265); + aProducingGraphicsBuffer_2524.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -128, -171); + aProducingGraphicsBuffer_1631.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -562, -171); int[] is_18_ = new int[titleImg.imageWidth]; for (int i = 0; i < titleImg.imageHeight; i++) { for (int i_19_ = 0; i_19_ < titleImg.imageWidth; i_19_++) @@ -460,37 +467,37 @@ public void createLoginScreen(Component arg0, CacheArchive huffmanCacheArchive, for (int i_20_ = 0; i_20_ < titleImg.imageWidth; i_20_++) titleImg.pixels[i_20_ + titleImg.imageWidth * i] = is_18_[i_20_]; } - flameLeftBackground.prepareRasterizer(); - titleImg.drawInverse(382, 0); - flameRightBackground.prepareRasterizer(); - titleImg.drawInverse(-255, 0); - aProducingGraphicsBuffer_907.prepareRasterizer(); - titleImg.drawInverse(254, 0); - aProducingGraphicsBuffer_1206.prepareRasterizer(); - titleImg.drawInverse(180, -371); - loginBoxGraphics.prepareRasterizer(); - titleImg.drawInverse(180, -171); - aProducingGraphicsBuffer_463.prepareRasterizer(); - titleImg.drawInverse(382, -265); - aProducingGraphicsBuffer_1285.prepareRasterizer(); - titleImg.drawInverse(-180, -265); - aProducingGraphicsBuffer_2524.prepareRasterizer(); - titleImg.drawInverse(254, -171); - aProducingGraphicsBuffer_1631.prepareRasterizer(); - titleImg.drawInverse(-180, -171); - muteButton.prepareRasterizer(); + flameLeftBackground.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 382, 0); + flameRightBackground.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -255, 0); + aProducingGraphicsBuffer_907.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 254, 0); + aProducingGraphicsBuffer_1206.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 180, -371); + loginBoxGraphics.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 180, -171); + aProducingGraphicsBuffer_463.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 382, -265); + aProducingGraphicsBuffer_1285.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -180, -265); + aProducingGraphicsBuffer_2524.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, 254, -171); + aProducingGraphicsBuffer_1631.prepareRasterizer(rasterizer); + titleImg.drawInverse(rasterizer, -180, -171); + muteButton.prepareRasterizer(rasterizer); ImageRGB musicIcon = TabParts.GetPart("music"); - Rasterizer.drawFilledRectangle(0, 0, 42, 42, 0x4d4431); - Rasterizer.drawUnfilledRectangle(0, 0, 42, 42, 0x242017); - musicIcon.drawImage(4, 3); + rasterizer.drawFilledRectangle(0, 0, 42, 42, 0x4d4431); + rasterizer.drawUnfilledRectangle(0, 0, 42, 42, 0x242017); + musicIcon.drawImage(rasterizer, 4, 3); titleImg = MovedStatics.method1028(gameImageCacheArchive, Native.logo, ""); - aProducingGraphicsBuffer_907.prepareRasterizer(); + aProducingGraphicsBuffer_907.prepareRasterizer(rasterizer); // UNCOMMENT LINE UNDER FOR LOGO // class40_sub5_sub14_sub4.drawImage(-128 + 382 + -(class40_sub5_sub14_sub4.imageWidth / 2), 18); // Comment line under to remove custom logo: ImageRGB logo = Images.GetPart("logo"); - logo.drawImage(-128 + 382 + -(logo.imageWidth / 2), 18); + logo.drawImage(rasterizer, -128 + 382 + -(logo.imageWidth / 2), 18); loginScreenBox = Game.method359(Native.titleBox, "", gameImageCacheArchive); imgLoginScreenButton = Game.method359(Native.titleButton, "", gameImageCacheArchive); diff --git a/src/main/java/org/runejs/client/cache/media/ImageRGB.java b/src/main/java/org/runejs/client/cache/media/ImageRGB.java index cc4d5db0b..42af52133 100644 --- a/src/main/java/org/runejs/client/cache/media/ImageRGB.java +++ b/src/main/java/org/runejs/client/cache/media/ImageRGB.java @@ -3,6 +3,7 @@ import org.runejs.client.MovedStatics; import org.runejs.client.cache.CacheArchive; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.util.BitUtils; import java.awt.*; @@ -355,6 +356,43 @@ public void drawImageWithTexture(int x, int y, int textureId, int arg3) { method722(maxWidth << 3, maxHeight << 3, x << 4, y << 4, textureId, arg3); } + public void drawImage(RasterizerInstanced rasterizer, int x, int y) { + x += offsetX; + y += offsetY; + int dest_offset = x + y * rasterizer.destinationWidth; + int source_offset = 0; + int line_count = imageHeight; + int line_width = imageWidth; + int line_offset_dest = rasterizer.destinationWidth - line_width; + int line_offset_source = 0; + if(y < rasterizer.viewportTop) { + int clip_height = rasterizer.viewportTop - y; + line_count -= clip_height; + y = rasterizer.viewportTop; + source_offset += clip_height * line_width; + dest_offset += clip_height * rasterizer.destinationWidth; + } + if(y + line_count > rasterizer.viewportBottom) + line_count -= y + line_count - rasterizer.viewportBottom; + if(x < rasterizer.viewportLeft) { + int clip_width = rasterizer.viewportLeft - x; + line_width -= clip_width; + x = rasterizer.viewportLeft; + source_offset += clip_width; + dest_offset += clip_width; + line_offset_source += clip_width; + line_offset_dest += clip_width; + } + if(x + line_width > rasterizer.viewportRight) { + int clip_width = x + line_width - rasterizer.viewportRight; + line_width -= clip_width; + line_offset_source += clip_width; + line_offset_dest += clip_width; + } + if(line_width > 0 && line_count > 0) + blockCopyTrans(rasterizer.destinationPixels, pixels, 0, source_offset, dest_offset, line_width, line_count, line_offset_dest, line_offset_source); + } + public void drawImage(int x, int y) { x += offsetX; y += offsetY; @@ -875,6 +913,43 @@ public void trim() { } } + public void drawInverse(RasterizerInstanced rasterizer, int x, int y) { + x += offsetX; + y += offsetY; + int rasterizerPixel = x + y * rasterizer.destinationWidth; + int pixel = 0; + int newHeight = imageHeight; + int newWidth = imageWidth; + int rasterizerPixelOffset = rasterizer.destinationWidth - newWidth; + int pixelOffset = 0; + if(y < rasterizer.viewportTop) { + int yOffset = rasterizer.viewportTop - y; + newHeight -= yOffset; + y = rasterizer.viewportTop; + pixel += yOffset * newWidth; + rasterizerPixel += yOffset * rasterizer.destinationWidth; + } + if(y + newHeight > rasterizer.viewportBottom) + newHeight -= y + newHeight - rasterizer.viewportBottom; + if(x < rasterizer.viewportLeft) { + int xOffset = rasterizer.viewportLeft - x; + newWidth -= xOffset; + x = rasterizer.viewportLeft; + pixel += xOffset; + rasterizerPixel += xOffset; + pixelOffset += xOffset; + rasterizerPixelOffset += xOffset; + } + if(x + newWidth > rasterizer.viewportRight) { + int widthOffset = x + newWidth - rasterizer.viewportRight; + newWidth -= widthOffset; + pixelOffset += widthOffset; + rasterizerPixelOffset += widthOffset; + } + if(newWidth > 0 && newHeight > 0) + copyPixels(rasterizer.destinationPixels, pixels, pixel, rasterizerPixel, newWidth, newHeight, rasterizerPixelOffset, pixelOffset); + } + public void drawInverse(int x, int y) { x += offsetX; y += offsetY; diff --git a/src/main/java/org/runejs/client/cache/media/IndexedImage.java b/src/main/java/org/runejs/client/cache/media/IndexedImage.java index 60b01c8ac..3f59f8f86 100644 --- a/src/main/java/org/runejs/client/cache/media/IndexedImage.java +++ b/src/main/java/org/runejs/client/cache/media/IndexedImage.java @@ -3,6 +3,7 @@ import org.runejs.client.MovedStatics; import org.runejs.client.cache.CacheArchive; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; public class IndexedImage extends Rasterizer { public int imgWidth; @@ -71,6 +72,43 @@ public IndexedImage cloneImage() { return newImage; } + public void drawImage(RasterizerInstanced rasterizer, int x, int y) { + x += xDrawOffset; + y += yDrawOffset; + int rasterizerOffset = x + y * rasterizer.destinationWidth; + int pixelOffset = 0; + int imageHeight = imgHeight; + int imageWidth = imgWidth; + int deviation = rasterizer.destinationWidth - imageWidth; + int originalDeviation = 0; + if(y < rasterizer.viewportTop) { + int yOffset = rasterizer.viewportTop - y; + imageHeight -= yOffset; + y = rasterizer.viewportTop; + pixelOffset += yOffset * imageWidth; + rasterizerOffset += yOffset * rasterizer.destinationWidth; + } + if(y + imageHeight > rasterizer.viewportBottom) + imageHeight -= y + imageHeight - rasterizer.viewportBottom; + if(x < rasterizer.viewportLeft) { + int xOffset = rasterizer.viewportLeft - x; + imageWidth -= xOffset; + x = rasterizer.viewportLeft; + pixelOffset += xOffset; + rasterizerOffset += xOffset; + originalDeviation += xOffset; + deviation += xOffset; + } + if(x + imageWidth > rasterizer.viewportRight) { + int xOffset = x + imageWidth - rasterizer.viewportRight; + imageWidth -= xOffset; + originalDeviation += xOffset; + deviation += xOffset; + } + if(imageWidth > 0 && imageHeight > 0) + ImageRGB.shapeImageToPixels(imgPixels, rasterizer.destinationPixels, pixelOffset, rasterizerOffset, imageWidth, imageHeight, deviation, originalDeviation, palette); + } + public void drawImage(int x, int y) { x += xDrawOffset; y += yDrawOffset; From b5708486843f99b3824b9ac7eeb302d275fa4012 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 21:27:09 +0100 Subject: [PATCH 29/45] refactor: convert text to use instanced rasterizer --- .../java/org/runejs/client/LoginScreen.java | 5 +- .../java/org/runejs/client/MovedStatics.java | 2 + .../runejs/client/cache/media/TypeFace.java | 245 ++++++++++++------ 3 files changed, 168 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/runejs/client/LoginScreen.java b/src/main/java/org/runejs/client/LoginScreen.java index 2417cd484..abfdb9228 100644 --- a/src/main/java/org/runejs/client/LoginScreen.java +++ b/src/main/java/org/runejs/client/LoginScreen.java @@ -10,7 +10,6 @@ import org.runejs.client.input.MouseHandler; import org.runejs.client.language.English; import org.runejs.client.language.Native; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.VertexNormal; import org.runejs.client.net.UpdateServer; @@ -200,6 +199,10 @@ public void updateLogin() { public void drawLoadingScreen(TypeFace fontBold, TypeFace fontSmall) { loginBoxGraphics.prepareRasterizer(rasterizer); + + fontBold.setRasterizer(rasterizer); + fontSmall.setRasterizer(rasterizer); + // Rasterizer.drawFilledRectangle(0,0, ScreenController.frameWidth, ScreenController.frameHeight, 0); if (Game.gameStatusCode == 0 || Game.gameStatusCode == 5) { int i = 20; diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index e01ad3d8a..be09088a1 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -891,6 +891,8 @@ public static void processGameStatus(int statusCode) { if (statusCode == 25 || statusCode == 30 || statusCode == 40) { aProducingGraphicsBuffer_2213 = null; Game.loginScreen.cleanUp(); + TypeFace.fontBold.setRasterizer(null); + TypeFace.fontSmall.setRasterizer(null); method763(Game.gameCanvas, CacheArchive.gameImageCacheArchive); } Game.gameStatusCode = statusCode; diff --git a/src/main/java/org/runejs/client/cache/media/TypeFace.java b/src/main/java/org/runejs/client/cache/media/TypeFace.java index d8ee8e1a0..4f6a0d25e 100644 --- a/src/main/java/org/runejs/client/cache/media/TypeFace.java +++ b/src/main/java/org/runejs/client/cache/media/TypeFace.java @@ -8,6 +8,7 @@ import org.runejs.client.cache.media.textUtils.TextTagNode; import org.runejs.client.cache.media.textUtils.TextTagQueue; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import java.awt.*; import java.util.Random; @@ -64,6 +65,8 @@ public class TypeFace extends Rasterizer { private int anInt2920; private TextColourQueue textcolour; + private RasterizerInstanced rasterizer; + public TypeFace(int[] arg0, int[] arg1, int[] arg2, int[] arg3, byte[][] arg4) { characterDefaultHeight = 0; random = new Random(); @@ -94,6 +97,10 @@ public TypeFace(int[] arg0, int[] arg1, int[] arg2, int[] arg3, byte[][] arg4) { anInt2919 = i_49_ - characterDefaultHeight; } + public void setRasterizer(RasterizerInstanced rasterizer) { + this.rasterizer = rasterizer; + } + public static TypeFace constructFont() { TypeFace class40_sub5_sub14_sub1 = new TypeFace(MovedStatics.anIntArray3111, MovedStatics.anIntArray456, MovedStatics.anIntArray3312, MovedStatics.anIntArray1972, MovedStatics.aByteArrayArray1370); MovedStatics.method569(); @@ -601,108 +608,117 @@ public int getColour(String code) { public void drawCharacter(int character, int x, int y, int width, int height, int colour) { - int rasterizerPixel = x + y * Rasterizer.destinationWidth; - int rasterizerPixelOffset = Rasterizer.destinationWidth - width; + int destinationWidth = getDestinationWidth(); + int[] viewportDimensions = getViewportDimensions(); + + int rasterizerPixel = x + y * destinationWidth; + int rasterizerPixelOffset = destinationWidth - width; int characterPixelOffset = 0; int characterPixel = 0; - if (y < Rasterizer.viewportTop) { - int offsetY = Rasterizer.viewportTop - y; + if (y < viewportDimensions[1]) { + int offsetY = viewportDimensions[1] - y; height -= offsetY; - y = Rasterizer.viewportTop; + y = viewportDimensions[1]; characterPixel += offsetY * width; - rasterizerPixel += offsetY * Rasterizer.destinationWidth; + rasterizerPixel += offsetY * destinationWidth; } - if (y + height > Rasterizer.viewportBottom) { - height -= y + height - Rasterizer.viewportBottom; + if (y + height > viewportDimensions[3]) { + height -= y + height - viewportDimensions[3]; } - if (x < Rasterizer.viewportLeft) { - int offsetX = Rasterizer.viewportLeft - x; + if (x < viewportDimensions[0]) { + int offsetX = viewportDimensions[0] - x; width -= offsetX; - x = Rasterizer.viewportLeft; + x = viewportDimensions[0]; characterPixel += offsetX; rasterizerPixel += offsetX; characterPixelOffset += offsetX; rasterizerPixelOffset += offsetX; } - if (x + width > Rasterizer.viewportRight) { - int endOffsetX = x + width - Rasterizer.viewportRight; + if (x + width > viewportDimensions[2]) { + int endOffsetX = x + width - viewportDimensions[2]; width -= endOffsetX; characterPixelOffset += endOffsetX; rasterizerPixelOffset += endOffsetX; } if (width > 0 && height > 0) { - drawCharacterPixels(characterPixels[character], Rasterizer.destinationPixels, characterPixel, rasterizerPixel, characterPixelOffset, rasterizerPixelOffset, width, height, colour); + drawCharacterPixels(characterPixels[character], getDestinationPixels(), characterPixel, rasterizerPixel, characterPixelOffset, rasterizerPixelOffset, width, height, colour); } } public void drawCharacterItalics(int character, int x, int y, int width, int height, int colour) { - int rasterizerPixel = x + y * Rasterizer.destinationWidth; - int rasterizerPixelOffset = Rasterizer.destinationWidth - width; + int destinationWidth = getDestinationWidth(); + int[] viewportDimensions = getViewportDimensions(); + + int rasterizerPixel = x + y * destinationWidth; + int rasterizerPixelOffset = destinationWidth - width; int characterPixelOffset = 0; int characterPixel = 0; - if (y < Rasterizer.viewportTop) { - int offsetY = Rasterizer.viewportTop - y; + if (y < viewportDimensions[1]) { + int offsetY = viewportDimensions[1] - y; height -= offsetY; - y = Rasterizer.viewportTop; + y = viewportDimensions[1]; characterPixel += offsetY * width; - rasterizerPixel += offsetY * Rasterizer.destinationWidth; + rasterizerPixel += offsetY * destinationWidth; } - if (y + height > Rasterizer.viewportBottom) { - height -= y + height - Rasterizer.viewportBottom; + if (y + height > viewportDimensions[3]) { + height -= y + height - viewportDimensions[3]; } - if (x < Rasterizer.viewportLeft) { - int offsetX = Rasterizer.viewportLeft - x; + if (x < viewportDimensions[0]) { + int offsetX = viewportDimensions[0] - x; width -= offsetX; - x = Rasterizer.viewportLeft; + x = viewportDimensions[0]; characterPixel += offsetX; rasterizerPixel += offsetX; characterPixelOffset += offsetX; rasterizerPixelOffset += offsetX; } - if (x + width > Rasterizer.viewportRight) { - int endOffsetX = x + width - Rasterizer.viewportRight; + if (x + width > viewportDimensions[2]) { + int endOffsetX = x + width - viewportDimensions[2]; width -= endOffsetX; characterPixelOffset += endOffsetX; rasterizerPixelOffset += endOffsetX; } if (width > 0 && height > 0) { - drawCharacterPixelsItalic(characterPixels[character], Rasterizer.destinationPixels, characterPixel, rasterizerPixel, characterPixelOffset, rasterizerPixelOffset, width, height, colour); + drawCharacterPixelsItalic(characterPixels[character], getDestinationPixels(), characterPixel, rasterizerPixel, characterPixelOffset, rasterizerPixelOffset, width, height, colour); } } - public void drawCharacterLegacy(byte[] pixels, int x, int y, int width, int height, int colour) { - int rasterizerPixel = x + y * Rasterizer.destinationWidth; - int remainingWidth = Rasterizer.destinationWidth - width; + private void drawCharacterLegacy(byte[] pixels, int x, int y, int width, int height, int colour) { + int destinationWidth = getDestinationWidth(); + int[] viewportDimensions = getViewportDimensions(); + + int rasterizerPixel = x + y * destinationWidth; + int remainingWidth = destinationWidth - width; int characterPixelOffset = 0; int characterPixel = 0; - if (y < Rasterizer.viewportTop) { - int offsetY = Rasterizer.viewportTop - y; + if (y < viewportDimensions[1]) { + int offsetY = viewportDimensions[1] - y; height -= offsetY; - y = Rasterizer.viewportTop; + y = viewportDimensions[1]; characterPixel += offsetY * width; - rasterizerPixel += offsetY * Rasterizer.destinationWidth; + rasterizerPixel += offsetY * destinationWidth; } - if (y + height >= Rasterizer.viewportBottom) - height -= y + height - Rasterizer.viewportBottom + 1; - if (x < Rasterizer.viewportLeft) { - int offsetX = Rasterizer.viewportLeft - x; + if (y + height > viewportDimensions[3]) + height -= y + height - viewportDimensions[3]; + if (x < viewportDimensions[0]) { + int offsetX = viewportDimensions[0] - x; width -= offsetX; - x = Rasterizer.viewportLeft; + x = viewportDimensions[0]; characterPixel += offsetX; rasterizerPixel += offsetX; characterPixelOffset += offsetX; remainingWidth += offsetX; } - if (x + width >= Rasterizer.viewportRight) { - int endOffsetX = x + width - Rasterizer.viewportRight + 1; + if (x + width > viewportDimensions[2]) { + int endOffsetX = x + width - viewportDimensions[2]; width -= endOffsetX; characterPixelOffset += endOffsetX; remainingWidth += endOffsetX; } if (width > 0 && height > 0) { - drawCharacterPixels(pixels, Rasterizer.destinationPixels, characterPixel, rasterizerPixel, characterPixelOffset, remainingWidth, width, height, colour); + drawCharacterPixels(pixels, getDestinationPixels(), characterPixel, rasterizerPixel, characterPixelOffset, remainingWidth, width, height, colour); } } @@ -967,20 +983,34 @@ public final void drawBasicStringXYMods(String string, int drawX, int drawY, int int charWidth = characterScreenWidths[character]; if (strikethroughColor != -1) { if (opacity > 255) { - Rasterizer.drawHorizontalLine(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); - } else { - Rasterizer.drawHorizontalLineAlpha(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor, opacity); + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } else { + rasterizer.drawHorizontalLine(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } + } else { + if (rasterizer == null) { + Rasterizer.drawHorizontalLineAlpha(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor, opacity); + } else { + rasterizer.drawHorizontalLineAlpha(drawX, drawY + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor, opacity); + } } } if (underlineColor != -1) { if (opacity > 255) { - Rasterizer.drawHorizontalLine(drawX, drawY + characterDefaultHeight, charWidth, underlineColor); - + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(drawX, drawY + characterDefaultHeight, charWidth, underlineColor); + } else { + rasterizer.drawHorizontalLine(drawX, drawY + characterDefaultHeight, charWidth, underlineColor); + } } else { - - Rasterizer.drawHorizontalLineAlpha(drawX, drawY + characterDefaultHeight, charWidth, underlineColor, opacity); + if (rasterizer == null) { + Rasterizer.drawHorizontalLineAlpha(drawX, drawY + characterDefaultHeight, charWidth, underlineColor, opacity); + } else { + rasterizer.drawHorizontalLineAlpha(drawX, drawY + characterDefaultHeight, charWidth, underlineColor, opacity); + } } } @@ -1178,10 +1208,18 @@ public void drawBasicString(String string, int x, int y) { int charWidth = characterScreenWidths[c]; if (strikethroughColor != -1) { - Rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } else { + rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } } if (underlineColor != -1) { - Rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + } else { + rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + } } x += charWidth; var5 = c; @@ -1262,10 +1300,18 @@ public void drawBasicStringLegacy(String string, int x, int y) { int charWidth = characterScreenWidths[c]; if (strikethroughColor != -1) { - Rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } else { + rasterizer.drawHorizontalLine(x, y + (int) ((double) characterDefaultHeight * 0.7D), charWidth, strikethroughColor); + } } if (underlineColor != -1) { - Rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + if (rasterizer == null) { + Rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + } else { + rasterizer.drawHorizontalLine(x, y + characterDefaultHeight + 1, charWidth, underlineColor); + } } x += charWidth; var5 = c; @@ -1284,74 +1330,107 @@ public void drawCharacterAlphaItalics(int character, int x, int y, int width, in } public void drawAlphaCharacter(byte[] characterPixels, int x, int y, int width, int height, int colour, int alpha) { - int rasterizerPixel = x + y * Rasterizer.destinationWidth; - int rasterizerPixelOffset = Rasterizer.destinationWidth - width; + int destinationWidth = getDestinationWidth(); + int[] viewportDimensions = getViewportDimensions(); + + int rasterizerPixel = x + y * destinationWidth; + int rasterizerPixelOffset = destinationWidth - width; int characterPixelOffset = 0; int characterPixel = 0; - if (y < Rasterizer.viewportTop) { - int yOffset = Rasterizer.viewportTop - y; + if (y < viewportDimensions[1]) { + int yOffset = viewportDimensions[1] - y; height -= yOffset; - y = Rasterizer.viewportTop; + y = viewportDimensions[1]; characterPixel += yOffset * width; - rasterizerPixel += yOffset * Rasterizer.destinationWidth; + rasterizerPixel += yOffset * destinationWidth; } - if (y + height >= Rasterizer.viewportBottom) - height -= y + height - Rasterizer.viewportBottom + 1; - if (x < Rasterizer.viewportLeft) { - int xOffset = Rasterizer.viewportLeft - x; + if (y + height >= viewportDimensions[3]) + height -= y + height - viewportDimensions[3] + 1; + if (x < viewportDimensions[0]) { + int xOffset = viewportDimensions[0] - x; width -= xOffset; - x = Rasterizer.viewportLeft; + x = viewportDimensions[0]; characterPixel += xOffset; rasterizerPixel += xOffset; characterPixelOffset += xOffset; rasterizerPixelOffset += xOffset; } - if (x + width >= Rasterizer.viewportRight) { - int widthoffset = x + width - Rasterizer.viewportRight + 1; + if (x + width >= viewportDimensions[2]) { + int widthoffset = x + width - viewportDimensions[2] + 1; width -= widthoffset; characterPixelOffset += widthoffset; rasterizerPixelOffset += widthoffset; } if (width > 0 && height > 0) { - drawCharacterPixelsAlpha(characterPixel, rasterizerPixelOffset, characterPixelOffset, rasterizerPixel, alpha, Rasterizer.destinationPixels, colour, height, width, characterPixels); + drawCharacterPixelsAlpha(characterPixel, rasterizerPixelOffset, characterPixelOffset, rasterizerPixel, alpha, getDestinationPixels(), colour, height, width, characterPixels); + } + } + + private int getDestinationWidth() { + if (rasterizer == null) { + return Rasterizer.destinationWidth; + } else { + return rasterizer.destinationWidth; + } + } + + private int[] getViewportDimensions() { + int[] output = new int[4]; + + if (rasterizer == null) { + Rasterizer.getViewportDimensions(output); + } else { + rasterizer.getViewportDimensions(output); + } + + return output; + } + + private int[] getDestinationPixels() { + if (rasterizer == null) { + return Rasterizer.destinationPixels; + } else { + return rasterizer.destinationPixels; } } public void drawAlphaCharacterItalics(byte[] characterPixels, int x, int y, int width, int height, int colour, int alpha) { - int rasterizerPixel = x + y * Rasterizer.destinationWidth; - int rasterizerPixelOffset = Rasterizer.destinationWidth - width; + int destinationWidth = getDestinationWidth(); + int[] viewportDimensions = getViewportDimensions(); + + int rasterizerPixel = x + y * destinationWidth; + int rasterizerPixelOffset = destinationWidth - width; int characterPixelOffset = 0; int characterPixel = 0; - if (y < Rasterizer.viewportTop) { - int yOffset = Rasterizer.viewportTop - y; + if (y < viewportDimensions[1]) { + int yOffset = viewportDimensions[1] - y; height -= yOffset; - y = Rasterizer.viewportTop; + y = viewportDimensions[1]; characterPixel += yOffset * width; - rasterizerPixel += yOffset * Rasterizer.destinationWidth; + rasterizerPixel += yOffset * destinationWidth; } - if (y + height >= Rasterizer.viewportBottom) - height -= y + height - Rasterizer.viewportBottom + 1; - if (x < Rasterizer.viewportLeft) { - int xOffset = Rasterizer.viewportLeft - x; + if (y + height >= viewportDimensions[3]) + height -= y + height - viewportDimensions[3] + 1; + if (x < viewportDimensions[0]) { + int xOffset = viewportDimensions[0] - x; width -= xOffset; - x = Rasterizer.viewportLeft; + x = viewportDimensions[0]; characterPixel += xOffset; rasterizerPixel += xOffset; characterPixelOffset += xOffset; rasterizerPixelOffset += xOffset; } - if (x + width >= Rasterizer.viewportRight) { - int widthoffset = x + width - Rasterizer.viewportRight + 1; + if (x + width >= viewportDimensions[2]) { + int widthoffset = x + width - viewportDimensions[2] + 1; width -= widthoffset; characterPixelOffset += widthoffset; rasterizerPixelOffset += widthoffset; } if (width > 0 && height > 0) { - drawCharacterPixelsAlphaItalics(characterPixel, rasterizerPixelOffset, characterPixelOffset, rasterizerPixel, alpha, Rasterizer.destinationPixels, colour, height, width, characterPixels); + drawCharacterPixelsAlphaItalics(characterPixel, rasterizerPixelOffset, characterPixelOffset, rasterizerPixel, alpha, getDestinationPixels(), colour, height, width, characterPixels); } } - public void drawCharacterPixelsAlpha(int characterPixel, int rasterizerPixelOffset, int characterPixelOffset, int rasterizerPixel, int alpha, int[] rasterizerPixels, int colour, int height, int width, byte[] characterPixels) { colour = ((colour & 0xff00ff) * alpha & 0xff00ff00) + ((colour & 0xff00) * alpha & 0xff0000) >> 8; alpha = 256 - alpha; From 0ee815862a70965fc9213494cc474080606586cc Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 21:29:40 +0100 Subject: [PATCH 30/45] refactor: rename Model draw methods --- .../runejs/client/media/renderable/Model.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/runejs/client/media/renderable/Model.java b/src/main/java/org/runejs/client/media/renderable/Model.java index 3c803caec..b18689f4c 100644 --- a/src/main/java/org/runejs/client/media/renderable/Model.java +++ b/src/main/java/org/runejs/client/media/renderable/Model.java @@ -846,7 +846,7 @@ public void renderAtPoint(int arg0, CameraRotation cameraRotation, int x, int z, } } try { - method815(bool, bool_18_, arg8); + draw(bool, bool_18_, arg8); } catch(Exception exception) { /* empty */ } @@ -901,7 +901,7 @@ public void drawOrthogonalModel(int arg0, int arg1, int arg2, int arg3, int arg4 } } try { - method815(false, false, 0); + draw(false, false, 0); } catch(Exception exception) { /* empty */ } @@ -1329,7 +1329,7 @@ public void drawModel(int rotationX, int rotationZ, int rotationY, int cameraPit } } try { - method815(false, false, 0); + draw(false, false, 0); } catch(Exception exception) { /* empty */ } @@ -1345,7 +1345,7 @@ public void method813() { } } - public void method814(int arg0) { + public void drawNearClippedFace(int arg0) { int i = Rasterizer3D.center_x; int i_148_ = Rasterizer3D.center_y; int i_149_ = 0; @@ -1488,7 +1488,7 @@ else if(i_177_ == 2) { } } - public void method815(boolean flag, boolean arg1, int arg2) { + public void draw(boolean flag, boolean arg1, int arg2) { if(diagonal3D < 1600) { for(int i = 0; i < diagonal3D; i++) anIntArray3200[i] = 0; @@ -1544,7 +1544,7 @@ public void method815(boolean flag, boolean arg1, int arg2) { if(i_216_ > 0) { int[] is = anIntArrayArray3210[i]; for(int i_217_ = 0; i_217_ < i_216_; i_217_++) - method823(is[i_217_]); + drawFace(is[i_217_]); } } } else { @@ -1598,7 +1598,7 @@ else if(i_221_ == 10) while(i_229_ == 0) { if(i_228_ <= i) break; - method823(is[i_225_++]); + drawFace(is[i_225_++]); if(i_225_ == i_226_ && is != anIntArrayArray3208[11]) { i_225_ = 0; i_226_ = anIntArray3226[11]; @@ -1613,7 +1613,7 @@ else if(i_221_ == 10) while(i_229_ == 3) { if(i_228_ <= i_223_) break; - method823(is[i_225_++]); + drawFace(is[i_225_++]); if(i_225_ == i_226_ && is != anIntArrayArray3208[11]) { i_225_ = 0; i_226_ = anIntArray3226[11]; @@ -1626,7 +1626,7 @@ else if(i_221_ == 10) i_228_ = -1000; } while(i_229_ == 5 && i_228_ > i_224_) { - method823(is[i_225_++]); + drawFace(is[i_225_++]); if(i_225_ == i_226_ && is != anIntArrayArray3208[11]) { i_225_ = 0; i_226_ = anIntArray3226[11]; @@ -1641,10 +1641,10 @@ else if(i_221_ == 10) int i_230_ = anIntArray3226[i_229_]; int[] is_231_ = anIntArrayArray3208[i_229_]; for(int i_232_ = 0; i_232_ < i_230_; i_232_++) - method823(is_231_[i_232_]); + drawFace(is_231_[i_232_]); } while(i_228_ != -1000) { - method823(is[i_225_++]); + drawFace(is[i_225_++]); if(i_225_ == i_226_ && is != anIntArrayArray3208[11]) { i_225_ = 0; is = anIntArrayArray3208[11]; @@ -1772,39 +1772,39 @@ public void method822() { } } - public void method823(int arg0) { - if(aBooleanArray3224[arg0]) - method814(arg0); + public void drawFace(int face) { + if(aBooleanArray3224[face]) + drawNearClippedFace(face); else { - int i = trianglePointsX[arg0]; - int i_237_ = trianglePointsY[arg0]; - int i_238_ = trianglePointsZ[arg0]; - Rasterizer3D.restrict_edges = aBooleanArray3201[arg0]; + int i = trianglePointsX[face]; + int i_237_ = trianglePointsY[face]; + int i_238_ = trianglePointsZ[face]; + Rasterizer3D.restrict_edges = aBooleanArray3201[face]; if(triangleAlphaValues == null) Rasterizer3D.alpha = 0; else - Rasterizer3D.alpha = triangleAlphaValues[arg0]; + Rasterizer3D.alpha = triangleAlphaValues[face]; int i_239_; if(triangleDrawType == null) i_239_ = 0; else - i_239_ = triangleDrawType[arg0] & 0x3; + i_239_ = triangleDrawType[face] & 0x3; if(i_239_ == 0) - Rasterizer3D.drawShadedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[arg0], triangleHSLB[arg0], triangleHSLC[arg0]); + Rasterizer3D.drawShadedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[face], triangleHSLB[face], triangleHSLC[face]); else if(i_239_ == 1) - Rasterizer3D.drawFlatTriangle(vertexScreenX[i], vertexScreenY[i], vertexScreenX[i_237_], vertexScreenY[i_237_], vertexScreenX[i_238_], vertexScreenY[i_238_], anIntArray3202[triangleHSLA[arg0]]); + Rasterizer3D.drawFlatTriangle(vertexScreenX[i], vertexScreenY[i], vertexScreenX[i_237_], vertexScreenY[i_237_], vertexScreenX[i_238_], vertexScreenY[i_238_], anIntArray3202[triangleHSLA[face]]); else if(i_239_ == 2) { - int i_240_ = triangleDrawType[arg0] >> 2; + int i_240_ = triangleDrawType[face] >> 2; int i_241_ = texturedTrianglePointsX[i_240_]; int i_242_ = texturedTrianglePointsY[i_240_]; int i_243_ = texturedTrianglePointsZ[i_240_]; - Rasterizer3D.drawTexturedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[arg0], triangleHSLB[arg0], triangleHSLC[arg0], anIntArray3225[i_241_], anIntArray3225[i_242_], anIntArray3225[i_243_], anIntArray3203[i_241_], anIntArray3203[i_242_], anIntArray3203[i_243_], anIntArray3223[i_241_], anIntArray3223[i_242_], anIntArray3223[i_243_], triangleColorValues[arg0]); + Rasterizer3D.drawTexturedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[face], triangleHSLB[face], triangleHSLC[face], anIntArray3225[i_241_], anIntArray3225[i_242_], anIntArray3225[i_243_], anIntArray3203[i_241_], anIntArray3203[i_242_], anIntArray3203[i_243_], anIntArray3223[i_241_], anIntArray3223[i_242_], anIntArray3223[i_243_], triangleColorValues[face]); } else if(i_239_ == 3) { - int i_244_ = triangleDrawType[arg0] >> 2; + int i_244_ = triangleDrawType[face] >> 2; int i_245_ = texturedTrianglePointsX[i_244_]; int i_246_ = texturedTrianglePointsY[i_244_]; int i_247_ = texturedTrianglePointsZ[i_244_]; - Rasterizer3D.drawTexturedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[arg0], triangleHSLA[arg0], triangleHSLA[arg0], anIntArray3225[i_245_], anIntArray3225[i_246_], anIntArray3225[i_247_], anIntArray3203[i_245_], anIntArray3203[i_246_], anIntArray3203[i_247_], anIntArray3223[i_245_], anIntArray3223[i_246_], anIntArray3223[i_247_], triangleColorValues[arg0]); + Rasterizer3D.drawTexturedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[face], triangleHSLA[face], triangleHSLA[face], anIntArray3225[i_245_], anIntArray3225[i_246_], anIntArray3225[i_247_], anIntArray3203[i_245_], anIntArray3203[i_246_], anIntArray3203[i_247_], anIntArray3223[i_245_], anIntArray3223[i_246_], anIntArray3223[i_247_], triangleColorValues[face]); } } } From 4eedccb976633f4af303b471620ae77f62911690 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 21:43:30 +0100 Subject: [PATCH 31/45] fix: reset bounds after draw --- src/main/java/org/runejs/client/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index d22044aea..5dfabea19 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -1034,6 +1034,7 @@ public static void drawGameScreen() { SoundSystem.updateObjectSounds(Player.localPlayer.worldX, Player.worldLevel, MovedStatics.anInt199, Player.localPlayer.worldY); MovedStatics.anInt199 = 0; + ScreenController.rasterizer.resetBounds(); } public static void displayMessageForResponseCode(int responseCode) { @@ -2205,7 +2206,6 @@ else if (gameStatusCode == 5) { MovedStatics.method940(English.loadingPleaseWait, false, null); } else if (gameStatusCode == 30) { drawGameScreen(); - } else if (gameStatusCode == 35) { method164(); } else if (gameStatusCode == 40) From 46eb24b372e5fc6ddef711ffdc68e930ed8a94d9 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 21:57:04 +0100 Subject: [PATCH 32/45] refactor: move lookup tables to Constants3D --- src/main/java/org/runejs/client/Game.java | 5 ++- .../client/cache/def/ItemDefinition.java | 5 ++- .../runejs/client/frame/ScreenController.java | 7 ++-- .../org/runejs/client/media/Constants3D.java | 38 ++++++++++++++++++ .../org/runejs/client/media/Rasterizer3D.java | 40 ++----------------- .../runejs/client/media/renderable/Model.java | 7 ++-- .../org/runejs/client/util/PerlinNoise.java | 4 +- 7 files changed, 57 insertions(+), 49 deletions(-) create mode 100644 src/main/java/org/runejs/client/media/Constants3D.java diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index 5dfabea19..eb0425c7b 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -13,6 +13,7 @@ import org.runejs.client.io.Buffer; import org.runejs.client.language.English; import org.runejs.client.language.Native; +import org.runejs.client.media.Constants3D; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.VertexNormal; import org.runejs.client.media.renderable.Model; @@ -518,8 +519,8 @@ else if (GameInterface.aBoolean2177) } Rasterizer3D.setBounds(absoluteX + gameInterface.originalWidth / 2, gameInterface.originalHeight / 2 + absoluteY); - int camHeight = modelZoom * Rasterizer3D.sinetable[rotationX] >> 16; - int camDistance = modelZoom * Rasterizer3D.cosinetable[rotationX] >> 16; + int camHeight = modelZoom * Constants3D.sinetable[rotationX] >> 16; + int camDistance = modelZoom * Constants3D.cosinetable[rotationX] >> 16; if (model != null) { if (gameInterface.isNewInterfaceFormat) { model.method799(); diff --git a/src/main/java/org/runejs/client/cache/def/ItemDefinition.java b/src/main/java/org/runejs/client/cache/def/ItemDefinition.java index f8e0283fc..bfcf2d003 100644 --- a/src/main/java/org/runejs/client/cache/def/ItemDefinition.java +++ b/src/main/java/org/runejs/client/cache/def/ItemDefinition.java @@ -4,6 +4,7 @@ import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.io.Buffer; import org.runejs.client.language.English; +import org.runejs.client.media.Constants3D; import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.renderable.Model; @@ -168,8 +169,8 @@ public static ImageRGB sprite(int stackSize, int id, int backColour) { if(backColour > 0) i_11_ *= 1.04; Rasterizer3D.notTextured = false; - int i_12_ = Rasterizer3D.sinetable[definition.xan2d] * i_11_ >> 16; - int i_13_ = i_11_ * Rasterizer3D.cosinetable[definition.xan2d] >> 16; + int i_12_ = Constants3D.sinetable[definition.xan2d] * i_11_ >> 16; + int i_13_ = i_11_ * Constants3D.cosinetable[definition.xan2d] >> 16; model.method799(); model.drawModel(0, definition.yan2d, definition.zan2d, definition.xan2d, definition.xOffset2d, definition.yOffset2d + model.modelHeight / 2 + i_12_, i_13_ + definition.yOffset2d); for(int i_14_ = 31; i_14_ >= 0; i_14_--) { diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index c090238bc..166cb989f 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -5,6 +5,7 @@ import org.runejs.client.input.MouseHandler; import org.runejs.client.language.English; import org.runejs.client.language.Native; +import org.runejs.client.media.Constants3D; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.actor.Pathfinding; @@ -124,7 +125,7 @@ public static void setBounds() { for (int i = 0; i < 9; i++) { int i_0_ = 15 + 32 * i + 128; int i_1_ = 3 * i_0_ + 600; - int i_2_ = Rasterizer3D.sinetable[i_0_]; + int i_2_ = Constants3D.sinetable[i_0_]; is[i] = i_2_ * i_1_ >> 16; } @@ -269,8 +270,8 @@ public static void handleMinimapMouse() { } } int angle = 0x7ff & Game.getMinimapRotation(); - int sin = Rasterizer3D.sinetable[angle]; - int cos = Rasterizer3D.cosinetable[angle]; + int sin = Constants3D.sinetable[angle]; + int cos = Constants3D.cosinetable[angle]; int zoom = 0; diff --git a/src/main/java/org/runejs/client/media/Constants3D.java b/src/main/java/org/runejs/client/media/Constants3D.java new file mode 100644 index 000000000..3e7a73b31 --- /dev/null +++ b/src/main/java/org/runejs/client/media/Constants3D.java @@ -0,0 +1,38 @@ +package org.runejs.client.media; + +public class Constants3D { + public static int[] cosinetable = new int[2048]; + public static int[] sinetable = new int[2048]; + /** + * Some kind of colour information, Dane calls this "reciprocal16" + */ + public static int[] anIntArray2929 = new int[2048]; + public static int[] shadowDecay = new int[512]; + + static { + for(int i = 1; i < 512; i++) { + Constants3D.shadowDecay[i] = 32768 / i; + } + for(int i = 1; i < 2048; i++) { + Constants3D.anIntArray2929[i] = 65536 / i; + } + for(int i = 0; i < 2048; i++) { + // Pre-calculate sin and cos to save memory + // + // Circumference / Cuts = Cut radians + // Cuts defines how many angles around the circle we want to store, so in this case: + // PI * 2 / 2048 = 0.0030679615 radians + // + // Furthermore, 65536 * x is something we call fixed point arithmetics. It is used to store decimals as an integer instead of a double. + // 65536 = 2^16, so 16 is the scaling factor + // The original value can be restored by dividing x by (2^scalingFactor) or just bit-shifting x right by the scaling factor + // Note that when bit-shifting, you lose all the decimals, and only get the whole number. This is the most common + // practice wherever the sin and cos tables are used in the client + // + // Also, don't forget your basic maths: sin(x) = the length of the opposite side, cos(x) = the length of the adjacent side + // sin(x) + cos(x) = r + Constants3D.sinetable[i] = (int) (65536.0 * Math.sin((double) i * 0.0030679615)); + Constants3D.cosinetable[i] = (int) (65536.0 * Math.cos((double) i * 0.0030679615)); + } + } +} diff --git a/src/main/java/org/runejs/client/media/Rasterizer3D.java b/src/main/java/org/runejs/client/media/Rasterizer3D.java index 630560de6..0aa4d65d2 100644 --- a/src/main/java/org/runejs/client/media/Rasterizer3D.java +++ b/src/main/java/org/runejs/client/media/Rasterizer3D.java @@ -3,13 +3,6 @@ import org.runejs.client.Interface3; public class Rasterizer3D extends Rasterizer { - /** - * Some kind of colour information, Dane calls this "reciprocal16" - */ - public static int[] anIntArray2929 = new int[2048]; - public static int[] cosinetable = new int[2048]; - public static int[] sinetable = new int[2048]; - public static int[] shadowDecay = new int[512]; public static boolean lowMemory = false; @@ -54,33 +47,6 @@ public class Rasterizer3D extends Rasterizer { public static boolean restrict_edges = false; private static boolean useLatestShadeLine = true; - static { - for(int i = 1; i < 512; i++) { - shadowDecay[i] = 32768 / i; - } - for(int i = 1; i < 2048; i++) { - anIntArray2929[i] = 65536 / i; - } - for(int i = 0; i < 2048; i++) { - // Pre-calculate sin and cos to save memory - // - // Circumference / Cuts = Cut radians - // Cuts defines how many angles around the circle we want to store, so in this case: - // PI * 2 / 2048 = 0.0030679615 radians - // - // Furthermore, 65536 * x is something we call fixed point arithmetics. It is used to store decimals as an integer instead of a double. - // 65536 = 2^16, so 16 is the scaling factor - // The original value can be restored by dividing x by (2^scalingFactor) or just bit-shifting x right by the scaling factor - // Note that when bit-shifting, you lose all the decimals, and only get the whole number. This is the most common - // practice wherever the sin and cos tables are used in the client - // - // Also, don't forget your basic maths: sin(x) = the length of the opposite side, cos(x) = the length of the adjacent side - // sin(x) + cos(x) = r - sinetable[i] = (int) (65536.0 * Math.sin((double) i * 0.0030679615)); - cosinetable[i] = (int) (65536.0 * Math.cos((double) i * 0.0030679615)); - } - } - public static void drawScanLine(int[] dest, int destOffset, int color, int startX, int endX) { // restrict_edges indicates if there's a need to restrict the drawing operation within certain boundaries (viewport) if(restrict_edges) { @@ -706,7 +672,7 @@ public static void drawTexturedLine(int[] dest, int[] texture, int dest_off, int } else { if(end_x - start_x > 7) { k3 = end_x - start_x >> 3; - j3 = (gradient - shadeValue) * shadowDecay[k3] >> 6; + j3 = (gradient - shadeValue) * Constants3D.shadowDecay[k3] >> 6; } else { k3 = 0; j3 = 0; @@ -1085,7 +1051,7 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e if(notTextured) { loops = endX - startX >> 2; if(loops > 0) { - off = (grad - colorIndex) * shadowDecay[loops] >> 15; + off = (grad - colorIndex) * Constants3D.shadowDecay[loops] >> 15; } else { off = 0; } @@ -1222,7 +1188,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end // Calculate the slope of the color gradient using the shadowDecay array if the line is long enough. // For very short lines (length less than or equal to 0), there is no gradient and the slope is zero. if(loops > 0) { - color_slope = (grad - color_index) * shadowDecay[loops] >> 15; + color_slope = (grad - color_index) * Constants3D.shadowDecay[loops] >> 15; } else { color_slope = 0; } diff --git a/src/main/java/org/runejs/client/media/renderable/Model.java b/src/main/java/org/runejs/client/media/renderable/Model.java index b18689f4c..7359e52fe 100644 --- a/src/main/java/org/runejs/client/media/renderable/Model.java +++ b/src/main/java/org/runejs/client/media/renderable/Model.java @@ -5,6 +5,7 @@ import org.runejs.client.cache.def.FramemapDefinition; import org.runejs.client.input.MouseHandler; import org.runejs.client.io.Buffer; +import org.runejs.client.media.Constants3D; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.VertexNormal; import org.runejs.client.Class40_Sub5_Sub15; @@ -65,14 +66,14 @@ public class Model extends Renderable { anIntArray3222 = new int[10]; anIntArray3219 = new int[2000]; anIntArray3223 = new int[4096]; - SINE = Rasterizer3D.sinetable; + SINE = Constants3D.sinetable; anIntArray3225 = new int[4096]; resourceCount = 0; anIntArray3227 = new int[10]; anIntArray3221 = new int[12]; - COSINE = Rasterizer3D.cosinetable; + COSINE = Constants3D.cosinetable; aBooleanArray3224 = new boolean[4096]; - anIntArray3228 = Rasterizer3D.anIntArray2929; + anIntArray3228 = Constants3D.anIntArray2929; anIntArray3226 = new int[12]; int i = 0; int i_322_ = 248; diff --git a/src/main/java/org/runejs/client/util/PerlinNoise.java b/src/main/java/org/runejs/client/util/PerlinNoise.java index 13cdd2214..bdbed0562 100644 --- a/src/main/java/org/runejs/client/util/PerlinNoise.java +++ b/src/main/java/org/runejs/client/util/PerlinNoise.java @@ -1,6 +1,6 @@ package org.runejs.client.util; -import org.runejs.client.media.Rasterizer3D; +import org.runejs.client.media.Constants3D; /** * Perlin noise, used in the client for procedural terrain heightmap. @@ -23,7 +23,7 @@ public static int get(int x, int y, int scale) { private static int interpolateForPerlin(int arg0, int arg1, int arg2, boolean arg3, int arg4) { if (!arg3) return -109; - int i = 65536 + -Rasterizer3D.cosinetable[1024 * arg4 / arg1] >> 1; + int i = 65536 + -Constants3D.cosinetable[1024 * arg4 / arg1] >> 1; return ((65536 + -i) * arg0 >> 16) + (arg2 * i >> 16); } From 889aaacaea337124daa182737c12505f949e5cdc Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 22:01:38 +0100 Subject: [PATCH 33/45] refactor: create Palette class to store color palette --- .../java/org/runejs/client/Landscape.java | 6 +- src/main/java/org/runejs/client/Texture.java | 3 +- .../org/runejs/client/media/ColorUtils.java | 19 +++ .../java/org/runejs/client/media/Palette.java | 89 +++++++++++++ .../org/runejs/client/media/Rasterizer3D.java | 119 +++--------------- .../runejs/client/media/renderable/Model.java | 8 +- 6 files changed, 130 insertions(+), 114 deletions(-) create mode 100644 src/main/java/org/runejs/client/media/ColorUtils.java create mode 100644 src/main/java/org/runejs/client/media/Palette.java diff --git a/src/main/java/org/runejs/client/Landscape.java b/src/main/java/org/runejs/client/Landscape.java index fafbdbb03..12fc0755a 100644 --- a/src/main/java/org/runejs/client/Landscape.java +++ b/src/main/java/org/runejs/client/Landscape.java @@ -513,7 +513,7 @@ private void createRegion(CollisionMap[] collisionMaps) { } int underlayMinimapColour = 0; if(hslBitsetRandomised != -1) - underlayMinimapColour = Rasterizer3D.hsl2rgb[mixLightness(hslBitsetRandomised, 96)]; + underlayMinimapColour = Rasterizer3D.palette.hsl2rgb[mixLightness(hslBitsetRandomised, 96)]; if(overlayId != 0) { int shape = 1 + tile_underlay_path[_plane][x][y]; byte rotation = tile_overlay_rotation[_plane][x][y]; @@ -540,7 +540,7 @@ else if(s > 255) } int rgb = 0; if(overlayMinimapColour != -2) - rgb = Rasterizer3D.hsl2rgb[MovedStatics.mixLightnessSigned(overlayMinimapColour, 96)]; + rgb = Rasterizer3D.palette.hsl2rgb[MovedStatics.mixLightnessSigned(overlayMinimapColour, 96)]; if(overlayDefinition.secondaryColor != -1) { int i_54_ = 0xff & randomiserHue + overlayDefinition.otherHue; int i_55_ = overlayDefinition.otherSaturation + randomiserLightness; @@ -550,7 +550,7 @@ else if(s > 255) } else i_55_ = 0; overlayMinimapColour = generateHslBitset(overlayDefinition.otherLightness, i_55_, i_54_); - rgb = Rasterizer3D.hsl2rgb[MovedStatics.mixLightnessSigned(overlayMinimapColour, 96)]; + rgb = Rasterizer3D.palette.hsl2rgb[MovedStatics.mixLightnessSigned(overlayMinimapColour, 96)]; } this.scene.addTile(_plane, x, y, shape, rotation, textureId, vertexHeightSW, vertexHeightSE, vertexHeightNE, vertexHeightNW, mixLightness(hslBitsetOriginal, lightIntensitySW), mixLightness(hslBitsetOriginal, lightIntensitySE), mixLightness(hslBitsetOriginal, lightIntensityNE), mixLightness(hslBitsetOriginal, lightIntensityNW), MovedStatics.mixLightnessSigned(hslBitset, lightIntensitySW), MovedStatics.mixLightnessSigned(hslBitset, lightIntensitySE), MovedStatics.mixLightnessSigned(hslBitset, lightIntensityNE), MovedStatics.mixLightnessSigned(hslBitset, lightIntensityNW), underlayMinimapColour, rgb); } else diff --git a/src/main/java/org/runejs/client/Texture.java b/src/main/java/org/runejs/client/Texture.java index 0a3ad65cf..faa50578a 100644 --- a/src/main/java/org/runejs/client/Texture.java +++ b/src/main/java/org/runejs/client/Texture.java @@ -2,6 +2,7 @@ import org.runejs.client.cache.CacheArchive; import org.runejs.client.cache.media.IndexedImage; +import org.runejs.client.media.ColorUtils; import org.runejs.client.node.Node; import org.runejs.client.io.Buffer; import org.runejs.client.media.Rasterizer3D; @@ -136,7 +137,7 @@ public boolean method869(double arg0, int textureSize, CacheArchive imageArchive } } for(int i_19_ = 0; i_19_ < imgPalette.length; i_19_++) - imgPalette[i_19_] = Rasterizer3D.adjustBrightness(imgPalette[i_19_], arg0); + imgPalette[i_19_] = ColorUtils.adjustBrightness(imgPalette[i_19_], arg0); int i_20_; if(i_12_ == 0) i_20_ = 0; diff --git a/src/main/java/org/runejs/client/media/ColorUtils.java b/src/main/java/org/runejs/client/media/ColorUtils.java new file mode 100644 index 000000000..f7734bf3a --- /dev/null +++ b/src/main/java/org/runejs/client/media/ColorUtils.java @@ -0,0 +1,19 @@ +package org.runejs.client.media; + +public class ColorUtils { + public static int adjustBrightness(int rgb, double brightness) { + double r = (double) (rgb >> 16) / 256.0; + double g = (double) (rgb >> 8 & 0xff) / 256.0; + double b = (double) (rgb & 0xff) / 256.0; + + r = Math.pow(r, brightness); + g = Math.pow(g, brightness); + b = Math.pow(b, brightness); + + int outR = (int) (r * 256.0); + int outG = (int) (g * 256.0); + int outB = (int) (b * 256.0); + + return (outR << 16) + (outG << 8) + outB; + } +} diff --git a/src/main/java/org/runejs/client/media/Palette.java b/src/main/java/org/runejs/client/media/Palette.java new file mode 100644 index 000000000..62b5f5466 --- /dev/null +++ b/src/main/java/org/runejs/client/media/Palette.java @@ -0,0 +1,89 @@ +package org.runejs.client.media; + +public class Palette { + public final int[] hsl2rgb; + + public Palette(int[] hsl2rgb) { + this.hsl2rgb = hsl2rgb; + } + + public static Palette create(double brightness) { + int[] hsl2rgb = new int[65536]; + + brightness += Math.random() * 0.03 - 0.015; + int index = 0; + + for(int y = 0; y < 512; y++) { + double hue = (double) (y >> 3) / 64.0 + 0.0078125; + double lightness = (double) (y & 0x7) / 8.0 + 0.0625; + + for(int x = 0; x < 128; x++) { + double intensity = (double) x / 128.0; + double red = intensity; + double green = intensity; + double blue = intensity; + + if(lightness != 0.0) { + double a; + if(intensity < 0.5) { + a = intensity * (1.0 + lightness); + } else { + a = intensity + lightness - intensity * lightness; + } + double b = 2.0 * intensity - a; + double fRed = hue + 0.3333333333333333; + if(fRed > 1.0) { + fRed--; + } + double fGreen = hue; + double fBlue = hue - 0.3333333333333333; + if(fBlue < 0.0) { + fBlue++; + } + if(6.0 * fRed < 1.0) { + red = b + (a - b) * 6.0 * fRed; + } else if(2.0 * fRed < 1.0) { + red = a; + } else if(3.0 * fRed < 2.0) { + red = b + (a - b) * (0.6666666666666666 - fRed) * 6.0; + } else { + red = b; + } + if(6.0 * fGreen < 1.0) { + green = b + (a - b) * 6.0 * fGreen; + } else if(2.0 * fGreen < 1.0) { + green = a; + } else if(3.0 * fGreen < 2.0) { + green = b + (a - b) * (0.6666666666666666 - fGreen) * 6.0; + } else { + green = b; + } + if(6.0 * fBlue < 1.0) { + blue = b + (a - b) * 6.0 * fBlue; + } else if(2.0 * fBlue < 1.0) { + blue = a; + } else if(3.0 * fBlue < 2.0) { + blue = b + (a - b) * (0.6666666666666666 - fBlue) * 6.0; + } else { + blue = b; + } + } + + int outR = ((int) (red * 256.0) << 16); + int outG = ((int) (green * 256.0) << 8); + int outB = ((int) (blue * 256.0)); + + int rgb = outR | outG | outB; + rgb = ColorUtils.adjustBrightness(rgb, brightness); + + if(rgb == 0) { + rgb = 1; + } + + hsl2rgb[index++] = rgb; + } + } + + return new Palette(hsl2rgb); + } +} diff --git a/src/main/java/org/runejs/client/media/Rasterizer3D.java b/src/main/java/org/runejs/client/media/Rasterizer3D.java index 0aa4d65d2..100993ed5 100644 --- a/src/main/java/org/runejs/client/media/Rasterizer3D.java +++ b/src/main/java/org/runejs/client/media/Rasterizer3D.java @@ -5,11 +5,10 @@ public class Rasterizer3D extends Rasterizer { public static boolean lowMemory = false; - + public static Palette palette; public static int bottomY; public static int center_y; - public static int[] hsl2rgb = new int[65536]; public static int alpha = 0; /** * x position/size info of some kind @@ -1058,7 +1057,7 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e if(alpha == 0) { if(loops > 0) { do { - color = hsl2rgb[colorIndex >> 8]; + color = palette.hsl2rgb[colorIndex >> 8]; colorIndex += off; dest[++dest_off] = color; dest[++dest_off] = color; @@ -1068,7 +1067,7 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e } loops = endX - startX & 0x3; if(loops > 0) { - color = hsl2rgb[colorIndex >> 8]; + color = palette.hsl2rgb[colorIndex >> 8]; do { dest[++dest_off] = color; } while(--loops > 0); @@ -1078,7 +1077,7 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e int dest_alpha = 256 - alpha; if(loops > 0) { do { - color = hsl2rgb[colorIndex >> 8]; + color = palette.hsl2rgb[colorIndex >> 8]; colorIndex += off; color = ((color & 0xff00ff) * dest_alpha >> 8 & 0xff00ff) + ((color & 0xff00) * dest_alpha >> 8 & 0xff00); int i_169_ = dest[++dest_off]; @@ -1093,7 +1092,7 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e } loops = endX - startX & 0x3; if(loops > 0) { - color = hsl2rgb[colorIndex >> 8]; + color = palette.hsl2rgb[colorIndex >> 8]; color = ((color & 0xff00ff) * dest_alpha >> 8 & 0xff00ff) + ((color & 0xff00) * dest_alpha >> 8 & 0xff00); do { int i_170_ = dest[++dest_off]; @@ -1105,14 +1104,14 @@ public static void drawShadedLine562(int dest[], int dest_off, int startX, int e loops = endX - startX; if(alpha == 0) { do { - dest[++dest_off] = hsl2rgb[colorIndex >> 8]; + dest[++dest_off] = palette.hsl2rgb[colorIndex >> 8]; colorIndex += off; } while(--loops > 0); } else { int i = alpha; int i_171_ = 256 - alpha; do { - color = hsl2rgb[colorIndex >> 8]; + color = palette.hsl2rgb[colorIndex >> 8]; colorIndex += off; color = ((color & 0xff00ff) * i_171_ >> 8 & 0xff00ff) + ((color & 0xff00) * i_171_ >> 8 & 0xff00); int i_ = dest[++dest_off]; @@ -1199,7 +1198,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end // Repeat for each 4-pixel chunk in the line. while(--loops >= 0) { // Convert the color index to an RGB color. - color = hsl2rgb[color_index >> 8]; + color = palette.hsl2rgb[color_index >> 8]; // Adjust the color index for the next iteration using the color slope. color_index += color_slope; @@ -1216,7 +1215,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end // If there are remaining pixels, paint them as well. if(loops > 0) { - color = hsl2rgb[color_index >> 8]; + color = palette.hsl2rgb[color_index >> 8]; do { dest[dest_off++] = color; } while(--loops > 0); @@ -1230,7 +1229,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end // Repeat for the number of 4-pixel chunks in the line. while(--loops >= 0) { // Convert the color index to an RGB color. - color = hsl2rgb[color_index >> 8]; + color = palette.hsl2rgb[color_index >> 8]; // Adjust the color index for the next iteration using the color slope. color_index += color_slope; @@ -1252,7 +1251,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end // If there are remaining pixels, paint them as well. if(loops > 0) { - color = hsl2rgb[color_index >> 8]; + color = palette.hsl2rgb[color_index >> 8]; // Apply alpha transparency again as we just re-retrieved the color color = ((color & 0xff00ff) * dest_alpha >> 8 & 0xff00ff) + ((color & 0xff00) * dest_alpha >> 8 & 0xff00); @@ -1295,7 +1294,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end if(alpha == 0) { do { // Paint the pixel with the color corresponding to the current color index. - dest[dest_off++] = hsl2rgb[color_index >> 8]; + dest[dest_off++] = palette.hsl2rgb[color_index >> 8]; // Adjust the color index for the next pixel. color_index += color_slope; } while(--loops > 0); // Repeat for the number of pixels in the line (no chunking) @@ -1305,7 +1304,7 @@ public static void drawShadedLine(int[] dest, int dest_off, int start_x, int end int i_44_ = 256 - alpha; do { // Calculate the color for the current pixel. - color = hsl2rgb[color_index >> 8]; + color = palette.hsl2rgb[color_index >> 8]; // Adjust the color index for the next pixel. color_index += color_slope; @@ -1752,22 +1751,6 @@ public static void drawShadedTriangle(int a_y, int b_y, int c_y, int a_x, int b_ } } - public static int adjustBrightness(int rgb, double brightness) { - double r = (double) (rgb >> 16) / 256.0; - double g = (double) (rgb >> 8 & 0xff) / 256.0; - double b = (double) (rgb & 0xff) / 256.0; - - r = Math.pow(r, brightness); - g = Math.pow(g, brightness); - b = Math.pow(b, brightness); - - int outR = (int) (r * 256.0); - int outG = (int) (g * 256.0); - int outB = (int) (b * 256.0); - - return (outR << 16) + (outG << 8) + outB; - } - public static int[] setLineOffsets(int[] arg0) { return method700(Rasterizer.viewportLeft, Rasterizer.viewportTop, Rasterizer.viewportRight, Rasterizer.viewportBottom, arg0); } @@ -1795,7 +1778,7 @@ public static void setBounds(int arg0, int arg1) { } public static void createPalette(double brightness) { - createPalette(brightness, 512); + palette = Palette.create(brightness); } public static void drawFlatTriangle(int a_x, int a_y, int b_x, int b_y, int c_x, int c_y, int colour) { @@ -2140,79 +2123,5 @@ public static int[] getLineOffsets() { return lineOffsets; } - public static void createPalette(double brightness, int const_512) { - brightness += Math.random() * 0.03 - 0.015; - int index = 0; - - for(int y = 0; y < const_512; y++) { - double hue = (double) (y >> 3) / 64.0 + 0.0078125; - double lightness = (double) (y & 0x7) / 8.0 + 0.0625; - - for(int x = 0; x < 128; x++) { - double intensity = (double) x / 128.0; - double red = intensity; - double green = intensity; - double blue = intensity; - - if(lightness != 0.0) { - double a; - if(intensity < 0.5) { - a = intensity * (1.0 + lightness); - } else { - a = intensity + lightness - intensity * lightness; - } - double b = 2.0 * intensity - a; - double fRed = hue + 0.3333333333333333; - if(fRed > 1.0) { - fRed--; - } - double fGreen = hue; - double fBlue = hue - 0.3333333333333333; - if(fBlue < 0.0) { - fBlue++; - } - if(6.0 * fRed < 1.0) { - red = b + (a - b) * 6.0 * fRed; - } else if(2.0 * fRed < 1.0) { - red = a; - } else if(3.0 * fRed < 2.0) { - red = b + (a - b) * (0.6666666666666666 - fRed) * 6.0; - } else { - red = b; - } - if(6.0 * fGreen < 1.0) { - green = b + (a - b) * 6.0 * fGreen; - } else if(2.0 * fGreen < 1.0) { - green = a; - } else if(3.0 * fGreen < 2.0) { - green = b + (a - b) * (0.6666666666666666 - fGreen) * 6.0; - } else { - green = b; - } - if(6.0 * fBlue < 1.0) { - blue = b + (a - b) * 6.0 * fBlue; - } else if(2.0 * fBlue < 1.0) { - blue = a; - } else if(3.0 * fBlue < 2.0) { - blue = b + (a - b) * (0.6666666666666666 - fBlue) * 6.0; - } else { - blue = b; - } - } - - int outR = ((int) (red * 256.0) << 16); - int outG = ((int) (green * 256.0) << 8); - int outB = ((int) (blue * 256.0)); - - int rgb = outR | outG | outB; - rgb = adjustBrightness(rgb, brightness); - if(rgb == 0) { - rgb = 1; - } - - hsl2rgb[index++] = rgb; - } - } - } } diff --git a/src/main/java/org/runejs/client/media/renderable/Model.java b/src/main/java/org/runejs/client/media/renderable/Model.java index 7359e52fe..c15c9c9e7 100644 --- a/src/main/java/org/runejs/client/media/renderable/Model.java +++ b/src/main/java/org/runejs/client/media/renderable/Model.java @@ -19,7 +19,6 @@ public class Model extends Renderable { public static int[] anIntArray3199; public static int[] anIntArray3200 = new int[1600]; public static boolean[] aBooleanArray3201; - public static int[] anIntArray3202; public static int[] anIntArray3203; public static int[] vertexScreenY; public static int[] anIntArray3205; @@ -61,7 +60,6 @@ public class Model extends Renderable { vertexScreenZ = new int[4096]; anIntArray3214 = new int[1]; anIntArray3216 = new int[2000]; - anIntArray3202 = Rasterizer3D.hsl2rgb; vertexScreenX = new int[4096]; anIntArray3222 = new int[10]; anIntArray3219 = new int[2000]; @@ -1441,7 +1439,7 @@ public void drawNearClippedFace(int arg0) { if(i_177_ == 0) Rasterizer3D.drawShadedTriangle(i_174_, i_175_, i_176_, i_171_, i_172_, i_173_, anIntArray3222[0], anIntArray3222[1], anIntArray3222[2]); else if(i_177_ == 1) - Rasterizer3D.drawFlatTriangle(i_171_, i_174_, i_172_, i_175_, i_173_, i_176_, anIntArray3202[triangleHSLA[arg0]]); + Rasterizer3D.drawFlatTriangle(i_171_, i_174_, i_172_, i_175_, i_173_, i_176_, Rasterizer3D.palette.hsl2rgb[triangleHSLA[arg0]]); else if(i_177_ == 2) { int i_178_ = triangleDrawType[arg0] >> 2; int i_179_ = texturedTrianglePointsX[i_178_]; @@ -1468,7 +1466,7 @@ else if(i_177_ == 2) { Rasterizer3D.drawShadedTriangle(i_174_, i_175_, i_176_, i_171_, i_172_, i_173_, anIntArray3222[0], anIntArray3222[1], anIntArray3222[2]); Rasterizer3D.drawShadedTriangle(i_174_, i_176_, anIntArray3205[3], i_171_, i_173_, anIntArray3227[3], anIntArray3222[0], anIntArray3222[2], anIntArray3222[3]); } else if(i_186_ == 1) { - int i_187_ = anIntArray3202[triangleHSLA[arg0]]; + int i_187_ = Rasterizer3D.palette.hsl2rgb[triangleHSLA[arg0]]; Rasterizer3D.drawFlatTriangle(i_171_, i_174_, i_172_, i_175_, i_173_, i_176_, i_187_); Rasterizer3D.drawFlatTriangle(i_171_, i_174_, i_173_, i_176_, anIntArray3227[3], anIntArray3205[3], i_187_); } else if(i_186_ == 2) { @@ -1793,7 +1791,7 @@ public void drawFace(int face) { if(i_239_ == 0) Rasterizer3D.drawShadedTriangle(vertexScreenY[i], vertexScreenY[i_237_], vertexScreenY[i_238_], vertexScreenX[i], vertexScreenX[i_237_], vertexScreenX[i_238_], triangleHSLA[face], triangleHSLB[face], triangleHSLC[face]); else if(i_239_ == 1) - Rasterizer3D.drawFlatTriangle(vertexScreenX[i], vertexScreenY[i], vertexScreenX[i_237_], vertexScreenY[i_237_], vertexScreenX[i_238_], vertexScreenY[i_238_], anIntArray3202[triangleHSLA[face]]); + Rasterizer3D.drawFlatTriangle(vertexScreenX[i], vertexScreenY[i], vertexScreenX[i_237_], vertexScreenY[i_237_], vertexScreenX[i_238_], vertexScreenY[i_238_], Rasterizer3D.palette.hsl2rgb[triangleHSLA[face]]); else if(i_239_ == 2) { int i_240_ = triangleDrawType[face] >> 2; int i_241_ = texturedTrianglePointsX[i_240_]; From a87da62b384eaf9d6f73a9e257801159faa15913 Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 22:02:49 +0100 Subject: [PATCH 34/45] refactor: don't make Rasterizer3D extend Rasterizer --- .../java/org/runejs/client/frame/ScreenController.java | 7 ++++--- src/main/java/org/runejs/client/media/Rasterizer3D.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 166cb989f..099f0d387 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -6,6 +6,7 @@ import org.runejs.client.language.English; import org.runejs.client.language.Native; import org.runejs.client.media.Constants3D; +import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.actor.Pathfinding; @@ -111,14 +112,14 @@ public static void setBounds() { renderer.setDrawSize(drawWidth, drawHeight); - Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 512 : drawWidth, frameMode == ScreenMode.FIXED ? 334 : drawHeight); + Rasterizer.prepare(null, frameMode == ScreenMode.FIXED ? 512 : drawWidth, frameMode == ScreenMode.FIXED ? 334 : drawHeight); MovedStatics.fullScreenTextureArray = Rasterizer3D.setLineOffsets(null); - Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 479 : drawWidth, frameMode == ScreenMode.FIXED ? 96 : drawHeight); + Rasterizer.prepare(null, frameMode == ScreenMode.FIXED ? 479 : drawWidth, frameMode == ScreenMode.FIXED ? 96 : drawHeight); // TODO rethink this, maybe its way easier than this // MovedStatics.chatboxLineOffsets = Rasterizer3D.setLineOffsets(null); // Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 190 : drawWidth, frameMode == ScreenMode.FIXED ? 261 : drawHeight); MovedStatics.sidebarOffsets = Rasterizer3D.setLineOffsets(null); - Rasterizer3D.prepare(null, frameMode == ScreenMode.FIXED ? 765 : drawWidth, frameMode == ScreenMode.FIXED ? 503 : drawHeight); + Rasterizer.prepare(null, frameMode == ScreenMode.FIXED ? 765 : drawWidth, frameMode == ScreenMode.FIXED ? 503 : drawHeight); Player.viewportOffsets = Rasterizer3D.setLineOffsets(null); int[] is = new int[9]; diff --git a/src/main/java/org/runejs/client/media/Rasterizer3D.java b/src/main/java/org/runejs/client/media/Rasterizer3D.java index 100993ed5..5351c3ad5 100644 --- a/src/main/java/org/runejs/client/media/Rasterizer3D.java +++ b/src/main/java/org/runejs/client/media/Rasterizer3D.java @@ -2,7 +2,7 @@ import org.runejs.client.Interface3; -public class Rasterizer3D extends Rasterizer { +public class Rasterizer3D { public static boolean lowMemory = false; public static Palette palette; From ac4041e8d35ed8c98e85a137f4b77cb7dba19ecb Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 22:06:03 +0100 Subject: [PATCH 35/45] refactor: rename to decapitalise Rasterizer (for easier searching) --- .../runejs/client/frame/MinimapRenderer.java | 36 +++++------ .../client/frame/ResizableFrameRenderer.java | 45 +++++++------- .../runejs/client/frame/tab/TabProducer.java | 59 +++++++++---------- 3 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/MinimapRenderer.java b/src/main/java/org/runejs/client/frame/MinimapRenderer.java index 36f09bb94..66d3e9fe5 100644 --- a/src/main/java/org/runejs/client/frame/MinimapRenderer.java +++ b/src/main/java/org/runejs/client/frame/MinimapRenderer.java @@ -26,7 +26,7 @@ public class MinimapRenderer extends FramePieceRenderer { * To avoid flickering, we draw to a temporary rasterizer first, * then flush this to the output rasterizer at once, in its entirety. */ - private RasterizerInstanced tempRasterizer; + private RasterizerInstanced rasterizerTemp; public MinimapRenderer() { super( @@ -46,7 +46,7 @@ public MinimapRenderer() { resizableMinimapOffsets2[i] = 0; } - tempRasterizer = new RasterizerInstanced( + rasterizerTemp = new RasterizerInstanced( MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas) ); } @@ -81,20 +81,20 @@ public void RenderResizableMiniMapArea(int x, int y) { shapeImageToPixels(Minimap.minimapImage,5, 5, 200, 200, i, i_8_, i_9_, minimapZoom + 256, resizableMinimapOffsets2, resizableMinimapOffsets1); drawResizableMinimapDots(); - tempRasterizer.drawFilledRectangle(105, 105, 3, 3, 16777215); - tempRasterizer.drawFilledRectangle(0, 0, 210, 5, 0x242017); - tempRasterizer.drawFilledRectangle(0, 205, 210, 5, 0x242017); - tempRasterizer.drawFilledRectangle(0, 0, 5, 210, 0x242017); - tempRasterizer.drawFilledRectangle(205, 0, 5, 210, 0x242017); + rasterizerTemp.drawFilledRectangle(105, 105, 3, 3, 16777215); + rasterizerTemp.drawFilledRectangle(0, 0, 210, 5, 0x242017); + rasterizerTemp.drawFilledRectangle(0, 205, 210, 5, 0x242017); + rasterizerTemp.drawFilledRectangle(0, 0, 5, 210, 0x242017); + rasterizerTemp.drawFilledRectangle(205, 0, 5, 210, 0x242017); // Rasterizer.drawFilledRectangle(x-43,y, 43, 43, 0x242017); - tempRasterizer.drawFilledRectangle(0, 0, 20, 42, 0x242017); - tempRasterizer.drawFilledRectangle(0, 0, 42, 20, 0x242017); + rasterizerTemp.drawFilledRectangle(0, 0, 20, 42, 0x242017); + rasterizerTemp.drawFilledRectangle(0, 0, 42, 20, 0x242017); - tempRasterizer.drawCircle(21, 21, 20, 0x242017); + rasterizerTemp.drawCircle(21, 21, 20, 0x242017); shapeImageToPixels(Minimap.minimapCompass, 5, 5, 33, 33, 25, 25, Game.getMinimapRotation(), 256, resizableCompasOffsets2, resizableCompasOffsets1); - System.arraycopy(tempRasterizer.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); + System.arraycopy(rasterizerTemp.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); // Class65.method1018(); // ScreenController.drawFramePiece(resizableMiniMapimage, x, y); @@ -113,7 +113,7 @@ private void shapeImageToPixels(ImageRGB image, int x, int y, int width, int hei cosine = cosine * zoom >> 8; int i_125_ = (arg4 << 16) + centerY * sine + centerX * cosine; int i_126_ = (arg5 << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * tempRasterizer.destinationWidth; + int destinationOffset = x + y * rasterizerTemp.destinationWidth; for(y = 0; y < height; y++) { int i_128_ = arg8[y]; @@ -126,13 +126,13 @@ private void shapeImageToPixels(ImageRGB image, int x, int y, int width, int hei if(!(image.pixels.length < pixelToGet || pixelToGet < 0)){ colour = image.pixels[pixelToGet]; } - tempRasterizer.destinationPixels[i_129_++] = colour; + rasterizerTemp.destinationPixels[i_129_++] = colour; i_130_ += cosine; i_131_ -= sine; } i_125_ += sine; i_126_ += cosine; - destinationOffset += tempRasterizer.destinationWidth; + destinationOffset += rasterizerTemp.destinationWidth; } } catch(Exception exception) { /* empty */ @@ -233,7 +233,7 @@ public void drawOnResizableMinimap(int x, int y, ImageRGB sprite) { cosine = cosine * 256 / (zoom + 256); int i_3_ = cosine * x + y * sine >> 16; int i_4_ = -(x * sine) + cosine * y >> 16; - tempRasterizer.drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); + rasterizerTemp.drawImage(sprite, 106 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 106); } public void drawMinimapMark(ImageRGB sprite, int mapX, int mapY) { @@ -267,7 +267,7 @@ private void drawRotated(ImageRGB image, int x, int y, int pivotX, int pivotY, i cosine = cosine * zoom >> 8; int sourceOffsetX = (pivotX << 16) + centerY * sine + centerX * cosine; int sourceoffsetY = (pivotY << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * tempRasterizer.destinationWidth; + int destinationOffset = x + y * rasterizerTemp.destinationWidth; for(y = 0; y < height; y++) { int i = destinationOffset; int offsetX = sourceOffsetX; @@ -275,7 +275,7 @@ private void drawRotated(ImageRGB image, int x, int y, int pivotX, int pivotY, i for(x = -width; x < 0; x++) { int i_166_ = image.pixels[(offsetX >> 16) + (offsetY >> 16) * image.imageWidth]; if(i_166_ != 0) - tempRasterizer.destinationPixels[i++] = i_166_; + rasterizerTemp.destinationPixels[i++] = i_166_; else i++; offsetX += cosine; @@ -283,7 +283,7 @@ private void drawRotated(ImageRGB image, int x, int y, int pivotX, int pivotY, i } sourceOffsetX += sine; sourceoffsetY += cosine; - destinationOffset += tempRasterizer.destinationWidth; + destinationOffset += rasterizerTemp.destinationWidth; } } catch(Exception exception) { /* empty */ diff --git a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java index 88f05f6af..78148b5d8 100644 --- a/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java +++ b/src/main/java/org/runejs/client/frame/ResizableFrameRenderer.java @@ -3,7 +3,6 @@ import org.runejs.client.Game; import org.runejs.client.MovedStatics; import org.runejs.client.frame.tab.TabProducer; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; public class ResizableFrameRenderer implements FrameRenderer { @@ -18,13 +17,13 @@ public class ResizableFrameRenderer implements FrameRenderer { private boolean canDraw; private boolean shouldStop = false; - private RasterizerInstanced gameRasterizer; + private RasterizerInstanced rasterizer; - public ResizableFrameRenderer(RasterizerInstanced gameRasterizer) { + public ResizableFrameRenderer(RasterizerInstanced rasterizer) { drawingThread = new Thread(this); drawingThread.start(); - this.gameRasterizer = gameRasterizer; + this.rasterizer = rasterizer; } @Override @@ -49,9 +48,9 @@ public void setDrawSize(int drawWidth, int drawHeight) { } private void drawToScreen() { - minimap.draw(this.gameRasterizer, drawWidth, drawHeight); - tabProducer.draw(this.gameRasterizer, drawWidth, drawHeight); - chatbox.draw(this.gameRasterizer, drawWidth, drawHeight); + minimap.draw(this.rasterizer, drawWidth, drawHeight); + tabProducer.draw(this.rasterizer, drawWidth, drawHeight); + chatbox.draw(this.rasterizer, drawWidth, drawHeight); } /** @@ -67,39 +66,39 @@ private void drawDebugView(int mX, int mY) { int[] tabInterFaceTop = tabProducer.getTopBarCoordSize(drawWidth - 241, drawHeight - (334)); int[] tabInterFaceBottom = tabProducer.getBottomBarCoordSize(drawWidth - 241, drawHeight - (334)); if (isCoordinatesIn3dScreen(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); + rasterizer.drawFilledRectangleAlpha(0, 0, drawWidth, drawHeight, 0xFF00FF, 90); } if (isCoordinatesInExtendedTabArea(mX, mY) && !isCoordinatesInTabArea(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceTop[0], tabInterFaceTop[1], tabInterFaceTop[2], tabInterFaceTop[3], 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceBottom[0], tabInterFaceBottom[1], tabInterFaceBottom[2], tabInterFaceBottom[3], 0x0000FF, 90); } if (isCoordinatesInTabArea(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(tabInterFaceCoords[0], tabInterFaceCoords[1], MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, 0x0000FF, 90); } if (isCoordinatesInExtendedChatArea(mX, mY) && !isCoordinatesInChatArea(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(0, drawHeight - (162), 516, drawHeight, 0x0000FF, 90); } if (isCoordinatesInChatArea(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(17, drawHeight - (162) + 16, ChatBox.chatBoxImageProducer.width, ChatBox.chatBoxImageProducer.height, 0x0000FF, 90); } if (isCoordinatesInMinimapArea(mX, mY)) { - gameRasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); + rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x00FF00, 90); } else { - gameRasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); + rasterizer.drawFilledRectangleAlpha(drawWidth - 210, 0, 210, 210, 0x0000FF, 90); } - gameRasterizer.drawFilledRectangle(mX - 4, mY - 4, 4, 4, 0xFF0000); + rasterizer.drawFilledRectangle(mX - 4, mY - 4, 4, 4, 0xFF0000); } public boolean isCoordinatesInChatArea(int x, int y) { @@ -147,7 +146,7 @@ public TabProducer getTabProducer() { @Override public void setRasterizer(RasterizerInstanced rasterizer) { - this.gameRasterizer = rasterizer; + this.rasterizer = rasterizer; } public void draw(int mouseX, int mouseY, boolean debugView) { diff --git a/src/main/java/org/runejs/client/frame/tab/TabProducer.java b/src/main/java/org/runejs/client/frame/tab/TabProducer.java index 04e531ab8..04aa8d49a 100644 --- a/src/main/java/org/runejs/client/frame/tab/TabProducer.java +++ b/src/main/java/org/runejs/client/frame/tab/TabProducer.java @@ -2,7 +2,6 @@ import org.runejs.client.Game; import org.runejs.client.MovedStatics; -import org.runejs.client.ProducingGraphicsBuffer; import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.cache.media.gameInterface.GameInterface; import org.runejs.client.frame.FramePieceAnchor; @@ -44,7 +43,7 @@ public class TabProducer extends FramePieceRenderer { * To avoid flickering, we draw to a temporary rasterizer first, * then flush this to the output rasterizer at once, in its entirety. */ - private RasterizerInstanced tempRasterizer; + private RasterizerInstanced rasterizerTemp; public TabProducer() { @@ -58,10 +57,10 @@ public TabProducer() { 334 ); - tempRasterizer = new RasterizerInstanced( + rasterizerTemp = new RasterizerInstanced( MovedStatics.createGraphicsBuffer(this.width, this.height, Game.gameCanvas) ); - tempRasterizer.drawFilledRectangle(0, 0, 241, 334, Integer.MAX_VALUE); + rasterizerTemp.drawFilledRectangle(0, 0, 241, 334, Integer.MAX_VALUE); } private void drawActiveTab(int currentTabId, int currentY) { @@ -113,7 +112,7 @@ private void drawActiveTab(int currentTabId, int currentY) { x = 202; break; } - tempRasterizer.drawImage(part, x,currentY); + rasterizerTemp.drawImage(part, x,currentY); } public int[] getTabButtonStartCoords(int tabButtonIndex) { @@ -206,14 +205,14 @@ private void drawMiddlePiece(int baseX, int baseY, int width, int height) { if(MovedStatics.tabImageProducer == null) { return; } - tempRasterizer.copyPixels( + rasterizerTemp.copyPixels( MovedStatics.tabImageProducer.pixels, MovedStatics.tabImageProducer.width, MovedStatics.tabImageProducer.height, baseX + width / 2 - MovedStatics.tabImageProducer.width / 2, baseY + height / 2 - MovedStatics.tabImageProducer.height / 2); - tempRasterizer.drawImage(edgeLeft, baseX, baseY + height / 2 - edgeLeft.imageHeight / 2); - tempRasterizer.drawImage(edgeRight, baseX + width - edgeRight.imageWidth, baseY + height / 2 - edgeRight.imageHeight / 2); + rasterizerTemp.drawImage(edgeLeft, baseX, baseY + height / 2 - edgeLeft.imageHeight / 2); + rasterizerTemp.drawImage(edgeRight, baseX + width - edgeRight.imageWidth, baseY + height / 2 - edgeRight.imageHeight / 2); } public void RenderResizableSideBarArea() { @@ -247,23 +246,23 @@ public void RenderResizableSideBarArea() { int y = 0; - tempRasterizer.drawImage(background, x + 24, y + 20); - tempRasterizer.drawImage(background, x + 24 + background.imageWidth, y + 20); - tempRasterizer.drawImage(background, x + 24 + background.imageWidth + 20, y + 20); + rasterizerTemp.drawImage(background, x + 24, y + 20); + rasterizerTemp.drawImage(background, x + 24 + background.imageWidth, y + 20); + rasterizerTemp.drawImage(background, x + 24 + background.imageWidth + 20, y + 20); - tempRasterizer.drawImage(background, x + 24, y + workingHeight - background.imageHeight - 20); - tempRasterizer.drawImage(background, x + 24 + background.imageWidth, y + workingHeight - background.imageHeight - 20); - tempRasterizer.drawImage(background, x + 24 + background.imageWidth + 20, y + workingHeight - background.imageHeight - 20); + rasterizerTemp.drawImage(background, x + 24, y + workingHeight - background.imageHeight - 20); + rasterizerTemp.drawImage(background, x + 24 + background.imageWidth, y + workingHeight - background.imageHeight - 20); + rasterizerTemp.drawImage(background, x + 24 + background.imageWidth + 20, y + workingHeight - background.imageHeight - 20); drawMiddlePiece(x, y, workingWidth, workingHeight); drawTopRow(x, y, workingWidth, workingHeight); drawBottomRow(x, y, workingWidth, workingHeight); - System.arraycopy(tempRasterizer.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); + System.arraycopy(rasterizerTemp.destinationPixels, 0, rasterizerInstanced.destinationPixels,0, rasterizerInstanced.destinationPixels.length); } private void drawBottomRow(int x, int y, int workingWidth, int workingHeight) { - tempRasterizer.drawImage(bottomRow, x - 4, y + workingHeight - bottomRow.imageHeight); + rasterizerTemp.drawImage(bottomRow, x - 4, y + workingHeight - bottomRow.imageHeight); int currentX = x; int currentY = y + workingHeight - bottomRow.imageHeight; if (6 < Game.currentTabId) { @@ -271,40 +270,40 @@ private void drawBottomRow(int x, int y, int workingWidth, int workingHeight) { } currentX += combat.imageWidth; - tempRasterizer.drawImage(friends, currentX, currentY); + rasterizerTemp.drawImage(friends, currentX, currentY); currentX += combat.imageWidth; - tempRasterizer.drawImage(ignores, currentX, currentY); + rasterizerTemp.drawImage(ignores, currentX, currentY); currentX += combat.imageWidth; - tempRasterizer.drawImage(logout, currentX, currentY); + rasterizerTemp.drawImage(logout, currentX, currentY); currentX += combat.imageWidth; - tempRasterizer.drawImage(options, currentX, currentY); + rasterizerTemp.drawImage(options, currentX, currentY); currentX += combat.imageWidth; - tempRasterizer.drawImage(emotes, currentX, currentY); + rasterizerTemp.drawImage(emotes, currentX, currentY); currentX += combat.imageWidth; - tempRasterizer.drawImage(music, currentX, currentY); + rasterizerTemp.drawImage(music, currentX, currentY); } private void drawTopRow(int x, int y, int workingWidth, int workingHeight) { - tempRasterizer.drawImage(topRow, x - 4, y); + rasterizerTemp.drawImage(topRow, x - 4, y); if (Game.currentTabId < 7) { this.drawActiveTab(Game.currentTabId, y); } int currentX = x; - tempRasterizer.drawImage(combat, currentX, y); + rasterizerTemp.drawImage(combat, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(stats, currentX, y); + rasterizerTemp.drawImage(stats, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(quests, currentX, y); + rasterizerTemp.drawImage(quests, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(inventory, currentX, y); + rasterizerTemp.drawImage(inventory, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(equipment, currentX, y); + rasterizerTemp.drawImage(equipment, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(prayer, currentX, y); + rasterizerTemp.drawImage(prayer, currentX, y); currentX += stats.imageWidth; - tempRasterizer.drawImage(magic, currentX, y); + rasterizerTemp.drawImage(magic, currentX, y); } private static void RenderCustomTabArea(int baseX, int baseY) { From c23afb3d033b3fbddf68639be7e4a30aa37502cc Mon Sep 17 00:00:00 2001 From: James Monger Date: Tue, 18 Jul 2023 23:20:54 +0100 Subject: [PATCH 36/45] refactor: create Game3DRenderer for screen overlays --- src/main/java/org/runejs/client/Game.java | 2 +- .../java/org/runejs/client/MovedStatics.java | 225 ---------------- .../java/org/runejs/client/frame/ChatBox.java | 1 + .../runejs/client/frame/Game3DRenderer.java | 249 ++++++++++++++++++ .../runejs/client/frame/ScreenController.java | 1 + 5 files changed, 252 insertions(+), 226 deletions(-) create mode 100644 src/main/java/org/runejs/client/frame/Game3DRenderer.java diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index eb0425c7b..d03e6c886 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -858,7 +858,7 @@ public static void method353() { MovedStatics.draw2DActorAttachments(); MovedStatics.drawPositionHintIcon(); ((Class35) Rasterizer3D.interface3).animateTextures(MovedStatics.anInt199); - MovedStatics.draw3dScreen(); + ScreenController.gameRenderer.draw3dScreenOverlays(); DebugTools.drawWalkPath(); DebugTools.drawClipping(); diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index be09088a1..b37f311cc 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -1494,231 +1494,6 @@ private static void addObject(int arg0, int arg1, int arg2, int arg3, int arg4, } } - public static void renderSplitPrivateMessages() { - if(ChatBox.splitPrivateChat != 0) { - TypeFace class40_sub5_sub14_sub1 = fontNormal; - int i = 0; - if(systemUpdateTime != 0) - i = 1; - for(int i_0_ = 0; i_0_ < 100; i_0_++) { - if(ChatBox.chatMessages[i_0_] != null) { - String class1 = ChatBox.chatPlayerNames[i_0_]; - int i_1_ = 0; - int i_2_ = ChatBox.chatTypes[i_0_]; - if(class1 != null && class1.startsWith(Native.whiteCrown)) { - class1 = class1.substring(5); - i_1_ = 1; - } - if(class1 != null && class1.startsWith(Native.goldCrown)) { - class1 = class1.substring(5); - i_1_ = 2; - } - if((i_2_ == 3 || i_2_ == 7) && (i_2_ == 7 || ChatBox.privateChatMode == 0 || ChatBox.privateChatMode == 1 && Player.hasFriend(class1))) { - int i_3_ = 329 - 13 * i; - int i_4_ = 4; - i++; - class40_sub5_sub14_sub1.drawString(English.from, i_4_, i_3_, 0); - class40_sub5_sub14_sub1.drawString(English.from, i_4_, -1 + i_3_, 65535); - i_4_ += class40_sub5_sub14_sub1.getStringWidth(English.from); - i_4_ += class40_sub5_sub14_sub1.method689(32); - if(i_1_ == 1) { - moderatorIcon[0].drawImage(i_4_, i_3_ - 12); - i_4_ += 14; - } - if(i_1_ == 2) { - moderatorIcon[1].drawImage(i_4_, -12 + i_3_); - i_4_ += 14; - } - class40_sub5_sub14_sub1.drawString(class1 + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], i_4_, i_3_, 0); - class40_sub5_sub14_sub1.drawString(class1 + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], i_4_, -1 + i_3_, 65535); - if(i >= 5) - return; - } - if(i_2_ == 5 && ChatBox.privateChatMode < 2) { - int i_5_ = -(i * 13) + 329; - i++; - class40_sub5_sub14_sub1.drawString(ChatBox.chatMessages[i_0_], 4, i_5_, 0); - class40_sub5_sub14_sub1.drawString(ChatBox.chatMessages[i_0_], 4, i_5_ - 1, 65535); - if(i >= 5) - return; - } - if(i_2_ == 6 && ChatBox.privateChatMode < 2) { - int i_6_ = -(13 * i) + 329; - i++; - class40_sub5_sub14_sub1.drawString(English.to + Native.whitespace_b + class1 + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], 4, i_6_, 0); - class40_sub5_sub14_sub1.drawString(English.to + Native.whitespace_b + class1 + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], 4, i_6_ + -1, 65535); - if(i >= 5) - return; - } - } - } - } - } - - public static void draw3dScreen() { - renderSplitPrivateMessages(); - if (crossType == 1) { - cursorCross[crossIndex / 100].drawImage(GameInterface.crossX - 8 - 4, GameInterface.crossY - 8 - 4); - } - if (crossType == 2) { - cursorCross[4 + crossIndex / 100].drawImage(GameInterface.crossX - 8 - 4, GameInterface.crossY - 8 - 4); - } - if (GameInterface.gameScreenInterfaceId != -1 || GameInterface.walkableWidgetId != -1) { - int areaId = GameInterface.gameScreenInterfaceId != -1 ? 0 : 4; - int id = GameInterface.gameScreenInterfaceId != -1 ? GameInterface.gameScreenInterfaceId : GameInterface.walkableWidgetId; - GameInterface.handleSequences(id); - int yOffset = (ScreenController.drawHeight /2) - (334/2) - (184/2); - int xOffset = (ScreenController.drawWidth /2) - (512/2) - (234/3); - if(ScreenController.frameMode == ScreenMode.FIXED) { - yOffset = 0; - xOffset = 0; - } - Game.drawParentInterface(areaId, xOffset, yOffset, 512+ xOffset, 334 + yOffset, id); - } - method1018(); - Player.setTutorialIslandFlag(); - if (!menuOpen) { - processRightClick(); - drawMenuTooltip(4); - } else { - if(ScreenController.frameMode == ScreenMode.FIXED && menuScreenArea == 0){ - drawMenu(4,4); - } - } - if (multiCombatState == 1) { - multiCombatIcon.drawImage(472, 296); - } - if (showFps) { - int y = 20; - int x = 507; - if(ScreenController.frameMode != ScreenMode.FIXED) { - x = ScreenController.drawWidth - 220; - } - - int colour = 0xffff00; - if (GameShell.fps < 30 && VertexNormal.lowMemory) { - colour = 0xff0000; - } - if (GameShell.fps < 20 && !VertexNormal.lowMemory) { - colour = 0xff0000; - } - fontNormal.drawStringRight("Fps: " + GameShell.fps, x, y, colour); - colour = 0xffff00; - y += 15; - Runtime runtime = Runtime.getRuntime(); - int memoryUsed = (int) ((runtime.totalMemory() + -runtime.freeMemory()) / 1024L); - if (memoryUsed > 32768 && VertexNormal.lowMemory) { - colour = 0xff0000; - } - if (memoryUsed < 65536 && !VertexNormal.lowMemory) { - colour = 0xff0000; - } - fontNormal.drawStringRight("Mem: " + memoryUsed + "k", x, y, colour); - y += 15; - - fontNormal.drawStringRight("MouseX: " + MouseHandler.mouseX, x, y ,0xffff00); - y += 15; - - fontNormal.drawStringRight("MouseY: " + MouseHandler.mouseY, x, y ,0xffff00); - y += 15; - fontNormal.drawStringRight("ClickX: " + MouseHandler.clickX, x, y ,0xffff00); - y += 15; - - fontNormal.drawStringRight("ClickY: " + MouseHandler.clickY, x, y ,0xffff00); - y += 15; - if (showSidePanelRedrawnText) { - fontNormal.drawStringRight(English.sidePanelRedrawn, x, y, 16711680); - y += 15; - showSidePanelRedrawnText = false; - } - if (showChatPanelRedrawnText) { - fontNormal.drawStringRight(English.chatPanelRedrawn, x, y, 16711680); - y += 15; - showChatPanelRedrawnText = false; - } - if (showIconsRedrawnText) { - fontNormal.drawStringRight(English.iconsRedrawn, x, y, 16711680); - showIconsRedrawnText = false; - y += 15; - } - } - if (Configuration.DEBUG_WIDGETS) { - int y = 20; - int x = 507; - if(ScreenController.frameMode != ScreenMode.FIXED) { - x = ScreenController.drawWidth - 220; - } - int widgetParentId = hoveredWidgetId >> 16; - int widgetChildId = hoveredWidgetId & 0x7fff; - String typeAsString = ""; - - // Gather widget metadata from the cached interfaces - GameInterface[] parentInterface; - GameInterface childInterface = null; - if (widgetParentId >= 0 && widgetChildId < 469) { - parentInterface = GameInterface.cachedInterfaces[widgetParentId]; - - if (parentInterface != null) { - childInterface = parentInterface[widgetChildId]; - } - - if (childInterface != null) { - switch (childInterface.type) { - case TEXT: - typeAsString = "TEXT"; - break; - case GRAPHIC: - typeAsString = "GRAPHIC"; - break; - case MODEL: - typeAsString = "MODEL"; - break; - case RECTANGLE: - typeAsString = "RECTANGLE"; - break; - case INVENTORY: - typeAsString = "INVENTORY"; - break; - case LINE: - typeAsString = "LINE"; - break; - case TEXT_INVENTORY: - typeAsString = "TEXT_INVENTORY"; - break; - case LAYER: - typeAsString = "LAYER"; - break; - case IF1_TOOLTIP: - typeAsString = "IF1_TOOLTIP"; - break; - default: - typeAsString = "UNKNOWN"; - } - } - } - - fontNormal.drawStringRight("Widget " + widgetParentId + ":" + widgetChildId, x, y, 0xffff00); - y+= 15; - if (childInterface != null) { - fontNormal.drawStringRight("Parent ID: " + childInterface.parentId, x, y, 0xffff00); - y+= 15; - fontNormal.drawStringRight("Type: " + typeAsString, x, y, 0xffff00); - y+= 15; - } - - } - if (systemUpdateTime != 0) { - int seconds = systemUpdateTime / 50; - int minutes = seconds / 60; - seconds %= 60; - if (seconds < 10) { - fontNormal.drawString(English.systemUpdateIn + minutes + Native.prefixColonZero + seconds, 4, 329, 16776960); - } else { - fontNormal.drawString(English.systemUpdateIn + minutes + Native.colon + seconds, 4, 329, 16776960); - } - } - } - public static void processNpcMenuOptions(ActorDefinition actorDefinition, int x, int y, int index) { if (menuActionRow < 400) { if (actorDefinition.childIds != null) { diff --git a/src/main/java/org/runejs/client/frame/ChatBox.java b/src/main/java/org/runejs/client/frame/ChatBox.java index 212021f28..70b7dec3e 100644 --- a/src/main/java/org/runejs/client/frame/ChatBox.java +++ b/src/main/java/org/runejs/client/frame/ChatBox.java @@ -83,6 +83,7 @@ public static void renderChatbox() { } else if(dialogueId == -1) { int line = 0; TypeFace typeFace = MovedStatics.fontNormal; + typeFace.setRasterizer(null); Rasterizer.setBounds(0, 0, 463, 77); for(int i = 0; i < 100; i++) { if(chatMessages[i] != null) { diff --git a/src/main/java/org/runejs/client/frame/Game3DRenderer.java b/src/main/java/org/runejs/client/frame/Game3DRenderer.java new file mode 100644 index 000000000..e99f0ece6 --- /dev/null +++ b/src/main/java/org/runejs/client/frame/Game3DRenderer.java @@ -0,0 +1,249 @@ +package org.runejs.client.frame; + +import org.runejs.Configuration; +import org.runejs.client.Game; +import org.runejs.client.GameShell; +import org.runejs.client.MovedStatics; +import org.runejs.client.cache.media.TypeFace; +import org.runejs.client.cache.media.gameInterface.GameInterface; +import org.runejs.client.input.MouseHandler; +import org.runejs.client.language.English; +import org.runejs.client.language.Native; +import org.runejs.client.media.RasterizerInstanced; +import org.runejs.client.media.VertexNormal; +import org.runejs.client.media.renderable.actor.Player; + +public class Game3DRenderer { + private final RasterizerInstanced rasterizer; + + public Game3DRenderer(RasterizerInstanced rasterizer) { + this.rasterizer = rasterizer; + } + + private void renderSplitPrivateMessages(TypeFace font) { + if(ChatBox.splitPrivateChat != 0) { + int i = 0; + if(MovedStatics.systemUpdateTime != 0) + i = 1; + for(int i_0_ = 0; i_0_ < 100; i_0_++) { + if(ChatBox.chatMessages[i_0_] != null) { + String name = ChatBox.chatPlayerNames[i_0_]; + int crown = 0; + int type = ChatBox.chatTypes[i_0_]; + if(name != null && name.startsWith(Native.whiteCrown)) { + name = name.substring(5); + crown = 1; + } + if(name != null && name.startsWith(Native.goldCrown)) { + name = name.substring(5); + crown = 2; + } + if((type == 3 || type == 7) && (type == 7 || ChatBox.privateChatMode == 0 || ChatBox.privateChatMode == 1 && Player.hasFriend(name))) { + int y = 329 - 13 * i; + int x = 4; + i++; + font.drawString(English.from, x, y, 0); + font.drawString(English.from, x, -1 + y, 65535); + x += font.getStringWidth(English.from); + x += font.method689(32); + if(crown == 1) { + MovedStatics.moderatorIcon[0].drawImage(rasterizer, x, y - 12); + x += 14; + } + if(crown == 2) { + MovedStatics.moderatorIcon[1].drawImage(rasterizer,x, -12 + y); + x += 14; + } + font.drawString(name + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], x, y, 0); + font.drawString(name + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], x, -1 + y, 65535); + if(i >= 5) + return; + } + if(type == 5 && ChatBox.privateChatMode < 2) { + int y = -(i * 13) + 329; + i++; + font.drawString(ChatBox.chatMessages[i_0_], 4, y, 0); + font.drawString(ChatBox.chatMessages[i_0_], 4, y - 1, 65535); + if(i >= 5) + return; + } + if(type == 6 && ChatBox.privateChatMode < 2) { + int y = -(13 * i) + 329; + i++; + font.drawString(English.to + Native.whitespace_b + name + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], 4, y, 0); + font.drawString(English.to + Native.whitespace_b + name + Native.COLON_CHARACTER + ChatBox.chatMessages[i_0_], 4, y + -1, 65535); + if(i >= 5) + return; + } + } + } + } + } + + public void draw3dScreenOverlays() { + TypeFace font = MovedStatics.fontNormal; + font.setRasterizer(this.rasterizer); + + renderSplitPrivateMessages(font); + if (MovedStatics.crossType == 1) { + MovedStatics.cursorCross[MovedStatics.crossIndex / 100].drawImage(GameInterface.crossX - 8 - 4, GameInterface.crossY - 8 - 4); + } + if (MovedStatics.crossType == 2) { + MovedStatics.cursorCross[4 + MovedStatics.crossIndex / 100].drawImage(GameInterface.crossX - 8 - 4, GameInterface.crossY - 8 - 4); + } + if (GameInterface.gameScreenInterfaceId != -1 || GameInterface.walkableWidgetId != -1) { + int areaId = GameInterface.gameScreenInterfaceId != -1 ? 0 : 4; + int id = GameInterface.gameScreenInterfaceId != -1 ? GameInterface.gameScreenInterfaceId : GameInterface.walkableWidgetId; + GameInterface.handleSequences(id); + int yOffset = (ScreenController.drawHeight /2) - (334/2) - (184/2); + int xOffset = (ScreenController.drawWidth /2) - (512/2) - (234/3); + if(ScreenController.frameMode == ScreenMode.FIXED) { + yOffset = 0; + xOffset = 0; + } + Game.drawParentInterface(areaId, xOffset, yOffset, 512+ xOffset, 334 + yOffset, id); + } + MovedStatics.method1018(); + Player.setTutorialIslandFlag(); + if (!MovedStatics.menuOpen) { + MovedStatics.processRightClick(); + MovedStatics.drawMenuTooltip(4); + } else { + if(ScreenController.frameMode == ScreenMode.FIXED && MovedStatics.menuScreenArea == 0){ + MovedStatics.drawMenu(4,4); + } + } + if (MovedStatics.multiCombatState == 1) { + MovedStatics.multiCombatIcon.drawImage(472, 296); + } + if (MovedStatics.showFps) { + int y = 20; + int x = 507; + if(ScreenController.frameMode != ScreenMode.FIXED) { + x = ScreenController.drawWidth - 220; + } + + int colour = 0xffff00; + if (GameShell.fps < 30 && VertexNormal.lowMemory) { + colour = 0xff0000; + } + if (GameShell.fps < 20 && !VertexNormal.lowMemory) { + colour = 0xff0000; + } + font.drawStringRight("Fps: " + GameShell.fps, x, y, colour); + colour = 0xffff00; + y += 15; + Runtime runtime = Runtime.getRuntime(); + int memoryUsed = (int) ((runtime.totalMemory() + -runtime.freeMemory()) / 1024L); + if (memoryUsed > 32768 && VertexNormal.lowMemory) { + colour = 0xff0000; + } + if (memoryUsed < 65536 && !VertexNormal.lowMemory) { + colour = 0xff0000; + } + font.drawStringRight("Mem: " + memoryUsed + "k", x, y, colour); + y += 15; + + font.drawStringRight("MouseX: " + MouseHandler.mouseX, x, y ,0xffff00); + y += 15; + + font.drawStringRight("MouseY: " + MouseHandler.mouseY, x, y ,0xffff00); + y += 15; + font.drawStringRight("ClickX: " + MouseHandler.clickX, x, y ,0xffff00); + y += 15; + + font.drawStringRight("ClickY: " + MouseHandler.clickY, x, y ,0xffff00); + y += 15; + if (MovedStatics.showSidePanelRedrawnText) { + font.drawStringRight(English.sidePanelRedrawn, x, y, 16711680); + y += 15; + MovedStatics.showSidePanelRedrawnText = false; + } + if (MovedStatics.showChatPanelRedrawnText) { + font.drawStringRight(English.chatPanelRedrawn, x, y, 16711680); + y += 15; + MovedStatics.showChatPanelRedrawnText = false; + } + if (MovedStatics.showIconsRedrawnText) { + font.drawStringRight(English.iconsRedrawn, x, y, 16711680); + MovedStatics.showIconsRedrawnText = false; + y += 15; + } + } + if (Configuration.DEBUG_WIDGETS) { + int y = 20; + int x = 507; + if(ScreenController.frameMode != ScreenMode.FIXED) { + x = ScreenController.drawWidth - 220; + } + int widgetParentId = MovedStatics.hoveredWidgetId >> 16; + int widgetChildId = MovedStatics.hoveredWidgetId & 0x7fff; + String typeAsString = ""; + + // Gather widget metadata from the cached interfaces + GameInterface[] parentInterface; + GameInterface childInterface = null; + if (widgetParentId >= 0 && widgetChildId < 469) { + parentInterface = GameInterface.cachedInterfaces[widgetParentId]; + + if (parentInterface != null) { + childInterface = parentInterface[widgetChildId]; + } + + if (childInterface != null) { + switch (childInterface.type) { + case TEXT: + typeAsString = "TEXT"; + break; + case GRAPHIC: + typeAsString = "GRAPHIC"; + break; + case MODEL: + typeAsString = "MODEL"; + break; + case RECTANGLE: + typeAsString = "RECTANGLE"; + break; + case INVENTORY: + typeAsString = "INVENTORY"; + break; + case LINE: + typeAsString = "LINE"; + break; + case TEXT_INVENTORY: + typeAsString = "TEXT_INVENTORY"; + break; + case LAYER: + typeAsString = "LAYER"; + break; + case IF1_TOOLTIP: + typeAsString = "IF1_TOOLTIP"; + break; + default: + typeAsString = "UNKNOWN"; + } + } + } + + font.drawStringRight("Widget " + widgetParentId + ":" + widgetChildId, x, y, 0xffff00); + y+= 15; + if (childInterface != null) { + font.drawStringRight("Parent ID: " + childInterface.parentId, x, y, 0xffff00); + y+= 15; + font.drawStringRight("Type: " + typeAsString, x, y, 0xffff00); + y+= 15; + } + + } + if (MovedStatics.systemUpdateTime != 0) { + int seconds = MovedStatics.systemUpdateTime / 50; + int minutes = seconds / 60; + seconds %= 60; + if (seconds < 10) { + font.drawString(English.systemUpdateIn + minutes + Native.prefixColonZero + seconds, 4, 329, 16776960); + } else { + font.drawString(English.systemUpdateIn + minutes + Native.colon + seconds, 4, 329, 16776960); + } + } + } +} diff --git a/src/main/java/org/runejs/client/frame/ScreenController.java b/src/main/java/org/runejs/client/frame/ScreenController.java index 099f0d387..b48ff2907 100644 --- a/src/main/java/org/runejs/client/frame/ScreenController.java +++ b/src/main/java/org/runejs/client/frame/ScreenController.java @@ -30,6 +30,7 @@ public class ScreenController { ScreenController.frameMode == ScreenMode.FIXED ? 512 : ScreenController.drawWidth, ScreenController.frameMode == ScreenMode.FIXED ? 334 : ScreenController.drawHeight ); + public static Game3DRenderer gameRenderer = new Game3DRenderer(rasterizer); private static FrameRenderer renderer; public static boolean DebugView = false; From ceb6f20270bccb219d7dd1457b4ac5124411a13a Mon Sep 17 00:00:00 2001 From: James Monger Date: Wed, 19 Jul 2023 09:47:21 +0100 Subject: [PATCH 37/45] Revert "refactor: use instanced Rasteriser in Game" This reverts commit 8474afce1058a19c7f5055383c9ddb2be8c92e35. --- src/main/java/org/runejs/client/Game.java | 47 ++++++++++++----------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/runejs/client/Game.java b/src/main/java/org/runejs/client/Game.java index d03e6c886..678ba1d9e 100644 --- a/src/main/java/org/runejs/client/Game.java +++ b/src/main/java/org/runejs/client/Game.java @@ -14,6 +14,7 @@ import org.runejs.client.language.English; import org.runejs.client.language.Native; import org.runejs.client.media.Constants3D; +import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; import org.runejs.client.media.VertexNormal; import org.runejs.client.media.renderable.Model; @@ -194,7 +195,7 @@ public static boolean drawParentInterface(int areaId, int minX, int minY, int ma * @return The status of the drawing cycle, true for success and false for failure */ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, int maxY, int scrollPosition, int scrollWidth, GameInterface[] interfaceCollection, int parentId, boolean drawSuccess) { - ScreenController.rasterizer.setBounds(minX, minY, maxX, maxY); + Rasterizer.setBounds(minX, minY, maxX, maxY); boolean result = drawSuccess; for (int i = 0; interfaceCollection.length > i; i++) { @@ -227,7 +228,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in i_6_ = -gameInterface.originalWidth + gameInterface_3_.originalWidth; absoluteX = is[0] + i_6_; } - if (!gameInterface.isNewInterfaceFormat || ScreenController.rasterizer.viewportRight >= absoluteX && ScreenController.rasterizer.viewportBottom >= absoluteY && ScreenController.rasterizer.viewportLeft <= absoluteX + gameInterface.originalWidth && absoluteY + gameInterface.originalHeight >= ScreenController.rasterizer.viewportTop) { + if (!gameInterface.isNewInterfaceFormat || Rasterizer.viewportRight >= absoluteX && Rasterizer.viewportBottom >= absoluteY && Rasterizer.viewportLeft <= absoluteX + gameInterface.originalWidth && absoluteY + gameInterface.originalHeight >= Rasterizer.viewportTop) { if (gameInterface.type == GameInterfaceType.LAYER) { if (gameInterface.isHidden && !GameInterface.isHovering(areaId, i)) continue; @@ -240,7 +241,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in result &= drawInterface(areaId, absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.scrollPosition, gameInterface.scrollWidth, interfaceCollection, i, drawSuccess); if (gameInterface.children != null) result &= drawInterface(areaId, absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, absoluteY + gameInterface.originalHeight, gameInterface.scrollPosition, gameInterface.scrollWidth, gameInterface.children, gameInterface.id, true); - ScreenController.rasterizer.setBounds(minX, minY, maxX, maxY); + Rasterizer.setBounds(minX, minY, maxX, maxY); if (gameInterface.originalHeight < gameInterface.scrollHeight) GameInterface.drawScrollBar(absoluteX + gameInterface.originalWidth, absoluteY, gameInterface.originalHeight, gameInterface.scrollPosition, gameInterface.scrollHeight); } @@ -270,7 +271,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in int i_12_ = 0; int i_13_ = -1 + gameInterface.items[i_7_]; int i_14_ = 0; - if (-32 + ScreenController.rasterizer.viewportLeft < i_10_ && ScreenController.rasterizer.viewportRight > i_10_ && ScreenController.rasterizer.viewportTop + -32 < i_11_ && ScreenController.rasterizer.viewportBottom > i_11_ || GameInterface.activeInterfaceType != 0 && GameInterface.selectedInventorySlot == i_7_) { + if (-32 + Rasterizer.viewportLeft < i_10_ && Rasterizer.viewportRight > i_10_ && Rasterizer.viewportTop + -32 < i_11_ && Rasterizer.viewportBottom > i_11_ || GameInterface.activeInterfaceType != 0 && GameInterface.selectedInventorySlot == i_7_) { int i_15_ = 0; if (GameInterface.itemCurrentlySelected == 1 && i_7_ == GameInterface.itemSelectedContainerSlot && gameInterface.id == GameInterface.itemSelectedWidgetId) i_15_ = 16777215; @@ -292,8 +293,8 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in imageRGB.drawImageWithOpacity(i_12_ + i_10_, i_11_ + i_14_, 128); if (parentId != -1) { GameInterface gameInterface_16_ = interfaceCollection[parentId]; - if (ScreenController.rasterizer.viewportTop > i_14_ + i_11_ && gameInterface_16_.scrollPosition > 0) { - int i_17_ = MovedStatics.anInt199 * (ScreenController.rasterizer.viewportTop + -i_11_ - i_14_) / 3; + if (Rasterizer.viewportTop > i_14_ + i_11_ && gameInterface_16_.scrollPosition > 0) { + int i_17_ = MovedStatics.anInt199 * (Rasterizer.viewportTop + -i_11_ - i_14_) / 3; if (10 * MovedStatics.anInt199 < i_17_) i_17_ = 10 * MovedStatics.anInt199; if (gameInterface_16_.scrollPosition < i_17_) @@ -301,8 +302,8 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in gameInterface_16_.scrollPosition -= i_17_; MovedStatics.anInt2798 += i_17_; } - if (32 + i_11_ + i_14_ > ScreenController.rasterizer.viewportBottom && -gameInterface_16_.originalHeight + gameInterface_16_.scrollHeight > gameInterface_16_.scrollPosition) { - int i_18_ = MovedStatics.anInt199 * (-ScreenController.rasterizer.viewportBottom + 32 + i_11_ + i_14_) / 3; + if (32 + i_11_ + i_14_ > Rasterizer.viewportBottom && -gameInterface_16_.originalHeight + gameInterface_16_.scrollHeight > gameInterface_16_.scrollPosition) { + int i_18_ = MovedStatics.anInt199 * (-Rasterizer.viewportBottom + 32 + i_11_ + i_14_) / 3; if (MovedStatics.anInt199 * 10 < i_18_) i_18_ = 10 * MovedStatics.anInt199; if (-gameInterface_16_.scrollPosition + gameInterface_16_.scrollHeight + -gameInterface_16_.originalHeight < i_18_) @@ -339,13 +340,13 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in } if (opacity == 0) { if (!gameInterface.filled) - ScreenController.rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); + Rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); else - ScreenController.rasterizer.drawFilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); + Rasterizer.drawFilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor); } else if (!gameInterface.filled) - ScreenController.rasterizer.drawUnfilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); + Rasterizer.drawUnfilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); else - ScreenController.rasterizer.drawFilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); + Rasterizer.drawFilledRectangleAlpha(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, rectangleColor, -(0xff & opacity) + 256); } else if (gameInterface.type == GameInterfaceType.TEXT) { TypeFace font = gameInterface.getTypeFace(); if (font == null) { @@ -377,7 +378,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in textColor = gameInterface.textColor; text = English.pleaseWait; } - if (ScreenController.rasterizer.destinationWidth == 479) { + if (Rasterizer.destinationWidth == 479) { if (textColor == 16776960) textColor = 255; if (textColor == 49152) @@ -411,7 +412,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in if (gameInterface.tiled) { int[] viewportDimensions = new int[4]; - ScreenController.rasterizer.getViewportDimensions(viewportDimensions); + Rasterizer.getViewportDimensions(viewportDimensions); // Cap sprite to viewport dimensions int spriteTopX = absoluteX; @@ -427,7 +428,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in if (spriteBottomY > viewportDimensions[3]) spriteBottomY = viewportDimensions[3]; - ScreenController.rasterizer.setBounds(spriteTopX, spriteTopY, spriteBottomX, spriteBottomY); + Rasterizer.setBounds(spriteTopX, spriteTopY, spriteBottomX, spriteBottomY); int i_31_ = (gameInterface.originalWidth - (1 + -spriteWidth)) / spriteWidth; int i_32_ = (gameInterface.originalHeight - (1 + -spriteHeight)) / spriteHeight; for (int row = 0; i_31_ > row; row++) { @@ -441,7 +442,7 @@ public static boolean drawInterface(int areaId, int minX, int minY, int maxX, in spriteRgb.drawImageWithTexture(spriteWidth / 2 + row * spriteWidth + absoluteX, spriteHeight / 2 + absoluteY + spriteHeight * col, gameInterface.textureId, 4096); } } - ScreenController.rasterizer.setViewportDimensions(viewportDimensions); + Rasterizer.setViewportDimensions(viewportDimensions); } else { int i_26_ = 4096 * gameInterface.originalWidth / spriteWidth; if (gameInterface.textureId == 0) { @@ -598,8 +599,8 @@ else if (gameInterface.xTextAlignment == 1) tooltipX = 5 + absoluteX; if (textWidth + tooltipX > maxX) tooltipX = -textWidth + maxX; - ScreenController.rasterizer.drawFilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 16777120); - ScreenController.rasterizer.drawUnfilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 0); + Rasterizer.drawFilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 16777120); + Rasterizer.drawUnfilledRectangle(tooltipX, tooltipY, textWidth, textHeight, 0); text = gameInterface.disabledText; int tooltipTitleY = 2 + tooltipY + class40_sub5_sub14_sub1.characterDefaultHeight; text = ClientScriptRunner.method532(gameInterface, text); @@ -618,12 +619,12 @@ else if (gameInterface.xTextAlignment == 1) } } if (gameInterface.type == GameInterfaceType.LINE) - ScreenController.rasterizer.drawDiagonalLine(absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.textColor); + Rasterizer.drawDiagonalLine(absoluteX, absoluteY, gameInterface.originalWidth + absoluteX, gameInterface.originalHeight + absoluteY, gameInterface.textColor); } // Draw debug information for non layer widgets and non tooltip widgets if (Configuration.DEBUG_WIDGETS && gameInterface.type != GameInterfaceType.LAYER && gameInterface.type != GameInterfaceType.IF1_TOOLTIP && MovedStatics.hoveredWidgetId == gameInterface.id) { - ScreenController.rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, 0xffff00); + Rasterizer.drawUnfilledRectangle(absoluteX, absoluteY, gameInterface.originalWidth, gameInterface.originalHeight, 0xffff00); } } } @@ -851,7 +852,7 @@ public static void method353() { MouseHandler.gameScreenClickable = true; MouseHandler.cursorX = MouseHandler.mouseX - 4; Model.resourceCount = 0; - ScreenController.rasterizer.resetPixels(); + Rasterizer.resetPixels(); sceneRenderer.render(activeCamera, plane); currentScene.clearInteractiveObjectCache(); @@ -878,7 +879,7 @@ public static void method353() { } if(aBoolean519) { MovedStatics.method1018(); - ScreenController.rasterizer.resetPixels(); + Rasterizer.resetPixels(); MovedStatics.method940(English.loadingPleaseWait, false, null); } @@ -1102,7 +1103,7 @@ public static void method164() { MovedStatics.anInt199 = 0; MovedStatics.aProducingGraphicsBuffer_2213.prepareRasterizer(); Player.viewportOffsets = Rasterizer3D.setLineOffsets(Player.viewportOffsets); - ScreenController.rasterizer.resetPixels(); + Rasterizer.resetPixels(); drawParentInterface(0, 0, 0, 765, 503, GameInterface.fullscreenInterfaceId); if(GameInterface.fullscreenSiblingInterfaceId != -1) drawParentInterface(0, 0, 0, 765, 503, GameInterface.fullscreenSiblingInterfaceId); From c119b9126c72f9c25d10d8c2f267b9326ad5d521 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 11:02:49 +0100 Subject: [PATCH 38/45] refactor: convert ChatBox to instanced rasterizer --- .../java/org/runejs/client/MovedStatics.java | 3 +- .../runejs/client/cache/media/TypeFace.java | 2 + .../media/gameInterface/GameInterface.java | 20 ++++ .../java/org/runejs/client/frame/ChatBox.java | 106 +++++++++++------- 4 files changed, 88 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index b37f311cc..f149c2cc3 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -1688,7 +1688,8 @@ public static void method763(Component arg0, CacheArchive arg2) { tabBottomBack = Game.method359(Native.imgBackbase2, Native.aClass1_305, arg2); tabTopBack = Game.method359(Native.imgBackhmid1, Native.aClass1_305, arg2); ChatBox.chatBoxImageProducer = createGraphicsBuffer(479, 96, arg0); - chatboxBackgroundImage.drawImage(0, 0); + ChatBox.rasterizer = new RasterizerInstanced(ChatBox.chatBoxImageProducer); + chatboxBackgroundImage.drawImage(ChatBox.rasterizer, 0, 0); Minimap.mapbackProducingGraphicsBuffer = createGraphicsBuffer(172, 156, arg0); Rasterizer.resetPixels(); Minimap.minimapBackgroundImage.drawImage(0, 0); diff --git a/src/main/java/org/runejs/client/cache/media/TypeFace.java b/src/main/java/org/runejs/client/cache/media/TypeFace.java index 4f6a0d25e..75aa9aa00 100644 --- a/src/main/java/org/runejs/client/cache/media/TypeFace.java +++ b/src/main/java/org/runejs/client/cache/media/TypeFace.java @@ -101,6 +101,8 @@ public void setRasterizer(RasterizerInstanced rasterizer) { this.rasterizer = rasterizer; } + public RasterizerInstanced getRasterizer() { return this.rasterizer; } + public static TypeFace constructFont() { TypeFace class40_sub5_sub14_sub1 = new TypeFace(MovedStatics.anIntArray3111, MovedStatics.anIntArray456, MovedStatics.anIntArray3312, MovedStatics.anIntArray1972, MovedStatics.aByteArrayArray1370); MovedStatics.method569(); diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index 319a01b7b..f671ac034 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -17,6 +17,7 @@ import org.runejs.client.language.English; import org.runejs.client.language.Native; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.Model; import org.runejs.client.media.renderable.actor.Npc; import org.runejs.client.media.renderable.actor.Pathfinding; @@ -453,6 +454,25 @@ else if(type == 620) { } } + public static void drawScrollBar(RasterizerInstanced rasterizer, int x, int y, int height, int scrollPosition, int scrollMaximum) { + int length = (-32 + height) * height / scrollMaximum; + MovedStatics.scrollbarArrowImages[0].drawImage(rasterizer, x, y); + MovedStatics.scrollbarArrowImages[1].drawImage(rasterizer, x, y - (-height + 16)); + rasterizer.drawFilledRectangle(x, y + 16, 16, height + -32, SCROLLBAR_COLOR_BACKGROUND); + if(length < 8) + length = 8; + int scrollCurrent = (-32 + height - length) * scrollPosition / (-height + scrollMaximum); + rasterizer.drawFilledRectangle(x, 16 + y + scrollCurrent, 16, length, SCROLLBAR_COLOR_CHIP_FILL); + rasterizer.drawVerticalLine(x, 16 + y + scrollCurrent, length, SCROLLBAR_COLOR_CHIP_EDGE_LIGHT); + rasterizer.drawVerticalLine(1 + x, scrollCurrent + y + 16, length, SCROLLBAR_COLOR_CHIP_EDGE_LIGHT); + rasterizer.drawHorizontalLine(x, scrollCurrent + y + 16, 16, SCROLLBAR_COLOR_CHIP_EDGE_LIGHT); + rasterizer.drawHorizontalLine(x, 17 + y + scrollCurrent, 16, SCROLLBAR_COLOR_CHIP_EDGE_LIGHT); + rasterizer.drawVerticalLine(x + 15, y + 16 + scrollCurrent, length, SCROLLBAR_COLOR_CHIP_EDGE_DARK); + rasterizer.drawVerticalLine(x + 14, scrollCurrent + 17 + y, length - 1, SCROLLBAR_COLOR_CHIP_EDGE_DARK); + rasterizer.drawHorizontalLine(x, length + scrollCurrent + 15 + y, 16, SCROLLBAR_COLOR_CHIP_EDGE_DARK); + rasterizer.drawHorizontalLine(x + 1, 14 + y + scrollCurrent + length, 15, SCROLLBAR_COLOR_CHIP_EDGE_DARK); + } + public static void drawScrollBar(int x, int y, int height, int scrollPosition, int scrollMaximum) { int length = (-32 + height) * height / scrollMaximum; MovedStatics.scrollbarArrowImages[0].drawImage(x, y); diff --git a/src/main/java/org/runejs/client/frame/ChatBox.java b/src/main/java/org/runejs/client/frame/ChatBox.java index 70b7dec3e..fecdfbe34 100644 --- a/src/main/java/org/runejs/client/frame/ChatBox.java +++ b/src/main/java/org/runejs/client/frame/ChatBox.java @@ -7,8 +7,8 @@ import org.runejs.client.input.MouseHandler; import org.runejs.client.language.English; import org.runejs.client.language.Native; -import org.runejs.client.media.Rasterizer; import org.runejs.client.media.Rasterizer3D; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.actor.Player; import java.awt.*; @@ -37,54 +37,75 @@ public class ChatBox { public static String chatboxInput = ""; public static String chatMessage = ""; + public static RasterizerInstanced rasterizer; + private static char[] VALID_CHARACTERS = {' ', 'e', 't', 'a', 'o', 'i', 'h', 'n', 's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b', 'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', ':', ';', '(', ')', '-', '&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"', '[', ']', '_', '{', '}', '/', '|'}; + public static void renderChatbox() { MovedStatics.showChatPanelRedrawnText = true; method305(); if(messagePromptRaised) { - TypeFace.fontBold.drawStringLeft(Native.enterPlayerNameHeader, 239, 40, 0); - TypeFace.fontBold.drawStringLeft(chatMessage + "*", 239, 60, 128); + TypeFace font = TypeFace.fontBold; + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); + font.drawStringLeft(Native.enterPlayerNameHeader, 239, 40, 0); + font.drawStringLeft(chatMessage + "*", 239, 60, 128); + font.setRasterizer(oldRasterizer); } else if(inputType == 1) { - TypeFace.fontBold.drawStringLeft(English.enterAmount, 239, 40, 0); - TypeFace.fontBold.drawStringLeft(inputMessage + "*", 239, 60, 128); + TypeFace font = TypeFace.fontBold; + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); + font.drawStringLeft(English.enterAmount, 239, 40, 0); + font.drawStringLeft(inputMessage + "*", 239, 60, 128); + font.setRasterizer(oldRasterizer); } else if(inputType == 2) { - TypeFace.fontBold.drawStringLeft(English.enterName, 239, 40, 0); - TypeFace.fontBold.drawStringLeft(inputMessage + "*", 239, 60, 128); + TypeFace font = TypeFace.fontBold; + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); + font.drawStringLeft(English.enterName, 239, 40, 0); + font.drawStringLeft(inputMessage + "*", 239, 60, 128); + font.setRasterizer(oldRasterizer); } else if(inputType == 3) { if(!inputMessage.equals(lastItemSearchInput)) { itemSearch(inputMessage); lastItemSearchInput = inputMessage; } TypeFace font = MovedStatics.fontNormal; - Rasterizer.setBounds(0, 0, 463, 77); + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); for(int index = 0; index < itemSearchResultCount; index++) { int y = index * 14 + 18 - itemSearchScroll; if(y > 0 && y < 110) font.drawStringLeft(itemSearchResultNames[index], 239, y, 0); } - Rasterizer.resetBounds(); if(itemSearchResultCount > 5) - GameInterface.drawScrollBar(463, 0, 77, itemSearchScroll, 7 + 14 * itemSearchResultCount); + GameInterface.drawScrollBar(rasterizer, 463, 0, 77, itemSearchScroll, 7 + 14 * itemSearchResultCount); if(inputMessage.length() != 0) { if(itemSearchResultCount == 0) TypeFace.fontBold.drawStringLeft(English.noMatchingObjectsFound, 239, 40, 0); } else TypeFace.fontBold.drawStringLeft(English.enterObjectName, 239, 40, 255); font.drawStringLeft(inputMessage + "*", 239, 90, 0); - Rasterizer.drawHorizontalLine(0, 77, 479, 0); + rasterizer.drawHorizontalLine(0, 77, 479, 0); + font.setRasterizer(oldRasterizer); } else if(Native.clickToContinueString != null) { - TypeFace.fontBold.drawStringLeft(Native.clickToContinueString, 239, 40, 0); - TypeFace.fontBold.drawStringLeft(English.clickToContinue, 239, 60, 128); + TypeFace font = TypeFace.fontBold; + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); + font.drawStringLeft(Native.clickToContinueString, 239, 40, 0); + font.drawStringLeft(English.clickToContinue, 239, 60, 128); + font.setRasterizer(oldRasterizer); } else if(GameInterface.chatboxInterfaceId != -1) { redrawChatbox = !Game.drawParentInterface(2, 0, 0, 479, 96, GameInterface.chatboxInterfaceId); } else if(dialogueId == -1) { int line = 0; - TypeFace typeFace = MovedStatics.fontNormal; - typeFace.setRasterizer(null); - Rasterizer.setBounds(0, 0, 463, 77); + TypeFace font = MovedStatics.fontNormal; + RasterizerInstanced oldRasterizer = font.getRasterizer(); + font.setRasterizer(rasterizer); + rasterizer.setBounds(0, 0, 77, 463); for(int i = 0; i < 100; i++) { if(chatMessages[i] != null) { int type = chatTypes[i]; @@ -102,22 +123,22 @@ public static void renderChatbox() { if(type == 0) { line++; if(y > 0 && y < 110) - typeFace.drawString(chatMessages[i], 4, y, 0); + font.drawString(chatMessages[i], 4, y, 0); } if((type == 1 || type == 2) && (type == 1 || publicChatMode == 0 || publicChatMode == 1 && Player.hasFriend(name))) { if(y > 0 && y < 110) { int x = 4; if(privelege == 1) { - MovedStatics.moderatorIcon[0].drawImage(x, y + -12); + MovedStatics.moderatorIcon[0].drawImage(rasterizer, x, y + -12); x += 14; } if(privelege == 2) { - MovedStatics.moderatorIcon[1].drawImage(x, y - 12); + MovedStatics.moderatorIcon[1].drawImage(rasterizer, x, y - 12); x += 14; } - typeFace.drawString(name+ Native.colon, x, y, 0); - x += 8 + typeFace.getStringWidth(name); - typeFace.drawString(chatMessages[i], x, y, 255); + font.drawString(name+ Native.colon, x, y, 0); + x += 8 + font.getStringWidth(name); + font.drawString(chatMessages[i], x, y, 255); } line++; } @@ -125,59 +146,60 @@ public static void renderChatbox() { line++; if(y > 0 && y < 110) { int i_13_ = 4; - typeFace.drawString(English.from, i_13_, y, 0); - i_13_ += typeFace.getStringWidth(English.from); - i_13_ += typeFace.method689(32); + font.drawString(English.from, i_13_, y, 0); + i_13_ += font.getStringWidth(English.from); + i_13_ += font.method689(32); if(privelege == 1) { - MovedStatics.moderatorIcon[0].drawImage(i_13_, y + -12); + MovedStatics.moderatorIcon[0].drawImage(rasterizer, i_13_, y + -12); i_13_ += 14; } if(privelege == 2) { - MovedStatics.moderatorIcon[1].drawImage(i_13_, y - 12); + MovedStatics.moderatorIcon[1].drawImage(rasterizer, i_13_, y - 12); i_13_ += 14; } - typeFace.drawString(name + Native.colon, i_13_, y, 0); - i_13_ += 8 + typeFace.getStringWidth(name); - typeFace.drawString(chatMessages[i], i_13_, y, 8388608); + font.drawString(name + Native.colon, i_13_, y, 0); + i_13_ += 8 + font.getStringWidth(name); + font.drawString(chatMessages[i], i_13_, y, 8388608); } } if(type == 4 && (tradeMode == 0 || tradeMode == 1 && Player.hasFriend(name))) { line++; if(y > 0 && y < 110) - typeFace.drawString(name + " " + chatMessages[i], 4, y, 8388736); + font.drawString(name + " " + chatMessages[i], 4, y, 8388736); } if(type == 5 && splitPrivateChat == 0 && privateChatMode < 2) { if(y > 0 && y < 110) - typeFace.drawString(chatMessages[i], 4, y, 8388608); + font.drawString(chatMessages[i], 4, y, 8388608); line++; } if(type == 6 && splitPrivateChat == 0 && privateChatMode < 2) { if(y > 0 && y < 110) { - typeFace.drawString(English.to + Native.whitespace_b + name + Native.colon, 4, y, 0); - typeFace.drawString(chatMessages[i], typeFace.getStringWidth(English.to + Native.whitespace_b + name) + 12, y, 8388608); + font.drawString(English.to + Native.whitespace_b + name + Native.colon, 4, y, 0); + font.drawString(chatMessages[i], font.getStringWidth(English.to + Native.whitespace_b + name) + 12, y, 8388608); } line++; } if(type == 8 && (tradeMode == 0 || tradeMode == 1 && Player.hasFriend(name))) { line++; if(y > 0 && y < 110) - typeFace.drawString(name + Native.whitespace_b + chatMessages[i], 4, y, 8270336); + font.drawString(name + Native.whitespace_b + chatMessages[i], 4, y, 8270336); } } } - Rasterizer.resetBounds(); + rasterizer.resetBounds(); chatboxScrollMax = line * 14 + 7; if(chatboxScrollMax < 78) chatboxScrollMax = 78; - GameInterface.drawScrollBar(463, 0, 77, chatboxScrollMax - chatboxScroll - 77, chatboxScrollMax); + GameInterface.drawScrollBar(rasterizer, 463, 0, 77, chatboxScrollMax - chatboxScroll - 77, chatboxScrollMax); String name; if(Player.localPlayer != null && Player.localPlayer.playerName != null) name = Player.localPlayer.playerName; else name = Native.username.toString(); - typeFace.drawString(name + Native.colon, 4, 90, 0); - typeFace.drawBasicStringLegacy("@blu@" + chatboxInput + Native.asterisk, typeFace.getStringWidth(name + Native.COLON_CHARACTER) + 6, 90); - Rasterizer.drawHorizontalLine(0, 77, 479, 0); + font.drawString(name + Native.colon, 4, 90, 0); + font.drawBasicStringLegacy("@blu@" + chatboxInput + Native.asterisk, font.getStringWidth(name + Native.COLON_CHARACTER) + 6, 90); + rasterizer.drawHorizontalLine(0, 77, 479, 0); + font.setRasterizer(oldRasterizer); } else { boolean bool = Game.drawParentInterface(3, 0, 0, 479, 96, dialogueId); if(!bool) @@ -290,9 +312,9 @@ public static void drawChatBoxGraphics() { public static void method305() { // if(ScreenController.frameMode == ScreenMode.FIXED){ - chatBoxImageProducer.prepareRasterizer(); + chatBoxImageProducer.prepareRasterizer(rasterizer); // } - MovedStatics.chatboxBackgroundImage.drawImage(0, 0); + MovedStatics.chatboxBackgroundImage.drawImage(rasterizer, 0, 0); MovedStatics.chatboxLineOffsets = Rasterizer3D.setLineOffsets(MovedStatics.chatboxLineOffsets); } } From e3c3952df24fb5532fae8adfaf5b16c7301622f8 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 14:56:14 +0100 Subject: [PATCH 39/45] refactor: remove needless Rasterizer. specifiers --- .../java/org/runejs/client/MovedStatics.java | 1 - .../org/runejs/client/media/Rasterizer.java | 42 +++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index f149c2cc3..4c0dc7e3b 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -413,7 +413,6 @@ public static void method996() { tabImageProducer.prepareRasterizer(); if (ScreenController.frameMode == ScreenMode.FIXED) { inventoryBackgroundImage.drawImage(0, 0); - } else { int currentX = 0; int currentY = 0; diff --git a/src/main/java/org/runejs/client/media/Rasterizer.java b/src/main/java/org/runejs/client/media/Rasterizer.java index 0eb31552d..f111b621c 100644 --- a/src/main/java/org/runejs/client/media/Rasterizer.java +++ b/src/main/java/org/runejs/client/media/Rasterizer.java @@ -20,9 +20,9 @@ public class Rasterizer extends CachedNode { private static final int[] tmpY = new int[64]; public static void prepare(int[] pixels, int width, int height) { - Rasterizer.destinationPixels = pixels; - Rasterizer.destinationWidth = width; - Rasterizer.destinationHeight = height; + destinationPixels = pixels; + destinationWidth = width; + destinationHeight = height; setBounds(0, 0, width, height); } @@ -41,10 +41,10 @@ public static void setBounds(int minX, int minY, int maxX, int maxY) { minX = 0; if(minY < 0) minY = 0; - if(maxX > Rasterizer.destinationWidth) - maxX = Rasterizer.destinationWidth; - if(maxY > Rasterizer.destinationHeight) - maxY = Rasterizer.destinationHeight; + if(maxX > destinationWidth) + maxX = destinationWidth; + if(maxY > destinationHeight) + maxY = destinationHeight; viewportLeft = minX; viewportTop = minY; viewportRight = maxX; @@ -103,8 +103,8 @@ public static void drawFilledRectangle(int x, int y, int width, int height, int width = viewportRight - x; if(y + height > viewportBottom) height = viewportBottom - y; - int pixelOffset = Rasterizer.destinationWidth - width; - int pixel = x + y * Rasterizer.destinationWidth; + int pixelOffset = destinationWidth - width; + int pixel = x + y * destinationWidth; for(int heightCounter = -height; heightCounter < 0; heightCounter++) { for(int widthCounter = -width; widthCounter < 0; widthCounter++) destinationPixels[pixel++] = colour; @@ -134,8 +134,8 @@ public static void copyPixels(int[] pixels, int width, int height, int paintX, i width = viewportRight - paintX; if(paintY + height > viewportBottom) height = viewportBottom - paintY; - int pixelOffset = Rasterizer.destinationWidth - width; - int pixel = paintX + paintY * Rasterizer.destinationWidth; + int pixelOffset = destinationWidth - width; + int pixel = paintX + paintY * destinationWidth; for(int heightCounter = -height; heightCounter < 0; heightCounter++) { for(int widthCounter = -width; widthCounter < 0; widthCounter++) { if(pixels[sourcePixel] != Integer.MAX_VALUE) { @@ -162,8 +162,8 @@ public static void copyPixelsCutOff(int[] pixels, int srcWidth, int srcHeight, i drawWidth = viewportRight - paintX; if(paintY + drawHeight > viewportBottom) drawHeight = viewportBottom - paintY; - int pixelOffset = Rasterizer.destinationWidth - (drawWidth); - int pixel = paintX + paintY * Rasterizer.destinationWidth; + int pixelOffset = destinationWidth - (drawWidth); + int pixel = paintX + paintY * destinationWidth; for(int heightCounter = -(drawHeight); heightCounter < 0; heightCounter++) { for(int widthCounter = -(drawWidth); widthCounter < 0; widthCounter++) destinationPixels[pixel++] = pixels[sourcePixel++]; @@ -269,12 +269,12 @@ public static void drawCircleAlpha(int x, int y, int radius, int color, int alph int g = (color >> 8 & 255) * alpha; int b = (color & 255) * alpha; int topY = y - radius; - if (topY < Rasterizer.viewportTop) { - topY = Rasterizer.viewportTop; + if (topY < viewportTop) { + topY = viewportTop; } int bottomY = y + radius + 1; - if (bottomY > Rasterizer.viewportBottom) { - bottomY = Rasterizer.viewportBottom; + if (bottomY > viewportBottom) { + bottomY = viewportBottom; } int var14 = topY; int var15 = radius * radius; @@ -306,7 +306,7 @@ public static void drawCircleAlpha(int x, int y, int radius, int color, int alph if (var21 > viewportRight) { var21 = viewportRight; } - var22 = var20 + var14 * Rasterizer.destinationWidth; + var22 = var20 + var14 * destinationWidth; for (var23 = var20; var23 < var21; ++var23) { var9 = (destinationPixels[var22] >> 16 & 255) * a; var10 = (destinationPixels[var22] >> 8 & 255) * a; @@ -335,7 +335,7 @@ public static void drawCircleAlpha(int x, int y, int radius, int color, int alph if (var21 > viewportRight - 1) { var21 = viewportRight - 1; } - var22 = var20 + var14 * Rasterizer.destinationWidth; + var22 = var20 + var14 * destinationWidth; for (var23 = var20; var23 <= var21; ++var23) { var9 = (destinationPixels[var22] >> 16 & 255) * a; var10 = (destinationPixels[var22] >> 8 & 255) * a; @@ -443,8 +443,8 @@ public static void drawFilledRectangleAlpha(int x, int y, int width, int height, int r = (colour >> 16 & 0xff) * alpha; int g = (colour >> 8 & 0xff) * alpha; int b = (colour & 0xff) * alpha; - int widthOffset = Rasterizer.destinationWidth - width; - int pixel = x + y * Rasterizer.destinationWidth; + int widthOffset = destinationWidth - width; + int pixel = x + y * destinationWidth; for(int heightCounter = 0; heightCounter < height; heightCounter++) { for(int widthCounter = -width; widthCounter < 0; widthCounter++) { int red = (destinationPixels[pixel] >> 16 & 0xff) * a; From 62e3b37774bc8e3fe7c3ac0007faf0698ae68248 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 14:57:48 +0100 Subject: [PATCH 40/45] refactor: use instanced Rasterizer in ScreenController --- .../java/org/runejs/client/frame/console/Console.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/frame/console/Console.java b/src/main/java/org/runejs/client/frame/console/Console.java index dbd891a87..921016ea2 100644 --- a/src/main/java/org/runejs/client/frame/console/Console.java +++ b/src/main/java/org/runejs/client/frame/console/Console.java @@ -4,7 +4,7 @@ import org.runejs.client.cache.media.TypeFace; import org.runejs.client.cache.media.gameInterface.GameInterface; import org.runejs.client.frame.ChatBox; -import org.runejs.client.media.Rasterizer; +import org.runejs.client.frame.ScreenController; import org.runejs.client.message.outbound.console.ConsoleCommandOutboundMessage; import org.runejs.client.net.OutgoingPackets; import org.runejs.client.frame.console.Commands.*; @@ -84,11 +84,11 @@ public void drawConsole(int width, int height) { GameInterface.drawScrollBar(width - 18, 0, height-21, scrollpos, getMaxScroll()); } if (alpha) { - Rasterizer.drawFilledRectangleAlpha(0, 0, width, height, 0x513092, 97); + ScreenController.rasterizer.drawFilledRectangleAlpha(0, 0, width, height, 0x513092, 97); } else { - Rasterizer.drawFilledRectangle(0, 0, width, height, 0x513092); + ScreenController.rasterizer.drawFilledRectangle(0, 0, width, height, 0x513092); } - Rasterizer.drawHorizontalLine(1, height-19, width, 0xffffff); + ScreenController.rasterizer.drawHorizontalLine(1, height-19, width, 0xffffff); TypeFace.fontBold.setEffects(0xffffff, -1); TypeFace.fontBold.drawBasicString(">", 11, height-4); if (this.versionWidth == -1) { From e6821b6d76cfcb28055bc8477f2ae72f848d7493 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 15:06:23 +0100 Subject: [PATCH 41/45] refactor: use instanced rasterizer for minimap --- .../runejs/client/cache/media/ImageRGB.java | 50 +++++++++---------- .../java/org/runejs/client/frame/Minimap.java | 31 ++++++------ .../client/media/RasterizerInstanced.java | 7 +++ 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/ImageRGB.java b/src/main/java/org/runejs/client/cache/media/ImageRGB.java index 42af52133..5fec6691c 100644 --- a/src/main/java/org/runejs/client/cache/media/ImageRGB.java +++ b/src/main/java/org/runejs/client/cache/media/ImageRGB.java @@ -820,11 +820,11 @@ public void method722(int arg0, int arg1, int arg2, int arg3, int arg4, int arg5 } } - public void prepareRasterizer() { - Rasterizer.prepare(pixels, imageWidth, imageHeight); + public void prepareRasterizer(RasterizerInstanced rasterizer) { + rasterizer.prepare(pixels, imageWidth, imageHeight); } - public void shapeImageToPixels(int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { + public void shapeImageToPixels(RasterizerInstanced rasterizer, int x, int y, int width, int height, int arg4, int arg5, int k1, int zoom, int[] arg8, int[] arg9) { try { int centerX = -width / 2; int centerY = -height / 2; @@ -834,7 +834,7 @@ public void shapeImageToPixels(int x, int y, int width, int height, int arg4, in cosine = cosine * zoom >> 8; int i_125_ = (arg4 << 16) + centerY * sine + centerX * cosine; int i_126_ = (arg5 << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * Rasterizer.destinationWidth; + int destinationOffset = x + y * rasterizer.destinationWidth; for(y = 0; y < height; y++) { int i_128_ = arg8[y]; @@ -847,13 +847,13 @@ public void shapeImageToPixels(int x, int y, int width, int height, int arg4, in if(!(pixels.length < pixelToGet || pixelToGet < 0)){ colour = pixels[pixelToGet]; } - Rasterizer.destinationPixels[i_129_++] = colour; + rasterizer.destinationPixels[i_129_++] = colour; i_130_ += cosine; i_131_ -= sine; } i_125_ += sine; i_126_ += cosine; - destinationOffset += Rasterizer.destinationWidth; + destinationOffset += rasterizer.destinationWidth; } } catch(Exception exception) { /* empty */ @@ -861,41 +861,41 @@ public void shapeImageToPixels(int x, int y, int width, int height, int arg4, in } } - public void drawTo(IndexedImage indexedImage, int x, int y) { + public void drawTo(RasterizerInstanced rasterizer, IndexedImage indexedImage, int x, int y) { x += offsetX; y += offsetY; - int dest_ptr = x + y * Rasterizer.destinationWidth; + int dest_ptr = x + y * rasterizer.destinationWidth; int source_ptr = 0; int line_count = imageHeight; int line_width = imageWidth; - int line_offset_dest = Rasterizer.destinationWidth - line_width; + int line_offset_dest = rasterizer.destinationWidth - line_width; int line_offset_src = 0; - if(y < Rasterizer.viewportTop) { - int clip_height = Rasterizer.viewportTop - y; + if(y < rasterizer.viewportTop) { + int clip_height = rasterizer.viewportTop - y; line_count -= clip_height; - y = Rasterizer.viewportTop; + y = rasterizer.viewportTop; source_ptr += clip_height * line_width; - dest_ptr += clip_height * Rasterizer.destinationWidth; + dest_ptr += clip_height * rasterizer.destinationWidth; } - if(y + line_count > Rasterizer.viewportBottom) - line_count -= y + line_count - Rasterizer.viewportBottom; - if(x < Rasterizer.viewportLeft) { - int clip_width = Rasterizer.viewportLeft - x; + if(y + line_count > rasterizer.viewportBottom) + line_count -= y + line_count - rasterizer.viewportBottom; + if(x < rasterizer.viewportLeft) { + int clip_width = rasterizer.viewportLeft - x; line_width -= clip_width; - x = Rasterizer.viewportLeft; + x = rasterizer.viewportLeft; source_ptr += clip_width; dest_ptr += clip_width; line_offset_src += clip_width; line_offset_dest += clip_width; } - if(x + line_width > Rasterizer.viewportRight) { - int clip_width = x + line_width - Rasterizer.viewportRight; + if(x + line_width > rasterizer.viewportRight) { + int clip_width = x + line_width - rasterizer.viewportRight; line_width -= clip_width; line_offset_src += clip_width; line_offset_dest += clip_width; } if(line_width > 0 && line_count > 0) - blockCopyMask(Rasterizer.destinationPixels, pixels, 0, source_ptr, dest_ptr, line_width, line_count, line_offset_dest, line_offset_src, indexedImage.imgPixels); + blockCopyMask(rasterizer.destinationPixels, pixels, 0, source_ptr, dest_ptr, line_width, line_count, line_offset_dest, line_offset_src, indexedImage.imgPixels); } public void trim() { @@ -1024,7 +1024,7 @@ public void drawImageWithOpacity(int x, int y, int opacity) { method730(Rasterizer.destinationPixels, pixels, 0, i_149_, i, i_151_, i_150_, i_152_, i_153_, opacity); } - public void drawRotated(int x, int y, int pivotX, int pivotY, int width, int height, int zoom, double angle) { + public void drawRotated(RasterizerInstanced rasterizer, int x, int y, int pivotX, int pivotY, int width, int height, int zoom, double angle) { try { int centerX = -width / 2; int centerY = -height / 2; @@ -1034,7 +1034,7 @@ public void drawRotated(int x, int y, int pivotX, int pivotY, int width, int hei cosine = cosine * zoom >> 8; int sourceOffsetX = (pivotX << 16) + centerY * sine + centerX * cosine; int sourceoffsetY = (pivotY << 16) + centerY * cosine - centerX * sine; - int destinationOffset = x + y * Rasterizer.destinationWidth; + int destinationOffset = x + y * rasterizer.destinationWidth; for(y = 0; y < height; y++) { int i = destinationOffset; int offsetX = sourceOffsetX; @@ -1042,7 +1042,7 @@ public void drawRotated(int x, int y, int pivotX, int pivotY, int width, int hei for(x = -width; x < 0; x++) { int i_166_ = pixels[(offsetX >> 16) + (offsetY >> 16) * imageWidth]; if(i_166_ != 0) - Rasterizer.destinationPixels[i++] = i_166_; + rasterizer.destinationPixels[i++] = i_166_; else i++; offsetX += cosine; @@ -1050,7 +1050,7 @@ public void drawRotated(int x, int y, int pivotX, int pivotY, int width, int hei } sourceOffsetX += sine; sourceoffsetY += cosine; - destinationOffset += Rasterizer.destinationWidth; + destinationOffset += rasterizer.destinationWidth; } } catch(Exception exception) { /* empty */ diff --git a/src/main/java/org/runejs/client/frame/Minimap.java b/src/main/java/org/runejs/client/frame/Minimap.java index ad6c6929d..521740fda 100644 --- a/src/main/java/org/runejs/client/frame/Minimap.java +++ b/src/main/java/org/runejs/client/frame/Minimap.java @@ -5,6 +5,7 @@ import org.runejs.client.cache.media.ImageRGB; import org.runejs.client.cache.media.IndexedImage; import org.runejs.client.media.Rasterizer; +import org.runejs.client.media.RasterizerInstanced; import org.runejs.client.media.renderable.Model; import org.runejs.client.media.renderable.actor.Npc; import org.runejs.client.media.renderable.actor.Player; @@ -43,6 +44,8 @@ public class Minimap { public static int[][] anIntArrayArray129 = new int[][]{new int[16], {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}}; public static int minimapLevel = -1; + public static RasterizerInstanced rasterizer = new RasterizerInstanced(); + public static void drawOnMinimap(int x, int y, ImageRGB sprite) { if (sprite == null) { return; @@ -61,9 +64,9 @@ public static void drawOnMinimap(int x, int y, ImageRGB sprite) { int i_3_ = cosine * y + x * sine >> 16; int i_4_ = -(y * sine) + cosine * x >> 16; if (l > 2500) - sprite.drawTo(minimapBackgroundImage, 98 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 79); + sprite.drawTo(rasterizer, minimapBackgroundImage, 98 + i_3_ + -(sprite.maxWidth / 2), -(sprite.maxHeight / 2) + -i_4_ + 79); else - sprite.drawImage(4 + -(sprite.maxWidth / 2) + i_3_ + 94, -4 + -i_4_ + 83 + -(sprite.maxHeight / 2)); + sprite.drawImage(rasterizer, 4 + -(sprite.maxWidth / 2) + i_3_ + 94, -4 + -i_4_ + 83 + -(sprite.maxHeight / 2)); } public static void renderMinimap() { @@ -71,13 +74,13 @@ public static void renderMinimap() { if(minimapState == 2) { byte[] mmBackgroundPixels = minimapBackgroundImage.imgPixels; - int[] rasterPixels = Rasterizer.destinationPixels; + int[] rasterPixels = rasterizer.destinationPixels; int pixelCount = mmBackgroundPixels.length; for(int i = 0; i < pixelCount; i++) { if(mmBackgroundPixels[i] == 0) rasterPixels[i] = 0; } - minimapCompass.shapeImageToPixels(0, 0, 33, 33, 25, 25, Game.getMinimapRotation(), 256, MovedStatics.anIntArray62, MovedStatics.anIntArray66); + minimapCompass.shapeImageToPixels(rasterizer, 0, 0, 33, 33, 25, 25, Game.getMinimapRotation(), 256, MovedStatics.anIntArray62, MovedStatics.anIntArray66); drawMapBack(); return; } @@ -87,7 +90,7 @@ public static void renderMinimap() { int angle = Game.getMinimapRotation() & 0x7ff; int minimapZoom = 0; - minimapImage.shapeImageToPixels(25, 5, 146, 151, centerX, centerY, angle, minimapZoom + 256, MovedStatics.anIntArray1186, MovedStatics.anIntArray852); + minimapImage.shapeImageToPixels(rasterizer, 25, 5, 146, 151, centerX, centerY, angle, minimapZoom + 256, MovedStatics.anIntArray1186, MovedStatics.anIntArray852); for(int i = 0; minimapHintCount > i; i++) { int hintX = 2 + 4 * minimapHintX[i] + -(Player.localPlayer.worldX / 32); int hintY = 2 + 4 * minimapHintY[i] - Player.localPlayer.worldY / 32; @@ -161,9 +164,9 @@ else if(isTeammate) int flagY = 2 + 4 * Game.destinationY + -(Player.localPlayer.worldY / 32); drawOnMinimap(flagY, flagX, minimapMarkers[0]); } - Rasterizer.drawFilledRectangle(97, 78, 3, 3, 16777215); - minimapCompass.shapeImageToPixels(0, 0, 33, 33, 25, 25, Game.getMinimapRotation(), 256, MovedStatics.anIntArray62, MovedStatics.anIntArray66); - minimapBackgroundImage.drawImage(0, 0); + rasterizer.drawFilledRectangle(97, 78, 3, 3, 16777215); + minimapCompass.shapeImageToPixels(rasterizer, 0, 0, 33, 33, 25, 25, Game.getMinimapRotation(), 256, MovedStatics.anIntArray62, MovedStatics.anIntArray66); + minimapBackgroundImage.drawImage(rasterizer, 0, 0); if(MovedStatics.menuOpen && MovedStatics.menuScreenArea == 1) { MovedStatics.drawMenu(550, 4); @@ -173,7 +176,7 @@ else if(isTeammate) } public static void createMinimapRaster() { - mapbackProducingGraphicsBuffer.prepareRasterizer(); + mapbackProducingGraphicsBuffer.prepareRasterizer(rasterizer); } private static void drawMinimapIcon(ImageRGB sprite, int mapX, int mapY) { @@ -191,7 +194,7 @@ private static void drawMinimapIcon(ImageRGB sprite, int mapX, int mapY) { double angle = Math.atan2(x, y); int drawX = (int) (Math.sin(angle) * 63.0); int drawY = (int) (57.0 * Math.cos(angle)); - MovedStatics.minimapEdge.drawRotated(-10 + 94 + drawX + 4, 83 + -drawY + -20, 15, 15, 20, 20, 256, angle); + MovedStatics.minimapEdge.drawRotated(rasterizer, -10 + 94 + drawX + 4, 83 + -drawY + -20, 15, 15, 20, 20, 256, angle); } else { drawOnMinimap(mapY, mapX, sprite); } @@ -276,7 +279,7 @@ private static void drawObject(int plane, int tileX, int wallRGB, int doorRGB, i if(iconSprite != null) { int offsetX = (-iconSprite.imgWidth + gameObjectDefinition.sizeX * 4) / 2; int offsetY = (gameObjectDefinition.sizeY * 4 + -iconSprite.imgHeight) / 2; - iconSprite.drawImage(48 + 4 * tileX + offsetX, offsetY + 48 + (104 + -tileY - gameObjectDefinition.sizeY) * 4); + iconSprite.drawImage(rasterizer, 48 + 4 * tileX + offsetX, offsetY + 48 + (104 + -tileY - gameObjectDefinition.sizeY) * 4); } } } @@ -292,7 +295,7 @@ private static void drawObject(int plane, int tileX, int wallRGB, int doorRGB, i if(iconSprite != null) { int offsetY = (-iconSprite.imgHeight + gameObjectDefinition.sizeY * 4) / 2; int offsetX = (gameObjectDefinition.sizeX * 4 + -iconSprite.imgWidth) / 2; - iconSprite.drawImage(offsetX + tileX * 4 + 48, 48 - (-(4 * (-tileY + 104 + -gameObjectDefinition.sizeY)) + -offsetY)); + iconSprite.drawImage(rasterizer, offsetX + tileX * 4 + 48, 48 - (-(4 * (-tileY + 104 + -gameObjectDefinition.sizeY)) + -offsetY)); } } else if(type == 9) { int[] dest = minimapImage.pixels; @@ -322,7 +325,7 @@ private static void drawObject(int plane, int tileX, int wallRGB, int doorRGB, i if(iconSprite != null) { int i_17_ = (-iconSprite.imgWidth + gameObjectDefinition.sizeX * 4) / 2; int i_18_ = (-iconSprite.imgHeight + 4 * gameObjectDefinition.sizeY) / 2; - iconSprite.drawImage(4 * tileX + 48 + i_17_, i_18_ + (104 - (tileY + gameObjectDefinition.sizeY)) * 4 + 48); + iconSprite.drawImage(rasterizer, 4 * tileX + 48 + i_17_, i_18_ + (104 - (tileY + gameObjectDefinition.sizeY)) * 4 + 48); } } } @@ -343,7 +346,7 @@ public static void createMinimap(int plane) { offset += 4; } } - minimapImage.prepareRasterizer(); + minimapImage.prepareRasterizer(rasterizer); // generate slightly random offset door and wall colors // door: (228, 228, 228) to (248, 248, 248) diff --git a/src/main/java/org/runejs/client/media/RasterizerInstanced.java b/src/main/java/org/runejs/client/media/RasterizerInstanced.java index bfea72def..9a2840fd0 100644 --- a/src/main/java/org/runejs/client/media/RasterizerInstanced.java +++ b/src/main/java/org/runejs/client/media/RasterizerInstanced.java @@ -21,6 +21,13 @@ public class RasterizerInstanced extends CachedNode { private static final int[] tmpX = new int[64]; private static final int[] tmpY = new int[64]; + public RasterizerInstanced() { + this.destinationPixels = new int[0]; + this.destinationWidth = 0; + this.destinationHeight = 0; + setBounds(0, 0, 0, 0); + } + public RasterizerInstanced(int[] pixels, int width, int height) { this.destinationPixels = pixels; this.destinationWidth = width; From 483975b2772e6c52b7d0d91b73233c1ab5fc74f1 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 15:06:31 +0100 Subject: [PATCH 42/45] refactor: dont extend Rasterizer in ImageRGB --- src/main/java/org/runejs/client/cache/media/ImageRGB.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/runejs/client/cache/media/ImageRGB.java b/src/main/java/org/runejs/client/cache/media/ImageRGB.java index 5fec6691c..cef4b3a86 100644 --- a/src/main/java/org/runejs/client/cache/media/ImageRGB.java +++ b/src/main/java/org/runejs/client/cache/media/ImageRGB.java @@ -4,12 +4,13 @@ import org.runejs.client.cache.CacheArchive; import org.runejs.client.media.Rasterizer; import org.runejs.client.media.RasterizerInstanced; +import org.runejs.client.node.CachedNode; import org.runejs.client.util.BitUtils; import java.awt.*; import java.awt.image.PixelGrabber; -public class ImageRGB extends Rasterizer { +public class ImageRGB extends CachedNode { public int offsetY; public int imageHeight; public int imageWidth; From 53d7b485950bea7ab845d3c99c64e696dba2d134 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 17:13:40 +0100 Subject: [PATCH 43/45] refactor: use instanced rasterizer for console scrollbar --- src/main/java/org/runejs/client/frame/console/Console.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/runejs/client/frame/console/Console.java b/src/main/java/org/runejs/client/frame/console/Console.java index 921016ea2..0161bc401 100644 --- a/src/main/java/org/runejs/client/frame/console/Console.java +++ b/src/main/java/org/runejs/client/frame/console/Console.java @@ -81,7 +81,7 @@ public void drawConsole(int width, int height) { if (consoleOpen) { int scrollpos = getMaxScroll() - currentScroll - 310; if (messageCount > 17) { - GameInterface.drawScrollBar(width - 18, 0, height-21, scrollpos, getMaxScroll()); + GameInterface.drawScrollBar(ScreenController.rasterizer, width - 18, 0, height-21, scrollpos, getMaxScroll()); } if (alpha) { ScreenController.rasterizer.drawFilledRectangleAlpha(0, 0, width, height, 0x513092, 97); From 1c0ac11a84772cab071c5001421155d46e30ccc1 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 17:18:53 +0100 Subject: [PATCH 44/45] refactor: convert "loading text" to instanced rasterizer --- src/main/java/org/runejs/client/MovedStatics.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index 4c0dc7e3b..45683c297 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -1893,17 +1893,22 @@ public static void method940(String arg1, boolean arg2, String arg3) { int i = 151; method1018(); i -= 3; + + RasterizerInstanced oldRasterizer = fontNormal.getRasterizer(); + fontNormal.setRasterizer(ScreenController.rasterizer); + fontNormal.drawStringLeft(arg1, 257, i, 0); fontNormal.drawStringLeft(arg1, 256, i + -1, 16777215); if(arg3 != null) { i += 15; if(arg2) { int i_0_ = 4 + fontNormal.getStringWidth(arg3); - Rasterizer.drawFilledRectangle(257 - i_0_ / 2, -11 + i, i_0_, 11, 0); + ScreenController.rasterizer.drawFilledRectangle(257 - i_0_ / 2, -11 + i, i_0_, 11, 0); } fontNormal.drawStringLeft(arg3, 257, i, 0); fontNormal.drawStringLeft(arg3, 256, i - 1, 16777215); } + fontNormal.setRasterizer(oldRasterizer); drawGameScreenGraphics(); } From a0322d9f729130193afe4a4ee8f9075a054632e7 Mon Sep 17 00:00:00 2001 From: James Monger Date: Fri, 21 Jul 2023 17:21:00 +0100 Subject: [PATCH 45/45] refactor: convert healthbar to instanced rasterizer --- src/main/java/org/runejs/client/MovedStatics.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/runejs/client/MovedStatics.java b/src/main/java/org/runejs/client/MovedStatics.java index 45683c297..52f347324 100644 --- a/src/main/java/org/runejs/client/MovedStatics.java +++ b/src/main/java/org/runejs/client/MovedStatics.java @@ -2354,8 +2354,8 @@ else if(i < Player.localPlayerCount) int i_1_ = 30 * actor.remainingHitpoints / actor.maximumHitpoints; if(i_1_ > 30) i_1_ = 30; - Rasterizer.drawFilledRectangle(-15 + screenPos.x, screenPos.y + -3, i_1_, 5, 65280); - Rasterizer.drawFilledRectangle(-15 + screenPos.x + i_1_, screenPos.y + -3, 30 + -i_1_, 5, 16711680); + ScreenController.rasterizer.drawFilledRectangle(-15 + screenPos.x, screenPos.y + -3, i_1_, 5, 65280); + ScreenController.rasterizer.drawFilledRectangle(-15 + screenPos.x + i_1_, screenPos.y + -3, 30 + -i_1_, 5, 16711680); } } for(int i_2_ = 0; i_2_ < 4; i_2_++) {