tile_set.h 36 KB

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