# Database Data Structure This document describes the JSON format saved to and loaded from the database. --- ## Top-level: `RoomExport` ```json { "guid": "string", "skybox": "string | null", "sky-color": "#rrggbb", "jsonversion": 2.0, "items": [ ...RoomItem ] } ``` | Field | Type | Description | |---|---|---| | `guid` | `string` | Unique room identifier | | `skybox` | `string \| null` | Skybox asset path (currently unused) | | `sky-color` | `string` | Background hex color | | `jsonversion` | `number` | Schema version (`2.0`) | | `items` | `RoomItem[]` | All objects in the room | --- ## `RoomItem` Every item in the `items` array shares this base shape: ```json { "position": { "x": 0.0, "y": 0.0, "z": 0.0 }, "rotation": { "x": 0.0, "y": 0.0, "z": 0.0 }, "scale": { "x": 1.0, "y": 1.0, "z": 1.0 }, "type": "pre-defined | user-defined", "resourcename": "string", "item-custom-args": [ ...ItemArg ], "item-custom-args-adv": null } ``` > **Coordinate system note:** The X-axis is flipped on save (`x` = `-creator_x`) and un-flipped on load. Y-axis rotation is also negated. ### `ItemArg` ```json { "argument": "key", "value": "value_as_string" } ``` All values are serialized as strings. --- ## Per-type `resourcename` and custom args ### Basic shapes | Creator type | `resourcename` | Custom args | |---|---|---| | `Cube` | `Cube` | `color` | | `Sphere` | `Sphere` | `color` | | `Cylinder` | `Cylinder` | `color` | | `Cone` | `Cone` | `color` | | `Floor` | `Plane` | `color`, `opacity` | | `Wall` | `Wall` | `color`, `opacity` | ### Lights | Creator type | `resourcename` | Custom args | |---|---|---| | `Directional Light` | `Directional Light` | `color`, `intensity`†, `target` (`"x,y,z"`) | | `Point Light` | `Point Light` | `color`, `intensity`† | > †`intensity` is the key saved in the database, but Unity reads `brightness` — the args will not apply at runtime until this mismatch is resolved. See individual object docs. ### Room access | Creator type | `resourcename` | Custom args | |---|---|---| | `Entrance` | `Entrance` | _(none)_ | | `GoToOtherRoom` | `GoToOtherRoom` | `RoomName`, `UUID`, `color` _(❌ not yet implemented in Creator or Unity)_ | ### Streaming / media | Creator type | `resourcename` | Custom args | |---|---|---| | `Billboard` | `Billboard` | `url` (Supabase storage path, signed at runtime) | | `LiveKitStream` | `LiveKitStream` | `LiveKitRoomID`, `shader`, `GreenScreenColor`, `GreenScreenBorderSettings`, `GreenScreenColorNear`, `widthcrop`, `heightcrop` | | `VideoWall` | `VideoWall` | `file`, `shader`, `volume`, `controls`, `autoplay`, `widthcrop`, `heightcrop` | | `Presentation` | `PresentationWall` | `file`, `widthcrop`, `heightcrop`, `controls` _(❌ not in Creator)_ | | `Camera` | `CCTVCamera` | `target` (`"x,y,z"`), `fov` (derived: `zoom * 60`) | ### Other / Props | Creator type | `resourcename` | `type` field | Custom args | |---|---|---|---| | `Text` | `Text` | `pre-defined` | `text`, `color`, `fontSize`, `fontWeight` | | `Whiteboard` | `WhiteboardWall` | `pre-defined` | _(none — not serialized by Creator)_ | | `Custom` | _(asset filename)_ | `user-defined` | `file`, `color`, `material` | #### `material` values (Custom, Speaker) | Value | Shader | |---|---| | `0` | Metallic | | `1` | Unlit | | `2` | Specular | | `3` | FakeEmission | ### Common optional arg (all types) | Arg | Type | Description | |---|---|---| | `grabable` | `"true" \| "false"` | Whether the item can be grabbed in-experience | --- ## Example — Directional Light ```json { "position": { "x": 0, "y": 5, "z": 0 }, "rotation": { "x": 0, "y": 0, "z": 0 }, "scale": { "x": 1, "y": 1, "z": 1 }, "type": "pre-defined", "resourcename": "Directional Light", "item-custom-args": [ { "argument": "color", "value": "#ffffff" }, { "argument": "intensity", "value": "20" }, { "argument": "target", "value": "0,0,0" } ], "item-custom-args-adv": null } ``` ## Example — CCTV Camera ```json { "position": { "x": 0, "y": 4, "z": 0 }, "rotation": { "x": 0, "y": 0, "z": 0 }, "scale": { "x": 1, "y": 1, "z": 1 }, "type": "pre-defined", "resourcename": "CCTVCamera", "item-custom-args": [ { "argument": "target", "value": "0,0,0" }, { "argument": "fov", "value": "60" } ], "item-custom-args-adv": null } ``` ## Example — Custom (user-uploaded GLB) ```json { "position": { "x": -4.0, "y": 1.0, "z": 0.0 }, "rotation": { "x": 0.0, "y": 0.0, "z": 0.0 }, "scale": { "x": 1.0, "y": 1.0, "z": 1.0 }, "type": "user-defined", "resourcename": "b83a17ab-92bf-4122-a4d0-7b467a105ae0/podest.glb", "item-custom-args": [ { "argument": "file", "value": "b83a17ab-92bf-4122-a4d0-7b467a105ae0/podest.glb" }, { "argument": "color", "value": "#ffffff" }, { "argument": "material", "value": "0" } ], "item-custom-args-adv": null } ```