From 7a60ae062980576718375ea62e120d1380801f87 Mon Sep 17 00:00:00 2001 From: Minjae Song Date: Wed, 12 Dec 2018 02:49:09 +0900 Subject: [PATCH] support for screen-overlay actors; buildingmaker has light now --- REFERENCING.md | 13 +++---- src/net/torvald/terrarum/Terrarum.kt | 7 ++-- src/net/torvald/terrarum/gameactors/Actor.kt | 12 ++++--- .../terrarum/modulebasegame/BuildingMaker.kt | 27 +++++++++----- .../torvald/terrarum/modulebasegame/Ingame.kt | 2 ++ .../terrarum/modulebasegame/IngameRenderer.kt | 36 +++++++++++++++---- .../worlddrawer/LightmapRendererNew.kt | 2 +- 7 files changed, 69 insertions(+), 30 deletions(-) diff --git a/REFERENCING.md b/REFERENCING.md index 24fea0c50..8e279d897 100644 --- a/REFERENCING.md +++ b/REFERENCING.md @@ -5,8 +5,8 @@ |8192..8447|Wires (256 possible)| |8448..32767|Items (static) (24320 possible)| |32768..0x0FFF_FFFF|Items (dynamic\*) (268M possible)| -|0x1000_0000..0x7FFF_FFFF|Actors| -|-2147483648..-1 (all negative numbers)|Faction| +|0x1000_0000..0x7FFF_FFFF|Actors (1879M possible)| +|-2147483648..-1 (all negative numbers)|Faction (2147M possible)| * dynamic items have own properties that will persist through savegame. @@ -14,7 +14,8 @@ Actors range in-depth |Range|Description| |-----|-----------| -|0x1000_0000..0x1FFF_FFFF|Rendered behind (e.g. tapestries) -|0x2000_0000..0x5FFF_FFFF|Regular actors (e.g. almost all of them) -|0x6000_0000..0x6FFF_FFFF|Special (e.g. weapon swung, bullets, dropped item, particles) -|0x7000_0000..0x7FFF_FFFF|Rendered front (e.g. fake tile) \ No newline at end of file +|0x1000_0000..0x1FFF_FFFF|Rendered behind (e.g. tapestries)| +|0x2000_0000..0x4FFF_FFFF|Regular actors (e.g. almost all of them)| +|0x5000_0000..0x5FFF_FFFF|Special (e.g. weapon swung, bullets, dropped item, particles)| +|0x6000_0000..0x6FFF_FFFF|Rendered front (e.g. fake tile)| +|0x7000_0000..0x7FFF_FFFF|Rendered as screen overlay, not affected by light nor environment overlays| \ No newline at end of file diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 2f533bce3..b35f506e9 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -421,17 +421,17 @@ object Terrarum : Screen { // jump right into the ingame - val ingame = Ingame(batch) + /*val ingame = Ingame(batch) ingame.gameLoadInfoPayload = Ingame.NewWorldParameters(2400, 800, HQRNG().nextLong()) ingame.gameLoadMode = Ingame.GameLoadMode.CREATE_NEW LoadScreen.screenToLoad = ingame this.ingame = ingame - setScreen(LoadScreen) + setScreen(LoadScreen)*/ // title screen - //AppLoader.getINSTANCE().setScreen(TitleScreen(batch)) + AppLoader.getINSTANCE().setScreen(TitleScreen(batch)) } fun setScreen(screen: Screen) { @@ -728,6 +728,7 @@ object Terrarum : Screen { Actor.RenderOrder.MIDDLE -> Actor.RANGE_MIDDLE Actor.RenderOrder.MIDTOP -> Actor.RANGE_MIDTOP Actor.RenderOrder.FRONT -> Actor.RANGE_FRONT + Actor.RenderOrder.OVERLAY-> Actor.RANDE_OVERLAY } } catch (gameNotInitialisedException: KotlinNullPointerException) { diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index b6aa772b8..5585db8cd 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -19,14 +19,16 @@ abstract class Actor(val renderOrder: RenderOrder) : Comparable, Runnable BEHIND, // tapestries, some particles (obstructed by terrain) MIDDLE, // actors MIDTOP, // bullets, thrown items - FRONT // fake tiles + FRONT, // fake tiles + OVERLAY // screen overlay, not affected by lightmap } companion object { - val RANGE_BEHIND = ACTORID_MIN..0x1FFF_FFFF - val RANGE_MIDDLE = 0x2000_0000..0x5FFF_FFFF - val RANGE_MIDTOP = 0x6000_0000..0x6FFF_FFFF - val RANGE_FRONT = 0x7000_0000..0x7FFF_FFFF + val RANGE_BEHIND = ACTORID_MIN..0x1FFF_FFFF // 1 + val RANGE_MIDDLE = 0x2000_0000..0x4FFF_FFFF // 3 + val RANGE_MIDTOP = 0x5000_0000..0x5FFF_FFFF // 1 + val RANGE_FRONT = 0x6000_0000..0x6FFF_FFFF // 1 + val RANDE_OVERLAY= 0x7000_0000..0x7FFF_FFFF // 1 } abstract fun update(delta: Float) diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index 214518523..bd61a4b17 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -3,15 +3,13 @@ package net.torvald.terrarum.modulebasegame import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.terrarum.AppLoader -import net.torvald.terrarum.IngameInstance -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.Yaml +import net.torvald.terrarum.* import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension +import net.torvald.terrarum.modulebasegame.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.ui.Notification import net.torvald.terrarum.modulebasegame.ui.UIBuildingMakerToolbox import net.torvald.terrarum.ui.UICanvas @@ -56,18 +54,24 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { val uiContainer = ArrayList() - val blockPointingCursor = object : ActorWithBody(Actor.RenderOrder.FRONT) { + val blockPointingCursor = object : ActorWithBody(Actor.RenderOrder.OVERLAY) { override var referenceID: ActorID? = Terrarum.generateUniqueReferenceID(renderOrder) val body = TextureRegionPack(Gdx.files.internal("assets/graphics/blocks/block_markings_common.tga"), 16, 16) override val hitbox = Hitbox(0.0, 0.0, 16.0, 16.0) + init { + this.actorValue[AVKey.LUMR] = 1.0 + this.actorValue[AVKey.LUMG] = 1.0 + } + override fun drawBody(batch: SpriteBatch) { batch.color = Color.YELLOW batch.draw(body.get(0, 0), hitbox.startX.toFloat(), hitbox.startY.toFloat()) } override fun drawGlow(batch: SpriteBatch) { } + override fun dispose() { body.dispose() } @@ -89,10 +93,13 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { protected var updateDeltaCounter = 0.0 protected val updateRate = 1.0 / Terrarum.TARGET_INTERNAL_FPS - private val actorsRenderTop = ArrayList() + private val actorsRenderOverlay = ArrayList() init { - actorsRenderTop.add(blockPointingCursor) + gameWorld.time.setTimeOfToday(WorldTime.HOUR_SEC * 10) + gameWorld.globalLight = Color(.8f,.8f,.8f,.8f) + + actorsRenderOverlay.add(blockPointingCursor) uiContainer.add(uiToolbox) uiContainer.add(notifier) @@ -160,7 +167,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { } private fun renderGame() { - IngameRenderer(world as GameWorldExtension, actorsRenderFront = actorsRenderTop, uisToDraw = uiContainer) + IngameRenderer(world as GameWorldExtension, actorsRenderOverlay = actorsRenderOverlay, uisToDraw = uiContainer) } override fun resize(width: Int, height: Int) { @@ -171,7 +178,9 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { println("[BuildingMaker] Resize event") } - + override fun dispose() { + IngameRenderer.dispose() + } private val menuYaml = Yaml(""" - File diff --git a/src/net/torvald/terrarum/modulebasegame/Ingame.kt b/src/net/torvald/terrarum/modulebasegame/Ingame.kt index b926c2ee6..a43f91bb9 100644 --- a/src/net/torvald/terrarum/modulebasegame/Ingame.kt +++ b/src/net/torvald/terrarum/modulebasegame/Ingame.kt @@ -64,6 +64,7 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) { private val actorsRenderMiddle = ArrayList(ACTORCONTAINER_INITIAL_SIZE) private val actorsRenderMidTop = ArrayList(ACTORCONTAINER_INITIAL_SIZE) private val actorsRenderFront = ArrayList(ACTORCONTAINER_INITIAL_SIZE) + private val actorsRenderOverlay= ArrayList(ACTORCONTAINER_INITIAL_SIZE) //var screenZoom = 1.0f // definition moved to IngameInstance @@ -572,6 +573,7 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) { actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, + actorsRenderOverlay, particlesContainer, actorNowPlaying, uiContainer diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 229212e0a..145e1d19d 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -24,7 +24,8 @@ import net.torvald.terrarum.worlddrawer.WorldCamera */ object IngameRenderer { - private lateinit var batch: SpriteBatch + /** for non-private use, use with care! */ + lateinit var batch: SpriteBatch private lateinit var camera: OrthographicCamera private lateinit var lightmapFboA: FrameBuffer @@ -59,11 +60,12 @@ object IngameRenderer { operator fun invoke( world: GameWorldExtension, - actorsRenderBehind: List? = null, - actorsRenderMiddle: List? = null, - actorsRenderMidTop: List? = null, - actorsRenderFront : List? = null, - particlesContainer: CircularArray? = null, + actorsRenderBehind : List? = null, + actorsRenderMiddle : List? = null, + actorsRenderMidTop : List? = null, + actorsRenderFront : List? = null, + actorsRenderOverlay: List? = null, + particlesContainer : CircularArray? = null, player: ActorWithBody? = null, uisToDraw: ArrayList? = null ) { @@ -86,6 +88,7 @@ object IngameRenderer { prepLightmapRGBA() drawToRGB(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer) drawToA(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer) + drawOverlayActors(actorsRenderOverlay) // clear main or whatever super-FBO being used //clearBuffer() @@ -391,6 +394,27 @@ object IngameRenderer { blendNormal(batch) } + private fun drawOverlayActors(actors: List?) { + fboRGB_lightMixed.inAction(camera, batch) { + + batch.inUse { + batch.shader = null + batch.color = Color.WHITE + } + + setCameraPosition(0f, 0f) + // BlocksDrawer.renderWhateverGlow_WALL + + batch.inUse { + moveCameraToWorldCoord() + actors?.forEach { it.drawBody(batch) } + } + + setCameraPosition(0f, 0f) + // BlocksDrawer.renderWhateverGlow_TERRAIN + } + } + private fun init() { if (!initDone) { diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index cc9ee9baa..dafdd42ee 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -45,7 +45,7 @@ object LightmapRenderer { fun setWorld(world: GameWorld) { try { if (this.world != world) { - println("World change detected -- old world: ${this.world.hashCode()}, new world: ${world.hashCode()}") + printdbg(this, "World change detected -- old world: ${this.world.hashCode()}, new world: ${world.hashCode()}") /*for (y in 0 until LIGHTMAP_HEIGHT) { for (x in 0 until LIGHTMAP_WIDTH) {