From 4e739963d389ecf6838d1362f82d13079e46da4c Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 20 Mar 2024 14:44:26 +0900 Subject: [PATCH] copper sign actually spawns but still wip --- .../fixtures/text_sign_glass_copper.tga | 2 +- src/net/torvald/terrarum/gameactors/Actor.kt | 1 + .../terrarum/modulebasegame/BuildingMaker.kt | 19 +++++----- .../terrarum/modulebasegame/IngameRenderer.kt | 24 ++++++++----- .../terrarum/modulebasegame/TerrarumIngame.kt | 7 +++- .../terrarum/modulebasegame/TitleScreen.kt | 1 + .../modulebasegame/gameactors/Electric.kt | 4 +-- .../gameactors/FixtureTextSignCopper.kt | 35 +++++++++++++++---- 8 files changed, 65 insertions(+), 28 deletions(-) diff --git a/assets/mods/basegame/sprites/fixtures/text_sign_glass_copper.tga b/assets/mods/basegame/sprites/fixtures/text_sign_glass_copper.tga index f27df651e..1564f90ec 100644 --- a/assets/mods/basegame/sprites/fixtures/text_sign_glass_copper.tga +++ b/assets/mods/basegame/sprites/fixtures/text_sign_glass_copper.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd667660f1cfd8c1442358322ee830e7fed4e7863ed7301261e563e969442145 +oid sha256:e229cce1cb9a99dbd9b0617bec7d024a9c872140566f6a733cf954dc2128fa21 size 32786 diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 5cd5b9728..1ad416729 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -51,6 +51,7 @@ abstract class Actor : Comparable, Runnable { enum class RenderOrder { + FAR_BEHIND, // wires BEHIND, // tapestries, some particles (obstructed by terrain) MIDDLE, // actors MIDTOP, // bullets, thrown items diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index ba3c6dd19..03316e347 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -432,7 +432,7 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { wireActor.renderOrder = Actor.RenderOrder.OVERLAY } else { - wireActor.renderOrder = Actor.RenderOrder.BEHIND + wireActor.renderOrder = Actor.RenderOrder.FAR_BEHIND } wireActor.isUpdate = true @@ -458,14 +458,15 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { _testMarkerDrawCalls = 0L IngameRenderer.invoke(delta, false, - screenZoom, - listOf(), - listOf(), - listOf(), - listOf(), - if (showSelection) actorsRenderOverlay + essentialOverlays else essentialOverlays, - particles, - uiContainer = uiContainer + screenZoom, + listOf(), + listOf(), + listOf(), + listOf(), + listOf(), + if (showSelection) actorsRenderOverlay + essentialOverlays else essentialOverlays, + particles, + uiContainer = uiContainer ) App.setDebugTime("Test.MarkerDrawCalls", _testMarkerDrawCalls) diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 5112ddc1c..847eae3b8 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -231,6 +231,7 @@ object IngameRenderer : Disposable { frameDelta: Float, gamePaused: Boolean, zoom: Float = 1f, + actorsRenderFarBehind : List, actorsRenderBehind : List, actorsRenderMiddle : List, actorsRenderMidTop : List, @@ -240,11 +241,13 @@ object IngameRenderer : Disposable { player: ActorWithBody? = null, uiContainer: UIContainer? = null, ) { - renderingActorsCount = (actorsRenderBehind.size) + - (actorsRenderMiddle.size) + - (actorsRenderMidTop.size) + - (actorsRenderFront.size) + - (actorsRenderOverlay.size) + renderingActorsCount = + (actorsRenderFarBehind.size) + + (actorsRenderBehind.size) + + (actorsRenderMiddle.size) + + (actorsRenderMidTop.size) + + (actorsRenderFront.size) + + (actorsRenderOverlay.size) renderingUIsCount = uiContainer?.countVisible() ?: 0 invokeInit() @@ -259,15 +262,15 @@ object IngameRenderer : Disposable { measureDebugTime("Renderer.LightRun*") { // recalculate for even frames, or if the sign of the cam-x changed if (App.GLOBAL_RENDER_TIMER % 3 == 0 || Math.abs(WorldCamera.x - oldCamX) >= world.width * 0.85f * TILE_SIZEF || newWorldLoadedLatch) { - LightmapRenderer.recalculate(actorsRenderBehind + actorsRenderFront + actorsRenderMidTop + actorsRenderMiddle + actorsRenderOverlay) + LightmapRenderer.recalculate(actorsRenderFarBehind + actorsRenderBehind + actorsRenderFront + actorsRenderMidTop + actorsRenderMiddle + actorsRenderOverlay) } oldCamX = WorldCamera.x } prepLightmapRGBA() BlocksDrawer.renderData() - drawToRGB(frameDelta, actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, actorsRenderOverlay, particlesContainer) - drawToA(frameDelta, actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, actorsRenderOverlay, particlesContainer) + drawToRGB(frameDelta, actorsRenderFarBehind, actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, actorsRenderOverlay, particlesContainer) + drawToA(frameDelta, actorsRenderFarBehind, actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, actorsRenderOverlay, particlesContainer) drawOverlayActors(frameDelta, actorsRenderOverlay) if (player != null && player is Pocketed) drawAimGuide(frameDelta, player) @@ -464,6 +467,7 @@ object IngameRenderer : Disposable { private fun drawToRGB( frameDelta: Float, + actorsRenderFarBehind: List?, actorsRenderBehind: List?, actorsRenderMiddle: List?, actorsRenderMidTop: List?, @@ -485,6 +489,7 @@ object IngameRenderer : Disposable { batch.shader = shaderForActors batch.color = Color.WHITE moveCameraToWorldCoord() + actorsRenderFarBehind?.forEach { it.drawBody(frameDelta, batch) } actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) } particlesContainer?.forEach { it.drawBody(frameDelta, batch) } } @@ -523,6 +528,7 @@ object IngameRenderer : Disposable { batch.shader = shaderForActors batch.color = Color.WHITE moveCameraToWorldCoord() + actorsRenderFarBehind?.forEach { it.drawEmissive(frameDelta, batch) } actorsRenderBehind?.forEach { it.drawEmissive(frameDelta, batch) } particlesContainer?.forEach { it.drawEmissive(frameDelta, batch) } } @@ -628,6 +634,7 @@ object IngameRenderer : Disposable { private fun drawToA( frameDelta: Float, + actorsRenderFarBehind: List?, actorsRenderBehind: List?, actorsRenderMiddle: List?, actorsRenderMidTop: List?, @@ -652,6 +659,7 @@ object IngameRenderer : Disposable { batch.color = Color.WHITE moveCameraToWorldCoord() + actorsRenderFarBehind?.forEach { it.drawGlow(frameDelta, batch) } actorsRenderBehind?.forEach { it.drawGlow(frameDelta, batch) } particlesContainer?.forEach { it.drawGlow(frameDelta, batch) } } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index ba77edad8..59fbe3995 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -90,6 +90,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { val particlesContainer = CircularArray(PARTICLES_MAX, true) // these are required because actors always change their position + private var visibleActorsRenderFarBehind: ArrayList = ArrayList(1) private var visibleActorsRenderBehind: ArrayList = ArrayList(1) private var visibleActorsRenderMiddle: ArrayList = ArrayList(1) private var visibleActorsRenderMidTop: ArrayList = ArrayList(1) @@ -1094,6 +1095,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { frameDelta, paused, screenZoom, + visibleActorsRenderFarBehind, visibleActorsRenderBehind, visibleActorsRenderMiddle, visibleActorsRenderMidTop, @@ -1261,7 +1263,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { wireActor.renderOrder = Actor.RenderOrder.OVERLAY } else { - wireActor.renderOrder = Actor.RenderOrder.BEHIND + wireActor.renderOrder = Actor.RenderOrder.FAR_BEHIND } wireActor.isUpdate = true @@ -1312,6 +1314,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } private fun filterVisibleActors() { + visibleActorsRenderFarBehind.clear() visibleActorsRenderBehind.clear() visibleActorsRenderMiddle.clear() visibleActorsRenderMidTop.clear() @@ -1511,6 +1514,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { private fun actorToRenderQueue(actor: ActorWithBody): ArrayList { return when (actor.renderOrder) { + Actor.RenderOrder.FAR_BEHIND -> visibleActorsRenderFarBehind Actor.RenderOrder.BEHIND -> visibleActorsRenderBehind Actor.RenderOrder.MIDDLE -> visibleActorsRenderMiddle Actor.RenderOrder.MIDTOP -> visibleActorsRenderMidTop @@ -1772,6 +1776,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } override fun dispose() { + visibleActorsRenderFarBehind.forEach { it.dispose() } visibleActorsRenderBehind.forEach { it.dispose() } visibleActorsRenderMiddle.forEach { it.dispose() } visibleActorsRenderMidTop.forEach { it.dispose() } diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index bfe4f0c45..fae83d629 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -372,6 +372,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { listOf(), listOf(), listOf(), + listOf(), particles, uiContainer = uiContainer ) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/Electric.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/Electric.kt index 81b2ab677..adf5990e0 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/Electric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/Electric.kt @@ -135,8 +135,8 @@ open class Electric : FixtureBase { getWireStateAt(offsetX, offsetY, "digital_bit").x <= ELECTRIC_THRESHOLD_LOW || getWireEmissionAt(offsetX, offsetY).x <= ELECTRIC_THRESHOLD_LOW - private val oldSinkStatus: Array - private val newSinkStatus: Array + protected var oldSinkStatus: Array + protected var newSinkStatus: Array open fun updateOnWireGraphTraversal(offsetX: Int, offsetY: Int, sinkType: WireEmissionType) { val index = pointToBlockBoxIndex(offsetX, offsetY) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTextSignCopper.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTextSignCopper.kt index 035ce2b5d..2713ff87a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTextSignCopper.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTextSignCopper.kt @@ -5,13 +5,11 @@ import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.spriteanimation.SheetSpriteAnimation -import net.torvald.terrarum.App -import net.torvald.terrarum.CommonResourcePool -import net.torvald.terrarum.ModMgr +import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.langpack.Lang -import net.torvald.terrarum.toInt import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import org.dyn4j.geometry.Vector2 import java.util.* /** @@ -28,17 +26,40 @@ class FixtureTextSignCopper : Electric { var text = "헬로 월드!" var panelCount = 5 + private var initialised = false + constructor() : super( BlockBox(BlockBox.NO_COLLISION, 2, 2), renderOrder = RenderOrder.BEHIND, nameFun = { Lang["ITEM_COPPER_SIGN"] } - ) + ) { + reload() + } + + constructor(text: String, panelCount: Int) : super( + BlockBox(BlockBox.NO_COLLISION, panelCount, 2), + renderOrder = RenderOrder.BEHIND, + nameFun = { Lang["ITEM_COPPER_SIGN"] } + ) { + this.text = text + this.panelCount = panelCount + reload() + } override fun spawn(posX: Int, posY: Int, installersUUID: UUID?): Boolean = spawn(posX, posY, installersUUID, panelCount.coerceAtLeast(2), 2) override fun reload() { super.reload() + if (!initialised) { + initialised = true + + blockBox = BlockBox(BlockBox.NO_COLLISION, panelCount, 2) + setHitboxDimension(TILE_SIZE * blockBox.width, TILE_SIZE * blockBox.height, 0, 2) + oldSinkStatus = Array(blockBox.width * blockBox.height) { Vector2() } + newSinkStatus = Array(blockBox.width * blockBox.height) { Vector2() } + } + // must be re-spawned on reload to make it visible after load spawn( intTilewiseHitbox.canonicalX.toInt(), @@ -100,11 +121,11 @@ class FixtureTextSignCopper : Electric { makeNewSprite(TextureRegionPack(Texture(pixmapSprite), W * panelCount, H / 2)).let { it.setRowsAndFrames(2, 1) - it.delays = FloatArray(1) { Float.POSITIVE_INFINITY } + it.delays = FloatArray(2) { Float.POSITIVE_INFINITY } } makeNewSpriteEmissive(TextureRegionPack(Texture(pixmapSpriteEmsv), W * panelCount, H / 2)).let { it.setRowsAndFrames(2, 1) - it.delays = FloatArray(1) { Float.POSITIVE_INFINITY } + it.delays = FloatArray(2) { Float.POSITIVE_INFINITY } } textOverlay = SheetSpriteAnimation(this).also {