diff --git a/src/net/torvald/spriteassembler/ADProperties.kt b/src/net/torvald/spriteassembler/ADProperties.kt index 463a432f9..b7c06e27e 100644 --- a/src/net/torvald/spriteassembler/ADProperties.kt +++ b/src/net/torvald/spriteassembler/ADProperties.kt @@ -50,6 +50,9 @@ class ADProperties { private val ALL_JOINT = Joint(ALL_JOINT_SELECT_KEY, ADPropertyObject.Vector2i(0, 0)) + var rows = -1; private set + var cols = -1; private set + companion object { const val ALL_JOINT_SELECT_KEY = "ALL" } @@ -76,6 +79,8 @@ class ADProperties { baseFilename = get("SPRITESHEET")[0].variable extension = get("EXTENSION")[0].variable + var maxColFinder = -1 + var maxRowFinder = -1 val bodyparts = HashSet() val skeletons = HashMap() val animations = HashMap() @@ -85,7 +90,7 @@ class ADProperties { propTable.keys.forEach { if (animFrameSuffixRegex.containsMatchIn(it)) { val animName = getAnimNameFromFrame(it) - val frameNumber = it.drop(animName.length + 1).toInt() + val frameNumber = getFrameNumberFromName(it) // if animFrames does not have our entry, add it. // otherwise, max() against the existing value @@ -95,6 +100,8 @@ class ADProperties { else { animFrames[animName] = frameNumber } + + maxColFinder = maxOf(maxColFinder, frameNumber) } } // populate skeletons and animations @@ -119,6 +126,8 @@ class ADProperties { animFrames[s]!!, Skeleton(skeletonName, skeletonDef.toJoints()) ) + + maxRowFinder = maxOf(maxRowFinder, animations[s]!!.row) } } @@ -164,6 +173,9 @@ class ADProperties { this.animations = animations this.bodypartFiles = this.bodyparts.map { toFilename(it) } this.transforms = transforms + + cols = maxColFinder + rows = maxRowFinder } operator fun get(identifier: String) = propTable[identifier.toUpperCase()]!! @@ -176,6 +188,8 @@ class ADProperties { "${this.baseFilename}${partName.toLowerCase()}${this.extension}" fun getAnimByFrameName(frameName: String) = animations[getAnimNameFromFrame(frameName)]!! + fun getFrameNumberFromName(frameName: String) = frameName.substring(frameName.lastIndexOf('_') + 1 until frameName.length).toInt() + fun getSkeleton(name: String) = skeletons[name]!! fun getTransform(name: String) = transforms[name]!! diff --git a/src/net/torvald/spriteassembler/AssembleFrameGdx.kt b/src/net/torvald/spriteassembler/AssembleFrameGdx.kt index d0c4db7b7..21d065378 100644 --- a/src/net/torvald/spriteassembler/AssembleFrameGdx.kt +++ b/src/net/torvald/spriteassembler/AssembleFrameGdx.kt @@ -2,6 +2,7 @@ package net.torvald.spriteassembler import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Pixmap +import net.torvald.terrarum.AppLoader import net.torvald.terrarum.linearSearch import java.io.File @@ -10,11 +11,26 @@ import java.io.File * * Created by minjaesong on 2019-01-06. */ -object AssembleFramePixmap { +object AssembleSheetPixmap { - // FIXME fuck this I'll use GDX + operator fun invoke(properties: ADProperties, assembleConfig: AssembleConfig = AssembleConfig()): Pixmap { + val canvas = Pixmap(properties.cols * assembleConfig.fw, properties.rows * assembleConfig.fh, Pixmap.Format.RGBA8888) + canvas.blending = Pixmap.Blending.SourceOver - operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): Pixmap { + + // actually draw + properties.transforms.forEach { t, _ -> + drawThisFrame(t, canvas, properties, assembleConfig) + } + + return canvas + } + + private fun drawThisFrame(frameName: String, + canvas: Pixmap, + properties: ADProperties, + assembleConfig: AssembleConfig + ) { val theAnim = properties.getAnimByFrameName(frameName) val skeleton = theAnim.skeleton.joints.reversed() val transforms = properties.getTransform(frameName) @@ -25,40 +41,42 @@ object AssembleFramePixmap { //printdbg(this, "Loading file ${file.absolutePath}, exists: ${file.exists()}") /*return*/if (file.exists()) { - Pixmap(Gdx.files.internal(file.path)) + Pixmap(Gdx.files.internal(file.path)) } else { null } } - val canvas = Pixmap(assembleConfig.fw, assembleConfig.fh, Pixmap.Format.RGBA8888) - val transformList = AssembleFrameBase.makeTransformList(skeleton, transforms) - /*println("Frame name: $frameName") - transforms.forEach { println(it) } - println("==========================") - println("Transformed skeleton:") - transformList.forEach { (name, transform) -> - println("$name transformedOut: $transform") - }*/ + val animRow = theAnim.row + val animFrame = properties.getFrameNumberFromName(frameName) + AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)") - // actually draw - canvas.blending = Pixmap.Blending.SourceOver + drawFrame(animRow, animFrame, canvas, bodyparts, transformList, assembleConfig) + } + private fun drawFrame(row: Int, column: Int, + canvas: Pixmap, + bodyparts: Array, + transformList: List>, + assembleConfig: AssembleConfig + ) { bodyparts.forEachIndexed { index, image -> if (image != null) { val imgCentre = AssembleFrameBase.getCentreOf(image) val drawPos = transformList[index].second.invertY() + assembleConfig.origin - imgCentre - canvas.drawPixmap(image, drawPos.x, drawPos.y) + canvas.drawPixmap( + image, + (column - 1) * assembleConfig.fw + drawPos.x, + (row - 1) * assembleConfig.fh + drawPos.y + ) image.dispose() } } - - return canvas } } diff --git a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt index 57be64c14..e3fc711a7 100644 --- a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt +++ b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt @@ -31,6 +31,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { private val panelImageFilesList = JList() private val panelSkeletonsList = JList() private val panelTransformsList = JList() + private val panelStatList = JList() private val panelCode = JTextPane() private val statBar = JTextArea("Null.") @@ -100,6 +101,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { panelImageFilesList.model = DefaultListModel() panelSkeletonsList.model = DefaultListModel() panelTransformsList.model = DefaultListModel() + panelStatList.model = DefaultListModel() val panelPartsList = JTabbedPane(JTabbedPane.TOP) panelPartsList.add("Animations", JScrollPane(panelAnimationsList)) @@ -107,6 +109,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { panelPartsList.add("Images", JScrollPane(panelImageFilesList)) panelPartsList.add("Skeletons", JScrollPane(panelSkeletonsList)) panelPartsList.add("Transforms", JScrollPane(panelTransformsList)) + panelPartsList.add("Stats", JScrollPane(panelStatList)) val panelDataView = JSplitPane(JSplitPane.VERTICAL_SPLIT, JScrollPane(panelProperties), panelPartsList) panelDataView.resizeWeight = 0.333 @@ -145,6 +148,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { panelImageFilesList.model = DefaultListModel() panelSkeletonsList.model = DefaultListModel() panelTransformsList.model = DefaultListModel() + panelStatList.model = DefaultListModel() // populate animations view adProperties.animations.forEach { @@ -166,6 +170,9 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { adProperties.transforms.forEach { (panelTransformsList.model as DefaultListModel).addElement("$it") } + // populate stats + (panelStatList.model as DefaultListModel).addElement("Spritesheet rows: ${adProperties.rows}") + (panelStatList.model as DefaultListModel).addElement("Spritesheet columns: ${adProperties.cols}") } catch (fehler: Throwable) { displayError("ERROR_PARSE_FAIL", fehler) @@ -177,7 +184,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() { override fun mousePressed(e: MouseEvent?) { try { - gdxWindow.requestAssemblyTest(adProperties, "ANIM_IDLE_2") + gdxWindow.requestAssemblyTest(adProperties) statBar.text = lang.getProperty("SPRITE_ASSEMBLE_SUCCESSFUL") } catch (fehler: Throwable) { @@ -242,13 +249,12 @@ class SpriteAssemblerPreview: Game() { private var doAssemble = false private lateinit var assembleProp: ADProperties - private lateinit var assembleFrameName: String override fun render() { if (doAssemble) { // assembly requires GL context doAssemble = false - assembleImageTest(assembleProp, assembleFrameName) + assembleImage(assembleProp) } @@ -265,14 +271,13 @@ class SpriteAssemblerPreview: Game() { } } - private fun assembleImageTest(prop: ADProperties, frameName: String) { - image = AssembleFramePixmap(prop, frameName) + private fun assembleImage(prop: ADProperties) { + image = AssembleSheetPixmap(prop) } - fun requestAssemblyTest(prop: ADProperties, frameName: String) { + fun requestAssemblyTest(prop: ADProperties) { doAssemble = true assembleProp = prop - assembleFrameName = frameName } } diff --git a/src/net/torvald/spriteassembler/test_sprite.properties b/src/net/torvald/spriteassembler/test_sprite.properties index 85dbd58af..e3c8ef37e 100644 --- a/src/net/torvald/spriteassembler/test_sprite.properties +++ b/src/net/torvald/spriteassembler/test_sprite.properties @@ -24,7 +24,7 @@ ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND ANIM_RUN_1=LEG_REST_RIGHT 1,1;FOOT_RIGHT 1,1;LEG_REST_LEFT -1,0;FOOT_LEFT -1,0 ANIM_RUN_2=ALL 0,1;LEG_REST_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_REST_LEFT 0,1;FOOT_LEFT 0,1 ANIM_RUN_3=LEG_REST_RIGHT -1,0;FOOT_RIGHT -1,0;LEG_REST_LEFT 1,1;FOOT_LEFT 1,1 -ANIM_RUN_4=ALL 0,1;LEG_REST_RIGHT 0,1;LEG_REST_LEFT 0,-1 +ANIM_RUN_4=ALL 0,1;LEG_REST_RIGHT 0,1;FOOT_RIGHT 0,1;LEG_REST_LEFT 0,-1;FOOT_LEFT 0,-1 ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND ANIM_IDLE_1= diff --git a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt index 6360ad893..dd57a24d5 100644 --- a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt +++ b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.tests import net.torvald.spriteassembler.ADProperties -import net.torvald.spriteassembler.AssembleFramePixmap +import net.torvald.spriteassembler.AssembleSheetPixmap import java.io.StringReader /** @@ -11,7 +11,7 @@ class SpriteAssemblerTest { operator fun invoke() { val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR)) - AssembleFramePixmap.invoke(properties, "ANIM_RUN_1") + AssembleSheetPixmap.invoke(properties) } }