From 5a9fadc2f72a63bf364f3b975a2d631b6ffd34e9 Mon Sep 17 00:00:00 2001
From: John Mitchell <6656977+StarArawn@users.noreply.github.com>
Date: Wed, 26 Apr 2023 11:23:19 -0400
Subject: [PATCH] Fixed issues with indexing vertex batches and materials.

---
 src/context.rs                  |  2 ++
 src/render/material/pipeline.rs |  7 ++++---
 src/render/unified/mod.rs       |  3 ++-
 src/render/unified/pipeline.rs  | 14 ++++++++++++--
 4 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/context.rs b/src/context.rs
index c0ca4df..e06dc2d 100644
--- a/src/context.rs
+++ b/src/context.rs
@@ -1233,6 +1233,8 @@ impl Plugin for KayakContextPlugin {
             .register_type::<ComputedStyles>()
             .register_type::<KStyle>()
             .register_type::<KChildren>()
+            .register_type::<crate::layout::Rect>()
+            .register_type::<crate::node::Node>()
             .register_type::<WidgetName>()
             .register_type::<StyleProp<Color>>()
             .register_type::<StyleProp<Corner<f32>>>()
diff --git a/src/render/material/pipeline.rs b/src/render/material/pipeline.rs
index d35ffee..cca8819 100644
--- a/src/render/material/pipeline.rs
+++ b/src/render/material/pipeline.rs
@@ -36,7 +36,7 @@ use crate::render::{
     unified::pipeline::{
         queue_quads_inner, DrawUIDraw, ExtractedQuad, ImageBindGroups, PreviousClip, QuadBatch,
         QuadMeta, QuadTypeOffsets, SetUIViewBindGroup, UIQuadType, UnifiedPipeline,
-        UnifiedPipelineKey,
+        UnifiedPipelineKey, PreviousIndex,
     },
 };
 
@@ -319,12 +319,13 @@ 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, mut prev_clip): (
+    (gpu_images, font_texture_cache, quad_types_offsets, render_materials, mut prev_clip, prev_index): (
         Res<RenderAssets<Image>>,
         Res<FontTextureCache>,
         Res<QuadTypeOffsets>,
         Res<RenderMaterialsUI<M>>,
         ResMut<PreviousClip>,
+        Res<PreviousIndex>
     ),
 ) where
     M::Data: PartialEq + Eq + Hash + Clone,
@@ -339,7 +340,7 @@ pub fn queue_material_ui_quads<M: MaterialUI>(
     let mut current_batch_entity = Entity::PLACEHOLDER;
 
     // Vertex buffer indices
-    let mut index = 0;
+    let mut index = prev_index.index;
 
     // let mut previous_clip_rect = Rect::default();
 
diff --git a/src/render/unified/mod.rs b/src/render/unified/mod.rs
index 24967d6..145a3b8 100644
--- a/src/render/unified/mod.rs
+++ b/src/render/unified/mod.rs
@@ -24,7 +24,7 @@ use crate::{
 
 use self::pipeline::{
     queue_quad_types, queue_ui_view_bind_groups, DrawUITransparent, ExtractedQuads,
-    ImageBindGroups, PreviousClip, QuadTypeOffsets,
+    ImageBindGroups, PreviousClip, QuadTypeOffsets, PreviousIndex,
 };
 
 use super::{svg::RenderSvgs, ui_pass::TransparentOpacityUI};
@@ -69,6 +69,7 @@ impl Plugin for UnifiedRenderPlugin {
             .init_resource::<QuadMeta>()
             .init_resource::<RenderSvgs>()
             .init_resource::<PreviousClip>()
+            .init_resource::<PreviousIndex>()
             .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))
diff --git a/src/render/unified/pipeline.rs b/src/render/unified/pipeline.rs
index e90c79a..7936c10 100644
--- a/src/render/unified/pipeline.rs
+++ b/src/render/unified/pipeline.rs
@@ -172,7 +172,7 @@ impl FromWorld for UnifiedPipeline {
         let empty_font_texture = FontTextureCache::get_empty(&render_device);
 
         let texture_descriptor = TextureDescriptor {
-            label: Some("font_texture_array"),
+            label: Some("empty_texture"),
             size: Extent3d {
                 width: 1,
                 height: 1,
@@ -192,7 +192,7 @@ impl FromWorld for UnifiedPipeline {
         let sampler = render_device.create_sampler(&sampler_descriptor);
 
         let texture_view = texture.create_view(&TextureViewDescriptor {
-            label: Some("font_texture_array_view"),
+            label: Some("empty_texture_view"),
             format: Some(TextureFormat::Rgba8UnormSrgb),
             dimension: Some(TextureViewDimension::D2),
             aspect: bevy::render::render_resource::TextureAspect::All,
@@ -562,6 +562,11 @@ pub struct PreviousClip {
     pub rect: Rect,
 }
 
+#[derive(Resource, Default)]
+pub struct PreviousIndex {
+    pub index: u32,
+}
+
 #[derive(SystemParam)]
 pub struct QueueQuads<'w, 's> {
     render_svgs: Res<'w, RenderSvgs>,
@@ -591,6 +596,7 @@ pub struct QueueQuads<'w, 's> {
     font_texture_cache: Res<'w, FontTextureCache>,
     quad_type_offsets: Res<'w, QuadTypeOffsets>,
     prev_clip: ResMut<'w, PreviousClip>,
+    prev_index: ResMut<'w, PreviousIndex>,
 }
 
 pub fn queue_quads(queue_quads: QueueQuads) {
@@ -613,6 +619,7 @@ pub fn queue_quads(queue_quads: QueueQuads) {
         font_texture_cache,
         quad_type_offsets,
         mut prev_clip,
+        mut prev_index,
     } = queue_quads;
 
     let extracted_sprite_len = extracted_quads.quads.len();
@@ -690,6 +697,8 @@ pub fn queue_quads(queue_quads: QueueQuads) {
             )
         }
     }
+    
+    prev_index.index = index;
 }
 
 pub fn queue_quads_inner(
@@ -782,6 +791,7 @@ pub fn queue_quads_inner(
                     });
             } else {
                 // Skip unloaded texture.
+                dbg!("Skip texture not loaded in!");
                 return;
             }
         }
-- 
GitLab