[Editor] Improve ImageLayer model

This commit is contained in:
2021-02-22 11:36:00 +01:00
parent 65db792724
commit 02e9554b1a
8 changed files with 90 additions and 37 deletions

View File

@@ -150,11 +150,13 @@ class MapCanvas(val map: GameMapVM, private val editorStateVM: EditorStateVM, pr
val x = imageLayer.x.toDouble()
val y = imageLayer.y.toDouble()
when (imageLayer.mode) {
ImageLayerMode.NORMAL -> gc.drawImage(imageLayer.image, x, y)
ImageLayerMode.FIT_SCREEN -> gc.drawImage(imageLayer.image, x, y)
ImageLayerMode.FIT_MAP -> gc.drawImage(imageLayer.image, x, y, map.width, map.height)
else -> {
val width = imageLayer.image.width * imageLayer.scaleX
val height = imageLayer.image.height * imageLayer.scaleY
gc.drawImage(imageLayer.image, x, y, width, height)
}
}

View File

@@ -2,6 +2,6 @@ package com.bartlomiejpluta.base.editor.map.model.enumeration
enum class ImageLayerMode {
NORMAL,
FIT_SCREEN,
FIT_MAP
FIT_MAP,
FIT_SCREEN
}

View File

@@ -3,18 +3,28 @@ package com.bartlomiejpluta.base.editor.map.model.layer
import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.map.model.enumeration.ImageLayerMode
import javafx.beans.binding.Bindings.createObjectBinding
import javafx.beans.property.SimpleObjectProperty
import javafx.beans.property.SimpleStringProperty
import javafx.scene.image.Image
import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class ImageLayer(name: String, imageAsset: ImageAsset, x: Int, y: Int, mode: ImageLayerMode, opacity: Int) : Layer {
class ImageLayer(
name: String,
imageAsset: ImageAsset,
opacity: Int = 100,
x: Int = 0,
y: Int = 0,
scaleX: Double = 1.0,
scaleY: Double = 1.0,
mode: ImageLayerMode = ImageLayerMode.NORMAL,
parallax: Boolean = false
) : Layer {
override val nameProperty = SimpleStringProperty(name)
override var name by nameProperty
val imageAssetProperty = SimpleObjectProperty(imageAsset)
val imageAssetProperty = imageAsset.toProperty()
var imageAsset by imageAssetProperty
val imageProperty = createObjectBinding({
@@ -23,18 +33,26 @@ class ImageLayer(name: String, imageAsset: ImageAsset, x: Int, y: Int, mode: Ima
val image by imageProperty
val opacityProperty = SimpleObjectProperty(opacity)
val opacityProperty = opacity.toProperty()
var opacity by opacityProperty
val modeProperty = SimpleObjectProperty(mode)
var mode by modeProperty
val xProperty = SimpleObjectProperty(x)
val xProperty = x.toProperty()
var x by xProperty
val yProperty = SimpleObjectProperty(y)
val yProperty = y.toProperty()
var y by yProperty
val scaleXProperty = scaleX.toProperty()
var scaleX by scaleXProperty
val scaleYProperty = scaleY.toProperty()
var scaleY by scaleYProperty
val modeProperty = mode.toProperty()
var mode by modeProperty
val parallaxProperty = parallax.toProperty()
var parallax by parallaxProperty
override fun resize(rows: Int, columns: Int) {
// We essentially need to do nothing

View File

@@ -1,12 +1,10 @@
package com.bartlomiejpluta.base.editor.map.parameter.layer
import com.bartlomiejpluta.base.editor.common.parameter.model.EnumParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.GraphicAssetParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.IntegerParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter
import com.bartlomiejpluta.base.editor.common.parameter.model.*
import com.bartlomiejpluta.base.editor.map.model.enumeration.ImageLayerMode
import com.bartlomiejpluta.base.editor.map.model.layer.ImageLayer
import com.bartlomiejpluta.base.editor.project.model.Project
import javafx.beans.binding.Bindings.createBooleanBinding
import javafx.collections.ObservableList
import org.springframework.stereotype.Component
@@ -28,10 +26,6 @@ class ImageLayerParametersBinder : LayerParametersBinder<ImageLayer> {
onCommit()
}
val mode = EnumParameter("mode", ImageLayerMode.NORMAL, autocommit = true) { _, _, _ ->
onCommit()
}
val x = IntegerParameter("x", 0, autocommit = true) { _, _, _ ->
onCommit()
}
@@ -40,12 +34,43 @@ class ImageLayerParametersBinder : LayerParametersBinder<ImageLayer> {
onCommit()
}
val scaleX = DoubleParameter("scaleX", 1.0, 0.0, Double.MAX_VALUE, 0.01, autocommit = true) { _, _, _ ->
onCommit()
}
val scaleY = DoubleParameter("scaleY", 1.0, 0.0, Double.MAX_VALUE, 0.01, autocommit = true) { _, _, _ ->
onCommit()
}
val mode = EnumParameter("mode", ImageLayerMode.NORMAL, autocommit = true) { _, _, _ ->
onCommit()
}
val parallax = BooleanParameter("parallax") { _, _, _ ->
onCommit()
}
image.bindBidirectional(layer.imageAssetProperty)
opacity.bindBidirectional(layer.opacityProperty)
mode.bindBidirectional(layer.modeProperty)
x.bindBidirectional(layer.xProperty)
y.bindBidirectional(layer.yProperty)
scaleX.bindBidirectional(layer.scaleXProperty)
scaleY.bindBidirectional(layer.scaleYProperty)
mode.bindBidirectional(layer.modeProperty)
parallax.bindBidirectional(layer.parallaxProperty)
parameters.addAll(image, opacity, mode, x, y)
val isNormalMode = createBooleanBinding({ mode.value == ImageLayerMode.NORMAL }, mode.valueProperty).apply {
addListener { _, _, value ->
if (!value) {
scaleX.value = 1.0
scaleY.value = 1.0
}
}
}
scaleX.editableProperty.bind(isNormalMode)
scaleY.editableProperty.bind(isNormalMode)
parameters.addAll(image, opacity, x, y, scaleX, scaleY, mode, parallax)
}
}

View File

@@ -88,14 +88,17 @@ class ProtobufMapDeserializer : MapDeserializer {
return ImageLayer(
name = proto.name,
imageAsset = projectContext.findImageAsset(proto.imageLayer.imageUID),
opacity = proto.imageLayer.opacity,
x = proto.imageLayer.x,
y = proto.imageLayer.y,
opacity = proto.imageLayer.opacity,
scaleX = proto.imageLayer.scaleX,
scaleY = proto.imageLayer.scaleY,
mode = when (proto.imageLayer.mode!!) {
GameMapProto.ImageLayerMode.NORMAL -> ImageLayerMode.NORMAL
GameMapProto.ImageLayerMode.FIT_SCREEN -> ImageLayerMode.FIT_SCREEN
GameMapProto.ImageLayerMode.FIT_MAP -> ImageLayerMode.FIT_MAP
}
GameMapProto.ImageLayerMode.FIT_SCREEN -> ImageLayerMode.FIT_SCREEN
},
parallax = proto.imageLayer.parallax
)
}
}

View File

@@ -57,15 +57,18 @@ class ProtobufMapSerializer : MapSerializer {
is ImageLayer -> GameMapProto.ImageLayer.newBuilder()
.setImageUID(layer.imageAsset.uid)
.setOpacity(layer.opacity)
.setX(layer.x)
.setY(layer.y)
.setScaleX(layer.scaleX)
.setScaleY(layer.scaleY)
.setMode(
when (layer.mode!!) {
ImageLayerMode.NORMAL -> GameMapProto.ImageLayerMode.NORMAL
ImageLayerMode.FIT_SCREEN -> GameMapProto.ImageLayerMode.FIT_SCREEN
ImageLayerMode.FIT_MAP -> GameMapProto.ImageLayerMode.FIT_MAP
ImageLayerMode.FIT_SCREEN -> GameMapProto.ImageLayerMode.FIT_SCREEN
}
)
.setX(layer.x)
.setY(layer.y)
.setParallax(layer.parallax)
.build()
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setImageLayer(it).build() }

View File

@@ -9,7 +9,6 @@ import com.bartlomiejpluta.base.editor.command.model.map.RenameLayerCommand
import com.bartlomiejpluta.base.editor.command.service.UndoRedoService
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.map.model.enumeration.ImageLayerMode
import com.bartlomiejpluta.base.editor.map.model.layer.*
import com.bartlomiejpluta.base.editor.map.viewmodel.EditorStateVM
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM
@@ -91,7 +90,7 @@ class MapLayersView : View() {
SelectGraphicAssetFragment<ImageAsset>::assets to projectContext.project?.images!!
).apply {
onComplete {
val layer = ImageLayer("Layer ${mapVM.layers.size + 1}", it, 0, 0, ImageLayerMode.NORMAL, 100)
val layer = ImageLayer("Layer ${mapVM.layers.size + 1}", it)
val command = CreateLayerCommand(mapVM.item, layer)
command.execute()
layersPane.selectionModel.select(mapVM.layers.size - 1)

View File

@@ -49,13 +49,16 @@ message ColorLayer {
message ImageLayer {
required string imageUID = 1;
required uint32 opacity = 2;
required ImageLayerMode mode = 3;
required int32 x = 4;
required int32 y = 5;
required int32 x = 3;
required int32 y = 4;
required double scaleX = 5;
required double scaleY = 6;
required ImageLayerMode mode = 7;
required bool parallax = 8;
}
enum ImageLayerMode {
NORMAL = 0;
FIT_SCREEN = 1;
NORMAL = 1;
FIT_MAP = 2;
}
FIT_SCREEN = 3;
}