Browse Source

TileMap: Add method to fetch the layer for a given body

Proggle 2 years ago
parent
commit
093cb90077
3 changed files with 19 additions and 0 deletions
  1. 7 0
      doc/classes/TileMap.xml
  2. 8 0
      scene/2d/tile_map.cpp
  3. 4 0
      scene/2d/tile_map.h

+ 7 - 0
doc/classes/TileMap.xml

@@ -134,6 +134,13 @@
 				Returns the coordinates of the tile for given physics body RID. Such RID can be retrieved from [method KinematicCollision2D.get_collider_rid], when colliding with a tile.
 				Returns the coordinates of the tile for given physics body RID. Such RID can be retrieved from [method KinematicCollision2D.get_collider_rid], when colliding with a tile.
 			</description>
 			</description>
 		</method>
 		</method>
+		<method name="get_layer_for_body_rid">
+			<return type="int" />
+			<param index="0" name="body" type="RID" />
+			<description>
+				Returns the tilemap layer of the tile for given physics body RID. Such RID can be retrieved from [method KinematicCollision2D.get_collider_rid], when colliding with a tile.
+			</description>
+		</method>
 		<method name="get_layer_modulate" qualifiers="const">
 		<method name="get_layer_modulate" qualifiers="const">
 			<return type="Color" />
 			<return type="Color" />
 			<param index="0" name="layer" type="int" />
 			<param index="0" name="layer" type="int" />

+ 8 - 0
scene/2d/tile_map.cpp

@@ -1637,6 +1637,7 @@ void TileMap::_physics_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r
 						// Create the body.
 						// Create the body.
 						RID body = ps->body_create();
 						RID body = ps->body_create();
 						bodies_coords[body] = E_cell;
 						bodies_coords[body] = E_cell;
+						bodies_layers[body] = q.layer;
 						ps->body_set_mode(body, collision_animatable ? PhysicsServer2D::BODY_MODE_KINEMATIC : PhysicsServer2D::BODY_MODE_STATIC);
 						ps->body_set_mode(body, collision_animatable ? PhysicsServer2D::BODY_MODE_KINEMATIC : PhysicsServer2D::BODY_MODE_STATIC);
 						ps->body_set_space(body, space);
 						ps->body_set_space(body, space);
 
 
@@ -1692,6 +1693,7 @@ void TileMap::_physics_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	for (RID body : p_quadrant->bodies) {
 	for (RID body : p_quadrant->bodies) {
 		bodies_coords.erase(body);
 		bodies_coords.erase(body);
+		bodies_layers.erase(body);
 		PhysicsServer2D::get_singleton()->free(body);
 		PhysicsServer2D::get_singleton()->free(body);
 	}
 	}
 	p_quadrant->bodies.clear();
 	p_quadrant->bodies.clear();
@@ -2895,6 +2897,11 @@ Vector2i TileMap::get_coords_for_body_rid(RID p_physics_body) {
 	return bodies_coords[p_physics_body];
 	return bodies_coords[p_physics_body];
 }
 }
 
 
+int TileMap::get_layer_for_body_rid(RID p_physics_body) {
+	ERR_FAIL_COND_V_MSG(!bodies_layers.has(p_physics_body), int(), vformat("No tiles for the given body RID %d.", p_physics_body));
+	return bodies_layers[p_physics_body];
+}
+
 void TileMap::fix_invalid_tiles() {
 void TileMap::fix_invalid_tiles() {
 	ERR_FAIL_COND_MSG(tile_set.is_null(), "Cannot fix invalid tiles if Tileset is not open.");
 	ERR_FAIL_COND_MSG(tile_set.is_null(), "Cannot fix invalid tiles if Tileset is not open.");
 
 
@@ -4154,6 +4161,7 @@ void TileMap::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_cell_tile_data", "layer", "coords", "use_proxies"), &TileMap::get_cell_tile_data, DEFVAL(false));
 	ClassDB::bind_method(D_METHOD("get_cell_tile_data", "layer", "coords", "use_proxies"), &TileMap::get_cell_tile_data, DEFVAL(false));
 
 
 	ClassDB::bind_method(D_METHOD("get_coords_for_body_rid", "body"), &TileMap::get_coords_for_body_rid);
 	ClassDB::bind_method(D_METHOD("get_coords_for_body_rid", "body"), &TileMap::get_coords_for_body_rid);
+	ClassDB::bind_method(D_METHOD("get_layer_for_body_rid", "body"), &TileMap::get_layer_for_body_rid);
 
 
 	ClassDB::bind_method(D_METHOD("get_pattern", "layer", "coords_array"), &TileMap::get_pattern);
 	ClassDB::bind_method(D_METHOD("get_pattern", "layer", "coords_array"), &TileMap::get_pattern);
 	ClassDB::bind_method(D_METHOD("map_pattern", "position_in_tilemap", "coords_in_pattern", "pattern"), &TileMap::map_pattern);
 	ClassDB::bind_method(D_METHOD("map_pattern", "position_in_tilemap", "coords_in_pattern", "pattern"), &TileMap::map_pattern);

+ 4 - 0
scene/2d/tile_map.h

@@ -219,6 +219,8 @@ private:
 
 
 	// Mapping for RID to coords.
 	// Mapping for RID to coords.
 	HashMap<RID, Vector2i> bodies_coords;
 	HashMap<RID, Vector2i> bodies_coords;
+	// Mapping for RID to tile layer.
+	HashMap<RID, int> bodies_layers;
 
 
 	// Quadrants and internals management.
 	// Quadrants and internals management.
 	Vector2i _coords_to_quadrant_coords(int p_layer, const Vector2i &p_coords) const;
 	Vector2i _coords_to_quadrant_coords(int p_layer, const Vector2i &p_coords) const;
@@ -396,6 +398,8 @@ public:
 
 
 	// For finding tiles from collision.
 	// For finding tiles from collision.
 	Vector2i get_coords_for_body_rid(RID p_physics_body);
 	Vector2i get_coords_for_body_rid(RID p_physics_body);
+	// For getting their layers as well.
+	int get_layer_for_body_rid(RID p_physics_body);
 
 
 	// Fixing and clearing methods.
 	// Fixing and clearing methods.
 	void fix_invalid_tiles();
 	void fix_invalid_tiles();