From 1ca3f34143c16a8f4f31af869720a34456f6bc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 20 Feb 2021 13:11:55 +0100 Subject: [PATCH] [Editor] Enable ImageLayer serialization --- .../editor/map/canvas/ObjectPaintingTrace.kt | 3 +-- .../map/serial/ProtobufMapDeserializer.kt | 27 ++++++++++++++----- .../map/serial/ProtobufMapSerializer.kt | 22 ++++++++++++--- .../project/context/DefaultProjectContext.kt | 5 ++++ .../editor/project/context/ProjectContext.kt | 2 ++ proto/src/main/proto/map.proto | 13 +++++++-- 6 files changed, 57 insertions(+), 15 deletions(-) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt index 0fdef47a..06dc158f 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt @@ -38,10 +38,9 @@ class ObjectPaintingTrace(val map: GameMapVM, override val commandName: String) formerPassageAbility = layer.passageMap[row][column] - passageAbility = when (brushVM.mode) { + passageAbility = when (brushVM.mode!!) { BrushMode.PAINTING_MODE -> PassageAbility.values()[(formerPassageAbility.ordinal + 1) % PassageAbility.values().size] BrushMode.ERASING_MODE -> PassageAbility.ALLOW - else -> throw IllegalStateException("Unknown brush mode") } layer.passageMap[row][column] = passageAbility 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 27a17aeb..ae720cf3 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 @@ -1,10 +1,8 @@ package com.bartlomiejpluta.base.editor.map.serial +import com.bartlomiejpluta.base.editor.map.model.enumeration.ImageLayerMode import com.bartlomiejpluta.base.editor.map.model.enumeration.PassageAbility -import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer -import com.bartlomiejpluta.base.editor.map.model.layer.Layer -import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer -import com.bartlomiejpluta.base.editor.map.model.layer.TileLayer +import com.bartlomiejpluta.base.editor.map.model.layer.* import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.project.context.ProjectContext import com.bartlomiejpluta.base.editor.tileset.model.Tile @@ -40,6 +38,7 @@ class ProtobufMapDeserializer : MapDeserializer { proto.hasTileLayer() -> deserializeTileLayer(rows, columns, tileSet, proto) proto.hasObjectLayer() -> deserializeObjectLayer(rows, columns, proto) proto.hasColorLayer() -> deserializeColorLayer(proto) + proto.hasImageLayer() -> deserializeImageLayer(proto) else -> throw IllegalStateException("Not supported layer type") } @@ -62,14 +61,13 @@ class ProtobufMapDeserializer : MapDeserializer { val passageMap: Array> = Array(rows) { Array(columns) { PassageAbility.ALLOW } } proto.objectLayer.passageMapList.forEachIndexed { index, passage -> - passageMap[index / columns][index % columns] = when (passage) { + passageMap[index / columns][index % columns] = when (passage!!) { GameMapProto.PassageAbility.ALLOW -> PassageAbility.ALLOW GameMapProto.PassageAbility.BLOCK -> PassageAbility.BLOCK GameMapProto.PassageAbility.UP_ONLY -> PassageAbility.UP_ONLY GameMapProto.PassageAbility.DOWN_ONLY -> PassageAbility.DOWN_ONLY GameMapProto.PassageAbility.LEFT_ONLY -> PassageAbility.LEFT_ONLY GameMapProto.PassageAbility.RIGHT_ONLY -> PassageAbility.RIGHT_ONLY - else -> throw IllegalStateException("Unknown passage ability type") } } @@ -85,4 +83,19 @@ class ProtobufMapDeserializer : MapDeserializer { alpha = proto.colorLayer.alpha ) } -} \ No newline at end of file + + private fun deserializeImageLayer(proto: GameMapProto.Layer): Layer { + return ImageLayer( + name = proto.name, + imageAsset = projectContext.findImageAsset(proto.imageLayer.imageUID), + x = proto.imageLayer.x, + y = proto.imageLayer.y, + opacity = proto.imageLayer.opacity, + mode = when (proto.imageLayer.mode!!) { + GameMapProto.ImageLayerMode.NORMAL -> ImageLayerMode.NORMAL + GameMapProto.ImageLayerMode.FIT_SCREEN -> ImageLayerMode.FIT_SCREEN + GameMapProto.ImageLayerMode.FIT_MAP -> ImageLayerMode.FIT_MAP + } + ) + } +} 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 3a24e2f1..8e7da87f 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 @@ -1,10 +1,8 @@ package com.bartlomiejpluta.base.editor.map.serial +import com.bartlomiejpluta.base.editor.map.model.enumeration.ImageLayerMode import com.bartlomiejpluta.base.editor.map.model.enumeration.PassageAbility -import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer -import com.bartlomiejpluta.base.editor.map.model.layer.Layer -import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer -import com.bartlomiejpluta.base.editor.map.model.layer.TileLayer +import com.bartlomiejpluta.base.editor.map.model.layer.* import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.proto.GameMapProto import org.springframework.stereotype.Component @@ -56,6 +54,22 @@ class ProtobufMapSerializer : MapSerializer { .build() .let { GameMapProto.Layer.newBuilder().setName(layer.name).setColorLayer(it).build() } + is ImageLayer -> GameMapProto.ImageLayer.newBuilder() + .setImageUID(layer.imageAsset.uid) + .setOpacity(layer.opacity) + .setMode( + when (layer.mode!!) { + ImageLayerMode.NORMAL -> GameMapProto.ImageLayerMode.NORMAL + ImageLayerMode.FIT_SCREEN -> GameMapProto.ImageLayerMode.FIT_SCREEN + ImageLayerMode.FIT_MAP -> GameMapProto.ImageLayerMode.FIT_MAP + } + ) + .setX(layer.x) + .setY(layer.y) + .build() + .let { GameMapProto.Layer.newBuilder().setName(layer.name).setImageLayer(it).build() } + + else -> throw IllegalStateException("Not supported layer type") } } 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 24e3423d..cd3691ef 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 @@ -134,6 +134,11 @@ class DefaultProjectContext : ProjectContext { } } + override fun findImageAsset(uid: String) = project?.let { + it.images.firstOrNull { image -> image.uid == uid } + ?: throw IllegalStateException("The Image with uid [$uid] does not exist ") + } ?: throw IllegalStateException("There is no open project in the context") + override fun loadImage(uid: String) = project?.let { val asset = it.images.firstOrNull { image -> image.uid == uid } ?: throw IllegalStateException("The Image with uid [$uid] does not exist ") diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt index 7b96bc33..6f1e715b 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.project.context +import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.project.model.Project @@ -24,5 +25,6 @@ interface ProjectContext { fun loadTileSet(uid: String): TileSet fun importImage(data: ImageAssetData) + fun findImageAsset(uid: String): ImageAsset fun loadImage(uid: String): Image } \ No newline at end of file diff --git a/proto/src/main/proto/map.proto b/proto/src/main/proto/map.proto index 90e77d1e..34853c25 100644 --- a/proto/src/main/proto/map.proto +++ b/proto/src/main/proto/map.proto @@ -47,6 +47,15 @@ message ColorLayer { } message ImageLayer { - // TODO imageUID - // TODO imageMode + required string imageUID = 1; + required uint32 opacity = 2; + required ImageLayerMode mode = 3; + required int32 x = 4; + required int32 y = 5; +} + +enum ImageLayerMode { + NORMAL = 0; + FIT_SCREEN = 1; + FIT_MAP = 2; }