use super::messages::ComponentTypeId;
use crate::components::{Colors, DiffuseImg, Edges, Faces, Normals, ProjectionWithFov, UVs, Verts, VisLines, VisMesh, VisPoints};
use crate::network::serializable_components::{
SerializableColors, SerializableEdges, SerializableFaces, SerializableNormals, SerializableUVs, SerializableVerts, SerializableVisLines,
SerializableVisMesh, SerializableVisPoints,
};
use crate::network::{FromSerializable, NetworkSendable, SerializableDiffuseImg, SerializableProjectionWithFov};
use gloss_hecs::{CommandBuffer, Entity};
use std::collections::HashMap;
type SendableSerializationFn = fn(&dyn std::any::Any) -> Option<Box<dyn NetworkSendable>>;
#[derive(Clone)]
pub struct SendableComponentRegistry {
component_serializers: HashMap<ComponentTypeId, SendableSerializationFn>,
}
impl SendableComponentRegistry {
pub fn new() -> Self {
Self {
component_serializers: HashMap::new(),
}
}
pub fn register_component_simple<C, S>(&mut self)
where
C: crate::network::serializable_components::ToSerializable<S> + 'static,
S: NetworkSendable + 'static,
{
let serialize_fn = |any: &dyn std::any::Any| any.downcast_ref::<C>().map(|v| Box::new(v.to_serializable()) as Box<dyn NetworkSendable>);
let base_type_id = ComponentTypeId::of::<C>();
self.component_serializers.insert(base_type_id, serialize_fn);
}
pub fn is_network_sendable<T: 'static>(&self) -> bool {
self.component_serializers.contains_key(&ComponentTypeId::of::<T>())
}
pub fn try_serialize_component(&self, type_id: &ComponentTypeId, component: &dyn std::any::Any) -> Option<Box<dyn NetworkSendable>> {
if let Some(serializable_func) = self.component_serializers.get(type_id) {
return (serializable_func)(component);
}
None
}
pub fn with_default_components() -> Self {
let mut registry = Self::new();
registry.register_default_components();
registry
}
pub fn register_default_components(&mut self) {
self.register_component_simple::<Verts, SerializableVerts>();
self.register_component_simple::<Faces, SerializableFaces>();
self.register_component_simple::<UVs, SerializableUVs>();
self.register_component_simple::<Normals, SerializableNormals>();
self.register_component_simple::<Colors, SerializableColors>();
self.register_component_simple::<Edges, SerializableEdges>();
self.register_component_simple::<VisLines, SerializableVisLines>();
self.register_component_simple::<VisPoints, SerializableVisPoints>();
self.register_component_simple::<VisMesh, SerializableVisMesh>();
self.register_component_simple::<ProjectionWithFov, SerializableProjectionWithFov>();
self.register_component_simple::<DiffuseImg, SerializableDiffuseImg>();
}
}
impl Default for SendableComponentRegistry {
fn default() -> Self {
Self::with_default_components()
}
}
type ReceivableComponentApplicator = fn(&mut CommandBuffer, Entity, &[u8]) -> Result<(), String>;
#[derive(Clone)]
pub struct ReceivableComponentRegistry {
component_applicators: HashMap<ComponentTypeId, ReceivableComponentApplicator>,
}
impl ReceivableComponentRegistry {
pub fn new() -> Self {
Self {
component_applicators: HashMap::new(),
}
}
pub fn register_component_simple<S, C>(&mut self)
where
S: crate::network::NetworkReceivable + 'static,
C: gloss_hecs::Component + FromSerializable<S> + 'static,
{
fn apply_component<S, C>(command_buffer: &mut CommandBuffer, entity: Entity, data: &[u8]) -> Result<(), String>
where
S: crate::network::NetworkReceivable + 'static,
C: gloss_hecs::Component + FromSerializable<S> + 'static,
{
let config = bincode::config::standard();
let (serializable_component, _): (S, usize) =
bincode::serde::decode_from_slice(data, config).map_err(|e| format!("Failed to decode component: {e}"))?;
let component = C::from_serializable(&serializable_component);
command_buffer.insert_one(entity, component);
Ok(())
}
let type_id = ComponentTypeId::of::<S>();
self.component_applicators.insert(type_id, apply_component::<S, C>);
}
pub fn apply_component(&self, command_buffer: &mut CommandBuffer, entity: Entity, type_id: &ComponentTypeId, data: &[u8]) -> Result<(), String> {
if let Some(entry) = self.component_applicators.get(type_id) {
(entry)(command_buffer, entity, data)
} else {
Err(format!("No applicator registered for component type: {}", type_id.0))
}
}
pub fn with_default_components() -> Self {
let mut registry = Self::new();
registry.register_default_components();
registry
}
pub fn register_default_components(&mut self) {
self.register_component_simple::<SerializableVerts, Verts>();
self.register_component_simple::<SerializableFaces, Faces>();
self.register_component_simple::<SerializableUVs, UVs>();
self.register_component_simple::<SerializableNormals, Normals>();
self.register_component_simple::<SerializableColors, Colors>();
self.register_component_simple::<SerializableEdges, Edges>();
self.register_component_simple::<SerializableVisLines, VisLines>();
self.register_component_simple::<SerializableVisPoints, VisPoints>();
self.register_component_simple::<SerializableVisMesh, VisMesh>();
self.register_component_simple::<SerializableProjectionWithFov, ProjectionWithFov>();
self.register_component_simple::<SerializableDiffuseImg, DiffuseImg>();
}
}
impl Default for ReceivableComponentRegistry {
fn default() -> Self {
Self::with_default_components()
}
}