[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] 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.PAINTING_MODE -> PassageAbility.values()[(formerPassageAbility.ordinal + 1) % PassageAbility.values().size]
BrushMode.ERASING_MODE -> PassageAbility.ALLOW BrushMode.ERASING_MODE -> PassageAbility.ALLOW
else -> throw IllegalStateException("Unknown brush mode")
} }
layer.passageMap[row][column] = passageAbility layer.passageMap[row][column] = passageAbility

View File

@@ -1,10 +1,8 @@
package com.bartlomiejpluta.base.editor.map.serial 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.enumeration.PassageAbility
import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer import com.bartlomiejpluta.base.editor.map.model.layer.*
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.map.GameMap import com.bartlomiejpluta.base.editor.map.model.map.GameMap
import com.bartlomiejpluta.base.editor.project.context.ProjectContext import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import com.bartlomiejpluta.base.editor.tileset.model.Tile import com.bartlomiejpluta.base.editor.tileset.model.Tile
@@ -40,6 +38,7 @@ class ProtobufMapDeserializer : MapDeserializer {
proto.hasTileLayer() -> deserializeTileLayer(rows, columns, tileSet, proto) proto.hasTileLayer() -> deserializeTileLayer(rows, columns, tileSet, proto)
proto.hasObjectLayer() -> deserializeObjectLayer(rows, columns, proto) proto.hasObjectLayer() -> deserializeObjectLayer(rows, columns, proto)
proto.hasColorLayer() -> deserializeColorLayer(proto) proto.hasColorLayer() -> deserializeColorLayer(proto)
proto.hasImageLayer() -> deserializeImageLayer(proto)
else -> throw IllegalStateException("Not supported layer type") 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 } } val passageMap: Array<Array<PassageAbility>> = Array(rows) { Array(columns) { PassageAbility.ALLOW } }
proto.objectLayer.passageMapList.forEachIndexed { index, passage -> 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.ALLOW -> PassageAbility.ALLOW
GameMapProto.PassageAbility.BLOCK -> PassageAbility.BLOCK GameMapProto.PassageAbility.BLOCK -> PassageAbility.BLOCK
GameMapProto.PassageAbility.UP_ONLY -> PassageAbility.UP_ONLY GameMapProto.PassageAbility.UP_ONLY -> PassageAbility.UP_ONLY
GameMapProto.PassageAbility.DOWN_ONLY -> PassageAbility.DOWN_ONLY GameMapProto.PassageAbility.DOWN_ONLY -> PassageAbility.DOWN_ONLY
GameMapProto.PassageAbility.LEFT_ONLY -> PassageAbility.LEFT_ONLY GameMapProto.PassageAbility.LEFT_ONLY -> PassageAbility.LEFT_ONLY
GameMapProto.PassageAbility.RIGHT_ONLY -> PassageAbility.RIGHT_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 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 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.enumeration.PassageAbility
import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer import com.bartlomiejpluta.base.editor.map.model.layer.*
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.map.GameMap import com.bartlomiejpluta.base.editor.map.model.map.GameMap
import com.bartlomiejpluta.base.proto.GameMapProto import com.bartlomiejpluta.base.proto.GameMapProto
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@@ -56,6 +54,22 @@ class ProtobufMapSerializer : MapSerializer {
.build() .build()
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setColorLayer(it).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") 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 { override fun loadImage(uid: String) = project?.let {
val asset = it.images.firstOrNull { image -> image.uid == uid } val asset = it.images.firstOrNull { image -> image.uid == uid }
?: throw IllegalStateException("The Image with uid [$uid] does not exist ") ?: throw IllegalStateException("The Image with uid [$uid] does not exist ")

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.base.editor.project.context 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.image.asset.ImageAssetData
import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.map.model.map.GameMap
import com.bartlomiejpluta.base.editor.project.model.Project import com.bartlomiejpluta.base.editor.project.model.Project
@@ -24,5 +25,6 @@ interface ProjectContext {
fun loadTileSet(uid: String): TileSet fun loadTileSet(uid: String): TileSet
fun importImage(data: ImageAssetData) fun importImage(data: ImageAssetData)
fun findImageAsset(uid: String): ImageAsset
fun loadImage(uid: String): Image fun loadImage(uid: String): Image
} }

View File

@@ -47,6 +47,15 @@ message ColorLayer {
} }
message ImageLayer { message ImageLayer {
// TODO imageUID required string imageUID = 1;
// TODO imageMode 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;
} }