diff --git a/editor/build.gradle b/editor/build.gradle index 3102c86e..5c23dd47 100644 --- a/editor/build.gradle +++ b/editor/build.gradle @@ -37,6 +37,9 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib" + // JSON Proto + implementation "com.google.protobuf:protobuf-java-util:${protobufVersion}" + // GUI implementation "no.tornado:tornadofx:${tornadoFxVersion}" implementation platform("org.kordamp.ikonli:ikonli-bom:${ikonliVersion}") diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt index 0e63926f..ae7d4b13 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt @@ -1,18 +1,23 @@ package com.bartlomiejpluta.base.editor.asset.model import javafx.beans.binding.Bindings.createObjectBinding -import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleStringProperty +import javafx.beans.value.ObservableValue import tornadofx.getValue import tornadofx.setValue import java.io.File -abstract class Asset(directory: ObjectProperty, val uid: String, val source: String, name: String) { +abstract class Asset(sourceDirectory: ObservableValue, compiledDirectory: ObservableValue, val uid: String, val source: String, val binarySource: String, name: String) { + constructor(directory: ObservableValue, uid: String, source: String, name: String) : this(directory, directory, uid, source, source, name) + val nameProperty = SimpleStringProperty(name) var name by nameProperty - val fileProperty = createObjectBinding({ File(directory.value, source) }, directory) + val fileProperty = createObjectBinding({ File(sourceDirectory.value, source) }, sourceDirectory) val file by fileProperty + val binaryFileProperty = createObjectBinding({ File(compiledDirectory.value, binarySource) }) + val binaryFile by binaryFileProperty + override fun toString() = "${this.javaClass.simpleName}[name=$name, uid=$uid]" } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/AssetSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/AssetSerializer.kt new file mode 100644 index 00000000..65c447ff --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/AssetSerializer.kt @@ -0,0 +1,7 @@ +package com.bartlomiejpluta.base.editor.code.build.asset + +import com.bartlomiejpluta.base.editor.project.model.Project + +interface AssetSerializer { + fun serializeAssets(project: Project) +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/DefaultAssetSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/DefaultAssetSerializer.kt new file mode 100644 index 00000000..9c6abd8d --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/asset/DefaultAssetSerializer.kt @@ -0,0 +1,47 @@ +package com.bartlomiejpluta.base.editor.code.build.asset + +import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset +import com.bartlomiejpluta.base.editor.map.serial.BinaryMapSerializer +import com.bartlomiejpluta.base.editor.project.context.ProjectContext +import com.bartlomiejpluta.base.editor.project.model.Project +import com.bartlomiejpluta.base.editor.project.serial.BinaryProjectSerializer +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component + +@Component +class DefaultAssetSerializer : AssetSerializer { + + @Autowired + private lateinit var projectContext: ProjectContext + + @Autowired + private lateinit var projectSerializer: BinaryProjectSerializer + + @Autowired + private lateinit var mapSerializer: BinaryMapSerializer + + override fun serializeAssets(project: Project) { + project.buildAssetsDir.mkdirs() + serializeProject(project) + + project.buildAssetsMapsDir.mkdirs() + serializeMaps(project) + } + + private fun serializeProject(project: Project) { + project.binaryProjectFile.outputStream().use { + projectSerializer.serialize(project, it) + } + } + + private fun serializeMaps(project: Project) = project.maps.forEach { + serializeMap(it) + } + + private fun serializeMap(asset: GameMapAsset) { + val map = projectContext.loadMap(asset.uid) + asset.binaryFile.outputStream().use { + mapSerializer.serialize(map, it) + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/AssetMapCodeGenerator.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/AssetMapCodeGenerator.kt index f04c65c2..41920a62 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/AssetMapCodeGenerator.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/AssetMapCodeGenerator.kt @@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.editor.code.build.generator import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer -import com.bartlomiejpluta.base.editor.map.serial.MapDeserializer +import com.bartlomiejpluta.base.editor.map.serial.TextMapDeserializer import com.bartlomiejpluta.base.editor.project.context.ProjectContext import com.bartlomiejpluta.base.editor.project.model.Project import com.squareup.javapoet.* @@ -22,7 +22,7 @@ class AssetMapCodeGenerator : CodeGenerator { private lateinit var projectContext: ProjectContext @Autowired - private lateinit var mapDeserializer: MapDeserializer + private lateinit var mapDeserializer: TextMapDeserializer override fun generate() { projectContext.project?.let(::generateAssetClasses) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt index e890815d..dea9ff28 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.code.build.pipeline +import com.bartlomiejpluta.base.editor.code.build.asset.AssetSerializer import com.bartlomiejpluta.base.editor.code.build.compiler.Compiler import com.bartlomiejpluta.base.editor.code.build.database.DatabaseAssembler import com.bartlomiejpluta.base.editor.code.build.exception.BuildException @@ -38,6 +39,9 @@ class DefaultBuildPipelineService : BuildPipelineService { @Autowired private lateinit var engineProvider: GameEngineProvider + @Autowired + private lateinit var assetSerializer: AssetSerializer + @Autowired private lateinit var projectAssembler: ProjectAssembler @@ -126,6 +130,9 @@ class DefaultBuildPipelineService : BuildPipelineService { out.println("Linking compilation units...") packager.pack(project.buildClassesDirectory, outputFile, "BOOT-INF/classes") + out.println("Serializing project assets...") + assetSerializer.serializeAssets(project) + out.println("Assembling project assets...") projectAssembler.assembly(project, outputFile, out, err) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt index 0ec4e2ba..2c0a93b9 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt @@ -24,7 +24,9 @@ class DefaultProjectAssembler : ProjectAssembler { } private fun tryToAssembly(project: Project, targetJar: File) { - packager.pack(project.mapsDirectory, targetJar, "BOOT-INF/classes/project/maps") + packager.copy(project.binaryProjectFile, targetJar, "BOOT-INF/classes/project") + packager.pack(project.buildAssetsMapsDir, targetJar, "BOOT-INF/classes/project/maps") + packager.pack(project.tileSetsDirectory, targetJar, "BOOT-INF/classes/project/tilesets") packager.pack(project.autoTilesDirectory, targetJar, "BOOT-INF/classes/project/autotiles") packager.pack(project.imagesDirectory, targetJar, "BOOT-INF/classes/project/images") @@ -34,7 +36,6 @@ class DefaultProjectAssembler : ProjectAssembler { packager.pack(project.fontsDirectory, targetJar, "BOOT-INF/classes/project/fonts") packager.pack(project.widgetsDirectory, targetJar, "BOOT-INF/classes/project/widgets") packager.pack(project.audioDirectory, targetJar, "BOOT-INF/classes/project/audio") - packager.copy(project.projectFile, targetJar, "BOOT-INF/classes/project") } companion object { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt index f945f0bd..d0f6a9d0 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt @@ -155,7 +155,7 @@ class MainController : Controller() { fun openProject() { chooseFile( title = "Load Project", - filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")), + filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.json)", "*.json")), ).getOrNull(0)?.let { clearResources() projectContext.open(it) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt index 59b15954..3fa234fb 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt @@ -4,4 +4,4 @@ import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.project.model.Project class GameMapAsset(project: Project, uid: String, name: String) : - Asset(project.mapsDirectoryProperty, uid, "$uid.dat", name) \ No newline at end of file + Asset(project.mapsDirectoryProperty, project.buildAssetsMapsDirProperty, uid, "$uid.json", "$uid.dat", name) \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapDeserializer.kt similarity index 65% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapDeserializer.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapDeserializer.kt index a3738828..a9e9faec 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapDeserializer.kt @@ -2,10 +2,8 @@ package com.bartlomiejpluta.base.editor.map.serial import com.bartlomiejpluta.base.editor.common.serial.Deserializer import com.bartlomiejpluta.base.editor.map.model.map.GameMap -import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset -import com.bartlomiejpluta.base.editor.tileset.model.TileSet import java.io.InputStream -interface MapDeserializer : Deserializer { +interface BinaryMapDeserializer : Deserializer { fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapSerializer.kt new file mode 100644 index 00000000..4c417307 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/BinaryMapSerializer.kt @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.editor.map.serial + +import com.bartlomiejpluta.base.editor.common.serial.Serializer +import com.bartlomiejpluta.base.editor.map.model.map.GameMap + +interface BinaryMapSerializer : Serializer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapDeserializer.kt new file mode 100644 index 00000000..df9c0723 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapDeserializer.kt @@ -0,0 +1,24 @@ +package com.bartlomiejpluta.base.editor.map.serial + +import com.bartlomiejpluta.base.editor.map.model.map.GameMap +import com.bartlomiejpluta.base.proto.GameMapProto +import com.google.protobuf.util.JsonFormat +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import java.io.InputStream + +@Component +class JsonProtobufMapDeserializer : TextMapDeserializer { + + @Autowired + private lateinit var deserializer: ProtobufMapDeserializer + + override fun deserialize(input: InputStream) = deserialize(input, { _, uid -> uid }, { _, uid -> uid }) + + override fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap = + input.bufferedReader().use { reader -> + val builder = GameMapProto.GameMap.newBuilder() + JsonFormat.parser().merge(reader, builder) + deserializer.buildObject(builder.build(), replaceTileSet, replaceAutoTile) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapSerializer.kt new file mode 100644 index 00000000..3a277f71 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/JsonProtobufMapSerializer.kt @@ -0,0 +1,22 @@ +package com.bartlomiejpluta.base.editor.map.serial + +import com.bartlomiejpluta.base.editor.map.model.map.GameMap +import com.google.protobuf.util.JsonFormat +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import java.io.OutputStream +import java.io.PrintWriter + +@Component +class JsonProtobufMapSerializer : TextMapSerializer { + + @Autowired + private lateinit var serializer: ProtobufMapSerializer + override fun serialize(item: GameMap, output: OutputStream) { + output.bufferedWriter().let(::PrintWriter).use { out -> + JsonFormat.printer().print(serializer.buildProto(item)).lines().forEach { line -> + out.println(line) + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt index 9bcb926f..cdaa3401 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt @@ -15,7 +15,7 @@ import org.springframework.stereotype.Component import java.io.InputStream @Component -class ProtobufMapDeserializer : MapDeserializer { +open class ProtobufMapDeserializer : BinaryMapDeserializer { @Autowired private lateinit var appContext: ApplicationContext @@ -30,8 +30,13 @@ class ProtobufMapDeserializer : MapDeserializer { input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String + ): GameMap = buildObject(GameMapProto.GameMap.parseFrom(input), replaceTileSet, replaceAutoTile) + + fun buildObject( + proto: GameMapProto.GameMap, + replaceTileSet: (String, String) -> String, + replaceAutoTile: (String, String) -> String ): GameMap { - val proto = GameMapProto.GameMap.parseFrom(input) val map = GameMap(proto.tileWidth.toDouble(), proto.tileHeight.toDouble()) map.uid = proto.uid map.rows = proto.rows diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt index c28b5de2..82ad2401 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt @@ -9,9 +9,11 @@ import org.springframework.stereotype.Component import java.io.OutputStream @Component -class ProtobufMapSerializer : MapSerializer { +open class ProtobufMapSerializer : BinaryMapSerializer { - override fun serialize(item: GameMap, output: OutputStream) { + override fun serialize(item: GameMap, output: OutputStream) = buildProto(item).writeTo(output) + + fun buildProto(item: GameMap): GameMapProto.GameMap { val protoMap = GameMapProto.GameMap.newBuilder() protoMap.uid = item.uid protoMap.rows = item.rows @@ -23,7 +25,7 @@ class ProtobufMapSerializer : MapSerializer { item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) } - protoMap.build().writeTo(output) + return protoMap.build() } private fun serializeLayer(layer: Layer): GameMapProto.Layer { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapDeserializer.kt new file mode 100644 index 00000000..9c562316 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapDeserializer.kt @@ -0,0 +1,9 @@ +package com.bartlomiejpluta.base.editor.map.serial + +import com.bartlomiejpluta.base.editor.common.serial.Deserializer +import com.bartlomiejpluta.base.editor.map.model.map.GameMap +import java.io.InputStream + +interface TextMapDeserializer : Deserializer { + fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapSerializer.kt similarity index 78% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapSerializer.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapSerializer.kt index 2b8c3af8..4ef409ae 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/MapSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/TextMapSerializer.kt @@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.map.serial import com.bartlomiejpluta.base.editor.common.serial.Serializer import com.bartlomiejpluta.base.editor.map.model.map.GameMap -interface MapSerializer : Serializer \ No newline at end of file +interface TextMapSerializer : Serializer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/wizard/MapImportFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/wizard/MapImportFragment.kt index 6124ca23..c2a24d36 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/wizard/MapImportFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/wizard/MapImportFragment.kt @@ -45,7 +45,7 @@ class MapImportFragment : Fragment("Basic Data") { action { mapBuilderVM.fileProperty.value = chooseFile( title = "Map file location", - filters = arrayOf(FileChooser.ExtensionFilter("Map files (*.dat)", "*.dat")) + filters = arrayOf(FileChooser.ExtensionFilter("Map files (*.json)", "*.json")) ).getOrNull(0)?.absolutePath } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt index 37d10e87..adaf484c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt @@ -25,11 +25,11 @@ import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.map.model.map.GameMap -import com.bartlomiejpluta.base.editor.map.serial.MapDeserializer -import com.bartlomiejpluta.base.editor.map.serial.MapSerializer +import com.bartlomiejpluta.base.editor.map.serial.TextMapDeserializer +import com.bartlomiejpluta.base.editor.map.serial.TextMapSerializer import com.bartlomiejpluta.base.editor.project.model.Project -import com.bartlomiejpluta.base.editor.project.serial.ProjectDeserializer -import com.bartlomiejpluta.base.editor.project.serial.ProjectSerializer +import com.bartlomiejpluta.base.editor.project.serial.TextProjectDeserializer +import com.bartlomiejpluta.base.editor.project.serial.TextProjectSerializer import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAssetData import com.bartlomiejpluta.base.editor.tileset.model.TileSet @@ -53,16 +53,16 @@ class DefaultProjectContext : ProjectContext { private val autoTileCache = mutableMapOf() @Autowired - private lateinit var projectSerializer: ProjectSerializer + private lateinit var projectSerializer: TextProjectSerializer @Autowired - private lateinit var projectDeserializer: ProjectDeserializer + private lateinit var projectDeserializer: TextProjectDeserializer @Autowired - private lateinit var mapSerializer: MapSerializer + private lateinit var mapSerializer: TextMapSerializer @Autowired - private lateinit var mapDeserializer: MapDeserializer + private lateinit var mapDeserializer: TextMapDeserializer @Autowired private lateinit var javaClassService: JavaClassService diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt index cfda870e..0b378c2c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt @@ -128,6 +128,16 @@ class Project { createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty) val buildOutputJarFile by buildOutputJarFileProperty + val buildAssetsDirProperty = SimpleObjectProperty() + var buildAssetsDir by buildAssetsDirProperty + private set + + val binaryProjectFileProperty = createObjectBinding({ File(buildAssetsDir, BINARY_PROJECT_FILE) }, buildAssetsDirProperty) + val binaryProjectFile by binaryProjectFileProperty + + val buildAssetsMapsDirProperty = createObjectBinding({ File(buildAssetsDir, MAPS_DIR) }, buildAssetsDirProperty) + val buildAssetsMapsDir by buildAssetsMapsDirProperty + lateinit var database: H2DBDataSource init { @@ -148,6 +158,7 @@ class Project { buildClassesDirectory = File(it, BUILD_CLASSES_DIR) buildDependenciesDirectory = File(it, BUILD_DEPENDENCIES_DIR) buildGeneratedCodeDirectory = File(it, BUILD_GENERATED_DIR) + buildAssetsDir = File(it, BUILD_ASSETS_DIR) buildDatabaseDumpDirectory = File(it, BUILD_DATABASE_DUMP_DIR) buildOutDirectory = File(it, BUILD_OUT_DIR) } @@ -179,7 +190,8 @@ class Project { } companion object { - const val PROJECT_FILE = "project.bep" + const val PROJECT_FILE = "project.json" + const val BINARY_PROJECT_FILE = "project.bep" const val DATABASE_FILE = "data.sql" const val DATABASE_DUMP_FILE = "data.sql" const val PROJECT_OUTPUT_JAR_FILE = "game.jar" @@ -200,6 +212,7 @@ class Project { const val BUILD_OUT_DIR = "$BUILD_DIR/out" const val BUILD_DEPENDENCIES_DIR = "$BUILD_DIR/dependencies" const val BUILD_GENERATED_DIR = "$BUILD_DIR/generated" + const val BUILD_ASSETS_DIR = "$BUILD_DIR/assets" const val BUILD_DATABASE_DUMP_DIR = "$BUILD_DIR/db" } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectDeserializer.kt new file mode 100644 index 00000000..a55aad97 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectDeserializer.kt @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.editor.project.serial + +import com.bartlomiejpluta.base.editor.common.serial.Deserializer +import com.bartlomiejpluta.base.editor.project.model.Project + +interface BinaryProjectDeserializer : Deserializer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectSerializer.kt new file mode 100644 index 00000000..e02dd65f --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/BinaryProjectSerializer.kt @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.editor.project.serial + +import com.bartlomiejpluta.base.editor.common.serial.Serializer +import com.bartlomiejpluta.base.editor.project.model.Project + +interface BinaryProjectSerializer : Serializer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectDeserializer.kt new file mode 100644 index 00000000..54152e48 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectDeserializer.kt @@ -0,0 +1,20 @@ +package com.bartlomiejpluta.base.editor.project.serial + +import com.bartlomiejpluta.base.editor.project.model.Project +import com.bartlomiejpluta.base.proto.ProjectProto +import com.google.protobuf.util.JsonFormat +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import java.io.InputStream + +@Component +class JsonProtobufProjectDeserializer : TextProjectDeserializer { + + @Autowired + private lateinit var deserializer: ProtobufProjectDeserializer + override fun deserialize(input: InputStream): Project = input.bufferedReader().use { reader -> + val builder = ProjectProto.Project.newBuilder() + JsonFormat.parser().merge(reader, builder) + deserializer.buildObject(builder.build()) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectSerializer.kt new file mode 100644 index 00000000..a950721e --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/JsonProtobufProjectSerializer.kt @@ -0,0 +1,22 @@ +package com.bartlomiejpluta.base.editor.project.serial + +import com.bartlomiejpluta.base.editor.project.model.Project +import com.google.protobuf.util.JsonFormat +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import java.io.OutputStream +import java.io.PrintWriter + +@Component +class JsonProtobufProjectSerializer : TextProjectSerializer { + + @Autowired + private lateinit var serializer: ProtobufProjectSerializer + override fun serialize(item: Project, output: OutputStream) { + output.bufferedWriter().let(::PrintWriter).use { out -> + JsonFormat.printer().print(serializer.buildProto(item)).lines().forEach { line -> + out.println(line) + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt index d0e15835..5ea02b86 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt @@ -17,25 +17,23 @@ import org.springframework.stereotype.Component import java.io.InputStream @Component -class ProtobufProjectDeserializer : ProjectDeserializer { +open class ProtobufProjectDeserializer : BinaryProjectDeserializer { - override fun deserialize(input: InputStream): Project { - val proto = ProjectProto.Project.parseFrom(input) + override fun deserialize(input: InputStream): Project = buildObject(ProjectProto.Project.parseFrom(input)) - return Project().apply { - name = proto.name - runner = proto.runner - maps.addAll(proto.mapsList.map { deserializeMap(this, it) }) - tileSets.addAll(proto.tileSetsList.map { deserializeTileSet(this, it) }) - autoTiles.addAll(proto.autoTilesList.map { deserializeAutoTile(this, it) }) - images.addAll(proto.imagesList.map { deserializeImage(this, it) }) - characterSets.addAll(proto.characterSetsList.map { deserializeCharacterSet(this, it) }) - animations.addAll(proto.animationsList.map { deserializeAnimation(this, it) }) - iconSets.addAll(proto.iconSetsList.map { deserializeIconSet(this, it) }) - fonts.addAll(proto.fontsList.map { deserializeFont(this, it) }) - widgets.addAll(proto.widgetsList.map { deserializeWidget(this, it) }) - sounds.addAll(proto.soundsList.map { deserializeSound(this, it) }) - } + fun buildObject(proto: ProjectProto.Project): Project = Project().apply { + name = proto.name + runner = proto.runner + maps.addAll(proto.mapsList.map { deserializeMap(this, it) }) + tileSets.addAll(proto.tileSetsList.map { deserializeTileSet(this, it) }) + autoTiles.addAll(proto.autoTilesList.map { deserializeAutoTile(this, it) }) + images.addAll(proto.imagesList.map { deserializeImage(this, it) }) + characterSets.addAll(proto.characterSetsList.map { deserializeCharacterSet(this, it) }) + animations.addAll(proto.animationsList.map { deserializeAnimation(this, it) }) + iconSets.addAll(proto.iconSetsList.map { deserializeIconSet(this, it) }) + fonts.addAll(proto.fontsList.map { deserializeFont(this, it) }) + widgets.addAll(proto.widgetsList.map { deserializeWidget(this, it) }) + sounds.addAll(proto.soundsList.map { deserializeSound(this, it) }) } private fun deserializeMap(project: Project, map: ProjectProto.GameMapAsset) = GameMapAsset( diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt index 5d98d904..41d50d95 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt @@ -16,9 +16,11 @@ import org.springframework.stereotype.Component import java.io.OutputStream @Component -class ProtobufProjectSerializer : ProjectSerializer { +class ProtobufProjectSerializer : BinaryProjectSerializer { - override fun serialize(item: Project, output: OutputStream) { + override fun serialize(item: Project, output: OutputStream) = buildProto(item).writeTo(output) + + fun buildProto(item: Project): ProjectProto.Project { val proto = ProjectProto.Project.newBuilder() proto.name = item.name proto.runner = item.runner @@ -32,18 +34,18 @@ class ProtobufProjectSerializer : ProjectSerializer { proto.addAllFonts(item.fonts.map(this::serializeFont)) proto.addAllWidgets(item.widgets.map(this::serializeWidget)) proto.addAllSounds(item.sounds.map(this::serializeSound)) - proto.build().writeTo(output) + return proto.build() } private fun serializeMap(map: GameMapAsset) = ProjectProto.GameMapAsset.newBuilder() .setUid(map.uid) - .setSource(map.source) + .setSource(map.binarySource) .setName(map.name) .build() private fun serializeTileSet(tileSet: TileSetAsset) = ProjectProto.TileSetAsset.newBuilder() .setUid(tileSet.uid) - .setSource(tileSet.source) + .setSource(tileSet.binarySource) .setName(tileSet.name) .setRows(tileSet.rows) .setColumns(tileSet.columns) @@ -51,7 +53,7 @@ class ProtobufProjectSerializer : ProjectSerializer { private fun serializeAutoTile(autoTile: AutoTileAsset) = ProjectProto.AutoTileSetAsset.newBuilder() .setUid(autoTile.uid) - .setSource(autoTile.source) + .setSource(autoTile.binarySource) .setName(autoTile.name) .setRows(autoTile.rows) .setColumns(autoTile.columns) @@ -60,13 +62,13 @@ class ProtobufProjectSerializer : ProjectSerializer { private fun serializeImage(image: ImageAsset) = ProjectProto.ImageAsset.newBuilder() .setUid(image.uid) - .setSource(image.source) + .setSource(image.binarySource) .setName(image.name) .build() private fun serializeCharacterSet(characterSet: CharacterSetAsset) = ProjectProto.CharacterSetAsset.newBuilder() .setUid(characterSet.uid) - .setSource(characterSet.source) + .setSource(characterSet.binarySource) .setName(characterSet.name) .setRows(characterSet.rows) .setColumns(characterSet.columns) @@ -74,7 +76,7 @@ class ProtobufProjectSerializer : ProjectSerializer { private fun serializeAnimation(animation: AnimationAsset) = ProjectProto.AnimationAsset.newBuilder() .setUid(animation.uid) - .setSource(animation.source) + .setSource(animation.binarySource) .setName(animation.name) .setRows(animation.rows) .setColumns(animation.columns) @@ -82,7 +84,7 @@ class ProtobufProjectSerializer : ProjectSerializer { private fun serializeIconSet(iconSet: IconSetAsset) = ProjectProto.IconSetAsset.newBuilder() .setUid(iconSet.uid) - .setSource(iconSet.source) + .setSource(iconSet.binarySource) .setName(iconSet.name) .setRows(iconSet.rows) .setColumns(iconSet.columns) @@ -90,19 +92,19 @@ class ProtobufProjectSerializer : ProjectSerializer { private fun serializeFont(font: FontAsset) = ProjectProto.FontAsset.newBuilder() .setUid(font.uid) - .setSource(font.source) + .setSource(font.binarySource) .setName(font.name) .build() private fun serializeWidget(widget: WidgetAsset) = ProjectProto.WidgetAsset.newBuilder() .setUid(widget.uid) - .setSource(widget.source) + .setSource(widget.binarySource) .setName(widget.name) .build() private fun serializeSound(sound: SoundAsset) = ProjectProto.SoundAsset.newBuilder() .setUid(sound.uid) - .setSource(sound.source) + .setSource(sound.binarySource) .setName(sound.name) .build() } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectDeserializer.kt similarity index 76% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectDeserializer.kt index c6ea244c..f0764ba3 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectDeserializer.kt @@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.project.serial import com.bartlomiejpluta.base.editor.common.serial.Deserializer import com.bartlomiejpluta.base.editor.project.model.Project -interface ProjectDeserializer : Deserializer \ No newline at end of file +interface TextProjectDeserializer : Deserializer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectSerializer.kt similarity index 77% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectSerializer.kt index 21db544d..1a8c6d62 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/TextProjectSerializer.kt @@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.project.serial import com.bartlomiejpluta.base.editor.common.serial.Serializer import com.bartlomiejpluta.base.editor.project.model.Project -interface ProjectSerializer : Serializer \ No newline at end of file +interface TextProjectSerializer : Serializer \ No newline at end of file