Guide

Stage models

A televised event is played on a stage: the whole hall around the board, with its set, its walkway and its crowd. A stage is two files named by a stages record: a model (.glb) and a layout (.json) that tells the game where things are in it. The game's own are the core pack's: the records in core/data/stages.json, the files in core/assets/stages/: the classic stage (tv-arena.glb, arena.json), the palace (palace-arena.glb, palace-arena.json) and the Palace (TV) (palace-arena-tv.glb, palace-arena-tv.json: the palace's hall and set with the board's surround, a sponsor band, floor tape and two television cameras, dressed and lit like the real world championship stage), written by tools/blender/build_arena.py. Two records may share a model: a layout with other looks is a stage of its own. They are the worked example.

Status. Built: the stages records with the loader's checks of the model file and of the layout, a match opening on the stage its event names (a record's id or its last part; a later record whose id ends the same takes an earlier one's place), and the fallback to the game's own stage with a line on the Mods screen when a mod's stage does not load. Not checked when the model loads: the triangle, mesh and size limits below. The parts not built are listed under Not built yet. This page has the same shape as Dart part models) and Trophy models).

What a stage is, and what it is not#

The board, the oche and its mat, the players, the darts, the match cameras, the key lights and the shadows under the players are the game's own and are in the same place on every stage. A stage is built around them. So a stage does not say where the board is: it must leave the board's place free and put a floor under the players.

What a stage brings: the deck the players stand on, the set behind the board, the hall, the walkway and steps of the walk-on, where the crowd sits, and optionally the opening shot.

The stage frame#

  • Millimetres. The classic stage is 39.8 m wide and 40.3 m deep.
  • glTF's own frame: right-handed, y up.
  • The origin is the centre of the bull. The board faces +z; the players stand on the +z side and throw towards -z. The set is behind the board at negative z; the hall, the walkway and the entrance are out at large positive z.
  • x is to the right as the audience and the main camera see the stage (looking at the board from +z): the walk-on comes down the audience's left (the core stages' walkway is at x = -5000) and the trophy stands on the right (x = 5600). The file's frame is the game's: what a glTF viewer shows is what the game shows, not a mirror image.
  • The floor the players stand on is at y = -1730 (the bull is 1.73 m above it). The oche is 2,370 mm in front of the board (z = 2370).

Keep clear#

Space (mm)Why
x -2500 to 4500, y -1730 to 1500, z -150 to 4500the board, its surround and lights, the oche and mat, the throwing player, the waiting player (x -1250, z 3120) and where a player steps in from (x 4300, z 3870)
the deck's top, from deckZ0 to deckZ1the players walk on it: flat, at floorY
the walkway from walkZ0 to walkZ1 along walkX, the landing and the stepsthe walk-on walks it: model a walkable surface there at walkY
x 4600 to 6600, z deckZ0 + 750 to deckZ0 + 2750the trophy's pedestal (it stands at x 5600, z deckZ0 + 1750)

