Skip to content
Snippets Groups Projects
Unverified Commit 7a2ab258 authored by John's avatar John Committed by GitHub
Browse files

Merge pull request #240 from StarArawn/fix-zero-sized-clipping

Correctly cull custom materials with zero sized clips.
parents f85a444e 486d9a1b
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,7 @@ use crate::render::{
ui_pass::{TransparentOpacityUI, TransparentUI},
unified::pipeline::{
queue_quads_inner, DrawUIDraw, ExtractedQuad, ImageBindGroups, QuadBatch, QuadMeta,
QuadTypeOffsets, SetUIViewBindGroup, UIQuadType, UnifiedPipeline, UnifiedPipelineKey,
QuadTypeOffsets, SetUIViewBindGroup, UIQuadType, UnifiedPipeline, UnifiedPipelineKey, PreviousClip,
},
};
......@@ -318,11 +318,12 @@ pub fn queue_material_ui_quads<M: MaterialUI>(
&'static UIExtractedView,
)>,
mut image_bind_groups: ResMut<ImageBindGroups>,
(gpu_images, font_texture_cache, quad_types_offsets, render_materials): (
(gpu_images, font_texture_cache, quad_types_offsets, render_materials, mut prev_clip): (
Res<RenderAssets<Image>>,
Res<FontTextureCache>,
Res<QuadTypeOffsets>,
Res<RenderMaterialsUI<M>>,
ResMut<PreviousClip>,
),
) where
M::Data: PartialEq + Eq + Hash + Clone,
......@@ -356,6 +357,14 @@ pub fn queue_material_ui_quads<M: MaterialUI>(
for (mut quad, material_handle) in extracted_quads.iter_mut() {
if let Some(materialui) = render_materials.get(material_handle) {
if quad.quad_type == UIQuadType::Clip {
prev_clip.rect = quad.rect;
}
if prev_clip.rect.width() < 1.0 || prev_clip.rect.height() < 1.0 {
continue;
}
let pipeline_id = pipelines.specialize(
&pipeline_cache,
&materialui_pipeline,
......
......@@ -24,7 +24,7 @@ use crate::{
use self::pipeline::{
queue_quad_types, queue_ui_view_bind_groups, DrawUITransparent, ExtractedQuads,
ImageBindGroups, QuadTypeOffsets,
ImageBindGroups, QuadTypeOffsets, PreviousClip,
};
use super::{svg::RenderSvgs, ui_pass::TransparentOpacityUI};
......@@ -68,6 +68,7 @@ impl Plugin for UnifiedRenderPlugin {
.init_resource::<SpecializedRenderPipelines<UnifiedPipeline>>()
.init_resource::<QuadMeta>()
.init_resource::<RenderSvgs>()
.init_resource::<PreviousClip>()
.add_system(super::svg::extract_svg_asset.in_schedule(ExtractSchedule))
.add_system(extract_baseline.in_schedule(ExtractSchedule))
.add_system(queue_quad_types.in_set(RenderSet::Queue))
......
......@@ -557,6 +557,11 @@ pub fn queue_quad_types(
}
}
#[derive(Resource, Default)]
pub struct PreviousClip {
pub rect: Rect,
}
#[derive(SystemParam)]
pub struct QueueQuads<'w, 's> {
render_svgs: Res<'w, RenderSvgs>,
......@@ -585,6 +590,7 @@ pub struct QueueQuads<'w, 's> {
gpu_images: Res<'w, RenderAssets<Image>>,
font_texture_cache: Res<'w, FontTextureCache>,
quad_type_offsets: Res<'w, QuadTypeOffsets>,
prev_clip: ResMut<'w, PreviousClip>,
}
pub fn queue_quads(queue_quads: QueueQuads) {
......@@ -606,6 +612,7 @@ pub fn queue_quads(queue_quads: QueueQuads) {
gpu_images,
font_texture_cache,
quad_type_offsets,
mut prev_clip,
} = queue_quads;
let extracted_sprite_len = extracted_quads.quads.len();
......@@ -637,8 +644,6 @@ pub fn queue_quads(queue_quads: QueueQuads) {
// Vertex buffer indices
let mut index = 0;
let mut previous_clip_rect = Rect::default();
let draw_quad = draw_functions.read().get_id::<DrawUI>().unwrap();
let draw_opacity_quad = draw_functions_opacity
.read()
......@@ -655,10 +660,10 @@ pub fn queue_quads(queue_quads: QueueQuads) {
for quad in extracted_quads.iter_mut() {
if quad.quad_type == UIQuadType::Clip {
previous_clip_rect = quad.rect;
prev_clip.rect = quad.rect;
}
if previous_clip_rect.width() < 1.0 || previous_clip_rect.height() < 1.0 {
if prev_clip.rect.width() < 1.0 || prev_clip.rect.height() < 1.0 {
continue;
}
queue_quads_inner(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment