| 1 | /**************************************************************************/ |
| 2 | /* tile_set.h */ |
| 3 | /**************************************************************************/ |
| 4 | /* This file is part of: */ |
| 5 | /* GODOT ENGINE */ |
| 6 | /* https://godotengine.org */ |
| 7 | /**************************************************************************/ |
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
| 10 | /* */ |
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
| 12 | /* a copy of this software and associated documentation files (the */ |
| 13 | /* "Software"), to deal in the Software without restriction, including */ |
| 14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
| 16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
| 17 | /* the following conditions: */ |
| 18 | /* */ |
| 19 | /* The above copyright notice and this permission notice shall be */ |
| 20 | /* included in all copies or substantial portions of the Software. */ |
| 21 | /* */ |
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 29 | /**************************************************************************/ |
| 30 | |
| 31 | #ifndef TILE_SET_H |
| 32 | #define TILE_SET_H |
| 33 | |
| 34 | #include "core/io/resource.h" |
| 35 | #include "core/object/object.h" |
| 36 | #include "core/templates/local_vector.h" |
| 37 | #include "core/templates/rb_set.h" |
| 38 | #include "scene/2d/light_occluder_2d.h" |
| 39 | #include "scene/main/canvas_item.h" |
| 40 | #include "scene/resources/concave_polygon_shape_2d.h" |
| 41 | #include "scene/resources/convex_polygon_shape_2d.h" |
| 42 | #include "scene/resources/image_texture.h" |
| 43 | #include "scene/resources/navigation_polygon.h" |
| 44 | #include "scene/resources/packed_scene.h" |
| 45 | #include "scene/resources/physics_material.h" |
| 46 | #include "scene/resources/shape_2d.h" |
| 47 | |
| 48 | #ifndef DISABLE_DEPRECATED |
| 49 | #include "scene/resources/shader.h" |
| 50 | #endif |
| 51 | |
| 52 | class TileMap; |
| 53 | class TileSetSource; |
| 54 | class TileSetAtlasSource; |
| 55 | class TileData; |
| 56 | |
| 57 | // Forward-declare the plugins. |
| 58 | class TileSetPlugin; |
| 59 | class TileSetPluginAtlasRendering; |
| 60 | class TileSetPluginAtlasPhysics; |
| 61 | class TileSetPluginAtlasNavigation; |
| 62 | |
| 63 | union TileMapCell { |
| 64 | struct { |
| 65 | int16_t source_id; |
| 66 | int16_t coord_x; |
| 67 | int16_t coord_y; |
| 68 | int16_t alternative_tile; |
| 69 | }; |
| 70 | |
| 71 | uint64_t _u64t; |
| 72 | |
| 73 | static uint32_t hash(const TileMapCell &p_hash) { |
| 74 | return hash_one_uint64(p_hash._u64t); |
| 75 | } |
| 76 | |
| 77 | TileMapCell(int p_source_id = -1, Vector2i p_atlas_coords = Vector2i(-1, -1), int p_alternative_tile = -1) { // default are INVALID_SOURCE, INVALID_ATLAS_COORDS, INVALID_TILE_ALTERNATIVE |
| 78 | source_id = p_source_id; |
| 79 | set_atlas_coords(p_atlas_coords); |
| 80 | alternative_tile = p_alternative_tile; |
| 81 | } |
| 82 | |
| 83 | Vector2i get_atlas_coords() const { |
| 84 | return Vector2i(coord_x, coord_y); |
| 85 | } |
| 86 | |
| 87 | void set_atlas_coords(const Vector2i &r_coords) { |
| 88 | coord_x = r_coords.x; |
| 89 | coord_y = r_coords.y; |
| 90 | } |
| 91 | |
| 92 | bool operator<(const TileMapCell &p_other) const { |
| 93 | if (source_id == p_other.source_id) { |
| 94 | if (coord_x == p_other.coord_x) { |
| 95 | if (coord_y == p_other.coord_y) { |
| 96 | return alternative_tile < p_other.alternative_tile; |
| 97 | } else { |
| 98 | return coord_y < p_other.coord_y; |
| 99 | } |
| 100 | } else { |
| 101 | return coord_x < p_other.coord_x; |
| 102 | } |
| 103 | } else { |
| 104 | return source_id < p_other.source_id; |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | bool operator!=(const TileMapCell &p_other) const { |
| 109 | return !(source_id == p_other.source_id && coord_x == p_other.coord_x && coord_y == p_other.coord_y && alternative_tile == p_other.alternative_tile); |
| 110 | } |
| 111 | bool operator==(const TileMapCell &p_other) const { |
| 112 | return source_id == p_other.source_id && coord_x == p_other.coord_x && coord_y == p_other.coord_y && alternative_tile == p_other.alternative_tile; |
| 113 | } |
| 114 | }; |
| 115 | |
| 116 | class TileMapPattern : public Resource { |
| 117 | GDCLASS(TileMapPattern, Resource); |
| 118 | |
| 119 | Size2i size; |
| 120 | HashMap<Vector2i, TileMapCell> pattern; |
| 121 | |
| 122 | void _set_tile_data(const Vector<int> &p_data); |
| 123 | Vector<int> _get_tile_data() const; |
| 124 | |
| 125 | protected: |
| 126 | bool _set(const StringName &p_name, const Variant &p_value); |
| 127 | bool _get(const StringName &p_name, Variant &r_ret) const; |
| 128 | void _get_property_list(List<PropertyInfo> *p_list) const; |
| 129 | |
| 130 | static void _bind_methods(); |
| 131 | |
| 132 | public: |
| 133 | void set_cell(const Vector2i &p_coords, int p_source_id, const Vector2i p_atlas_coords, int p_alternative_tile = 0); |
| 134 | bool has_cell(const Vector2i &p_coords) const; |
| 135 | void remove_cell(const Vector2i &p_coords, bool p_update_size = true); |
| 136 | int get_cell_source_id(const Vector2i &p_coords) const; |
| 137 | Vector2i get_cell_atlas_coords(const Vector2i &p_coords) const; |
| 138 | int get_cell_alternative_tile(const Vector2i &p_coords) const; |
| 139 | |
| 140 | TypedArray<Vector2i> get_used_cells() const; |
| 141 | |
| 142 | Size2i get_size() const; |
| 143 | void set_size(const Size2i &p_size); |
| 144 | bool is_empty() const; |
| 145 | |
| 146 | void clear(); |
| 147 | }; |
| 148 | |
| 149 | class TileSet : public Resource { |
| 150 | GDCLASS(TileSet, Resource); |
| 151 | |
| 152 | #ifndef DISABLE_DEPRECATED |
| 153 | private: |
| 154 | struct CompatibilityShapeData { |
| 155 | Vector2i autotile_coords; |
| 156 | bool one_way; |
| 157 | float one_way_margin; |
| 158 | Ref<Shape2D> shape; |
| 159 | Transform2D transform; |
| 160 | }; |
| 161 | |
| 162 | struct CompatibilityTileData { |
| 163 | String name; |
| 164 | Ref<Texture2D> texture; |
| 165 | Vector2 tex_offset; |
| 166 | Ref<Material> material; |
| 167 | Rect2 region; |
| 168 | int tile_mode = 0; |
| 169 | Color modulate = Color(1, 1, 1); |
| 170 | |
| 171 | // Atlas or autotiles data |
| 172 | int autotile_bitmask_mode = 0; |
| 173 | Vector2 autotile_icon_coordinate; |
| 174 | Size2i autotile_tile_size = Size2i(16, 16); |
| 175 | |
| 176 | int autotile_spacing = 0; |
| 177 | HashMap<Vector2i, int> autotile_bitmask_flags; |
| 178 | HashMap<Vector2i, Ref<OccluderPolygon2D>> autotile_occluder_map; |
| 179 | HashMap<Vector2i, Ref<NavigationPolygon>> autotile_navpoly_map; |
| 180 | HashMap<Vector2i, int> autotile_priority_map; |
| 181 | HashMap<Vector2i, int> autotile_z_index_map; |
| 182 | |
| 183 | Vector<CompatibilityShapeData> shapes; |
| 184 | Ref<OccluderPolygon2D> occluder; |
| 185 | Vector2 occluder_offset; |
| 186 | Ref<NavigationPolygon> navigation; |
| 187 | Vector2 navigation_offset; |
| 188 | int z_index = 0; |
| 189 | }; |
| 190 | |
| 191 | enum CompatibilityTileMode { |
| 192 | COMPATIBILITY_TILE_MODE_SINGLE_TILE = 0, |
| 193 | COMPATIBILITY_TILE_MODE_AUTO_TILE, |
| 194 | COMPATIBILITY_TILE_MODE_ATLAS_TILE, |
| 195 | }; |
| 196 | |
| 197 | HashMap<int, CompatibilityTileData *> compatibility_data; |
| 198 | HashMap<int, int> compatibility_tilemap_mapping_tile_modes; |
| 199 | HashMap<int, RBMap<Array, Array>> compatibility_tilemap_mapping; |
| 200 | HashMap<Vector2i, int> compatibility_size_count; |
| 201 | |
| 202 | void _compatibility_conversion(); |
| 203 | |
| 204 | public: |
| 205 | // Format of output array [source_id, atlas_coords, alternative] |
| 206 | Array compatibility_tilemap_map(int p_tile_id, Vector2i p_coords, bool p_flip_h, bool p_flip_v, bool p_transpose); |
| 207 | #endif // DISABLE_DEPRECATED |
| 208 | |
| 209 | public: |
| 210 | static const int INVALID_SOURCE; // -1; |
| 211 | |
| 212 | enum CellNeighbor { |
| 213 | CELL_NEIGHBOR_RIGHT_SIDE = 0, |
| 214 | CELL_NEIGHBOR_RIGHT_CORNER, |
| 215 | CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, |
| 216 | CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER, |
| 217 | CELL_NEIGHBOR_BOTTOM_SIDE, |
| 218 | CELL_NEIGHBOR_BOTTOM_CORNER, |
| 219 | CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, |
| 220 | CELL_NEIGHBOR_BOTTOM_LEFT_CORNER, |
| 221 | CELL_NEIGHBOR_LEFT_SIDE, |
| 222 | CELL_NEIGHBOR_LEFT_CORNER, |
| 223 | CELL_NEIGHBOR_TOP_LEFT_SIDE, |
| 224 | CELL_NEIGHBOR_TOP_LEFT_CORNER, |
| 225 | CELL_NEIGHBOR_TOP_SIDE, |
| 226 | CELL_NEIGHBOR_TOP_CORNER, |
| 227 | CELL_NEIGHBOR_TOP_RIGHT_SIDE, |
| 228 | CELL_NEIGHBOR_TOP_RIGHT_CORNER, |
| 229 | CELL_NEIGHBOR_MAX, |
| 230 | }; |
| 231 | |
| 232 | static const char *CELL_NEIGHBOR_ENUM_TO_TEXT[]; |
| 233 | |
| 234 | enum TerrainMode { |
| 235 | TERRAIN_MODE_MATCH_CORNERS_AND_SIDES = 0, |
| 236 | TERRAIN_MODE_MATCH_CORNERS, |
| 237 | TERRAIN_MODE_MATCH_SIDES, |
| 238 | }; |
| 239 | |
| 240 | enum TileShape { |
| 241 | TILE_SHAPE_SQUARE, |
| 242 | TILE_SHAPE_ISOMETRIC, |
| 243 | TILE_SHAPE_HALF_OFFSET_SQUARE, |
| 244 | TILE_SHAPE_HEXAGON, |
| 245 | }; |
| 246 | |
| 247 | enum TileLayout { |
| 248 | TILE_LAYOUT_STACKED, |
| 249 | TILE_LAYOUT_STACKED_OFFSET, |
| 250 | TILE_LAYOUT_STAIRS_RIGHT, |
| 251 | TILE_LAYOUT_STAIRS_DOWN, |
| 252 | TILE_LAYOUT_DIAMOND_RIGHT, |
| 253 | TILE_LAYOUT_DIAMOND_DOWN, |
| 254 | }; |
| 255 | |
| 256 | enum TileOffsetAxis { |
| 257 | TILE_OFFSET_AXIS_HORIZONTAL, |
| 258 | TILE_OFFSET_AXIS_VERTICAL, |
| 259 | }; |
| 260 | |
| 261 | struct PackedSceneSource { |
| 262 | Ref<PackedScene> scene; |
| 263 | Vector2 offset; |
| 264 | }; |
| 265 | |
| 266 | class TerrainsPattern { |
| 267 | bool valid = false; |
| 268 | int terrain = -1; |
| 269 | int bits[TileSet::CELL_NEIGHBOR_MAX]; |
| 270 | bool is_valid_bit[TileSet::CELL_NEIGHBOR_MAX]; |
| 271 | |
| 272 | int not_empty_terrains_count = 0; |
| 273 | |
| 274 | public: |
| 275 | bool is_valid() const; |
| 276 | bool is_erase_pattern() const; |
| 277 | |
| 278 | bool operator<(const TerrainsPattern &p_terrains_pattern) const; |
| 279 | bool operator==(const TerrainsPattern &p_terrains_pattern) const; |
| 280 | bool operator!=(const TerrainsPattern &p_terrains_pattern) const { |
| 281 | return !operator==(p_terrains_pattern); |
| 282 | }; |
| 283 | |
| 284 | void set_terrain(int p_terrain); |
| 285 | int get_terrain() const; |
| 286 | |
| 287 | void set_terrain_peering_bit(TileSet::CellNeighbor p_peering_bit, int p_terrain); |
| 288 | int get_terrain_peering_bit(TileSet::CellNeighbor p_peering_bit) const; |
| 289 | |
| 290 | void from_array(Array p_terrains); |
| 291 | Array as_array() const; |
| 292 | |
| 293 | TerrainsPattern(const TileSet *p_tile_set, int p_terrain_set); |
| 294 | TerrainsPattern() {} |
| 295 | }; |
| 296 | |
| 297 | protected: |
| 298 | bool _set(const StringName &p_name, const Variant &p_value); |
| 299 | bool _get(const StringName &p_name, Variant &r_ret) const; |
| 300 | void _get_property_list(List<PropertyInfo> *p_list) const; |
| 301 | void _validate_property(PropertyInfo &p_property) const; |
| 302 | |
| 303 | private: |
| 304 | // --- TileSet data --- |
| 305 | // Basic shape and layout. |
| 306 | TileShape tile_shape = TILE_SHAPE_SQUARE; |
| 307 | TileLayout tile_layout = TILE_LAYOUT_STACKED; |
| 308 | TileOffsetAxis tile_offset_axis = TILE_OFFSET_AXIS_HORIZONTAL; |
| 309 | Size2i tile_size = Size2i(16, 16); //Size2(64, 64); |
| 310 | |
| 311 | // Rendering. |
| 312 | bool uv_clipping = false; |
| 313 | struct OcclusionLayer { |
| 314 | uint32_t light_mask = 1; |
| 315 | bool sdf_collision = false; |
| 316 | }; |
| 317 | Vector<OcclusionLayer> occlusion_layers; |
| 318 | |
| 319 | Ref<ArrayMesh> tile_lines_mesh; |
| 320 | Ref<ArrayMesh> tile_filled_mesh; |
| 321 | bool tile_meshes_dirty = true; |
| 322 | |
| 323 | // Physics |
| 324 | struct PhysicsLayer { |
| 325 | uint32_t collision_layer = 1; |
| 326 | uint32_t collision_mask = 1; |
| 327 | Ref<PhysicsMaterial> physics_material; |
| 328 | }; |
| 329 | Vector<PhysicsLayer> physics_layers; |
| 330 | |
| 331 | // Terrains |
| 332 | struct Terrain { |
| 333 | String name; |
| 334 | Color color; |
| 335 | }; |
| 336 | struct TerrainSet { |
| 337 | TerrainMode mode = TERRAIN_MODE_MATCH_CORNERS_AND_SIDES; |
| 338 | Vector<Terrain> terrains; |
| 339 | }; |
| 340 | Vector<TerrainSet> terrain_sets; |
| 341 | |
| 342 | HashMap<TerrainMode, Ref<ArrayMesh>> terrain_meshes; |
| 343 | HashMap<TerrainMode, HashMap<CellNeighbor, Ref<ArrayMesh>>> terrain_peering_bits_meshes; |
| 344 | bool terrain_bits_meshes_dirty = true; |
| 345 | |
| 346 | LocalVector<RBMap<TileSet::TerrainsPattern, RBSet<TileMapCell>>> per_terrain_pattern_tiles; // Cached data. |
| 347 | bool terrains_cache_dirty = true; |
| 348 | void _update_terrains_cache(); |
| 349 | |
| 350 | // Navigation |
| 351 | struct NavigationLayer { |
| 352 | uint32_t layers = 1; |
| 353 | }; |
| 354 | Vector<NavigationLayer> navigation_layers; |
| 355 | |
| 356 | // CustomData |
| 357 | struct CustomDataLayer { |
| 358 | String name; |
| 359 | Variant::Type type = Variant::NIL; |
| 360 | }; |
| 361 | Vector<CustomDataLayer> custom_data_layers; |
| 362 | HashMap<String, int> custom_data_layers_by_name; |
| 363 | |
| 364 | // Per Atlas source data. |
| 365 | HashMap<int, Ref<TileSetSource>> sources; |
| 366 | Vector<int> source_ids; |
| 367 | int next_source_id = 0; |
| 368 | // --------------------- |
| 369 | |
| 370 | LocalVector<Ref<TileMapPattern>> patterns; |
| 371 | |
| 372 | void _compute_next_source_id(); |
| 373 | void _source_changed(); |
| 374 | |
| 375 | // Tile proxies |
| 376 | RBMap<int, int> source_level_proxies; |
| 377 | RBMap<Array, Array> coords_level_proxies; |
| 378 | RBMap<Array, Array> alternative_level_proxies; |
| 379 | |
| 380 | // Helpers |
| 381 | Vector<Point2> _get_square_terrain_polygon(Vector2i p_size); |
| 382 | Vector<Point2> _get_square_corner_or_side_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 383 | Vector<Point2> _get_square_corner_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 384 | Vector<Point2> _get_square_side_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 385 | |
| 386 | Vector<Point2> _get_isometric_terrain_polygon(Vector2i p_size); |
| 387 | Vector<Point2> _get_isometric_corner_or_side_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 388 | Vector<Point2> _get_isometric_corner_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 389 | Vector<Point2> _get_isometric_side_terrain_peering_bit_polygon(Vector2i p_size, TileSet::CellNeighbor p_bit); |
| 390 | |
| 391 | Vector<Point2> _get_half_offset_terrain_polygon(Vector2i p_size, float p_overlap, TileSet::TileOffsetAxis p_offset_axis); |
| 392 | Vector<Point2> _get_half_offset_corner_or_side_terrain_peering_bit_polygon(Vector2i p_size, float p_overlap, TileSet::TileOffsetAxis p_offset_axis, TileSet::CellNeighbor p_bit); |
| 393 | Vector<Point2> _get_half_offset_corner_terrain_peering_bit_polygon(Vector2i p_size, float p_overlap, TileSet::TileOffsetAxis p_offset_axis, TileSet::CellNeighbor p_bit); |
| 394 | Vector<Point2> _get_half_offset_side_terrain_peering_bit_polygon(Vector2i p_size, float p_overlap, TileSet::TileOffsetAxis p_offset_axis, TileSet::CellNeighbor p_bit); |
| 395 | |
| 396 | protected: |
| 397 | static void _bind_methods(); |
| 398 | |
| 399 | public: |
| 400 | // --- Plugins --- |
| 401 | Vector<TileSetPlugin *> get_tile_set_atlas_plugins() const; |
| 402 | |
| 403 | // --- Accessors for TileSet data --- |
| 404 | |
| 405 | // -- Shape and layout -- |
| 406 | void set_tile_shape(TileShape p_shape); |
| 407 | TileShape get_tile_shape() const; |
| 408 | void set_tile_layout(TileLayout p_layout); |
| 409 | TileLayout get_tile_layout() const; |
| 410 | void set_tile_offset_axis(TileOffsetAxis p_alignment); |
| 411 | TileOffsetAxis get_tile_offset_axis() const; |
| 412 | void set_tile_size(Size2i p_size); |
| 413 | Size2i get_tile_size() const; |
| 414 | |
| 415 | // -- Sources management -- |
| 416 | int get_next_source_id() const; |
| 417 | int get_source_count() const; |
| 418 | int get_source_id(int p_index) const; |
| 419 | int add_source(Ref<TileSetSource> p_tile_set_source, int p_source_id_override = -1); |
| 420 | void set_source_id(int p_source_id, int p_new_id); |
| 421 | void remove_source(int p_source_id); |
| 422 | void remove_source_ptr(TileSetSource *p_tile_set_source); // Not exposed |
| 423 | bool has_source(int p_source_id) const; |
| 424 | Ref<TileSetSource> get_source(int p_source_id) const; |
| 425 | |
| 426 | // Rendering |
| 427 | void set_uv_clipping(bool p_uv_clipping); |
| 428 | bool is_uv_clipping() const; |
| 429 | |
| 430 | int get_occlusion_layers_count() const; |
| 431 | void add_occlusion_layer(int p_index = -1); |
| 432 | void move_occlusion_layer(int p_from_index, int p_to_pos); |
| 433 | void remove_occlusion_layer(int p_index); |
| 434 | void set_occlusion_layer_light_mask(int p_layer_index, int p_light_mask); |
| 435 | int get_occlusion_layer_light_mask(int p_layer_index) const; |
| 436 | void set_occlusion_layer_sdf_collision(int p_layer_index, bool p_sdf_collision); |
| 437 | bool get_occlusion_layer_sdf_collision(int p_layer_index) const; |
| 438 | |
| 439 | // Physics |
| 440 | int get_physics_layers_count() const; |
| 441 | void add_physics_layer(int p_index = -1); |
| 442 | void move_physics_layer(int p_from_index, int p_to_pos); |
| 443 | void remove_physics_layer(int p_index); |
| 444 | void set_physics_layer_collision_layer(int p_layer_index, uint32_t p_layer); |
| 445 | uint32_t get_physics_layer_collision_layer(int p_layer_index) const; |
| 446 | void set_physics_layer_collision_mask(int p_layer_index, uint32_t p_mask); |
| 447 | uint32_t get_physics_layer_collision_mask(int p_layer_index) const; |
| 448 | void set_physics_layer_physics_material(int p_layer_index, Ref<PhysicsMaterial> p_physics_material); |
| 449 | Ref<PhysicsMaterial> get_physics_layer_physics_material(int p_layer_index) const; |
| 450 | |
| 451 | // Terrain sets |
| 452 | int get_terrain_sets_count() const; |
| 453 | void add_terrain_set(int p_index = -1); |
| 454 | void move_terrain_set(int p_from_index, int p_to_pos); |
| 455 | void remove_terrain_set(int p_index); |
| 456 | void set_terrain_set_mode(int p_terrain_set, TerrainMode p_terrain_mode); |
| 457 | TerrainMode get_terrain_set_mode(int p_terrain_set) const; |
| 458 | |
| 459 | // Terrains |
| 460 | int get_terrains_count(int p_terrain_set) const; |
| 461 | void add_terrain(int p_terrain_set, int p_index = -1); |
| 462 | void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos); |
| 463 | void remove_terrain(int p_terrain_set, int p_index); |
| 464 | void set_terrain_name(int p_terrain_set, int p_terrain_index, String p_name); |
| 465 | String get_terrain_name(int p_terrain_set, int p_terrain_index) const; |
| 466 | void set_terrain_color(int p_terrain_set, int p_terrain_index, Color p_color); |
| 467 | Color get_terrain_color(int p_terrain_set, int p_terrain_index) const; |
| 468 | bool is_valid_terrain_peering_bit_for_mode(TileSet::TerrainMode p_terrain_mode, TileSet::CellNeighbor p_peering_bit) const; |
| 469 | bool is_valid_terrain_peering_bit(int p_terrain_set, TileSet::CellNeighbor p_peering_bit) const; |
| 470 | |
| 471 | // Navigation |
| 472 | int get_navigation_layers_count() const; |
| 473 | void add_navigation_layer(int p_index = -1); |
| 474 | void move_navigation_layer(int p_from_index, int p_to_pos); |
| 475 | void remove_navigation_layer(int p_index); |
| 476 | void set_navigation_layer_layers(int p_layer_index, uint32_t p_layers); |
| 477 | uint32_t get_navigation_layer_layers(int p_layer_index) const; |
| 478 | void set_navigation_layer_layer_value(int p_layer_index, int p_layer_number, bool p_value); |
| 479 | bool get_navigation_layer_layer_value(int p_layer_index, int p_layer_number) const; |
| 480 | |
| 481 | // Custom data |
| 482 | int get_custom_data_layers_count() const; |
| 483 | void add_custom_data_layer(int p_index = -1); |
| 484 | void move_custom_data_layer(int p_from_index, int p_to_pos); |
| 485 | void remove_custom_data_layer(int p_index); |
| 486 | int get_custom_data_layer_by_name(String p_value) const; |
| 487 | void set_custom_data_layer_name(int p_layer_id, String p_value); |
| 488 | String get_custom_data_layer_name(int p_layer_id) const; |
| 489 | void set_custom_data_layer_type(int p_layer_id, Variant::Type p_value); |
| 490 | Variant::Type get_custom_data_layer_type(int p_layer_id) const; |
| 491 | |
| 492 | // Tiles proxies. |
| 493 | void set_source_level_tile_proxy(int p_source_from, int p_source_to); |
| 494 | int get_source_level_tile_proxy(int p_source_from); |
| 495 | bool has_source_level_tile_proxy(int p_source_from); |
| 496 | void remove_source_level_tile_proxy(int p_source_from); |
| 497 | |
| 498 | void set_coords_level_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_source_to, Vector2i p_coords_to); |
| 499 | Array get_coords_level_tile_proxy(int p_source_from, Vector2i p_coords_from); |
| 500 | bool has_coords_level_tile_proxy(int p_source_from, Vector2i p_coords_from); |
| 501 | void remove_coords_level_tile_proxy(int p_source_from, Vector2i p_coords_from); |
| 502 | |
| 503 | void set_alternative_level_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_alternative_from, int p_source_to, Vector2i p_coords_to, int p_alternative_to); |
| 504 | Array get_alternative_level_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_alternative_from); |
| 505 | bool has_alternative_level_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_alternative_from); |
| 506 | void remove_alternative_level_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_alternative_from); |
| 507 | |
| 508 | Array get_source_level_tile_proxies() const; |
| 509 | Array get_coords_level_tile_proxies() const; |
| 510 | Array get_alternative_level_tile_proxies() const; |
| 511 | |
| 512 | Array map_tile_proxy(int p_source_from, Vector2i p_coords_from, int p_alternative_from) const; |
| 513 | |
| 514 | void cleanup_invalid_tile_proxies(); |
| 515 | void clear_tile_proxies(); |
| 516 | |
| 517 | // Patterns. |
| 518 | int add_pattern(Ref<TileMapPattern> p_pattern, int p_index = -1); |
| 519 | Ref<TileMapPattern> get_pattern(int p_index); |
| 520 | void remove_pattern(int p_index); |
| 521 | int get_patterns_count(); |
| 522 | |
| 523 | // Terrains. |
| 524 | RBSet<TerrainsPattern> get_terrains_pattern_set(int p_terrain_set); |
| 525 | RBSet<TileMapCell> get_tiles_for_terrains_pattern(int p_terrain_set, TerrainsPattern p_terrain_tile_pattern); |
| 526 | TileMapCell get_random_tile_from_terrains_pattern(int p_terrain_set, TerrainsPattern p_terrain_tile_pattern); |
| 527 | |
| 528 | // Helpers |
| 529 | Vector<Vector2> get_tile_shape_polygon(); |
| 530 | void draw_tile_shape(CanvasItem *p_canvas_item, Transform2D p_transform, Color p_color, bool p_filled = false, Ref<Texture2D> p_texture = Ref<Texture2D>()); |
| 531 | |
| 532 | Vector<Point2> get_terrain_polygon(int p_terrain_set); |
| 533 | Vector<Point2> get_terrain_peering_bit_polygon(int p_terrain_set, TileSet::CellNeighbor p_bit); |
| 534 | void draw_terrains(CanvasItem *p_canvas_item, Transform2D p_transform, const TileData *p_tile_data); |
| 535 | Vector<Vector<Ref<Texture2D>>> generate_terrains_icons(Size2i p_size); |
| 536 | |
| 537 | // Resource management |
| 538 | virtual void reset_state() override; |
| 539 | |
| 540 | TileSet(); |
| 541 | ~TileSet(); |
| 542 | }; |
| 543 | |
| 544 | class TileSetSource : public Resource { |
| 545 | GDCLASS(TileSetSource, Resource); |
| 546 | |
| 547 | protected: |
| 548 | const TileSet *tile_set = nullptr; |
| 549 | |
| 550 | static void _bind_methods(); |
| 551 | |
| 552 | public: |
| 553 | static const Vector2i INVALID_ATLAS_COORDS; // Vector2i(-1, -1); |
| 554 | static const int INVALID_TILE_ALTERNATIVE; // -1; |
| 555 | |
| 556 | // Not exposed. |
| 557 | virtual void set_tile_set(const TileSet *p_tile_set); |
| 558 | TileSet *get_tile_set() const; |
| 559 | virtual void notify_tile_data_properties_should_change(){}; |
| 560 | virtual void add_occlusion_layer(int p_index){}; |
| 561 | virtual void move_occlusion_layer(int p_from_index, int p_to_pos){}; |
| 562 | virtual void remove_occlusion_layer(int p_index){}; |
| 563 | virtual void add_physics_layer(int p_index){}; |
| 564 | virtual void move_physics_layer(int p_from_index, int p_to_pos){}; |
| 565 | virtual void remove_physics_layer(int p_index){}; |
| 566 | virtual void add_terrain_set(int p_index){}; |
| 567 | virtual void move_terrain_set(int p_from_index, int p_to_pos){}; |
| 568 | virtual void remove_terrain_set(int p_index){}; |
| 569 | virtual void add_terrain(int p_terrain_set, int p_index){}; |
| 570 | virtual void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos){}; |
| 571 | virtual void remove_terrain(int p_terrain_set, int p_index){}; |
| 572 | virtual void add_navigation_layer(int p_index){}; |
| 573 | virtual void move_navigation_layer(int p_from_index, int p_to_pos){}; |
| 574 | virtual void remove_navigation_layer(int p_index){}; |
| 575 | virtual void add_custom_data_layer(int p_index){}; |
| 576 | virtual void move_custom_data_layer(int p_from_index, int p_to_pos){}; |
| 577 | virtual void remove_custom_data_layer(int p_index){}; |
| 578 | virtual void reset_state() override; |
| 579 | |
| 580 | // Tiles. |
| 581 | virtual int get_tiles_count() const = 0; |
| 582 | virtual Vector2i get_tile_id(int tile_index) const = 0; |
| 583 | virtual bool has_tile(Vector2i p_atlas_coords) const = 0; |
| 584 | |
| 585 | // Alternative tiles. |
| 586 | virtual int get_alternative_tiles_count(const Vector2i p_atlas_coords) const = 0; |
| 587 | virtual int get_alternative_tile_id(const Vector2i p_atlas_coords, int p_index) const = 0; |
| 588 | virtual bool has_alternative_tile(const Vector2i p_atlas_coords, int p_alternative_tile) const = 0; |
| 589 | }; |
| 590 | |
| 591 | class TileSetAtlasSource : public TileSetSource { |
| 592 | GDCLASS(TileSetAtlasSource, TileSetSource); |
| 593 | |
| 594 | public: |
| 595 | enum TileAnimationMode { |
| 596 | TILE_ANIMATION_MODE_DEFAULT, |
| 597 | TILE_ANIMATION_MODE_RANDOM_START_TIMES, |
| 598 | TILE_ANIMATION_MODE_MAX, |
| 599 | }; |
| 600 | |
| 601 | enum TransformBits { |
| 602 | TRANSFORM_FLIP_H = 1 << 12, |
| 603 | TRANSFORM_FLIP_V = 1 << 13, |
| 604 | TRANSFORM_TRANSPOSE = 1 << 14, |
| 605 | }; |
| 606 | |
| 607 | private: |
| 608 | struct TileAlternativesData { |
| 609 | Vector2i size_in_atlas = Vector2i(1, 1); |
| 610 | Vector2i texture_offset; |
| 611 | |
| 612 | // Animation |
| 613 | int animation_columns = 0; |
| 614 | Vector2i animation_separation; |
| 615 | real_t animation_speed = 1.0; |
| 616 | TileSetAtlasSource::TileAnimationMode animation_mode = TILE_ANIMATION_MODE_DEFAULT; |
| 617 | LocalVector<real_t> animation_frames_durations; |
| 618 | |
| 619 | // Alternatives |
| 620 | HashMap<int, TileData *> alternatives; |
| 621 | Vector<int> alternatives_ids; |
| 622 | int next_alternative_id = 1; |
| 623 | }; |
| 624 | |
| 625 | Ref<Texture2D> texture; |
| 626 | Vector2i margins; |
| 627 | Vector2i separation; |
| 628 | Size2i texture_region_size = Size2i(16, 16); |
| 629 | |
| 630 | HashMap<Vector2i, TileAlternativesData> tiles; |
| 631 | Vector<Vector2i> tiles_ids; |
| 632 | HashMap<Vector2i, Vector2i> _coords_mapping_cache; // Maps any coordinate to the including tile |
| 633 | |
| 634 | TileData *_get_atlas_tile_data(Vector2i p_atlas_coords, int p_alternative_tile); |
| 635 | const TileData *_get_atlas_tile_data(Vector2i p_atlas_coords, int p_alternative_tile) const; |
| 636 | |
| 637 | void _compute_next_alternative_id(const Vector2i p_atlas_coords); |
| 638 | |
| 639 | void _clear_coords_mapping_cache(Vector2i p_atlas_coords); |
| 640 | void _create_coords_mapping_cache(Vector2i p_atlas_coords); |
| 641 | |
| 642 | bool use_texture_padding = true; |
| 643 | Ref<ImageTexture> padded_texture; |
| 644 | bool padded_texture_needs_update = false; |
| 645 | void _queue_update_padded_texture(); |
| 646 | void _update_padded_texture(); |
| 647 | |
| 648 | protected: |
| 649 | bool _set(const StringName &p_name, const Variant &p_value); |
| 650 | bool _get(const StringName &p_name, Variant &r_ret) const; |
| 651 | void _get_property_list(List<PropertyInfo> *p_list) const; |
| 652 | |
| 653 | static void _bind_methods(); |
| 654 | |
| 655 | public: |
| 656 | // Not exposed. |
| 657 | virtual void set_tile_set(const TileSet *p_tile_set) override; |
| 658 | const TileSet *get_tile_set() const; |
| 659 | virtual void notify_tile_data_properties_should_change() override; |
| 660 | virtual void add_occlusion_layer(int p_index) override; |
| 661 | virtual void move_occlusion_layer(int p_from_index, int p_to_pos) override; |
| 662 | virtual void remove_occlusion_layer(int p_index) override; |
| 663 | virtual void add_physics_layer(int p_index) override; |
| 664 | virtual void move_physics_layer(int p_from_index, int p_to_pos) override; |
| 665 | virtual void remove_physics_layer(int p_index) override; |
| 666 | virtual void add_terrain_set(int p_index) override; |
| 667 | virtual void move_terrain_set(int p_from_index, int p_to_pos) override; |
| 668 | virtual void remove_terrain_set(int p_index) override; |
| 669 | virtual void add_terrain(int p_terrain_set, int p_index) override; |
| 670 | virtual void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos) override; |
| 671 | virtual void remove_terrain(int p_terrain_set, int p_index) override; |
| 672 | virtual void add_navigation_layer(int p_index) override; |
| 673 | virtual void move_navigation_layer(int p_from_index, int p_to_pos) override; |
| 674 | virtual void remove_navigation_layer(int p_index) override; |
| 675 | virtual void add_custom_data_layer(int p_index) override; |
| 676 | virtual void move_custom_data_layer(int p_from_index, int p_to_pos) override; |
| 677 | virtual void remove_custom_data_layer(int p_index) override; |
| 678 | virtual void reset_state() override; |
| 679 | |
| 680 | // Base properties. |
| 681 | void set_texture(Ref<Texture2D> p_texture); |
| 682 | Ref<Texture2D> get_texture() const; |
| 683 | void set_margins(Vector2i p_margins); |
| 684 | Vector2i get_margins() const; |
| 685 | void set_separation(Vector2i p_separation); |
| 686 | Vector2i get_separation() const; |
| 687 | void set_texture_region_size(Vector2i p_tile_size); |
| 688 | Vector2i get_texture_region_size() const; |
| 689 | |
| 690 | // Padding. |
| 691 | void set_use_texture_padding(bool p_use_padding); |
| 692 | bool get_use_texture_padding() const; |
| 693 | |
| 694 | // Base tiles. |
| 695 | void create_tile(const Vector2i p_atlas_coords, const Vector2i p_size = Vector2i(1, 1)); |
| 696 | void remove_tile(Vector2i p_atlas_coords); |
| 697 | virtual bool has_tile(Vector2i p_atlas_coords) const override; |
| 698 | void move_tile_in_atlas(Vector2i p_atlas_coords, Vector2i p_new_atlas_coords = INVALID_ATLAS_COORDS, Vector2i p_new_size = Vector2i(-1, -1)); |
| 699 | Vector2i get_tile_size_in_atlas(Vector2i p_atlas_coords) const; |
| 700 | |
| 701 | virtual int get_tiles_count() const override; |
| 702 | virtual Vector2i get_tile_id(int p_index) const override; |
| 703 | |
| 704 | bool has_room_for_tile(Vector2i p_atlas_coords, Vector2i p_size, int p_animation_columns, Vector2i p_animation_separation, int p_frames_count, Vector2i p_ignored_tile = INVALID_ATLAS_COORDS) const; |
| 705 | PackedVector2Array get_tiles_to_be_removed_on_change(Ref<Texture2D> p_texture, Vector2i p_margins, Vector2i p_separation, Vector2i p_texture_region_size); |
| 706 | Vector2i get_tile_at_coords(Vector2i p_atlas_coords) const; |
| 707 | |
| 708 | bool has_tiles_outside_texture() const; |
| 709 | Vector<Vector2i> get_tiles_outside_texture() const; |
| 710 | void clear_tiles_outside_texture(); |
| 711 | |
| 712 | // Animation. |
| 713 | void set_tile_animation_columns(const Vector2i p_atlas_coords, int p_frame_columns); |
| 714 | int get_tile_animation_columns(const Vector2i p_atlas_coords) const; |
| 715 | void set_tile_animation_separation(const Vector2i p_atlas_coords, const Vector2i p_separation); |
| 716 | Vector2i get_tile_animation_separation(const Vector2i p_atlas_coords) const; |
| 717 | void set_tile_animation_speed(const Vector2i p_atlas_coords, real_t p_speed); |
| 718 | real_t get_tile_animation_speed(const Vector2i p_atlas_coords) const; |
| 719 | void set_tile_animation_mode(const Vector2i p_atlas_coords, const TileSetAtlasSource::TileAnimationMode p_mode); |
| 720 | TileSetAtlasSource::TileAnimationMode get_tile_animation_mode(const Vector2i p_atlas_coords) const; |
| 721 | void set_tile_animation_frames_count(const Vector2i p_atlas_coords, int p_frames_count); |
| 722 | int get_tile_animation_frames_count(const Vector2i p_atlas_coords) const; |
| 723 | void set_tile_animation_frame_duration(const Vector2i p_atlas_coords, int p_frame_index, real_t p_duration); |
| 724 | real_t get_tile_animation_frame_duration(const Vector2i p_atlas_coords, int p_frame_index) const; |
| 725 | real_t get_tile_animation_total_duration(const Vector2i p_atlas_coords) const; |
| 726 | |
| 727 | // Alternative tiles. |
| 728 | int create_alternative_tile(const Vector2i p_atlas_coords, int p_alternative_id_override = -1); |
| 729 | void remove_alternative_tile(const Vector2i p_atlas_coords, int p_alternative_tile); |
| 730 | void set_alternative_tile_id(const Vector2i p_atlas_coords, int p_alternative_tile, int p_new_id); |
| 731 | virtual bool has_alternative_tile(const Vector2i p_atlas_coords, int p_alternative_tile) const override; |
| 732 | int get_next_alternative_tile_id(const Vector2i p_atlas_coords) const; |
| 733 | |
| 734 | virtual int get_alternative_tiles_count(const Vector2i p_atlas_coords) const override; |
| 735 | virtual int get_alternative_tile_id(const Vector2i p_atlas_coords, int p_index) const override; |
| 736 | |
| 737 | // Get data associated to a tile. |
| 738 | TileData *get_tile_data(const Vector2i p_atlas_coords, int p_alternative_tile) const; |
| 739 | |
| 740 | // Helpers. |
| 741 | Vector2i get_atlas_grid_size() const; |
| 742 | Rect2i get_tile_texture_region(Vector2i p_atlas_coords, int p_frame = 0) const; |
| 743 | bool is_position_in_tile_texture_region(const Vector2i p_atlas_coords, int p_alternative_tile, Vector2 p_position) const; |
| 744 | |
| 745 | static int alternative_no_transform(int p_alternative_id); |
| 746 | |
| 747 | // Getters for texture and tile region (padded or not) |
| 748 | Ref<Texture2D> get_runtime_texture() const; |
| 749 | Rect2i get_runtime_tile_texture_region(Vector2i p_atlas_coords, int p_frame = 0) const; |
| 750 | |
| 751 | ~TileSetAtlasSource(); |
| 752 | }; |
| 753 | |
| 754 | class TileSetScenesCollectionSource : public TileSetSource { |
| 755 | GDCLASS(TileSetScenesCollectionSource, TileSetSource); |
| 756 | |
| 757 | private: |
| 758 | struct SceneData { |
| 759 | Ref<PackedScene> scene; |
| 760 | bool display_placeholder = false; |
| 761 | }; |
| 762 | Vector<int> scenes_ids; |
| 763 | HashMap<int, SceneData> scenes; |
| 764 | int next_scene_id = 1; |
| 765 | |
| 766 | void _compute_next_alternative_id(); |
| 767 | |
| 768 | protected: |
| 769 | bool _set(const StringName &p_name, const Variant &p_value); |
| 770 | bool _get(const StringName &p_name, Variant &r_ret) const; |
| 771 | void _get_property_list(List<PropertyInfo> *p_list) const; |
| 772 | |
| 773 | static void _bind_methods(); |
| 774 | |
| 775 | public: |
| 776 | // Tiles. |
| 777 | int get_tiles_count() const override; |
| 778 | Vector2i get_tile_id(int p_tile_index) const override; |
| 779 | bool has_tile(Vector2i p_atlas_coords) const override; |
| 780 | |
| 781 | // Alternative tiles. |
| 782 | int get_alternative_tiles_count(const Vector2i p_atlas_coords) const override; |
| 783 | int get_alternative_tile_id(const Vector2i p_atlas_coords, int p_index) const override; |
| 784 | bool has_alternative_tile(const Vector2i p_atlas_coords, int p_alternative_tile) const override; |
| 785 | |
| 786 | // Scenes accessors. Lot are similar to "Alternative tiles". |
| 787 | int get_scene_tiles_count() { return get_alternative_tiles_count(Vector2i()); } |
| 788 | int get_scene_tile_id(int p_index) { return get_alternative_tile_id(Vector2i(), p_index); }; |
| 789 | bool has_scene_tile_id(int p_id) { return has_alternative_tile(Vector2i(), p_id); }; |
| 790 | int create_scene_tile(Ref<PackedScene> p_packed_scene = Ref<PackedScene>(), int p_id_override = -1); |
| 791 | void set_scene_tile_id(int p_id, int p_new_id); |
| 792 | void set_scene_tile_scene(int p_id, Ref<PackedScene> p_packed_scene); |
| 793 | Ref<PackedScene> get_scene_tile_scene(int p_id) const; |
| 794 | void set_scene_tile_display_placeholder(int p_id, bool p_packed_scene); |
| 795 | bool get_scene_tile_display_placeholder(int p_id) const; |
| 796 | void remove_scene_tile(int p_id); |
| 797 | int get_next_scene_tile_id() const; |
| 798 | }; |
| 799 | |
| 800 | class TileData : public Object { |
| 801 | GDCLASS(TileData, Object); |
| 802 | |
| 803 | private: |
| 804 | const TileSet *tile_set = nullptr; |
| 805 | bool allow_transform = true; |
| 806 | |
| 807 | // Rendering |
| 808 | bool flip_h = false; |
| 809 | bool flip_v = false; |
| 810 | bool transpose = false; |
| 811 | Vector2i texture_origin; |
| 812 | Ref<Material> material = Ref<Material>(); |
| 813 | Color modulate = Color(1.0, 1.0, 1.0, 1.0); |
| 814 | int z_index = 0; |
| 815 | int y_sort_origin = 0; |
| 816 | Vector<Ref<OccluderPolygon2D>> occluders; |
| 817 | |
| 818 | // Physics |
| 819 | struct PhysicsLayerTileData { |
| 820 | struct PolygonShapeTileData { |
| 821 | LocalVector<Vector2> polygon; |
| 822 | LocalVector<Ref<ConvexPolygonShape2D>> shapes; |
| 823 | bool one_way = false; |
| 824 | float one_way_margin = 1.0; |
| 825 | }; |
| 826 | |
| 827 | Vector2 linear_velocity; |
| 828 | double angular_velocity = 0.0; |
| 829 | Vector<PolygonShapeTileData> polygons; |
| 830 | }; |
| 831 | Vector<PhysicsLayerTileData> physics; |
| 832 | // TODO add support for areas. |
| 833 | |
| 834 | // Terrain |
| 835 | int terrain_set = -1; |
| 836 | int terrain = -1; |
| 837 | int terrain_peering_bits[16] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; |
| 838 | |
| 839 | // Navigation |
| 840 | Vector<Ref<NavigationPolygon>> navigation; |
| 841 | |
| 842 | // Misc |
| 843 | double probability = 1.0; |
| 844 | |
| 845 | // Custom data |
| 846 | Vector<Variant> custom_data; |
| 847 | |
| 848 | protected: |
| 849 | bool _set(const StringName &p_name, const Variant &p_value); |
| 850 | bool _get(const StringName &p_name, Variant &r_ret) const; |
| 851 | void _get_property_list(List<PropertyInfo> *p_list) const; |
| 852 | static void _bind_methods(); |
| 853 | |
| 854 | public: |
| 855 | // Not exposed. |
| 856 | void set_tile_set(const TileSet *p_tile_set); |
| 857 | void notify_tile_data_properties_should_change(); |
| 858 | void add_occlusion_layer(int p_index); |
| 859 | void move_occlusion_layer(int p_from_index, int p_to_pos); |
| 860 | void remove_occlusion_layer(int p_index); |
| 861 | void add_physics_layer(int p_index); |
| 862 | void move_physics_layer(int p_from_index, int p_to_pos); |
| 863 | void remove_physics_layer(int p_index); |
| 864 | void add_terrain_set(int p_index); |
| 865 | void move_terrain_set(int p_from_index, int p_to_pos); |
| 866 | void remove_terrain_set(int p_index); |
| 867 | void add_terrain(int p_terrain_set, int p_index); |
| 868 | void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos); |
| 869 | void remove_terrain(int p_terrain_set, int p_index); |
| 870 | void add_navigation_layer(int p_index); |
| 871 | void move_navigation_layer(int p_from_index, int p_to_pos); |
| 872 | void remove_navigation_layer(int p_index); |
| 873 | void add_custom_data_layer(int p_index); |
| 874 | void move_custom_data_layer(int p_from_index, int p_to_pos); |
| 875 | void remove_custom_data_layer(int p_index); |
| 876 | void set_allow_transform(bool p_allow_transform); |
| 877 | bool is_allowing_transform() const; |
| 878 | |
| 879 | // To duplicate a TileData object, needed for runtiume update. |
| 880 | TileData *duplicate(); |
| 881 | |
| 882 | // Rendering |
| 883 | void set_flip_h(bool p_flip_h); |
| 884 | bool get_flip_h() const; |
| 885 | void set_flip_v(bool p_flip_v); |
| 886 | bool get_flip_v() const; |
| 887 | void set_transpose(bool p_transpose); |
| 888 | bool get_transpose() const; |
| 889 | |
| 890 | void set_texture_origin(Vector2i p_texture_origin); |
| 891 | Vector2i get_texture_origin() const; |
| 892 | void set_material(Ref<Material> p_material); |
| 893 | Ref<Material> get_material() const; |
| 894 | void set_modulate(Color p_modulate); |
| 895 | Color get_modulate() const; |
| 896 | void set_z_index(int p_z_index); |
| 897 | int get_z_index() const; |
| 898 | void set_y_sort_origin(int p_y_sort_origin); |
| 899 | int get_y_sort_origin() const; |
| 900 | |
| 901 | void set_occluder(int p_layer_id, Ref<OccluderPolygon2D> p_occluder_polygon); |
| 902 | Ref<OccluderPolygon2D> get_occluder(int p_layer_id) const; |
| 903 | |
| 904 | // Physics |
| 905 | void set_constant_linear_velocity(int p_layer_id, const Vector2 &p_velocity); |
| 906 | Vector2 get_constant_linear_velocity(int p_layer_id) const; |
| 907 | void set_constant_angular_velocity(int p_layer_id, real_t p_velocity); |
| 908 | real_t get_constant_angular_velocity(int p_layer_id) const; |
| 909 | void set_collision_polygons_count(int p_layer_id, int p_shapes_count); |
| 910 | int get_collision_polygons_count(int p_layer_id) const; |
| 911 | void add_collision_polygon(int p_layer_id); |
| 912 | void remove_collision_polygon(int p_layer_id, int p_polygon_index); |
| 913 | void set_collision_polygon_points(int p_layer_id, int p_polygon_index, Vector<Vector2> p_polygon); |
| 914 | Vector<Vector2> get_collision_polygon_points(int p_layer_id, int p_polygon_index) const; |
| 915 | void set_collision_polygon_one_way(int p_layer_id, int p_polygon_index, bool p_one_way); |
| 916 | bool is_collision_polygon_one_way(int p_layer_id, int p_polygon_index) const; |
| 917 | void set_collision_polygon_one_way_margin(int p_layer_id, int p_polygon_index, float p_one_way_margin); |
| 918 | float get_collision_polygon_one_way_margin(int p_layer_id, int p_polygon_index) const; |
| 919 | int get_collision_polygon_shapes_count(int p_layer_id, int p_polygon_index) const; |
| 920 | Ref<ConvexPolygonShape2D> get_collision_polygon_shape(int p_layer_id, int p_polygon_index, int shape_index) const; |
| 921 | |
| 922 | // Terrain |
| 923 | void set_terrain_set(int p_terrain_id); |
| 924 | int get_terrain_set() const; |
| 925 | void set_terrain(int p_terrain_id); |
| 926 | int get_terrain() const; |
| 927 | void set_terrain_peering_bit(TileSet::CellNeighbor p_peering_bit, int p_terrain_id); |
| 928 | int get_terrain_peering_bit(TileSet::CellNeighbor p_peering_bit) const; |
| 929 | bool is_valid_terrain_peering_bit(TileSet::CellNeighbor p_peering_bit) const; |
| 930 | |
| 931 | TileSet::TerrainsPattern get_terrains_pattern() const; // Not exposed. |
| 932 | |
| 933 | // Navigation |
| 934 | void set_navigation_polygon(int p_layer_id, Ref<NavigationPolygon> p_navigation_polygon); |
| 935 | Ref<NavigationPolygon> get_navigation_polygon(int p_layer_id) const; |
| 936 | |
| 937 | // Misc |
| 938 | void set_probability(float p_probability); |
| 939 | float get_probability() const; |
| 940 | |
| 941 | // Custom data. |
| 942 | void set_custom_data(String p_layer_name, Variant p_value); |
| 943 | Variant get_custom_data(String p_layer_name) const; |
| 944 | void set_custom_data_by_layer_id(int p_layer_id, Variant p_value); |
| 945 | Variant get_custom_data_by_layer_id(int p_layer_id) const; |
| 946 | }; |
| 947 | |
| 948 | VARIANT_ENUM_CAST(TileSet::CellNeighbor); |
| 949 | VARIANT_ENUM_CAST(TileSet::TerrainMode); |
| 950 | VARIANT_ENUM_CAST(TileSet::TileShape); |
| 951 | VARIANT_ENUM_CAST(TileSet::TileLayout); |
| 952 | VARIANT_ENUM_CAST(TileSet::TileOffsetAxis); |
| 953 | |
| 954 | VARIANT_ENUM_CAST(TileSetAtlasSource::TileAnimationMode); |
| 955 | |
| 956 | #endif // TILE_SET_H |
| 957 | |