Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/classes/CanvasItem.xml
Original file line number Diff line number Diff line change
Expand Up @@ -789,7 +789,7 @@
Represents the size of the [enum TextureFilter] enum.
</constant>
<constant name="TEXTURE_REPEAT_PARENT_NODE" value="0" enum="TextureRepeat">
The [CanvasItem] will inherit the filter from its parent.
The [CanvasItem] will inherit the repeat mode from its parent.
</constant>
<constant name="TEXTURE_REPEAT_DISABLED" value="1" enum="TextureRepeat">
The texture does not repeat. Sampling the texture outside its extents will result in "stretching" of the edge pixels. You can avoid this by ensuring a 1-pixel fully transparent border on each side of the texture.
Expand Down
2 changes: 2 additions & 0 deletions doc/classes/PopupMenu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,8 @@
<member name="allow_search" type="bool" setter="set_allow_search" getter="get_allow_search" default="true">
If [code]true[/code], allows navigating [PopupMenu] with letter keys.
</member>
<member name="canvas_item_default_texture_filter" type="int" setter="set_default_canvas_item_texture_filter" getter="get_default_canvas_item_texture_filter" overrides="Viewport" enum="Viewport.DefaultCanvasItemTextureFilter" default="4" />
<member name="canvas_item_default_texture_repeat" type="int" setter="set_default_canvas_item_texture_repeat" getter="get_default_canvas_item_texture_repeat" overrides="Viewport" enum="Viewport.DefaultCanvasItemTextureRepeat" default="3" />
<member name="hide_on_checkable_item_selection" type="bool" setter="set_hide_on_checkable_item_selection" getter="is_hide_on_checkable_item_selection" default="true">
If [code]true[/code], hides the [PopupMenu] when a checkbox or radio button is selected.
</member>
Expand Down
2 changes: 2 additions & 0 deletions doc/classes/PopupPanel.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
<tutorials>
</tutorials>
<members>
<member name="canvas_item_default_texture_filter" type="int" setter="set_default_canvas_item_texture_filter" getter="get_default_canvas_item_texture_filter" overrides="Viewport" enum="Viewport.DefaultCanvasItemTextureFilter" default="4" />
<member name="canvas_item_default_texture_repeat" type="int" setter="set_default_canvas_item_texture_repeat" getter="get_default_canvas_item_texture_repeat" overrides="Viewport" enum="Viewport.DefaultCanvasItemTextureRepeat" default="3" />
<member name="transparent" type="bool" setter="set_flag" getter="get_flag" overrides="Window" default="true" />
<member name="transparent_bg" type="bool" setter="set_transparent_background" getter="has_transparent_background" overrides="Viewport" default="true" />
</members>
Expand Down
10 changes: 8 additions & 2 deletions doc/classes/Viewport.xml
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,10 @@
The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance.
Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels.
</constant>
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX" value="4" enum="DefaultCanvasItemTextureFilter">
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE" value="4" enum="DefaultCanvasItemTextureFilter">
The [Viewport] will inherit the filter from its parent [CanvasItem] or [Viewport].
</constant>
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX" value="5" enum="DefaultCanvasItemTextureFilter">
Represents the size of the [enum DefaultCanvasItemTextureFilter] enum.
</constant>
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED" value="0" enum="DefaultCanvasItemTextureRepeat">
Expand All @@ -780,7 +783,10 @@
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR" value="2" enum="DefaultCanvasItemTextureRepeat">
Flip the texture when repeating so that the edge lines up instead of abruptly changing.
</constant>
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MAX" value="3" enum="DefaultCanvasItemTextureRepeat">
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE" value="3" enum="DefaultCanvasItemTextureRepeat">
The [Viewport] will inherit the repeat mode from its parent [CanvasItem] or [Viewport].
</constant>
<constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MAX" value="4" enum="DefaultCanvasItemTextureRepeat">
Represents the size of the [enum DefaultCanvasItemTextureRepeat] enum.
</constant>
<constant name="SDF_OVERSIZE_100_PERCENT" value="0" enum="SDFOversize">
Expand Down
2 changes: 2 additions & 0 deletions scene/gui/popup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,8 @@ void PopupPanel::_bind_methods() {

PopupPanel::PopupPanel() {
set_flag(FLAG_TRANSPARENT, true);
set_default_canvas_item_texture_filter(Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE);
set_default_canvas_item_texture_repeat(Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE);

panel = memnew(Panel);
panel->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
Expand Down
3 changes: 3 additions & 0 deletions scene/gui/popup_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3636,6 +3636,9 @@ void PopupMenu::set_visible(bool p_visible) {

PopupMenu::PopupMenu() {
set_flag(FLAG_TRANSPARENT, true);
set_default_canvas_item_texture_filter(Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE);
set_default_canvas_item_texture_repeat(Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE);

// The panel used to draw the panel style.
panel = memnew(PanelContainer);
panel->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
Expand Down
31 changes: 22 additions & 9 deletions scene/main/canvas_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1664,11 +1664,17 @@ void CanvasItem::_update_texture_filter_changed(bool p_propagate) {
_update_self_texture_filter(texture_filter_cache);

if (p_propagate) {
for (uint32_t n = 0; n < data.canvas_item_children.size(); n++) {
CanvasItem *ci = data.canvas_item_children[n];

if (!ci->top_level && ci->texture_filter == TEXTURE_FILTER_PARENT_NODE) {
ci->_update_texture_filter_changed(true);
for (Node *c : iterate_children()) {
CanvasItem *child_ci = Object::cast_to<CanvasItem>(c);
if (child_ci) {
if (child_ci->texture_filter == CanvasItem::TEXTURE_FILTER_PARENT_NODE) {
child_ci->_update_texture_filter_changed(true);
}
continue;
}
Viewport *child_vp = Object::cast_to<Viewport>(c);
if (child_vp && child_vp->get_default_canvas_item_texture_filter() == Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE) {
child_vp->_update_texture_filter_changed(true);
}
}
}
Expand Down Expand Up @@ -1720,10 +1726,17 @@ void CanvasItem::_update_texture_repeat_changed(bool p_propagate) {
_update_self_texture_repeat(texture_repeat_cache);

if (p_propagate) {
for (uint32_t n = 0; n < data.canvas_item_children.size(); n++) {
CanvasItem *ci = data.canvas_item_children[n];
if (!ci->top_level && ci->texture_repeat == TEXTURE_REPEAT_PARENT_NODE) {
ci->_update_texture_repeat_changed(true);
for (Node *c : iterate_children()) {
CanvasItem *child_ci = Object::cast_to<CanvasItem>(c);
if (child_ci) {
if (child_ci->texture_repeat == CanvasItem::TEXTURE_REPEAT_PARENT_NODE) {
child_ci->_update_texture_repeat_changed(true);
}
continue;
}
Viewport *child_vp = Object::cast_to<Viewport>(c);
Comment thread
bruvzg marked this conversation as resolved.
if (child_vp && child_vp->get_default_canvas_item_texture_repeat() == Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE) {
child_vp->_update_texture_repeat_changed(true);
}
}
}
Expand Down
177 changes: 145 additions & 32 deletions scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,8 @@ void Viewport::_notification(int p_what) {
set_physics_process_internal(true);
}
#endif // !defined(PHYSICS_2D_DISABLED) || !defined(PHYSICS_3D_DISABLED)
_update_texture_filter_changed(false);
_update_texture_repeat_changed(false);
} break;

case NOTIFICATION_READY: {
Expand Down Expand Up @@ -3995,6 +3997,70 @@ bool Viewport::is_handling_input_locally() const {
return handle_input_locally;
}

void Viewport::_refresh_texture_filter_cache() const {
if (!is_inside_tree()) {
return;
}

switch (default_canvas_item_texture_filter) {
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST: {
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_NEAREST;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR: {
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS: {
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS: {
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE: {
Node *p = get_parent();
CanvasItem *parent_ci = Object::cast_to<CanvasItem>(p);
if (parent_ci) {
default_canvas_item_texture_filter_cache = (RenderingServerEnums::CanvasItemTextureFilter)parent_ci->get_texture_filter_in_tree();
if (default_canvas_item_texture_filter_cache == RSE::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT) {
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR;
}
break;
}
Viewport *parent_vp = Object::cast_to<Viewport>(p);
if (parent_vp) {
default_canvas_item_texture_filter_cache = (RenderingServerEnums::CanvasItemTextureFilter)parent_vp->get_texture_filter_in_tree();
break;
}
default_canvas_item_texture_filter_cache = RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR;
} break;
default: {
}
}
}

void Viewport::_update_texture_filter_changed(bool p_propagate) {
if (!is_inside_tree()) {
return;
}
_refresh_texture_filter_cache();
RS::get_singleton()->viewport_set_default_canvas_item_texture_filter(viewport, default_canvas_item_texture_filter_cache);

if (p_propagate) {
for (Node *c : iterate_children()) {
CanvasItem *child_ci = Object::cast_to<CanvasItem>(c);
if (child_ci) {
if (child_ci->texture_filter == CanvasItem::TEXTURE_FILTER_PARENT_NODE) {
child_ci->_update_texture_filter_changed(true);
}
continue;
}
Viewport *child_vp = Object::cast_to<Viewport>(c);
if (child_vp && child_vp->default_canvas_item_texture_filter == Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE) {
child_vp->_update_texture_filter_changed(true);
}
}
}
}

void Viewport::set_default_canvas_item_texture_filter(DefaultCanvasItemTextureFilter p_filter) {
ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX(p_filter, DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX);
Expand All @@ -4003,29 +4069,81 @@ void Viewport::set_default_canvas_item_texture_filter(DefaultCanvasItemTextureFi
return;
}
default_canvas_item_texture_filter = p_filter;
switch (default_canvas_item_texture_filter) {
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST:
RS::get_singleton()->viewport_set_default_canvas_item_texture_filter(viewport, RSE::CANVAS_ITEM_TEXTURE_FILTER_NEAREST);
break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR:
RS::get_singleton()->viewport_set_default_canvas_item_texture_filter(viewport, RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR);
break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS:
RS::get_singleton()->viewport_set_default_canvas_item_texture_filter(viewport, RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS);
break;
case DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS:
RS::get_singleton()->viewport_set_default_canvas_item_texture_filter(viewport, RSE::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS);
break;
default: {
}
}
_update_texture_filter_changed(true);
}

Viewport::DefaultCanvasItemTextureFilter Viewport::get_default_canvas_item_texture_filter() const {
ERR_READ_THREAD_GUARD_V(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST);
return default_canvas_item_texture_filter;
}

RenderingServerEnums::CanvasItemTextureFilter Viewport::get_texture_filter_in_tree() const {
ERR_READ_THREAD_GUARD_V(RSE::CANVAS_ITEM_TEXTURE_FILTER_LINEAR);
_refresh_texture_filter_cache();
return default_canvas_item_texture_filter_cache;
}

void Viewport::_refresh_texture_repeat_cache() const {
if (!is_inside_tree()) {
return;
}

switch (default_canvas_item_texture_repeat) {
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED: {
default_canvas_item_texture_repeat_cache = RSE::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_ENABLED: {
default_canvas_item_texture_repeat_cache = RSE::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR: {
default_canvas_item_texture_repeat_cache = RSE::CANVAS_ITEM_TEXTURE_REPEAT_MIRROR;
} break;
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE: {
Node *p = get_parent();
CanvasItem *parent_ci = Object::cast_to<CanvasItem>(p);
if (parent_ci) {
default_canvas_item_texture_repeat_cache = (RenderingServerEnums::CanvasItemTextureRepeat)parent_ci->get_texture_repeat_in_tree();
if (default_canvas_item_texture_repeat_cache == RSE::CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT) {
default_canvas_item_texture_repeat_cache = RSE::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED;
}
break;
}
Viewport *parent_vp = Object::cast_to<Viewport>(p);
if (parent_vp) {
default_canvas_item_texture_repeat_cache = (RenderingServerEnums::CanvasItemTextureRepeat)parent_vp->get_texture_repeat_in_tree();
break;
}
default_canvas_item_texture_repeat_cache = RSE::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED;
} break;
default: {
}
}
}

void Viewport::_update_texture_repeat_changed(bool p_propagate) {
if (!is_inside_tree()) {
return;
}
_refresh_texture_repeat_cache();
RS::get_singleton()->viewport_set_default_canvas_item_texture_repeat(viewport, default_canvas_item_texture_repeat_cache);

if (p_propagate) {
for (Node *c : iterate_children()) {
CanvasItem *child_ci = Object::cast_to<CanvasItem>(c);
if (child_ci) {
if (child_ci->texture_repeat == CanvasItem::TEXTURE_REPEAT_PARENT_NODE) {
child_ci->_update_texture_repeat_changed(true);
}
continue;
}
Viewport *child_vp = Object::cast_to<Viewport>(c);
if (child_vp && child_vp->default_canvas_item_texture_repeat == Viewport::DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE) {
child_vp->_update_texture_repeat_changed(true);
}
}
}
}

void Viewport::set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRepeat p_repeat) {
ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX(p_repeat, DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MAX);
Expand All @@ -4035,27 +4153,20 @@ void Viewport::set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRe
}

default_canvas_item_texture_repeat = p_repeat;

switch (default_canvas_item_texture_repeat) {
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED:
RS::get_singleton()->viewport_set_default_canvas_item_texture_repeat(viewport, RSE::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
break;
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_ENABLED:
RS::get_singleton()->viewport_set_default_canvas_item_texture_repeat(viewport, RSE::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
break;
case DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR:
RS::get_singleton()->viewport_set_default_canvas_item_texture_repeat(viewport, RSE::CANVAS_ITEM_TEXTURE_REPEAT_MIRROR);
break;
default: {
}
}
_update_texture_repeat_changed(true);
}

Viewport::DefaultCanvasItemTextureRepeat Viewport::get_default_canvas_item_texture_repeat() const {
ERR_READ_THREAD_GUARD_V(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
return default_canvas_item_texture_repeat;
}

RenderingServerEnums::CanvasItemTextureRepeat Viewport::get_texture_repeat_in_tree() const {
ERR_READ_THREAD_GUARD_V(RSE::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
_refresh_texture_repeat_cache();
return default_canvas_item_texture_repeat_cache;
}

void Viewport::set_vrs_mode(Viewport::VRSMode p_vrs_mode) {
ERR_MAIN_THREAD_GUARD;
// Note, set this even if not supported on this hardware, it will only be used if it is but we want to save the value as set by the user.
Expand Down Expand Up @@ -5227,8 +5338,8 @@ void Viewport::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "vrs_texture", PROPERTY_HINT_RESOURCE_TYPE, Texture2D::get_class_static()), "set_vrs_texture", "get_vrs_texture");
#endif
ADD_GROUP("Canvas Items", "canvas_item_");
ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Linear Mipmap,Nearest Mipmap"), "set_default_canvas_item_texture_filter", "get_default_canvas_item_texture_filter");
ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_repeat", PROPERTY_HINT_ENUM, "Disabled,Enabled,Mirror"), "set_default_canvas_item_texture_repeat", "get_default_canvas_item_texture_repeat");
ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Linear Mipmap,Nearest Mipmap,Inherit"), "set_default_canvas_item_texture_filter", "get_default_canvas_item_texture_filter");
ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_repeat", PROPERTY_HINT_ENUM, "Disabled,Enabled,Mirror,Inherit"), "set_default_canvas_item_texture_repeat", "get_default_canvas_item_texture_repeat");
ADD_GROUP("Audio Listener", "audio_listener_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "audio_listener_enable_2d"), "set_as_audio_listener_2d", "is_audio_listener_2d");
#ifndef _3D_DISABLED
Expand Down Expand Up @@ -5341,11 +5452,13 @@ void Viewport::_bind_methods() {
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_PARENT_NODE);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX);

BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_PARENT_NODE);
BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MAX);

BIND_ENUM_CONSTANT(SDF_OVERSIZE_100_PERCENT);
Expand Down
Loading
Loading