mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
sprite assembler can produce intended output
This commit is contained in:
@@ -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<String>()
|
||||
val skeletons = HashMap<String, Skeleton>()
|
||||
val animations = HashMap<String, Animation>()
|
||||
@@ -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]!!
|
||||
|
||||
|
||||
@@ -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<Pixmap?>,
|
||||
transformList: List<Pair<String, ADPropertyObject.Vector2i>>,
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
|
||||
private val panelImageFilesList = JList<String>()
|
||||
private val panelSkeletonsList = JList<String>()
|
||||
private val panelTransformsList = JList<String>()
|
||||
private val panelStatList = JList<String>()
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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=
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user