summaryrefslogtreecommitdiff
path: root/engine/src/renderer/object.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer/object.rs')
-rw-r--r--engine/src/renderer/object.rs112
1 files changed, 112 insertions, 0 deletions
diff --git a/engine/src/renderer/object.rs b/engine/src/renderer/object.rs
new file mode 100644
index 0000000..d8bb2e3
--- /dev/null
+++ b/engine/src/renderer/object.rs
@@ -0,0 +1,112 @@
+use std::collections::HashMap;
+use std::collections::hash_map::Entry as HashMapEntry;
+
+use ecs::Component;
+
+use crate::asset::Id as AssetId;
+
+/// Renderer object ID.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub enum Id
+{
+ Asset(AssetId),
+ Other(u64),
+}
+
+/// Renderer object store.
+#[derive(Debug, Default, Component)]
+pub struct Store
+{
+ objects: HashMap<Id, Object>,
+}
+
+impl Store
+{
+ pub fn get_obj(&self, id: &Id) -> Option<&Object>
+ {
+ self.objects.get(id)
+ }
+
+ pub fn get_texture_obj(&self, id: &Id) -> Option<&Object>
+ {
+ let obj = self.get_obj(id)?;
+
+ if !matches!(obj.kind(), Kind::Texture) {
+ return None;
+ }
+
+ Some(obj)
+ }
+
+ pub fn contains_with_id(&self, id: &Id) -> bool
+ {
+ self.objects.contains_key(id)
+ }
+
+ pub fn insert(&mut self, id: Id, object: Object)
+ {
+ self.objects.insert(id, object);
+ }
+
+ pub fn entry(&mut self, id: Id) -> StoreEntry<'_>
+ {
+ StoreEntry { inner: self.objects.entry(id) }
+ }
+}
+
+#[derive(Debug)]
+pub struct StoreEntry<'store>
+{
+ inner: HashMapEntry<'store, Id, Object>,
+}
+
+impl<'store> StoreEntry<'store>
+{
+ pub fn or_insert(self, default_obj: Object) -> &'store mut Object
+ {
+ self.inner.or_insert(default_obj)
+ }
+
+ pub fn or_insert_with(
+ self,
+ default_func: impl FnOnce() -> Object,
+ ) -> &'store mut Object
+ {
+ self.inner.or_insert_with(default_func)
+ }
+}
+
+/// Renderer object.
+#[derive(Debug, Clone)]
+pub struct Object
+{
+ raw: u32,
+ kind: Kind,
+}
+
+impl Object
+{
+ pub fn from_raw(raw: u32, kind: Kind) -> Self
+ {
+ Self { raw, kind }
+ }
+
+ pub fn as_raw(&self) -> u32
+ {
+ self.raw
+ }
+
+ pub fn kind(&self) -> Kind
+ {
+ self.kind
+ }
+}
+
+/// Renderer object kind.
+#[derive(Debug, Clone, Copy)]
+#[non_exhaustive]
+pub enum Kind
+{
+ Texture,
+ Mesh,
+}