diff --git a/src/net/torvald/spriteassembler/ADProperties.kt b/src/net/torvald/spriteassembler/ADProperties.kt index 2a8bf04f3..9a5450154 100644 --- a/src/net/torvald/spriteassembler/ADProperties.kt +++ b/src/net/torvald/spriteassembler/ADProperties.kt @@ -261,6 +261,7 @@ class ADPropertyObject(propertyRaw: String) { override fun toString() = "($x, $y)" operator fun plus(other: Vector2i) = Vector2i(this.x + other.x, this.y + other.y) + operator fun minus(other: Vector2i) = Vector2i(this.x - other.x, this.y - other.y) fun invertY() = Vector2i(this.x, -this.y) } diff --git a/src/net/torvald/spriteassembler/AssembleFrameJava.kt b/src/net/torvald/spriteassembler/AssembleFrameGdx.kt similarity index 79% rename from src/net/torvald/spriteassembler/AssembleFrameJava.kt rename to src/net/torvald/spriteassembler/AssembleFrameGdx.kt index 2f87452f1..94ca5d299 100644 --- a/src/net/torvald/spriteassembler/AssembleFrameJava.kt +++ b/src/net/torvald/spriteassembler/AssembleFrameGdx.kt @@ -1,9 +1,8 @@ package net.torvald.spriteassembler +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.Pixmap import net.torvald.terrarum.linearSearch -import java.awt.Image -import java.awt.Toolkit -import java.awt.image.BufferedImage import java.io.File /** @@ -11,29 +10,28 @@ import java.io.File * * Created by minjaesong on 2019-01-06. */ -object AssembleFrameAWT { +object AssembleFramePixmap { // FIXME fuck this I'll use GDX - operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): BufferedImage { + operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): Pixmap { val theAnim = properties.getAnimByFrameName(frameName) val skeleton = theAnim.skeleton.joints.reversed() val transforms = properties.getTransform(frameName) - val bodyparts = Array(skeleton.size) { + val bodyparts = Array(skeleton.size) { // if file does not exist, null it val file = File("assets/" + properties.toFilename(skeleton[it].name)) //printdbg(this, "Loading file ${file.absolutePath}, exists: ${file.exists()}") - val toolkit = Toolkit.getDefaultToolkit() /*return*/if (file.exists()) { - toolkit.getImage(file.absolutePath) + Pixmap(Gdx.files.internal(file.path)) } else { null } } - val canvas = BufferedImage(assembleConfig.fw, assembleConfig.fh, BufferedImage.TYPE_4BYTE_ABGR) + val canvas = Pixmap(assembleConfig.fw, assembleConfig.fh, Pixmap.Format.RGBA8888) println("Frame name: $frameName") @@ -47,17 +45,19 @@ object AssembleFrameAWT { // actually draw - val g = canvas.graphics + canvas.blending = Pixmap.Blending.SourceOver bodyparts.forEachIndexed { index, image -> if (image != null) { - val drawPos = transformList[index].second.invertY() + assembleConfig.origin - g.drawImage(image, drawPos.x, drawPos.y, null) + val imgCentre = AssembleFrameBase.getCentreOf(image) + val drawPos = transformList[index].second.invertY() + assembleConfig.origin - imgCentre + + canvas.drawPixmap(image, drawPos.x, drawPos.y) + + image.dispose() } } - canvas.flush() - return canvas } @@ -68,7 +68,7 @@ object AssembleFrameAWT { * @param fh Frame Height * @param origin Int vector of origin point, (0,0) being TOP-LEFT */ -data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val origin: ADPropertyObject.Vector2i = ADPropertyObject.Vector2i(29, 58)) +data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val origin: ADPropertyObject.Vector2i = ADPropertyObject.Vector2i(29, fh - 1)) object AssembleFrameBase { /** @@ -94,4 +94,6 @@ object AssembleFrameBase { return transformOutput.toList() } + + fun getCentreOf(pixmap: Pixmap) = ADPropertyObject.Vector2i(pixmap.width / 2, pixmap.height / 2) } \ No newline at end of file diff --git a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt index 220243dcb..57be64c14 100644 --- a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt +++ b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt @@ -9,17 +9,13 @@ import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.inUse import java.awt.BorderLayout import java.awt.Font -import java.awt.Graphics import java.awt.event.MouseAdapter import java.awt.event.MouseEvent -import java.awt.image.BufferedImage -import java.io.File -import java.io.IOException import java.io.StringReader import java.util.* -import javax.imageio.ImageIO import javax.swing.* import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultTreeModel @@ -84,7 +80,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { "STAT_LOAD_SUCCESSFUL=File loaded successfully.\n" + "ERROR_INTERNAL=Something went wrong.\n" + "ERROR_PARSE_FAIL=Parsing failed\n" + - "SPRITE_DEF_LOAD_SUCCESSFUL=Sprite definition loaded." + "SPRITE_DEF_LOAD_SUCCESSFUL=Sprite definition loaded.\n" + + "SPRITE_ASSEMBLE_SUCCESSFUL=Sprite assembled." init { // setup application properties // @@ -145,7 +142,9 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { // clean the data views panelAnimationsList.model = DefaultListModel() panelBodypartsList.model = DefaultListModel() + panelImageFilesList.model = DefaultListModel() panelSkeletonsList.model = DefaultListModel() + panelTransformsList.model = DefaultListModel() // populate animations view adProperties.animations.forEach { @@ -178,8 +177,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() { override fun mousePressed(e: MouseEvent?) { try { - val image = AssembleFrameAWT(adProperties, "ANIM_RUN_1") - + gdxWindow.requestAssemblyTest(adProperties, "ANIM_IDLE_2") + statBar.text = lang.getProperty("SPRITE_ASSEMBLE_SUCCESSFUL") } catch (fehler: Throwable) { displayError("ERROR_PARSE_FAIL", fehler) @@ -220,36 +219,11 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() { } } -internal class ImagePanel : JPanel() { - - private var image: BufferedImage? = null - - init { - try { - image = ImageIO.read(File("image name and path")) - } - catch (ex: IOException) { - // handle exception... - } - - } - - fun setImage(image: BufferedImage) { - this.image = image - } - - override fun paintComponent(g: Graphics) { - super.paintComponent(g) - g.drawImage(image, 0, 0, this) // see javadoc for more info on the parameters - } - -} - class SpriteAssemblerPreview: Game() { private lateinit var batch: SpriteBatch private lateinit var renderTexture: Texture - var image: Pixmap? = null + private var image: Pixmap? = null set(value) { renderTexture.dispose() field?.dispose() @@ -264,15 +238,43 @@ class SpriteAssemblerPreview: Game() { renderTexture = Texture(1, 1, Pixmap.Format.RGBA8888) } - val bgCol = Color(.62f,.79f,1f,1f) + private val bgCol = Color(.62f,.79f,1f,1f) + + 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) + } + + Gdx.gl.glClearColor(.62f,.79f,1f,1f) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + + + batch.inUse { + batch.color = Color.WHITE + batch.draw(renderTexture, 0f, 0f) + } } + + private fun assembleImageTest(prop: ADProperties, frameName: String) { + image = AssembleFramePixmap(prop, frameName) + } + + fun requestAssemblyTest(prop: ADProperties, frameName: String) { + doAssemble = true + assembleProp = prop + assembleFrameName = frameName + } + } fun main(args: Array) { diff --git a/src/net/torvald/spriteassembler/test_sprite.properties b/src/net/torvald/spriteassembler/test_sprite.properties index 7cf7fff75..85dbd58af 100644 --- a/src/net/torvald/spriteassembler/test_sprite.properties +++ b/src/net/torvald/spriteassembler/test_sprite.properties @@ -15,18 +15,18 @@ SKELETON_STAND=HEADGEAR 0,32;HAIR_FORE 0,32;\ ARM_REST_RIGHT -7,23;HAND_REST_RIGHT -6,11;HELD_ITEM -6,11;\ HAIR 0,32;HEAD 0,32;\ UPPER_TORSO 0,23;LOWER_TORSO 0,15;\ - FOOT_RIGHT -2,2;LEG_RIGHT -2,7;\ - FOOT_LEFT 2,2;LEG_LEFT 2,7;\ + FOOT_RIGHT -2,2;LEG_REST_RIGHT -2,7;\ + FOOT_LEFT 2,2;LEG_REST_LEFT 2,7;\ ARM_REST_LEFT 5,24;HAND_REST_LEFT 6,12 # skeleton_stand is used for testing purpose ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND -ANIM_RUN_1=LEG_RIGHT 1,1;FOOT_RIGHT 1,1;LEG_LEFT -1,0;FOOT_LEFT -1,0 -ANIM_RUN_2=ALL 0,1;LEG_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_LEFT 0,1;FOOT_LEFT 0,1 -ANIM_RUN_3=LEG_RIGHT -1,0;FOOT_RIGHT -1,0;LEG_LEFT 1,1;FOOT_LEFT 1,1 -ANIM_RUN_4=ALL 0,1;LEG_RIGHT 0,1;LEG_LEFT 0,-1 +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_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND ANIM_IDLE_1= ! ANIM_IDLE_1 will not make any transformation -ANIM_IDLE_2=UPPER_TORSO 0,-1;HEAD 0,-1;ARM_REST_LEFT 0,-1;HAND_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;HAND_REST_RIGHT 0,-1 +ANIM_IDLE_2=UPPER_TORSO 0,-1;HEAD 0,-1;HAIR 0,-1;HELD_ITEM 0,-1;ARM_REST_LEFT 0,-1;HAND_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;HAND_REST_RIGHT 0,-1;HAIR_FORE 0,-1;HEADGEAR 0,-1 diff --git a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt index 402138893..6360ad893 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.AssembleFrameAWT +import net.torvald.spriteassembler.AssembleFramePixmap import java.io.StringReader /** @@ -11,7 +11,7 @@ class SpriteAssemblerTest { operator fun invoke() { val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR)) - AssembleFrameAWT.invoke(properties, "ANIM_RUN_1") + AssembleFramePixmap.invoke(properties, "ANIM_RUN_1") } } diff --git a/work_files/graphics/sprites/sprite_joints.psd b/work_files/graphics/sprites/sprite_joints.psd index 5df1dbfa5..39e43606c 100644 --- a/work_files/graphics/sprites/sprite_joints.psd +++ b/work_files/graphics/sprites/sprite_joints.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a5d8237149657e70cd6a677b4bcec50419e3dd942b2a25225157d2a6e2648188 -size 58739 +oid sha256:cc55f2465dd977ea622201d34f8b7c27c90df9060ca642016d5557e159202f56 +size 58859