Repository navigation
This new Ceramic release changes how visuals get displayed: they are now explicitly mounted on the screen or on a render texture. It also brings an updated CRT mode for pixel art, gamepad labels, thread affinity, better arcade collisions with tilemaps, runtime LDtk auto-layers, Android crash symbolication, faster mesh batching, and several fixes on the GC and backends.
Changelog
Breaking Changes
- Runtime: Visuals are no longer rendered by default. A visual without parent is now only updated, rendered and hit-tested once it is mounted with
screen.add(visual)(orvisual.renderTarget = screen), or added to a render texture withrenderTexture.add(visual). Visuals with a parent follow their parent as before, and scenes keep working the same way. In debug builds, a warning lists the active visuals that are never displayed, with their creation site, to help migrate existing code (disable it withceramic_no_debug_unmounted_visuals) - Spine:
SpineMontageno longer adds its spine to the screen by itself, mounting it (withscreen.add()or a parent) is left to the caller - Runtime: Entities using
@:structInitwithout an explicit constructor now fail early with a readable Haxe error (the compiler-generated constructor callssuper()without the parent's optional arguments), instead of an obscure C++ compilation failure
New Features
- Shade/PixelArt: Updated CRT mode for the
PixelArtfilter, with presets and a continuousbeamAmountsetting, backed by a newPixelArtCrtdisplay simulation shader (works on Unity too) - Runtime: New
GamepadLabelsandInput.gamepadLabels()to show the right button labels to the player (Xbox, PlayStation, Nintendo), whileGamepadButtonstays positional on every backend - Runtime: New
GamepadButton.TOUCHPADfor PlayStation gamepads on every backend - Runtime: New
Runner.setThreadAffinity()to run a thread on the slow or fast cores of devices with heterogeneous cores (Android, Linux, iOS and macOS) - Runtime: New
settings.cursorVisibleto show or hide the mouse cursor on every backend - Runtime: New
Input.keyCodeForScanCode()to get the key code of a scan code with the current keyboard layout - Runtime: Render textures now have
translateXandtranslateY - Arcade: Fast bodies are now swept against tilemaps in several steps so they no longer skip past tiles in one frame, bodies still embedded in a full tile are pushed out through its nearest exposed face, and a body can collide with several tilemaps in one sweep. Both behaviours can be toggled with
sweepTilemapsandescapeFullTiles - Arcade: New
useVisualScaleoption onVisualArcadePhysicsto keep the body at the visual's unscaled size, so squash and stretch animations do not change the collision box - LDtk: Auto-layers can be recomputed at runtime, using the new
ldtk.rulesengine shared with the LDtk Haxe API (deterministic across targets). Also readspatternAlt,tileRectsIds, random tile flips and level seeds - Android: New
ceramic android crashcommand that collects the native crashes of the app from the connected device and symbolicates them with the archived symbols of each build (use--hangto get the stacks of a stuck app) - ImGui: The layout is persisted through
PersistentData, and DockBuilder plus ini settings control are now exposed on all targets - ImGui: Ranged font loading for icon fonts, and clipboard support on the web target
- Shade: New
@shadeclass options (mode, precision), and haxe shaders are now compatible with hot reload
Improvements
- Tools: Plugins no longer require a
using ceramic.SomePlugin;statement to be enabled - Rendering: Meshes are sent with their own indices and each vertex is written once per batch. Interleaved vertex data is uploaded once per batch instead of once per extra attribute, with power of two sizes so the driver reuses its storage
- Tilemap: A layer is only rebuilt when its clipped cells change, and the tileset, texture, size and uvs of each gid are cached when building tile meshes
- Tilemap: LDtk tileset pixels are read back to detect empty and opaque tiles
- Clay/HXCPP: Several fixes to the concurrent GC (rescan of closures, iterators and array copies during a concurrent cycle, safer block release and shadow slab handling) and faster lookup of large objects during the conservative stack scan
- Android: Symbols of each build are archived, and Android libraries now embed a build id
- Android: Clay java files of existing projects are updated along with the SDL ones
- Unity: Generated shaders are copied to the configured Unity project
- UI: Unmounted views are skipped in the layout pass and laid out when they get mounted
- Runtime: More robust filter coordinate conversion
- Tools:
gen/is ignored in new projects, as it is fully regenerated by the build, and a first build withoutgen/now succeeds - Tools: Generated data classes have a deterministic field order
- Shade: Use
highpas the default fragment precision - Updated reflaxe with several bug fixes
Bug Fixes
- Runtime: Fix minor low level memory leaks in clay and hxcpp
- Runtime: Keep a filter's content hidden until its render texture exists
- Runtime: Keep an outgoing root scene hidden when the scene filter changes
- Runtime: Listen to backend input events as soon as the backend is ready
- Windows: Fix build failing on
linc_simd.cpp(#175) - Clay: Skip empty mesh parts instead of taking the address of an empty array
- Clay: Unbind a texture uniform when it is set to null
- Clay: Remove the resize overlay when the size settles back unchanged
- Web: Keep Nintendo gamepads positional when the browser mapping is standard, stop cutting right button drags with a simulated mouseup, and stop discarding small wheel deltas
- Android: Load audio assets from their SDL3 scheme paths
- Unity: Reset the gamepad axis cache when a gamepad is enabled or disabled, call the
screenshotToPngcallback once the file is written, and keep the camera size as floats when mapping render textures - ImGui: Clear keys when the window loses focus, resync modifier keys on web wheel events, use macOS conventions on mac web hosts, and make the new context current when restarting play mode on Unity
- ImGui: The font atlas now owns its TTF copy, and the text filter rebuilds its terms when its text is assigned from outside
- Spine: Rebind hot-reloaded textures on every visual, mounted or not
- Shade: Keep the content alpha in the pixel art shaders, and wrap scanline and mask offsets modulo 2
- Ase: Forward entity arguments of
AsepriteDataproperly - Tools: Fix temporary files written to the project root on Linux
- Mac: Release the keychain objects of the certificate lookup
Full Changelog: v2.2.1...v2.3.0