Skip to content

Ceramic v2.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Oct 18:34
· 73 commits to master since this release

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) (or visual.renderTarget = screen), or added to a render texture with renderTexture.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 with ceramic_no_debug_unmounted_visuals)
  • Spine: SpineMontage no longer adds its spine to the screen by itself, mounting it (with screen.add() or a parent) is left to the caller
  • Runtime: Entities using @:structInit without an explicit constructor now fail early with a readable Haxe error (the compiler-generated constructor calls super() without the parent's optional arguments), instead of an obscure C++ compilation failure

New Features

  • Shade/PixelArt: Updated CRT mode for the PixelArt filter, with presets and a continuous beamAmount setting, backed by a new PixelArtCrt display simulation shader (works on Unity too)
  • Runtime: New GamepadLabels and Input.gamepadLabels() to show the right button labels to the player (Xbox, PlayStation, Nintendo), while GamepadButton stays positional on every backend
  • Runtime: New GamepadButton.TOUCHPAD for 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.cursorVisible to 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 translateX and translateY
  • 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 sweepTilemaps and escapeFullTiles
  • Arcade: New useVisualScale option on VisualArcadePhysics to 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.rules engine shared with the LDtk Haxe API (deterministic across targets). Also reads patternAlt, tileRectsIds, random tile flips and level seeds
  • Android: New ceramic android crash command that collects the native crashes of the app from the connected device and symbolicates them with the archived symbols of each build (use --hang to 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 @shade class 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 without gen/ now succeeds
  • Tools: Generated data classes have a deterministic field order
  • Shade: Use highp as 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 screenshotToPng callback 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 AsepriteData properly
  • 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