The match cameras look at the board and the players from the +z side. Whatever is behind the board, about 9 m wide and 3.4 m high above the deck (the size of the game's own painted wall there), is in nearly every shot: that is where the set's screens go.

The layout file#

Beside the model, with these fields (mm; z grows away from the board):

FieldMeaning
floorYThe deck's top. Must be -1730.
hallYThe hall's floor (the classic stage: -2930, the deck is 1.2 m high).
deckX, deckZ0, deckZ1The deck: its half width, its back edge (behind the board, negative) and its front edge.
walkX, walkY, walkZ0, walkZ1The walkway: its centre line, its top, and its extent from the foot of the steps to the back of the hall.
stepsX, stepsZ0, stepsZ1, stepsThe steps: centred on stepsX (default walkX), climbing from stepsZ1 (the bottom, at walkY) to stepsZ0 (the deck's front edge, at floorY), and how many treads.
landZ0, landZ1The landing between the walkway's end and the steps (defaults: stepsZ1, walkZ0).
entranceZWhere the players come out of the tunnel (default walkZ1).
placementsThe crowd: a list of [x, y, z, yaw, kind]: the feet, the direction faced in radians about y (0 faces +z, away from the board; a spectator out in the hall looking at the board has π; the direction is (sin yaw, 0, cos yaw)), and 1 seated, 2 leaning on a barrier, 0 standing. The game puts a spectator on each.
looksThe stage's own materials: see Materials.
openOptional opening shot: { "cam": [x, y, z], "look": [x, y, z], "fov": 42 }. Without it the opener looks down the hall from the tunnel.
hideWalltrue when the set has its own back wall, so the game's painted wall behind the board is not drawn.
lightingOptional: the stage's own lighting, see Lighting. Without it the rig is the game's.
crowd, tris, drawsCounts, for the log only.

The walk-on follows the walkway from entranceZ to the landing, turns to stepsX, climbs the steps and crosses the deck to the oche. If the walkway is not straight down z in your hall, it cannot be walked yet.

Materials are looks#

The game does not draw a stage's materials as authored. Each mesh is given a look by its material's name, so the set takes the event's colour, backdrop and logo:

Material nameDrawn as
arena_black, arena_housing, arena_barrier, arena_metal, arena_gold, arena_trim, arena_chairplain surfaces: matt black, dark housings (a faint glow in the event colour), barrier steel, bright metal, gold, white trim, chair frames
arena_carpet, arena_hallthe deck's carpet and the hall's floor (tiled carpet texture; uvs in mm / 1500)
arena_cloth, arena_chair_event, arena_mesh, arena_treadtable tops (wood), chair cloth in the event colour, perforated barrier sheet, tread plate
arena_led, arena_pillar, arena_lens, arena_phoneslit: the LED grid in the event colour, light pillars, lamp lenses, the crowd's phones
arena_beam (and any name starting arena_beam)a light beam: additive, uv v = 1 at the lamp. The game sweeps and dims these in the walk-on.
arena_screena screen showing the event's branding (its name over its backdrop): uvs 0 to 1 across the screen
arena_ledwallthe back wall showing the event's backdrop
arena_logoa 2:1 sponsor panel with the event's logo on the event colour
arena_strapan 8:1 strap with the event's name
arena_crowdnot for mods: the crowd is the game's

A material name the game does not know is drawn as arena_black, unless the layout's looks dresses it:

"looks": {
  "harbour_rib":  { "like": "arena_led", "emissive": "accent", "emissiveWhite": 0.4, "emissiveScale": 1.5 },
  "harbour_teak": { "like": "arena_cloth", "color": "#6b4a2c", "roughness": 0.6 }
}

Each look starts like one of the names above, then takes color and emissive (a hex colour, or "accent" for the event's colour), colorWhite and emissiveWhite (0 to 1: mixed towards white), colorScale and emissiveScale (brightness), roughness and metalness. A name starting arena_fan is treated as set lighting: it pulses with the walk-on.

A look may also bring its own pictures, PNG files in the game's StreamingAssets/arena folder or beside the layout: map (a tiling colour picture; color then tints it, white unless given, and the shared look's own map and bump go), bump (a height picture, with bumpScale) and normal (an OpenGL tangent-space normal map read as surface detail, with normalScale; it repeats with the map, mapScale). The Palace (TV) dresses arena_carpet this way with a photographed short pile (arena_pile.png, arena_pile_n.png; CC0, see docs/credits-arena-assets).

A look may stand its panels off the set as raised lettering: relief (mm) turns each panel quad of that material into the cut-out shape of the event's logo (a look like arena_logo) or of the event's name (like arena_strap), lifted by that depth along the panel's normal and walled where the shape ends, painted rather than lit; reliefCell (mm, default 15) is the grain of the cut. The Palace (TV) uses it for the logo at the head of its set and the name bands (arena_logo3d, arena_name3d).

Textures embedded in the glb are not used. That is on purpose for now: it is what makes one stage serve every event.

Lighting#

A stage may change the rig that lights the board and the players, with a lighting block in its layout. Each lamp is optional, and so is each field:

"lighting": {
  "key":  { "scale": 0.85, "angle": 0.55, "penumbra": 1.0, "position": [0, 1500, 3200], "shadowRadius": 8 },
  "fill": { "scale": 2.0 },
  "side": { "scale": 0.7 },
  "wash": { "scale": 0.85, "angle": 0.42, "penumbra": 1.0, "shadow": true, "shadowRadius": 6 },
  "rim":  { "scale": 0.8 },
  "haze": { "density": 0.000012, "floor": -1730, "rise": 6000, "low": 0.25 },
  "flashes": { "perSecond": 1.5, "size": 450 }
}
LampWhat it isFields
keyThe spot on the board and the players, from above the oche; it throws the shadow.scale (its intensity, 1: as it is), color (hex, instead of its own), angle (the cone's half angle in radians), penumbra (0 hard, 1 soft to the centre), position [x, y, z] (mm; the bull is the origin, +z towards the crowd), shadowRadius (the shadow edge's softness, in texels)
fillThe hemisphere light over everything.scale
sideThe high side light that shapes the darts.scale, color
washThe arena's warm spot from the crowd side.as key, and shadow (true: the wash throws the players' shadows too, a second shadow map)
rimThe cool light from behind the players.scale, color, position
hazeThe air: surfaces fade toward a dark haze with their distance from the camera, and the beams fade into it.density (per mm; 0.00001 is about a fifth of the way at 20 m), floor (the height, mm, below which the haze is thinnest), rise (how far above the floor it reaches full density), low (its share at the floor, 1: the same everywhere)
flashesCamera flashes in the crowd.perSecond (on average; 0: none), size (mm)

The Palace (TV) stage (core.stage.palace-tv) is the worked example: the real world championship's soft, even front light, more fill, the wash's own shadow, haze hanging in the trusses and flashes in the crowd.

The stage record#

A stage is a content record like any other: a pack lists its stages in data/stages.json (or files under data/stages/), and the model and the layout are assets of the pack.

[
  { "id": "acme.stage.harbour", "name": "Harbour Hall", "model": "assets/stages/harbour.glb", "layout": "assets/stages/harbour.json" }
]
  • **id**: unique and namespaced. A record with an id that exists already replaces it (a mod can replace core.stage.classic or core.stage.palace); a patch ("target": "stage:<id>") changes one field.
  • **name**: shown on the Mods screen and in the Mod Studio's pickers.
  • **model, layout**: relative to the mod, like every other asset path.
  • Which event gets which stage is the event's own stage field (Calendar): a stage's id, or its last part ("palace" finds core.stage.palace: the core pack's events, and careers begun before stages were records, name theirs that way).

An event names its stage: { "id": "acme.event.harbour-masters", "tv": true, "stage": "acme.stage.harbour" }. A stage is only used for a televised event, and never at the low 3D quality setting (which has no players either); "stage": "hall" (the floor hall of booths) is not a stage of this kind and cannot be replaced by a model yet.

File rules#

  • glTF 2.0 binary (.glb), one file. Loaded with glTFast.
  • Triangles, with normals and one uv set. One mesh per material is best (the core stages are 18 and 25 meshes): every mesh is a draw call in every shot.
  • No skins, animations, cameras or lights (ignored). No Draco or meshopt compression, no KTX2.
  • Node transforms are applied, but model in the stage frame with the transforms applied: the layout's numbers are in that frame.
  • Size limits (a file over one is refused): 64 MB, 600,000 triangles, 60 meshes, 3,000 crowd placements, and everything inside a box of 60 m by 20 m by 60 m. The core stages are 10 MB, 333,000 and 340,000 triangles, 1,375 spectators.
  • Load time and memory count: the stage is loaded when a match opens.
  • The limits above are the proposal for, to be settled against load time and memory measured in a build.

A bad stage never breaks a match#

Checked when mods load (the Mods screen shows the result against the mod):

ProblemResult
The file does not parse, or a record has no id, model or layouterror on the mod; the record is left out
The model or the layout is missing, the model is not a .glb or is over 64 MB, the layout is not a .json or is over 4 MBa problem on the mod naming the file and the reason; the stage cannot be used
The layout is not JSON, lacks a number it needs (floorY, hallY, the deck, the walkway, the steps), has floorY other than -1730, a deck that does not reach from behind the board to past the oche, steps that do not meet the deck's front edge (stepsZ0 = deckZ1) or a walkway that starts before the foot of the steps (walkZ0 < stepsZ1)a problem on the mod listing what is wrong; the stage cannot be used
More than 3,000 spectators, or a placement that is not five numbers, has a kind other than 0, 1 or 2, or is outside the box a stage must fita problem on the mod naming the first bad one; the stage cannot be used
The glb itself does not load, or is over the triangle or mesh limitsfound when a match opens on the stage: reported then, as below
An event names a stage nobody haswarning on the mod; the event plays on the default stage

A stage that was left out, or whose model still fails to load when a match opens, falls back to the default stage (the classic one, which every other stage falls back to). The failure is logged once ([stage] the arena model did not load: reason) and added to the mod's issues on the Mods screen. If the default stage itself cannot load, the match is played on the plain floor, as at low 3D quality.

Not built yet#

  • As-authored materials and embedded textures for a stage.
  • A stage that moves the walkway off the z axis, or replaces the floor hall.
  • A per-stage position for the trophy and for the stage's effects (the moving lights, the spark fountains and the tables are placed from the deck's numbers).

Written for Darts Player Simulator 0.50.32. Built from the game's own schemas and its base pack.