Repository navigation
Releases
v0.3.0
Pite v0.3.0
Pite 0.3 brings a major leap forward for the engine 🎉 — introducing a pure-Rust 2D physics subsystem powered by Rapier2D, an ergonomic Python API redesign with native vector math and declarative node descriptors, robust hot reload with state preservation, broad audio format support via Symphonia, macOS cross-platform support, and automatic player downloads for exports.
Highlights 🔥
Pure-Rust 2D Physics Subsystem (Rapier2D)
Pite now features a dedicated 2D physics subsystem powered by rapier2d 0.23 in a new workspace crate pite-physics. Running in a deterministic 60 Hz simulation loop (dt = 1/60) and feeding _physics_process(delta) in Python scripts:
- Kinematic & Dynamic Bodies:
CharacterBody2Dwith built-inmove_and_slide()obstacle response and contact flags (is_on_floor(),is_on_wall(),is_on_ceiling()),RigidBody2Dwith dynamic forces (apply_force,apply_impulse), andStaticBody2Dfor solid level geometry. - Colliders & Triggers:
CollisionShape2Dsupportsbox,circle, andcapsulegeometries with interactive editor wireframe visualization.Area2Dprovides trigger detection with engine signals (body_entered,body_exited,area_entered,area_exited). - Spatial Raycasting:
pite.raycast(from, to, mask=1)performs line intersection queries returning hit points, surface normals, distances, and collider nodes.
Python API Redesign & Direct Handles
Scripting in Pite is now significantly faster and more expressive:
Vec2Math Class: Native 2D vector class supporting arithmetic operations (+,-,*,/), in-place mutations (+=,-=, etc.), tuple sequence unpacking (x, y = self.position),.length(), and.normalized().- Direct Handle Mutation: Mutating
self.position.x += 10or assigningself.position = (x, y)directly syncs to the engine without redundant end-of-frame Python object traversals or string allocations. - Attribute-Based Input API: Clean attribute syntax
pite.held.<key>,pite.pressed.<key>, andpite.released.<key>(e.g.pite.held.right,pite.pressed.space), rejecting old string calls with clear errors. - Declarative Descriptors & Proxy Caching:
pite.child("Name")andpite.node("../Path")descriptors cache node lookups on first access, whileScriptHostcaches resolved node proxies across frames. - Hybrid Signal Callbacks:
signal.connect()accepts arbitrary Python callables (lambdas, functions, bound methods) alongside engine-dispatched signals.
Bulletproof Hot Reload & State Preservation
Modifying code or assets while building games should never reset your workflow:
- Continuous Editor Polling: Hot reload watches and reloads scripts and scenes in edit mode while idle or paused, without requiring gameplay to be running.
- Python State & Physics Velocity Preservation: Reloading a script preserves custom instance attributes (
__dict__) and physics body velocity across reloads while purging stale module dicts insys.modules. - Scene Isolation: Touching unrelated
.ptscnfiles no longer triggers unnecessary scene rebuilds. - Asset Invalidation: Modifying
.pngtextures or.atlas.jsonspritesheets invalidates cached GPU textures and triggers viewport redraws immediately.
Symphonia Audio: OGG, MP3, FLAC & Extended WAV
Audio decode is now 100% pure Rust via symphonia:
- Native support for Ogg Vorbis (
.ogg), MP3 (.mp3), FLAC (.flac), and extended WAV (8/16/24/32-bit int and 32-bit float). pite checkvalidates audio decodability and header integrity for all project audio assets.- Asset pipeline adds dedicated importers for manifest tracking and asset renames.
Seamless Exports & Automatic Player Downloads
pite exportnow automatically downloads the target platform'spite-playerrelease binary when not present locally, caching it under~/.cache/pite/toolchains/players/.- Releases now include standalone player binaries for Linux, Windows, and macOS, alongside unified all-platform bundles.
Platform Expansion & Scene Extension
- macOS Support: Full macOS support for both the editor and games with cross-compilation in CI and release workflows.
.ptscnScene Extension: Standardized scene file extension to.ptscn(was.pitescene) across the entire engine, tooling, templates, and documentation.
Changes Overview 📜
• 2D physics subsystem with Rapier2D: pure-Rust 2D physics powered by rapier2d 0.23 in pite-physics, running in a fixed 60 Hz simulation loop (dt = 1/60) and driving _physics_process(delta) in Python scripts.
• Kinematic character controller: move_and_slide() computes sliding obstacle collision response against solid geometry while ignoring trigger sensors, automatically updating velocity and contact flags (is_on_floor(), is_on_wall(), is_on_ceiling()) relative to up_direction.
• Dynamic rigid bodies: apply_impulse((x, y)) and apply_force((x, y)) for simulation, with configurable mass, gravity_scale, and lock_rotation.
• Area trigger signals: Area2D emits engine-owned body_entered, body_exited, area_entered, and area_exited signals with node ID arguments.
• Spatial raycasts: pite.raycast(from, to, mask=1) performs line intersection queries against solid obstacles, returning intersection point, surface normal, distance, collider node, and body node.
• Editor visualization and inspection: pite-editor paints semi-transparent collision shape wireframe overlays (box, circle, capsule) directly in the viewport in design mode, with shape dropdowns and physics property controls in the Inspector.
• Python API redesign with direct handles and vector math: Vec2 class supporting vector operations, in-place mutations, indexing, and tuple unpacking.
• Direct engine transform mutations: mutating self.position.x or assigning self.position = (x, y) directly updates ScriptHost, deleting redundant end-of-frame synchronization passes.
• Attribute-based input API: pite.held.<key>, pite.pressed.<key>, and pite.released.<key> with TypeError on string calls.
• Declarative node descriptors: pite.child("Name") and pite.node("../Path") descriptors with automatic first-access proxy caching.
• Node proxy caching: repeated get_node() lookups are cached in ScriptHost to eliminate tree walks.
• Hybrid signal callbacks: signal.connect() accepts arbitrary Python callables alongside engine-dispatched signals.
• Editor pause-on-error: script exceptions during gameplay automatically pause the editor, log formatted Python tracebacks, and open the failing script.
• Hot reload reliability: continuous editor idle reload, scene reload isolation, Python state and physics velocity preservation, and asset cache invalidation.
• Expanded audio formats: pure-Rust decoding via symphonia brings support for Ogg Vorbis (.ogg), MP3 (.mp3), FLAC (.flac), and extended WAV.
• Download fallback for export: pite export automatically downloads the target platform's pite-player release archive when absent beside the engine binary.
• Standalone and all-platform player release assets: release workflow publishes standalone player bundles for each platform alongside all-platforms player archives.
• Scene file extension is now .ptscn (was .pitescene): editor dialogs and detection, asset-rewrite scans, docs, examples, and scaffolds all follow.
• macOS support (both for editor and games) with cross-compile added.
Download ⬇️
• pite-v0.3.0-linux.tar.gz / pite-v0.3.0-windows.zip / pite-v0.3.0-macos.tar.gz: engine + player binaries (any machine exports for all supported platforms), verified by SHA256SUMS.
• pite-player-v0.3.0-<platform>: standalone player binaries for lightweight deployments and export toolchains.
• Install scripts: install.sh (Linux/macOS) / install.ps1 (Windows) from the repo root.
v0.2.0
Pite v0.2.0
Pite 0.2 adds support for third-party Python packages 🎉 to be used in game scripts and shipped in exports, and there are a lot of other major improvements in this version focusing on Developer Experience at scripting, validating, editing, configuring, and playing Pite games.
Highlights 🔥
Any third-party Python package comes to games
This version brings third-party Python package support into games. A pite vendor command was added so you can manage these dependencies with simple commands. These dependencies are live at the vendor/ directory in the project root, providing the same behavior for both dev runs and exported games. This feature currently supports any pure Python package to be used; and there is a clean architecture for adding support for packages with native extensions, which needs a real request from the community for some specific packages, and we held it here to focus on more important things.
pite check covers imports
Our savior check command now resolves relative, stdlib, and third-party imports inside Python scripts too, to validate they won't lead to ImportError.
More work on windows
Default window size changed to 1280x720 (was 800x600), and both Pite editor and games will run maximized from now on. Resizing a game window doesn't expand what you see from the world anymore; it scales the view to fit the new aspect ratio.
Project Settings window
Project Settings window added to the editor menu bar, allowing you to configure game projects visually.
Modern completion and better LSP
Code completion now triggers as you type and is completely operational with the keyboard; a lot of enhancements under the hood were done so you enjoy autocompletion. LSP warnings are moved to the line numbers gutter so the editor has more space. The warning on import pite for each script was fixed, and get_node() return type updated to Node.
Changes Overview 📜
- Third-party Python packages vendor into the project:
pite vendor add pkg==verdownloads wheels (+ transitive deps) intovendor/, pins versions + hashes in[vendor](list/verify/removemanage the lock). Zipped by default, unpacked for native modules. The runtime putsvendor/onsys.pathin dev and export alike; the export stages it whole;pite checkstays silent for vendored imports. pite checkwarns on third-party imports in game scripts (stdlib +pite+ siblings are fine; exports dropsite-packages).pite runwith no--scenestarts the enclosing project'smain_scene(same rulepite editalready used); outside a project it fails loudly.- Default window size is now 1280x720 (was 800x600): new scaffolds are stamped with it, and sizeless manifests inherit it. The size is the design resolution - the game opens maximized and scales content to fit, keeping aspect, with clicks mapped through the same transform; the editor preview frames the same resolution.
- Editor completion is integrated: it triggers as you type with a cursor-anchored popup, narrows on what you typed, follows the arrow-key selection, and accepts with
Enter(Escdismisses, click works too). - Editor gutter numbers tile the laid-out galley rows exactly, so long files no longer drift out of alignment.
- Editor code pane is a real gutter: line numbers with yellow error rows (hover for the message), click to jump with cursor + focus + scroll.
import piteresolves everywhere: thepite.pyistubs are baked into the editor binary and materialized to a versioned scratch dir when no checkout copy is found,pite.pyships besidepite.pyias the source sibling the checker needs, and theworkspace/configurationanswer carries the requested section value.get_noderesults type-check cleanly as plainNodewith dynamic rest.- Project Settings window (
Project>Project Settings…): edits every known manifest field with shared-validator checks and byte-stable saves; first-everpite.tomlwriter. - Transport controls pinned to the bar's right end; editor and game launch maximized.
Download ⬇️
pite-v0.2.0-linux.tar.gz/pite-v0.2.0-windows.zip: engine + both player binaries (any machine exports for either platform), verified bySHA256SUMS.- Install scripts:
install.sh(Linux) /install.ps1(Windows) from the repo root.
v0.1.1
Pite v0.1.1
Patch release on top of v0.1.0: Timer actually fires, Button.size is scriptable both ways, and pite export / pite check get stricter and cleaner. The public crates (pite-core, pite-project, pite-scene) are live at 0.1.1, versioned lockstep with the engine. Overview of changes:
- Timer fires: engine-owned
timeoutsignal ticks every elapsedwait_time(looping; non-positive waits never fire), withwait_timesynced both ways likeposition/text - Button.size scriptable: readable/writable from scripts through the same proxy/instance/seed/sync channel, typed in
pite.pyi - Export strictness:
pite exportfails loudly outside a project instead of silently exporting the working directory;export.platformsremoved (it was never read) — old manifests still parse with a deprecation warning - Check cleanup: dropped the dead string-signal detector from
pite check(it could never match attribute-style emits); signal safety now comes from pyright stub visibility (timeout/pressedinpite.pyi) - Single source of truth: template scenes derive
format_versionfrom thepite-sceneconst; manifestpite_versiontracks the engine version - See CHANGELOG.md for more information.
Download
- Linux / Windows bundles attached below; verify with
SHA256SUMS - Or via the install scripts:
install.sh/install.ps1
Full Changelog: v0.1.0...v0.1.1
v0.1.0
Pite v0.1
This version is syncing with crates.io, providing exactly same behavior of engine across public crates and engine binary at 0.1.0 version. Following list is an overview of features this version provides:
- Rendering fixes and test proof
- Export completeness:
- Optimized export sizes (hello-word: 20MB on Windows, 52MB on Linux (due to Python stdlib size)
- Cross-platform export supported on both Windows and Linux with no extra downloads (Python is only one-time download at export for each platform)
- Export embeds
pite-player, a prebuilt binary shipped beside engine binary optimized for size and performance
- Input handling Python API for both mouse and keyboard
- Audio player plus Python API
- Warning for orphan-assets in
pite checkcommand, also missing files error with rename detection and fix inpite reimport - Playable running preview inside editor (when mouse is inside Viewport panel)
- File-tree for Assets panel; Distribution, hidden, binary cache ignored from panel
- Nodes:
Button.pressedsignal is declared by engine now
- Improve Viewport sizing
- And other things old versions provide, see CHANGELOG.md for more information.
Download
- Linux / Windows bundles attached below; verify with
SHA256SUMS - Or via the install scripts:
install.sh/install.ps1
Full Changelog: v0.1-m5...v0.1.0