pub struct PluginContext<'a, 'b> {Show 16 fields
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 dyn_type_constructors: &'a Arc<DynTypeConstructorContainer>,
pub performance_statistics: &'a PerformanceStatistics,
pub elapsed_time: f32,
pub script_processor: &'a ScriptProcessor,
pub async_scene_loader: &'a mut AsyncSceneLoader,
pub loop_controller: ApplicationLoopController<'b>,
pub task_pool: &'a mut TaskPoolHandler,
pub input_state: &'a InputState,
}Expand description
Contains plugin environment.
Fields§
§scenes: &'a mut SceneContainerA reference to scene container of the engine. You can add new scenes from Plugin methods
by using SceneContainer::add.
resource_manager: &'a ResourceManagerA reference to the resource manager, it can be used to load various resources and manage
them. See ResourceManager docs for more info.
user_interfaces: &'a mut UiContainerA reference to user interface container of the engine. The engine guarantees that there’s
at least one user interface exists. Use context.user_interfaces.first()/first_mut() to
get a reference to it.
graphics_context: &'a mut GraphicsContextA reference to the graphics_context, it contains a reference to the window and the current renderer.
It could be GraphicsContext::Uninitialized if your application is suspended (possible only on
Android; it is safe to call GraphicsContext::as_initialized_ref or GraphicsContext::as_initialized_mut
on every other platform).
dt: f32The time (in seconds) that passed since last call of a method in which the context was
passed. It has fixed value that is defined by a caller (in most cases it is Executor).
lag: &'b mut f32A reference to time accumulator, that holds remaining amount of time that should be used
to update a plugin. A caller splits lag into multiple sub-steps using dt and thus
stabilizes update rate. The main use of this variable, is to be able to reset lag when
you doing some heavy calculations in a your game loop (i.e. loading a new level) so the
engine won’t try to “catch up” with all the time that was spent in heavy calculation.
serialization_context: &'a Arc<SerializationContext>A reference to serialization context of the engine. See SerializationContext for more
info.
widget_constructors: &'a Arc<WidgetConstructorContainer>A reference to serialization context of the engine. See WidgetConstructorContainer for more
info.
dyn_type_constructors: &'a Arc<DynTypeConstructorContainer>A container with constructors for dynamic types. See DynTypeConstructorContainer for more
info.
performance_statistics: &'a PerformanceStatisticsPerformance statistics from the last frame.
elapsed_time: f32Amount of time (in seconds) that passed from creation of the engine. Keep in mind, that this value is not guaranteed to match real time. A user can change delta time with which the engine “ticks” and this delta time affects elapsed time.
script_processor: &'a ScriptProcessorScript processor is used to run script methods in a strict order.
async_scene_loader: &'a mut AsyncSceneLoaderAsynchronous scene loader. It is used to request scene loading. See AsyncSceneLoader docs
for usage example.
loop_controller: ApplicationLoopController<'b>Special field that associates the main application event loop (not game loop) with OS-specific
windows. It also can be used to alternate control flow of the application. None if the
engine is running in headless mode.
task_pool: &'a mut TaskPoolHandlerTask pool for asynchronous task management.
input_state: &'a InputStateA stored state of most common input events. It is used a “shortcut” in cases where event-based approach is too verbose. It may be useful in simple scenarios where you just need to know if a button (on keyboard, mouse) was pressed and do something.
Important: this structure does not track from which device the corresponding event has come from, if you have more than one keyboard and/or mouse, use event-based approach instead!
Implementations§
Source§impl<'a, 'b> PluginContext<'a, 'b>
impl<'a, 'b> PluginContext<'a, 'b>
Sourcepub fn load_ui<U, P, C>(&mut self, path: U, callback: C)where
U: AsRef<Path> + Send + 'static,
P: Plugin,
for<'c, 'd> C: Fn(Result<UserInterface, VisitError>, &mut P, &mut PluginContext<'c, 'd>) -> GameResult + 'static,
pub fn load_ui<U, P, C>(&mut self, path: U, callback: C)where
U: AsRef<Path> + Send + 'static,
P: Plugin,
for<'c, 'd> C: Fn(Result<UserInterface, VisitError>, &mut P, &mut PluginContext<'c, 'd>) -> GameResult + 'static,
Spawns an asynchronous task that tries to load a user interface from the given path. When the task is completed, the specified callback is called that can be used to modify the UI. The loaded UI must be registered in the engine, otherwise it will be discarded.
§Example
#[derive(Default, Visit, Reflect, Debug)]
#[reflect(non_cloneable)]
struct MyGame {}
impl Plugin for MyGame {
fn init(&mut self, _scene_path: Option<&str>, mut ctx: PluginContext) -> GameResult {
ctx.load_ui("data/my.ui", |result, game: &mut MyGame, mut ctx| {
// The loaded UI must be registered in the engine.
*ctx.user_interfaces.first_mut() = result?;
Ok(())
});
Ok(())
}
}Auto Trait Implementations§
impl<'a, 'b> Freeze for PluginContext<'a, 'b>
impl<'a, 'b> !RefUnwindSafe for PluginContext<'a, 'b>
impl<'a, 'b> !Send for PluginContext<'a, 'b>
impl<'a, 'b> !Sync for PluginContext<'a, 'b>
impl<'a, 'b> Unpin for PluginContext<'a, 'b>
impl<'a, 'b> !UnwindSafe for PluginContext<'a, 'b>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.