fyrox_impl/renderer/cache/
geometry.rs1use crate::{
22 graphics::{
23 buffer::BufferUsage, error::FrameworkError, geometry_buffer::GpuGeometryBuffer,
24 server::GraphicsServer,
25 },
26 renderer::{
27 cache::{TemporaryCache, TimeToLive},
28 framework::GeometryBufferExt,
29 },
30 scene::mesh::surface::{SurfaceData, SurfaceResource},
31};
32
33struct SurfaceRenderData {
34 buffer: GpuGeometryBuffer,
35 vertex_modifications_count: u64,
36 triangles_modifications_count: u64,
37 layout_hash: u64,
38}
39
40#[derive(Default)]
41pub struct GeometryCache {
42 buffer: TemporaryCache<SurfaceRenderData>,
43}
44
45fn create_geometry_buffer(
46 data: &SurfaceData,
47 server: &dyn GraphicsServer,
48) -> Result<SurfaceRenderData, FrameworkError> {
49 let geometry_buffer = GpuGeometryBuffer::from_surface_data(
50 "GeometryBuffer",
53 data,
54 BufferUsage::StaticDraw,
55 server,
56 )?;
57
58 Ok(SurfaceRenderData {
59 buffer: geometry_buffer,
60 vertex_modifications_count: data.vertex_buffer.modifications_count(),
61 triangles_modifications_count: data.geometry_buffer.modifications_count(),
62 layout_hash: data.vertex_buffer.layout_hash(),
63 })
64}
65
66impl GeometryCache {
67 pub fn get<'a>(
68 &'a mut self,
69 server: &dyn GraphicsServer,
70 data: &SurfaceResource,
71 time_to_live: TimeToLive,
72 ) -> Result<&'a GpuGeometryBuffer, FrameworkError> {
73 let data = data.data_ref();
74
75 match self
76 .buffer
77 .get_entry_mut_or_insert_with(&data.cache_index, time_to_live, || {
78 create_geometry_buffer(&data, server)
79 }) {
80 Ok(entry) => {
81 if entry.layout_hash == data.vertex_buffer.layout_hash() {
84 if data.vertex_buffer.modifications_count() != entry.vertex_modifications_count
85 {
86 entry
88 .buffer
89 .set_buffer_data(0, data.vertex_buffer.raw_data());
90
91 entry.vertex_modifications_count = data.vertex_buffer.modifications_count();
92 }
93
94 if data.geometry_buffer.modifications_count()
95 != entry.triangles_modifications_count
96 {
97 entry
99 .buffer
100 .set_triangles(data.geometry_buffer.triangles_ref());
101
102 entry.triangles_modifications_count =
103 data.geometry_buffer.modifications_count();
104 }
105 }
106 Ok(&entry.buffer)
107 }
108 Err(err) => Err(err),
109 }
110 }
111
112 pub fn update(&mut self, dt: f32) {
113 self.buffer.update(dt);
114 }
115
116 pub fn clear(&mut self) {
117 self.buffer.clear();
118 }
119
120 pub fn alive_count(&self) -> usize {
121 self.buffer.alive_count()
122 }
123}