Skip to content

Commit 9e6b680

Browse files
authored
Merge pull request #74814 from kleonc/tilemap-fix-rendering-odd-sized-tiles
`TileMap` Fix rendering odd-sized tiles
2 parents 9882af4 + c49a7fe commit 9e6b680

File tree

3 files changed

+14
-14
lines changed

3 files changed

+14
-14
lines changed

editor/plugins/tiles/tile_atlas_view.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ void TileAtlasView::_draw_base_tiles() {
247247
for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(atlas_coords); frame++) {
248248
// Update the y to max value.
249249
Rect2i base_frame_rect = tile_set_atlas_source->get_tile_texture_region(atlas_coords, frame);
250-
Vector2i offset_pos = base_frame_rect.get_center() + tile_set_atlas_source->get_tile_data(atlas_coords, 0)->get_texture_origin();
250+
Vector2 offset_pos = Rect2(base_frame_rect).get_center() + Vector2(tile_set_atlas_source->get_tile_data(atlas_coords, 0)->get_texture_origin());
251251

252252
// Draw the tile.
253253
TileMap::draw_tile(base_tiles_draw->get_canvas_item(), offset_pos, tile_set, source_id, atlas_coords, 0, frame);
@@ -331,7 +331,7 @@ void TileAtlasView::_draw_base_tiles_shape_grid() {
331331
}
332332
Rect2i texture_region = tile_set_atlas_source->get_tile_texture_region(tile_id, frame);
333333
Transform2D tile_xform;
334-
tile_xform.set_origin(texture_region.get_center() + in_tile_base_offset);
334+
tile_xform.set_origin(Rect2(texture_region).get_center() + in_tile_base_offset);
335335
tile_xform.set_scale(tile_shape_size);
336336
tile_set->draw_tile_shape(base_tiles_shape_grid, tile_xform, color);
337337
}

