diff --git a/build.gradle b/build.gradle
index 51dbaa7..46486c1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,6 +17,9 @@ apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'org.jetbrains.intellij'
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
@@ -29,6 +32,14 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
}
}
+sourceSets {
+ main {
+ java {
+ srcDirs 'src/main/kotlin'
+ }
+ }
+}
+
repositories {
mavenLocal()
@@ -40,6 +51,10 @@ repositories {
dependencies {
compile "com.soywiz.korlibs.korge.plugins:korge-build:1.5.0c"
+ //compile 'net.sourceforge.mydoggy:mydoggy:1.4.2'
+ //compile 'net.sourceforge.mydoggy:mydoggy-plaf:1.4.2'
+ //compile 'net.sourceforge.mydoggy:mydoggy-api:1.4.2'
+ //compile 'net.sourceforge.mydoggy:mydoggy-res:1.4.2'
//compile project(":korge-build")
}
@@ -68,3 +83,12 @@ publishPlugin {
runIde {
maxHeapSize = "2g"
}
+
+task runDebugTilemap(type: JavaExec) {
+ //classpath = sourceSets.main.runtimeClasspath
+ classpath = sourceSets.main.runtimeClasspath + configurations.idea
+
+ main = 'com.soywiz.korge.intellij.editor.tile.MyTileMapEditorFrame'
+}
+
+//println(configurations.names)
\ No newline at end of file
diff --git a/samples/gfx/Inner.png b/samples/gfx/Inner.png
new file mode 100644
index 0000000..a07be97
Binary files /dev/null and b/samples/gfx/Inner.png differ
diff --git a/samples/gfx/NPC_test.png b/samples/gfx/NPC_test.png
new file mode 100644
index 0000000..4e3c1c9
Binary files /dev/null and b/samples/gfx/NPC_test.png differ
diff --git a/samples/gfx/Overworld.png b/samples/gfx/Overworld.png
new file mode 100644
index 0000000..c03c380
Binary files /dev/null and b/samples/gfx/Overworld.png differ
diff --git a/samples/gfx/Overworld.tsx b/samples/gfx/Overworld.tsx
new file mode 100644
index 0000000..ff1c0cc
--- /dev/null
+++ b/samples/gfx/Overworld.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/samples/gfx/cave.png b/samples/gfx/cave.png
new file mode 100644
index 0000000..1df7b3e
Binary files /dev/null and b/samples/gfx/cave.png differ
diff --git a/samples/gfx/character.png b/samples/gfx/character.png
new file mode 100644
index 0000000..a50ceb0
Binary files /dev/null and b/samples/gfx/character.png differ
diff --git a/samples/gfx/font.png b/samples/gfx/font.png
new file mode 100644
index 0000000..0128151
Binary files /dev/null and b/samples/gfx/font.png differ
diff --git a/samples/gfx/log.png b/samples/gfx/log.png
new file mode 100644
index 0000000..b952a9a
Binary files /dev/null and b/samples/gfx/log.png differ
diff --git a/samples/gfx/objects.png b/samples/gfx/objects.png
new file mode 100644
index 0000000..f76813f
Binary files /dev/null and b/samples/gfx/objects.png differ
diff --git a/samples/gfx/sample.tmx b/samples/gfx/sample.tmx
new file mode 100644
index 0000000..84e27f2
--- /dev/null
+++ b/samples/gfx/sample.tmx
@@ -0,0 +1,212 @@
+
+
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileIconProvider.kt b/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileIconProvider.kt
index d83e3a2..9a33f21 100644
--- a/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileIconProvider.kt
+++ b/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileIconProvider.kt
@@ -12,6 +12,7 @@ class KorgeFileIconProvider : FileIconProvider {
file.name.endsWith(".fnt", ignoreCase = true) -> KorgeIcons.BITMAP_FONT
file.name.endsWith(".swf", ignoreCase = true) -> KorgeIcons.SWF
file.name.endsWith(".tmx", ignoreCase = true) -> KorgeIcons.TILED
+ file.name.endsWith(".tsx", ignoreCase = true) -> KorgeIcons.TILED
file.name.endsWith(".scml", ignoreCase = true) -> KorgeIcons.SPRITER
file.name.endsWith(".ani", ignoreCase = true) -> KorgeIcons.KORGE
file.name.endsWith(".voice.lipsync", ignoreCase = true) -> KorgeIcons.VOICE
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileTypeFactory.kt b/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileTypeFactory.kt
index 846866c..2e6b762 100644
--- a/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileTypeFactory.kt
+++ b/src/main/kotlin/com/soywiz/korge/intellij/KorgeFileTypeFactory.kt
@@ -12,6 +12,7 @@ class KorgeFileTypeFactory : FileTypeFactory() {
companion object {
val KORGE_ANI = KorgeAniFileType()
val KORGE_AUDIO = KorgeAudioFileType()
+ val KORGE_TSX = XmlFileType.INSTANCE
val KORGE_TMX = XmlFileType.INSTANCE
val KORGE_PEX = XmlFileType.INSTANCE
val KORGE_SCML = XmlFileType.INSTANCE
@@ -23,6 +24,7 @@ class KorgeFileTypeFactory : FileTypeFactory() {
fileTypeConsumer.consume(KORGE_ANI, "swf;ani")
fileTypeConsumer.consume(KORGE_AUDIO, "wav;mp3;ogg")
fileTypeConsumer.consume(KORGE_TMX, "tmx")
+ fileTypeConsumer.consume(KORGE_TSX, "tsx")
fileTypeConsumer.consume(KORGE_PEX, "pex")
fileTypeConsumer.consume(KORGE_SCML, "scml")
fileTypeConsumer.consume(KORGE_SCON, "scon")
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/debug/DebugKorimExt.kt b/src/main/kotlin/com/soywiz/korge/intellij/debug/DebugKorimExt.kt
index 4674df6..b3a5cf5 100644
--- a/src/main/kotlin/com/soywiz/korge/intellij/debug/DebugKorimExt.kt
+++ b/src/main/kotlin/com/soywiz/korge/intellij/debug/DebugKorimExt.kt
@@ -71,6 +71,7 @@ fun ObjectReference.readKorimDrawableInternal(requestedWidth: Int, requestedHeig
}
}
+ virtualMachine().process()
val clazz = virtualMachine().getRemoteClass("com.soywiz.korim.format.NativeImageFormatProviderJvmKt", thread = thread) ?: error("Can't find NativeImageFormatProviderJvmKt")
val nativeImageFormatProvider = clazz.invoke("getNativeImageFormatProvider", listOf(), thread = thread) as? ObjectReference? ?: error("Error calling getNativeImageFormatProvider")
val image = nativeImageFormatProvider.invoke("create", listOf(vm.mirrorOf(width), vm.mirrorOf(height)), thread = thread) as? ObjectReference? ?: error("Error calling create")
diff --git a/src/main/java/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java b/src/main/kotlin/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java
similarity index 90%
rename from src/main/java/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java
rename to src/main/kotlin/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java
index 617f10a..7d402fc 100644
--- a/src/main/java/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java
+++ b/src/main/kotlin/com/soywiz/korge/intellij/debug/DebuggerUtilsImplExt.java
@@ -1,7 +1,9 @@
package com.soywiz.korge.intellij.debug;
+import com.intellij.debugger.engine.DebugProcess;
import com.sun.jdi.*;
+import java.util.Arrays;
import java.util.List;
public class DebuggerUtilsImplExt {
@@ -17,7 +19,7 @@ public class DebuggerUtilsImplExt {
if (type == null || !type.signature().equals("[B")) return null;
ClassType StringClass = (ClassType) that.virtualMachine().classesByName("java.lang.String").get(0);
Method constructor = StringClass.methodsByName("", "([BI)V").get(0);
- ObjectReference string = StringClass.newInstance(thread, constructor, List.of(that, vm.mirrorOf(0)), 0);
+ ObjectReference string = StringClass.newInstance(thread, constructor, Arrays.asList(that, vm.mirrorOf(0)), 0);
String str = ((StringReference)(string)).value();
byte[] out = new byte[str.length()];
//noinspection deprecation
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/editor/KorgeBothFileEditorProvider.kt b/src/main/kotlin/com/soywiz/korge/intellij/editor/KorgeBothFileEditorProvider.kt
index 95bfe12..e3b27dc 100644
--- a/src/main/kotlin/com/soywiz/korge/intellij/editor/KorgeBothFileEditorProvider.kt
+++ b/src/main/kotlin/com/soywiz/korge/intellij/editor/KorgeBothFileEditorProvider.kt
@@ -11,7 +11,7 @@ class KorgeBothFileEditorProvider : KorgeBaseFileEditorProvider() {
return when {
name.endsWith(".svg", ignoreCase = true) -> true
name.endsWith(".pex", ignoreCase = true) -> true
- name.endsWith(".tmx", ignoreCase = true) -> true
+ //name.endsWith(".tmx", ignoreCase = true) -> true
name.endsWith(".scml", ignoreCase = true) -> true
else -> false
}
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/MyTileMapEditorFrame.kt b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/MyTileMapEditorFrame.kt
new file mode 100644
index 0000000..c9693ae
--- /dev/null
+++ b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/MyTileMapEditorFrame.kt
@@ -0,0 +1,137 @@
+package com.soywiz.korge.intellij.editor.tile
+
+import com.intellij.uiDesigner.core.*
+import com.soywiz.korge.tiled.*
+import com.soywiz.korim.awt.*
+import com.soywiz.korim.bitmap.*
+import com.soywiz.korio.file.std.*
+import com.soywiz.korma.geom.*
+import kotlinx.coroutines.*
+import java.awt.*
+import java.awt.image.*
+import javax.swing.*
+
+class MyTileMapEditorPanel(val tmx: TiledMap) : JPanel(BorderLayout()) {
+ val tileMapEditor = TileMapEditor()
+
+ val maxTileGid = tmx.tilesets.map { it.firstgid + it.tileset.textures.size }.max() ?: 0
+
+ data class TileInfo(val image: Bitmap32, val awt: BufferedImage, val area: RectangleInt) {
+ val miniImage = awt.getSubimage(area.x, area.y, area.width, area.height)
+ val miniBmp32 = image.copySliceWithSize(area.x, area.y, area.width, area.height)
+ val miniSlice = miniBmp32.sliceWithSize(0, 0, area.width, area.height)
+ }
+
+ private val emptyImage = Bitmaps.transparent.bmp
+ private val emptyImageAwt = emptyImage.toAwt()
+ val dummyTile = TileInfo(emptyImage, emptyImageAwt, Bitmaps.transparent.bounds)
+ val tiles: Array = Array(maxTileGid) { dummyTile }.also { tiles ->
+ for (tileset in tmx.tilesets) {
+ val tex = tileset.tileset.base.toBMP32()
+ val tex2 = tex.toAwt()
+ for (tileIdx in tileset.tileset.textures.indices) {
+ val tile = tileset.tileset.textures[tileIdx]
+ if (tile != null) {
+ tiles[tileset.firstgid + tileIdx] = TileInfo(tex, tex2, (tile as BitmapSlice<*>).bounds)
+ }
+ }
+ }
+ }
+
+ val realPanel = tileMapEditor.contentPanel
+
+ init {
+ add(realPanel, BorderLayout.CENTER)
+
+ tileMapEditor.mapPanel.add(JScrollPane(object : JComponent() {
+ init {
+ this.preferredSize = Dimension(tmx.pixelWidth, tmx.pixelHeight)
+ }
+
+ override fun paintComponent(g: Graphics) {
+ val g = (g as Graphics2D)
+
+ val TILE_WIDTH = tmx.tilewidth
+ val TILE_HEIGHT = tmx.tileheight
+
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
+ val clipBounds = g.clipBounds
+ val displayTilesX = (clipBounds.width / TILE_WIDTH) + 2
+ val displayTilesY = (clipBounds.height / TILE_HEIGHT) + 2
+ val temp = Bitmap32(displayTilesX * TILE_WIDTH, displayTilesY * TILE_HEIGHT)
+
+ val offsetX = clipBounds.x / TILE_WIDTH
+ val offsetY = clipBounds.y / TILE_HEIGHT
+
+ for (layer in tmx.allLayers) {
+ when (layer) {
+ is TiledMap.Layer.Patterns -> {
+ for (x in 0 until displayTilesX) {
+ for (y in 0 until displayTilesY) {
+ val rx = x + offsetX
+ val ry = y + offsetY
+
+ if (rx < 0 || rx >= layer.map.width) continue
+ if (ry < 0 || ry >= layer.map.height) continue
+
+ val tileIdx = layer.map[rx, ry].value
+ val tile = tiles.getOrElse(tileIdx) { dummyTile }
+ val px0 = x * TILE_WIDTH
+ val py0 = y * TILE_HEIGHT
+ val px = rx * TILE_WIDTH
+ val py = ry * TILE_HEIGHT
+
+ temp._draw(tile.miniSlice, px0, py0, mix = true)
+ //temp.draw(tile.miniBmp32, px0, py0)
+ //g.drawImage(tile.miniImage, px, py, null)
+ /*
+ g.drawImage(
+ tile.image,
+ px, py, px + TILE_WIDTH, py + TILE_HEIGHT,
+ tile.area.left, tile.area.top, tile.area.right, tile.area.bottom,
+ null
+ )
+ */
+ //g.color = Color.RED
+ //g.drawRect(px, py, TILE_WIDTH, TILE_HEIGHT)
+ }
+ }
+ }
+ }
+ }
+
+ g.drawImage(temp.toAwt(), offsetX * TILE_WIDTH, offsetY * TILE_HEIGHT, null)
+
+ for (x in 0 until displayTilesX) {
+ for (y in 0 until displayTilesY) {
+ val rx = x + offsetX
+ val ry = y + offsetY
+ val px = rx * TILE_WIDTH
+ val py = ry * TILE_HEIGHT
+ g.color = Color.BLACK
+ g.drawRect(px, py, TILE_WIDTH, TILE_HEIGHT)
+ }
+ }
+ }
+ }), GridConstraints().also { it.fill = GridConstraints.FILL_BOTH })
+
+ }
+}
+
+class MyTileMapEditorFrame(val tmx: TiledMap) : JFrame() {
+ init {
+ contentPane = MyTileMapEditorPanel(tmx)
+ pack()
+ }
+
+ companion object {
+ @JvmStatic
+ fun main(args: Array) {
+ val tmx = runBlocking { localCurrentDirVfs["samples/gfx/sample.tmx"].readTiledMap() }
+ val frame = MyTileMapEditorFrame(tmx)
+ frame.defaultCloseOperation = EXIT_ON_CLOSE
+ frame.setLocationRelativeTo(null)
+ frame.isVisible = true
+ }
+ }
+}
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.form b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.form
new file mode 100644
index 0000000..4ddcd22
--- /dev/null
+++ b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.form
@@ -0,0 +1,206 @@
+
+
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.java b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.java
new file mode 100644
index 0000000..e1daaed
--- /dev/null
+++ b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditor.java
@@ -0,0 +1,21 @@
+package com.soywiz.korge.intellij.editor.tile;
+
+import javax.swing.*;
+
+public class TileMapEditor {
+ public JTabbedPane tabbedPane1;
+ public JTabbedPane tabbedPane2;
+ public JTabbedPane tabbedPane3;
+ public JButton stampButton;
+ public JButton eraserButton;
+ public JButton fillButton;
+ public JButton flipXButton;
+ public JButton flipYButton;
+ public JButton settingsButton;
+ public JPanel contentPanel;
+ public JPanel propertiesPanel;
+ public JPanel tilesetPanel;
+ public JPanel mapPanel;
+ public JTabbedPane tabbedPane4;
+ public JTabbedPane tabbedPane5;
+}
diff --git a/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditorProvider.kt b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditorProvider.kt
new file mode 100644
index 0000000..8514b8b
--- /dev/null
+++ b/src/main/kotlin/com/soywiz/korge/intellij/editor/tile/TileMapEditorProvider.kt
@@ -0,0 +1,86 @@
+package com.soywiz.korge.intellij.editor.tile
+
+import com.intellij.debugger.impl.*
+import com.intellij.designer.model.*
+import com.intellij.designer.propertyTable.*
+import com.intellij.openapi.fileEditor.*
+import com.intellij.openapi.options.newEditor.*
+import com.intellij.openapi.project.*
+import com.intellij.openapi.util.*
+import com.intellij.openapi.vfs.*
+import com.intellij.ui.table.*
+import com.soywiz.korge.intellij.*
+import com.soywiz.korge.intellij.debug.*
+import com.soywiz.korge.tiled.*
+import kotlinx.coroutines.*
+import java.awt.*
+import java.beans.*
+import javax.swing.*
+
+class TileMapEditorProvider : FileEditorProvider {
+ override fun getEditorTypeId(): String = this::class.java.name
+ override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.PLACE_BEFORE_DEFAULT_EDITOR
+
+ override fun accept(
+ project: Project,
+ virtualFile: VirtualFile
+ ): Boolean {
+ val name = virtualFile.name
+ return when {
+ name.endsWith(".tmx", ignoreCase = true) -> true
+ else -> false
+ }
+ }
+
+ override fun createEditor(project: Project, file: VirtualFile): FileEditor {
+ val tmxFile = file.toVfs()
+ val tmx = runBlocking { tmxFile.readTiledMap() }
+
+ return object : FileEditor {
+ val panel by lazy { MyTileMapEditorPanel(tmx).realPanel }
+
+ override fun isModified(): Boolean {
+ return false
+ }
+
+ override fun getName(): String = "Editor"
+
+ override fun setState(state: FileEditorState) {
+ }
+
+ override fun getComponent(): JComponent = panel
+
+ override fun getPreferredFocusedComponent(): JComponent? = null
+
+ override fun getUserData(key: Key): T? {
+ return null
+ }
+
+ override fun putUserData(key: Key, value: T?) {
+ }
+
+ override fun getCurrentLocation(): FileEditorLocation? {
+ return null
+ }
+
+ override fun isValid(): Boolean = true
+
+ override fun addPropertyChangeListener(listener: PropertyChangeListener) {
+ }
+
+ override fun removePropertyChangeListener(listener: PropertyChangeListener) {
+ }
+
+ override fun dispose() {
+ }
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ fun main(args: Array) {
+ val frame = JFrame()
+ frame.isVisible = true
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index b8c8472..0ce93f6 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -80,6 +80,7 @@
+