Releases: NCrashed/demiurg
Release list
v0.11.0
Transparency: give voxels a blend mode and opacity, so models, clips, and
procedural effects can be glass, glowing energy, or soft smoke instead of solid.
Requires roxlap 0.17 (per-voxel clip materials + the volumetric blend mode).
Added
-
Per-colour materials. Each colour used in a model gets a blend mode and an
opacity in the tool panel's new "Materials" section, composited live in the
preview:- Alpha — front-to-back glass / water.
- Additive — order-independent glow, for spells / fire / energy.
- Volumetric — depth-weighted opacity, for soft smoke / fog.
Opaque is the default, so an all-opaque model renders exactly as before.
Material edits are undoable (a slider drag is one step) and saved in the
.demiurgproject. -
Clip transparency. A clip carries one material table shared by every
frame; converting a translucent model to a clip keeps its materials. While a
clip is playing, the preview runs through the engine's real clip player so
the transparency matches what the game shows. -
Translucent procedural presets. The Rhai generator gains a
material(col, mode, alpha)call so a script can declare its own materials —
the Smoke preset is now volumetric fog and the Energy preset an
additive-glow sphere.
Notes
- Materials are kept in the lossless
.demiurgproject only; the.kv6and
.rvcexports have no material channel yet, so they load back as opaque (the
same boundary as enclosed interior voxels). Projects saved before this release
load unchanged (all-opaque).
v0.10.0
Bring skeletal animation and voxel clips closer together: bake a rig into a
clip, and ease its motion.
Added
- Bake a rig's animation into a clip. "Bake to clip" (Animate ▸ clips
panel, with a frame-count field) samples a skeletal clip's poses and
rasterizes every bone attachment — static mesh or animated clip layer — into a
voxel-flipbook clip, opened as a new clip document to preview / tweak / export
or drop back onto a bone. The bake matches the viewport exactly (same posing +
voxel placement) and bounds the result to a fixed box (capped at 256³). - Keyframe easing. A skeletal clip can interpolate with an easing curve —
Linear, In, Out, or In-out — chosen per clip in the Animate panel, for smooth
motion instead of the engine's robotic linear blend. The curve is saved with
the rig (.rkc/.demiurg), shows live in the preview, and is carried into a
bake.
Fixed
- A bone whose primary attachment is an animated clip but that also carries a
static-mesh extra no longer draws that extra twice in the posed-rig preview.
v0.9.0
Procedural clips: script a flame, smoke, or energy effect instead of sculpting
it frame by frame.
Added
- Procedural clip generator (Rhai). A clip can be driven by an embedded
Rhai script that fills its frames — ideal for dynamic
effects that are tedious to animate by hand:- Imperative API — the script body runs once per frame with globals
(frame,frames,t,w/h/d) and flat helpers:set/get,
sphere,box,rgb/hsv, a stablenoisefield, fractalfbm, and a
per-framerand. - Presets — Flame, Smoke, Energy, Plasma, and Sparkle, loadable as a
starting point (and a live API example). - Editing — a floating, syntax-highlighted script window with an API
cheat-sheet, frame-count and seed controls, and an Auto toggle that
regenerates a short moment after edits settle for a near-live preview. - Deterministic & safe — the same seed yields the same clip; scripts are
sandboxed (no I/O) and capped against runaway loops. - The script + parameters are saved in the
.demiurgproject; a procedural
clip exports to.rvc(and drops onto bones as a clip layer) like any other.
- Imperative API — the script body runs once per frame with globals
v0.8.0
Animated voxel clips: author "GIF/MP4 for voxels" as their own documents, and
hang them off bones as animated layers.
Added
- Animated voxel clips (
.rvc) — a new document type. A clip is a flipbook
of voxel frames, sculpted with the usual tools and rendered by the engine:- Frames — add / duplicate / delete / reorder, each with its own duration
(or a clip-wide default), plus a loop mode (loop / once / ping-pong). - Playback — play / pause and step with
Space/,/., scrub a
bottom frame timeline; the playhead and the edited frame are one, so you
stop on any frame and sculpt it. - Onion-skinning — ghost the previous (cool) and next (warm) frames while
sculpting, so motion registers; the ghosts are never picked or edited. - Crop warning — when the bounding box dwarfs the content the clip warns
and offers a crop-to-content that tightens every frame at once. - Files — New clip, Open / Export
.rvc(the engine's clip codec), and
lossless.demiurgclip projects that keep every frame's interior voxels.
- Frames — add / duplicate / delete / reorder, each with its own duration
- Clips as bone layers. Any bone attachment — a bone's base mesh or an extra
layer — can be an animated clip instead of a static mesh:- Author in place — "To clip" turns the current mesh into a clip (its
first frame), "+ Clip layer" adds an empty one, and "Import .rvc" drops an
authored clip onto the bone; selecting a clip layer brings up the full clip
editor (frames, timeline, onion-skin) to sculpt it inside the rig. - Plays on the posed rig — a clip layer animates in the Animate preview
along the rig's playhead, with per-layer speed and phase so the same
clip can run fast on one bone and slow / offset on another. - Round-trips through
.rkc(the engine character container) and
.demiurg; clip layers show their frame count in the Layers list.
- Author in place — "To clip" turns the current mesh into a clip (its
- Select all —
Ctrl+Aselects every occupied voxel of the current model
and switches to the Select tool, ready to delete / copy / move.
v0.7.0
Layers: build a bone out of several meshes, each sculpted, placed and named on
its own.
Added
- Layers — multiple meshes per bone. A bone can now carry several meshes (a
base mesh plus extra layers), each one:- sculpted on its own — pick the active layer in the Layers panel and the
voxel tools edit it; - placed by its own offset — translate / rotate / scale it numerically, or
drag it against the posed bone with "Move layer" (Skeleton mode); - named — rename it in the panel (names are saved with the project);
- drawn together in the Skeleton / Animate preview.
- sculpted on its own — pick the active layer in the Layers panel and the
- Extract to layer — carve the current selection into a new layer on the
same bone (it stays exactly where it was), the layer counterpart of "Extract
to bone". - Copy / paste across bones and layers — copying voxels from one mesh and
pasting into another (a different bone, or a layer) now lands the paste inside
the target instead of off its edge.
Changed
- Bumped roxlap to 0.15.0 — its animated-voxel-clips character container and
renderer are what layers build on (a bone's layers map to the engine's
per-bone attachment list).
v0.6.0
Rigging quality-of-life: slice a model into a skeleton faster, place each bone's
pivot where it belongs, and bring reference art in from anywhere.
Added
- Extract a selection into a child bone — in a rig's Sculpt mode, select a
region and "Extract to bone" carves it out of the current mesh into a new child
bone, left exactly where it was. Its joint defaults to the centre of the cut,
so it rotates about where it joins (a shoulder / hip). The fast way to slice a
whole model into a skeleton. - Edit a bone's mesh pivot in Skeleton mode — the point a bone's mesh sits on
and rotates about is now editable while the skeleton is in view: numeric X/Y/Z
fields + Center, or a "Move pivot" toggle to drag the mesh against its joint. - Rotate the selection 90° — a Rotate panel turns the selected voxels a
quarter turn clockwise or counter-clockwise about a chosen X/Y/Z axis. The
result floats so it can be nudged into place before it settles. - Paste a reference image from the clipboard (
Ctrl+V, or the Reference
panel button) — copy an image in a browser or any app and paste it straight in
as a tracing guide, since a browser can't drop one onto the window. - Scale a reference image — a Scale control sizes a guide to the model
without re-importing it.
Fixed
- A bone's voxels could suddenly be replaced by another bone's (most visibly an
extracted bone reverting to the one it was cut from) when the background
autosave fired while a different bone was selected in Skeleton or Animate.
v0.5.0
Skeletal animation (preview): rig a model into bones and animate it with
keyframes, posed right in the viewport and saved to roxlap's .rkc rigged-
character format. Formats and UI may still change.
Added
- Skeletal animation editor — build a rigged character (a skeleton of bones,
each carrying its own voxel mesh) and animate it:- Rig a model: File ▸ New rig (one root bone) or Convert to rig (wrap the
current model). Bones can be added, duplicated, reordered and deleted, with
3-axis ball joints and a dummy root for full-body motion. - Three sub-modes: Sculpt (edit the active bone's mesh with the usual voxel
tools), Skeleton (set each bone's joint / parent / rotation axis, or drag a
bone in the viewport to place it), and Animate (preview and pose the clip). - Pose in the viewport: click a bone to select it, then left-drag to
transform it on the selected keyframe —R/G/Sswitch the gizmo
between rotate (trackball / ring), move and scale. Each keyframe stores a
full per-bone transform (translation + rotation + scale). - Timeline (bottom bar): play / pause with
Space, step keyframes with
,/., add / delete / copy / cut / paste keyframes, and drag a tick to
retime it; a pose inspector edits the selected key's move / rotate / scale
numerically. - Clips (left panel): add, rename and delete animation clips, set each
clip's length, and toggle whether it loops. - Export to
.rkc(File ▸ Export character); a.demiurgproject stores
the full rig too, and opening or dropping a.rkcloads it.
- Rig a model: File ▸ New rig (one root bone) or Convert to rig (wrap the
- Recent files: File ▸ Open recent reopens a recently used document, and the
file dialog now remembers the last folder you used. - The menu bar shows a build stamp —
demiurg <version> · <commit>— so you
can tell which version and git commit a binary was built from (selectable to
copy into a bug report). Source-tarball builds with no git showunknown.
Changed
- Bumped roxlap to 0.13.0, which adds the
roxlap_formats::characterrigged-
character container (per-keyframe translation + rotation + scale) the
animation editor builds on.
Fixed
- Editing a rig or animation now marks the project unsaved (the title
*and
the quit guard), so posing / keyframing work can't be lost by quitting a
document that still looked saved.
v0.4.0
Reference images: trace voxels over loaded pixel art, drawn in the viewport as a
flat, depth-tested guide on roxlap 0.12's world-placed image sprites.
Added
- Reference images: load pixel art (PNG / BMP / JPG / GIF / TGA / WEBP) as a
flat guide to trace voxels from — via File ▸ Open reference image or by
dragging an image onto the window. It's non-destructive (never
saved/exported/edited): place it on the Front / Side / Top plane, set its
depth, flip it, hide it, or remove it. The Reference panel's Move toggle
lets you drag it into position on the grid with the mouse (left-drag slides it
in its plane, whole-voxel snap). It's drawn as a flat, world-placed image
sprite (roxlap 0.12draw_images), so the model occludes the parts behind it
and it stays undistorted from any angle, with an Opacity slider to dim a
too-bright reference to a faint guide. The eyedropper (the tool, orCtrl
+click from any tool) picks colours straight off the reference image —
whichever of the model voxel or the reference is nearer the cursor wins.
Dropping a.kv6/.vox/.demiurgfile opens it as the model. The tool
panel now scrolls so every section stays reachable.
Changed
- Bumped roxlap to 0.12.0, for the world-placed 2D image sprites
(SceneRenderer::upload_image/draw_images) that draw reference images.
v0.3.0
MagicaVoxel .vox interop, and the CPU renderer is now the default to dodge a
Windows GPU-init hang.
Added
- MagicaVoxel
.voximport and export (File ▸ Open .vox / Export .vox, and a
.voxpath argument). Import uses thedot_voxparser (handles real-world
files) and takes the first model; export writes a single model. The height
axis is flipped between MagicaVoxel's z-up and demiurg's z-down so models stay
upright, and colours map through a 256-entry palette..voxhas no pivot, so
import centres it.
Fixed
- The 0.2.0 white-window fix wasn't enough: on some Windows GPUs/drivers wgpu
device creation itself hangs (before the first frame), which a synchronous
call can't be timed out of. The CPU renderer is now the default (reliable
everywhere); the GPU backend is opt-in via--gpuorROXLAP_GPU=1(--cpu/
ROXLAP_GPU=0force CPU).
v0.2.0
Editing and save quality-of-life: voxel-edge readability, a proper Save / Save
As flow, non-blocking file I/O, and crash-recovery autosave.
Added
- Voxel-edge overlay (View ▸ Voxel edges, on by default): a light wireframe on
exposed voxel faces so boundaries read even on flat-shaded faces in shadow,
where coplanar voxels would otherwise blend into one patch (there is no
ambient occlusion / light baking). - Save / Save As for the project:
Ctrl+Soverwrites the open.demiurgfile
without a dialog once its path is known; Save As picks a new path. The kv6 and
vxl menu entries are now labelled Export. - File I/O no longer freezes the window (which the OS would flag as hung and
offer to kill, losing the model): the open/save dialogs run on a worker
thread off the event loop, and saves serialize/write on a worker thread
too, with a "Saving…" spinner. - Background autosave: while there are unsaved changes the project is snapshotted
to the OS temp dir every 20 s; on the next launch a surviving autosave (after a
crash) is loaded automatically with a "Recovered work" banner. A clean exit
removes it.
Fixed
- Startup could open a white, frozen window on some Windows GPUs/drivers/remote
sessions: the forced Fifo (vsync) present mode could stallpresent()
indefinitely. Present is now uncapped — the ~60 fps frame timer already caps
GPU load — and--cpuwas added as an escape hatch (alongsideROXLAP_GPU=0)
when GPU device creation itself hangs. - Place tool: when the cursor ray hits no voxel it now falls back to the model's
floor (the volume's bottom face), so you can seed voxels — and rebuild a model
emptied of its last voxel — instead of having nothing to click.