Skip to main content

ProofEngine

Struct ProofEngine 

Source
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

Engine settings; most render settings are read every frame.

§scene: SceneGraph

The glyphs, particles and force fields in the world.

§camera: ProofCamera

The camera the world pass is drawn from.

§input: InputState

Keyboard and mouse state for the current frame.

§ui: UiLayer

Screen-space UI, in pixel coordinates. Cleared at the start of every frame by run_ui, so games redraw it immediate-mode style.

§fx: ScreenFx

Transient 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

Source

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

Source

pub fn dispatch(&mut self, event: GameEvent)

Dispatch a GameEvent to the appropriate engine subsystem.

This is the primary integration point — chaos-rpg-core can queue events each frame and the engine handles the visual/audio response.

Source§

impl ProofEngine

Source

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.

Source

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.

Source

pub fn queue_gpu_density_entity(&mut self, entity: GpuDensityEntityData)

Draw a density entity this frame. Call every frame it should show.

Source

pub fn emit_audio(&self, event: AudioEvent)

Send an audio event. No-op if audio is unavailable.

Source

pub fn run<F>(&mut self, update: F)
where F: FnMut(&mut ProofEngine, f32),

Run the engine. Calls update every frame with elapsed seconds. Blocks until the window is closed.

Source

pub fn run_with_overlay<F>(&mut self, update: F)
where F: FnMut(&mut ProofEngine, f32, &Context),

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.

Source

pub fn run_ui<F>(&mut self, update: F)
where F: FnMut(&mut ProofEngine, f32),

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.

Source

pub fn add_field(&mut self, field: ForceField) -> FieldId

Add a force field to the scene.

Source

pub fn remove_field(&mut self, id: FieldId)

Remove a force field.

Source

pub fn spawn_glyph(&mut self, glyph: Glyph) -> GlyphId

Spawn a glyph into the scene.

Source

pub fn spawn_entity(&mut self, entity: AmorphousEntity) -> EntityId

Spawn an amorphous entity, creating its formation glyphs.

Source

pub fn emit_particles(&mut self, emitter: EmitterPreset, origin: Vec3)

Emit a burst of particles at a position.

Source

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.

Source

pub fn request_quit(&mut self)

Ask the run loop to exit at the end of the current frame.

Source

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.

Source

pub fn window(&self) -> Option<&Window>

Get the window reference (for egui-winit event processing).

Source

pub fn window_size(&self) -> (u32, u32)

Get the current window size in pixels.

Source

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.

Source

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.

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more