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: EngineConfig§scene: SceneGraph§camera: ProofCamera§input: InputState§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
pub fn new(config: EngineConfig) -> Self
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.
pub fn request_quit(&mut self)
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 save_frame(&self, path: &str) -> Result<()>
pub fn save_frame(&self, path: &str) -> Result<()>
Write the frame currently on screen to an uncompressed 24-bit BMP.
The point of this is being able to see what the engine actually 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 — so the only trustworthy answer comes from reading the framebuffer back off the GPU.
BMP because it needs no compression and therefore no dependency; the row order matches OpenGL’s, so no flip is needed either.
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.