From 1867bf8de0a4a3c32e4969b05344ca8ef4980a16 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 19 Aug 2024 20:10:16 +0900 Subject: [PATCH] working subtile-to-atlantes --- .../terrarum/TerrarumAppConfiguration.kt | 3 +- .../terrarum/worlddrawer/CreateTileAtlas.kt | 140 ++++++++++++++---- 2 files changed, 114 insertions(+), 29 deletions(-) diff --git a/src/net/torvald/terrarum/TerrarumAppConfiguration.kt b/src/net/torvald/terrarum/TerrarumAppConfiguration.kt index f514cdd28..59bc9b8ce 100644 --- a/src/net/torvald/terrarum/TerrarumAppConfiguration.kt +++ b/src/net/torvald/terrarum/TerrarumAppConfiguration.kt @@ -167,7 +167,8 @@ basegame // CONFIGURATION FOR TILE MAKER // // MAKE SURE THESE VALUES ARE UNIQUE IN THE SOURCE CODE // ////////////////////////////////////////////////////////// - const val TILE_SIZE = 16 + const val SUBTILE_SIZE = 8 + const val TILE_SIZE = SUBTILE_SIZE * 2 const val TILE_SIZEF = TILE_SIZE.toFloat() const val TILE_SIZED = TILE_SIZE.toDouble() diff --git a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt index 958cb81d3..23bb0d623 100644 --- a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt +++ b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt @@ -8,14 +8,18 @@ import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.utils.GdxRuntimeException import com.jme3.math.FastMath import net.torvald.gdx.graphics.Cvec +import net.torvald.gdx.graphics.PixmapIO2 import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.TerrarumAppConfiguration.SUBTILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.utils.HashArray import net.torvald.terrarum.worlddrawer.CreateTileAtlas.AtlasSource.* import net.torvald.terrarum.worlddrawer.CreateTileAtlas.RenderTag.Companion.MASK_47 +import net.torvald.terrarum.worlddrawer.CreateTileAtlas.RenderTag.Companion.MASK_SUBTITLE_GENERIC +import net.torvald.terrarum.worlddrawer.CreateTileAtlas.RenderTag.Companion.MASK_SUBTITLE_GRASS import kotlin.math.sqrt /** @@ -36,6 +40,7 @@ class CreateTileAtlas { var MAX_TEX_SIZE = App.getConfigInt("atlastexsize").coerceIn(1024, App.glInfo.GL_MAX_TEXTURE_SIZE); private set var TILES_IN_X = MAX_TEX_SIZE / TILE_SIZE; private set + var SUBTILES_IN_X = MAX_TEX_SIZE / SUBTILE_SIZE; private set var SHADER_SIZE_KEYS = floatArrayOf(MAX_TEX_SIZE.toFloat(), MAX_TEX_SIZE.toFloat(), TILES_IN_X.toFloat(), TILES_IN_X.toFloat()); private set @@ -396,7 +401,12 @@ class CreateTileAtlas { addTag(blockID, RenderTag.CONNECT_SELF, RenderTag.MASK_16X16) drawToAtlantes(tilesPixmap, tilesGlowPixmap, tilesEmissivePixmap, RenderTag.MASK_16X16) } - // 112x112 or 224x224 + // subtitle generic + else if (tilesPixmap.width == SUBTILE_SIZE * 13 && tilesPixmap.height == SUBTILE_SIZE * 17) { + addTag(blockID, RenderTag.CONNECT_SELF, RenderTag.MASK_SUBTITLE_GENERIC) + drawToAtlantes(tilesPixmap, tilesGlowPixmap, tilesEmissivePixmap, RenderTag.MASK_SUBTITLE_GENERIC) + } + // 112x112 or 336x224 else { if (tilesPixmap.width != tilesPixmap.height && tilesPixmap.width % (7 * TILE_SIZE) >= 2) { throw IllegalArgumentException("Unrecognized image dimension ${tilesPixmap.width}x${tilesPixmap.height} from ${diffuse.path()}") @@ -452,38 +462,105 @@ class CreateTileAtlas { expandAtlantes() } - val sixSeasonal = diffuse.width == 21 * TILE_SIZE && diffuse.height == 14 * TILE_SIZE + val wSubtileSheet = if (renderMask == MASK_SUBTITLE_GRASS) 168 else 104 + val hSubtileSheet = 136 + + val sixSeasonal = (renderMask >= MASK_SUBTITLE_GENERIC && diffuse.width == 3 * wSubtileSheet && diffuse.height == 2 * hSubtileSheet) || + (renderMask < MASK_SUBTITLE_GENERIC && diffuse.width == 21 * TILE_SIZE && diffuse.height == 14 * TILE_SIZE) val txOfPixmap = diffuse.width / TILE_SIZE val txOfPixmapGlow = glow.width / TILE_SIZE val txOfPixmapEmissive = emissive.width / TILE_SIZE - for (i in 0 until tilesCount) { - //printdbg(this, "Rendering to atlas, tile# $atlasCursor, tilesCount = $tilesCount, seasonal = $seasonal") - // different texture for different seasons (224x224) - if (sixSeasonal) { - val i = if (renderMask == MASK_47) (if (i < 41) i else i + 1) else i // to compensate the discontinuity between 40th and 41st tile - _drawToAtlantes(diffuse, atlasCursor, i % 7 , i / 7, PREVERNAL) - _drawToAtlantes(diffuse, atlasCursor, i % 7 + 7 , i / 7, VERNAL) - _drawToAtlantes(diffuse, atlasCursor, i % 7 + 14, i / 7, AESTIVAL) + if (renderMask >= MASK_SUBTITLE_GENERIC) { + for (i in 0 until tilesCount) { + val srcX = SUBTILE_SIZE * (i / 4) + val srcY = SUBTILE_SIZE * 4 * (i % 4) + SUBTILE_SIZE - _drawToAtlantes(diffuse, atlasCursor, i % 7 + 14, i / 7 + 7, SEROTINAL) - _drawToAtlantes(diffuse, atlasCursor, i % 7 + 7 , i / 7 + 7, AUTUMNAL) - _drawToAtlantes(diffuse, atlasCursor, i % 7 , i / 7 + 7, HIBERNAL) + if (sixSeasonal) { + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 0*wSubtileSheet, srcY, PREVERNAL) + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 1*wSubtileSheet, srcY, VERNAL) + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 2*wSubtileSheet, srcY, AESTIVAL) + + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 2*wSubtileSheet, srcY + hSubtileSheet, SEROTINAL) + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 1*wSubtileSheet, srcY + hSubtileSheet, AUTUMNAL) + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX + 0*wSubtileSheet, srcY + hSubtileSheet, HIBERNAL) + + _drawToAtlantesFourSubtiles(glow, atlasCursor, srcX, srcY, GLOW) + _drawToAtlantesFourSubtiles(emissive, atlasCursor, srcX, srcY, EMISSIVE) + } + else { + _drawToAtlantesFourSubtiles(diffuse, atlasCursor, srcX, srcY, SIX_SEASONS) + _drawToAtlantesFourSubtiles(glow, atlasCursor, srcX, srcY, GLOW) + _drawToAtlantesFourSubtiles(emissive, atlasCursor, srcX, srcY, EMISSIVE) + } - _drawToAtlantes(glow, atlasCursor, i % 7, i / 7, GLOW) - _drawToAtlantes(emissive, atlasCursor, i % 7, i / 7, EMISSIVE) atlasCursor += 1 } - else { + } + else { + for (i in 0 until tilesCount) { + //printdbg(this, "Rendering to atlas, tile# $atlasCursor, tilesCount = $tilesCount, seasonal = $seasonal") val i = if (renderMask == MASK_47) (if (i < 41) i else i + 1) else i // to compensate the discontinuity between 40th and 41st tile - _drawToAtlantes(diffuse, atlasCursor, i % txOfPixmap, i / txOfPixmap, SIX_SEASONS) - _drawToAtlantes(glow, atlasCursor, i % txOfPixmapGlow, i / txOfPixmapGlow, GLOW) - _drawToAtlantes(emissive, atlasCursor, i % txOfPixmapEmissive, i / txOfPixmapEmissive, EMISSIVE) + + // different texture for different seasons (336x224) + if (sixSeasonal) { + _drawToAtlantes(diffuse, atlasCursor, i % 7, i / 7, PREVERNAL) + _drawToAtlantes(diffuse, atlasCursor, i % 7 + 7, i / 7, VERNAL) + _drawToAtlantes(diffuse, atlasCursor, i % 7 + 14, i / 7, AESTIVAL) + + _drawToAtlantes(diffuse, atlasCursor, i % 7 + 14, i / 7 + 7, SEROTINAL) + _drawToAtlantes(diffuse, atlasCursor, i % 7 + 7, i / 7 + 7, AUTUMNAL) + _drawToAtlantes(diffuse, atlasCursor, i % 7, i / 7 + 7, HIBERNAL) + + _drawToAtlantes(glow, atlasCursor, i % 7, i / 7, GLOW) + _drawToAtlantes(emissive, atlasCursor, i % 7, i / 7, EMISSIVE) + } + else { + _drawToAtlantes(diffuse, atlasCursor, i % txOfPixmap, i / txOfPixmap, SIX_SEASONS) + _drawToAtlantes(glow, atlasCursor, i % txOfPixmapGlow, i / txOfPixmapGlow, GLOW) + _drawToAtlantes(emissive, atlasCursor, i % txOfPixmapEmissive, i / txOfPixmapEmissive, EMISSIVE) + } + atlasCursor += 1 } } } + /** + * This function will draw 8x16 (two subtiles) onto the atlas + */ + private fun _drawToAtlantesFourSubtiles(pixmap: Pixmap, destTileNum: Int, sourceX: Int, sourceY: Int, source: AtlasSource) { + if (source == SIX_SEASONS) { + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, PREVERNAL) + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, VERNAL) + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, AESTIVAL) + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, SEROTINAL) + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, AUTUMNAL) + _drawToAtlantesFourSubtiles(pixmap, destTileNum, sourceX, sourceY, HIBERNAL) + } + else { + // destTileNum increments by one, which means FOUR SUBTILES + + val atlasX = (destTileNum % SUBTILES_IN_X) * TILE_SIZE + val atlasY = (destTileNum / SUBTILES_IN_X) * TILE_SIZE + + val target = when (source) { + PREVERNAL -> atlasPrevernal + VERNAL -> atlasVernal + AESTIVAL -> atlasAestival + SEROTINAL -> atlasSerotinal + AUTUMNAL -> atlasAutumnal + HIBERNAL -> atlasHibernal + GLOW -> atlasGlow + EMISSIVE -> atlasEmissive + else -> throw IllegalArgumentException("Unknown draw source $source") + } + + target.drawPixmap(pixmap, sourceX, sourceY, SUBTILE_SIZE, TILE_SIZE, atlasX, atlasY, SUBTILE_SIZE, TILE_SIZE) + target.drawPixmap(pixmap, sourceX, sourceY + TILE_SIZE, SUBTILE_SIZE, TILE_SIZE, atlasX + SUBTILE_SIZE, atlasY, SUBTILE_SIZE, TILE_SIZE) + } + } + /** * mode: 0 for all the atlantes, 1-4 for summer/autumn/winter/spring atlas */ @@ -504,17 +581,19 @@ class CreateTileAtlas { //if (mode == 1) printdbg(this, "atlaspos: ($atlasX, $atlasY), srcpos: ($sourceX, $sourceY), srcpixmap = $pixmap") - when (source) { - PREVERNAL -> atlasPrevernal.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - VERNAL -> atlasVernal.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - AESTIVAL -> atlasAestival.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - SEROTINAL -> atlasSerotinal.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - AUTUMNAL -> atlasAutumnal.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - HIBERNAL -> atlasHibernal.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - GLOW -> atlasGlow.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) - EMISSIVE -> atlasEmissive.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) + val target = when (source) { + PREVERNAL -> atlasPrevernal + VERNAL -> atlasVernal + AESTIVAL -> atlasAestival + SEROTINAL -> atlasSerotinal + AUTUMNAL -> atlasAutumnal + HIBERNAL -> atlasHibernal + GLOW -> atlasGlow + EMISSIVE -> atlasEmissive else -> throw IllegalArgumentException("Unknown draw source $source") } + + target.drawPixmap(pixmap, sourceX, sourceY, TILE_SIZE, TILE_SIZE, atlasX, atlasY, TILE_SIZE, TILE_SIZE) } } @@ -537,6 +616,8 @@ class CreateTileAtlas { const val MASK_16X8 = 6 const val MASK_16X16 = 7 const val MASK_FLUID = 8 + const val MASK_SUBTITLE_GENERIC = 16 + const val MASK_SUBTITLE_GRASS = 17 fun maskTypeToTileCount(maskType: Int) = when (maskType) { MASK_NA -> 1 @@ -548,6 +629,8 @@ class CreateTileAtlas { MASK_16X8 -> 128 MASK_16X16 -> 256 MASK_FLUID -> 18 + MASK_SUBTITLE_GENERIC -> 52 + MASK_SUBTITLE_GRASS -> 84 else -> throw IllegalArgumentException("Unknown maskType: $maskType") } } @@ -588,6 +671,7 @@ class CreateTileAtlas { MAX_TEX_SIZE = newTexSize TILES_IN_X = MAX_TEX_SIZE / TILE_SIZE + SUBTILES_IN_X = MAX_TEX_SIZE / SUBTILE_SIZE SHADER_SIZE_KEYS = floatArrayOf(MAX_TEX_SIZE.toFloat(), MAX_TEX_SIZE.toFloat(), TILES_IN_X.toFloat(), TILES_IN_X.toFloat()) TOTAL_TILES = TILES_IN_X * TILES_IN_X