Skip to content

Releases

v0.3.0

Choose a tag to compare

@mkh-user mkh-user released this 02 Nov 14:13

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: CharacterBody2D with built-in move_and_slide() obstacle response and contact flags (is_on_floor(), is_on_wall(), is_on_ceiling()), RigidBody2D with dynamic forces (apply_force, apply_impulse), and StaticBody2D for solid level geometry.
  • Colliders & Triggers: CollisionShape2D supports box, circle, and capsule geometries with interactive editor wireframe visualization. Area2D provides 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:

  • Vec2 Math 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 += 10 or assigning self.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>, and pite.released.<key> (e.g. pite.held.right, pite.pressed.space), rejecting old string calls with clear errors.
  • Declarative Descriptors & Proxy Caching: pite.child("Name") and pite.node("../Path") descriptors cache node lookups on first access, while ScriptHost caches 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 in sys.modules.
  • Scene Isolation: Touching unrelated .ptscn files no longer triggers unnecessary scene rebuilds.
  • Asset Invalidation: Modifying .png textures or .atlas.json spritesheets 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 check validates 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 export now automatically downloads the target platform's pite-player release 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.
  • .ptscn Scene 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

Choose a tag to compare

@github-actions github-actions released this 12 Oct 16:01
6950be3

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==ver downloads wheels (+ transitive deps) into vendor/, pins versions + hashes in [vendor] (list/verify/remove manage the lock). Zipped by default, unpacked for native modules. The runtime puts vendor/ on sys.path in dev and export alike; the export stages it whole; pite check stays silent for vendored imports.
  • pite check warns on third-party imports in game scripts (stdlib + pite + siblings are fine; exports drop site-packages).
  • pite run with no --scene starts the enclosing project's main_scene (same rule pite edit already 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 (Esc dismisses, 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 pite resolves everywhere: the pite.pyi stubs are baked into the editor binary and materialized to a versioned scratch dir when no checkout copy is found, pite.py ships beside pite.pyi as the source sibling the checker needs, and the workspace/configuration answer carries the requested section value.
  • get_node results type-check cleanly as plain Node with dynamic rest.
  • Project Settings window (Project > Project Settings…): edits every known manifest field with shared-validator checks and byte-stable saves; first-ever pite.toml writer.
  • 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 by SHA256SUMS.
  • Install scripts: install.sh (Linux) / install.ps1 (Windows) from the repo root.

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 11 Oct 12:33
461c344

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 timeout signal ticks every elapsed wait_time (looping; non-positive waits never fire), with wait_time synced both ways like position/text
  • Button.size scriptable: readable/writable from scripts through the same proxy/instance/seed/sync channel, typed in pite.pyi
  • Export strictness: pite export fails loudly outside a project instead of silently exporting the working directory; export.platforms removed (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/pressed in pite.pyi)
  • Single source of truth: template scenes derive format_version from the pite-scene const; manifest pite_version tracks 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 07:46
db61b1b

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 check command, also missing files error with rename detection and fix in pite 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.pressed signal 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