diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 8a14d3b56..49a0caa16 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -14,7 +14,7 @@ signal cel_switched ## Emitted whenever you select a different cel. signal project_data_changed(project: Project) ## Emitted when project data is modified. signal font_loaded ## Emitted when a new font has been loaded, or an old one gets unloaded. -enum LayerTypes { PIXEL, GROUP, THREE_D } +enum LayerTypes { PIXEL, GROUP, THREE_D, TILEMAP } enum GridTypes { CARTESIAN, ISOMETRIC, ALL } ## ## Used to tell whether a color is being taken from the current theme, ## or if it is a custom color. diff --git a/src/Classes/Cels/CelTileMap.gd b/src/Classes/Cels/CelTileMap.gd new file mode 100644 index 000000000..26a6b8ccf --- /dev/null +++ b/src/Classes/Cels/CelTileMap.gd @@ -0,0 +1,44 @@ +class_name CelTileMap +extends PixelCel + +enum TileEditingMode { MANUAL, AUTO, STACK } + +var tileset: TileSetCustom +var tile_editing_mode := TileEditingMode.MANUAL +var indices := PackedInt32Array() +var indices_x: int +var indices_y: int + + +func _init(_tileset: TileSetCustom, _image := Image.new(), _opacity := 1.0) -> void: + super._init(_image, _opacity) + tileset = _tileset + indices_x = ceili(float(get_image().get_width()) / tileset.tile_size.x) + indices_y = ceili(float(get_image().get_height()) / tileset.tile_size.y) + indices.resize(indices_x * indices_y) + + +func update_texture() -> void: + super.update_texture() + for i in indices.size(): + var x_coord := float(tileset.tile_size.x) * (i % indices_x) + var y_coord := float(tileset.tile_size.y) * (i / indices_x) + var rect := Rect2i(Vector2i(x_coord, y_coord), tileset.tile_size) + var image_portion := image.get_region(rect) + var index := indices[i] + if tile_editing_mode == TileEditingMode.MANUAL: + if index == 0: + continue + if image_portion.get_data() != tileset.tiles[index].get_data(): + tileset.tiles[index].copy_from(image_portion) + elif tile_editing_mode == TileEditingMode.AUTO: + if index == 0: + continue + else: + if not image_portion.is_invisible(): + tileset.tiles.append(image_portion) + indices[i] = tileset.tiles.size() + + +func get_class_name() -> String: + return "CelTileMap" diff --git a/src/Classes/Layers/LayerTileMap.gd b/src/Classes/Layers/LayerTileMap.gd new file mode 100644 index 000000000..d54b68882 --- /dev/null +++ b/src/Classes/Layers/LayerTileMap.gd @@ -0,0 +1,19 @@ +class_name LayerTileMap +extends PixelLayer + +var tileset: TileSetCustom + + +func _init(_project: Project, _tileset: TileSetCustom, _name := "") -> void: + super._init(_project, _name) + tileset = _tileset + + +# Overridden Methods: +func get_layer_type() -> int: + return Global.LayerTypes.TILEMAP + + +func new_empty_cel() -> BaseCel: + var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) + return CelTileMap.new(tileset, image) diff --git a/src/Classes/TileSetCustom.gd b/src/Classes/TileSetCustom.gd new file mode 100644 index 000000000..2feafe1ed --- /dev/null +++ b/src/Classes/TileSetCustom.gd @@ -0,0 +1,16 @@ +class_name TileSetCustom +extends RefCounted + +var name := "" +var tile_size: Vector2i +var tiles: Array[Image] = [] + + +func _init(_tile_size: Vector2i, _name := "") -> void: + tile_size = _tile_size + name = _name + #var indices_x := ceili(float(_project_size.x) / tile_size.x) + #var indices_y := ceili(float(_project_size.y) / tile_size.y) + #tiles.resize(indices_x * indices_y + 1) + var empty_image := Image.create_empty(tile_size.x, tile_size.y, false, Image.FORMAT_RGBA8) + tiles.append(empty_image)