You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Merge pull request #67810 from MrBlockers/reged-fixes
Fix multiple issues with region editor
This commit is contained in:
@@ -86,8 +86,8 @@ void TextureRegionEditor::_region_draw() {
|
|||||||
mtx.scale_basis(Vector2(draw_zoom, draw_zoom));
|
mtx.scale_basis(Vector2(draw_zoom, draw_zoom));
|
||||||
|
|
||||||
RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), mtx);
|
RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), mtx);
|
||||||
edit_draw->draw_rect(Rect2(Point2(), base_tex->get_size()), Color(0.5, 0.5, 0.5, 0.5), false);
|
edit_draw->draw_rect(Rect2(Point2(), preview_tex->get_size()), Color(0.5, 0.5, 0.5, 0.5), false);
|
||||||
edit_draw->draw_texture(base_tex, Point2());
|
edit_draw->draw_texture(preview_tex, Point2());
|
||||||
RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), Transform2D());
|
RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), Transform2D());
|
||||||
|
|
||||||
const Color color = get_theme_color(SNAME("mono_color"), SNAME("Editor"));
|
const Color color = get_theme_color(SNAME("mono_color"), SNAME("Editor"));
|
||||||
@@ -905,6 +905,13 @@ void TextureRegionEditor::edit(Object *p_obj) {
|
|||||||
if (atlas_tex.is_valid()) {
|
if (atlas_tex.is_valid()) {
|
||||||
atlas_tex->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed));
|
atlas_tex->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node_sprite_2d = nullptr;
|
||||||
|
node_sprite_3d = nullptr;
|
||||||
|
node_ninepatch = nullptr;
|
||||||
|
obj_styleBox = Ref<StyleBoxTexture>(nullptr);
|
||||||
|
atlas_tex = Ref<AtlasTexture>(nullptr);
|
||||||
|
|
||||||
if (p_obj) {
|
if (p_obj) {
|
||||||
node_sprite_2d = Object::cast_to<Sprite2D>(p_obj);
|
node_sprite_2d = Object::cast_to<Sprite2D>(p_obj);
|
||||||
node_sprite_3d = Object::cast_to<Sprite3D>(p_obj);
|
node_sprite_3d = Object::cast_to<Sprite3D>(p_obj);
|
||||||
@@ -926,13 +933,8 @@ void TextureRegionEditor::edit(Object *p_obj) {
|
|||||||
p_obj->connect("texture_changed", callable_mp(this, &TextureRegionEditor::_texture_changed));
|
p_obj->connect("texture_changed", callable_mp(this, &TextureRegionEditor::_texture_changed));
|
||||||
}
|
}
|
||||||
_edit_region();
|
_edit_region();
|
||||||
} else {
|
|
||||||
node_sprite_2d = nullptr;
|
|
||||||
node_sprite_3d = nullptr;
|
|
||||||
node_ninepatch = nullptr;
|
|
||||||
obj_styleBox = Ref<StyleBoxTexture>(nullptr);
|
|
||||||
atlas_tex = Ref<AtlasTexture>(nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
edit_draw->queue_redraw();
|
edit_draw->queue_redraw();
|
||||||
popup_centered_ratio(0.5);
|
popup_centered_ratio(0.5);
|
||||||
request_center = true;
|
request_center = true;
|
||||||
@@ -946,20 +948,80 @@ void TextureRegionEditor::_texture_changed() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TextureRegionEditor::_edit_region() {
|
void TextureRegionEditor::_edit_region() {
|
||||||
|
CanvasItem::TextureFilter filter = CanvasItem::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS;
|
||||||
|
|
||||||
Ref<Texture2D> texture = nullptr;
|
Ref<Texture2D> texture = nullptr;
|
||||||
if (atlas_tex.is_valid()) {
|
if (atlas_tex.is_valid()) {
|
||||||
texture = atlas_tex->get_atlas();
|
texture = atlas_tex->get_atlas();
|
||||||
} else if (node_sprite_2d) {
|
} else if (node_sprite_2d) {
|
||||||
texture = node_sprite_2d->get_texture();
|
texture = node_sprite_2d->get_texture();
|
||||||
|
filter = node_sprite_2d->get_texture_filter_in_tree();
|
||||||
} else if (node_sprite_3d) {
|
} else if (node_sprite_3d) {
|
||||||
texture = node_sprite_3d->get_texture();
|
texture = node_sprite_3d->get_texture();
|
||||||
|
|
||||||
|
StandardMaterial3D::TextureFilter filter_3d = node_sprite_3d->get_texture_filter();
|
||||||
|
|
||||||
|
switch (filter_3d) {
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_NEAREST:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST;
|
||||||
|
break;
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_LINEAR:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_LINEAR;
|
||||||
|
break;
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS;
|
||||||
|
break;
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS;
|
||||||
|
break;
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC;
|
||||||
|
break;
|
||||||
|
case StandardMaterial3D::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// fallback to project default
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_PARENT_NODE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else if (node_ninepatch) {
|
} else if (node_ninepatch) {
|
||||||
texture = node_ninepatch->get_texture();
|
texture = node_ninepatch->get_texture();
|
||||||
|
filter = node_ninepatch->get_texture_filter_in_tree();
|
||||||
} else if (obj_styleBox.is_valid()) {
|
} else if (obj_styleBox.is_valid()) {
|
||||||
texture = obj_styleBox->get_texture();
|
texture = obj_styleBox->get_texture();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// occurs when get_texture_filter_in_tree reaches the scene root
|
||||||
|
if (filter == CanvasItem::TEXTURE_FILTER_PARENT_NODE) {
|
||||||
|
SubViewport *root = EditorNode::get_singleton()->get_scene_root();
|
||||||
|
|
||||||
|
if (root != nullptr) {
|
||||||
|
Viewport::DefaultCanvasItemTextureFilter filter_default = root->get_default_canvas_item_texture_filter();
|
||||||
|
|
||||||
|
// depending on default filter, set filter to match, otherwise fall back on nearest w/ mipmaps
|
||||||
|
switch (filter_default) {
|
||||||
|
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST;
|
||||||
|
break;
|
||||||
|
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_LINEAR;
|
||||||
|
break;
|
||||||
|
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS;
|
||||||
|
break;
|
||||||
|
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS:
|
||||||
|
default:
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filter = CanvasItem::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (texture.is_null()) {
|
if (texture.is_null()) {
|
||||||
|
preview_tex->set_diffuse_texture(nullptr);
|
||||||
_zoom_reset();
|
_zoom_reset();
|
||||||
hscroll->hide();
|
hscroll->hide();
|
||||||
vscroll->hide();
|
vscroll->hide();
|
||||||
@@ -967,6 +1029,9 @@ void TextureRegionEditor::_edit_region() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
preview_tex->set_texture_filter(filter);
|
||||||
|
preview_tex->set_diffuse_texture(texture);
|
||||||
|
|
||||||
if (cache_map.has(texture->get_rid())) {
|
if (cache_map.has(texture->get_rid())) {
|
||||||
autoslice_cache = cache_map[texture->get_rid()];
|
autoslice_cache = cache_map[texture->get_rid()];
|
||||||
autoslice_is_dirty = false;
|
autoslice_is_dirty = false;
|
||||||
@@ -1002,6 +1067,8 @@ TextureRegionEditor::TextureRegionEditor() {
|
|||||||
atlas_tex = Ref<AtlasTexture>(nullptr);
|
atlas_tex = Ref<AtlasTexture>(nullptr);
|
||||||
undo_redo = EditorNode::get_singleton()->get_undo_redo();
|
undo_redo = EditorNode::get_singleton()->get_undo_redo();
|
||||||
|
|
||||||
|
preview_tex = Ref<CanvasTexture>(memnew(CanvasTexture));
|
||||||
|
|
||||||
snap_step = Vector2(10, 10);
|
snap_step = Vector2(10, 10);
|
||||||
snap_separation = Vector2(0, 0);
|
snap_separation = Vector2(0, 0);
|
||||||
snap_mode = SNAP_NONE;
|
snap_mode = SNAP_NONE;
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ class TextureRegionEditor : public AcceptDialog {
|
|||||||
Ref<StyleBoxTexture> obj_styleBox;
|
Ref<StyleBoxTexture> obj_styleBox;
|
||||||
Ref<AtlasTexture> atlas_tex;
|
Ref<AtlasTexture> atlas_tex;
|
||||||
|
|
||||||
|
Ref<CanvasTexture> preview_tex;
|
||||||
|
|
||||||
Rect2 rect;
|
Rect2 rect;
|
||||||
Rect2 rect_prev;
|
Rect2 rect_prev;
|
||||||
float prev_margin = 0.0f;
|
float prev_margin = 0.0f;
|
||||||
|
|||||||
@@ -680,6 +680,7 @@ void Sprite3D::set_region_enabled(bool p_region) {
|
|||||||
|
|
||||||
region = p_region;
|
region = p_region;
|
||||||
_queue_redraw();
|
_queue_redraw();
|
||||||
|
notify_property_list_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sprite3D::is_region_enabled() const {
|
bool Sprite3D::is_region_enabled() const {
|
||||||
@@ -781,6 +782,10 @@ void Sprite3D::_validate_property(PropertyInfo &p_property) const {
|
|||||||
if (p_property.name == "frame_coords") {
|
if (p_property.name == "frame_coords") {
|
||||||
p_property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS;
|
p_property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!region && (p_property.name == "region_rect")) {
|
||||||
|
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sprite3D::_bind_methods() {
|
void Sprite3D::_bind_methods() {
|
||||||
|
|||||||
Reference in New Issue
Block a user