From 18219a065fe0351f3c4ccf4054189088b6b0ff75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 4 Feb 2021 22:16:12 +0100 Subject: [PATCH] [Editor] Enable drawing with selected brush --- .../base/editor/model/tileset/TileSet.kt | 4 +-- .../render/canvas/tileset/TileSetCanvas.kt | 13 ++++++-- .../render/canvas/tileset/TileSetSelection.kt | 32 +++++++++++++++++-- .../base/editor/view/component/map/MapPane.kt | 3 ++ .../view/component/tileset/TileSetPane.kt | 5 +-- .../base/editor/view/fragment/MapFragment.kt | 9 +++--- 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt index a9e22792..71e6ffd9 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt @@ -26,7 +26,7 @@ class TileSet(private val image: Image, val rows: Int, val columns: Int) { return Tile(this, row, column, tile) } - fun getTile(row: Int, column: Int) = tiles[row][column] + fun getTile(row: Int, column: Int) = tiles[row.coerceIn(0 until rows)][column.coerceIn(0 until columns)] - fun getTile(id: Int) = tiles[id / rows][id % columns] + fun getTile(id: Int) = tiles[id / columns][id % columns] } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt index efa3cb3b..5acd0890 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.render.canvas.tileset +import com.bartlomiejpluta.base.editor.model.tileset.Tile import com.bartlomiejpluta.base.editor.model.tileset.TileSet import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEvent import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEventHandler @@ -7,11 +8,10 @@ import com.bartlomiejpluta.base.editor.render.model.Renderable import javafx.scene.canvas.GraphicsContext import javafx.scene.input.MouseButton import javafx.scene.input.MouseEvent -import javafx.scene.paint.Color -class TileSetCanvas(private val tileSet: TileSet) : Renderable, MapMouseEventHandler { +class TileSetCanvas(tileSet: TileSet, selectionCallback: (Array>) -> Unit) : Renderable, MapMouseEventHandler { private val tiles = tileSet.tiles - private var selection = TileSetSelection(tileSet) + private var selection = TileSetSelection(tileSet, selectionCallback) private var mouseRow = -1 private var mouseColumn = -1 @@ -38,6 +38,7 @@ class TileSetCanvas(private val tileSet: TileSet) : Renderable, MapMouseEventHan when (event.type) { MouseEvent.MOUSE_PRESSED -> beginSelection(event) MouseEvent.MOUSE_DRAGGED -> proceedSelection(event) + MouseEvent.MOUSE_RELEASED -> finishSelection(event) } } @@ -48,6 +49,12 @@ class TileSetCanvas(private val tileSet: TileSet) : Renderable, MapMouseEventHan } private fun proceedSelection(event: MapMouseEvent) { + if(event.button == MouseButton.PRIMARY) { + selection.proceed(event.row.toDouble(), event.column.toDouble()) + } + } + + private fun finishSelection(event: MapMouseEvent) { if(event.button == MouseButton.PRIMARY) { selection.finish(event.row.toDouble(), event.column.toDouble()) } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetSelection.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetSelection.kt index c824e9fa..c31ecee4 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetSelection.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetSelection.kt @@ -1,17 +1,24 @@ package com.bartlomiejpluta.base.editor.render.canvas.tileset +import com.bartlomiejpluta.base.editor.model.tileset.Tile import com.bartlomiejpluta.base.editor.model.tileset.TileSet import com.bartlomiejpluta.base.editor.render.model.Renderable +import javafx.collections.ObservableList import javafx.scene.canvas.GraphicsContext import javafx.scene.paint.Color import org.apache.commons.logging.LogFactory import org.slf4j.Logger import org.slf4j.LoggerFactory +import tornadofx.observableListOf import kotlin.math.abs +import kotlin.math.max import kotlin.math.min -class TileSetSelection(tileSet: TileSet) : Renderable { +class TileSetSelection( + private val tileSet: TileSet, + private val selectionCallback: (Array>) -> Unit +) : Renderable { private val tileWidth = tileSet.tileWidth.toDouble() private val tileHeight = tileSet.tileHeight.toDouble() @@ -24,6 +31,7 @@ class TileSetSelection(tileSet: TileSet) : Renderable { private var width = tileWidth private var height = tileHeight + fun begin(row: Double, column: Double) { startRow = row offsetRow = 0.0 @@ -40,13 +48,33 @@ class TileSetSelection(tileSet: TileSet) : Renderable { height = (offsetRow + 1) * tileHeight } - fun finish(row: Double, column: Double) { + fun proceed(row: Double, column: Double) { offsetRow = abs(row - startRow) offsetColumn = abs(column - startColumn) updateRect(row, column) } + fun finish(row: Double, column: Double) { + proceed(row, column) + + startRow = min(row, startRow) + startColumn = min(column, startColumn) + + val firstRow = startRow.toInt() + val firstColumn = startColumn.toInt() + val rows = offsetRow.toInt() + 1 + val columns = offsetColumn.toInt() + 1 + + var brush = Array>(rows) { rowIndex -> + Array(columns) { columnIndex -> + tileSet.getTile(firstRow + rowIndex, firstColumn + columnIndex) + } + } + + selectionCallback(brush) + } + override fun render(gc: GraphicsContext) { gc.fill = SELECTION_FILL_COLOR gc.fillRect(x, y, width, height) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt index 2bd04d88..900f2759 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.editor.view.component.map import com.bartlomiejpluta.base.editor.model.map.map.GameMap +import com.bartlomiejpluta.base.editor.model.tileset.Tile import com.bartlomiejpluta.base.editor.render.canvas.map.MapCanvas import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEvent import com.bartlomiejpluta.base.editor.render.canvas.map.MapPaintingTrace @@ -25,6 +26,8 @@ class MapPane(map: GameMap, paintingCallback: (MapPaintingTrace) -> Unit) : Canv render() } + fun setBrush(brush: Array>) = mapCanvas.setBrush(brush) + fun render() { mapCanvas.render(graphicsContext2D) } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt index 61b9cd3f..550ed21b 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.view.component.tileset +import com.bartlomiejpluta.base.editor.model.tileset.Tile import com.bartlomiejpluta.base.editor.model.tileset.TileSet import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEvent import com.bartlomiejpluta.base.editor.render.canvas.tileset.TileSetCanvas @@ -7,8 +8,8 @@ import javafx.event.EventHandler import javafx.scene.canvas.Canvas import javafx.scene.input.MouseEvent -class TileSetPane(private val tileSet: TileSet) : Canvas(), EventHandler { - private val tileSetCanvas = TileSetCanvas(tileSet) +class TileSetPane(private val tileSet: TileSet, selectionCallback: (Array>) -> Unit) : Canvas(), EventHandler { + private val tileSetCanvas = TileSetCanvas(tileSet, selectionCallback) init { onMouseMoved = this diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt index 14197cfd..acf3e2e0 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt @@ -17,7 +17,8 @@ class MapFragment : Fragment() { val scaleProperty = SimpleDoubleProperty(1.0) val map: GameMap by param() - private val pane = MapPane(map) { undoRedoService.push(it) } + private val mapPane = MapPane(map) { undoRedoService.push(it) } + private val tileSetPane = TileSetPane(map.tileSet) { mapPane.setBrush(it) } private val transformation = Scale(1.0, 1.0, 0.0, 0.0).apply { xProperty().bind(scaleProperty) @@ -25,7 +26,7 @@ class MapFragment : Fragment() { } init { - subscribe { pane.render() } + subscribe { mapPane.render() } } override val root = borderpane { @@ -44,14 +45,14 @@ class MapFragment : Fragment() { } group { - this += pane + this += mapPane transforms += transformation } } } right = scrollpane { - this += TileSetPane(map.tileSet) + this += tileSetPane } } }