Merge pull request #27365 from Byteron/tile_map_negative_offset
TileMap, negative Y and X Offset
This commit is contained in:
commit
bfc3ba5af0
4 changed files with 37 additions and 11 deletions
|
@ -323,6 +323,12 @@
|
||||||
<constant name="HALF_OFFSET_DISABLED" value="2" enum="HalfOffset">
|
<constant name="HALF_OFFSET_DISABLED" value="2" enum="HalfOffset">
|
||||||
Half offset disabled.
|
Half offset disabled.
|
||||||
</constant>
|
</constant>
|
||||||
|
<constant name="HALF_OFFSET_NEGATIVE_X" value="3" enum="HalfOffset">
|
||||||
|
Half offset on the X coordinate (negative).
|
||||||
|
</constant>
|
||||||
|
<constant name="HALF_OFFSET_NEGATIVE_Y" value="4" enum="HalfOffset">
|
||||||
|
Half offset on the Y coordinate (negative).
|
||||||
|
</constant>
|
||||||
<constant name="TILE_ORIGIN_TOP_LEFT" value="0" enum="TileOrigin">
|
<constant name="TILE_ORIGIN_TOP_LEFT" value="0" enum="TileOrigin">
|
||||||
Tile origin at its top-left corner.
|
Tile origin at its top-left corner.
|
||||||
</constant>
|
</constant>
|
||||||
|
|
|
@ -1438,9 +1438,9 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
aabb.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
|
aabb.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
|
||||||
Rect2i si = aabb.grow(1.0);
|
Rect2i si = aabb.grow(1.0);
|
||||||
|
|
||||||
if (node->get_half_offset() != TileMap::HALF_OFFSET_X) {
|
if (node->get_half_offset() != TileMap::HALF_OFFSET_X && node->get_half_offset() != TileMap::HALF_OFFSET_NEGATIVE_X) {
|
||||||
|
|
||||||
int max_lines = 2000; //avoid crash if size too smal
|
int max_lines = 2000; //avoid crash if size too small
|
||||||
|
|
||||||
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
|
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
|
||||||
|
|
||||||
|
@ -1454,7 +1454,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
int max_lines = 10000; //avoid crash if size too smal
|
int max_lines = 10000; //avoid crash if size too small
|
||||||
|
|
||||||
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
|
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
|
||||||
|
|
||||||
|
@ -1462,7 +1462,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
|
|
||||||
Vector2 ofs;
|
Vector2 ofs;
|
||||||
if (ABS(j) & 1) {
|
if (ABS(j) & 1) {
|
||||||
ofs = cell_xf[0] * 0.5;
|
ofs = cell_xf[0] * (node->get_half_offset() == TileMap::HALF_OFFSET_X ? 0.5 : -0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 from = xform.xform(node->map_to_world(Vector2(i, j), true) + ofs);
|
Vector2 from = xform.xform(node->map_to_world(Vector2(i, j), true) + ofs);
|
||||||
|
@ -1481,7 +1481,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
|
|
||||||
int max_lines = 10000; //avoid crash if size too smal
|
int max_lines = 10000; //avoid crash if size too smal
|
||||||
|
|
||||||
if (node->get_half_offset() != TileMap::HALF_OFFSET_Y) {
|
if (node->get_half_offset() != TileMap::HALF_OFFSET_Y && node->get_half_offset() != TileMap::HALF_OFFSET_NEGATIVE_Y) {
|
||||||
|
|
||||||
for (int i = (si.position.y) - 1; i <= (si.position.y + si.size.y); i++) {
|
for (int i = (si.position.y) - 1; i <= (si.position.y + si.size.y); i++) {
|
||||||
|
|
||||||
|
@ -1502,7 +1502,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
|
|
||||||
Vector2 ofs;
|
Vector2 ofs;
|
||||||
if (ABS(j) & 1) {
|
if (ABS(j) & 1) {
|
||||||
ofs = cell_xf[1] * 0.5;
|
ofs = cell_xf[1] * (node->get_half_offset() == TileMap::HALF_OFFSET_Y ? 0.5 : -0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 from = xform.xform(node->map_to_world(Vector2(j, i), true) + ofs);
|
Vector2 from = xform.xform(node->map_to_world(Vector2(j, i), true) + ofs);
|
||||||
|
@ -1543,8 +1543,12 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (node->get_half_offset() == TileMap::HALF_OFFSET_X && ABS(over_tile.y) & 1)
|
if (node->get_half_offset() == TileMap::HALF_OFFSET_X && ABS(over_tile.y) & 1)
|
||||||
endpoints[i] += cell_xf[0] * 0.5;
|
endpoints[i] += cell_xf[0] * 0.5;
|
||||||
|
if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_X && ABS(over_tile.y) & 1)
|
||||||
|
endpoints[i] += cell_xf[0] * -0.5;
|
||||||
if (node->get_half_offset() == TileMap::HALF_OFFSET_Y && ABS(over_tile.x) & 1)
|
if (node->get_half_offset() == TileMap::HALF_OFFSET_Y && ABS(over_tile.x) & 1)
|
||||||
endpoints[i] += cell_xf[1] * 0.5;
|
endpoints[i] += cell_xf[1] * 0.5;
|
||||||
|
if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_Y && ABS(over_tile.x) & 1)
|
||||||
|
endpoints[i] += cell_xf[1] * -0.5;
|
||||||
endpoints[i] = xform.xform(endpoints[i]);
|
endpoints[i] = xform.xform(endpoints[i]);
|
||||||
}
|
}
|
||||||
Color col;
|
Color col;
|
||||||
|
|
|
@ -1392,15 +1392,17 @@ Vector2 TileMap::_map_to_world(int p_x, int p_y, bool p_ignore_ofs) const {
|
||||||
if (!p_ignore_ofs) {
|
if (!p_ignore_ofs) {
|
||||||
switch (half_offset) {
|
switch (half_offset) {
|
||||||
|
|
||||||
case HALF_OFFSET_X: {
|
case HALF_OFFSET_X:
|
||||||
|
case HALF_OFFSET_NEGATIVE_X: {
|
||||||
if (ABS(p_y) & 1) {
|
if (ABS(p_y) & 1) {
|
||||||
|
|
||||||
ret += get_cell_transform()[0] * 0.5;
|
ret += get_cell_transform()[0] * (half_offset == HALF_OFFSET_X ? 0.5 : -0.5);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case HALF_OFFSET_Y: {
|
case HALF_OFFSET_Y:
|
||||||
|
case HALF_OFFSET_NEGATIVE_Y: {
|
||||||
if (ABS(p_x) & 1) {
|
if (ABS(p_x) & 1) {
|
||||||
ret += get_cell_transform()[1] * 0.5;
|
ret += get_cell_transform()[1] * (half_offset == HALF_OFFSET_Y ? 0.5 : -0.5);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
default: {}
|
default: {}
|
||||||
|
@ -1463,11 +1465,21 @@ Vector2 TileMap::world_to_map(const Vector2 &p_pos) const {
|
||||||
ret.x -= 0.5;
|
ret.x -= 0.5;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case HALF_OFFSET_NEGATIVE_X: {
|
||||||
|
if (ret.y > 0 ? int(ret.y) & 1 : (int(ret.y) - 1) & 1) {
|
||||||
|
ret.x += 0.5;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
case HALF_OFFSET_Y: {
|
case HALF_OFFSET_Y: {
|
||||||
if (ret.x > 0 ? int(ret.x) & 1 : (int(ret.x) - 1) & 1) {
|
if (ret.x > 0 ? int(ret.x) & 1 : (int(ret.x) - 1) & 1) {
|
||||||
ret.y -= 0.5;
|
ret.y -= 0.5;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case HALF_OFFSET_NEGATIVE_Y: {
|
||||||
|
if (ret.x > 0 ? int(ret.x) & 1 : (int(ret.x) - 1) & 1) {
|
||||||
|
ret.y += 0.5;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
default: {}
|
default: {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1678,7 +1690,7 @@ void TileMap::_bind_methods() {
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cell_size", PROPERTY_HINT_RANGE, "1,8192,1"), "set_cell_size", "get_cell_size");
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cell_size", PROPERTY_HINT_RANGE, "1,8192,1"), "set_cell_size", "get_cell_size");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_quadrant_size", PROPERTY_HINT_RANGE, "1,128,1"), "set_quadrant_size", "get_quadrant_size");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_quadrant_size", PROPERTY_HINT_RANGE, "1,128,1"), "set_quadrant_size", "get_quadrant_size");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "cell_custom_transform"), "set_custom_transform", "get_custom_transform");
|
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "cell_custom_transform"), "set_custom_transform", "get_custom_transform");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_half_offset", PROPERTY_HINT_ENUM, "Offset X,Offset Y,Disabled"), "set_half_offset", "get_half_offset");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_half_offset", PROPERTY_HINT_ENUM, "Offset X,Offset Y,Disabled,Offset Negative X,Offset Negative Y"), "set_half_offset", "get_half_offset");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_tile_origin", PROPERTY_HINT_ENUM, "Top Left,Center,Bottom Left"), "set_tile_origin", "get_tile_origin");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_tile_origin", PROPERTY_HINT_ENUM, "Top Left,Center,Bottom Left"), "set_tile_origin", "get_tile_origin");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cell_y_sort"), "set_y_sort_mode", "is_y_sort_mode_enabled");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cell_y_sort"), "set_y_sort_mode", "is_y_sort_mode_enabled");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cell_clip_uv"), "set_clip_uv", "get_clip_uv");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cell_clip_uv"), "set_clip_uv", "get_clip_uv");
|
||||||
|
@ -1704,6 +1716,8 @@ void TileMap::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(HALF_OFFSET_X);
|
BIND_ENUM_CONSTANT(HALF_OFFSET_X);
|
||||||
BIND_ENUM_CONSTANT(HALF_OFFSET_Y);
|
BIND_ENUM_CONSTANT(HALF_OFFSET_Y);
|
||||||
BIND_ENUM_CONSTANT(HALF_OFFSET_DISABLED);
|
BIND_ENUM_CONSTANT(HALF_OFFSET_DISABLED);
|
||||||
|
BIND_ENUM_CONSTANT(HALF_OFFSET_NEGATIVE_X);
|
||||||
|
BIND_ENUM_CONSTANT(HALF_OFFSET_NEGATIVE_Y);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(TILE_ORIGIN_TOP_LEFT);
|
BIND_ENUM_CONSTANT(TILE_ORIGIN_TOP_LEFT);
|
||||||
BIND_ENUM_CONSTANT(TILE_ORIGIN_CENTER);
|
BIND_ENUM_CONSTANT(TILE_ORIGIN_CENTER);
|
||||||
|
|
|
@ -52,6 +52,8 @@ public:
|
||||||
HALF_OFFSET_X,
|
HALF_OFFSET_X,
|
||||||
HALF_OFFSET_Y,
|
HALF_OFFSET_Y,
|
||||||
HALF_OFFSET_DISABLED,
|
HALF_OFFSET_DISABLED,
|
||||||
|
HALF_OFFSET_NEGATIVE_X,
|
||||||
|
HALF_OFFSET_NEGATIVE_Y,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TileOrigin {
|
enum TileOrigin {
|
||||||
|
|
Loading…
Reference in a new issue