Fixing tilemap rotation for non top-left tiles.

This commit is contained in:
Vito 2017-11-13 07:42:49 +00:00
parent afec30837c
commit 5515d28107
3 changed files with 19 additions and 8 deletions

View file

@ -459,9 +459,9 @@ void TileMap::_update_dirty_quadrants() {
Transform2D xform;
xform.set_origin(offset.floor());
_fix_cell_transform(xform, c, center_ofs, s);
Vector2 shape_ofs = tile_set->tile_get_shape_offset(c.id, i);
xform *= shapes[i].shape_transform;
_fix_cell_transform(xform, c, shape_ofs + center_ofs, s);
if (debug_canvas_item.is_valid()) {
vs->canvas_item_add_set_transform(debug_canvas_item, xform);

View file

@ -57,11 +57,9 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
tile_set_region(id, p_value);
else if (what == "shape")
tile_set_shape(id, 0, p_value);
else if (what == "shape_offset") {
Transform2D xform = tile_get_shape_transform(id, 0);
xform.set_origin(p_value);
tile_set_shape_transform(id, 0, xform);
} else if (what == "shape_transform")
else if (what == "shape_offset")
tile_set_shape_offset(id, 0, p_value);
else if (what == "shape_transform")
tile_set_shape_transform(id, 0, p_value);
else if (what == "shape_one_way")
tile_set_shape_one_way(id, 0, p_value);
@ -110,7 +108,7 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
else if (what == "shape")
r_ret = tile_get_shape(id, 0);
else if (what == "shape_offset")
r_ret = tile_get_shape_transform(id, 0).get_origin();
r_ret = tile_get_shape_offset(id, 0);
else if (what == "shape_transform")
r_ret = tile_get_shape_transform(id, 0);
else if (what == "shape_one_way")
@ -313,6 +311,16 @@ Transform2D TileSet::tile_get_shape_transform(int p_id, int p_shape_id) const {
return Transform2D();
}
void TileSet::tile_set_shape_offset(int p_id, int p_shape_id, const Vector2 &p_offset) {
Transform2D transform = tile_get_shape_transform(p_id, p_shape_id);
transform.set_origin(p_offset);
tile_set_shape_transform(p_id, p_shape_id, transform);
}
Vector2 TileSet::tile_get_shape_offset(int p_id, int p_shape_id) const {
return tile_get_shape_transform(p_id, p_shape_id).get_origin();
}
void TileSet::tile_set_shape_one_way(int p_id, int p_shape_id, const bool p_one_way) {
ERR_FAIL_COND(!tile_map.has(p_id));

View file

@ -108,6 +108,9 @@ public:
void tile_set_shape_transform(int p_id, int p_shape_id, const Transform2D &p_offset);
Transform2D tile_get_shape_transform(int p_id, int p_shape_id) const;
void tile_set_shape_offset(int p_id, int p_shape_id, const Vector2 &p_offset);
Vector2 tile_get_shape_offset(int p_id, int p_shape_id) const;
void tile_set_shape_one_way(int p_id, int p_shape_id, bool p_one_way);
bool tile_get_shape_one_way(int p_id, int p_shape_id) const;