| .. | ||
| Models | ||
| Box.png | ||
| brick.ktx2 | ||
| brick.png | ||
| brickEmissive.png | ||
| brickMetalRough.png | ||
| brickNormal.png | ||
| crackle.wav | ||
| crate.png | ||
| games.dat | ||
| hills.png | ||
| maskFade.png | ||
| README.md | ||
| scene2.singe | ||
| scene3.singe | ||
| scene4.singe | ||
| scene5.singe | ||
| scene6.singe | ||
| scene7.singe | ||
| scene8.singe | ||
| scene9.singe | ||
| scene10.singe | ||
| scene11.singe | ||
| scene12.singe | ||
| scene13.singe | ||
| scene14.singe | ||
| scene15.singe | ||
| scene16.singe | ||
| scene17.singe | ||
| scene18.singe | ||
| scene19.singe | ||
| scene20.singe | ||
| scene21.singe | ||
| scene22.singe | ||
| scene23.singe | ||
| scene24.singe | ||
| scene25.singe | ||
| scene26.singe | ||
| scene27.singe | ||
| scene28.singe | ||
| scene29.singe | ||
| scene30.singe | ||
| scene31.singe | ||
| scene32.singe | ||
| scene33.singe | ||
| scene34.singe | ||
| scene35.singe | ||
| scene36.rcss | ||
| scene36.rml | ||
| scene36.singe | ||
| scene37.singe | ||
| scene38.rml | ||
| scene38.singe | ||
| scene39.singe | ||
| scene40.rcss | ||
| scene40.rml | ||
| scene40.singe | ||
| scene41.rcss | ||
| scene41.rml | ||
| scene41.singe | ||
| scene42.rcss | ||
| scene42.rml | ||
| scene42.singe | ||
| scene43.rcss | ||
| scene43.rml | ||
| scene43.singe | ||
| scenetest.singe | ||
| sky.png | ||
Test scripts
The Lua scripts used to verify the 3D scene and physics work, one per stage of PLAN.md sections 18 and 19, with everything they load: the Khronos Duck, Fox, BoxAnimated, AnimatedMorphCube and Sponza sample models under Models/, Box.png and crate.png. The disc and the font are the engine's own, addressed as Singe/menuBackground.mkv and Singe/FreeSansBold.ttf like any engine asset. This directory is a complete Singe game directory. Run one from the singe directory with
.builddir/Singe-v3.00-Linux-x86_64 -w -d data -v Singe/menuBackground.mkv testScripts/scene6.singe
(scene12 and scene20 have no disc: give them -C 720x480 instead of -v)
or pack it (singe --pack testScripts testScripts.game) and run an entry with --entry N (the numbers follow games.dat). Every script takes a screenshot or two and quits by itself; the results are in screenshots/.
| Script | Entry | Stage | What it shows |
|---|---|---|---|
| scenetest.singe | 1 | 18.1 | The 3D layer: a translucent colour over the disc, text on top |
| scene2.singe | 2 | 18.2 | Primitives, materials, lights, camera, sceneProject label |
| scene3.singe | 3 | 18.3 | glTF models: two Ducks, BoxAnimated, loose and packed |
| scene4.singe | 4 | 18.4 | Node animation at three speeds, one paused |
| scene5.singe | 5 | 18.5 | Skinning: three Foxes in Survey, Walk and Run |
| scene6.singe | 6 | 18.6 | The disc and a loaded video as materials, sceneUnproject |
| scene7.singe | 7 | 18.6b | Shadows: sun, sun and spot together, a point light inside |
| scene8.singe | 8 | 18 | An arcade cabinet from primitives with the disc on screen |
| scene9.singe | 9 | 19.2 | Physics: a crate stack, a ball, a kinematic paddle |
| scene10.singe | 10 | 19.3 | Physics: a trigger volume, collision callbacks, a raycast pick |
| scene11.singe | 11 | 19.4 | Physics: a hull down a ramp, a mesh torus, hinge, ball and slider joints |
| scene12.singe | 12 | 19.6 | 2D physics drawn with sprites; runs with no GPU (SDL_GPU_DRIVER=nothing) |
| scene13.singe | 13 | 18.8 | Morph targets: the AnimatedMorphCube, animated and driven from script |
| scene14.singe | 14 | - | The solid tangram dragon (Models/DragonModel.glb, a copy of assets/DragonModel.glb) turning under a sun with shadows |
| scene15.singe | 15 | - | The Singe logotype as solid letters (Models/SingeText.glb, a copy of assets/SingeText.glb) turning under a sun with shadows |
| scene16.singe | 16 | - | The dragon perched on the logotype, both models under one parent node, turning together |
| scene17.singe | 17 | 20.1 | 2D particles: fireworks, a smoke trail, sparks off a 2D physics ball; runs with SDL_GPU_DRIVER=nothing |
| scene18.singe | 18 | 20.2 | 3D particles: torch flame and smoke on a post, a fountain, dust, over the disc with shadows |
| scene19.singe | 19 | 21.1 | Character controller: the Fox on a course of stairs, a ramp, a jump, a crate, a wall and a steep slope |
| scene20.singe | 20 | 21.2 | Character controller in 2D: a sprite platformer (gap, step, wall, ledge); runs with SDL_GPU_DRIVER=nothing and -C 720x480 |
| scene21.singe | 21 | 22.1 | Point-light shadows inside geometry: a bulb under a shade and a bulb in a cage, in a closed room of outward-facing boxes, inside and outside views |
| scene22.singe | 22 | 23.1 | Vehicles: a car from primitives on a ramp track, driven by a scripted route with a chase camera |
| scene23.singe | 23 | 23.2 | Vehicles: a tank that pivots and climbs, and a motorcycle that leans through a turn |
| scene24.singe | 24 | 24.1 | Water: a pool and a river; crates float, sink and drift, the Fox swims across, a raft drives |
| scene25.singe | 25 | 25.1 | Ragdolls: a running Fox crumples at a wall, one falls down stairs, one lies under motor strength |
| scene26.singe | 26 | 26.1 | Soft bodies: a flag, a sheet catching a crate, a swinging rope, a balloon |
| scene27.singe | 27 | - | The Khronos Sponza atrium (Models/Sponza.glb, 18 MB: textures compressed to KTX2 with util/compressTextures.py --etc1s, then packed with util/packGlb.py; 99 MB of texture memory instead of 393 MB) under a sun with cascaded shadows, lit from above by a sky (sky.png) in place of a flat ambient, fog down the nave, the ACES tone curve, six braziers with flame, smoke and dust particles, each crackling in place (crackle.wav from util/makeCrackle.py); no disc, -x 1280 -y 720 -C 1280x720 (screenshots/sponza-nave, -atrium, -gallery and -columns.png are the four stops at 2560x1920) |
| scene28.singe | 28 | - | Materials: roughness and metallic sphere rows before a brick wall with normal, emissive and metallic-roughness maps (brick*.png), each stop a different exposure and tone curve; no disc, -x 1280 -y 720 -C 1280x720 |
| scene29.singe | 29 | - | Animation blending: a Fox crossfading Walk to Run, one walking with Survey on a layer masked to its neck, one easing out of a ragdoll into Survey; no disc, -x 1280 -y 720 -C 1280x720 |
| scene30.singe | 30 | - | Sky and fog: the dragon on its plate and metal spheres under an equirectangular sky (sky.png from util/makeSky.py) lighting the scene, fog down an avenue of posts; no disc, -x 1280 -y 720 -C 1280x720 |
| scene31.singe | 31 | - | Culling and instancing: 400 dragons on a plain, the overlay reporting sceneGetStats and the frame time at four stops; no disc, -x 1280 -y 720 -C 1280x720 |
| scene32.singe | 32 | - | Bloom and views: a monitor showing a security camera's view of the Fox, a rear-view panel from a camera on the Fox, a lamp glowing with bloom, a name tag and icon billboarded over the Fox and a fixed text sign; no disc, -x 1280 -y 720 -C 1280x720 |
| scene33.singe | 33 | - | Navigation: a mesh baked from Sponza's geometry, the path along the nave marked with posts, six Foxes wandering between random points as crowd agents; no disc, -x 1280 -y 720 -C 1280x720 |
| scene34.singe | 34 | - | Terrain: hills from hills.png (util/makeHills.py) with a tiled brick texture from a KTX2 file (brick.ktx2), the dragon placed by terrainGetHeight, crates tumbling on the height field body; no disc, -x 1280 -y 720 -C 1280x720 |
| scene35.singe | 35 | - | Physics debug drawing: physicsSetDebug(DEBUG_ALL + DEBUG_STATIC) over crates, a ball, a hinged bar and a walking player, a ray cast drawn with lineDraw and the baked navigation mesh with navDraw; no disc, -x 1280 -y 720 -C 1280x720 |
| scene36.singe | 36 | 45.1 | GUI over the disc: an RmlUi document (scene36.rml, scene36.rcss over the shipped Singe/gui.rcss) in a GUI the size of the overlay, composited with guiDraw; a nine slice panel from crate.png, a scrolling list, a progress bar animated from RCSS, and a line rewritten each frame with guiSetValue |
| scene37.singe | 37 | 45.2 | GUI on a material: the scene36 document on scene6's arcade monitor through materialSetGui (unlit), a glass ball in front, and the same GUI drawn small over the overlay with guiDraw |
| scene38.singe | 38 | 45.3 | GUI input: a form (text field, slider, select, checkbox, buttons) in a GUI that takes input, guiSetHandler callbacks for click and change, guiSetValue and guiGetValue on the fields; headless it presses Start through RmlUi's Lua API |
| scene39.singe | 39 | 45.4 | GUI pointed at: sceneProbeGui asked for the GUI pixel under the projected corners and centre of the 3D monitor (must match the GUI's corners) and under a point off it (nil); the same probe routes the mouse and light gun to a GUI on a surface |
| scene40.singe | 40 | 46.1 | GUI clip masks: scene40.rml over the disc with a rounded list (border-radius, overflow-y auto) whose rows are clipped to the corners, a panel rotated 8 degrees with overflow hidden and a block larger than it inside, and a rounded child inside a rounded parent (nested masks); the list scrolls through RmlUi's Lua API between the two screenshots |
| scene41.singe | 41 | 46.2 | GUI layers: scene41.rml over the disc with two overlapping opaque squares under filter: opacity(0.5) (the overlap must stay as light as the rest) beside the same pair under the opacity property (it darkens), a panel cut out by mask-image: image(maskFade.png), a group inside a group, and a box-shadow without blur that RmlUi renders through a layer saved as a texture; the script drops the group to opacity(0.25) between the two screenshots |
| scene42.singe | 42 | 46.3 | GUI filters: scene42.rml over the disc with a panel under filter: blur(6dp), text under drop-shadow, a row of squares through grayscale, sepia, invert, hue-rotate(90deg) and saturate(3) beside an unfiltered one, a panel with a soft box-shadow, and a panel under blur(40dp) (the downscaled path); guiGetStats() printed at each screenshot, and both blurs narrowed through RmlUi's Lua API between the two |
| scene43.singe | 43 | 46.4 | GUI gradients: scene43.rml over the disc with a three-stop linear-gradient panel, a radial-gradient disc, a conic-gradient wheel (its starting angle turned through RmlUi's Lua API between the two screenshots), a repeating-linear-gradient stripe, a twenty-stop gradient that trips the sixteen-stop warning once, and the shipped theme's gradient panel, buttons and progress bar |