#![warn(missing_docs)]
pub mod dylib;
use crate::{
asset::manager::ResourceManager,
core::{
pool::Handle,
reflect::Reflect,
visitor::{Visit, VisitError},
Downcast,
},
engine::{
task::TaskPoolHandler, AsyncSceneLoader, GraphicsContext, PerformanceStatistics,
ScriptProcessor, SerializationContext,
},
event::Event,
gui::{
constructor::WidgetConstructorContainer,
inspector::editors::PropertyEditorDefinitionContainer, message::UiMessage, UiContainer,
},
scene::{Scene, SceneContainer},
};
use std::{
ops::{Deref, DerefMut},
path::Path,
sync::Arc,
};
use winit::event_loop::EventLoopWindowTarget;
pub enum PluginContainer {
Static(Box<dyn Plugin>),
Dynamic(Box<dyn DynamicPlugin>),
}
pub trait DynamicPlugin {
fn display_name(&self) -> String;
fn is_reload_needed_now(&self) -> bool;
fn as_loaded_ref(&self) -> &dyn Plugin;
fn as_loaded_mut(&mut self) -> &mut dyn Plugin;
fn is_loaded(&self) -> bool;
fn prepare_to_reload(&mut self) {}
fn reload(
&mut self,
fill_and_register: &mut dyn FnMut(&mut dyn Plugin) -> Result<(), String>,
) -> Result<(), String>;
}
impl Deref for PluginContainer {
type Target = dyn Plugin;
fn deref(&self) -> &Self::Target {
match self {
PluginContainer::Static(plugin) => &**plugin,
PluginContainer::Dynamic(plugin) => plugin.as_loaded_ref(),
}
}
}
impl DerefMut for PluginContainer {
fn deref_mut(&mut self) -> &mut Self::Target {
match self {
PluginContainer::Static(plugin) => &mut **plugin,
PluginContainer::Dynamic(plugin) => plugin.as_loaded_mut(),
}
}
}
pub struct PluginRegistrationContext<'a> {
pub serialization_context: &'a Arc<SerializationContext>,
pub widget_constructors: &'a Arc<WidgetConstructorContainer>,
pub resource_manager: &'a ResourceManager,
}
pub struct PluginContext<'a, 'b> {
pub scenes: &'a mut SceneContainer,
pub resource_manager: &'a ResourceManager,
pub user_interfaces: &'a mut UiContainer,
pub graphics_context: &'a mut GraphicsContext,
pub dt: f32,
pub lag: &'b mut f32,
pub serialization_context: &'a Arc<SerializationContext>,
pub widget_constructors: &'a Arc<WidgetConstructorContainer>,
pub performance_statistics: &'a PerformanceStatistics,
pub elapsed_time: f32,
pub script_processor: &'a ScriptProcessor,
pub async_scene_loader: &'a mut AsyncSceneLoader,
pub window_target: Option<&'b EventLoopWindowTarget<()>>,
pub task_pool: &'a mut TaskPoolHandler,
}
impl dyn Plugin {
pub fn cast<T: Plugin>(&self) -> Option<&T> {
Downcast::as_any(self).downcast_ref::<T>()
}
pub fn cast_mut<T: Plugin>(&mut self) -> Option<&mut T> {
Downcast::as_any_mut(self).downcast_mut::<T>()
}
}
pub trait Plugin: Downcast + Visit + Reflect {
fn register(&self, #[allow(unused_variables)] context: PluginRegistrationContext) {}
fn register_property_editors(&self) -> PropertyEditorDefinitionContainer {
PropertyEditorDefinitionContainer::empty()
}
fn init(
&mut self,
#[allow(unused_variables)] scene_path: Option<&str>,
#[allow(unused_variables)] context: PluginContext,
) {
}
fn on_loaded(&mut self, #[allow(unused_variables)] context: PluginContext) {}
fn on_deinit(&mut self, #[allow(unused_variables)] context: PluginContext) {}
fn update(&mut self, #[allow(unused_variables)] context: &mut PluginContext) {}
fn post_update(&mut self, #[allow(unused_variables)] context: &mut PluginContext) {}
fn on_os_event(
&mut self,
#[allow(unused_variables)] event: &Event<()>,
#[allow(unused_variables)] context: PluginContext,
) {
}
fn on_graphics_context_initialized(
&mut self,
#[allow(unused_variables)] context: PluginContext,
) {
}
fn before_rendering(&mut self, #[allow(unused_variables)] context: PluginContext) {}
fn on_graphics_context_destroyed(&mut self, #[allow(unused_variables)] context: PluginContext) {
}
fn on_ui_message(
&mut self,
#[allow(unused_variables)] context: &mut PluginContext,
#[allow(unused_variables)] message: &UiMessage,
) {
}
fn on_scene_begin_loading(
&mut self,
#[allow(unused_variables)] path: &Path,
#[allow(unused_variables)] context: &mut PluginContext,
) {
}
fn on_scene_loaded(
&mut self,
#[allow(unused_variables)] path: &Path,
#[allow(unused_variables)] scene: Handle<Scene>,
#[allow(unused_variables)] data: &[u8],
#[allow(unused_variables)] context: &mut PluginContext,
) {
}
fn on_scene_loading_failed(
&mut self,
#[allow(unused_variables)] path: &Path,
#[allow(unused_variables)] error: &VisitError,
#[allow(unused_variables)] context: &mut PluginContext,
) {
}
}