Rename texture_offset and unclamp it
This commit is contained in:
parent
4368191a9f
commit
d7f3bd50bd
11 changed files with 126 additions and 87 deletions
|
@ -218,7 +218,7 @@
|
|||
<member name="terrain_set" type="int" setter="set_terrain_set" getter="get_terrain_set" default="-1">
|
||||
ID of the terrain set that the tile uses.
|
||||
</member>
|
||||
<member name="texture_offset" type="Vector2i" setter="set_texture_offset" getter="get_texture_offset" default="Vector2i(0, 0)">
|
||||
<member name="texture_origin" type="Vector2i" setter="set_texture_origin" getter="get_texture_origin" default="Vector2i(0, 0)">
|
||||
Offsets the position of where the tile is drawn.
|
||||
</member>
|
||||
<member name="transpose" type="bool" setter="set_transpose" getter="get_transpose" default="false">
|
||||
|
|
|
@ -251,7 +251,7 @@
|
|||
<param index="0" name="map_position" type="Vector2i" />
|
||||
<description>
|
||||
Returns the centered position of a cell in the TileMap's local coordinate space. To convert the returned value into global coordinates, use [method Node2D.to_global]. See also [method local_to_map].
|
||||
[b]Note:[/b] This may not correspond to the visual position of the tile, i.e. it ignores the [member TileData.texture_offset] property of individual tiles.
|
||||
[b]Note:[/b] This may not correspond to the visual position of the tile, i.e. it ignores the [member TileData.texture_origin] property of individual tiles.
|
||||
</description>
|
||||
</method>
|
||||
<method name="move_layer">
|
||||
|
|
|
@ -251,7 +251,7 @@ void TileAtlasView::_draw_base_tiles() {
|
|||
for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(atlas_coords); frame++) {
|
||||
// Update the y to max value.
|
||||
Rect2i base_frame_rect = tile_set_atlas_source->get_tile_texture_region(atlas_coords, frame);
|
||||
Vector2i offset_pos = base_frame_rect.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(atlas_coords, 0);
|
||||
Vector2i offset_pos = base_frame_rect.get_center() + tile_set_atlas_source->get_tile_data(atlas_coords, 0)->get_texture_origin();
|
||||
|
||||
// Draw the tile.
|
||||
TileMap::draw_tile(base_tiles_draw->get_canvas_item(), offset_pos, tile_set, source_id, atlas_coords, 0, frame);
|
||||
|
@ -326,18 +326,19 @@ void TileAtlasView::_draw_base_tiles_shape_grid() {
|
|||
Vector2i tile_shape_size = tile_set->get_tile_size();
|
||||
for (int i = 0; i < tile_set_atlas_source->get_tiles_count(); i++) {
|
||||
Vector2i tile_id = tile_set_atlas_source->get_tile_id(i);
|
||||
Vector2 in_tile_base_offset = tile_set_atlas_source->get_tile_effective_texture_offset(tile_id, 0);
|
||||
|
||||
for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(tile_id); frame++) {
|
||||
Color color = grid_color;
|
||||
if (frame > 0) {
|
||||
color.a *= 0.3;
|
||||
Vector2 in_tile_base_offset = tile_set_atlas_source->get_tile_data(tile_id, 0)->get_texture_origin();
|
||||
if (tile_set_atlas_source->is_position_in_tile_texture_region(tile_id, 0, -tile_shape_size / 2) && tile_set_atlas_source->is_position_in_tile_texture_region(tile_id, 0, tile_shape_size / 2 - Vector2(1, 1))) {
|
||||
for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(tile_id); frame++) {
|
||||
Color color = grid_color;
|
||||
if (frame > 0) {
|
||||
color.a *= 0.3;
|
||||
}
|
||||
Rect2i texture_region = tile_set_atlas_source->get_tile_texture_region(tile_id, frame);
|
||||
Transform2D tile_xform;
|
||||
tile_xform.set_origin(texture_region.get_center() + in_tile_base_offset);
|
||||
tile_xform.set_scale(tile_shape_size);
|
||||
tile_set->draw_tile_shape(base_tiles_shape_grid, tile_xform, color);
|
||||
}
|
||||
Rect2i texture_region = tile_set_atlas_source->get_tile_texture_region(tile_id);
|
||||
Transform2D tile_xform;
|
||||
tile_xform.set_origin(texture_region.get_center() + in_tile_base_offset);
|
||||
tile_xform.set_scale(tile_shape_size);
|
||||
tile_set->draw_tile_shape(base_tiles_shape_grid, tile_xform, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -376,10 +377,10 @@ void TileAtlasView::_draw_alternatives() {
|
|||
// Update the y to max value.
|
||||
Vector2i offset_pos;
|
||||
if (transposed) {
|
||||
offset_pos = (current_pos + Vector2(texture_region_size.y, texture_region_size.x) / 2 + tile_set_atlas_source->get_tile_effective_texture_offset(atlas_coords, alternative_id));
|
||||
offset_pos = (current_pos + Vector2(texture_region_size.y, texture_region_size.x) / 2 + tile_data->get_texture_origin());
|
||||
y_increment = MAX(y_increment, texture_region_size.x);
|
||||
} else {
|
||||
offset_pos = (current_pos + texture_region_size / 2 + tile_set_atlas_source->get_tile_effective_texture_offset(atlas_coords, alternative_id));
|
||||
offset_pos = (current_pos + texture_region_size / 2 + tile_data->get_texture_origin());
|
||||
y_increment = MAX(y_increment, texture_region_size.y);
|
||||
}
|
||||
|
||||
|
|
|
@ -1122,14 +1122,15 @@ void TileDataDefaultEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2
|
|||
return;
|
||||
}
|
||||
|
||||
Vector2 texture_origin = tile_data->get_texture_origin();
|
||||
if (value.get_type() == Variant::BOOL) {
|
||||
Ref<Texture2D> texture = (bool)value ? tile_bool_checked : tile_bool_unchecked;
|
||||
int size = MIN(tile_set->get_tile_size().x, tile_set->get_tile_size().y) / 3;
|
||||
Rect2 rect = p_transform.xform(Rect2(Vector2(-size / 2, -size / 2), Vector2(size, size)));
|
||||
Rect2 rect = p_transform.xform(Rect2(Vector2(-size / 2, -size / 2) - texture_origin, Vector2(size, size)));
|
||||
p_canvas_item->draw_texture_rect(texture, rect);
|
||||
} else if (value.get_type() == Variant::COLOR) {
|
||||
int size = MIN(tile_set->get_tile_size().x, tile_set->get_tile_size().y) / 3;
|
||||
Rect2 rect = p_transform.xform(Rect2(Vector2(-size / 2, -size / 2), Vector2(size, size)));
|
||||
Rect2 rect = p_transform.xform(Rect2(Vector2(-size / 2, -size / 2) - texture_origin, Vector2(size, size)));
|
||||
p_canvas_item->draw_rect(rect, value);
|
||||
} else {
|
||||
Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts"));
|
||||
|
@ -1166,8 +1167,8 @@ void TileDataDefaultEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2
|
|||
}
|
||||
|
||||
Vector2 string_size = font->get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size);
|
||||
p_canvas_item->draw_string_outline(font, p_transform.get_origin() + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, 1, Color(0, 0, 0, 1));
|
||||
p_canvas_item->draw_string(font, p_transform.get_origin() + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, color);
|
||||
p_canvas_item->draw_string_outline(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, 1, Color(0, 0, 0, 1));
|
||||
p_canvas_item->draw_string(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, color);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1241,20 +1242,38 @@ TileDataDefaultEditor::~TileDataDefaultEditor() {
|
|||
memdelete(dummy_object);
|
||||
}
|
||||
|
||||
void TileDataTextureOffsetEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected) {
|
||||
void TileDataTextureOriginEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected) {
|
||||
TileData *tile_data = _get_tile_data(p_cell);
|
||||
ERR_FAIL_COND(!tile_data);
|
||||
|
||||
Vector2i tile_set_tile_size = tile_set->get_tile_size();
|
||||
Color color = Color(1.0, 0.0, 0.0);
|
||||
Color color = Color(1.0, 1.0, 1.0);
|
||||
if (p_selected) {
|
||||
Color grid_color = EDITOR_GET("editors/tiles_editor/grid_color");
|
||||
Color selection_color = Color().from_hsv(Math::fposmod(grid_color.get_h() + 0.5, 1.0), grid_color.get_s(), grid_color.get_v(), 1.0);
|
||||
color = selection_color;
|
||||
}
|
||||
Transform2D tile_xform;
|
||||
tile_xform.set_scale(tile_set_tile_size);
|
||||
tile_set->draw_tile_shape(p_canvas_item, p_transform * tile_xform, color);
|
||||
|
||||
TileSetSource *source = *(tile_set->get_source(p_cell.source_id));
|
||||
TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source);
|
||||
if (atlas_source->is_position_in_tile_texture_region(p_cell.get_atlas_coords(), p_cell.alternative_tile, -tile_set_tile_size / 2) && atlas_source->is_position_in_tile_texture_region(p_cell.get_atlas_coords(), p_cell.alternative_tile, tile_set_tile_size / 2 - Vector2(1, 1))) {
|
||||
Transform2D tile_xform;
|
||||
tile_xform.set_scale(tile_set_tile_size);
|
||||
tile_set->draw_tile_shape(p_canvas_item, p_transform * tile_xform, color);
|
||||
}
|
||||
|
||||
if (atlas_source->is_position_in_tile_texture_region(p_cell.get_atlas_coords(), p_cell.alternative_tile, Vector2())) {
|
||||
Ref<Texture2D> position_icon = TileSetEditor::get_singleton()->get_theme_icon(SNAME("EditorPosition"), SNAME("EditorIcons"));
|
||||
p_canvas_item->draw_texture(position_icon, p_transform.xform(Vector2()) - (position_icon->get_size() / 2), color);
|
||||
} else {
|
||||
Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts"));
|
||||
int font_size = TileSetEditor::get_singleton()->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"));
|
||||
Vector2 texture_origin = tile_data->get_texture_origin();
|
||||
String text = vformat("%s", texture_origin);
|
||||
Vector2 string_size = font->get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size);
|
||||
p_canvas_item->draw_string_outline(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, 1, Color(0, 0, 0, 1));
|
||||
p_canvas_item->draw_string(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, color);
|
||||
}
|
||||
}
|
||||
|
||||
void TileDataPositionEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected) {
|
||||
|
@ -1288,8 +1307,21 @@ void TileDataYSortEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2D
|
|||
Color selection_color = Color().from_hsv(Math::fposmod(grid_color.get_h() + 0.5, 1.0), grid_color.get_s(), grid_color.get_v(), 1.0);
|
||||
color = selection_color;
|
||||
}
|
||||
Ref<Texture2D> position_icon = TileSetEditor::get_singleton()->get_theme_icon(SNAME("EditorPosition"), SNAME("EditorIcons"));
|
||||
p_canvas_item->draw_texture(position_icon, p_transform.xform(Vector2(0, tile_data->get_y_sort_origin())) - position_icon->get_size() / 2, color);
|
||||
Vector2 texture_origin = tile_data->get_texture_origin();
|
||||
TileSetSource *source = *(tile_set->get_source(p_cell.source_id));
|
||||
TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source);
|
||||
if (atlas_source->is_position_in_tile_texture_region(p_cell.get_atlas_coords(), p_cell.alternative_tile, Vector2(0, tile_data->get_y_sort_origin()))) {
|
||||
Ref<Texture2D> position_icon = TileSetEditor::get_singleton()->get_theme_icon(SNAME("EditorPosition"), SNAME("EditorIcons"));
|
||||
p_canvas_item->draw_texture(position_icon, p_transform.xform(Vector2(0, tile_data->get_y_sort_origin())) - position_icon->get_size() / 2, color);
|
||||
} else {
|
||||
Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts"));
|
||||
int font_size = TileSetEditor::get_singleton()->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"));
|
||||
String text = vformat("%s", tile_data->get_y_sort_origin());
|
||||
|
||||
Vector2 string_size = font->get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size);
|
||||
p_canvas_item->draw_string_outline(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, 1, Color(0, 0, 0, 1));
|
||||
p_canvas_item->draw_string(font, p_transform.xform(-texture_origin) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HORIZONTAL_ALIGNMENT_CENTER, string_size.x, font_size, color);
|
||||
}
|
||||
}
|
||||
|
||||
void TileDataOcclusionShapeEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected) {
|
||||
|
@ -1333,7 +1365,7 @@ void TileDataOcclusionShapeEditor::_set_painted_value(TileSetAtlasSource *p_tile
|
|||
if (occluder_polygon.is_valid()) {
|
||||
polygon_editor->add_polygon(occluder_polygon->get_polygon());
|
||||
}
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
void TileDataOcclusionShapeEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, Variant p_value) {
|
||||
|
@ -1342,7 +1374,7 @@ void TileDataOcclusionShapeEditor::_set_value(TileSetAtlasSource *p_tile_set_atl
|
|||
Ref<OccluderPolygon2D> occluder_polygon = p_value;
|
||||
tile_data->set_occluder(occlusion_layer, occluder_polygon);
|
||||
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
Variant TileDataOcclusionShapeEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) {
|
||||
|
@ -1489,7 +1521,7 @@ void TileDataCollisionEditor::_set_painted_value(TileSetAtlasSource *p_tile_set_
|
|||
E.value->update_property();
|
||||
}
|
||||
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
void TileDataCollisionEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, Variant p_value) {
|
||||
|
@ -1508,7 +1540,7 @@ void TileDataCollisionEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_so
|
|||
tile_data->set_collision_polygon_one_way_margin(physics_layer, i, polygon_dict["one_way_margin"]);
|
||||
}
|
||||
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
Variant TileDataCollisionEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) {
|
||||
|
@ -1741,7 +1773,7 @@ void TileDataTerrainsEditor::forward_draw_over_atlas(TileAtlasView *p_tile_atlas
|
|||
TileData *tile_data = p_tile_set_atlas_source->get_tile_data(hovered_coords, 0);
|
||||
int terrain_set = tile_data->get_terrain_set();
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(hovered_coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(hovered_coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
if (terrain_set >= 0 && terrain_set == int(dummy_object->get("terrain_set"))) {
|
||||
// Draw hovered bit.
|
||||
|
@ -1792,7 +1824,7 @@ void TileDataTerrainsEditor::forward_draw_over_atlas(TileAtlasView *p_tile_atlas
|
|||
// Text
|
||||
p_canvas_item->draw_set_transform_matrix(Transform2D());
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Color color = Color(1, 1, 1);
|
||||
String text;
|
||||
|
@ -1885,7 +1917,7 @@ void TileDataTerrainsEditor::forward_draw_over_atlas(TileAtlasView *p_tile_atlas
|
|||
Vector2i coords = E.get_atlas_coords();
|
||||
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_data(coords, 0)->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set);
|
||||
for (int j = 0; j < polygon.size(); j++) {
|
||||
|
@ -1930,7 +1962,7 @@ void TileDataTerrainsEditor::forward_draw_over_alternatives(TileAtlasView *p_til
|
|||
TileData *tile_data = p_tile_set_atlas_source->get_tile_data(hovered_coords, hovered_alternative);
|
||||
int terrain_set = tile_data->get_terrain_set();
|
||||
Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(hovered_coords, hovered_alternative);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(hovered_coords, hovered_alternative);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
if (terrain_set == int(dummy_object->get("terrain_set"))) {
|
||||
// Draw hovered bit.
|
||||
|
@ -1984,7 +2016,7 @@ void TileDataTerrainsEditor::forward_draw_over_alternatives(TileAtlasView *p_til
|
|||
// Text
|
||||
p_canvas_item->draw_set_transform_matrix(Transform2D());
|
||||
Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Color color = Color(1, 1, 1);
|
||||
String text;
|
||||
|
@ -2069,7 +2101,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
|
|||
|
||||
// Set the terrains bits.
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(tile_data->get_terrain_set());
|
||||
if (Geometry2D::is_segment_intersecting_polygon(mm->get_position() - position, drag_last_pos - position, polygon)) {
|
||||
|
@ -2103,7 +2135,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
|
|||
TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, 0);
|
||||
int terrain_set = tile_data->get_terrain_set();
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
dummy_object->set("terrain_set", terrain_set);
|
||||
dummy_object->set("terrain", -1);
|
||||
|
||||
|
@ -2218,7 +2250,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
|
|||
|
||||
// Set the terrain bit.
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set);
|
||||
if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) {
|
||||
|
@ -2365,7 +2397,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
|
|||
TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, 0);
|
||||
|
||||
Rect2i texture_region = p_tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set);
|
||||
for (int j = 0; j < polygon.size(); j++) {
|
||||
|
@ -2465,7 +2497,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi
|
|||
|
||||
// Set the terrains bits.
|
||||
Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(tile_data->get_terrain_set());
|
||||
if (Geometry2D::is_segment_intersecting_polygon(mm->get_position() - position, drag_last_pos - position, polygon)) {
|
||||
|
@ -2501,7 +2533,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi
|
|||
TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, alternative_tile);
|
||||
int terrain_set = tile_data->get_terrain_set();
|
||||
Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
dummy_object->set("terrain_set", terrain_set);
|
||||
dummy_object->set("terrain", -1);
|
||||
|
||||
|
@ -2591,7 +2623,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi
|
|||
|
||||
// Set the terrain bit.
|
||||
Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile);
|
||||
Vector2i position = texture_region.get_center() + tile_data->get_texture_origin();
|
||||
|
||||
Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set);
|
||||
if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) {
|
||||
|
@ -2741,7 +2773,7 @@ void TileDataNavigationEditor::_set_painted_value(TileSetAtlasSource *p_tile_set
|
|||
polygon_editor->add_polygon(nav_polygon->get_outline(i));
|
||||
}
|
||||
}
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
void TileDataNavigationEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, Variant p_value) {
|
||||
|
@ -2750,7 +2782,7 @@ void TileDataNavigationEditor::_set_value(TileSetAtlasSource *p_tile_set_atlas_s
|
|||
Ref<NavigationPolygon> nav_polygon = p_value;
|
||||
tile_data->set_navigation_polygon(navigation_layer, nav_polygon);
|
||||
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
}
|
||||
|
||||
Variant TileDataNavigationEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) {
|
||||
|
|
|
@ -242,8 +242,8 @@ public:
|
|||
~TileDataDefaultEditor();
|
||||
};
|
||||
|
||||
class TileDataTextureOffsetEditor : public TileDataDefaultEditor {
|
||||
GDCLASS(TileDataTextureOffsetEditor, TileDataDefaultEditor);
|
||||
class TileDataTextureOriginEditor : public TileDataDefaultEditor {
|
||||
GDCLASS(TileDataTextureOriginEditor, TileDataDefaultEditor);
|
||||
|
||||
public:
|
||||
virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;
|
||||
|
|
|
@ -897,7 +897,7 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
|
|||
|
||||
// Compute the offset
|
||||
Rect2i source_rect = atlas_source->get_tile_texture_region(E.value.get_atlas_coords());
|
||||
Vector2i tile_offset = atlas_source->get_tile_effective_texture_offset(E.value.get_atlas_coords(), E.value.alternative_tile);
|
||||
Vector2i tile_offset = tile_data->get_texture_origin();
|
||||
|
||||
// Compute the destination rectangle in the CanvasItem.
|
||||
Rect2 dest_rect;
|
||||
|
|
|
@ -638,14 +638,14 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
|
|||
// --- Rendering ---
|
||||
ADD_TILE_DATA_EDITOR_GROUP("Rendering");
|
||||
|
||||
ADD_TILE_DATA_EDITOR(group, "Texture Offset", "texture_offset");
|
||||
if (!tile_data_editors.has("texture_offset")) {
|
||||
TileDataTextureOffsetEditor *tile_data_texture_offset_editor = memnew(TileDataTextureOffsetEditor);
|
||||
tile_data_texture_offset_editor->hide();
|
||||
tile_data_texture_offset_editor->setup_property_editor(Variant::VECTOR2, "texture_offset");
|
||||
tile_data_texture_offset_editor->connect("needs_redraw", callable_mp((CanvasItem *)tile_atlas_control_unscaled, &Control::queue_redraw));
|
||||
tile_data_texture_offset_editor->connect("needs_redraw", callable_mp((CanvasItem *)alternative_tiles_control_unscaled, &Control::queue_redraw));
|
||||
tile_data_editors["texture_offset"] = tile_data_texture_offset_editor;
|
||||
ADD_TILE_DATA_EDITOR(group, "Texture Origin", "texture_origin");
|
||||
if (!tile_data_editors.has("texture_origin")) {
|
||||
TileDataTextureOriginEditor *tile_data_texture_origin_editor = memnew(TileDataTextureOriginEditor);
|
||||
tile_data_texture_origin_editor->hide();
|
||||
tile_data_texture_origin_editor->setup_property_editor(Variant::VECTOR2, "texture_origin");
|
||||
tile_data_texture_origin_editor->connect("needs_redraw", callable_mp((CanvasItem *)tile_atlas_control_unscaled, &Control::queue_redraw));
|
||||
tile_data_texture_origin_editor->connect("needs_redraw", callable_mp((CanvasItem *)alternative_tiles_control_unscaled, &Control::queue_redraw));
|
||||
tile_data_editors["texture_origin"] = tile_data_texture_origin_editor;
|
||||
}
|
||||
|
||||
ADD_TILE_DATA_EDITOR(group, "Modulate", "modulate");
|
||||
|
@ -1862,7 +1862,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_unscaled_draw() {
|
|||
for (int i = 0; i < tile_set_atlas_source->get_tiles_count(); i++) {
|
||||
Vector2i coords = tile_set_atlas_source->get_tile_id(i);
|
||||
Rect2i texture_region = tile_set_atlas_source->get_tile_texture_region(coords);
|
||||
Vector2i position = texture_region.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(coords, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_set_atlas_source->get_tile_data(coords, 0)->get_texture_origin();
|
||||
|
||||
Transform2D xform = tile_atlas_control->get_parent_control()->get_transform();
|
||||
xform.translate_local(position);
|
||||
|
@ -1885,7 +1885,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_unscaled_draw() {
|
|||
continue;
|
||||
}
|
||||
Rect2i texture_region = tile_set_atlas_source->get_tile_texture_region(E.tile);
|
||||
Vector2i position = texture_region.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(E.tile, 0);
|
||||
Vector2i position = texture_region.get_center() + tile_set_atlas_source->get_tile_data(E.tile, 0)->get_texture_origin();
|
||||
|
||||
Transform2D xform = tile_atlas_control->get_parent_control()->get_transform();
|
||||
xform.translate_local(position);
|
||||
|
@ -2037,7 +2037,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_unscaled_draw() {
|
|||
continue;
|
||||
}
|
||||
Rect2i rect = tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile);
|
||||
Vector2 position = rect.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile);
|
||||
Vector2 position = rect.get_center() + tile_set_atlas_source->get_tile_data(coords, alternative_tile)->get_texture_origin();
|
||||
|
||||
Transform2D xform = alternative_tiles_control->get_parent_control()->get_transform();
|
||||
xform.translate_local(position);
|
||||
|
@ -2061,7 +2061,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_unscaled_draw() {
|
|||
continue;
|
||||
}
|
||||
Rect2i rect = tile_atlas_view->get_alternative_tile_rect(E.tile, E.alternative);
|
||||
Vector2 position = rect.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(E.tile, E.alternative);
|
||||
Vector2 position = rect.get_center() + tile_set_atlas_source->get_tile_data(E.tile, E.alternative)->get_texture_origin();
|
||||
|
||||
Transform2D xform = alternative_tiles_control->get_parent_control()->get_transform();
|
||||
xform.translate_local(position);
|
||||
|
@ -2673,7 +2673,7 @@ void EditorPropertyTilePolygon::update_property() {
|
|||
Vector2i coords = atlas_tile_proxy_object->get_edited_tiles().front()->get().tile;
|
||||
int alternative = atlas_tile_proxy_object->get_edited_tiles().front()->get().alternative;
|
||||
TileData *tile_data = tile_set_atlas_source->get_tile_data(coords, alternative);
|
||||
generic_tile_polygon_editor->set_background(tile_set_atlas_source->get_texture(), tile_set_atlas_source->get_tile_texture_region(coords), tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
generic_tile_polygon_editor->set_background(tile_set_atlas_source->get_texture(), tile_set_atlas_source->get_tile_texture_region(coords), tile_data->get_texture_origin(), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
|
||||
|
||||
// Reset the polygons.
|
||||
generic_tile_polygon_editor->clear_polygons();
|
||||
|
|
|
@ -106,7 +106,7 @@ void TilesEditorPlugin::_thread() {
|
|||
Vector2i coords = tile_map->get_cell_atlas_coords(0, cell);
|
||||
int alternative = tile_map->get_cell_alternative_tile(0, cell);
|
||||
|
||||
Vector2 center = world_pos - atlas_source->get_tile_effective_texture_offset(coords, alternative);
|
||||
Vector2 center = world_pos - atlas_source->get_tile_data(coords, alternative)->get_texture_origin();
|
||||
encompassing_rect.expand_to(center - atlas_source->get_tile_texture_region(coords).size / 2);
|
||||
encompassing_rect.expand_to(center + atlas_source->get_tile_texture_region(coords).size / 2);
|
||||
}
|
||||
|
|
|
@ -1379,7 +1379,7 @@ void TileMap::draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref
|
|||
Color modulate = tile_data->get_modulate() * p_modulation;
|
||||
|
||||
// Compute the offset.
|
||||
Vector2i tile_offset = atlas_source->get_tile_effective_texture_offset(p_atlas_coords, p_alternative_tile);
|
||||
Vector2i tile_offset = tile_data->get_texture_origin();
|
||||
|
||||
// Get destination rect.
|
||||
Rect2 dest_rect;
|
||||
|
|
|
@ -4282,19 +4282,11 @@ Rect2i TileSetAtlasSource::get_tile_texture_region(Vector2i p_atlas_coords, int
|
|||
return Rect2(origin, region_size);
|
||||
}
|
||||
|
||||
Vector2i TileSetAtlasSource::get_tile_effective_texture_offset(Vector2i p_atlas_coords, int p_alternative_tile) const {
|
||||
ERR_FAIL_COND_V_MSG(!tiles.has(p_atlas_coords), Vector2i(), vformat("TileSetAtlasSource has no tile at %s.", Vector2i(p_atlas_coords)));
|
||||
ERR_FAIL_COND_V_MSG(!has_alternative_tile(p_atlas_coords, p_alternative_tile), Vector2i(), vformat("TileSetAtlasSource has no alternative tile with id %d at %s.", p_alternative_tile, String(p_atlas_coords)));
|
||||
ERR_FAIL_COND_V(!tile_set, Vector2i());
|
||||
bool TileSetAtlasSource::is_position_in_tile_texture_region(const Vector2i p_atlas_coords, int p_alternative_tile, Vector2 p_position) const {
|
||||
Size2 size = get_tile_texture_region(p_atlas_coords).size;
|
||||
Rect2 rect = Rect2(-size / 2 - get_tile_data(p_atlas_coords, p_alternative_tile)->get_texture_origin(), size);
|
||||
|
||||
Vector2 margin = (get_tile_texture_region(p_atlas_coords).size - tile_set->get_tile_size()) / 2;
|
||||
margin = Vector2i(MAX(0, margin.x), MAX(0, margin.y));
|
||||
Vector2i effective_texture_offset = get_tile_data(p_atlas_coords, p_alternative_tile)->get_texture_offset();
|
||||
if (ABS(effective_texture_offset.x) > margin.x || ABS(effective_texture_offset.y) > margin.y) {
|
||||
effective_texture_offset = effective_texture_offset.clamp(-margin, margin);
|
||||
}
|
||||
|
||||
return effective_texture_offset;
|
||||
return rect.has_point(p_position);
|
||||
}
|
||||
|
||||
// Getters for texture and tile region (padded or not)
|
||||
|
@ -5046,7 +5038,7 @@ TileData *TileData::duplicate() {
|
|||
output->flip_h = flip_h;
|
||||
output->flip_v = flip_v;
|
||||
output->transpose = transpose;
|
||||
output->tex_offset = tex_offset;
|
||||
output->texture_origin = texture_origin;
|
||||
output->material = material;
|
||||
output->modulate = modulate;
|
||||
output->z_index = z_index;
|
||||
|
@ -5096,13 +5088,13 @@ bool TileData::get_transpose() const {
|
|||
return transpose;
|
||||
}
|
||||
|
||||
void TileData::set_texture_offset(Vector2i p_texture_offset) {
|
||||
tex_offset = p_texture_offset;
|
||||
void TileData::set_texture_origin(Vector2i p_texture_origin) {
|
||||
texture_origin = p_texture_origin;
|
||||
emit_signal(SNAME("changed"));
|
||||
}
|
||||
|
||||
Vector2i TileData::get_texture_offset() const {
|
||||
return tex_offset;
|
||||
Vector2i TileData::get_texture_origin() const {
|
||||
return texture_origin;
|
||||
}
|
||||
|
||||
void TileData::set_material(Ref<Material> p_material) {
|
||||
|
@ -5390,6 +5382,13 @@ Variant TileData::get_custom_data_by_layer_id(int p_layer_id) const {
|
|||
}
|
||||
|
||||
bool TileData::_set(const StringName &p_name, const Variant &p_value) {
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
if (p_name == "texture_offset") {
|
||||
texture_origin = p_value;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
Vector<String> components = String(p_name).split("/", true, 2);
|
||||
|
||||
if (components.size() == 2 && components[0].begins_with("occlusion_layer_") && components[0].trim_prefix("occlusion_layer_").is_valid_int()) {
|
||||
|
@ -5511,6 +5510,13 @@ bool TileData::_set(const StringName &p_name, const Variant &p_value) {
|
|||
}
|
||||
|
||||
bool TileData::_get(const StringName &p_name, Variant &r_ret) const {
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
if (p_name == "texture_offset") {
|
||||
r_ret = texture_origin;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
Vector<String> components = String(p_name).split("/", true, 2);
|
||||
|
||||
if (tile_set) {
|
||||
|
@ -5692,8 +5698,8 @@ void TileData::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("get_transpose"), &TileData::get_transpose);
|
||||
ClassDB::bind_method(D_METHOD("set_material", "material"), &TileData::set_material);
|
||||
ClassDB::bind_method(D_METHOD("get_material"), &TileData::get_material);
|
||||
ClassDB::bind_method(D_METHOD("set_texture_offset", "texture_offset"), &TileData::set_texture_offset);
|
||||
ClassDB::bind_method(D_METHOD("get_texture_offset"), &TileData::get_texture_offset);
|
||||
ClassDB::bind_method(D_METHOD("set_texture_origin", "texture_origin"), &TileData::set_texture_origin);
|
||||
ClassDB::bind_method(D_METHOD("get_texture_origin"), &TileData::get_texture_origin);
|
||||
ClassDB::bind_method(D_METHOD("set_modulate", "modulate"), &TileData::set_modulate);
|
||||
ClassDB::bind_method(D_METHOD("get_modulate"), &TileData::get_modulate);
|
||||
ClassDB::bind_method(D_METHOD("set_z_index", "z_index"), &TileData::set_z_index);
|
||||
|
@ -5746,7 +5752,7 @@ void TileData::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_h"), "set_flip_h", "get_flip_h");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_v"), "set_flip_v", "get_flip_v");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transpose"), "set_transpose", "get_transpose");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "texture_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_texture_offset", "get_texture_offset");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "texture_origin", PROPERTY_HINT_NONE, "suffix:px"), "set_texture_origin", "get_texture_origin");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "modulate"), "set_modulate", "get_modulate");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemMaterial,ShaderMaterial"), "set_material", "get_material");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "z_index"), "set_z_index", "get_z_index");
|
||||
|
|
|
@ -719,7 +719,7 @@ public:
|
|||
// Helpers.
|
||||
Vector2i get_atlas_grid_size() const;
|
||||
Rect2i get_tile_texture_region(Vector2i p_atlas_coords, int p_frame = 0) const;
|
||||
Vector2i get_tile_effective_texture_offset(Vector2i p_atlas_coords, int p_alternative_tile) const;
|
||||
bool is_position_in_tile_texture_region(const Vector2i p_atlas_coords, int p_alternative_tile, Vector2 p_position) const;
|
||||
|
||||
// Getters for texture and tile region (padded or not)
|
||||
Ref<Texture2D> get_runtime_texture() const;
|
||||
|
@ -785,7 +785,7 @@ private:
|
|||
bool flip_h = false;
|
||||
bool flip_v = false;
|
||||
bool transpose = false;
|
||||
Vector2i tex_offset;
|
||||
Vector2i texture_origin;
|
||||
Ref<Material> material = Ref<Material>();
|
||||
Color modulate = Color(1.0, 1.0, 1.0, 1.0);
|
||||
int z_index = 0;
|
||||
|
@ -864,8 +864,8 @@ public:
|
|||
void set_transpose(bool p_transpose);
|
||||
bool get_transpose() const;
|
||||
|
||||
void set_texture_offset(Vector2i p_texture_offset);
|
||||
Vector2i get_texture_offset() const;
|
||||
void set_texture_origin(Vector2i p_texture_origin);
|
||||
Vector2i get_texture_origin() const;
|
||||
void set_material(Ref<Material> p_material);
|
||||
Ref<Material> get_material() const;
|
||||
void set_modulate(Color p_modulate);
|
||||
|
|
Loading…
Reference in a new issue