Convert to volatile and centralize logic to the altcanvas.

This commit is contained in:
downthecrop 2024-10-24 20:50:56 -07:00
parent 8e554b573c
commit af4dafee89

View file

@ -45,7 +45,7 @@ import rt4.client.js5Archive8
import rt4.client.mainLoadState import rt4.client.mainLoadState
import java.awt.* import java.awt.*
import java.awt.event.* import java.awt.event.*
import java.awt.image.BufferedImage import java.awt.image.VolatileImage
import javax.swing.* import javax.swing.*
import javax.swing.plaf.nimbus.AbstractRegionPainter import javax.swing.plaf.nimbus.AbstractRegionPainter
@ -151,20 +151,15 @@ class plugin : Plugin() {
lastLogin = Player.usernameInput.toString() lastLogin = Player.usernameInput.toString()
} }
class AltCanvas(private val mainCanvas: Canvas) : JPanel() { class AltCanvas(private val mainCanvas: Canvas) : JPanel() {
private var gameImage: BufferedImage? = null private var gameImage: VolatileImage? = null
private var scaleX = 1.0 private var scaleX = 1.0
private var scaleY = 1.0 private var scaleY = 1.0
private var offsetX = 0 private var offsetX = 0
private var offsetY = 0 private var offsetY = 0
init { init {
gameImage = BufferedImage(765, 503, BufferedImage.TYPE_INT_ARGB) validateGameImage()
val g = gameImage!!.createGraphics()
g.color = Color.RED
g.fillRect(0, 0, gameImage!!.width, gameImage!!.height)
g.color = Color.BLACK
g.drawString("Game Frame", 20, 20)
g.dispose()
addMouseListener(object : MouseAdapter() { addMouseListener(object : MouseAdapter() {
override fun mousePressed(e: MouseEvent) { override fun mousePressed(e: MouseEvent) {
@ -193,26 +188,55 @@ class plugin : Plugin() {
// Register a KeyAdapter for handling key events // Register a KeyAdapter for handling key events
addKeyListener(object : KeyAdapter() { addKeyListener(object : KeyAdapter() {
override fun keyPressed(e: KeyEvent) { override fun keyPressed(e: KeyEvent) {
for(listener in canvas.keyListeners){ for (listener in mainCanvas.keyListeners) {
listener.keyPressed(e) listener.keyPressed(e)
} }
} }
override fun keyReleased(e: KeyEvent) { override fun keyReleased(e: KeyEvent) {
for(listener in canvas.keyListeners){ for (listener in mainCanvas.keyListeners) {
listener.keyReleased(e) listener.keyReleased(e)
} }
} }
override fun keyTyped(e: KeyEvent) { override fun keyTyped(e: KeyEvent) {
for(listener in canvas.keyListeners){ for (listener in mainCanvas.keyListeners) {
listener.keyTyped(e) listener.keyTyped(e)
} }
} }
}) })
isFocusable = true isFocusable = true
requestFocusInWindow() }
private fun validateGameImage() {
val gc = GraphicsEnvironment.getLocalGraphicsEnvironment().defaultScreenDevice.defaultConfiguration
if (gameImage == null) {
gameImage = gc.createCompatibleVolatileImage(765, 503, Transparency.TRANSLUCENT)
renderGameImage()
} else {
val status = gameImage!!.validate(gc)
if (status == VolatileImage.IMAGE_INCOMPATIBLE) {
gameImage = gc.createCompatibleVolatileImage(765, 503, Transparency.TRANSLUCENT)
renderGameImage()
} else if (status == VolatileImage.IMAGE_RESTORED) {
renderGameImage()
}
}
}
private fun renderGameImage() {
val g = gameImage!!.createGraphics()
try {
// Initial drawing code
g.color = Color.RED
g.fillRect(0, 0, gameImage!!.width, gameImage!!.height)
g.color = Color.BLACK
g.drawString("Game Frame", 20, 20)
// Add any additional rendering here
} finally {
g.dispose()
}
} }
override fun paintComponent(g: Graphics) { override fun paintComponent(g: Graphics) {
@ -222,6 +246,9 @@ class plugin : Plugin() {
// Set the desired background fill color here // Set the desired background fill color here
g2d.color = Color.BLACK g2d.color = Color.BLACK
g2d.fillRect(0, 0, width, height) g2d.fillRect(0, 0, width, height)
validateGameImage()
gameImage?.let { image -> gameImage?.let { image ->
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR)
@ -267,8 +294,14 @@ class plugin : Plugin() {
mainCanvas.dispatchEvent(newEvent) mainCanvas.dispatchEvent(newEvent)
} }
fun updateGameImage(newImage: BufferedImage) { fun updateGameImage() {
gameImage = newImage validateGameImage()
val g = gameImage!!.createGraphics()
try {
SoftwareRaster.frameBuffer.draw(g)
} finally {
g.dispose()
}
repaint() repaint()
} }
} }
@ -279,16 +312,6 @@ class plugin : Plugin() {
} }
} }
fun getRasterImageFromGameShell(): BufferedImage {
// Assuming SoftwareRaster.pixels is an IntArray containing ARGB values of the game image.
val gameImage = BufferedImage(765, 503, BufferedImage.TYPE_INT_ARGB)
val g = gameImage.createGraphics()
SoftwareRaster.frameBuffer.draw(g)
return gameImage
}
private var altCanvas: AltCanvas? = null private var altCanvas: AltCanvas? = null
@ -427,7 +450,7 @@ class plugin : Plugin() {
} }
} }
override fun LateDraw(timeDelta: Long) { override fun Draw(timeDelta: Long) {
if (GlRenderer.enabled && GlRenderer.canvasWidth != GameShell.canvasWidth) { if (GlRenderer.enabled && GlRenderer.canvasWidth != GameShell.canvasWidth) {
GlRenderer.canvasWidth = GameShell.canvasWidth GlRenderer.canvasWidth = GameShell.canvasWidth
GlRenderer.setViewportBounds(0, 0, GameShell.canvasWidth, GameShell.canvasHeight) GlRenderer.setViewportBounds(0, 0, GameShell.canvasWidth, GameShell.canvasHeight)
@ -449,10 +472,6 @@ class plugin : Plugin() {
accumulatedTime = 0L accumulatedTime = 0L
} }
// Update game image here
val rasterImage = getRasterImageFromGameShell()
altCanvas?.updateGameImage(rasterImage)
// Draw synced actions (that require to be done between glBegin and glEnd) // Draw synced actions (that require to be done between glBegin and glEnd)
if (drawActions.isNotEmpty()) { if (drawActions.isNotEmpty()) {
synchronized(drawActions) { synchronized(drawActions) {
@ -470,6 +489,11 @@ class plugin : Plugin() {
} }
} }
override fun LateDraw(timeDelta: Long){
// Update game image here
altCanvas?.updateGameImage()
}
private fun initKondoUI(){ private fun initKondoUI(){
DrawText(FontType.LARGE, fromColor(Color(16777215)), TextModifier.CENTER, "KondoKit Loading Sprites...", GameShell.canvasWidth/2, GameShell.canvasHeight/2) DrawText(FontType.LARGE, fromColor(Color(16777215)), TextModifier.CENTER, "KondoKit Loading Sprites...", GameShell.canvasWidth/2, GameShell.canvasHeight/2)
if(!allSpritesLoaded()) return; if(!allSpritesLoaded()) return;