summaryrefslogtreecommitdiff
path: root/engine/src/renderer/opengl.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer/opengl.rs')
-rw-r--r--engine/src/renderer/opengl.rs156
1 files changed, 109 insertions, 47 deletions
diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs
index c72a344..d31835a 100644
--- a/engine/src/renderer/opengl.rs
+++ b/engine/src/renderer/opengl.rs
@@ -69,6 +69,7 @@ use crate::renderer::object::{
Id as RendererObjectId,
Kind as RendererObjectKind,
Object as RendererObject,
+ RawValue as RendererObjectRawValue,
Store as RendererObjectStore,
};
use crate::renderer::opengl::glutin_compat::{
@@ -127,15 +128,16 @@ struct WindowGlConfig
struct GraphicsContext
{
gl_context: ContextWithFns,
- graphics_mesh_store: GraphicsMeshStore,
surfaces: HashMap<SurfaceId, GlutinSurface<GlutinWindowSurface>>,
uniform_buffer_objs: HashMap<u32, opengl_bindings::buffer::Buffer<u8>>,
+ objects: HashMap<RendererObjectRawValue, GraphicsContextObject>,
+ next_object_key: RendererObjectRawValue,
}
-#[derive(Debug, Default)]
-struct GraphicsMeshStore
+#[derive(Debug)]
+enum GraphicsContextObject
{
- graphics_meshes: HashMap<AssetId, GraphicsMesh>,
+ Mesh(GraphicsMesh),
}
#[derive(Debug, Default)]
@@ -170,6 +172,7 @@ fn handle_model_removed(
observe: Observe<Pair<Removed, Model>>,
renderer_ctx_query: Query<(
&mut GraphicsContext,
+ &RendererObjectStore,
Pair<RendererCtxUsedByWindow, Wildcard>,
)>,
assets: Single<Assets>,
@@ -178,13 +181,15 @@ fn handle_model_removed(
for evt_match in &observe {
let model_ent_id = evt_match.id();
- for (renderer_ctx_ent_id, (mut graphics_ctx, renderer_ctx_used_by_window)) in
- renderer_ctx_query.iter_with_euids()
+ for (
+ renderer_ctx_ent_id,
+ (mut graphics_ctx, renderer_object_store, renderer_ctx_used_by_window),
+ ) in renderer_ctx_query.iter_with_euids()
{
let GraphicsContext {
ref gl_context,
- ref mut graphics_mesh_store,
ref surfaces,
+ objects: ref mut graphics_ctx_objects,
..
} = *graphics_ctx;
@@ -198,10 +203,14 @@ fn handle_model_removed(
continue;
};
- if !graphics_mesh_store
- .graphics_meshes
- .contains_key(&mesh_asset.id())
- {
+ let Some(graphics_ctx_object_id) = renderer_object_store
+ .get_obj(&RendererObjectId::Asset(mesh_asset.id()))
+ .map(|obj| obj.as_raw())
+ else {
+ continue;
+ };
+
+ if !graphics_ctx_objects.contains_key(&graphics_ctx_object_id) {
continue;
}
@@ -245,16 +254,27 @@ fn handle_model_removed(
"Cleaning up after model in renderer context"
);
- let Some(mut graphics_mesh) =
- graphics_mesh_store.graphics_meshes.remove(&mesh_asset.id())
+ let Some(removed_graphics_ctx_obj) =
+ graphics_ctx_objects.remove(&graphics_ctx_object_id)
else {
tracing::warn!(
model_entity_id=%model_ent_id,
- "No mesh exists for model"
+ "No graphics context object exists for model"
);
continue;
};
+ #[allow(irrefutable_let_patterns)]
+ let GraphicsContextObject::Mesh(mut graphics_mesh) = removed_graphics_ctx_obj
+ else {
+ tracing::error!(
+ model_entity_id=%model_ent_id,
+ "Graphics context object for model is not a mesh"
+ );
+
+ continue;
+ };
+
graphics_mesh.destroy(&curr_gl_ctx);
}
}
@@ -611,9 +631,10 @@ fn init_window_graphics(
let renderer_ctx_ent_id = actions.spawn((
GraphicsContext {
gl_context,
- graphics_mesh_store: GraphicsMeshStore::default(),
surfaces: HashMap::from([(surface_id, surface)]),
uniform_buffer_objs: HashMap::new(),
+ objects: HashMap::new(),
+ next_object_key: RendererObjectRawValue::default(),
},
RendererObjectStore::default(),
RendererCommandQueue::default(),
@@ -651,9 +672,10 @@ fn handle_commands(
{
let GraphicsContext {
ref gl_context,
- ref mut graphics_mesh_store,
ref surfaces,
ref mut uniform_buffer_objs,
+ objects: ref mut graphics_ctx_objects,
+ next_object_key: ref mut next_graphics_ctx_object_key,
} = *graphics_ctx;
let mut opt_curr_gl_ctx: Option<CurrentContextWithFns> = None;
@@ -882,42 +904,82 @@ fn handle_commands(
tracing::error!("Failed to create texture object: {err}");
}
}
- RendererCommand::DrawMesh { mesh_asset } => {
+ RendererCommand::CreateMesh(mesh_object_id, mesh) => {
let Some(curr_gl_ctx) = &opt_curr_gl_ctx else {
tracing::error!("No GL context is current");
continue;
};
- // tracing::warn!("ARGH! Drawing mesh");
-
- let graphics_mesh =
- match graphics_mesh_store.graphics_meshes.get(&mesh_asset.id()) {
- Some(graphics_mesh) => graphics_mesh,
- None => {
- let Some(mesh) = assets.get(&mesh_asset) else {
- tracing::trace!("Missing model asset");
- continue;
- };
-
- let graphics_mesh =
- match GraphicsMesh::new(&curr_gl_ctx, mesh) {
- Ok(graphics_mesh) => graphics_mesh,
- Err(err) => {
- tracing::error!(
- "Failed to create {}: {err}",
- type_name::<GraphicsMesh>()
- );
-
- continue;
- }
- };
-
- graphics_mesh_store
- .graphics_meshes
- .entry(mesh_asset.id())
- .or_insert(graphics_mesh)
- }
- };
+ if renderer_object_store.contains_with_id(&mesh_object_id) {
+ tracing::error!(
+ object_id=?mesh_object_id,
+ "Object store already contains a object with this ID"
+ );
+ continue;
+ }
+
+ let key = *next_graphics_ctx_object_key;
+
+ let graphics_mesh = match GraphicsMesh::new(&curr_gl_ctx, &mesh) {
+ Ok(graphics_mesh) => graphics_mesh,
+ Err(err) => {
+ tracing::error!("Failed to create mesh: {err}");
+ continue;
+ }
+ };
+
+ graphics_ctx_objects
+ .insert(key, GraphicsContextObject::Mesh(graphics_mesh));
+
+ renderer_object_store.insert(
+ mesh_object_id,
+ RendererObject::from_raw(
+ key,
+ RendererObjectKind::ImplementationSpecific,
+ ),
+ );
+
+ *next_graphics_ctx_object_key += 1;
+ }
+ RendererCommand::DrawMesh(mesh_object_id) => {
+ let Some(curr_gl_ctx) = &opt_curr_gl_ctx else {
+ tracing::error!("No GL context is current");
+ continue;
+ };
+
+ let Some(mesh_graphics_ctx_obj_key) = renderer_object_store
+ .get_obj(&mesh_object_id)
+ .map(|obj| obj.as_raw())
+ else {
+ tracing::error!(
+ object_id=?mesh_object_id,
+ "Object store does not contain a mesh object with this ID"
+ );
+ continue;
+ };
+
+ let Some(mesh_graphics_ctx_obj) =
+ graphics_ctx_objects.get(&mesh_graphics_ctx_obj_key)
+ else {
+ tracing::error!(
+ object_id=?mesh_object_id,
+ key=mesh_graphics_ctx_obj_key,
+ "Graphics context does not contain a mesh object with this key"
+ );
+ continue;
+ };
+
+ #[allow(irrefutable_let_patterns)]
+ let GraphicsContextObject::Mesh(graphics_mesh) =
+ mesh_graphics_ctx_obj
+ else {
+ tracing::error!(
+ object_id=?mesh_object_id,
+ key=mesh_graphics_ctx_obj_key,
+ "Graphics context object with this key is not a mesh"
+ );
+ continue;
+ };
if let Err(err) = draw_mesh(&curr_gl_ctx, graphics_mesh) {
tracing::error!("Failed to draw mesh: {err}");