scene/2d/tile_map.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -890,7 +890,7 @@ void TileMap::_update_dirty_quadrants() {
890890
q->self()->local_to_map.clear();
891891
for (const Vector2i &E : q->self()->cells) {
892892
Vector2i pk = E;
893-
Vector2i pk_local_coords = map_to_local(pk);
893+
Vector2 pk_local_coords = map_to_local(pk);
894894
q->self()->map_to_local[pk] = pk_local_coords;
895895
q->self()->local_to_map[pk_local_coords] = pk;
896896
}
@@ -1092,7 +1092,7 @@ void TileMap::_rendering_notification(int p_what) {
10921092
TileMapQuadrant &q = E_quadrant.value;
10931093

10941094
// Update occluders transform.
1095-
for (const KeyValue<Vector2i, Vector2i> &E_cell : q.local_to_map) {
1095+
for (const KeyValue<Vector2, Vector2i> &E_cell : q.local_to_map) {
10961096
Transform2D xform;
10971097
xform.set_origin(E_cell.key);
10981098
for (const KeyValue<Vector2i, RID> &kv : q.occluders) {
@@ -1250,7 +1250,7 @@ void TileMap::_rendering_update_dirty_quadrants(SelfList<TileMapQuadrant>::List
12501250
RID prev_ci;
12511251

12521252
// Iterate over the cells of the quadrant.
1253-
for (const KeyValue<Vector2i, Vector2i> &E_cell : q.local_to_map) {
1253+
for (const KeyValue<Vector2, Vector2i> &E_cell : q.local_to_map) {
12541254
TileMapCell c = get_cell(q.layer, E_cell.value, true);
12551255

12561256
TileSetSource *source;
@@ -1348,13 +1348,13 @@ void TileMap::_rendering_update_dirty_quadrants(SelfList<TileMapQuadrant>::List
13481348

13491349
for (TileMapLayer &layer : layers) {
13501350
// Sort the quadrants coords per local coordinates.
1351-
RBMap<Vector2i, Vector2i, TileMapQuadrant::CoordsWorldComparator> local_to_map;
1351+
RBMap<Vector2, Vector2i, TileMapQuadrant::CoordsWorldComparator> local_to_map;
13521352
for (const KeyValue<Vector2i, TileMapQuadrant> &E : layer.quadrant_map) {
13531353
local_to_map[map_to_local(E.key)] = E.key;
13541354
}
13551355

13561356
// Sort the quadrants.
1357-
for (const KeyValue<Vector2i, Vector2i> &E : local_to_map) {
1357+
for (const KeyValue<Vector2, Vector2i> &E : local_to_map) {
13581358
TileMapQuadrant &q = layer.quadrant_map[E.value];
13591359
for (const RID &ci : q.canvas_items) {
13601360
RS::get_singleton()->canvas_item_set_draw_index(ci, index++);
@@ -1436,7 +1436,7 @@ void TileMap::_rendering_draw_quadrant_debug(TileMapQuadrant *p_quadrant) {
14361436
}
14371437
}
14381438

1439-
void TileMap::draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame, Color p_modulation, const TileData *p_tile_data_override) {
1439+
void TileMap::draw_tile(RID p_canvas_item, const Vector2 &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame, Color p_modulation, const TileData *p_tile_data_override) {
14401440
ERR_FAIL_COND(!p_tile_set.is_valid());
14411441
ERR_FAIL_COND(!p_tile_set->has_source(p_atlas_source_id));
14421442
ERR_FAIL_COND(!p_tile_set->get_source(p_atlas_source_id)->has_tile(p_atlas_coords));
@@ -1468,7 +1468,7 @@ void TileMap::draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref
14681468
Color modulate = tile_data->get_modulate() * p_modulation;
14691469

14701470
// Compute the offset.
1471-
Vector2i tile_offset = tile_data->get_texture_origin();
1471+
Vector2 tile_offset = tile_data->get_texture_origin();
14721472

14731473
// Get destination rect.
14741474
Rect2 dest_rect;
@@ -3059,7 +3059,7 @@ void TileMap::_build_runtime_update_tile_data(SelfList<TileMapQuadrant>::List &r
30593059
while (q_list_element) {
30603060
TileMapQuadrant &q = *q_list_element->self();
30613061
// Iterate over the cells of the quadrant.
3062-
for (const KeyValue<Vector2i, Vector2i> &E_cell : q.local_to_map) {
3062+
for (const KeyValue<Vector2, Vector2i> &E_cell : q.local_to_map) {
30633063
TileMapCell c = get_cell(q.layer, E_cell.value, true);
30643064

30653065
TileSetSource *source;

scene/2d/tile_map.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class TileSetAtlasSource;
3939

4040
struct TileMapQuadrant {
4141
struct CoordsWorldComparator {
42-
_ALWAYS_INLINE_ bool operator()(const Vector2i &p_a, const Vector2i &p_b) const {
42+
_ALWAYS_INLINE_ bool operator()(const Vector2 &p_a, const Vector2 &p_b) const {
4343
// We sort the cells by their local coords, as it is needed by rendering.
4444
if (p_a.y == p_b.y) {
4545
return p_a.x > p_b.x;
@@ -60,8 +60,8 @@ struct TileMapQuadrant {
6060
RBSet<Vector2i> cells;
6161
// We need those two maps to sort by local position for rendering
6262
// This is kind of workaround, it would be better to sort the cells directly in the "cells" set instead.
63-
RBMap<Vector2i, Vector2i> map_to_local;
64-
RBMap<Vector2i, Vector2i, CoordsWorldComparator> local_to_map;
63+
RBMap<Vector2i, Vector2> map_to_local;
64+
RBMap<Vector2, Vector2i, CoordsWorldComparator> local_to_map;
6565

6666
// Debug.
6767
RID debug_canvas_item;
@@ -311,7 +311,7 @@ class TileMap : public Node2D {
311311
void set_quadrant_size(int p_size);
312312
int get_quadrant_size() const;
313313

314-
static void draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame = -1, Color p_modulation = Color(1.0, 1.0, 1.0, 1.0), const TileData *p_tile_data_override = nullptr);
314+
static void draw_tile(RID p_canvas_item, const Vector2 &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame = -1, Color p_modulation = Color(1.0, 1.0, 1.0, 1.0), const TileData *p_tile_data_override = nullptr);
315315

316316
// Layers management.
317317
int get_layers_count() const;

0 commit comments

Comments
 (0)