diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2022-10-05 08:29:17 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2022-10-05 08:29:17 +0200 |
commit | 57d7e35370cea95aa8c44d79abd36ad673972410 (patch) | |
tree | de6a50b555f0b17437ed6cb027393b69ae03be29 | |
parent | 47c0fe5cd65f5edcfb1d8cda5d13bd7da74eb943 (diff) | |
parent | 1518d813beaa918abe9b60eee8b44e75ba150efb (diff) |
Merge pull request #66509 from Mickeon/yes
Support chaining AtlasTextures inside other AtlasTextures
-rw-r--r-- | doc/classes/AtlasTexture.xml | 4 | ||||
-rw-r--r-- | scene/resources/texture.cpp | 8 |
2 files changed, 10 insertions, 2 deletions
diff --git a/doc/classes/AtlasTexture.xml b/doc/classes/AtlasTexture.xml index 4794c8ef14..809d983a9d 100644 --- a/doc/classes/AtlasTexture.xml +++ b/doc/classes/AtlasTexture.xml @@ -6,13 +6,13 @@ <description> [Texture2D] resource that draws only part of its [member atlas] texture, as defined by the [member region]. An additional [member margin] can also be set, which is useful for small adjustments. Multiple [AtlasTexture] resources can be cropped from the same [member atlas]. Packing many smaller textures into a singular large texture helps to optimize video memory costs and render calls. - [b]Note:[/b] [AtlasTexture] cannot be used in an [AnimatedTexture], and does not work properly if used inside of other [AtlasTexture] resources. + [b]Note:[/b] [AtlasTexture] cannot be used in an [AnimatedTexture], and may not tile properly in nodes such as [TextureRect], when inside other [AtlasTexture] resources. </description> <tutorials> </tutorials> <members> <member name="atlas" type="Texture2D" setter="set_atlas" getter="get_atlas"> - The texture that contains the atlas. Can be any type inheriting from [Texture2D]. Nesting [AtlasTexture] resources is not supported. + The texture that contains the atlas. Can be any type inheriting from [Texture2D], including another [AtlasTexture]. </member> <member name="filter_clip" type="bool" setter="set_filter_clip" getter="has_filter_clip" default="false"> If [code]true[/code], the area outside of the [member region] is clipped to avoid bleeding of the surrounding texture pixels. diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 15678c9281..5a03929f98 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -1489,7 +1489,15 @@ void AtlasTexture::set_atlas(const Ref<Texture2D> &p_atlas) { if (atlas == p_atlas) { return; } + // Support recursive AtlasTextures. + if (Ref<AtlasTexture>(atlas).is_valid()) { + atlas->disconnect(CoreStringNames::get_singleton()->changed, callable_mp((Resource *)this, &AtlasTexture::emit_changed)); + } atlas = p_atlas; + if (Ref<AtlasTexture>(atlas).is_valid()) { + atlas->connect(CoreStringNames::get_singleton()->changed, callable_mp((Resource *)this, &AtlasTexture::emit_changed)); + } + emit_changed(); } |