[Editor] Enable ImageLayer serialization

This commit is contained in:
2021-02-20 13:11:55 +01:00
parent c6815a065f
commit 1ca3f34143
6 changed files with 57 additions and 15 deletions

View File

@@ -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

View File

@@ -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<PassageAbility>> = 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
)
}
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
}
)
}
}

View File

@@ -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")
}
}

View File

@@ -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 ")

View File

@@ -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
}

View File

@@ -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;
}