pub struct ProofEngine {
pub config: EngineConfig,
pub scene: SceneGraph,
pub camera: ProofCamera,
pub input: InputState,
pub ui: UiLayer,
pub fx: ScreenFx,
pub audio: Option<AudioEngine>,
/* private fields */
}Expand description
The main engine struct. Create once, run forever.
Fields§
§config: EngineConfigEngine settings; most render settings are read every frame.
scene: SceneGraphThe glyphs, particles and force fields in the world.
camera: ProofCameraThe camera the world pass is drawn from.
input: InputStateKeyboard and mouse state for the current frame.
ui: UiLayerScreen-space UI, in pixel coordinates. Cleared at the start of every
frame by run_ui, so games redraw it immediate-mode style.
fx: ScreenFxTransient screen effects: shockwaves, flashes, light shafts. Fire and
forget; ticked and uploaded by run_ui every frame.
audio: Option<AudioEngine>Optional audio engine — None if no output device is available.
Implementations§
Source§impl ProofEngine
impl ProofEngine
Sourcepub fn run_game<G: ProofGame>(game: G)
pub fn run_game<G: ProofGame>(game: G)
Run the engine with a ProofGame implementation.
This is the preferred entry point for games that implement ProofGame.
It calls on_start(), runs the game loop calling update() each frame,
then calls on_stop() on clean exit.
use proof_engine::prelude::*;
use proof_engine::integration::ProofGame;
struct MyGame;
impl ProofGame for MyGame {
fn title(&self) -> &str { "My Game" }
fn update(&mut self, _engine: &mut ProofEngine, _dt: f32) {}
}
ProofEngine::run_game(MyGame);Source§impl ProofEngine
impl ProofEngine
Source§impl ProofEngine
impl ProofEngine
Sourcepub fn new(config: EngineConfig) -> Self
pub fn new(config: EngineConfig) -> Self
Create the engine. The window and GL context are created when run
or run_ui is called; audio starts now if enabled and a device exists.
Sourcepub fn init_gpu_density(&mut self, particles: u32)
pub fn init_gpu_density(&mut self, particles: u32)
Turn on GPU density entities with a per-entity particle budget.
The budget is capped at
MAX_PARTICLES_PER_ENTITY:
past that there are more particles than pixels and the picture stops
improving while the frame time keeps climbing. Asking for more is
fine; you get the cap and a log line.
Sourcepub fn queue_gpu_density_entity(&mut self, entity: GpuDensityEntityData)
pub fn queue_gpu_density_entity(&mut self, entity: GpuDensityEntityData)
Draw a density entity this frame. Call every frame it should show.
Sourcepub fn emit_audio(&self, event: AudioEvent)
pub fn emit_audio(&self, event: AudioEvent)
Send an audio event. No-op if audio is unavailable.
Sourcepub fn run<F>(&mut self, update: F)
pub fn run<F>(&mut self, update: F)
Run the engine. Calls update every frame with elapsed seconds.
Blocks until the window is closed.
Sourcepub fn run_with_overlay<F>(&mut self, update: F)
pub fn run_with_overlay<F>(&mut self, update: F)
Run the engine with an overlay callback. The overlay callback receives the glow GL context reference and is called AFTER scene rendering but BEFORE buffer swap — perfect for egui.
Sourcepub fn run_ui<F>(&mut self, update: F)
pub fn run_ui<F>(&mut self, update: F)
Run a UI-driven game.
Unlike [run], update is called before the scene is drawn, and the
screen-space ui layer is painted afterwards. That ordering matters for
a game: what you push this frame is what appears this frame, rather than
showing up one frame late.
The UI layer is cleared before each update, so games redraw it in full
every frame instead of tracking what to erase.
Sourcepub fn add_field(&mut self, field: ForceField) -> FieldId
pub fn add_field(&mut self, field: ForceField) -> FieldId
Add a force field to the scene.
Sourcepub fn remove_field(&mut self, id: FieldId)
pub fn remove_field(&mut self, id: FieldId)
Remove a force field.
Sourcepub fn spawn_glyph(&mut self, glyph: Glyph) -> GlyphId
pub fn spawn_glyph(&mut self, glyph: Glyph) -> GlyphId
Spawn a glyph into the scene.
Sourcepub fn spawn_entity(&mut self, entity: AmorphousEntity) -> EntityId
pub fn spawn_entity(&mut self, entity: AmorphousEntity) -> EntityId
Spawn an amorphous entity, creating its formation glyphs.
Sourcepub fn emit_particles(&mut self, emitter: EmitterPreset, origin: Vec3)
pub fn emit_particles(&mut self, emitter: EmitterPreset, origin: Vec3)
Emit a burst of particles at a position.
Sourcepub fn add_trauma(&mut self, amount: f32)
pub fn add_trauma(&mut self, amount: f32)
Apply trauma (screen shake). 0.0 = none, 1.0 = maximum.
Source§impl ProofEngine
Request quit on next frame.
impl ProofEngine
Request quit on next frame.
Sourcepub fn request_quit(&mut self)
pub fn request_quit(&mut self)
Ask the run loop to exit at the end of the current frame.
Sourcepub fn gl(&self) -> Option<&Context>
pub fn gl(&self) -> Option<&Context>
Get a reference to the glow GL context (for egui integration). Returns None if the pipeline hasn’t been initialized yet.
Sourcepub fn window(&self) -> Option<&Window>
pub fn window(&self) -> Option<&Window>
Get the window reference (for egui-winit event processing).
Sourcepub fn window_size(&self) -> (u32, u32)
pub fn window_size(&self) -> (u32, u32)
Get the current window size in pixels.
Sourcepub fn render_size(&self) -> (u32, u32)
pub fn render_size(&self) -> (u32, u32)
The framebuffer size, in the same units the viewport uses.
Screen-space UI must lay out against this, not the window size: on a scaled display the two differ and the UI ends up magnified.
Sourcepub fn frame_pixels(&self) -> Option<(u32, u32, Vec<u8>)>
pub fn frame_pixels(&self) -> Option<(u32, u32, Vec<u8>)>
The frame currently in the back buffer, as RGBA8 with the top row
first, or None before the window exists.
Read straight off the GPU after post-processing, so it is exactly what the pipeline drew. Asking the window manager for a picture of a hardware-accelerated window is unreliable: it hands back whatever it last cached, which can be a stale frame or a blank one.
Sourcepub fn save_frame(&self, path: &str) -> Result<()>
pub fn save_frame(&self, path: &str) -> Result<()>
Write the frame currently on screen to an image file.
The extension picks the format (.png, .jpg, .bmp, .tga,
.gif); an unknown extension writes a BMP, as this always did
before. The image is opaque. See export for animated GIFs and for
saving buffers of your own.
Auto Trait Implementations§
impl !Freeze for ProofEngine
impl !RefUnwindSafe for ProofEngine
impl !Send for ProofEngine
impl !Sync for ProofEngine
impl !UnwindSafe for ProofEngine
impl Unpin for ProofEngine
impl UnsafeUnpin for ProofEngine
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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.impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> 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 more