proof-engine 0.3.0

Real-time graphics from math: glyphs and particles moved by ODEs, strange attractors and force fields, drawn with HDR bloom on OpenGL.
Documentation
[package]
name = "proof-engine"
version = "0.3.0"
edition = "2021"
rust-version = "1.88"
authors = ["Matthew Busel <matt@tensorust.com>"]
license = "MIT"
description = "Real-time graphics from math: glyphs and particles moved by ODEs, strange attractors and force fields, drawn with HDR bloom on OpenGL."
repository = "https://gitlab.com/mattbusel/proof-engine"
homepage = "https://proof-engine-rs.vercel.app/"
documentation = "https://docs.rs/proof-engine"
keywords = ["generative-art", "creative-coding", "attractor", "game-engine", "opengl"]
categories = ["game-engines", "graphics", "rendering", "simulation", "mathematics"]
readme = "README.md"
# Screenshots, GIFs and repo tooling stay on GitHub; the README links resolve there.
exclude = ["*.png", "*.gif", "*.jpg", "assets/", "docs/", "*.py", ".github/", "ci/"]

[package.metadata.docs.rs]
all-features = true

[dependencies]
# OpenGL and windowing: glutin-winit bridges the two and handles version alignment
glutin     = "0.32"
glutin-winit = "0.5"
glow       = "0.16"
winit      = "0.30"
raw-window-handle = "0.6"

# Math
glam  = "0.25"

# Colour gradients and scientific palettes (viridis, magma, turbo, CSS strings)
colorgrad = { version = "0.9", default-features = false, features = ["std", "preset", "named-colors"] }

# Scripting: dynamical systems written in Rhai and hot reloaded (math::scripted)
rhai = { version = "1.26", optional = true }

# Font rasterization (pure Rust, no system deps)
ab_glyph = "0.2"

# Audio: cpal for the device, hound for reading and writing WAV files
cpal  = "0.15"
hound = "3.5"

# Image encoding and decoding: frame capture (PNG, JPEG, animated GIF) and
# image assets
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "gif", "bmp", "tga"] }

# Bytemuck for safe GPU buffer casting (glyph instances)
bytemuck = { version = "1", features = ["derive"] }

# Serialization (config)
serde = { version = "1", features = ["derive"] }
serde_json = "1"
toml  = "0.8"

# Logging
log        = "0.4"
env_logger = "0.11"

# Bitflags (used by scene_io SceneFlags)
bitflags = "2"

# Multi-core helpers (optional), e.g. math::attractors::rk4_step_all
rayon = { version = "1", optional = true }

# Networking (optional): real HTTP for networking::http / leaderboard and
# real WebSockets for networking::websocket. rustls only, no OpenSSL.
ureq = { version = "3", optional = true, default-features = false, features = ["rustls"] }
tungstenite = { version = "0.28", optional = true, default-features = false, features = ["handshake", "rustls-tls-webpki-roots"] }
rustls = { version = "0.23", optional = true, default-features = false, features = ["ring", "std"] }

[features]
default = ["rhai-scripts"]
# math::scripted: dynamical systems written in Rhai, hot reloaded from disk.
# Rhai adds `Add` impls for String, so in a crate that also links it,
# `String + &String` needs an explicit `.as_str()`. Turn this feature off
# (default-features = false) if that bites.
rhai-scripts = ["dep:rhai"]
# networking::http (and the leaderboard and analytics clients built on it)
# make real requests with ureq. Without it, requests fail with a clear error.
http = ["dep:ureq"]
# networking::websocket opens real connections with tungstenite.
websocket = ["dep:tungstenite", "dep:rustls"]
# Both of the above.
net = ["http", "websocket"]
# Spread per-point work across CPU cores with rayon (rk4_step_all).
parallel = ["dep:rayon"]

[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
# Reference RK4 for tests/ode_cross_check.rs
ode_solvers = "0.6"

[[bench]]
name = "particle_bench"
harness = false

[[bench]]
name = "glyph_bench"
harness = false

[[bench]]
name = "attractor_bench"
harness = false

[[example]]
name = "hello_glyph"

[[example]]
name = "chaos_field"

[[example]]
name = "particle_demo"

[[example]]
name = "force_fields"

[[example]]
name = "amorphous_entity"

[[example]]
name = "strange_attractors"

[[example]]
name = "full_combat"

[[example]]
name = "galaxy"

[[example]]
name = "heartbeat"

[[example]]
name = "math_rain"

[[example]]
name = "supernova"

[[example]]
name = "playground"

[[example]]
name = "showcase"

[[example]]
name = "particle_entity"

[[example]]
name = "convergence"

[[example]]
name = "colossus"

[[example]]
name = "sculptor"

[[example]]
name = "apotheosis"

[[example]]
name = "sky"

[[example]]
name = "lorenz"

[[example]]
name = "quickstart"

[[example]]
name = "audio_bounce"

[[example]]
name = "scripted_attractor"
required-features = ["rhai-scripts"]

[[bin]]
name = "proof_editor"
path = "src/bin/proof_editor.rs"