Clip outlines using the local clipping rect. (#17385)

# Objective

UI node Outlines are clipped using their parent's clipping rect instead
of their own.

## Solution

Clip outlines using the UI node's own clipping rect.
This commit is contained in:
ickshonpe 2025-01-15 18:19:35 +00:00 committed by GitHub
parent 6ea1574cc1
commit daf665cc74
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -9,8 +9,8 @@ mod debug_overlay;
use crate::widget::ImageNode; use crate::widget::ImageNode;
use crate::{ use crate::{
experimental::UiChildren, BackgroundColor, BorderColor, BoxShadowSamples, CalculatedClip, BackgroundColor, BorderColor, BoxShadowSamples, CalculatedClip, ComputedNode, DefaultUiCamera,
ComputedNode, DefaultUiCamera, Outline, ResolvedBorderRadius, TargetCamera, UiAntiAlias, Outline, ResolvedBorderRadius, TargetCamera, UiAntiAlias,
}; };
use bevy_app::prelude::*; use bevy_app::prelude::*;
use bevy_asset::{load_internal_asset, AssetEvent, AssetId, Assets, Handle}; use bevy_asset::{load_internal_asset, AssetEvent, AssetId, Assets, Handle};
@ -443,9 +443,7 @@ pub fn extract_uinode_borders(
AnyOf<(&BorderColor, &Outline)>, AnyOf<(&BorderColor, &Outline)>,
)>, )>,
>, >,
parent_clip_query: Extract<Query<&CalculatedClip>>,
mapping: Extract<Query<RenderEntity>>, mapping: Extract<Query<RenderEntity>>,
ui_children: UiChildren,
) { ) {
let image = AssetId::<Image>::default(); let image = AssetId::<Image>::default();
let default_camera_entity = default_ui_camera.get(); let default_camera_entity = default_ui_camera.get();
@ -514,10 +512,6 @@ pub fn extract_uinode_borders(
if let Some(outline) = maybe_outline.filter(|outline| !outline.color.is_fully_transparent()) if let Some(outline) = maybe_outline.filter(|outline| !outline.color.is_fully_transparent())
{ {
let outline_size = computed_node.outlined_node_size(); let outline_size = computed_node.outlined_node_size();
let parent_clip = ui_children
.get_parent(entity)
.and_then(|parent| parent_clip_query.get(parent).ok());
extracted_uinodes.uinodes.insert( extracted_uinodes.uinodes.insert(
commands.spawn(TemporaryRenderEntity).id(), commands.spawn(TemporaryRenderEntity).id(),
ExtractedUiNode { ExtractedUiNode {
@ -528,7 +522,7 @@ pub fn extract_uinode_borders(
..Default::default() ..Default::default()
}, },
image, image,
clip: parent_clip.map(|clip| clip.clip), clip: maybe_clip.map(|clip| clip.clip),
extracted_camera_entity, extracted_camera_entity,
item: ExtractedUiItem::Node { item: ExtractedUiItem::Node {
transform: global_transform.compute_matrix(), transform: global_transform.compute_matrix(),