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 } else {
106 let SurfaceRenderData {
107 buffer,
108 vertex_modifications_count,
109 triangles_modifications_count,
110 layout_hash,
111 } = create_geometry_buffer(&data, server)?;
112 entry.buffer = buffer;
113 entry.vertex_modifications_count = vertex_modifications_count;
114 entry.triangles_modifications_count = triangles_modifications_count;
115 entry.layout_hash = layout_hash;
116 }
117 Ok(&entry.buffer)
118 }
119 Err(err) => Err(err),
120 }
121 }
122
123 pub fn update(&mut self, dt: f32) {
124 self.buffer.update(dt);
125 }
126
127 pub fn clear(&mut self) {
128 self.buffer.clear();
129 }
130
131 pub fn alive_count(&self) -> usize {
132 self.buffer.alive_count()
133 }
134}