Twizel Engine · Development update

From five materials to a scene you can author.

Twizel now joins its path tracer to a scene editor, mesh acceleration, saved cameras and an animated woodland cottage.

Results

Validation record of 13 September 2026 (UTC): 50 CPU tests and 45 browser tests pass, and the TypeScript check and production build succeed.

Twizel's woodland cottage, rendered September 12, 2026 at 64 samples per pixel. A retained cinematic frame, not a real-time performance claim.
Twizel's woodland cottage, rendered September 12, 2026 at 64 samples per pixel. A retained cinematic frame, not a real-time performance claim.

Make the renderer editable

Twizel began on 8 September as a material lab: five materials under one shared light field. The current workspace has a scene hierarchy, a viewport, material assets and a component inspector.

Around them, these tools turn the material lab into an authoring workflow:

  • Primitive creation and object selection.
  • Transforms and grouping, with undo.
  • Saved cameras.
  • Versioned scene files that keep geometry, materials, camera views and optional stage settings.
The first Twizel page: a light-themed material lab with walnut, copper, glass, blue ceramic and aluminum spheres on stone pedestals, and an inspector for the selected Walnut material.
Before, 8 September. Material lab 0.1, the project's README image as of 8 September: five materials, one shared light field, 512 samples per pixel.
The dark-themed Twizel scene workspace: a hierarchy listing the floor, pedestals, five spheres and a camera; the spheres rendering in the viewport; material swatches in an Assets dock below; Walnut's identity, transform and material properties in the inspector.
After, 13 September. The same five materials as a scene: hierarchy, viewport, Assets dock and component inspector. Browser-test capture from the 13 September (UTC) validation run, 24 samples per pixel.
A single grainy gray box in an otherwise empty scene, with red, green and blue arrow handles for the X, Y and Z axes.
Move gizmo. A new box with its axis handles. The test drags along each axis, checks that each drag is one undo step, and cancels a drag with Escape. Same validation run.
A small scene of a ground plane, a brown box and a metallic sphere, the three objects listed in the hierarchy and the ground plane selected in the inspector.
Saved and loaded back. A plane, box and sphere built from primitives, saved to a scene file and reopened; the test checks that the reloaded scene renders identically. The ground's odd name checks that object names show as plain text. Same validation run, 8 samples per pixel.

Build a scene with motion and light

The woodland cottage preset combines window lighting, moving foliage, a flowing stream and an authored camera shot.

Triangle meshes use a bounding-volume hierarchy, which fixed-topology animation can refit.

The cottage at dusk in the editor viewport, its windows lit and a stream beside it. The hierarchy lists cottage parts, tree trunks and wind leaves; the Scene settings panel shows denoising, light sampling and a light named Blue dusk canopy.
The cottage in the editor. Browser-test capture from the 13 September (UTC) validation run, 4 samples per pixel: named meshes grouped in the hierarchy, Scene settings open on lighting and motion, and the shot timeline under the viewport. The status bar counts 19,292 triangles.

Clean enough to inspect

Spatial denoising and weighted stage-light selection help make the scene practical to inspect. Both are scene settings that save with the scene, and the cottage preset turns both on.

In the 12 September quality run, at an equal 32 samples per pixel, weighted selection with denoising reduced the error against a 1,024-sample reference by these amounts, compared with uniform selection and no denoising:

Shot timeTone-space error reductionLinear error reduction
0 s61.8%9.8%
4 s62.5%12.4%
8 s60.4%13.9%
The cottage at dusk with speckled noise across the grass, walls, roof and trees.
Uniform, raw. Uniform light selection, no denoising, 32 samples per pixel, 4 seconds into the shot. A 320 × 180 render from the 12 September quality run, shown at twice size.
The same cottage view with much smoother grass, walls and roof, a little grain left on thin edges.
Weighted, denoised. Contribution-weighted light selection with edge-aware denoising: same samples, frame and run.

The comparison holds the sample count equal. It makes no claim about equal render time or about image quality in general, and the 1,024-sample reference is itself noisy. Some grain stays on thin foliage, edges and reflections, where the filter leaves pixels raw.

Retain the limits with the result

The retained 13 September validation record, the source of the editor captures above, reports 50 CPU and 45 browser tests plus the production build.

The movie frame at the top of this page was rendered on 12 September at 64 samples per pixel, before the later geometry optimizations. It is an engine render, not a real-time frame-rate demonstration.

What's next

  • Asset-file import.
  • Reusable assets.
  • Instancing.
  • UV mapping.
  • A full game runtime.

What I learned

A renderer needs reproducible scenes as much as attractive images. Keeping source snapshots, test fixtures and capture settings makes it possible to tell an editor improvement from a transport regression or an unfair performance comparison.

Sources & development context

Twizel Engine README; docs/editor-workspace.md, scenes.md, woodland-stage.md, geometry.md and godot-performance.md; retained validation 2026-09-13T00-51-57-401Z. Image: Twizel's own 64-spp cottage shot, 2026-09-12T19-57-17-991Z-hardware-requested, frame-00000.png. No Godot comparison image is used as Twizel output. Figures: docs/preview.png (the README capture as of 8 September); browser-test captures from validation 2026-09-13T00-51-57-401Z (editor docks, move gizmo, authoring, woodland stage); quality run 2026-09-12T19-50-31-650Z-hardware-requested (4-second frame, uniform raw and weighted filtered, 32 spp), with the error reductions from its comparison.json and docs/denoising.md.

All Twizel Engine posts