Skip to content

STUNTBOOST levels

MonoGame / XNAWorld and streamingApplies toSTUNTBOOST

STUNTBOOST (Byting Games; a fingerboard racer) stores each level as one or more parts, each a glTF 2.0 document exported from Blender, wrapped in an XNB. The collision of the shipped levels is derived from the document by the game’s content pipeline, and its output is shipped beside the glTF. Observed · STUNTBOOST

Under Content/Models/Export, for a level named <Name> with parts numbered from 0:

File Reader Content Count Confidence
Level_<Name>_.xnb StringReader a JSON sidecar with the part count (modelCount) 55 Proven · STUNTBOOST
Level_<Name>_<N>.xnb BytingPipeline.GLTFReader the part’s glTF JSON 159 Proven · STUNTBOOST
Level_<Name>_<N>.bin.xnb ArrayReader<Byte> the glTF’s one buffer 159 Proven · STUNTBOOST
Level_<Name>_<N>Collision.xnb SE.Pipeline.CollisionModelReader the part’s collision, see collision 159 Proven · STUNTBOOST
Level_<Name>_<N>Cuts.xnb ReflectiveReader<ShortcutContent> the part’s shortcut data 159 Proven · STUNTBOOST
Models/Resources/<Name>.export/Bake<N>_Denoised.xnb QoiReader a baked lighting atlas, see baked lighting Observed · STUNTBOOST

There are 56 levels: AccelerateAndSteer, AirCrouch, AirGainSpeed, Bed, Bernie, BigAir, BoosterAndRewind, BoosterLaunching, Bouncy, Bowls, Cake, CameraCalibration, Cards, Castle, CatTree, Crouch, DJump, DJumpHor, DJumpVert, Eyes, EyesPool, FullPipe, GrindCurve, GrindLanes, GrindOptional, GrindPark, GrindTut, HalfPipes, Heights, HorizontalRamps, Ice180, IceBasics, IceCylinders, IceCylinders2, IceFloe, IceLaps, IceSlide, IceWaves, Jump, JumpFaster, LandingDirection, LapsDonut, LapsIsland, LegoLabyrinth, LegoLabyrinth2, LegoTower, Mod, RampMix, Skatepark, StairsSlide, Test_Gym, Tornado, Tornado12, Tower, VerticalRamps and Wave. Proven · STUNTBOOST Every level the sidecars list has its parts 0 to modelCount − 1. Proven · STUNTBOOST The differences: Test_Gym has parts and no sidecar (it is not a level the game lists), and GrindCurve and HorizontalRamps ship one more part file than their sidecar counts, a lone skybox part. Proven · STUNTBOOST

A level is two or three parts, told apart by what their nodes are:

Role Distinguishing node Parts Confidence
level a node with the =Spawn call 57 Observed · STUNTBOOST
room neither 46 Observed · STUNTBOOST
skybox a node with the =Skybox call 56 Observed · STUNTBOOST

The roles come from the exporter’s two bake groups (the Level collection and the Room collection, which do not share a texture) and the Skybox scene, which holds a simple environment rendered to a cubemap. Sourced · StuntboostTools A room is the mostly empty room around the track and the unreachable clutter. Sourced · StuntboostTools

All 159 parts were written by the Khronos glTF Blender exporter v4.3.47. Proven · STUNTBOOST In total they hold 23,799 nodes, 20,875 meshes, 1,534 materials, 267 images and 12,522,067 triangles. Proven · STUNTBOOST The largest part has about 456,000 triangles. Observed · STUNTBOOST Their extensions: KHR_materials_specular in 101 parts, KHR_materials_emissive_strength in 26, KHR_materials_ior in 5 and KHR_lights_punctual in one. Proven · STUNTBOOST Every material is OPAQUE. Proven · STUNTBOOST

Every node carries an extras object with the exporter’s sbe_properties; 18,526 also have sbe_parent_collection and 6,629 sb_props, and some carry the Blender add-ons’ properties (MeasureGenerator on 2,545, ikeaItemNo on 68). Proven · STUNTBOOST

Scene extras hold leftovers of the Blender scene and its add-ons, which the game does not use: vr_landmarks in 129 parts, sb_state in 112, NWBusyDrawing, NWLazySource, NWLazyTarget and other_props in 73, measureit_units in 59 and fewer others; five parts carry a ProblemList of 388 Blender warnings, each with a name and a path (such as “Implicit reference to active UV map” on a material’s node). Proven · STUNTBOOST Some of those entries quote node names, so a text search of the whole document finds more calls than there are nodes: =Booster( occurs 282 times in the level documents but names 274 nodes, the other eight hits being the name and path of four ProblemList entries. Proven · STUNTBOOST Counts on these pages are of node names. Node names follow a grammar that carries the gameplay, see node names.

A mesh primitive may carry an application-specific vertex attribute, _COLOR_SHIFT, two bytes per vertex written by the exporter, which the game’s outline pass pushes each vertex by (outlines). Observed · STUNTBOOST

The glTF’s units are not scaled by the game: there is no level scale in the code. Props are modelled at real size in centimetres (an AA battery is 5.15 units long, a door 204), while the board’s deck is 0.967 units long (Board.gltf, the Deck_textured mesh; Player.HalfWidthOfBoard is 0.1221). So props are giant relative to the board, and a unit is about 0.83 m when the board is read as a 0.80 m skateboard deck. Observed · STUNTBOOST

Props, creatures and animated objects are glTF in XNB the same way (Content/Models/Export/<Name>.xnb). Four carry a skin: Door (8 joints, 1 clip of 24 channels), Dragonfly (35 joints, 4 clips of 420 channels), Siegfried (34, 3 clips of 306) and TestAnimation (3, 6 clips of 54). Proven · STUNTBOOST