#[cfg(feature = "physics")]
use crate::{
physics::{CollideType, ColliderHandle, World},
ComponentHandle,
};
use crate::{
ComponentConfig, ComponentIdentifier, ComponentTypeId, Context, EndReason, InstanceData,
RenderEncoder,
};
use downcast_rs::*;
pub trait FieldNames {
const FIELDS: &'static [&'static str];
}
pub type BoxedComponent = Box<dyn ComponentDerive>;
pub trait BaseComponent: Downcast {
fn instance(&self, #[cfg(feature = "physics")] world: &World) -> InstanceData;
}
impl_downcast!(BaseComponent);
pub trait ComponentDerive: Downcast {
fn base(&self) -> &dyn BaseComponent;
fn component_type_id(&self) -> ComponentTypeId;
}
impl_downcast!(ComponentDerive);
#[allow(unused_variables)]
pub trait ComponentController: ComponentDerive + ComponentIdentifier
where
Self: Sized,
{
const CONFIG: ComponentConfig = ComponentConfig::DEFAULT;
fn update(ctx: &mut Context) {}
#[cfg(feature = "physics")]
fn collision(
ctx: &mut Context,
self_handle: ComponentHandle,
other_handle: ComponentHandle,
self_collider: ColliderHandle,
other_collider: ColliderHandle,
collision_type: CollideType,
) {
}
fn render(ctx: &Context, encoder: &mut RenderEncoder) {}
fn end(ctx: &mut Context, reason: EndReason) {}
}
impl<C: ComponentDerive + ?Sized> ComponentDerive for Box<C> {
fn base(&self) -> &dyn BaseComponent {
(**self).base()
}
fn component_type_id(&self) -> ComponentTypeId {
(**self).component_type_id()
}
}