[
  {
    "schemaVersion": 1,
    "title": "EditorApp",
    "path": "editor/reference/EditorApp.md",
    "source": "editor/js/EditorApp.js",
    "import": "/editor/js/EditorApp.js",
    "sourceHash": "15dce8760d6b57df398f8b909cb03eed49dc77b694ce58d828a62985bc95b9dc",
    "summary": "EditorApp - Main application controller (Modular) Uses lazy loading for heavy modules to improve initial load time",
    "exports": [
      {
        "name": "EditorApp",
        "kind": "class",
        "signature": "class EditorApp",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "ProjectManager",
    "path": "editor/reference/ProjectManager.md",
    "source": "editor/js/ProjectManager.js",
    "import": "/editor/js/ProjectManager.js",
    "sourceHash": "6da80fcdde3d1994783f6ae4efb8d78ae4351510d293fe49a37b77a2542a609b",
    "summary": "ProjectManager - Handles project folder selection and initialization",
    "exports": [
      {
        "name": "ProjectManager",
        "kind": "class",
        "signature": "class ProjectManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioEditorPanel",
    "path": "editor/reference/components/AudioEditorPanel.md",
    "source": "editor/js/components/AudioEditorPanel.js",
    "import": "/editor/js/components/AudioEditorPanel.js",
    "sourceHash": "766e0e3423425583173c5bb5a9957d72ae0fb41367906d1d8e05637dea823ad9",
    "summary": "AudioEditorPanel.js - Main Audio Editor Panel Composes NodeGraph + Palette + Inspector + Materials + PreviewControls into a single editor tab panel for the engine editor.",
    "exports": [
      {
        "name": "createAudioEditorPanel",
        "kind": "function",
        "signature": "createAudioEditorPanel(parentContainer, options = {})",
        "summary": "Create the audio editor panel."
      },
      {
        "name": "destroyAudioEditorPanel",
        "kind": "function",
        "signature": "destroyAudioEditorPanel(panel)",
        "summary": "Destroy the audio editor panel."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioMotionTimeline",
    "path": "editor/reference/components/AudioMotionTimeline.md",
    "source": "editor/js/components/AudioMotionTimeline.js",
    "import": "/editor/js/components/AudioMotionTimeline.js",
    "sourceHash": "b660052fe2975e6a2a3e73691436ca533a01d3467b30ec2552ab461e6d83077d",
    "summary": "AudioMotionTimeline.js - Sound motion/automation timeline for Audio Editor V1 feature set: - Per-parameter tracks (nodeId + param) - Keyframe authoring (time, value, easing) - Loop + duration + playhead scrubbing - Runtime evaluation using AnimationTrack",
    "exports": [
      {
        "name": "createAudioMotionTimeline",
        "kind": "function",
        "signature": "createAudioMotionTimeline(container, callbacks = {})",
        "summary": ""
      },
      {
        "name": "setMotionPatch",
        "kind": "function",
        "signature": "setMotionPatch(timeline, motionData, options = {})",
        "summary": ""
      },
      {
        "name": "exportMotionPatch",
        "kind": "function",
        "signature": "exportMotionPatch(timeline)",
        "summary": ""
      },
      {
        "name": "evaluateMotionAtTime",
        "kind": "function",
        "signature": "evaluateMotionAtTime(timeline, tSec)",
        "summary": ""
      },
      {
        "name": "evaluateActivityAtTime",
        "kind": "function",
        "signature": "evaluateActivityAtTime(timeline, tSec)",
        "summary": ""
      },
      {
        "name": "resolveAudioMotionTimelineTime",
        "kind": "function",
        "signature": "resolveAudioMotionTimelineTime(timeline, tSec)",
        "summary": ""
      },
      {
        "name": "destroyAudioMotionTimeline",
        "kind": "function",
        "signature": "destroyAudioMotionTimeline(timeline)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioNodeGraph",
    "path": "editor/reference/components/AudioNodeGraph.md",
    "source": "editor/js/components/AudioNodeGraph.js",
    "import": "/editor/js/components/AudioNodeGraph.js",
    "sourceHash": "068e9a4c4007fdd8969ff58c87f32ccb71a50bc0d7aec4a637fb9be303c5e418",
    "summary": "AudioNodeGraph.js - Canvas-Based Node Graph Editor Draggable nodes, wire connections (audio=thick, control=thin/dashed), zoom/pan, selection, and serialization to/from patch JSON.",
    "exports": [
      {
        "name": "createAudioNodeGraph",
        "kind": "function",
        "signature": "createAudioNodeGraph(container, callbacks = {})",
        "summary": "Create an audio node graph editor."
      },
      {
        "name": "addNode",
        "kind": "function",
        "signature": "addNode(graph, type, x, y, params = {})",
        "summary": "Add a node to the graph."
      },
      {
        "name": "removeNode",
        "kind": "function",
        "signature": "removeNode(graph, nodeId)",
        "summary": "Remove a node and its wires."
      },
      {
        "name": "addWire",
        "kind": "function",
        "signature": "addWire(graph, from, to)",
        "summary": "Add a wire between two ports."
      },
      {
        "name": "removeWire",
        "kind": "function",
        "signature": "removeWire(graph, from, to)",
        "summary": "Remove a wire."
      },
      {
        "name": "duplicateNode",
        "kind": "function",
        "signature": "duplicateNode(graph, nodeId)",
        "summary": "Duplicate a node (offset position by 20,20)."
      },
      {
        "name": "disconnectNode",
        "kind": "function",
        "signature": "disconnectNode(graph, nodeId)",
        "summary": "Disconnect all wires from a node."
      },
      {
        "name": "fitToView",
        "kind": "function",
        "signature": "fitToView(graph)",
        "summary": "Fit view to show all nodes."
      },
      {
        "name": "setNodeTypes",
        "kind": "function",
        "signature": "setNodeTypes(graph, types)",
        "summary": "Register available node types."
      },
      {
        "name": "selectNode",
        "kind": "function",
        "signature": "selectNode(graph, nodeId)",
        "summary": "Select a node."
      },
      {
        "name": "exportPatch",
        "kind": "function",
        "signature": "exportPatch(graph)",
        "summary": ""
      },
      {
        "name": "importPatch",
        "kind": "function",
        "signature": "importPatch(graph, patch)",
        "summary": "Import patch JSON into graph."
      },
      {
        "name": "renderGraph",
        "kind": "function",
        "signature": "renderGraph(graph)",
        "summary": "Render the entire graph."
      },
      {
        "name": "startGraphAnimation",
        "kind": "function",
        "signature": "startGraphAnimation(graph)",
        "summary": "Start the animation loop for live waveform + wire animation."
      },
      {
        "name": "stopGraphAnimation",
        "kind": "function",
        "signature": "stopGraphAnimation(graph)",
        "summary": "Stop animation loop."
      },
      {
        "name": "setNodeAnalysers",
        "kind": "function",
        "signature": "setNodeAnalysers(graph, analysers)",
        "summary": "Set per-node analyser taps for live waveform display."
      },
      {
        "name": "setMinimapContainer",
        "kind": "function",
        "signature": "setMinimapContainer(graph, container)",
        "summary": "Set an external container for the minimap (rendered separately from the main canvas)."
      },
      {
        "name": "destroyAudioNodeGraph",
        "kind": "function",
        "signature": "destroyAudioNodeGraph(graph)",
        "summary": "Destroy the graph editor."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioNodeInspector",
    "path": "editor/reference/components/AudioNodeInspector.md",
    "source": "editor/js/components/AudioNodeInspector.js",
    "import": "/editor/js/components/AudioNodeInspector.js",
    "sourceHash": "4ffd492d0752e04b5141017fd58ce7cc6274fbd9d4f1acb61786bd3ecb41c1b9",
    "summary": "AudioNodeInspector.js - Right Panel for Selected Node Parameters Shows parameter knobs/sliders for the selected node. Uses SoundSchema when available for rich typed controls. Falls back to PARAM_HINTS for legacy/unschemaed node types.",
    "exports": [
      {
        "name": "createAudioNodeInspector",
        "kind": "function",
        "signature": "createAudioNodeInspector(container, onParamChanged)",
        "summary": "Create the node inspector panel."
      },
      {
        "name": "updateInspector",
        "kind": "function",
        "signature": "updateInspector(inspector, node)",
        "summary": "Update the inspector to show a node's parameters."
      },
      {
        "name": "destroyAudioNodeInspector",
        "kind": "function",
        "signature": "destroyAudioNodeInspector(inspector)",
        "summary": "Destroy the inspector."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioNodePalette",
    "path": "editor/reference/components/AudioNodePalette.md",
    "source": "editor/js/components/AudioNodePalette.js",
    "import": "/editor/js/components/AudioNodePalette.js",
    "sourceHash": "b4a519c1844fdc8843065d88def5692b13d3c903eee18f661f9749c6af9a7936",
    "summary": "AudioNodePalette.js - Side Panel with Node Types Lists all available node types grouped by category. Supports drag-to-create from palette onto the graph canvas.",
    "exports": [
      {
        "name": "createAudioNodePalette",
        "kind": "function",
        "signature": "createAudioNodePalette(container, onNodeDragStart)",
        "summary": "Create the node palette panel."
      },
      {
        "name": "destroyAudioNodePalette",
        "kind": "function",
        "signature": "destroyAudioNodePalette(palette)",
        "summary": "Destroy the palette."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioPatchEditor",
    "path": "editor/reference/components/AudioPatchEditor.md",
    "source": "editor/js/components/AudioPatchEditor.js",
    "import": "/editor/js/components/AudioPatchEditor.js",
    "sourceHash": "c44eea13f91ac176dc44ae0ae5828b867a2d11705ba76b91c601d531cbf02499",
    "summary": "AudioPatchEditor.js - Live Material Patch Editor for Sound Studio Reads real substance audio definitions from the SubstanceRegistry and lets you tweak them on the spot. Changes feed into the ProceduralPatches runtime override system. Edits persist with scene. Layout: Material list (compact cards) + Dedicated param panel below.",
    "exports": [
      {
        "name": "createAudioPatchEditor",
        "kind": "function",
        "signature": "createAudioPatchEditor(container, callbacks = {})",
        "summary": ""
      },
      {
        "name": "setPatchEditorAudioContext",
        "kind": "function",
        "signature": "setPatchEditorAudioContext(editor, ctx)",
        "summary": ""
      },
      {
        "name": "setPatchEditorApp",
        "kind": "function",
        "signature": "setPatchEditorApp(patchEditor, editorApp)",
        "summary": ""
      },
      {
        "name": "destroyAudioPatchEditor",
        "kind": "function",
        "signature": "destroyAudioPatchEditor(editor)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioPresetBrowser",
    "path": "editor/reference/components/AudioPresetBrowser.md",
    "source": "editor/js/components/AudioPresetBrowser.js",
    "import": "/editor/js/components/AudioPresetBrowser.js",
    "sourceHash": "671b835d508541f9081ba61628e4970d90930454ec0a22e1cd0183db4d6f3fd1",
    "summary": "AudioPresetBrowser.js - Load/Save/Browse Patch Presets Browse built-in presets per substance, load/save patches as JSON.",
    "exports": [
      {
        "name": "getPresetPatch",
        "kind": "function",
        "signature": "getPresetPatch(name)",
        "summary": "Get a preset patch by name."
      },
      {
        "name": "createAudioPresetBrowser",
        "kind": "function",
        "signature": "createAudioPresetBrowser(container, callbacks = {})",
        "summary": "Create the preset browser panel."
      },
      {
        "name": "destroyAudioPresetBrowser",
        "kind": "function",
        "signature": "destroyAudioPresetBrowser(browser)",
        "summary": "Destroy the preset browser."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioPreviewControls",
    "path": "editor/reference/components/AudioPreviewControls.md",
    "source": "editor/js/components/AudioPreviewControls.js",
    "import": "/editor/js/components/AudioPreviewControls.js",
    "sourceHash": "beb0cc41520bc84678d17375eca4c1661b0a69be6d03fd428ec29b75cb76273f",
    "summary": "AudioPreviewControls.js - Professional Transport Bar Play/Pause/Stop with icons, elapsed time display, wave shape selector, volume control with arc knob, and waveform quick-switch.",
    "exports": [
      {
        "name": "createAudioPreviewControls",
        "kind": "function",
        "signature": "createAudioPreviewControls(container, callbacks = {})",
        "summary": "Create the transport controls bar."
      },
      {
        "name": "setPreviewPlaying",
        "kind": "function",
        "signature": "setPreviewPlaying(controls, playing)",
        "summary": "Set playing state externally."
      },
      {
        "name": "destroyAudioPreviewControls",
        "kind": "function",
        "signature": "destroyAudioPreviewControls(controls)",
        "summary": "Destroy preview controls."
      },
      {
        "name": "connectAnalyser",
        "kind": "function",
        "signature": "connectAnalyser()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/AudioSignalAnalyzer",
    "path": "editor/reference/components/AudioSignalAnalyzer.md",
    "source": "editor/js/components/AudioSignalAnalyzer.js",
    "import": "/editor/js/components/AudioSignalAnalyzer.js",
    "sourceHash": "449c3d3a53e86e85bef226b1f016e3b8a31b606514bea1d48dd52a9d377050bd",
    "summary": "AudioSignalAnalyzer.js - Professional Signal Analysis Panel Full-width bottom panel with switchable visualization modes: - Oscilloscope (time-domain waveform) - Spectrum Analyzer (FFT frequency bars, log scale) - Spectrogram (scrolling waterfall) Plus stereo VU/peak meter and freeze capability.",
    "exports": [
      {
        "name": "createSignalAnalyzer",
        "kind": "function",
        "signature": "createSignalAnalyzer(container)",
        "summary": "Create the signal analyzer panel."
      },
      {
        "name": "connectSignalAnalyzer",
        "kind": "function",
        "signature": "connectSignalAnalyzer(analyzer, analyserNode)",
        "summary": "Connect an AnalyserNode for visualization."
      },
      {
        "name": "disconnectSignalAnalyzer",
        "kind": "function",
        "signature": "disconnectSignalAnalyzer(analyzer)",
        "summary": "Disconnect and stop rendering."
      },
      {
        "name": "destroySignalAnalyzer",
        "kind": "function",
        "signature": "destroySignalAnalyzer(analyzer)",
        "summary": "Destroy the analyzer."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/CollabPanel",
    "path": "editor/reference/components/CollabPanel.md",
    "source": "editor/js/components/CollabPanel.js",
    "import": "/editor/js/components/CollabPanel.js",
    "sourceHash": "09963ebad00e9695a3af0be03441649c310a90d998ca19aa99557ced59be0413",
    "summary": "CollabPanel.js Collaboration sidebar panel for the editor.",
    "exports": [
      {
        "name": "CollabPanel",
        "kind": "class",
        "signature": "class CollabPanel",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/GraphPersistenceContracts",
    "path": "editor/reference/components/GraphPersistenceContracts.md",
    "source": "editor/js/components/GraphPersistenceContracts.js",
    "import": "/editor/js/components/GraphPersistenceContracts.js",
    "sourceHash": "dfe90d08a06bc37381a730f6071b4345ac8ac66bdfb315b7f35aea9b520a781f",
    "summary": "Normalize legacy audio patches and validate the full candidate before use.",
    "exports": [
      {
        "name": "UnsupportedGraphVersionError",
        "kind": "class",
        "signature": "class UnsupportedGraphVersionError extends Error",
        "summary": ""
      },
      {
        "name": "prepareAudioGraphDocument",
        "kind": "function",
        "signature": "prepareAudioGraphDocument(input)",
        "summary": "Normalize legacy audio patches and validate the full candidate before use."
      },
      {
        "name": "prepareMaterialGraphDocument",
        "kind": "function",
        "signature": "prepareMaterialGraphDocument(input, { allowedNodeTypes = null } = {})",
        "summary": "Normalize legacy material graphs and reject dangling connections/future schemas."
      },
      {
        "name": "GRAPH_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "GRAPH_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "AUDIO_GRAPH_SCHEMA",
        "kind": "constant",
        "signature": "AUDIO_GRAPH_SCHEMA",
        "summary": ""
      },
      {
        "name": "MATERIAL_GRAPH_SCHEMA",
        "kind": "constant",
        "signature": "MATERIAL_GRAPH_SCHEMA",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialNodeGraph",
    "path": "editor/reference/components/MaterialNodeGraph.md",
    "source": "editor/js/components/MaterialNodeGraph.js",
    "import": "/editor/js/components/MaterialNodeGraph.js",
    "sourceHash": "932d345d001af2dbb7eeab81b266133893fcbb8e576db5620ffe71298a89284a",
    "summary": "MaterialNodeGraph.js - Canvas-based node graph editor for materials Features: pan/zoom, node drag, port connections, context menu to add nodes, node deletion, bezier connection rendering, port type coloring.",
    "exports": [
      {
        "name": "createNodeGraph",
        "kind": "function",
        "signature": "createNodeGraph(container, options = {})",
        "summary": ""
      },
      {
        "name": "evaluateGraphData",
        "kind": "function",
        "signature": "evaluateGraphData(graphData)",
        "summary": "Standalone evaluator for raw graph data (no canvas UI needed). Used by headless preview animation."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialNodePresets",
    "path": "editor/reference/components/MaterialNodePresets.md",
    "source": "editor/js/components/MaterialNodePresets.js",
    "import": "/editor/js/components/MaterialNodePresets.js",
    "sourceHash": "405e4ab4e6a46983ec88bad2d34b33a53c8ff5b80de54bce26794a8956a03c3c",
    "summary": "MaterialNodePresets.js - Pre-built node graph recipes for all built-in materials Each preset is a valid node graph using only standard MaterialNodeTypes nodes. These serve as demos showing users how to wire nodes to create materials. Graph structure: { nodes: [...], connections: [...], view: { panX, panY, zoom } } Node: { id, type, x, y, params } Connection: { fromNode, fromPort, toNode, toPort }",
    "exports": [
      {
        "name": "getPresetGraph",
        "kind": "function",
        "signature": "getPresetGraph(materialId)",
        "summary": "Get the preset node graph for a built-in material."
      },
      {
        "name": "hasPresetGraph",
        "kind": "function",
        "signature": "hasPresetGraph(materialId)",
        "summary": "Check if a material has a preset graph."
      },
      {
        "name": "listPresetIds",
        "kind": "function",
        "signature": "listPresetIds()",
        "summary": "List all material IDs that have preset graphs."
      },
      {
        "name": "listSubstancePresetIds",
        "kind": "function",
        "signature": "listSubstancePresetIds()",
        "summary": "Get all substance-linked preset IDs."
      },
      {
        "name": "listAnimatedPresetIds",
        "kind": "function",
        "signature": "listAnimatedPresetIds()",
        "summary": "Get all animated effect preset IDs (lava, water, hologram, etc.)."
      },
      {
        "name": "NODE_GRAPH_PRESETS",
        "kind": "constant",
        "signature": "NODE_GRAPH_PRESETS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialNodeTypes",
    "path": "editor/reference/components/MaterialNodeTypes.md",
    "source": "editor/js/components/MaterialNodeTypes.js",
    "import": "/editor/js/components/MaterialNodeTypes.js",
    "sourceHash": "ffda7220fade1a0c479119514992dd67d162e4e502c968a4ec4ccf10c150693c",
    "summary": "MaterialNodeTypes.js - Node type definitions for the material graph editor Modeled after Substance Designer / Material Maker / Unreal Material Editor. Each node type defines inputs, outputs, defaults, and an evaluate function. Port types: 'float', 'vec2', 'vec3', 'vec4', 'color', 'texture'",
    "exports": [
      {
        "name": "defaultForType",
        "kind": "function",
        "signature": "defaultForType(type)",
        "summary": ""
      },
      {
        "name": "PORT_COLORS",
        "kind": "constant",
        "signature": "PORT_COLORS",
        "summary": ""
      },
      {
        "name": "NODE_CATEGORIES",
        "kind": "constant",
        "signature": "NODE_CATEGORIES",
        "summary": ""
      },
      {
        "name": "NODE_TYPES",
        "kind": "constant",
        "signature": "NODE_TYPES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialPanel",
    "path": "editor/reference/components/MaterialPanel.md",
    "source": "editor/js/components/MaterialPanel.js",
    "import": "/editor/js/components/MaterialPanel.js",
    "sourceHash": "93e49cf411fb1158505c830c65d3798296fa5a5d0c3da4f0133dc7e396767516",
    "summary": "MaterialPanel.js - Material Studio Panel Composes Library + PBR Inspector + 3D Preview into an overlay panel. Follows the Sound Studio (AudioEditorPanel.js) architecture.",
    "exports": [
      {
        "name": "createMaterialPanel",
        "kind": "function",
        "signature": "createMaterialPanel(container, options = {})",
        "summary": "Create the material panel contents inside the overlay body."
      },
      {
        "name": "destroyMaterialPanel",
        "kind": "function",
        "signature": "destroyMaterialPanel(panel)",
        "summary": "Destroy the material panel."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialPatchGraphs",
    "path": "editor/reference/components/MaterialPatchGraphs.md",
    "source": "editor/js/components/MaterialPatchGraphs.js",
    "import": "/editor/js/components/MaterialPatchGraphs.js",
    "sourceHash": "a2e25f86d21e074d5b362db7899a1e86fd457cda9e11153a006451f9044b0078",
    "summary": "MaterialPatchGraphs.js - High-level node graph representations for ProceduralPatches.js These graphs provide design-facing topology for each material family. They intentionally summarize synthesis layers so editor UX stays readable even when runtime patches contain deeper stochastic/detail layers.",
    "exports": [
      {
        "name": "getMaterialGraph",
        "kind": "function",
        "signature": "getMaterialGraph(substanceId)",
        "summary": "Get the node graph for a substance. Returns a deep copy so edits don't mutate the template."
      },
      {
        "name": "MATERIAL_GRAPHS",
        "kind": "constant",
        "signature": "MATERIAL_GRAPHS",
        "summary": "Maps substance IDs to editor-facing graph representations. Graphs are intentionally compact abstractions of runtime synthesis."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/MaterialStrip",
    "path": "editor/reference/components/MaterialStrip.md",
    "source": "editor/js/components/MaterialStrip.js",
    "import": "/editor/js/components/MaterialStrip.js",
    "sourceHash": "1fba3ca727861ab9302f38016464c371ad0d5a3fec91c6cf81662ae553608ac4",
    "summary": "MaterialStrip.js - Compact material browser for bottom panel Horizontal scrollable strip of material thumbnails with preview sidebar. Designed to sit in the bottom panel alongside Console.",
    "exports": [
      {
        "name": "createMaterialStrip",
        "kind": "function",
        "signature": "createMaterialStrip(container, options = {})",
        "summary": ""
      },
      {
        "name": "destroyMaterialStrip",
        "kind": "function",
        "signature": "destroyMaterialStrip(state)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/ParticleEffectControls",
    "path": "editor/reference/components/ParticleEffectControls.md",
    "source": "editor/js/components/ParticleEffectControls.js",
    "import": "/editor/js/components/ParticleEffectControls.js",
    "sourceHash": "d61958379d6ce826791ccbb797e37abc969474e17c238f0e42260ddb48902daa",
    "summary": "ParticleEffectControls.js - Editor UI Controls for Custom Particle Effects Adds controls to the particle emitter inspector panel: - Checkbox to enable custom effects - Effect selector dropdown - Edit button to open shader editor - Parameter sliders for effect params",
    "exports": [
      {
        "name": "ParticleEffectControls",
        "kind": "class",
        "signature": "class ParticleEffectControls",
        "summary": ""
      },
      {
        "name": "createParticleEffectControls",
        "kind": "function",
        "signature": "createParticleEffectControls(options = {})",
        "summary": "Create particle effect controls"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "components/ShaderCodeEditor",
    "path": "editor/reference/components/ShaderCodeEditor.md",
    "source": "editor/js/components/ShaderCodeEditor.js",
    "import": "/editor/js/components/ShaderCodeEditor.js",
    "sourceHash": "8980f7408ced3e545163c0d35a4cc8fa6321b5274d5cb7e6df4d69b362e1a505",
    "summary": "ShaderCodeEditor.js - In-Editor WGSL Code Editor Popup A notepad-style popup for editing custom particle effect shaders. Features: - Syntax highlighting for WGSL - Real-time validation - Live preview - Template snippets - Error display with line numbers",
    "exports": [
      {
        "name": "ShaderCodeEditor",
        "kind": "class",
        "signature": "class ShaderCodeEditor",
        "summary": ""
      },
      {
        "name": "openShaderCodeEditor",
        "kind": "function",
        "signature": "openShaderCodeEditor(effect, options = {})",
        "summary": "Create and open a shader code editor"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "loader-guard",
    "path": "editor/reference/loader-guard.md",
    "source": "editor/js/loader-guard.js",
    "import": "/editor/js/loader-guard.js",
    "sourceHash": "8eabd08df80c70f13ef747bd81298c062fa46bca6f82479449db92ac63a2fce8",
    "summary": "Keep the loading veil's context-menu suppression CSP-safe and scoped to the short interval in which the veil can actually receive pointer input.",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "main",
    "path": "editor/reference/main.md",
    "source": "editor/js/main.js",
    "import": "/editor/js/main.js",
    "sourceHash": "9424b5ca76dc78cc0d7368a15cc95591c98ada8218d8dd750bc15eb446826b51",
    "summary": "Main entry point for Game Editor",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "modules/ColliderGenerators",
    "path": "editor/reference/modules/ColliderGenerators.md",
    "source": "editor/js/modules/ColliderGenerators.js",
    "import": "/editor/js/modules/ColliderGenerators.js",
    "sourceHash": "983951e3576607473bc3f1f0e5062e9012c7d3326e685888ece3077e14576950",
    "summary": "ColliderGenerators.js - Procedural collider generation utilities Extracted from EditorPhysics.js for modularity Includes: - SDF-based collider generation with anti-aliasing - Line/curve to voxel colliders - Network-based colliders (trees, tunnels, pipes) - Noise-based procedural colliders - Spatial hash for collider queries",
    "exports": [
      {
        "name": "generateCollidersFromSDF",
        "kind": "function",
        "signature": "generateCollidersFromSDF(sdfFunc, bounds, resolution = 10, options = {})",
        "summary": "Generate colliders from ANY SDF function with anti-aliasing"
      },
      {
        "name": "generateConvexMeshFromSDF",
        "kind": "function",
        "signature": "generateConvexMeshFromSDF(sdfFunc, bounds, resolution = 16)",
        "summary": "Generate a CONVEX MESH collider from SDF"
      },
      {
        "name": "colliderVertexHash",
        "kind": "function",
        "signature": "colliderVertexHash(vertices)",
        "summary": ""
      },
      {
        "name": "generateHollowTorusColliders",
        "kind": "function",
        "signature": "generateHollowTorusColliders(majorRadius, minorRadius, wallThickness, resolution = 12)",
        "summary": "Generate hollow torus colliders"
      },
      {
        "name": "generateHollowConeColliders",
        "kind": "function",
        "signature": "generateHollowConeColliders(angle, height, wallThickness, resolution = 12)",
        "summary": "Generate hollow cone/funnel colliders"
      },
      {
        "name": "generateLineColliders",
        "kind": "function",
        "signature": "generateLineColliders(start, end, radius, resolution = 10)",
        "summary": "Generate voxel colliders along a line segment"
      },
      {
        "name": "generateCurveColliders",
        "kind": "function",
        "signature": "generateCurveColliders(points, radius, resolution = 10, segments = 20)",
        "summary": "Generate voxel colliders along a curve"
      },
      {
        "name": "generateCollidersFromNetwork",
        "kind": "function",
        "signature": "generateCollidersFromNetwork(network, resolution = 8)",
        "summary": "Generate colliders from a LineNetwork"
      },
      {
        "name": "generateTreeColliders",
        "kind": "function",
        "signature": "generateTreeColliders(options = {})",
        "summary": "Generate tree-shaped colliders"
      },
      {
        "name": "generateRootColliders",
        "kind": "function",
        "signature": "generateRootColliders(options = {})",
        "summary": "Generate root system colliders"
      },
      {
        "name": "generateTunnelColliders",
        "kind": "function",
        "signature": "generateTunnelColliders(options = {})",
        "summary": "Generate tunnel/cave colliders"
      },
      {
        "name": "generatePipeNetworkColliders",
        "kind": "function",
        "signature": "generatePipeNetworkColliders(nodes, connections, resolution = 8)",
        "summary": "Generate custom pipe/beam network colliders"
      },
      {
        "name": "generateBezierColliders",
        "kind": "function",
        "signature": "generateBezierColliders(p0, p1, p2, p3, radius, resolution = 10)",
        "summary": "Generate colliders along a cubic Bezier curve"
      },
      {
        "name": "generateSplineColliders",
        "kind": "function",
        "signature": "generateSplineColliders(controlPoints, radius, resolution = 10)",
        "summary": "Generate colliders along a Bezier spline"
      },
      {
        "name": "testSphereSphere",
        "kind": "function",
        "signature": "testSphereSphere(c1, r1, c2, r2)",
        "summary": ""
      },
      {
        "name": "testAABBAABB",
        "kind": "function",
        "signature": "testAABBAABB(min1, max1, min2, max2)",
        "summary": ""
      },
      {
        "name": "testSphereAABB",
        "kind": "function",
        "signature": "testSphereAABB(center, radius, aabbMin, aabbMax)",
        "summary": ""
      },
      {
        "name": "computeColliderAABB",
        "kind": "function",
        "signature": "computeColliderAABB(colliders)",
        "summary": ""
      },
      {
        "name": "generateNoisyColliders",
        "kind": "function",
        "signature": "generateNoisyColliders(baseSdf, bounds, options = {})",
        "summary": "Generate rocky/organic colliders using noise-displaced SDF"
      },
      {
        "name": "generateRockySphereColliders",
        "kind": "function",
        "signature": "generateRockySphereColliders(center, radius, roughness = 0.15, resolution = 12)",
        "summary": "Generate rocky sphere collider"
      },
      {
        "name": "generateTerrainColliders",
        "kind": "function",
        "signature": "generateTerrainColliders(sizeX, sizeZ, height, resolution = 8, seed = 0)",
        "summary": "Generate terrain chunk collider"
      },
      {
        "name": "generateCaveColliders",
        "kind": "function",
        "signature": "generateCaveColliders(bounds, tunnelRadius = 1.5, resolution = 6, seed = 0)",
        "summary": "Generate cave/hollow rock colliders"
      },
      {
        "name": "initColliderSpatialHash",
        "kind": "function",
        "signature": "initColliderSpatialHash(cellSize = 2.0)",
        "summary": ""
      },
      {
        "name": "addToSpatialHash",
        "kind": "function",
        "signature": "addToSpatialHash(id, colliders, worldPosition = [0, 0, 0])",
        "summary": ""
      },
      {
        "name": "queryNearbyColliders",
        "kind": "function",
        "signature": "queryNearbyColliders(point, radius)",
        "summary": ""
      },
      {
        "name": "clearColliderSpatialHash",
        "kind": "function",
        "signature": "clearColliderSpatialHash()",
        "summary": ""
      },
      {
        "name": "computeBounce",
        "kind": "function",
        "signature": "computeBounce(velocity, normal, restitution = 0.5)",
        "summary": ""
      },
      {
        "name": "applyFriction",
        "kind": "function",
        "signature": "applyFriction(velocity, normal, friction, dt)",
        "summary": ""
      },
      {
        "name": "predictLanding",
        "kind": "function",
        "signature": "predictLanding(start, velocity, gravity = 9.81)",
        "summary": ""
      },
      {
        "name": "generateScatteredColliders",
        "kind": "function",
        "signature": "generateScatteredColliders(options = {})",
        "summary": ""
      },
      {
        "name": "generateRockFieldColliders",
        "kind": "function",
        "signature": "generateRockFieldColliders(options = {})",
        "summary": ""
      },
      {
        "name": "LineNetwork",
        "kind": "re-export",
        "signature": "LineNetwork",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/CollisionDebugOverlay",
    "path": "editor/reference/modules/CollisionDebugOverlay.md",
    "source": "editor/js/modules/CollisionDebugOverlay.js",
    "import": "/editor/js/modules/CollisionDebugOverlay.js",
    "sourceHash": "d7029eedb6dbb3557a6f1d36fbc89f104c81321e3a8c3c24555d263f848d33a2",
    "summary": "CollisionDebugOverlay.js - Visual debug overlay for collision layers and modes Displays collision layer, mask, and mode information for selected entities and optionally renders debug visualizations for collision relationships.",
    "exports": [
      {
        "name": "createCollisionDebugPanel",
        "kind": "function",
        "signature": "createCollisionDebugPanel(editor)",
        "summary": "Create collision debug overlay panel"
      },
      {
        "name": "toggleCollisionDebugOverlay",
        "kind": "function",
        "signature": "toggleCollisionDebugOverlay(editor)",
        "summary": "Toggle collision debug overlay"
      },
      {
        "name": "dumpCollisionInfo",
        "kind": "function",
        "signature": "dumpCollisionInfo(editor)",
        "summary": "Get collision debug info for all entities (for console debugging)"
      },
      {
        "name": "checkCollisionConflicts",
        "kind": "function",
        "signature": "checkCollisionConflicts(editor)",
        "summary": "Check for collision layer conflicts (entities that should collide but don't)"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorAI",
    "path": "editor/reference/modules/EditorAI.md",
    "source": "editor/js/modules/EditorAI.js",
    "import": "/editor/js/modules/EditorAI.js",
    "sourceHash": "4fad73e406a5e7125b4848bee6a9eb0d4d15e2566618dabd83dd90e94e13f0df",
    "summary": "EditorAI.js - AI, Navigation, Steering, and Behavior Trees for Editor Extracted from EditorPhysics.js for modularity",
    "exports": [
      {
        "name": "getOrCreateNavGrid",
        "kind": "function",
        "signature": "getOrCreateNavGrid(options = {})",
        "summary": "Initialize or get the editor's navigation grid"
      },
      {
        "name": "findPath",
        "kind": "function",
        "signature": "findPath(start, goal, options = {})",
        "summary": "Find a path between two world positions"
      },
      {
        "name": "updateNavGridFromColliders",
        "kind": "function",
        "signature": "updateNavGridFromColliders(colliders, walkable = false)",
        "summary": "Mark cells as blocked/walkable based on colliders"
      },
      {
        "name": "smoothPath",
        "kind": "function",
        "signature": "smoothPath(waypoints, smoothing = 0.5)",
        "summary": "Smooth a path using string-pulling"
      },
      {
        "name": "getPathSteering",
        "kind": "function",
        "signature": "getPathSteering(currentPos, waypoints, lookahead = 1.0)",
        "summary": "Get steering direction to follow a path"
      },
      {
        "name": "getNavGridVisualization",
        "kind": "function",
        "signature": "getNavGridVisualization()",
        "summary": "Debug: visualize nav grid walkability"
      },
      {
        "name": "createAIAgent",
        "kind": "function",
        "signature": "createAIAgent(options = {})",
        "summary": "Create an AI agent with steering behaviors"
      },
      {
        "name": "updateAIAgent",
        "kind": "function",
        "signature": "updateAIAgent(agent, behaviors, dt)",
        "summary": "Update AI agent with combined steering behaviors"
      },
      {
        "name": "createFlock",
        "kind": "function",
        "signature": "createFlock(count, options = {})",
        "summary": "Create a flock of AI agents"
      },
      {
        "name": "updateFlock",
        "kind": "function",
        "signature": "updateFlock(agents, dt, options = {})",
        "summary": "Update entire flock with flocking behavior"
      },
      {
        "name": "createPatrolBehavior",
        "kind": "function",
        "signature": "createPatrolBehavior(waypoints)",
        "summary": "Create a simple patrol behavior tree"
      },
      {
        "name": "createChaseFleeBehavior",
        "kind": "function",
        "signature": "createChaseFleeBehavior(chaseRadius = 10, fleeHealth = 20)",
        "summary": "Create a chase/flee behavior tree"
      },
      {
        "name": "tickBehaviorTree",
        "kind": "function",
        "signature": "tickBehaviorTree(tree, blackboard, dt)",
        "summary": "Run a behavior tree tick"
      },
      {
        "name": "createAIPerception",
        "kind": "function",
        "signature": "createAIPerception(options = {})",
        "summary": "Create an AI perception component"
      },
      {
        "name": "canSee",
        "kind": "function",
        "signature": "canSee(perception, position, forward, targetPos)",
        "summary": "Check if an entity can see a target"
      },
      {
        "name": "canHear",
        "kind": "function",
        "signature": "canHear(perception, position, soundPos, soundVolume = 1)",
        "summary": "Check if an entity can hear a sound"
      },
      {
        "name": "updateAIPerception",
        "kind": "function",
        "signature": "updateAIPerception(perception, position, forward, entities, dt)",
        "summary": "Update perception - detect nearby entities"
      },
      {
        "name": "getLastKnownPosition",
        "kind": "function",
        "signature": "getLastKnownPosition(perception, entityId)",
        "summary": "Get last known position of an entity"
      },
      {
        "name": "NODE_STATUS",
        "kind": "re-export",
        "signature": "NODE_STATUS",
        "summary": ""
      },
      {
        "name": "arrive",
        "kind": "re-export",
        "signature": "arrive",
        "summary": ""
      },
      {
        "name": "createAction",
        "kind": "re-export",
        "signature": "createAction",
        "summary": ""
      },
      {
        "name": "createCondition",
        "kind": "re-export",
        "signature": "createCondition",
        "summary": ""
      },
      {
        "name": "createNavGrid",
        "kind": "re-export",
        "signature": "createNavGrid",
        "summary": ""
      },
      {
        "name": "createSelector",
        "kind": "re-export",
        "signature": "createSelector",
        "summary": ""
      },
      {
        "name": "createSequence",
        "kind": "re-export",
        "signature": "createSequence",
        "summary": ""
      },
      {
        "name": "createSteeringAgent",
        "kind": "re-export",
        "signature": "createSteeringAgent",
        "summary": ""
      },
      {
        "name": "evade",
        "kind": "re-export",
        "signature": "evade",
        "summary": ""
      },
      {
        "name": "findPathInNavWorld",
        "kind": "re-export",
        "signature": "findPathInNavWorld",
        "summary": ""
      },
      {
        "name": "findPathOnGrid",
        "kind": "re-export",
        "signature": "findPathOnGrid",
        "summary": ""
      },
      {
        "name": "flee",
        "kind": "re-export",
        "signature": "flee",
        "summary": ""
      },
      {
        "name": "flock",
        "kind": "re-export",
        "signature": "flock",
        "summary": ""
      },
      {
        "name": "gridToWorld",
        "kind": "re-export",
        "signature": "gridToWorld",
        "summary": ""
      },
      {
        "name": "pursue",
        "kind": "re-export",
        "signature": "pursue",
        "summary": ""
      },
      {
        "name": "seek",
        "kind": "re-export",
        "signature": "seek",
        "summary": ""
      },
      {
        "name": "tickNode",
        "kind": "re-export",
        "signature": "tickNode",
        "summary": ""
      },
      {
        "name": "wander",
        "kind": "re-export",
        "signature": "wander",
        "summary": ""
      },
      {
        "name": "worldToGrid",
        "kind": "re-export",
        "signature": "worldToGrid",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorAudio",
    "path": "editor/reference/modules/EditorAudio.md",
    "source": "editor/js/modules/EditorAudio.js",
    "import": "/editor/js/modules/EditorAudio.js",
    "sourceHash": "9b83387e6c1b77bbf2e7ad681bb340ef23c4e893fcc4b6b3c7549d4740fb3f21",
    "summary": "EditorAudio.js - Simulation Audio Bridge for the Editor Manages the runtime AudioEngine lifecycle during play mode: - Initializes AudioEngine on first play - Ticks audio each frame while playing - Stops all sim audio on stop/pause - Bridges substance emitters → procedural audio",
    "exports": [
      {
        "name": "startSimAudio",
        "kind": "function",
        "signature": "async startSimAudio(editor)",
        "summary": "Called when user enters play mode. Initializes engine if needed and starts audio."
      },
      {
        "name": "stopSimAudio",
        "kind": "function",
        "signature": "stopSimAudio()",
        "summary": "Called when user exits play mode (Stop). Stops all active sources with a short fade."
      },
      {
        "name": "pauseSimAudio",
        "kind": "function",
        "signature": "pauseSimAudio()",
        "summary": "Called when user pauses. Suspends the AudioContext (freezes all audio in place)."
      },
      {
        "name": "resumeSimAudio",
        "kind": "function",
        "signature": "async resumeSimAudio()",
        "summary": "Called when user resumes from pause."
      },
      {
        "name": "tickSimAudio",
        "kind": "function",
        "signature": "tickSimAudio(dt)",
        "summary": "Tick the audio engine. Call once per frame while playing."
      },
      {
        "name": "destroySimAudio",
        "kind": "function",
        "signature": "destroySimAudio()",
        "summary": "Full cleanup. Call on editor close."
      },
      {
        "name": "getSimAudioEngine",
        "kind": "function",
        "signature": "getSimAudioEngine()",
        "summary": "Get the current engine instance (for external integration)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorAudioFX",
    "path": "editor/reference/modules/EditorAudioFX.md",
    "source": "editor/js/modules/EditorAudioFX.js",
    "import": "/editor/js/modules/EditorAudioFX.js",
    "sourceHash": "27933ed0a89b878a1b03628f353cf7b636e4b6dc78f566456cead83085998f23",
    "summary": "EditorAudioFX.js - Procedural Editor Sound Effects All sounds are synthesized with Web Audio API oscillators & noise — no sample files. Provides: loading ambient pad, play/stop/pause chimes, UI clicks, error beeps. Usage: import { editorAudioFX } from './EditorAudioFX.js'; editorAudioFX.init();               // call once after first user gesture editorAudioFX.playChime();           // play-mode enter editorAudioFX.stopChime();           // play-mode exit editorAudioFX.pauseClick();          // pause toggle editorAudioFX.uiClick();             // generic button click editorAudioFX.uiHover();             // hover over interactive element editorAudioFX.errorBeep();           // error / invalid action editorAudioFX.startLoadingAmbient(); // loading screen ambient pad editorAudioFX.stopLoadingAmbient();  // fade out loading pad",
    "exports": [
      {
        "name": "editorAudioFX",
        "kind": "constant",
        "signature": "editorAudioFX",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorCollab",
    "path": "editor/reference/modules/EditorCollab.md",
    "source": "editor/js/modules/EditorCollab.js",
    "import": "/editor/js/modules/EditorCollab.js",
    "sourceHash": "febf26bea6606fe4b8401149e6a7f273502d3da3fcb6f406059c25f7c3c499c0",
    "summary": "EditorCollab.js Editor-side integration for the collab system. Mounts onto EditorApp and wires all hooks. Hooks wired: - EditorHistory.pushAction  → broadcast op to peers - ProjectStorage.saveProject → broadcast snapshot - PrefabLibrary.save/delete  → broadcast prefab ops - Viewport render loop       → presence tick at 10 Hz - EditorApp.enterPlayMode    → broadcast play_sync - EditorApp.togglePause      → broadcast pause_sync - EditorApp.exitPlayMode     → broadcast stop_sync",
    "exports": [
      {
        "name": "initEditorCollab",
        "kind": "function",
        "signature": "initEditorCollab(editor)",
        "summary": "Initialize the collab system and attach it to the editor. Called from EditorApp.initialize() at the end."
      },
      {
        "name": "destroyEditorCollab",
        "kind": "function",
        "signature": "destroyEditorCollab(editor)",
        "summary": "Destroy the collab system and remove all hooks."
      },
      {
        "name": "getCollabState",
        "kind": "function",
        "signature": "getCollabState(editor)",
        "summary": "Get the current collab state from the editor."
      },
      {
        "name": "isCollabActive",
        "kind": "function",
        "signature": "isCollabActive(editor)",
        "summary": ""
      },
      {
        "name": "isCollabConnected",
        "kind": "function",
        "signature": "isCollabConnected(editor)",
        "summary": ""
      },
      {
        "name": "getCollabPeers",
        "kind": "function",
        "signature": "getCollabPeers(editor)",
        "summary": ""
      },
      {
        "name": "getCollabPresenceList",
        "kind": "function",
        "signature": "getCollabPresenceList(editor)",
        "summary": ""
      },
      {
        "name": "getCollabInterpCamera",
        "kind": "function",
        "signature": "getCollabInterpCamera(editor, peerId)",
        "summary": "Get Hermite-interpolated camera for a remote peer (smooth, per-frame). Returns { pos: [x,y,z], target: [x,y,z] } or null."
      },
      {
        "name": "getCollabStats",
        "kind": "function",
        "signature": "getCollabStats(editor)",
        "summary": "Get collab camera interpolation + connection stats for UI display."
      },
      {
        "name": "getCollabRouterStats",
        "kind": "function",
        "signature": "getCollabRouterStats(editor)",
        "summary": "Get message router stats for bandwidth monitoring. Returns { sent, dropped, coalesced, bytesSent, backpressureFrames, rateMultiplier }"
      },
      {
        "name": "getCollabInterpDelay",
        "kind": "function",
        "signature": "getCollabInterpDelay(editor)",
        "summary": "Get the current adaptive interpolation delay (ms). On LAN: ~20ms. On jittery connections: up to 150ms. Auto-adjusts each frame."
      },
      {
        "name": "collabPresenceTick",
        "kind": "function",
        "signature": "collabPresenceTick(editor)",
        "summary": "Called from Viewport render loop to send presence at 10 Hz."
      },
      {
        "name": "exportCollabTimeline",
        "kind": "function",
        "signature": "exportCollabTimeline(editor)",
        "summary": "Export local timeline as JSON download."
      },
      {
        "name": "collabTrackGrab",
        "kind": "function",
        "signature": "collabTrackGrab(editor, entityId)",
        "summary": "Notify collab that local user started grabbing an entity (play mode). Claims per-entity ownership at GRABBED priority so our transforms are authoritative."
      },
      {
        "name": "collabUntrackGrab",
        "kind": "function",
        "signature": "collabUntrackGrab(editor, entityId)",
        "summary": "Notify collab that local user released a grabbed entity. Releases per-entity ownership so default authority resumes."
      },
      {
        "name": "collabClaimSelected",
        "kind": "function",
        "signature": "collabClaimSelected(editor, entityId)",
        "summary": "Claim ownership of an entity at SELECTED priority (inspector editing)."
      },
      {
        "name": "collabReleaseEntity",
        "kind": "function",
        "signature": "collabReleaseEntity(editor, entityId)",
        "summary": "Release ownership of an entity (selected or grabbed)."
      },
      {
        "name": "getCollabEntityOwner",
        "kind": "function",
        "signature": "getCollabEntityOwner(editor, entityId)",
        "summary": "Get the current owner of an entity. Returns { ownerId, priority } or null."
      },
      {
        "name": "isCollabEntityLocallyOwned",
        "kind": "function",
        "signature": "isCollabEntityLocallyOwned(editor, entityId)",
        "summary": "Check if the local peer owns an entity."
      },
      {
        "name": "getCollabGrabGlows",
        "kind": "function",
        "signature": "getCollabGrabGlows(editor)",
        "summary": "Get map of entityId → color hex for entities being grabbed by remote peers. Used by Viewport to render grab glow."
      },
      {
        "name": "isCollabPlayAuthority",
        "kind": "function",
        "signature": "isCollabPlayAuthority(editor)",
        "summary": "Returns true if this peer is the physics authority during play mode. Non-authority peers should skip local physics stepping and instead receive transforms from the authority."
      },
      {
        "name": "collabInterpolateFrame",
        "kind": "function",
        "signature": "collabInterpolateFrame(editor)",
        "summary": "Interpolate buffered remote transforms. Call every render frame on non-authority peers. Smoothly tweens entity positions between received keyframes with a 100ms render delay."
      },
      {
        "name": "hostRoom",
        "kind": "function",
        "signature": "hostRoom(editor, roomId, wordKey, numberKey)",
        "summary": "Host a room. Auto-generates word key and number key if not provided. Starts signaling so peers can discover this host."
      },
      {
        "name": "setCollabRoom",
        "kind": "function",
        "signature": "setCollabRoom(editor, roomId, wordKey, numberKey, hostId, hostFingerprint)",
        "summary": "Join a room with dual-key authentication (all 3 must match the host). Legacy alias: setCollabRoomId calls this."
      },
      {
        "name": "setCollabRoomId",
        "kind": "function",
        "signature": "setCollabRoomId(editor, roomId)",
        "summary": ""
      },
      {
        "name": "setAnonMode",
        "kind": "function",
        "signature": "setAnonMode(editor, enabled)",
        "summary": "Toggle anonymous mode. Must be called BEFORE hostRoom/joinRoom. When enabled: - Peers get random anonymous IDs (different each session) - Real peer IDs are stripped from all ops - TURN-only relay hides IP addresses - Garlic encryption prevents relay from reading message content"
      },
      {
        "name": "leaveRoom",
        "kind": "function",
        "signature": "leaveRoom(editor)",
        "summary": "Leave the current room. Stops signaling and clears peer state. Does NOT destroy the collab system — user can Host/Join again."
      },
      {
        "name": "generateWordKey",
        "kind": "function",
        "signature": "generateWordKey()",
        "summary": "Generate a random word key (two words joined by a dash). 120 words × 120 words = 14,400 combinations per word pair."
      },
      {
        "name": "generateNumberKey",
        "kind": "function",
        "signature": "generateNumberKey()",
        "summary": "Generate a random 6-digit number key. 900,000 combinations (100000-999999). Total key space with words: 120×120×900000 ≈ 12.96 billion combinations."
      },
      {
        "name": "encodeInviteCode",
        "kind": "function",
        "signature": "encodeInviteCode(roomId, wordKey, numberKey, hostId, hostFingerprint)",
        "summary": "Encode room credentials into a single invite code string. Format: PE-<base64url(roomId § wordKey § numberKey § hostId § hostFingerprint)> The hostFingerprint (16 hex chars) allows joiners to verify host identity."
      },
      {
        "name": "decodeInviteCode",
        "kind": "function",
        "signature": "decodeInviteCode(code)",
        "summary": "Decode an invite code back to { roomId, wordKey, numberKey, hostId, hostFingerprint }. Returns null if the code is invalid."
      },
      {
        "name": "setAutoMod",
        "kind": "function",
        "signature": "setAutoMod(editor, enabled)",
        "summary": "Toggle auto-moderation (auto-kick, mute, throttle from integrity violations). Only the host can enable/disable. Off by default."
      },
      {
        "name": "kickPeer",
        "kind": "function",
        "signature": "kickPeer(editor, peerId)",
        "summary": "Kick a peer from the room. Only the host (first connected) should call this. Broadcasts a __kick__ op, then the kicked peer clears its stored credentials."
      },
      {
        "name": "getSavedRoomCredentials",
        "kind": "function",
        "signature": "getSavedRoomCredentials()",
        "summary": "Get saved room credentials from localStorage."
      },
      {
        "name": "clearRoomCredentials",
        "kind": "function",
        "signature": "clearRoomCredentials()",
        "summary": "Clear saved room credentials (called on kick or manual disconnect)."
      },
      {
        "name": "injectCollabStorageDeps",
        "kind": "function",
        "signature": "injectCollabStorageDeps(deps)",
        "summary": ""
      },
      {
        "name": "injectCollabHistoryHelpers",
        "kind": "function",
        "signature": "injectCollabHistoryHelpers(helpers)",
        "summary": ""
      },
      {
        "name": "editorCollabCompositeSuffix",
        "kind": "function",
        "signature": "editorCollabCompositeSuffix(raw)",
        "summary": "Build a composite project ID from room + wordKey + numberKey. The composite is used as the BitTorrent info_hash seed, so only peers with all 3 matching values will discover each other on the swarm. IMPORTANT: NEVER returns a bare roomId. Even without keys, a random salt is included so two users with the same folder name can't collide. The hostId (selfId of host) is mixed in when hosting to guarantee that different hosts with identical room+word+number still get unique swarms. Uses FNV-1a 64-bit (emulated as two 32-bit hashes) for collision resistance."
      },
      {
        "name": "buildEditorCollabCompositeId",
        "kind": "function",
        "signature": "buildEditorCollabCompositeId(roomId, wordKey, numberKey, hostId)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorGuide",
    "path": "editor/reference/modules/EditorGuide.md",
    "source": "editor/js/modules/EditorGuide.js",
    "import": "/editor/js/modules/EditorGuide.js",
    "sourceHash": "bcebabc41b9d2d8a731853d105c324bcdc521fd150b3059788b2f35df5bd0aa2",
    "summary": "EditorGuide.js — Fullscreen interactive guide overlay Future-proof feature list: - ARIA accessibility (role=dialog, aria-modal, focus trap) - Keyboard nav (Arrow keys sidebar, Tab sections, ? global shortcut) - Search / filter across all section text - localStorage progress tracking with completion badges - First-launch auto-show - Guide versioning — \"what's new\" badge on updates - Deep linking via URL hash (#guide-camera) - Scroll progress bar - Reading time estimates per section - Interactive demo placeholder canvases (ready for engine runtime) - Print-friendly CSS (@media print)",
    "exports": [
      {
        "name": "show",
        "kind": "function",
        "signature": "show(sectionId)",
        "summary": ""
      },
      {
        "name": "hide",
        "kind": "function",
        "signature": "hide()",
        "summary": ""
      },
      {
        "name": "toggle",
        "kind": "function",
        "signature": "toggle()",
        "summary": ""
      },
      {
        "name": "isVisible",
        "kind": "function",
        "signature": "isVisible()",
        "summary": ""
      },
      {
        "name": "checkFirstLaunch",
        "kind": "function",
        "signature": "checkFirstLaunch()",
        "summary": ""
      },
      {
        "name": "checkHashLink",
        "kind": "function",
        "signature": "checkHashLink()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorHistory",
    "path": "editor/reference/modules/EditorHistory.md",
    "source": "editor/js/modules/EditorHistory.js",
    "import": "/editor/js/modules/EditorHistory.js",
    "sourceHash": "9b1878b55f15a8c5eac6585bd068fc313cf524da470f0ff0afbee7599612bf5e",
    "summary": "EditorHistory - Undo/Redo System with Clipboard Support Action types: - transform: Entity position/rotation/scale change - create: Entity creation - delete: Entity deletion - delete_multi: Multiple entity deletion - property: Component property change - model_animation: Imported model clip/playback state change - model_morph_weights: Imported model morph ownership/weight change - rename: Entity rename - reparent: Entity moved to different folder - paste: Paste operation (multiple entities) - folder_create: Folder creation - folder_delete: Folder deletion - folder_rename: Folder rename - component_add: Component added to entity - component_remove: Component removed from entity - selection: Selection change (for group operations) Memory optimizations: - Transform actions use quantized floats (0.001 precision for position) - Batches rapid transform changes into single action Component capture: - All ECS components listed in TRACKED_COMPONENTS are captured - Add new component types to TRACKED_COMPONENTS as they're added to engine",
    "exports": [
      {
        "name": "setCollabBroadcastHook",
        "kind": "function",
        "signature": "setCollabBroadcastHook(fn)",
        "summary": ""
      },
      {
        "name": "setCollabReplayFlag",
        "kind": "function",
        "signature": "setCollabReplayFlag(v)",
        "summary": ""
      },
      {
        "name": "initHistory",
        "kind": "function",
        "signature": "initHistory(editor)",
        "summary": "Initialize history system with editor reference"
      },
      {
        "name": "selectAll",
        "kind": "function",
        "signature": "selectAll()",
        "summary": "Select all entities"
      },
      {
        "name": "pushAction",
        "kind": "function",
        "signature": "pushAction(action)",
        "summary": "Push an action to the undo stack"
      },
      {
        "name": "recordTransform",
        "kind": "function",
        "signature": "recordTransform(entityId, beforePos, beforeRot, beforeScale, afterPos, afterRot, afterScale)",
        "summary": "Record a transform change (with batching and compression)"
      },
      {
        "name": "flushPendingTransform",
        "kind": "function",
        "signature": "flushPendingTransform()",
        "summary": "Force commit any pending transform (call before other operations)"
      },
      {
        "name": "recordCreate",
        "kind": "function",
        "signature": "recordCreate(entityId, entityData)",
        "summary": "Record entity creation"
      },
      {
        "name": "recordDelete",
        "kind": "function",
        "signature": "recordDelete(entityId, entityData)",
        "summary": "Record entity deletion"
      },
      {
        "name": "recordProperty",
        "kind": "function",
        "signature": "recordProperty(entityId, componentName, propertyName, beforeValue, afterValue)",
        "summary": "Record property change"
      },
      {
        "name": "recordModelAnimation",
        "kind": "function",
        "signature": "recordModelAnimation(entityId, beforeValue, afterValue)",
        "summary": ""
      },
      {
        "name": "recordModelMorphWeights",
        "kind": "function",
        "signature": "recordModelMorphWeights(entityId, beforeValue, afterValue)",
        "summary": ""
      },
      {
        "name": "recordRename",
        "kind": "function",
        "signature": "recordRename(entityId, beforeName, afterName)",
        "summary": "Record rename"
      },
      {
        "name": "recordReparent",
        "kind": "function",
        "signature": "recordReparent(entityId, beforeFolderId, afterFolderId)",
        "summary": "Record entity reparent (move to different folder)"
      },
      {
        "name": "recordFolderCreate",
        "kind": "function",
        "signature": "recordFolderCreate(folderId, folderData)",
        "summary": "Record folder creation"
      },
      {
        "name": "recordFolderDelete",
        "kind": "function",
        "signature": "recordFolderDelete(folderId, folderData, childEntities)",
        "summary": "Record folder deletion"
      },
      {
        "name": "recordFolderRename",
        "kind": "function",
        "signature": "recordFolderRename(folderId, beforeName, afterName)",
        "summary": "Record folder rename"
      },
      {
        "name": "recordComponentAdd",
        "kind": "function",
        "signature": "recordComponentAdd(entityId, componentName, componentData)",
        "summary": "Record component added to entity"
      },
      {
        "name": "recordComponentRemove",
        "kind": "function",
        "signature": "recordComponentRemove(entityId, componentName, componentData)",
        "summary": "Record component removed from entity"
      },
      {
        "name": "recordSelectionChange",
        "kind": "function",
        "signature": "recordSelectionChange(beforeSelection, afterSelection)",
        "summary": "Record selection change (for group operations)"
      },
      {
        "name": "undo",
        "kind": "function",
        "signature": "undo()",
        "summary": "Undo last action"
      },
      {
        "name": "redo",
        "kind": "function",
        "signature": "redo()",
        "summary": "Redo last undone action"
      },
      {
        "name": "copy",
        "kind": "function",
        "signature": "copy()",
        "summary": "Copy selected entities to clipboard"
      },
      {
        "name": "cut",
        "kind": "function",
        "signature": "cut()",
        "summary": "Cut selected entities (copy + delete)"
      },
      {
        "name": "paste",
        "kind": "function",
        "signature": "async paste()",
        "summary": "Paste from clipboard"
      },
      {
        "name": "duplicate",
        "kind": "function",
        "signature": "async duplicate()",
        "summary": "Duplicate selected entities"
      },
      {
        "name": "deleteSelected",
        "kind": "function",
        "signature": "deleteSelected()",
        "summary": "Delete selected entities"
      },
      {
        "name": "clearHistory",
        "kind": "function",
        "signature": "clearHistory()",
        "summary": "Clear all history"
      },
      {
        "name": "getHistoryState",
        "kind": "function",
        "signature": "getHistoryState()",
        "summary": "Get history state for debugging"
      },
      {
        "name": "canUndo",
        "kind": "function",
        "signature": "canUndo()",
        "summary": ""
      },
      {
        "name": "canRedo",
        "kind": "function",
        "signature": "canRedo()",
        "summary": ""
      },
      {
        "name": "hasClipboard",
        "kind": "function",
        "signature": "hasClipboard()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorMeshConversions",
    "path": "editor/reference/modules/EditorMeshConversions.md",
    "source": "editor/js/modules/EditorMeshConversions.js",
    "import": "/editor/js/modules/EditorMeshConversions.js",
    "sourceHash": "2ba141a3a6ac91d4e804c6cffae4e9a42f6fe3c93937e2f4dc0f2b62ab8f66c1",
    "summary": "============================================================================ EditorMeshConversions.js — Mesh conversion operations for editor entities  Bridges Kaolin conversion modules to the editor: - Mesh → Voxel grid (MeshToVoxel) - Mesh → Point cloud (MeshToPoints) - Mesh → Soft Body (AutoTetMesh → PBD sim) - Points → Mesh (PointsToMesh) - SDF → Mesh (SDFToMesh) - Export mesh as OBJ/PLY/STL (MeshIO) ============================================================================",
    "exports": [
      {
        "name": "meshToVoxel",
        "kind": "function",
        "signature": "async meshToVoxel(editor, entityId, opts = {})",
        "summary": "Voxelize an entity's mesh and spawn a new entity with the voxel data."
      },
      {
        "name": "meshToPoints",
        "kind": "function",
        "signature": "async meshToPoints(editor, entityId, opts = {})",
        "summary": "Sample points from an entity's mesh and spawn a point cloud entity."
      },
      {
        "name": "meshToSoftBody",
        "kind": "function",
        "signature": "async meshToSoftBody(editor, entityId, opts = {})",
        "summary": "Convert an entity's mesh to a soft body using AutoTetMesh."
      },
      {
        "name": "pointsToMesh",
        "kind": "function",
        "signature": "async pointsToMesh(editor, entityId, opts = {})",
        "summary": "Reconstruct a mesh from a point cloud entity."
      },
      {
        "name": "sdfToMesh",
        "kind": "function",
        "signature": "async sdfToMesh(sdfFn, opts = {})",
        "summary": "Generate a mesh from an SDF function."
      },
      {
        "name": "exportMesh",
        "kind": "function",
        "signature": "async exportMesh(editor, entityId, format = 'obj')",
        "summary": "Export an entity's mesh as a downloadable file."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorMeshOps",
    "path": "editor/reference/modules/EditorMeshOps.md",
    "source": "editor/js/modules/EditorMeshOps.js",
    "import": "/editor/js/modules/EditorMeshOps.js",
    "sourceHash": "ced3876feeee73fd7e7790e3c1eeebd7330414937bae02d305a76bf1b76665b6",
    "summary": "============================================================================ EditorMeshOps.js — Mesh operations for editor entities  Exposes Kaolin mesh ops (subdivide, smooth, normals, validate, flip) on selected entities. Each op clones the mesh, runs the Kaolin function, re-registers with CustomMeshRegistry + EntityMeshRenderer, and pushes an undo snapshot (hybrid: auto for <50k tris, confirm dialog for larger). ============================================================================",
    "exports": [
      {
        "name": "getMeshDataForEntity",
        "kind": "function",
        "signature": "getMeshDataForEntity(editor, entityId)",
        "summary": "Get mesh geometry data for an entity. Checks CustomMeshRegistry first, then EntityMeshRenderer cache."
      },
      {
        "name": "applyMeshOp",
        "kind": "function",
        "signature": "async applyMeshOp(editor, entityId, opName, params = {})",
        "summary": "Apply a mesh operation to an entity. Pipeline: get mesh → optional undo snapshot → run op → re-register → update entity."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorMetrics",
    "path": "editor/reference/modules/EditorMetrics.md",
    "source": "editor/js/modules/EditorMetrics.js",
    "import": "/editor/js/modules/EditorMetrics.js",
    "sourceHash": "528d723e3e03ac2c4a476a2d8f96b7d74ce8f6f94877e71eb0b918f1f9b19b35",
    "summary": "============================================================================ EditorMetrics.js — 3D mesh comparison metrics for the editor console  Exposes Kaolin metrics (Chamfer Distance, Hausdorff, Volumetric IoU) as editor commands for comparing mesh entities.  Usage (from editor console or script): editor.compareMeshes(entityA, entityB) editor.meshMetrics(entityA, entityB, 'chamfer') ============================================================================",
    "exports": [
      {
        "name": "setupMetricsCommands",
        "kind": "function",
        "signature": "setupMetricsCommands(editor)",
        "summary": "Setup mesh metrics commands on the editor instance. Call once during editor initialization."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorParticleSkinning",
    "path": "editor/reference/modules/EditorParticleSkinning.md",
    "source": "editor/js/modules/EditorParticleSkinning.js",
    "import": "/editor/js/modules/EditorParticleSkinning.js",
    "sourceHash": "b90fd337b2461c7fccc731b67c50846d6b5d23722b20d4cf914c309c0ab0c169",
    "summary": "============================================================================ EditorParticleSkinning.js — Editor bridge for learned deformation skinning  Connects Kaolin's ParticleSkinning pipeline to the editor: 1. Capture deformation snapshots from a running soft body sim 2. Extract PCA deformation modes 3. Compute skinning weights 4. Bake to animation keyframes for replay without physics 5. Runtime preview via skinning evaluator  Usage (from editor console or context menu): editor.skinning.startCapture(entityId) editor.skinning.stopCapture(entityId) editor.skinning.train(entityId, { numModes: 8 }) editor.skinning.bake(entityId, { fps: 60 }) editor.skinning.playBaked(entityId) ============================================================================",
    "exports": [
      {
        "name": "setupSkinningCommands",
        "kind": "function",
        "signature": "setupSkinningCommands(editor)",
        "summary": "Set up particle skinning commands on the editor instance."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorParticles",
    "path": "editor/reference/modules/EditorParticles.md",
    "source": "editor/js/modules/EditorParticles.js",
    "import": "/editor/js/modules/EditorParticles.js",
    "sourceHash": "f012c2c4e04973b5edd1f61e1e501a6bcbe584c18e867eababb4644436420133",
    "summary": "Initialize the particle system for the editor",
    "exports": [
      {
        "name": "applyParticleTimelineSettings",
        "kind": "function",
        "signature": "applyParticleTimelineSettings(editor)",
        "summary": ""
      },
      {
        "name": "initParticleSystem",
        "kind": "function",
        "signature": "async initParticleSystem(editor, device, format)",
        "summary": "Initialize the particle system for the editor"
      },
      {
        "name": "stopParticleAudio",
        "kind": "function",
        "signature": "stopParticleAudio()",
        "summary": "Immediately stop all particle audio (impacts + ambients). Called when exiting play mode (Stop button)."
      },
      {
        "name": "destroyParticleSystem",
        "kind": "function",
        "signature": "destroyParticleSystem()",
        "summary": "Destroy the particle system"
      },
      {
        "name": "syncWorldSystemsToEmitters",
        "kind": "function",
        "signature": "syncWorldSystemsToEmitters()",
        "summary": "Scan all active emitters' physics profiles and ensure required world systems are initialized. Call this after registering emitters or when emitter substances change."
      },
      {
        "name": "registerEmitter",
        "kind": "function",
        "signature": "registerEmitter(entityId, config)",
        "summary": "Register an emitter entity"
      },
      {
        "name": "unregisterEmitter",
        "kind": "function",
        "signature": "unregisterEmitter(entityId)",
        "summary": "Unregister an emitter entity"
      },
      {
        "name": "createComposedSpellEffect",
        "kind": "function",
        "signature": "createComposedSpellEffect(editor, sourceEntityId, elements, baseConfig)",
        "summary": "=== AUTO-BLENDING SPELL EFFECT COMPOSER === Applies composed spell effect properties directly to the source emitter. Does NOT create child entities — modifies the source emitter's visual properties based on the element mix to produce a richer, more layered look. The composer analyzes the element combination and applies: - Optimized color derived from element combo - Adjusted emit rate, size, lifetime for a \"spell-like\" feel - Temperature and material properties from element chemistry Called by \"Create Spell From This\" button in EmitterInspectorCard.js."
      },
      {
        "name": "updateEmitter",
        "kind": "function",
        "signature": "updateEmitter(entityId, config)",
        "summary": "Update emitter configuration"
      },
      {
        "name": "enableEmitter",
        "kind": "function",
        "signature": "enableEmitter(entityId)",
        "summary": "Enable an emitter"
      },
      {
        "name": "disableEmitter",
        "kind": "function",
        "signature": "disableEmitter(entityId)",
        "summary": "Disable an emitter"
      },
      {
        "name": "toggleEmitter",
        "kind": "function",
        "signature": "toggleEmitter(entityId)",
        "summary": "Toggle emitter on/off"
      },
      {
        "name": "isEmitterEnabled",
        "kind": "function",
        "signature": "isEmitterEnabled(entityId)",
        "summary": "Check if emitter is enabled"
      },
      {
        "name": "getEmitter",
        "kind": "function",
        "signature": "getEmitter(entityId)",
        "summary": "Get emitter by entity ID (for inspector UI binding)"
      },
      {
        "name": "hasEmitter",
        "kind": "function",
        "signature": "hasEmitter(entityId)",
        "summary": "Check if an entity has an emitter"
      },
      {
        "name": "saveEmitterToECS",
        "kind": "function",
        "signature": "saveEmitterToECS(editor, entityId)",
        "summary": "Save emitter config to entity metadata for serialization"
      },
      {
        "name": "seedParticleRng",
        "kind": "function",
        "signature": "seedParticleRng(seed, tick = 0)",
        "summary": "Seed the particle RNG with a shared collab seed. Call at play start so all peers produce identical particle sequences."
      },
      {
        "name": "saveAllEmittersToECS",
        "kind": "function",
        "signature": "saveAllEmittersToECS(editor)",
        "summary": ""
      },
      {
        "name": "updateParticleQuality",
        "kind": "function",
        "signature": "updateParticleQuality(editor, frameDt, cameraPosition = null)",
        "summary": "Feed the quality stack once per displayed frame using measured wall-clock time. Fixed simulation ticks must not drive this API because a constant 16.67 ms input hides real render pressure and prevents adaptive quality from reacting."
      },
      {
        "name": "getParticleQualityStackStatus",
        "kind": "function",
        "signature": "getParticleQualityStackStatus()",
        "summary": "Return a serializable, truthful snapshot of every active particle quality layer."
      },
      {
        "name": "stepParticles",
        "kind": "function",
        "signature": "stepParticles(editor, dt)",
        "summary": ""
      },
      {
        "name": "prepareDebugRenderer",
        "kind": "function",
        "signature": "async prepareDebugRenderer(mode)",
        "summary": "Prepare a debug renderer for use (call before switching to debug mode)"
      },
      {
        "name": "isDebugRendererReady",
        "kind": "function",
        "signature": "isDebugRendererReady(mode)",
        "summary": "Check if a debug renderer is ready"
      },
      {
        "name": "renderParticlesDepth",
        "kind": "function",
        "signature": "renderParticlesDepth(pass, camera)",
        "summary": "Render particles to depth texture"
      },
      {
        "name": "renderParticlesNormals",
        "kind": "function",
        "signature": "renderParticlesNormals(pass, camera)",
        "summary": "Render particles normals to texture"
      },
      {
        "name": "renderParticlesAlbedo",
        "kind": "function",
        "signature": "renderParticlesAlbedo(pass, camera)",
        "summary": "Render particles albedo to texture"
      },
      {
        "name": "renderParticlesLighting",
        "kind": "function",
        "signature": "renderParticlesLighting(pass, camera)",
        "summary": "Render particles lighting to texture"
      },
      {
        "name": "renderParticlesVelocity",
        "kind": "function",
        "signature": "renderParticlesVelocity(pass, camera)",
        "summary": "Render particles velocity to texture"
      },
      {
        "name": "renderParticlesAge",
        "kind": "function",
        "signature": "renderParticlesAge(pass, camera)",
        "summary": "Render particles age to texture"
      },
      {
        "name": "renderParticlesEmissive",
        "kind": "function",
        "signature": "renderParticlesEmissive(pass, camera)",
        "summary": "Render particles emissive to texture"
      },
      {
        "name": "renderParticlesSize",
        "kind": "function",
        "signature": "renderParticlesSize(pass, camera)",
        "summary": "Render particles size to texture"
      },
      {
        "name": "renderParticlesThermal",
        "kind": "function",
        "signature": "renderParticlesThermal(pass, camera)",
        "summary": "Render particles thermal/blackbody to texture"
      },
      {
        "name": "setThermalEnabled",
        "kind": "function",
        "signature": "setThermalEnabled(enabled)",
        "summary": "Enable/disable blackbody thermal coloring in the main SDF render. When disabled (default), particles render with base colors only. Use the Thermal debug pass to visualize temperature separately."
      },
      {
        "name": "isThermalEnabled",
        "kind": "function",
        "signature": "isThermalEnabled()",
        "summary": ""
      },
      {
        "name": "renderParticles",
        "kind": "function",
        "signature": "renderParticles(pass, camera, depthTextureView, depthScale)",
        "summary": "Render particles to the current render pass"
      },
      {
        "name": "getParticleCount",
        "kind": "function",
        "signature": "getParticleCount()",
        "summary": "Get current particle count"
      },
      {
        "name": "clearParticles",
        "kind": "function",
        "signature": "clearParticles()",
        "summary": "Clear all particles - kills all living particles immediately"
      },
      {
        "name": "getParticleDecals",
        "kind": "function",
        "signature": "getParticleDecals()",
        "summary": "Get active decals for rendering (from collision events)"
      },
      {
        "name": "getDecalSpawner",
        "kind": "function",
        "signature": "getDecalSpawner()",
        "summary": "Get the decal spawner (for Viewport to create its renderer)"
      },
      {
        "name": "getExtractedParticleLights",
        "kind": "function",
        "signature": "getExtractedParticleLights()",
        "summary": "Get extracted particle lights for scene lighting"
      },
      {
        "name": "getParticleLightSystem",
        "kind": "function",
        "signature": "getParticleLightSystem()",
        "summary": "Get the particle light system handle"
      },
      {
        "name": "getDistortionRenderer",
        "kind": "function",
        "signature": "getDistortionRenderer(width, height, sceneFormat)",
        "summary": "Get or lazy-create the distortion renderer for heat haze effects"
      },
      {
        "name": "initDistortion",
        "kind": "function",
        "signature": "initDistortion(sceneColorView)",
        "summary": "Initialize distortion bind groups (call when scene color view is available)"
      },
      {
        "name": "executeDistortionPass",
        "kind": "function",
        "signature": "executeDistortionPass(encoder, frameData)",
        "summary": "Execute distortion render pass (accumulate UV offsets from hot particles)"
      },
      {
        "name": "executeDistortionComposite",
        "kind": "function",
        "signature": "executeDistortionComposite(pass)",
        "summary": "Composite distortion onto scene"
      },
      {
        "name": "resizeDistortion",
        "kind": "function",
        "signature": "resizeDistortion(width, height)",
        "summary": "Resize distortion texture on viewport resize"
      },
      {
        "name": "getTrailHistorySystem",
        "kind": "function",
        "signature": "getTrailHistorySystem()",
        "summary": "Get the trail history system handle"
      },
      {
        "name": "renderTrailHistoryPass",
        "kind": "function",
        "signature": "renderTrailHistoryPass(pass, viewProj, cameraPos, time)",
        "summary": "Render trail histories as additive fading billboards"
      },
      {
        "name": "getBeamRenderer",
        "kind": "function",
        "signature": "getBeamRenderer(format)",
        "summary": "Get or lazy-create the beam renderer"
      },
      {
        "name": "renderBeamPass",
        "kind": "function",
        "signature": "renderBeamPass(pass, viewProj, viewRight, viewUp, time, segmentCount)",
        "summary": "Render beam particles"
      },
      {
        "name": "getBeamSegmentCount",
        "kind": "function",
        "signature": "getBeamSegmentCount()",
        "summary": "Get the number of beam segments to render. Returns 0 unless beam-type emitters are explicitly active in the scene. Prevents the beam renderer from treating all alive particles as a single chain."
      },
      {
        "name": "updateBeamParams",
        "kind": "function",
        "signature": "updateBeamParams(params)",
        "summary": "Update beam parameters"
      },
      {
        "name": "getExistingMeshRenderer",
        "kind": "function",
        "signature": "getExistingMeshRenderer()",
        "summary": "Get the existing mesh renderer without triggering creation. Returns null if not yet created. Used by shadow caster integration."
      },
      {
        "name": "getMeshRenderer",
        "kind": "function",
        "signature": "getMeshRenderer(format, meshConfig)",
        "summary": "Get or lazy-create the mesh particle renderer"
      },
      {
        "name": "setParticleMeshGeometry",
        "kind": "function",
        "signature": "setParticleMeshGeometry(mesh)",
        "summary": "Set the mesh geometry for particle mesh rendering"
      },
      {
        "name": "renderMeshPass",
        "kind": "function",
        "signature": "renderMeshPass(pass, viewProj, cameraPos, time, instanceCount)",
        "summary": "Render mesh particles"
      },
      {
        "name": "hasLiquidEmitters",
        "kind": "function",
        "signature": "hasLiquidEmitters()",
        "summary": "GAP 6: Query whether any active emitter has liquid-phase particles. Viewport uses this to auto-enable/disable SSFR rendering."
      },
      {
        "name": "getLiquidSurfaceTint",
        "kind": "function",
        "signature": "getLiquidSurfaceTint()",
        "summary": ""
      },
      {
        "name": "getSPHSurfaceRendererHandle",
        "kind": "function",
        "signature": "getSPHSurfaceRendererHandle(format, width, height)",
        "summary": "Get or lazy-create the SPH surface renderer"
      },
      {
        "name": "setSPHSurfaceTintColor",
        "kind": "function",
        "signature": "setSPHSurfaceTintColor(tint)",
        "summary": "GAP 13: Set SSFR tint color from substance [r, g, b]."
      },
      {
        "name": "initSPHComposite",
        "kind": "function",
        "signature": "initSPHComposite(sceneColorView)",
        "summary": "Initialize SPH composite bind group (needs scene color view)"
      },
      {
        "name": "renderSPHSurfacePass",
        "kind": "function",
        "signature": "renderSPHSurfacePass(encoder, options)",
        "summary": "Render SPH fluid surface depth pass"
      },
      {
        "name": "compositeSPHSurfacePass",
        "kind": "function",
        "signature": "compositeSPHSurfacePass(pass)",
        "summary": "Composite SPH surface onto scene"
      },
      {
        "name": "getBondRenderer",
        "kind": "function",
        "signature": "getBondRenderer(format)",
        "summary": "Get or lazy-create the bond renderer"
      },
      {
        "name": "computeAndUploadVisualBonds",
        "kind": "function",
        "signature": "computeAndUploadVisualBonds()",
        "summary": ""
      },
      {
        "name": "renderBondPass",
        "kind": "function",
        "signature": "renderBondPass(pass, viewProj, cameraPos, viewRight, viewUp)",
        "summary": "Render bonds"
      },
      {
        "name": "setBondVisualsEnabled",
        "kind": "function",
        "signature": "setBondVisualsEnabled(enabled)",
        "summary": "Set bond visualization enabled/disabled"
      },
      {
        "name": "setBondRadius",
        "kind": "function",
        "signature": "setBondRadius(radius)",
        "summary": "Set bond radius for proximity detection"
      },
      {
        "name": "getFieldRenderer",
        "kind": "function",
        "signature": "getFieldRenderer(format)",
        "summary": "Get or lazy-create the field renderer"
      },
      {
        "name": "updateFieldVisualization",
        "kind": "function",
        "signature": "updateFieldVisualization(chargedParticles, gridConfig)",
        "summary": "Update field probes from charged particles"
      },
      {
        "name": "renderFieldPass",
        "kind": "function",
        "signature": "renderFieldPass(pass, viewProj, cameraPos, viewRight, viewUp)",
        "summary": "Render field arrows"
      },
      {
        "name": "getOrbitalRenderer",
        "kind": "function",
        "signature": "getOrbitalRenderer(format)",
        "summary": "Get or lazy-create the orbital renderer"
      },
      {
        "name": "renderOrbitalPass",
        "kind": "function",
        "signature": "renderOrbitalPass(pass, viewProj, cameraPos, viewRight, viewUp, instanceCount)",
        "summary": "Render orbital electron clouds"
      },
      {
        "name": "isReady",
        "kind": "function",
        "signature": "isReady()",
        "summary": "Check if particle system is ready"
      },
      {
        "name": "getActiveEmitters",
        "kind": "function",
        "signature": "getActiveEmitters()",
        "summary": "Get active emitters"
      },
      {
        "name": "clearAllEmitters",
        "kind": "function",
        "signature": "clearAllEmitters()",
        "summary": "Clear all emitters and particles (used before scene reload)"
      },
      {
        "name": "spawnBurst",
        "kind": "function",
        "signature": "spawnBurst(position, preset = 'explosion', count = 50)",
        "summary": "Spawn a burst of particles at a position"
      },
      {
        "name": "spawnDustPuff",
        "kind": "function",
        "signature": "spawnDustPuff(position, color, intensity = 0.5, normal)",
        "summary": "Spawn a dust puff at a world position when fragments take damage or break. Uses small, soft point particles colored to match the breaking material. Best-practice references (real-time VFX): - Unreal Niagara: one-shot burst, soft sprite, high drag, gravity settle - Unity VFX Graph: short lifetime, size-over-life bell curve, alpha fade - GDC \"The Art of Destruction\": dust = desaturated material color, 0.2-0.6s"
      },
      {
        "name": "getParticleSettings",
        "kind": "function",
        "signature": "getParticleSettings()",
        "summary": "Get advanced particle system settings"
      },
      {
        "name": "getParticles",
        "kind": "function",
        "signature": "getParticles()",
        "summary": ""
      },
      {
        "name": "setParticleSettings",
        "kind": "function",
        "signature": "setParticleSettings(settings)",
        "summary": "Update advanced particle system settings"
      },
      {
        "name": "getParticlePerformanceStats",
        "kind": "function",
        "signature": "getParticlePerformanceStats()",
        "summary": "Get particle system performance stats"
      },
      {
        "name": "startParticleRewind",
        "kind": "function",
        "signature": "startParticleRewind()",
        "summary": "Start particle time rewind mode"
      },
      {
        "name": "stopParticleRewind",
        "kind": "function",
        "signature": "stopParticleRewind()",
        "summary": "Stop particle rewind and resume simulation"
      },
      {
        "name": "seekParticleTime",
        "kind": "function",
        "signature": "seekParticleTime(timeMs)",
        "summary": "Seek to a specific time in particle history Restores FULL particle state including spawn/death events"
      },
      {
        "name": "setParticleRewindSpeed",
        "kind": "function",
        "signature": "setParticleRewindSpeed(speed)",
        "summary": "Set particle rewind playback speed"
      },
      {
        "name": "getParticleRewindInfo",
        "kind": "function",
        "signature": "getParticleRewindInfo()",
        "summary": "Get particle rewind/snapshot info"
      },
      {
        "name": "isParticleRewinding",
        "kind": "function",
        "signature": "isParticleRewinding()",
        "summary": "Check if particles are currently rewinding"
      },
      {
        "name": "clearParticleSnapshots",
        "kind": "function",
        "signature": "clearParticleSnapshots()",
        "summary": "Clear all particle snapshots"
      },
      {
        "name": "truncateParticleSnapshotsAfterTime",
        "kind": "function",
        "signature": "truncateParticleSnapshotsAfterTime(timeMs)",
        "summary": ""
      },
      {
        "name": "setParticleEasing",
        "kind": "function",
        "signature": "setParticleEasing(easingType)",
        "summary": "Set particle easing type for timeline interpolation"
      },
      {
        "name": "setAdvancedInterpolation",
        "kind": "function",
        "signature": "setAdvancedInterpolation(enabled)",
        "summary": "Enable/disable advanced interpolation (Catmull-Rom/Hermite splines)"
      },
      {
        "name": "getInterpolationMode",
        "kind": "function",
        "signature": "getInterpolationMode()",
        "summary": "Get current interpolation mode"
      },
      {
        "name": "getParticleEasingTypes",
        "kind": "function",
        "signature": "getParticleEasingTypes()",
        "summary": "Get available easing types for particle rewind"
      },
      {
        "name": "initAdvancedFeatures",
        "kind": "function",
        "signature": "initAdvancedFeatures(options = {})",
        "summary": "Initialize advanced particle features (spatial grid, line generation) Call after initParticleSystem for enhanced features"
      },
      {
        "name": "resetQualityScale",
        "kind": "function",
        "signature": "resetQualityScale()",
        "summary": "Reset quality scale to 1.0 - call when entering play mode to ensure consistent emission"
      },
      {
        "name": "updateVolumeSystem",
        "kind": "function",
        "signature": "updateVolumeSystem(encoder, camera)",
        "summary": "Update the hybrid volumetric system (call before render)"
      },
      {
        "name": "renderVolumeSystem",
        "kind": "function",
        "signature": "renderVolumeSystem(pass, sceneColorTexture, sceneDepthTexture)",
        "summary": "Render the hybrid volumetric system"
      },
      {
        "name": "setVolumeMode",
        "kind": "function",
        "signature": "setVolumeMode(mode)",
        "summary": "Set volume render mode"
      },
      {
        "name": "setVolumeEnabled",
        "kind": "function",
        "signature": "setVolumeEnabled(enabled)",
        "summary": "Enable/disable volume rendering"
      },
      {
        "name": "toggleVolumeRendering",
        "kind": "function",
        "signature": "toggleVolumeRendering()",
        "summary": "Toggle volume rendering"
      },
      {
        "name": "isVolumeReady",
        "kind": "function",
        "signature": "isVolumeReady()",
        "summary": "Check if volume system is ready"
      },
      {
        "name": "getVolumeStats",
        "kind": "function",
        "signature": "getVolumeStats()",
        "summary": "Get volume system stats"
      },
      {
        "name": "setVolumeBounds",
        "kind": "function",
        "signature": "setVolumeBounds(min, max)",
        "summary": "Set volume bounds"
      },
      {
        "name": "EMITTER_PRESETS",
        "kind": "constant",
        "signature": "EMITTER_PRESETS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorPhysicalMaterial",
    "path": "editor/reference/modules/EditorPhysicalMaterial.md",
    "source": "editor/js/modules/EditorPhysicalMaterial.js",
    "import": "/editor/js/modules/EditorPhysicalMaterial.js",
    "sourceHash": "b585613d7811168f062b51013563a5b6ea88e890fabe689d28e22dee3abc25ff",
    "summary": "============================================================================ EditorPhysicalMaterial.js — Runtime bridge for physical material simulation  Connects PhysicalMaterial ECS component to existing physics systems: - Collision → damage accumulation - Damage exceeds threshold → deform (voxel crater) or fracture (Voronoi) - Fracture spawns real ECS entities with Renderable + PhysicsBody + Collider - Material-specific debris FX (dust, sparks, splinters) - Fragment count scales with impact energy - Brittleness determines shatter vs bend behavior  Lazy-loads heavy modules (VoronoiFracture, AutoTetMesh) only when triggered. ============================================================================",
    "exports": [
      {
        "name": "clearPlayState",
        "kind": "function",
        "signature": "clearPlayState()",
        "summary": "Clear all play-session state. Must be called when exiting play mode so that damage/fracture/deformation caches don't persist into the next session."
      },
      {
        "name": "setupPhysicalMaterialBridge",
        "kind": "function",
        "signature": "setupPhysicalMaterialBridge(editor)",
        "summary": ""
      },
      {
        "name": "handleCollision",
        "kind": "function",
        "signature": "handleCollision(editor, entityIdA, entityIdB, impactForce, contactPoint, contactNormal, massA, massB)",
        "summary": "Handle a collision between two entities. Called from EditorPhysics.js contact callback."
      },
      {
        "name": "applyDamage",
        "kind": "function",
        "signature": "applyDamage(editor, entityId, amount)",
        "summary": "Apply direct damage to an entity (e.g., from explosions, scripts)."
      },
      {
        "name": "resetDamage",
        "kind": "function",
        "signature": "resetDamage(editor, entityId)",
        "summary": "Reset damage on an entity."
      },
      {
        "name": "convertToSoftBody",
        "kind": "function",
        "signature": "async convertToSoftBody(editor, entityId)",
        "summary": "Convert a rigid entity to a soft body on-the-fly. Uses AutoTetMesh to generate tet volume, then PBD solver."
      },
      {
        "name": "deformAtImpact",
        "kind": "function",
        "signature": "async deformAtImpact(editor, entityId, contactPoint, contactNormal, normalizedForce)",
        "summary": "Deform mesh at impact point by carving a crater via voxel subtraction. If the carve disconnects pieces, broken-off pieces become fragment entities."
      },
      {
        "name": "fractureEntity",
        "kind": "function",
        "signature": "async fractureEntity(editor, entityId, contactPoint, contactNormal, impactForce, normalizedForce)",
        "summary": "Fracture an entity into visible fragment ECS entities using VoronoiFracture. Each fragment gets its own Renderable, PhysicsBody, and Collider. Fragment count scales with impact energy (Phase D)."
      },
      {
        "name": "updateDebris",
        "kind": "function",
        "signature": "updateDebris(editor)",
        "summary": "Update debris lifecycle — call from physics step. Removes expired debris entities."
      },
      {
        "name": "syncColliderFromMaterial",
        "kind": "function",
        "signature": "syncColliderFromMaterial(editor, entityId)",
        "summary": "Sync collider friction/restitution from material properties. Call after material changes."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorPhysics",
    "path": "editor/reference/modules/EditorPhysics.md",
    "source": "editor/js/modules/EditorPhysics.js",
    "import": "/editor/js/modules/EditorPhysics.js",
    "sourceHash": "9e8c5e79034b3bd00d349ab375562e1270ef24b28495dab5146397de045d9365",
    "summary": "Public API to manually verify collision state (useful for debugging)",
    "exports": [
      {
        "name": "initializePhysicsWorld",
        "kind": "function",
        "signature": "async initializePhysicsWorld(editor)",
        "summary": ""
      },
      {
        "name": "debugVerifyCollisions",
        "kind": "function",
        "signature": "debugVerifyCollisions(editor)",
        "summary": "Public API to manually verify collision state (useful for debugging)"
      },
      {
        "name": "destroyPhysicsWorld",
        "kind": "function",
        "signature": "destroyPhysicsWorld(editor)",
        "summary": ""
      },
      {
        "name": "stepPhysics",
        "kind": "function",
        "signature": "stepPhysics(editor, dt)",
        "summary": ""
      },
      {
        "name": "createHingeJoint",
        "kind": "function",
        "signature": "createHingeJoint(world, bodyA, bodyB, options = {})",
        "summary": "Create a hinge joint between two bodies"
      },
      {
        "name": "createBallJoint",
        "kind": "function",
        "signature": "createBallJoint(world, bodyA, bodyB, options = {})",
        "summary": "Create a ball-socket joint (spherical)"
      },
      {
        "name": "createSpringJoint",
        "kind": "function",
        "signature": "createSpringJoint(world, bodyA, bodyB, options = {})",
        "summary": "Create a spring/distance joint"
      },
      {
        "name": "createParticleChain",
        "kind": "function",
        "signature": "createParticleChain(options = {})",
        "summary": "Create a particle chain using PBD (Position-Based Dynamics)"
      },
      {
        "name": "createChain",
        "kind": "function",
        "signature": "createChain(world, options = {})",
        "summary": "Create a chain of rigid body links"
      },
      {
        "name": "createSoftBody",
        "kind": "function",
        "signature": "createSoftBody(device, options = {})",
        "summary": "Create a soft body simulation"
      },
      {
        "name": "generateSoftBodyParticles",
        "kind": "function",
        "signature": "generateSoftBodyParticles(sdfFunc, bounds, density = 100)",
        "summary": "Generate particles for a soft body in a shape"
      },
      {
        "name": "initFractureSystem",
        "kind": "function",
        "signature": "initFractureSystem(device)",
        "summary": "Initialize fracture system"
      },
      {
        "name": "preFractureMesh",
        "kind": "function",
        "signature": "preFractureMesh(mesh, options = {})",
        "summary": "Pre-fracture a mesh into fragments"
      },
      {
        "name": "generateFragmentColliders",
        "kind": "function",
        "signature": "generateFragmentColliders(fragments, resolution = 6)",
        "summary": "Generate colliders for each fragment"
      },
      {
        "name": "createBreakableCollider",
        "kind": "function",
        "signature": "createBreakableCollider(options = {})",
        "summary": "Create breakable compound collider that fractures on impact"
      },
      {
        "name": "raycast",
        "kind": "function",
        "signature": "raycast(world, origin, direction, maxDistance = 1000)",
        "summary": "Cast a ray into the physics world"
      },
      {
        "name": "raycastCone",
        "kind": "function",
        "signature": "raycastCone(world, origin, direction, coneAngle, rayCount = 8, maxDistance = 100)",
        "summary": "Cast multiple rays in a cone pattern (for shotgun spread, vision cone, etc.)"
      },
      {
        "name": "createTriggerZone",
        "kind": "function",
        "signature": "createTriggerZone(shape, size, position = [0, 0, 0])",
        "summary": "Create a trigger zone collider config"
      },
      {
        "name": "pointInTrigger",
        "kind": "function",
        "signature": "pointInTrigger(point, trigger)",
        "summary": "Check if a point is inside a trigger zone"
      },
      {
        "name": "overlapSphere",
        "kind": "function",
        "signature": "overlapSphere(center, radius, entities)",
        "summary": "Find all entities within a sphere (using spatial hash if available)"
      },
      {
        "name": "overlapBox",
        "kind": "function",
        "signature": "overlapBox(center, halfExtents, entities)",
        "summary": "Find all entities within a box"
      },
      {
        "name": "getColliderForType",
        "kind": "function",
        "signature": "getColliderForType(editor, type)",
        "summary": ""
      },
      {
        "name": "getGeometryForType",
        "kind": "function",
        "signature": "getGeometryForType(type)",
        "summary": ""
      },
      {
        "name": "addSimTime",
        "kind": "function",
        "signature": "addSimTime(editor, dt)",
        "summary": ""
      },
      {
        "name": "recordHistorySnapshot",
        "kind": "function",
        "signature": "recordHistorySnapshot(editor)",
        "summary": ""
      },
      {
        "name": "seekToTime",
        "kind": "function",
        "signature": "seekToTime(editor, targetTime)",
        "summary": ""
      },
      {
        "name": "registerPhysicsSystem",
        "kind": "function",
        "signature": "async registerPhysicsSystem(editor)",
        "summary": ""
      },
      {
        "name": "createGroundPlane",
        "kind": "function",
        "signature": "async createGroundPlane(editor)",
        "summary": ""
      },
      {
        "name": "updatePhysicsWorld",
        "kind": "function",
        "signature": "async updatePhysicsWorld(editor)",
        "summary": ""
      },
      {
        "name": "createMeshColliderDecomposed",
        "kind": "function",
        "signature": "createMeshColliderDecomposed(vertices, indices, options = {})",
        "summary": "Create a mesh collider with automatic convex decomposition for complex shapes. Use this when you have a mesh that's too complex for a single convex hull."
      },
      {
        "name": "createSDFCollider",
        "kind": "function",
        "signature": "createSDFCollider(sdfFunc, bounds, options = {})",
        "summary": "Create a collider from an SDF function with automatic voxelization. Use this for procedural or mathematical shapes."
      },
      {
        "name": "createVoxelCollider",
        "kind": "function",
        "signature": "createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize = 0.1)",
        "summary": "Create a collider grid from a 3D voxel array. Use this when you already have voxel data."
      },
      {
        "name": "createSDFGridFromFunction",
        "kind": "function",
        "signature": "createSDFGridFromFunction(sdfFunc, bounds, resolution = 32)",
        "summary": "Create an SDF grid for collision detection with complex shapes. Useful for soft-body or particle interactions."
      },
      {
        "name": "checkSDFCollision",
        "kind": "function",
        "signature": "checkSDFCollision(grid, point, radius = 0)",
        "summary": "Check if a point or sphere collides with an SDF grid."
      },
      {
        "name": "createPhysicsChain",
        "kind": "function",
        "signature": "async createPhysicsChain(editor, startPos, endPos, options = {})",
        "summary": "Create articulated chain between two points. Use for physics-based chains, ropes, cables."
      },
      {
        "name": "enableSpeculativeCCDForAll",
        "kind": "function",
        "signature": "enableSpeculativeCCDForAll(editor)",
        "summary": "Enable speculative CCD on all dynamic bodies in the physics world. Helps prevent fast-moving objects from tunneling through thin walls."
      },
      {
        "name": "createBroadPhaseGrid",
        "kind": "function",
        "signature": "createBroadPhaseGrid(cellSize = 1.0)",
        "summary": "Create a spatial hash grid for fast broad-phase collision queries. Useful for custom collision detection with many objects."
      },
      {
        "name": "updateBroadPhaseGrid",
        "kind": "function",
        "signature": "updateBroadPhaseGrid(editor, grid)",
        "summary": "Update all bodies in a spatial hash grid from editor entities."
      },
      {
        "name": "getBroadPhasePairs",
        "kind": "function",
        "signature": "getBroadPhasePairs(grid)",
        "summary": "Get potential collision pairs from broad phase."
      },
      {
        "name": "createPhysicsRope",
        "kind": "constant",
        "signature": "createPhysicsRope",
        "summary": ""
      },
      {
        "name": "createRope",
        "kind": "constant",
        "signature": "createRope",
        "summary": ""
      },
      {
        "name": "BezierSpline",
        "kind": "re-export",
        "signature": "BezierSpline",
        "summary": ""
      },
      {
        "name": "ConstitutiveModel",
        "kind": "re-export",
        "signature": "ConstitutiveModel",
        "summary": ""
      },
      {
        "name": "ConstraintType",
        "kind": "re-export",
        "signature": "ConstraintType",
        "summary": ""
      },
      {
        "name": "CubicBezier",
        "kind": "re-export",
        "signature": "CubicBezier",
        "summary": ""
      },
      {
        "name": "DistanceConstraint",
        "kind": "re-export",
        "signature": "DistanceConstraint",
        "summary": ""
      },
      {
        "name": "FRACTURE_PATTERNS",
        "kind": "re-export",
        "signature": "FRACTURE_PATTERNS",
        "summary": ""
      },
      {
        "name": "GPUSpatialHashGrid",
        "kind": "re-export",
        "signature": "GPUSpatialHashGrid",
        "summary": ""
      },
      {
        "name": "LineNetwork",
        "kind": "re-export",
        "signature": "LineNetwork",
        "summary": ""
      },
      {
        "name": "LineToVoxelizer",
        "kind": "re-export",
        "signature": "LineToVoxelizer",
        "summary": ""
      },
      {
        "name": "MLSMPMSolver",
        "kind": "re-export",
        "signature": "MLSMPMSolver",
        "summary": ""
      },
      {
        "name": "MaterialPresets",
        "kind": "re-export",
        "signature": "MaterialPresets",
        "summary": ""
      },
      {
        "name": "NODE_STATUS",
        "kind": "re-export",
        "signature": "NODE_STATUS",
        "summary": ""
      },
      {
        "name": "NetworkEdge",
        "kind": "re-export",
        "signature": "NetworkEdge",
        "summary": ""
      },
      {
        "name": "NetworkNode",
        "kind": "re-export",
        "signature": "NetworkNode",
        "summary": ""
      },
      {
        "name": "PBDParticle",
        "kind": "re-export",
        "signature": "PBDParticle",
        "summary": ""
      },
      {
        "name": "PBDSolver",
        "kind": "re-export",
        "signature": "PBDSolver",
        "summary": ""
      },
      {
        "name": "ParticleFlags",
        "kind": "re-export",
        "signature": "ParticleFlags",
        "summary": ""
      },
      {
        "name": "SCENT_TYPE",
        "kind": "re-export",
        "signature": "SCENT_TYPE",
        "summary": ""
      },
      {
        "name": "SDFGrid",
        "kind": "re-export",
        "signature": "SDFGrid",
        "summary": ""
      },
      {
        "name": "SDFOperations",
        "kind": "re-export",
        "signature": "SDFOperations",
        "summary": ""
      },
      {
        "name": "SDFPrimitives",
        "kind": "re-export",
        "signature": "SDFPrimitives",
        "summary": ""
      },
      {
        "name": "ShockPropagationSolver",
        "kind": "re-export",
        "signature": "ShockPropagationSolver",
        "summary": ""
      },
      {
        "name": "SpatialHash",
        "kind": "re-export",
        "signature": "SpatialHash",
        "summary": ""
      },
      {
        "name": "SpatialHashGrid",
        "kind": "re-export",
        "signature": "SpatialHashGrid",
        "summary": ""
      },
      {
        "name": "SpeculativeContactsSolver",
        "kind": "re-export",
        "signature": "SpeculativeContactsSolver",
        "summary": ""
      },
      {
        "name": "VoronoiFracture",
        "kind": "re-export",
        "signature": "VoronoiFracture",
        "summary": ""
      },
      {
        "name": "VoxelMaterials",
        "kind": "re-export",
        "signature": "VoxelMaterials",
        "summary": ""
      },
      {
        "name": "aabbAABB",
        "kind": "re-export",
        "signature": "aabbAABB",
        "summary": ""
      },
      {
        "name": "addArticulationToScene",
        "kind": "re-export",
        "signature": "addArticulationToScene",
        "summary": ""
      },
      {
        "name": "addToSpatialHash",
        "kind": "re-export",
        "signature": "addToSpatialHash",
        "summary": ""
      },
      {
        "name": "applyFriction",
        "kind": "re-export",
        "signature": "applyFriction",
        "summary": ""
      },
      {
        "name": "applyShockPropagation",
        "kind": "re-export",
        "signature": "applyShockPropagation",
        "summary": ""
      },
      {
        "name": "arrive",
        "kind": "re-export",
        "signature": "arrive",
        "summary": ""
      },
      {
        "name": "canHear",
        "kind": "re-export",
        "signature": "canHear",
        "summary": ""
      },
      {
        "name": "canSee",
        "kind": "re-export",
        "signature": "canSee",
        "summary": ""
      },
      {
        "name": "clearAllWelds",
        "kind": "re-export",
        "signature": "clearAllWelds",
        "summary": ""
      },
      {
        "name": "clearColliderSpatialHash",
        "kind": "re-export",
        "signature": "clearColliderSpatialHash",
        "summary": ""
      },
      {
        "name": "computeBounce",
        "kind": "re-export",
        "signature": "computeBounce",
        "summary": ""
      },
      {
        "name": "computeColliderAABB",
        "kind": "re-export",
        "signature": "computeColliderAABB",
        "summary": ""
      },
      {
        "name": "createAIAgent",
        "kind": "re-export",
        "signature": "createAIAgent",
        "summary": ""
      },
      {
        "name": "createAIPerception",
        "kind": "re-export",
        "signature": "createAIPerception",
        "summary": ""
      },
      {
        "name": "createAction",
        "kind": "re-export",
        "signature": "createAction",
        "summary": ""
      },
      {
        "name": "createArticulation",
        "kind": "re-export",
        "signature": "createArticulation",
        "summary": ""
      },
      {
        "name": "createChaseFleeBehavior",
        "kind": "re-export",
        "signature": "createChaseFleeBehavior",
        "summary": ""
      },
      {
        "name": "createChildLink",
        "kind": "re-export",
        "signature": "createChildLink",
        "summary": ""
      },
      {
        "name": "createCondition",
        "kind": "re-export",
        "signature": "createCondition",
        "summary": ""
      },
      {
        "name": "createD6Joint",
        "kind": "re-export",
        "signature": "createD6Joint",
        "summary": ""
      },
      {
        "name": "createDangerSense",
        "kind": "re-export",
        "signature": "createDangerSense",
        "summary": ""
      },
      {
        "name": "createDecomposedCollider",
        "kind": "re-export",
        "signature": "createDecomposedCollider",
        "summary": ""
      },
      {
        "name": "createDistanceJoint",
        "kind": "re-export",
        "signature": "createDistanceJoint",
        "summary": ""
      },
      {
        "name": "createFlock",
        "kind": "re-export",
        "signature": "createFlock",
        "summary": ""
      },
      {
        "name": "createNavGrid",
        "kind": "re-export",
        "signature": "createNavGrid",
        "summary": ""
      },
      {
        "name": "createPatrolBehavior",
        "kind": "re-export",
        "signature": "createPatrolBehavior",
        "summary": ""
      },
      {
        "name": "createPhysXRope",
        "kind": "re-export",
        "signature": "createPhysXRope",
        "summary": ""
      },
      {
        "name": "createRevoluteJoint",
        "kind": "re-export",
        "signature": "createRevoluteJoint",
        "summary": ""
      },
      {
        "name": "createRootLink",
        "kind": "re-export",
        "signature": "createRootLink",
        "summary": ""
      },
      {
        "name": "createSDFFromMesh",
        "kind": "re-export",
        "signature": "createSDFFromMesh",
        "summary": ""
      },
      {
        "name": "createScentParticle",
        "kind": "re-export",
        "signature": "createScentParticle",
        "summary": ""
      },
      {
        "name": "createScentSystem",
        "kind": "re-export",
        "signature": "createScentSystem",
        "summary": ""
      },
      {
        "name": "createScentTrail",
        "kind": "re-export",
        "signature": "createScentTrail",
        "summary": ""
      },
      {
        "name": "createSelector",
        "kind": "re-export",
        "signature": "createSelector",
        "summary": ""
      },
      {
        "name": "createSequence",
        "kind": "re-export",
        "signature": "createSequence",
        "summary": ""
      },
      {
        "name": "createSphericalJoint",
        "kind": "re-export",
        "signature": "createSphericalJoint",
        "summary": ""
      },
      {
        "name": "createSteeringAgent",
        "kind": "re-export",
        "signature": "createSteeringAgent",
        "summary": ""
      },
      {
        "name": "decomposeMesh",
        "kind": "re-export",
        "signature": "decomposeMesh",
        "summary": ""
      },
      {
        "name": "elasticCollision",
        "kind": "re-export",
        "signature": "elasticCollision",
        "summary": ""
      },
      {
        "name": "enablePhysXSpeculativeCCD",
        "kind": "re-export",
        "signature": "enablePhysXSpeculativeCCD",
        "summary": ""
      },
      {
        "name": "evade",
        "kind": "re-export",
        "signature": "evade",
        "summary": ""
      },
      {
        "name": "fbm3D",
        "kind": "re-export",
        "signature": "fbm3D",
        "summary": ""
      },
      {
        "name": "findPath",
        "kind": "re-export",
        "signature": "findPath",
        "summary": ""
      },
      {
        "name": "findPathInNavWorld",
        "kind": "re-export",
        "signature": "findPathInNavWorld",
        "summary": ""
      },
      {
        "name": "findPathOnGrid",
        "kind": "re-export",
        "signature": "findPathOnGrid",
        "summary": ""
      },
      {
        "name": "flee",
        "kind": "re-export",
        "signature": "flee",
        "summary": ""
      },
      {
        "name": "flock",
        "kind": "re-export",
        "signature": "flock",
        "summary": ""
      },
      {
        "name": "followScentTrail",
        "kind": "re-export",
        "signature": "followScentTrail",
        "summary": ""
      },
      {
        "name": "generateBezierColliders",
        "kind": "re-export",
        "signature": "generateBezierColliders",
        "summary": ""
      },
      {
        "name": "generateCaveColliders",
        "kind": "re-export",
        "signature": "generateCaveColliders",
        "summary": ""
      },
      {
        "name": "generateCollidersFromNetwork",
        "kind": "re-export",
        "signature": "generateCollidersFromNetwork",
        "summary": ""
      },
      {
        "name": "generateCollidersFromSDF",
        "kind": "re-export",
        "signature": "generateCollidersFromSDF",
        "summary": ""
      },
      {
        "name": "generateConvexMeshFromSDF",
        "kind": "re-export",
        "signature": "generateConvexMeshFromSDF",
        "summary": ""
      },
      {
        "name": "generateCurveColliders",
        "kind": "re-export",
        "signature": "generateCurveColliders",
        "summary": ""
      },
      {
        "name": "generateHollowConeColliders",
        "kind": "re-export",
        "signature": "generateHollowConeColliders",
        "summary": ""
      },
      {
        "name": "generateHollowTorusColliders",
        "kind": "re-export",
        "signature": "generateHollowTorusColliders",
        "summary": ""
      },
      {
        "name": "generateLineColliders",
        "kind": "re-export",
        "signature": "generateLineColliders",
        "summary": ""
      },
      {
        "name": "generateNoisyColliders",
        "kind": "re-export",
        "signature": "generateNoisyColliders",
        "summary": ""
      },
      {
        "name": "generatePipeNetworkColliders",
        "kind": "re-export",
        "signature": "generatePipeNetworkColliders",
        "summary": ""
      },
      {
        "name": "generateRockFieldColliders",
        "kind": "re-export",
        "signature": "generateRockFieldColliders",
        "summary": ""
      },
      {
        "name": "generateRockySphereColliders",
        "kind": "re-export",
        "signature": "generateRockySphereColliders",
        "summary": ""
      },
      {
        "name": "generateRootColliders",
        "kind": "re-export",
        "signature": "generateRootColliders",
        "summary": ""
      },
      {
        "name": "generateScatteredColliders",
        "kind": "re-export",
        "signature": "generateScatteredColliders",
        "summary": ""
      },
      {
        "name": "generateSplineColliders",
        "kind": "re-export",
        "signature": "generateSplineColliders",
        "summary": ""
      },
      {
        "name": "generateTerrainColliders",
        "kind": "re-export",
        "signature": "generateTerrainColliders",
        "summary": ""
      },
      {
        "name": "generateTreeColliders",
        "kind": "re-export",
        "signature": "generateTreeColliders",
        "summary": ""
      },
      {
        "name": "generateTunnelColliders",
        "kind": "re-export",
        "signature": "generateTunnelColliders",
        "summary": ""
      },
      {
        "name": "getArticulationLinkTransforms",
        "kind": "re-export",
        "signature": "getArticulationLinkTransforms",
        "summary": ""
      },
      {
        "name": "getLastKnownPosition",
        "kind": "re-export",
        "signature": "getLastKnownPosition",
        "summary": ""
      },
      {
        "name": "getNavGridVisualization",
        "kind": "re-export",
        "signature": "getNavGridVisualization",
        "summary": ""
      },
      {
        "name": "getOrCreateNavGrid",
        "kind": "re-export",
        "signature": "getOrCreateNavGrid",
        "summary": ""
      },
      {
        "name": "getPathSteering",
        "kind": "re-export",
        "signature": "getPathSteering",
        "summary": ""
      },
      {
        "name": "getPhysXJointCapabilities",
        "kind": "re-export",
        "signature": "getPhysXJointCapabilities",
        "summary": ""
      },
      {
        "name": "gridToWorld",
        "kind": "re-export",
        "signature": "gridToWorld",
        "summary": ""
      },
      {
        "name": "initColliderSpatialHash",
        "kind": "re-export",
        "signature": "initColliderSpatialHash",
        "summary": ""
      },
      {
        "name": "linearMotion",
        "kind": "re-export",
        "signature": "linearMotion",
        "summary": ""
      },
      {
        "name": "mulberry32",
        "kind": "re-export",
        "signature": "mulberry32",
        "summary": ""
      },
      {
        "name": "perlin3D",
        "kind": "re-export",
        "signature": "perlin3D",
        "summary": ""
      },
      {
        "name": "planeCollisionResponse",
        "kind": "re-export",
        "signature": "planeCollisionResponse",
        "summary": ""
      },
      {
        "name": "pointInAABB",
        "kind": "re-export",
        "signature": "pointInAABB",
        "summary": ""
      },
      {
        "name": "pointInSphere",
        "kind": "re-export",
        "signature": "pointInSphere",
        "summary": ""
      },
      {
        "name": "predictLanding",
        "kind": "re-export",
        "signature": "predictLanding",
        "summary": ""
      },
      {
        "name": "projectileMotion",
        "kind": "re-export",
        "signature": "projectileMotion",
        "summary": ""
      },
      {
        "name": "projectilePosition",
        "kind": "re-export",
        "signature": "projectilePosition",
        "summary": ""
      },
      {
        "name": "pursue",
        "kind": "re-export",
        "signature": "pursue",
        "summary": ""
      },
      {
        "name": "queryNearbyColliders",
        "kind": "re-export",
        "signature": "queryNearbyColliders",
        "summary": ""
      },
      {
        "name": "randomInSphere",
        "kind": "re-export",
        "signature": "randomInSphere",
        "summary": ""
      },
      {
        "name": "randomOnSphere",
        "kind": "re-export",
        "signature": "randomOnSphere",
        "summary": ""
      },
      {
        "name": "raycastWorld",
        "kind": "re-export",
        "signature": "raycastWorld",
        "summary": ""
      },
      {
        "name": "ridged3D",
        "kind": "re-export",
        "signature": "ridged3D",
        "summary": ""
      },
      {
        "name": "sdfBox3D",
        "kind": "re-export",
        "signature": "sdfBox3D",
        "summary": ""
      },
      {
        "name": "sdfCapsule",
        "kind": "re-export",
        "signature": "sdfCapsule",
        "summary": ""
      },
      {
        "name": "sdfCone",
        "kind": "re-export",
        "signature": "sdfCone",
        "summary": ""
      },
      {
        "name": "sdfCylinder",
        "kind": "re-export",
        "signature": "sdfCylinder",
        "summary": ""
      },
      {
        "name": "sdfIntersect",
        "kind": "re-export",
        "signature": "sdfIntersect",
        "summary": ""
      },
      {
        "name": "sdfOnion",
        "kind": "re-export",
        "signature": "sdfOnion",
        "summary": ""
      },
      {
        "name": "sdfSmoothUnion",
        "kind": "re-export",
        "signature": "sdfSmoothUnion",
        "summary": ""
      },
      {
        "name": "sdfSphere",
        "kind": "re-export",
        "signature": "sdfSphere",
        "summary": ""
      },
      {
        "name": "sdfSubtract",
        "kind": "re-export",
        "signature": "sdfSubtract",
        "summary": ""
      },
      {
        "name": "sdfTorus",
        "kind": "re-export",
        "signature": "sdfTorus",
        "summary": ""
      },
      {
        "name": "sdfUnion",
        "kind": "re-export",
        "signature": "sdfUnion",
        "summary": ""
      },
      {
        "name": "seek",
        "kind": "re-export",
        "signature": "seek",
        "summary": ""
      },
      {
        "name": "senseDanger",
        "kind": "re-export",
        "signature": "senseDanger",
        "summary": ""
      },
      {
        "name": "setAutoWeld",
        "kind": "re-export",
        "signature": "setAutoWeld",
        "summary": ""
      },
      {
        "name": "setRandomSeed",
        "kind": "re-export",
        "signature": "setRandomSeed",
        "summary": ""
      },
      {
        "name": "simplex3D",
        "kind": "re-export",
        "signature": "simplex3D",
        "summary": ""
      },
      {
        "name": "smellAt",
        "kind": "re-export",
        "signature": "smellAt",
        "summary": ""
      },
      {
        "name": "smoothPath",
        "kind": "re-export",
        "signature": "smoothPath",
        "summary": ""
      },
      {
        "name": "sphereAABB",
        "kind": "re-export",
        "signature": "sphereAABB",
        "summary": ""
      },
      {
        "name": "sphereCollisionResponse",
        "kind": "re-export",
        "signature": "sphereCollisionResponse",
        "summary": ""
      },
      {
        "name": "sphereSphere",
        "kind": "re-export",
        "signature": "sphereSphere",
        "summary": ""
      },
      {
        "name": "straightLine",
        "kind": "re-export",
        "signature": "straightLine",
        "summary": ""
      },
      {
        "name": "testAABBAABB",
        "kind": "re-export",
        "signature": "testAABBAABB",
        "summary": ""
      },
      {
        "name": "testSphereAABB",
        "kind": "re-export",
        "signature": "testSphereAABB",
        "summary": ""
      },
      {
        "name": "testSphereSphere",
        "kind": "re-export",
        "signature": "testSphereSphere",
        "summary": ""
      },
      {
        "name": "tickBehaviorTree",
        "kind": "re-export",
        "signature": "tickBehaviorTree",
        "summary": ""
      },
      {
        "name": "tickNode",
        "kind": "re-export",
        "signature": "tickNode",
        "summary": ""
      },
      {
        "name": "updateAIAgent",
        "kind": "re-export",
        "signature": "updateAIAgent",
        "summary": ""
      },
      {
        "name": "updateAIPerception",
        "kind": "re-export",
        "signature": "updateAIPerception",
        "summary": ""
      },
      {
        "name": "updateFlock",
        "kind": "re-export",
        "signature": "updateFlock",
        "summary": ""
      },
      {
        "name": "updateNavGridFromColliders",
        "kind": "re-export",
        "signature": "updateNavGridFromColliders",
        "summary": ""
      },
      {
        "name": "voronoi3D",
        "kind": "re-export",
        "signature": "voronoi3D",
        "summary": ""
      },
      {
        "name": "wander",
        "kind": "re-export",
        "signature": "wander",
        "summary": ""
      },
      {
        "name": "worldToGrid",
        "kind": "re-export",
        "signature": "worldToGrid",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorPhysicsSim",
    "path": "editor/reference/modules/EditorPhysicsSim.md",
    "source": "editor/js/modules/EditorPhysicsSim.js",
    "import": "/editor/js/modules/EditorPhysicsSim.js",
    "sourceHash": "78a1d8ac11b0233db08531ed42d155eaf8764a7000fdaa17cfd8be833dacf68e",
    "summary": "EditorPhysicsSim.js - Physics Simulation Management for Editor Manages rope, wire, hair, cloth, and soft body simulations in the editor. Uses PBD solver with OGC contact model for penetration-free simulation.",
    "exports": [
      {
        "name": "initRopeSimulation",
        "kind": "function",
        "signature": "initRopeSimulation(editor, entityId, position, opts)",
        "summary": "Initialize rope simulation for an entity"
      },
      {
        "name": "initRopeSimulationBetweenPoints",
        "kind": "function",
        "signature": "initRopeSimulationBetweenPoints(editor, entityId, startPos, endPos, opts)",
        "summary": "Initialize rope simulation between two points (for tool-created ropes)"
      },
      {
        "name": "initRopeSimulationFromComponent",
        "kind": "function",
        "signature": "initRopeSimulationFromComponent(editor, entityId)",
        "summary": ""
      },
      {
        "name": "initPhysXRopeSimulation",
        "kind": "function",
        "signature": "initPhysXRopeSimulation(editor, entityId, startPos, endPos, opts)",
        "summary": "Initialize PhysX articulation-based rope simulation Uses NVIDIA PhysX for more stable, unified physics simulation"
      },
      {
        "name": "initGPURopeSimulation",
        "kind": "function",
        "signature": "initGPURopeSimulation(editor, entityId, startPos, endPos, opts)",
        "summary": "Initialize GPU-based rope simulation using unified particle system Uses GPU constraint solver for native rope physics (Phase 2)"
      },
      {
        "name": "initWireSimulation",
        "kind": "function",
        "signature": "initWireSimulation(editor, entityId, position, opts)",
        "summary": ""
      },
      {
        "name": "initHairSimulation",
        "kind": "function",
        "signature": "initHairSimulation(editor, entityId, position, opts)",
        "summary": ""
      },
      {
        "name": "initChainSimulation",
        "kind": "function",
        "signature": "initChainSimulation(editor, entityId, position, opts)",
        "summary": ""
      },
      {
        "name": "initClothSimulation",
        "kind": "function",
        "signature": "async initClothSimulation(editor, entityId, position, opts)",
        "summary": ""
      },
      {
        "name": "initSoftBodySimulation",
        "kind": "function",
        "signature": "initSoftBodySimulation(editor, entityId, position, opts)",
        "summary": ""
      },
      {
        "name": "initSoftBodyFromMesh",
        "kind": "function",
        "signature": "async initSoftBodyFromMesh(editor, entityId, meshPositions, meshIndices, opts = {})",
        "summary": "Initialize a soft body from an arbitrary surface mesh using AutoTetMesh. Converts the surface mesh to a tetrahedral volume mesh, then creates PBD particles and constraints from the tet nodes."
      },
      {
        "name": "initBalloonSimulation",
        "kind": "function",
        "signature": "initBalloonSimulation(editor, entityId, position, opts)",
        "summary": "Initialize balloon simulation (pressure-based soft body)"
      },
      {
        "name": "initFluidSimulation",
        "kind": "function",
        "signature": "initFluidSimulation(editor, entityId, position, opts)",
        "summary": "Initialize fluid simulation (SPH density-based)"
      },
      {
        "name": "stepPhysicsSimulations",
        "kind": "function",
        "signature": "stepPhysicsSimulations(editor, dt)",
        "summary": "Step all physics simulations"
      },
      {
        "name": "syncSimulationsToComponents",
        "kind": "function",
        "signature": "syncSimulationsToComponents(editor)",
        "summary": "Sync all active simulation particle data to ECS components. Call this before saving the scene to ensure particles are persisted."
      },
      {
        "name": "initTwistedRopeSimulation",
        "kind": "function",
        "signature": "initTwistedRopeSimulation(editor, entityId, startPos, endPos, opts = {})",
        "summary": "Initialize a twisted rope simulation with multiple threads Creates helical thread arrangement that twists together like real rope fibers"
      },
      {
        "name": "destroyPhysicsSimulation",
        "kind": "function",
        "signature": "destroyPhysicsSimulation(editor, entityId, options = {})",
        "summary": "Destroy a physics simulation."
      },
      {
        "name": "updateRopeForAnchorMove",
        "kind": "function",
        "signature": "updateRopeForAnchorMove(editor, ropeEntityId)",
        "summary": ""
      },
      {
        "name": "updateRopesForEntityMove",
        "kind": "function",
        "signature": "updateRopesForEntityMove(editor, movedEntityId)",
        "summary": "Check all ropes that are attached to a given entity and update them. Call this when an entity's transform changes in edit mode."
      },
      {
        "name": "setupPhysicsSim",
        "kind": "function",
        "signature": "setupPhysicsSim(editor)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorPointCloud",
    "path": "editor/reference/modules/EditorPointCloud.md",
    "source": "editor/js/modules/EditorPointCloud.js",
    "import": "/editor/js/modules/EditorPointCloud.js",
    "sourceHash": "f3a03b54c3fb686b110725b8d33341df54fb0f2587163fbecc495b1970faed3f",
    "summary": "============================================================================ EditorPointCloud.js — Point cloud entity management  Handles spawning point cloud entities from asset files (PLY/PCD/XYZ), managing the PointCloud component, and bridging to the EntityMeshRenderer point-sprite render pass. ============================================================================",
    "exports": [
      {
        "name": "spawnPointCloudAsset",
        "kind": "function",
        "signature": "async spawnPointCloudAsset(editor, asset)",
        "summary": "Load a point cloud asset, parse it, and create an entity in the scene."
      },
      {
        "name": "spawnPointCloudEntity",
        "kind": "function",
        "signature": "spawnPointCloudEntity(editor, pcData, opts = {})",
        "summary": "Create a point cloud entity from raw point data."
      },
      {
        "name": "unregisterPointCloud",
        "kind": "function",
        "signature": "unregisterPointCloud(editor, entityId)",
        "summary": "Unregister a point cloud entity from the renderer."
      },
      {
        "name": "getPointCloudData",
        "kind": "function",
        "signature": "getPointCloudData(editor, entityId)",
        "summary": "Get point cloud data for an entity (reads PointCloud component)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorScene",
    "path": "editor/reference/modules/EditorScene.md",
    "source": "editor/js/modules/EditorScene.js",
    "import": "/editor/js/modules/EditorScene.js",
    "sourceHash": "4ba84c30c28325f8e9d73656ca97c42d1e2fd070ea24db7f408b7fcd702225fb",
    "summary": "Get all entities in a welded group (parent + all children) If the entity is a child, finds its parent and returns the whole group If the entity is a parent, returns itself + all children If not welded, returns just the entity",
    "exports": [
      {
        "name": "createEntity",
        "kind": "function",
        "signature": "createEntity(editor, name = 'Entity', options = {})",
        "summary": ""
      },
      {
        "name": "selectEntity",
        "kind": "function",
        "signature": "selectEntity(editor, entityId)",
        "summary": ""
      },
      {
        "name": "getWeldedGroup",
        "kind": "function",
        "signature": "getWeldedGroup(editor, entityId)",
        "summary": "Get all entities in a welded group (parent + all children) If the entity is a child, finds its parent and returns the whole group If the entity is a parent, returns itself + all children If not welded, returns just the entity"
      },
      {
        "name": "deleteEntity",
        "kind": "function",
        "signature": "async deleteEntity(editor, entityId)",
        "summary": ""
      },
      {
        "name": "createFolder",
        "kind": "function",
        "signature": "createFolder(editor, name = 'New Folder', parentId = null)",
        "summary": ""
      },
      {
        "name": "setFolderParent",
        "kind": "function",
        "signature": "setFolderParent(editor, folderId, parentId)",
        "summary": ""
      },
      {
        "name": "renameEntity",
        "kind": "function",
        "signature": "renameEntity(editor, entityId, newName)",
        "summary": ""
      },
      {
        "name": "renameFolder",
        "kind": "function",
        "signature": "renameFolder(editor, folderId, newName)",
        "summary": ""
      },
      {
        "name": "deleteFolder",
        "kind": "function",
        "signature": "deleteFolder(editor, folderId)",
        "summary": ""
      },
      {
        "name": "setEntityParent",
        "kind": "function",
        "signature": "setEntityParent(editor, entityId, parentId)",
        "summary": ""
      },
      {
        "name": "moveEntityToFolder",
        "kind": "function",
        "signature": "moveEntityToFolder(editor, entityId, folderId)",
        "summary": ""
      },
      {
        "name": "captureWorldSnapshot",
        "kind": "function",
        "signature": "captureWorldSnapshot(editor)",
        "summary": ""
      },
      {
        "name": "captureWorldSnapshotDelta",
        "kind": "function",
        "signature": "captureWorldSnapshotDelta(editor)",
        "summary": ""
      },
      {
        "name": "restoreWorldSnapshot",
        "kind": "function",
        "signature": "restoreWorldSnapshot(editor, snapshot)",
        "summary": ""
      },
      {
        "name": "loadScene",
        "kind": "function",
        "signature": "async loadScene(editor, scenePath)",
        "summary": ""
      },
      {
        "name": "saveScene",
        "kind": "function",
        "signature": "async saveScene(editor)",
        "summary": ""
      },
      {
        "name": "cleanupInvalidEntities",
        "kind": "function",
        "signature": "cleanupInvalidEntities(editor, intervalMs = 1000)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorSettings",
    "path": "editor/reference/modules/EditorSettings.md",
    "source": "editor/js/modules/EditorSettings.js",
    "import": "/editor/js/modules/EditorSettings.js",
    "sourceHash": "64488e796fd27229ba052fac79f30e4a6f0a6d2154a85487ae43f3b595b327dd",
    "summary": "EditorSettings.js - Global Editor Settings with Persistence Features: - Centralized settings management - localStorage persistence - Settings UI with categories/tabs - Live preview of changes",
    "exports": [
      {
        "name": "showSettingsDialog",
        "kind": "function",
        "signature": "showSettingsDialog()",
        "summary": ""
      },
      {
        "name": "editorSettings",
        "kind": "constant",
        "signature": "editorSettings",
        "summary": ""
      },
      {
        "name": "DEFAULT_SETTINGS",
        "kind": "re-export",
        "signature": "DEFAULT_SETTINGS",
        "summary": ""
      },
      {
        "name": "SETTINGS_METADATA",
        "kind": "re-export",
        "signature": "SETTINGS_METADATA",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorSpawnMenu",
    "path": "editor/reference/modules/EditorSpawnMenu.md",
    "source": "editor/js/modules/EditorSpawnMenu.js",
    "import": "/editor/js/modules/EditorSpawnMenu.js",
    "sourceHash": "1e434a69cf2af629f3ad5efecd698e3e785f3e9aa9377fa7ea6a4ef3de578e70",
    "summary": "",
    "exports": [
      {
        "name": "setupSpawnMenu",
        "kind": "function",
        "signature": "setupSpawnMenu(editor)",
        "summary": ""
      },
      {
        "name": "renderSpawnCategories",
        "kind": "function",
        "signature": "renderSpawnCategories(editor)",
        "summary": ""
      },
      {
        "name": "renderSpawnGrid",
        "kind": "function",
        "signature": "renderSpawnGrid(editor)",
        "summary": ""
      },
      {
        "name": "spawnFromMenu",
        "kind": "function",
        "signature": "spawnFromMenu(editor, item)",
        "summary": ""
      },
      {
        "name": "createEmitter",
        "kind": "function",
        "signature": "createEmitter(editor, markerEntityId, type = 'gas')",
        "summary": ""
      },
      {
        "name": "getEmitterColor",
        "kind": "function",
        "signature": "getEmitterColor(type)",
        "summary": ""
      },
      {
        "name": "toggleSpawnMenu",
        "kind": "function",
        "signature": "toggleSpawnMenu(editor)",
        "summary": ""
      },
      {
        "name": "openSpawnMenu",
        "kind": "function",
        "signature": "openSpawnMenu(editor)",
        "summary": ""
      },
      {
        "name": "closeSpawnMenu",
        "kind": "function",
        "signature": "closeSpawnMenu(editor)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorTools",
    "path": "editor/reference/modules/EditorTools.md",
    "source": "editor/js/modules/EditorTools.js",
    "import": "/editor/js/modules/EditorTools.js",
    "sourceHash": "32096585bb4126a4ff0bd2c6500b8c8b9633c3ae11ba61a817ae96d1f1b8681e",
    "summary": "EditorTools.js - GMod-style Tool System Manages interactive tools like chain tool, weld tool, constraint tool. Tools are activated from spawn menu and handle click events in viewport.",
    "exports": [
      {
        "name": "ToolManager",
        "kind": "class",
        "signature": "class ToolManager",
        "summary": ""
      },
      {
        "name": "setupTools",
        "kind": "function",
        "signature": "setupTools(editor)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorTransitions",
    "path": "editor/reference/modules/EditorTransitions.md",
    "source": "editor/js/modules/EditorTransitions.js",
    "import": "/editor/js/modules/EditorTransitions.js",
    "sourceHash": "cbc2634692fd4b08241eade27eb6796d12a9656b03268f9f02d65f2eadffdd86",
    "summary": "EditorTransitions.js - Transition Effects System Features: - Multiple transition effects (fade, dissolve, pixelate, wipe, zoom, etc.) - Canvas-based effects for complex transitions - Random effect selection - Configurable duration and easing - Can be used for dialogs, scenes, or any UI element",
    "exports": [
      {
        "name": "transitions",
        "kind": "constant",
        "signature": "transitions",
        "summary": ""
      },
      {
        "name": "EASINGS",
        "kind": "re-export",
        "signature": "EASINGS",
        "summary": ""
      },
      {
        "name": "TRANSITIONS",
        "kind": "re-export",
        "signature": "TRANSITIONS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorUI",
    "path": "editor/reference/modules/EditorUI.md",
    "source": "editor/js/modules/EditorUI.js",
    "import": "/editor/js/modules/EditorUI.js",
    "sourceHash": "db12507910225fd10e28fa70c6c7d8dc5f3a61b78fc90657c76b20e23815140f",
    "summary": "============================================================================ EditorUI.js - UI Setup and Menu Handling ============================================================================",
    "exports": [
      {
        "name": "showPrompt",
        "kind": "function",
        "signature": "showPrompt(title, message, defaultValue = '')",
        "summary": "Show a custom prompt dialog"
      },
      {
        "name": "showConfirm",
        "kind": "function",
        "signature": "showConfirm(title, message, options = {})",
        "summary": "Show a custom confirm dialog"
      },
      {
        "name": "showAlert",
        "kind": "function",
        "signature": "showAlert(title, message)",
        "summary": "Show a custom alert dialog"
      },
      {
        "name": "setupInspectorTabs",
        "kind": "function",
        "signature": "setupInspectorTabs(editor)",
        "summary": ""
      },
      {
        "name": "setupResizablePanels",
        "kind": "function",
        "signature": "setupResizablePanels(editor)",
        "summary": ""
      },
      {
        "name": "setupConsoleResize",
        "kind": "function",
        "signature": "setupConsoleResize(editor, saveSizes)",
        "summary": ""
      },
      {
        "name": "setupToolbar",
        "kind": "function",
        "signature": "setupToolbar(editor)",
        "summary": ""
      },
      {
        "name": "setupSceneSelector",
        "kind": "function",
        "signature": "setupSceneSelector(editor)",
        "summary": "Setup scene selector dropdown in viewport header"
      },
      {
        "name": "refreshSceneSelector",
        "kind": "function",
        "signature": "async refreshSceneSelector(editor)",
        "summary": "Refresh scene selector with available scenes"
      },
      {
        "name": "setupViewportToolbar",
        "kind": "function",
        "signature": "setupViewportToolbar(editor)",
        "summary": ""
      },
      {
        "name": "updateToolbarState",
        "kind": "function",
        "signature": "updateToolbarState(editor)",
        "summary": ""
      },
      {
        "name": "handleMenuAction",
        "kind": "function",
        "signature": "async handleMenuAction(editor, action)",
        "summary": ""
      },
      {
        "name": "setupTimelineScrubbing",
        "kind": "function",
        "signature": "setupTimelineScrubbing(editor)",
        "summary": ""
      },
      {
        "name": "updateTimelineUI",
        "kind": "function",
        "signature": "updateTimelineUI(editor, skipMarkers = false)",
        "summary": ""
      },
      {
        "name": "setupBottomTabs",
        "kind": "function",
        "signature": "setupBottomTabs(editor)",
        "summary": ""
      },
      {
        "name": "setupConsole",
        "kind": "function",
        "signature": "setupConsole(editor)",
        "summary": ""
      },
      {
        "name": "addConsoleLine",
        "kind": "function",
        "signature": "addConsoleLine(editor, type, text)",
        "summary": ""
      },
      {
        "name": "isTypingInUi",
        "kind": "function",
        "signature": "isTypingInUi()",
        "summary": ""
      },
      {
        "name": "showContextMenu",
        "kind": "re-export",
        "signature": "showContextMenu",
        "summary": ""
      },
      {
        "name": "toast",
        "kind": "re-export",
        "signature": "toast",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorUIComponents",
    "path": "editor/reference/modules/EditorUIComponents.md",
    "source": "editor/js/modules/EditorUIComponents.js",
    "import": "/editor/js/modules/EditorUIComponents.js",
    "sourceHash": "04f1f44a2520ebb1afaa4d136175eb50c1041d1c3175556256ae786ea045b2ce",
    "summary": "Show a toast notification",
    "exports": [
      {
        "name": "showToast",
        "kind": "function",
        "signature": "showToast(message, options = {})",
        "summary": "Show a toast notification"
      },
      {
        "name": "setTheme",
        "kind": "function",
        "signature": "setTheme(themeName)",
        "summary": "Apply a theme by name - delegates to themeManager"
      },
      {
        "name": "getCurrentTheme",
        "kind": "function",
        "signature": "getCurrentTheme()",
        "summary": "Get current theme name"
      },
      {
        "name": "getThemes",
        "kind": "function",
        "signature": "getThemes()",
        "summary": "Get all available themes"
      },
      {
        "name": "initTheme",
        "kind": "function",
        "signature": "initTheme()",
        "summary": "Initialize theme from localStorage"
      },
      {
        "name": "showThemePicker",
        "kind": "function",
        "signature": "showThemePicker()",
        "summary": "Show theme picker dialog with categories"
      },
      {
        "name": "showContextMenu",
        "kind": "function",
        "signature": "showContextMenu(event, items)",
        "summary": "Show a custom context menu"
      },
      {
        "name": "hideContextMenu",
        "kind": "function",
        "signature": "hideContextMenu()",
        "summary": ""
      },
      {
        "name": "initTooltips",
        "kind": "function",
        "signature": "initTooltips()",
        "summary": "Initialize tooltip system"
      },
      {
        "name": "showShortcutsHelp",
        "kind": "function",
        "signature": "showShortcutsHelp()",
        "summary": "Show keyboard shortcuts overlay"
      },
      {
        "name": "initUIComponents",
        "kind": "function",
        "signature": "initUIComponents()",
        "summary": ""
      },
      {
        "name": "toast",
        "kind": "constant",
        "signature": "toast",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EditorWelding",
    "path": "editor/reference/modules/EditorWelding.md",
    "source": "editor/js/modules/EditorWelding.js",
    "import": "/editor/js/modules/EditorWelding.js",
    "sourceHash": "73359e558661f8e3f890de8cc23a17e4484ad7e2bf061ff4de7cd1b5ddb4fa5b",
    "summary": "EditorWelding.js - Auto-weld system for physics bodies Extracted from EditorPhysics.js for modularity Features: - Auto-weld colliding bodies into rigid compounds - D6 joint-based welding with PhysX optimizations - ECS component persistence for scene save/load - Emitter weld pre-scanning",
    "exports": [
      {
        "name": "createFixedJoint",
        "kind": "function",
        "signature": "createFixedJoint(editor, bodyA, bodyB, entityB)",
        "summary": "Create a fixed joint between two bodies Uses D6 joint locked in all axes with PhysX optimizations"
      },
      {
        "name": "restoreWeldsFromComponents",
        "kind": "function",
        "signature": "restoreWeldsFromComponents(editor)",
        "summary": "Restore welds from WeldConstraint components (for scene load)"
      },
      {
        "name": "performInitialWelding",
        "kind": "function",
        "signature": "performInitialWelding(editor)",
        "summary": "Perform initial welding of nearby bodies before simulation starts. Graph-based approach: 1. Filter eligible entities (skip ragdolls, skinned meshes, spheres/capsules) 2. Find all directly-touching pairs via AABB overlap 3. Create joints for each touching pair 4. detectWeldGroups (called after) finds connected components from joints Spheres and capsules are excluded because they are projectiles/characters, not structural elements. Only box/convexMesh entities form weldable structures."
      },
      {
        "name": "setAutoWeld",
        "kind": "function",
        "signature": "setAutoWeld(editor, enabled)",
        "summary": "Enable/disable auto-welding of colliding bodies"
      },
      {
        "name": "processWeldContacts",
        "kind": "function",
        "signature": "processWeldContacts(editor)",
        "summary": "Process potential welds by checking body proximity (runtime)"
      },
      {
        "name": "clearAllWelds",
        "kind": "function",
        "signature": "clearAllWelds(editor)",
        "summary": "Break all welds and reset"
      },
      {
        "name": "preScanEmitterWelds",
        "kind": "function",
        "signature": "preScanEmitterWelds(editor)",
        "summary": "Pre-scan to detect which emitters should be welded based on AABB surface proximity. Uses entity scale and physics body extents to compute surface-to-surface distance, so emitters touching any face of a large/tall object get welded correctly."
      },
      {
        "name": "detectWeldGroups",
        "kind": "function",
        "signature": "detectWeldGroups(editor)",
        "summary": "Detect connected components of welded entities (weld groups). Runs AFTER performInitialWelding — uses editor.weldParentChildren + weldJoints. Outputs stored on editor: weldGroups: Map<rootEntityId, Set<memberEntityIds>>  (root included in set) weldChildToRoot: Map<childEntityId, rootEntityId>    (O(1) render skip) weldGroupLocalTransforms: Map<entityId, {localPos, localRot, localScale}>"
      },
      {
        "name": "buildWeldGroupMeshes",
        "kind": "function",
        "signature": "buildWeldGroupMeshes(editor, entityMeshRenderer, inferMeshTypeFn)",
        "summary": "Build merged meshes for each weld group and register them with EntityMeshRenderer. Follows Unity CombineMeshes pattern: transform child vertices into root's local space. Also stores per-member mesh segment info for per-frame vertex updates."
      },
      {
        "name": "syncWeldedEntities",
        "kind": "function",
        "signature": "syncWeldedEntities(editor, rotateVectorByQuatFn)",
        "summary": "Sync welded child entity transforms to their parent bodies Called from stepPhysics loop"
      },
      {
        "name": "rotateVectorByQuat",
        "kind": "re-export",
        "signature": "rotateVectorByQuat",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/EntitySchema",
    "path": "editor/reference/modules/EntitySchema.md",
    "source": "editor/js/modules/EntitySchema.js",
    "import": "/editor/js/modules/EntitySchema.js",
    "sourceHash": "9075a367d2be34df865573d3fb839aab0817e1be22ba69790ace78085e9e65c5",
    "summary": "Generate a full JSON schema for an entity",
    "exports": [
      {
        "name": "generateEntitySchema",
        "kind": "function",
        "signature": "generateEntitySchema(editor, entityId)",
        "summary": "Generate a full JSON schema for an entity"
      },
      {
        "name": "generateSceneSchema",
        "kind": "function",
        "signature": "generateSceneSchema(editor)",
        "summary": "Generate schemas for all entities in the scene"
      },
      {
        "name": "exportSceneToJSON",
        "kind": "function",
        "signature": "exportSceneToJSON(editor, pretty = true)",
        "summary": "Export scene schema to JSON string"
      },
      {
        "name": "debugEntitySchema",
        "kind": "function",
        "signature": "debugEntitySchema(editor, entityId)",
        "summary": "Print entity schema to console (for debugging)"
      },
      {
        "name": "debugSceneSchema",
        "kind": "function",
        "signature": "debugSceneSchema(editor)",
        "summary": "Print full scene schema to console (for debugging)"
      },
      {
        "name": "getRelationshipSummary",
        "kind": "function",
        "signature": "getRelationshipSummary(editor, entityId)",
        "summary": "Get a summary of entity relationships"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/GeometryBuilders",
    "path": "editor/reference/modules/GeometryBuilders.md",
    "source": "editor/js/modules/GeometryBuilders.js",
    "import": "/editor/js/modules/GeometryBuilders.js",
    "sourceHash": "a1c318aeafa8252015706b6eb5c40a20a1a5fa7d03904b1158970f4670ac0274",
    "summary": "GeometryBuilders.js - Procedural geometry generation for physics colliders Extracted from EditorPhysics.js for modularity",
    "exports": [
      {
        "name": "createWedgeGeometry",
        "kind": "function",
        "signature": "createWedgeGeometry()",
        "summary": "Create wedge/ramp geometry - flat bottom, sloped top"
      },
      {
        "name": "createPrismGeometry",
        "kind": "function",
        "signature": "createPrismGeometry()",
        "summary": "Create hexagonal prism geometry"
      },
      {
        "name": "createStairsGeometry",
        "kind": "function",
        "signature": "createStairsGeometry()",
        "summary": "Create stairs geometry (4 steps)"
      },
      {
        "name": "createArchGeometry",
        "kind": "function",
        "signature": "createArchGeometry()",
        "summary": "Create arch geometry with legs and curved top"
      },
      {
        "name": "createHelixGeometry",
        "kind": "function",
        "signature": "createHelixGeometry()",
        "summary": "Create helix/spring geometry"
      },
      {
        "name": "createGearGeometry",
        "kind": "function",
        "signature": "createGearGeometry()",
        "summary": "Create gear geometry with teeth"
      },
      {
        "name": "createStarGeometry",
        "kind": "function",
        "signature": "createStarGeometry()",
        "summary": "Create 5-point star geometry"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/HotkeyManager",
    "path": "editor/reference/modules/HotkeyManager.md",
    "source": "editor/js/modules/HotkeyManager.js",
    "import": "/editor/js/modules/HotkeyManager.js",
    "sourceHash": "c134ea2f1ecafdb513b204b761cee9edc47377d43af5597634f0e5c0dd9aa21a",
    "summary": "HotkeyManager.js - Centralized Hotkey System with YAML-style Configuration Features: - Centralized hotkey definitions - Easy configuration via config object (YAML-style) - Runtime hotkey rebinding - Hotkey editor UI - localStorage persistence for custom bindings - Conflict detection",
    "exports": [
      {
        "name": "showHotkeyEditor",
        "kind": "function",
        "signature": "showHotkeyEditor()",
        "summary": ""
      },
      {
        "name": "DEFAULT_HOTKEYS",
        "kind": "re-export",
        "signature": "DEFAULT_HOTKEYS",
        "summary": ""
      },
      {
        "name": "hotkeyManager",
        "kind": "re-export",
        "signature": "hotkeyManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/LoadingManager",
    "path": "editor/reference/modules/LoadingManager.md",
    "source": "editor/js/modules/LoadingManager.js",
    "import": "/editor/js/modules/LoadingManager.js",
    "sourceHash": "50cda92dbe845c1833c7a286b8e8241b932b65df03453c7964b6db79878964c5",
    "summary": "LoadingManager.js - Advanced loading system with progress tracking Manages dynamic loading of editor components with real progress, stage tracking, and a polished loading screen UI.",
    "exports": [
      {
        "name": "LoadingManager",
        "kind": "class",
        "signature": "class LoadingManager",
        "summary": "LoadingManager - Tracks and displays loading progress"
      },
      {
        "name": "getLoadingManager",
        "kind": "function",
        "signature": "getLoadingManager()",
        "summary": ""
      },
      {
        "name": "loadingStage",
        "kind": "function",
        "signature": "loadingStage(stageId, subtitle = '')",
        "summary": ""
      },
      {
        "name": "loadingProgress",
        "kind": "function",
        "signature": "loadingProgress(progress)",
        "summary": ""
      },
      {
        "name": "loadingComplete",
        "kind": "function",
        "signature": "loadingComplete(stageId)",
        "summary": ""
      },
      {
        "name": "loadingFinish",
        "kind": "function",
        "signature": "loadingFinish()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/ModelImporter",
    "path": "editor/reference/modules/ModelImporter.md",
    "source": "editor/js/modules/ModelImporter.js",
    "import": "/editor/js/modules/ModelImporter.js",
    "sourceHash": "3729d7852026829e792ba1b102941908c8965d475d84c88e09f2ed7f6cad7e18",
    "summary": "============================================================================ ModelImporter.js - OBJ / glTF / GLB parsers + entity spawning ============================================================================",
    "exports": [
      {
        "name": "parseModelFile",
        "kind": "function",
        "signature": "async parseModelFile(file)",
        "summary": "Parse a model File into geometry data."
      },
      {
        "name": "parsePointCloudFile",
        "kind": "function",
        "signature": "async parsePointCloudFile(file)",
        "summary": "Parse a point cloud file into point data."
      },
      {
        "name": "parseOBJ",
        "kind": "function",
        "signature": "parseOBJ(text)",
        "summary": "Parse Wavefront OBJ text into indexed geometry. Handles v, vn, vt, f directives. Triangulates quads."
      },
      {
        "name": "parseGLB",
        "kind": "function",
        "signature": "parseGLB(arrayBuffer, modelName)",
        "summary": "Parse a GLB (binary glTF 2.0) ArrayBuffer. Extracts all mesh primitives as flat position/normal/uv/index arrays."
      },
      {
        "name": "parseGLTFJson",
        "kind": "function",
        "signature": "parseGLTFJson(gltf, binBuffer, modelName)",
        "summary": "Parse glTF JSON + optional binary buffer into mesh geometries."
      },
      {
        "name": "extractGLTFNodeAnimationGraph",
        "kind": "function",
        "signature": "extractGLTFNodeAnimationGraph(gltf)",
        "summary": ""
      },
      {
        "name": "collectGLTFNodeInstances",
        "kind": "function",
        "signature": "collectGLTFNodeInstances(gltf, suppliedGraph = null)",
        "summary": ""
      },
      {
        "name": "createModelInstanceId",
        "kind": "function",
        "signature": "createModelInstanceId()",
        "summary": ""
      },
      {
        "name": "createModelPartDescriptors",
        "kind": "function",
        "signature": "createModelPartDescriptors(result, assetId, instanceId, existingParts = null)",
        "summary": ""
      },
      {
        "name": "computeModelBounds",
        "kind": "function",
        "signature": "computeModelBounds(result)",
        "summary": ""
      },
      {
        "name": "registerModelRuntimeMaterials",
        "kind": "function",
        "signature": "async registerModelRuntimeMaterials(editor, result, parts)",
        "summary": ""
      },
      {
        "name": "registerModelRuntimeMeshes",
        "kind": "function",
        "signature": "async registerModelRuntimeMeshes(editor, result, parts, modelInstanceId = null, modelAnimation = null, modelMorphWeights = null,)",
        "summary": ""
      },
      {
        "name": "spawnModelAsset",
        "kind": "function",
        "signature": "async spawnModelAsset(editor, asset)",
        "summary": "Load a model asset, register its mesh, and create an entity in the scene."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/PrefabLibrary",
    "path": "editor/reference/modules/PrefabLibrary.md",
    "source": "editor/js/modules/PrefabLibrary.js",
    "import": "/editor/js/modules/PrefabLibrary.js",
    "sourceHash": "cb7cf17ba1d40b8ac2a95a69e559b0fdff30b9e0eafc56523c134e4a4b6f8dce",
    "summary": "PrefabManager.js - Folder-based Prefab System (File-based) Based on J:\\game2 implementation - proper file persistence Every entity folder is a prefab that can be: - Exported to Assets/Prefabs/*.prefab.json - Imported/instantiated into any scene - Updated (re-export overwrites) - Listed and browsed",
    "exports": [
      {
        "name": "exportFolderAsPrefab",
        "kind": "function",
        "signature": "exportFolderAsPrefab(editor, folderId)",
        "summary": "Export a folder as a prefab data structure"
      },
      {
        "name": "setCollabPrefabHooks",
        "kind": "function",
        "signature": "setCollabPrefabHooks(onSave, onDelete)",
        "summary": ""
      },
      {
        "name": "savePrefabToFile",
        "kind": "function",
        "signature": "async savePrefabToFile(editor, prefab)",
        "summary": "Save prefab to Assets/Prefabs/ directory"
      },
      {
        "name": "exportFolder",
        "kind": "function",
        "signature": "async exportFolder(editor, folderId)",
        "summary": "Export folder and save to file (combined operation)"
      },
      {
        "name": "listPrefabs",
        "kind": "function",
        "signature": "async listPrefabs(editor)",
        "summary": "List all available prefabs in Assets/Prefabs/"
      },
      {
        "name": "loadPrefabFile",
        "kind": "function",
        "signature": "async loadPrefabFile(editor, fileName)",
        "summary": "Load prefab from file"
      },
      {
        "name": "loadPrefabByUUID",
        "kind": "function",
        "signature": "async loadPrefabByUUID(editor, uuid)",
        "summary": "Load prefab by UUID"
      },
      {
        "name": "instantiatePrefab",
        "kind": "function",
        "signature": "instantiatePrefab(editor, prefab, targetFolderId = null, offset = [0, 0, 0])",
        "summary": "Instantiate a prefab in the scene"
      },
      {
        "name": "importPrefab",
        "kind": "function",
        "signature": "async importPrefab(editor, fileName, targetFolderId = null, offset = [0, 0, 0])",
        "summary": "Import prefab from file and instantiate"
      },
      {
        "name": "deletePrefab",
        "kind": "function",
        "signature": "async deletePrefab(editor, fileName)",
        "summary": "Delete prefab file"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/ProjectStorage",
    "path": "editor/reference/modules/ProjectStorage.md",
    "source": "editor/js/modules/ProjectStorage.js",
    "import": "/editor/js/modules/ProjectStorage.js",
    "sourceHash": "b412f8d2437921bce22b46c044e8b11da0435b6e755c38412420b103d96bd690",
    "summary": "ProjectManager - Save/load/export projects (pure browser, no Node.js) Uses IndexedDB + File System Access API",
    "exports": [
      {
        "name": "setCollabSaveHook",
        "kind": "function",
        "signature": "setCollabSaveHook(fn)",
        "summary": ""
      },
      {
        "name": "saveProject",
        "kind": "function",
        "signature": "async saveProject(project)",
        "summary": "Save project to IndexedDB"
      },
      {
        "name": "loadProject",
        "kind": "function",
        "signature": "async loadProject(projectUuid)",
        "summary": "Load project from IndexedDB"
      },
      {
        "name": "listProjects",
        "kind": "function",
        "signature": "async listProjects()",
        "summary": "List all projects"
      },
      {
        "name": "deleteProject",
        "kind": "function",
        "signature": "async deleteProject(projectUuid)",
        "summary": "Delete project"
      },
      {
        "name": "getLastProjectUuid",
        "kind": "function",
        "signature": "getLastProjectUuid()",
        "summary": "Get last opened project UUID"
      },
      {
        "name": "createProject",
        "kind": "function",
        "signature": "createProject(name = 'New Project')",
        "summary": "Create new project"
      },
      {
        "name": "exportProject",
        "kind": "function",
        "signature": "async exportProject(project, options = {})",
        "summary": "Export project to ZIP for distribution Strips editor-only data and packs for runtime"
      },
      {
        "name": "downloadProjectBackup",
        "kind": "function",
        "signature": "async downloadProjectBackup(project)",
        "summary": "Download project as JSON file (backup)"
      },
      {
        "name": "importProjectFromFile",
        "kind": "function",
        "signature": "async importProjectFromFile(file)",
        "summary": "Import project from JSON file"
      },
      {
        "name": "enableAutoSave",
        "kind": "function",
        "signature": "enableAutoSave(project, intervalMs = 60000)",
        "summary": ""
      },
      {
        "name": "disableAutoSave",
        "kind": "function",
        "signature": "disableAutoSave()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "modules/SubScene",
    "path": "editor/reference/modules/SubScene.md",
    "source": "editor/js/modules/SubScene.js",
    "import": "/editor/js/modules/SubScene.js",
    "sourceHash": "c4a015897c6e42b368c893ce975b6c0ff9803833c5a63f787bc5acad715bb79d",
    "summary": "============================================================================ SubScene.js — Parallel scene layer for debris, fragments & world environment  Lives alongside the editor scene but is NOT part of it. Objects here: - Are NOT in editor.scene.entities - Are NOT selectable, saveable, or undoable - Have their own PhysX bodies for physics simulation - Are rendered via EntityMeshRenderer in a dedicated pass - Have automatic lifecycle (fade, expire, cleanup)  Categories: 'debris'   — tiny short-lived particles (dust, sparks, splinters) 'fragment' — larger breakoff chunks from fractured meshes 'env'      — persistent world environment objects (no auto-expire)  Usage: const sub = editor.subScene; sub.spawn({ category: 'debris', meshType: 'cube', position, velocity, ... }); sub.spawnFragment(parentEntityId, { meshType, position, ... }); sub.tick(dt);          // called from stepPhysics sub.render(rp, vp, emr); // called from Viewport sub.clear();           // on play→edit transition ============================================================================",
    "exports": [
      {
        "name": "SubScene",
        "kind": "class",
        "signature": "class SubScene",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "panels/AssetPanel",
    "path": "editor/reference/panels/AssetPanel.md",
    "source": "editor/js/panels/AssetPanel.js",
    "import": "/editor/js/panels/AssetPanel.js",
    "sourceHash": "7ede4830fa3b0f3dd3e1c9c067a13ddb6996f909e3a23351977c5b789da55f86",
    "summary": "============================================================================ AssetPanel.js - Bottom-panel asset browser (Unity/Unreal-inspired) ============================================================================",
    "exports": [
      {
        "name": "setupAssetPanel",
        "kind": "function",
        "signature": "setupAssetPanel(editor)",
        "summary": ""
      },
      {
        "name": "renderAssetGrid",
        "kind": "function",
        "signature": "renderAssetGrid()",
        "summary": ""
      },
      {
        "name": "getSelectedAssetUuid",
        "kind": "function",
        "signature": "getSelectedAssetUuid()",
        "summary": ""
      },
      {
        "name": "refreshAssets",
        "kind": "function",
        "signature": "refreshAssets()",
        "summary": ""
      },
      {
        "name": "sampleAssetAnimationTransforms",
        "kind": "function",
        "signature": "sampleAssetAnimationTransforms(gltf, animIdx, time, binStart, buf)",
        "summary": ""
      },
      {
        "name": "base64ToArrayBuffer",
        "kind": "function",
        "signature": "base64ToArrayBuffer(base64)",
        "summary": ""
      },
      {
        "name": "handleRemoteAssetImport",
        "kind": "function",
        "signature": "async handleRemoteAssetImport(payload)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "panels/Hierarchy",
    "path": "editor/reference/panels/Hierarchy.md",
    "source": "editor/js/panels/Hierarchy.js",
    "import": "/editor/js/panels/Hierarchy.js",
    "sourceHash": "92e5c243b81dd668f5c3df0833c79a150cc650d1c96dbd084a7a8113690cc298",
    "summary": "HierarchyPanel - Entity tree view",
    "exports": [
      {
        "name": "HierarchyPanel",
        "kind": "class",
        "signature": "class HierarchyPanel",
        "summary": "HierarchyPanel - Entity tree view"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "panels/Inspector",
    "path": "editor/reference/panels/Inspector.md",
    "source": "editor/js/panels/Inspector.js",
    "import": "/editor/js/panels/Inspector.js",
    "sourceHash": "800e63996182932ce48dca62638920636eae86737aadbfdba21b62c8f093d42d",
    "summary": "InspectorPanel - Component property editor",
    "exports": [
      {
        "name": "InspectorPanel",
        "kind": "class",
        "signature": "class InspectorPanel",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "panels/SpellGeneratorPanel",
    "path": "editor/reference/panels/SpellGeneratorPanel.md",
    "source": "editor/js/panels/SpellGeneratorPanel.js",
    "import": "/editor/js/panels/SpellGeneratorPanel.js",
    "sourceHash": "1352f7889193570da9c22f163a4bee80f2eefdfd2a78f40d49448657d7102914",
    "summary": "SpellGeneratorPanel.js - Spell Generator Editor UI A panel for procedurally generating spells in the editor. Features: - Element selection (with combination preview) - Spell type selection - Modifier toggles - Power level slider - Live preview - Save to spell library",
    "exports": [
      {
        "name": "SpellGeneratorPanel",
        "kind": "class",
        "signature": "class SpellGeneratorPanel",
        "summary": ""
      },
      {
        "name": "createSpellGeneratorPanel",
        "kind": "function",
        "signature": "createSpellGeneratorPanel(options = {})",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "panels/Viewport",
    "path": "editor/reference/panels/Viewport.md",
    "source": "editor/js/panels/Viewport.js",
    "import": "/editor/js/panels/Viewport.js",
    "sourceHash": "74c753272ac0ba29420760ee99ea09b3f5a1cb742f114bbd03ef9786ae506ea8",
    "summary": "",
    "exports": [
      {
        "name": "ViewportPanel",
        "kind": "class",
        "signature": "class ViewportPanel",
        "summary": ""
      },
      {
        "name": "clearMeshTypeCache",
        "kind": "re-export",
        "signature": "clearMeshTypeCache",
        "summary": ""
      },
      {
        "name": "inferEntityMeshTypeAndColor",
        "kind": "re-export",
        "signature": "inferEntityMeshTypeAndColor",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/AssetRegistry",
    "path": "editor/reference/project/AssetRegistry.md",
    "source": "editor/js/project/AssetRegistry.js",
    "import": "/editor/js/project/AssetRegistry.js",
    "sourceHash": "0642841e85cdaab6722229f350ace053cf4e9799c00d5cc96e58e9f2ff29e859",
    "summary": "AssetRegistry.js - UUID-based asset management Adapted from J:\\game2 - handles: - Asset registration and UUID assignment - Path ↔ UUID lookup - Lazy loading of asset data - Asset index persistence (Assets/index.json) - Import and update operations",
    "exports": [
      {
        "name": "UnsupportedAssetIndexVersionError",
        "kind": "class",
        "signature": "class UnsupportedAssetIndexVersionError extends Error",
        "summary": ""
      },
      {
        "name": "AssetRegistry",
        "kind": "class",
        "signature": "class AssetRegistry",
        "summary": ""
      },
      {
        "name": "prepareAssetIndex",
        "kind": "function",
        "signature": "prepareAssetIndex(input)",
        "summary": ""
      },
      {
        "name": "getAssetTypeFromExtension",
        "kind": "function",
        "signature": "getAssetTypeFromExtension(filename)",
        "summary": "Get asset type from file extension"
      },
      {
        "name": "getAssetRegistry",
        "kind": "function",
        "signature": "getAssetRegistry()",
        "summary": ""
      },
      {
        "name": "initAssetRegistry",
        "kind": "function",
        "signature": "async initAssetRegistry(projectDir)",
        "summary": ""
      },
      {
        "name": "ASSET_INDEX_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "ASSET_INDEX_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "ASSET_TYPES",
        "kind": "constant",
        "signature": "ASSET_TYPES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/AutoSave",
    "path": "editor/reference/project/AutoSave.md",
    "source": "editor/js/project/AutoSave.js",
    "import": "/editor/js/project/AutoSave.js",
    "sourceHash": "d948e46bc8254e6c26a3dad857ec670d6179028c5449571d6deda157c6815553",
    "summary": "Wrap editor methods to track dirty state",
    "exports": [
      {
        "name": "DirtyTracker",
        "kind": "class",
        "signature": "class DirtyTracker",
        "summary": ""
      },
      {
        "name": "AutoSaveManager",
        "kind": "class",
        "signature": "class AutoSaveManager",
        "summary": ""
      },
      {
        "name": "setupDirtyTracking",
        "kind": "function",
        "signature": "setupDirtyTracking(editor, autoSaveManager)",
        "summary": "Wrap editor methods to track dirty state"
      },
      {
        "name": "setupSaveShortcut",
        "kind": "function",
        "signature": "setupSaveShortcut(autoSaveManager)",
        "summary": "Setup Ctrl+S shortcut"
      },
      {
        "name": "setupNewSceneShortcut",
        "kind": "function",
        "signature": "setupNewSceneShortcut(editor)",
        "summary": "Setup Ctrl+N for new scene"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/ProjectCompatibility",
    "path": "editor/reference/project/ProjectCompatibility.md",
    "source": "editor/js/project/ProjectCompatibility.js",
    "import": "/editor/js/project/ProjectCompatibility.js",
    "sourceHash": "7eb298a0667049e0218024d39c4963b6f782aa0632a849b425edbd60c3ec82cd",
    "summary": "Normalize a persisted/imported project without mutating the source object.",
    "exports": [
      {
        "name": "prepareProjectSettings",
        "kind": "function",
        "signature": "prepareProjectSettings(input)",
        "summary": ""
      },
      {
        "name": "prepareProjectRecord",
        "kind": "function",
        "signature": "prepareProjectRecord(input, { deserializeMaps = true } = {})",
        "summary": "Normalize a persisted/imported project without mutating the source object."
      },
      {
        "name": "PROJECT_SETTINGS_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "PROJECT_SETTINGS_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "PROJECT_RECORD_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "PROJECT_RECORD_SCHEMA_VERSION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/ProjectExporter",
    "path": "editor/reference/project/ProjectExporter.md",
    "source": "editor/js/project/ProjectExporter.js",
    "import": "/editor/js/project/ProjectExporter.js",
    "sourceHash": "122818ce60344f4ba53fc8ff290abfb97d1ddbc6b7d2bb6e2d7f332bca367b91",
    "summary": "Pack data into binary format Format: [magic:4][version:4][indexOffset:4][...blobs...][index]",
    "exports": [
      {
        "name": "packData",
        "kind": "function",
        "signature": "packData(entries)",
        "summary": "Pack data into binary format Format: [magic:4][version:4][indexOffset:4][...blobs...][index]"
      },
      {
        "name": "unpackData",
        "kind": "function",
        "signature": "unpackData(buffer)",
        "summary": "Unpack binary data (for runtime)"
      },
      {
        "name": "exportScene",
        "kind": "function",
        "signature": "async exportScene(editor, sceneData)",
        "summary": "Export a single scene to packed binary"
      },
      {
        "name": "exportProject",
        "kind": "function",
        "signature": "async exportProject(editor, sceneDataList, options = {})",
        "summary": "Export full project with multiple scenes"
      },
      {
        "name": "downloadZip",
        "kind": "function",
        "signature": "downloadZip(zipBuffer, filename = 'game-export.zip')",
        "summary": ""
      },
      {
        "name": "exportAndDownload",
        "kind": "function",
        "signature": "async exportAndDownload(editor, sceneDataList, options = {})",
        "summary": "Export and download project"
      },
      {
        "name": "RuntimeLoader",
        "kind": "re-export",
        "signature": "RuntimeLoader",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/ProjectLauncher",
    "path": "editor/reference/project/ProjectLauncher.md",
    "source": "editor/js/project/ProjectLauncher.js",
    "import": "/editor/js/project/ProjectLauncher.js",
    "sourceHash": "db928ae3a5aa441dc590f518de189ce7b4646cf4fad04503d1ab5821150dea7d",
    "summary": "ProjectLauncher.js - Startup screen with recent projects Adapted from J:\\game2 - Unity Hub / Godot style launcher: - Recent projects list with thumbnails - New project / Open project buttons - Project templates (future)",
    "exports": [
      {
        "name": "getRecentProjects",
        "kind": "function",
        "signature": "getRecentProjects()",
        "summary": ""
      },
      {
        "name": "addRecentProject",
        "kind": "function",
        "signature": "addRecentProject(project)",
        "summary": ""
      },
      {
        "name": "removeRecentProject",
        "kind": "function",
        "signature": "removeRecentProject(projectName)",
        "summary": ""
      },
      {
        "name": "clearRecentProjects",
        "kind": "function",
        "signature": "clearRecentProjects()",
        "summary": ""
      },
      {
        "name": "createLauncherUI",
        "kind": "function",
        "signature": "createLauncherUI()",
        "summary": ""
      },
      {
        "name": "renderRecentProjects",
        "kind": "function",
        "signature": "renderRecentProjects(container)",
        "summary": ""
      },
      {
        "name": "injectLauncherStyles",
        "kind": "function",
        "signature": "injectLauncherStyles()",
        "summary": ""
      },
      {
        "name": "showLauncher",
        "kind": "function",
        "signature": "async showLauncher(onProjectSelected)",
        "summary": ""
      },
      {
        "name": "hideLauncher",
        "kind": "function",
        "signature": "hideLauncher()",
        "summary": "Hide launcher (for when editor is already initialized)"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/SceneManager",
    "path": "editor/reference/project/SceneManager.md",
    "source": "editor/js/project/SceneManager.js",
    "import": "/editor/js/project/SceneManager.js",
    "sourceHash": "bfda4a9f7fbda4f8c4aa1829a5169029a5013e5e12cae0f94d531ef312bdc3f6",
    "summary": "SceneManager.js - Scene loading, saving, and management Handles: - Scene file I/O (Scenes/*.scene.json) - Scene serialization/deserialization - Multi-scene support - Scene switching",
    "exports": [
      {
        "name": "layerMask",
        "kind": "function",
        "signature": "layerMask(...layers)",
        "summary": ""
      },
      {
        "name": "hasLayer",
        "kind": "function",
        "signature": "hasLayer(mask, layer)",
        "summary": ""
      },
      {
        "name": "prepareSceneForImport",
        "kind": "function",
        "signature": "prepareSceneForImport(input)",
        "summary": "Validate and fully normalize a serialized scene before touching live editor state. Missing schemaVersion is the legacy v1 format; future versions fail closed."
      },
      {
        "name": "createSceneData",
        "kind": "function",
        "signature": "createSceneData(name = 'Untitled')",
        "summary": "Create empty scene data with full Unity/Godot-style structure"
      },
      {
        "name": "serializeScene",
        "kind": "function",
        "signature": "serializeScene(editor, sceneName = null)",
        "summary": "Serialize current editor scene to JSON-compatible object"
      },
      {
        "name": "deserializeScene",
        "kind": "function",
        "signature": "async deserializeScene(editor, sceneData)",
        "summary": "Validate and stage a complete scene before replacing live editor state. If an unexpected runtime failure occurs while applying it, restore the previously serialized scene so callers never inherit a half-loaded scene."
      },
      {
        "name": "clearScene",
        "kind": "function",
        "signature": "clearScene(editor)",
        "summary": "Clear all entities and folders from scene"
      },
      {
        "name": "saveSceneToFile",
        "kind": "function",
        "signature": "async saveSceneToFile(editor, sceneName = null)",
        "summary": "Save scene to file system"
      },
      {
        "name": "loadSceneFromFile",
        "kind": "function",
        "signature": "async loadSceneFromFile(editor, fileName)",
        "summary": "Load scene from file system"
      },
      {
        "name": "listScenes",
        "kind": "function",
        "signature": "async listScenes(editor)",
        "summary": "List all scenes in project"
      },
      {
        "name": "deleteSceneFile",
        "kind": "function",
        "signature": "async deleteSceneFile(editor, fileName)",
        "summary": "Delete scene file"
      },
      {
        "name": "newScene",
        "kind": "function",
        "signature": "newScene(editor, name = 'Untitled')",
        "summary": "Create new scene (clears current and sets name)"
      },
      {
        "name": "findEntitiesByLayer",
        "kind": "function",
        "signature": "findEntitiesByLayer(editor, layer)",
        "summary": "Find all entities on a specific layer"
      },
      {
        "name": "findEntitiesByLayerMask",
        "kind": "function",
        "signature": "findEntitiesByLayerMask(editor, mask)",
        "summary": "Find all entities matching a layer mask"
      },
      {
        "name": "findEntitiesByTag",
        "kind": "function",
        "signature": "findEntitiesByTag(editor, tag)",
        "summary": "Find all entities with a specific tag"
      },
      {
        "name": "findEntityByTag",
        "kind": "function",
        "signature": "findEntityByTag(editor, tag)",
        "summary": "Find first entity with a specific tag"
      },
      {
        "name": "findEnabledEntities",
        "kind": "function",
        "signature": "findEnabledEntities(editor)",
        "summary": "Find all enabled entities (active in scene)"
      },
      {
        "name": "findEntitiesByRenderFlags",
        "kind": "function",
        "signature": "findEntitiesByRenderFlags(editor, flags, matchAll = true)",
        "summary": "Find all entities with specific render flags"
      },
      {
        "name": "findPrefabInstances",
        "kind": "function",
        "signature": "findPrefabInstances(editor, prefabUuid = null)",
        "summary": "Find all prefab instances"
      },
      {
        "name": "getEntityConnections",
        "kind": "function",
        "signature": "getEntityConnections(editor, entityId)",
        "summary": "Get all connections for an entity (both incoming and outgoing)"
      },
      {
        "name": "addConnection",
        "kind": "function",
        "signature": "addConnection(editor, fromEntity, signal, toEntity, method, flags = 0, binds = [])",
        "summary": "Add a signal connection between entities"
      },
      {
        "name": "removeConnection",
        "kind": "function",
        "signature": "removeConnection(editor, fromEntity, signal, toEntity, method)",
        "summary": "Remove a signal connection"
      },
      {
        "name": "setEntityLayer",
        "kind": "function",
        "signature": "setEntityLayer(editor, entityId, layer)",
        "summary": "Set entity layer"
      },
      {
        "name": "setEntityTag",
        "kind": "function",
        "signature": "setEntityTag(editor, entityId, tag)",
        "summary": "Set entity tag"
      },
      {
        "name": "addEntityTag",
        "kind": "function",
        "signature": "addEntityTag(editor, entityId, tag)",
        "summary": "Add tag to entity's tags array"
      },
      {
        "name": "removeEntityTag",
        "kind": "function",
        "signature": "removeEntityTag(editor, entityId, tag)",
        "summary": "Remove tag from entity's tags array"
      },
      {
        "name": "setEntityRenderFlags",
        "kind": "function",
        "signature": "setEntityRenderFlags(editor, entityId, flags)",
        "summary": "Set entity render flags"
      },
      {
        "name": "setEntityEnabled",
        "kind": "function",
        "signature": "setEntityEnabled(editor, entityId, enabled)",
        "summary": "Set entity enabled state"
      },
      {
        "name": "SCENE_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "SCENE_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "LAYERS",
        "kind": "constant",
        "signature": "LAYERS",
        "summary": ""
      },
      {
        "name": "LAYER_NAMES",
        "kind": "constant",
        "signature": "LAYER_NAMES",
        "summary": ""
      },
      {
        "name": "BUILTIN_TAGS",
        "kind": "constant",
        "signature": "BUILTIN_TAGS",
        "summary": ""
      },
      {
        "name": "RENDER_FLAGS",
        "kind": "constant",
        "signature": "RENDER_FLAGS",
        "summary": ""
      },
      {
        "name": "DEFAULT_RENDER_FLAGS",
        "kind": "constant",
        "signature": "DEFAULT_RENDER_FLAGS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "project/index",
    "path": "editor/reference/project/index.md",
    "source": "editor/js/project/index.js",
    "import": "/editor/js/project/index.js",
    "sourceHash": "6ef6d15c18d36cc7b26856ae7110d19faded52af27be953343ce0f1de68b9341",
    "summary": "",
    "exports": [
      {
        "name": "ASSET_TYPES",
        "kind": "re-export",
        "signature": "ASSET_TYPES",
        "summary": ""
      },
      {
        "name": "AssetRegistry",
        "kind": "re-export",
        "signature": "AssetRegistry",
        "summary": ""
      },
      {
        "name": "AutoSaveManager",
        "kind": "re-export",
        "signature": "AutoSaveManager",
        "summary": ""
      },
      {
        "name": "BUILTIN_TAGS",
        "kind": "re-export",
        "signature": "BUILTIN_TAGS",
        "summary": ""
      },
      {
        "name": "DEFAULT_RENDER_FLAGS",
        "kind": "re-export",
        "signature": "DEFAULT_RENDER_FLAGS",
        "summary": ""
      },
      {
        "name": "DirtyTracker",
        "kind": "re-export",
        "signature": "DirtyTracker",
        "summary": ""
      },
      {
        "name": "LAYERS",
        "kind": "re-export",
        "signature": "LAYERS",
        "summary": ""
      },
      {
        "name": "LAYER_NAMES",
        "kind": "re-export",
        "signature": "LAYER_NAMES",
        "summary": ""
      },
      {
        "name": "ProjectExporter",
        "kind": "re-export",
        "signature": "ProjectExporter",
        "summary": ""
      },
      {
        "name": "ProjectLauncher",
        "kind": "re-export",
        "signature": "ProjectLauncher",
        "summary": ""
      },
      {
        "name": "RENDER_FLAGS",
        "kind": "re-export",
        "signature": "RENDER_FLAGS",
        "summary": ""
      },
      {
        "name": "SceneManager",
        "kind": "re-export",
        "signature": "SceneManager",
        "summary": ""
      },
      {
        "name": "addConnection",
        "kind": "re-export",
        "signature": "addConnection",
        "summary": ""
      },
      {
        "name": "addEntityTag",
        "kind": "re-export",
        "signature": "addEntityTag",
        "summary": ""
      },
      {
        "name": "addRecentProject",
        "kind": "re-export",
        "signature": "addRecentProject",
        "summary": ""
      },
      {
        "name": "clearRecentProjects",
        "kind": "re-export",
        "signature": "clearRecentProjects",
        "summary": ""
      },
      {
        "name": "clearScene",
        "kind": "re-export",
        "signature": "clearScene",
        "summary": ""
      },
      {
        "name": "createSceneData",
        "kind": "re-export",
        "signature": "createSceneData",
        "summary": ""
      },
      {
        "name": "deleteSceneFile",
        "kind": "re-export",
        "signature": "deleteSceneFile",
        "summary": ""
      },
      {
        "name": "deserializeScene",
        "kind": "re-export",
        "signature": "deserializeScene",
        "summary": ""
      },
      {
        "name": "downloadZip",
        "kind": "re-export",
        "signature": "downloadZip",
        "summary": ""
      },
      {
        "name": "exportAndDownload",
        "kind": "re-export",
        "signature": "exportAndDownload",
        "summary": ""
      },
      {
        "name": "exportProject",
        "kind": "re-export",
        "signature": "exportProject",
        "summary": ""
      },
      {
        "name": "exportScene",
        "kind": "re-export",
        "signature": "exportScene",
        "summary": ""
      },
      {
        "name": "findEnabledEntities",
        "kind": "re-export",
        "signature": "findEnabledEntities",
        "summary": ""
      },
      {
        "name": "findEntitiesByLayer",
        "kind": "re-export",
        "signature": "findEntitiesByLayer",
        "summary": ""
      },
      {
        "name": "findEntitiesByLayerMask",
        "kind": "re-export",
        "signature": "findEntitiesByLayerMask",
        "summary": ""
      },
      {
        "name": "findEntitiesByRenderFlags",
        "kind": "re-export",
        "signature": "findEntitiesByRenderFlags",
        "summary": ""
      },
      {
        "name": "findEntitiesByTag",
        "kind": "re-export",
        "signature": "findEntitiesByTag",
        "summary": ""
      },
      {
        "name": "findEntityByTag",
        "kind": "re-export",
        "signature": "findEntityByTag",
        "summary": ""
      },
      {
        "name": "findPrefabInstances",
        "kind": "re-export",
        "signature": "findPrefabInstances",
        "summary": ""
      },
      {
        "name": "getAssetRegistry",
        "kind": "re-export",
        "signature": "getAssetRegistry",
        "summary": ""
      },
      {
        "name": "getAssetTypeFromExtension",
        "kind": "re-export",
        "signature": "getAssetTypeFromExtension",
        "summary": ""
      },
      {
        "name": "getEntityConnections",
        "kind": "re-export",
        "signature": "getEntityConnections",
        "summary": ""
      },
      {
        "name": "getRecentProjects",
        "kind": "re-export",
        "signature": "getRecentProjects",
        "summary": ""
      },
      {
        "name": "hasLayer",
        "kind": "re-export",
        "signature": "hasLayer",
        "summary": ""
      },
      {
        "name": "hideLauncher",
        "kind": "re-export",
        "signature": "hideLauncher",
        "summary": ""
      },
      {
        "name": "initAssetRegistry",
        "kind": "re-export",
        "signature": "initAssetRegistry",
        "summary": ""
      },
      {
        "name": "layerMask",
        "kind": "re-export",
        "signature": "layerMask",
        "summary": ""
      },
      {
        "name": "listScenes",
        "kind": "re-export",
        "signature": "listScenes",
        "summary": ""
      },
      {
        "name": "loadSceneFromFile",
        "kind": "re-export",
        "signature": "loadSceneFromFile",
        "summary": ""
      },
      {
        "name": "newScene",
        "kind": "re-export",
        "signature": "newScene",
        "summary": ""
      },
      {
        "name": "packData",
        "kind": "re-export",
        "signature": "packData",
        "summary": ""
      },
      {
        "name": "removeConnection",
        "kind": "re-export",
        "signature": "removeConnection",
        "summary": ""
      },
      {
        "name": "removeEntityTag",
        "kind": "re-export",
        "signature": "removeEntityTag",
        "summary": ""
      },
      {
        "name": "removeRecentProject",
        "kind": "re-export",
        "signature": "removeRecentProject",
        "summary": ""
      },
      {
        "name": "saveSceneToFile",
        "kind": "re-export",
        "signature": "saveSceneToFile",
        "summary": ""
      },
      {
        "name": "serializeScene",
        "kind": "re-export",
        "signature": "serializeScene",
        "summary": ""
      },
      {
        "name": "setEntityEnabled",
        "kind": "re-export",
        "signature": "setEntityEnabled",
        "summary": ""
      },
      {
        "name": "setEntityLayer",
        "kind": "re-export",
        "signature": "setEntityLayer",
        "summary": ""
      },
      {
        "name": "setEntityRenderFlags",
        "kind": "re-export",
        "signature": "setEntityRenderFlags",
        "summary": ""
      },
      {
        "name": "setEntityTag",
        "kind": "re-export",
        "signature": "setEntityTag",
        "summary": ""
      },
      {
        "name": "setupDirtyTracking",
        "kind": "re-export",
        "signature": "setupDirtyTracking",
        "summary": ""
      },
      {
        "name": "setupNewSceneShortcut",
        "kind": "re-export",
        "signature": "setupNewSceneShortcut",
        "summary": ""
      },
      {
        "name": "setupSaveShortcut",
        "kind": "re-export",
        "signature": "setupSaveShortcut",
        "summary": ""
      },
      {
        "name": "showLauncher",
        "kind": "re-export",
        "signature": "showLauncher",
        "summary": ""
      },
      {
        "name": "unpackData",
        "kind": "re-export",
        "signature": "unpackData",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/SpawnableItem",
    "path": "editor/reference/spawnables/SpawnableItem.md",
    "source": "editor/js/spawnables/SpawnableItem.js",
    "import": "/editor/js/spawnables/SpawnableItem.js",
    "sourceHash": "8d3d8fbec0a5103ab4115ba186faebbe915687531cbc334c8954188364317463",
    "summary": "SpawnableItem - Base class for all spawnable objects in the editor. Physics collider options: - Override getCollider() to define custom colliders - Use helper imports from EditorPhysics for advanced physics: - generateCollidersFromSDF(sdfFunc, bounds, resolution) - createMeshColliderDecomposed(vertices, indices, options) - createSDFCollider(sdfFunc, bounds, options) - createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize) ```js import { generateCollidersFromSDF } from '../../modules/EditorPhysics.js'; static getCollider() { return { shape: 'box', halfExtents: [0.01, 0.01, 0.01], compoundColliders: generateCollidersFromSDF( (x, y, z) => mySDF(x, y, z), { min: [-1, -1, -1], max: [1, 1, 1] }, 12 ), }; } ```",
    "exports": [
      {
        "name": "SpawnableItem",
        "kind": "class",
        "signature": "class SpawnableItem",
        "summary": "SpawnableItem - Base class for all spawnable objects in the editor. Physics collider options: - Override getCollider() to define custom colliders - Use helper imports from EditorPhysics for advanced physics: - generateCollidersFromSDF(sdfFunc, bounds, resolution) - createMeshColliderDecomposed(vertices, indices, options) - createSDFCollider(sdfFunc, bounds, options) - createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize) ```js import { generateCollidersFromSDF } from '../../modules/EditorPhysics.js'; static getCollider() { return { shape: 'box', halfExtents: [0.01, 0.01, 0.01], compoundColliders: generateCollidersFromSDF( (x, y, z) => mySDF(x, y, z), { min: [-1, -1, -1], max: [1, 1, 1] }, 12 ), }; } ```"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/cameras/Camera",
    "path": "editor/reference/spawnables/cameras/Camera.md",
    "source": "editor/js/spawnables/cameras/Camera.js",
    "import": "/editor/js/spawnables/cameras/Camera.js",
    "sourceHash": "373d99038e659a5b8c9b48c59fb0d90b8d6bfb01b326c6b82a4e40dcbf85ed8f",
    "summary": "",
    "exports": [
      {
        "name": "Camera",
        "kind": "class",
        "signature": "class Camera extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Arch",
    "path": "editor/reference/spawnables/complex/Arch.md",
    "source": "editor/js/spawnables/complex/Arch.js",
    "import": "/editor/js/spawnables/complex/Arch.js",
    "sourceHash": "a96c9e4bccf76ae59b891e014866ff082dc127d8b4890e6b8201f7ad5dd39c15",
    "summary": "",
    "exports": [
      {
        "name": "Arch",
        "kind": "class",
        "signature": "class Arch extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/CSGShape",
    "path": "editor/reference/spawnables/complex/CSGShape.md",
    "source": "editor/js/spawnables/complex/CSGShape.js",
    "import": "/editor/js/spawnables/complex/CSGShape.js",
    "sourceHash": "33c3c6862d88d3a4e1c889f50c277045c972df47aaabcb82181ca89a264cf24e",
    "summary": "============================================================================ CSGShape.js — CSG Boolean operations on mesh entities  Select 2 mesh entities → right-click → CSG Union / Subtract / Intersect V1: Voxelize both → VoxelOps boolean → SDFToMesh marching cubes reconstruct V2: Voxelize both → VoxelOps boolean → DualContouring for sharp features ============================================================================",
    "exports": [
      {
        "name": "performCSG",
        "kind": "function",
        "signature": "async performCSG(editor, entityIdA, entityIdB, operation = 'union', opts = {})",
        "summary": "Perform a CSG boolean operation on two mesh entities."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Gear",
    "path": "editor/reference/spawnables/complex/Gear.md",
    "source": "editor/js/spawnables/complex/Gear.js",
    "import": "/editor/js/spawnables/complex/Gear.js",
    "sourceHash": "4275567fb6f9a9aa30cdfcbd967b4d982f8e4341edccfdabffdf8f1af69bb84b",
    "summary": "",
    "exports": [
      {
        "name": "Gear",
        "kind": "class",
        "signature": "class Gear extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Helix",
    "path": "editor/reference/spawnables/complex/Helix.md",
    "source": "editor/js/spawnables/complex/Helix.js",
    "import": "/editor/js/spawnables/complex/Helix.js",
    "sourceHash": "bfee49e017a88b56cfc267024d5c2b804930ee6a35894b50fe925b711a322a0e",
    "summary": "",
    "exports": [
      {
        "name": "Helix",
        "kind": "class",
        "signature": "class Helix extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Prism",
    "path": "editor/reference/spawnables/complex/Prism.md",
    "source": "editor/js/spawnables/complex/Prism.js",
    "import": "/editor/js/spawnables/complex/Prism.js",
    "sourceHash": "19a5024860b31323106b0a30c2d63ae33ac2de2fc82b86ed0a8ae9ebaf4fbd48",
    "summary": "",
    "exports": [
      {
        "name": "Prism",
        "kind": "class",
        "signature": "class Prism extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Pyramid",
    "path": "editor/reference/spawnables/complex/Pyramid.md",
    "source": "editor/js/spawnables/complex/Pyramid.js",
    "import": "/editor/js/spawnables/complex/Pyramid.js",
    "sourceHash": "523e067543404a729fa519d07a32f495c207d98949c1c3b80591899f3a4b144b",
    "summary": "",
    "exports": [
      {
        "name": "Pyramid",
        "kind": "class",
        "signature": "class Pyramid extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/SDFShape",
    "path": "editor/reference/spawnables/complex/SDFShape.md",
    "source": "editor/js/spawnables/complex/SDFShape.js",
    "import": "/editor/js/spawnables/complex/SDFShape.js",
    "sourceHash": "d915ac0c6428410d673e6a288f68746cc5bcd80c60e39952ef1135cc27897b93",
    "summary": "",
    "exports": [
      {
        "name": "SDFShape",
        "kind": "class",
        "signature": "class SDFShape extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Stairs",
    "path": "editor/reference/spawnables/complex/Stairs.md",
    "source": "editor/js/spawnables/complex/Stairs.js",
    "import": "/editor/js/spawnables/complex/Stairs.js",
    "sourceHash": "0a0d107c1702209cb6cedcd7be8f06c28ac58c90dd1a75679ecc2181079d008b",
    "summary": "",
    "exports": [
      {
        "name": "Stairs",
        "kind": "class",
        "signature": "class Stairs extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Star",
    "path": "editor/reference/spawnables/complex/Star.md",
    "source": "editor/js/spawnables/complex/Star.js",
    "import": "/editor/js/spawnables/complex/Star.js",
    "sourceHash": "22be327fc9f38b152f8812d758b9e49cd448f52f68d8ca89eb597966f9e788bd",
    "summary": "",
    "exports": [
      {
        "name": "Star",
        "kind": "class",
        "signature": "class Star extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/complex/Wedge",
    "path": "editor/reference/spawnables/complex/Wedge.md",
    "source": "editor/js/spawnables/complex/Wedge.js",
    "import": "/editor/js/spawnables/complex/Wedge.js",
    "sourceHash": "b1db40a7a8e5aa94aae028ddf9da9a4c7245dcada86800445d7938af9df43687",
    "summary": "",
    "exports": [
      {
        "name": "Wedge",
        "kind": "class",
        "signature": "class Wedge extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/emitters/ParticleEmitter",
    "path": "editor/reference/spawnables/emitters/ParticleEmitter.md",
    "source": "editor/js/spawnables/emitters/ParticleEmitter.js",
    "import": "/editor/js/spawnables/emitters/ParticleEmitter.js",
    "sourceHash": "0f6094887e4f28a8bf9011d9e7c6a8bf134bc411d6a30f3f4689fc716d464b5c",
    "summary": "",
    "exports": [
      {
        "name": "ParticleEmitter",
        "kind": "class",
        "signature": "class ParticleEmitter extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/emitters/PhaseEmitters",
    "path": "editor/reference/spawnables/emitters/PhaseEmitters.md",
    "source": "editor/js/spawnables/emitters/PhaseEmitters.js",
    "import": "/editor/js/spawnables/emitters/PhaseEmitters.js",
    "sourceHash": "21043cc003c9a7477aeea843d30b7e6884bc868609a06484ee9bf52980b56a4e",
    "summary": "",
    "exports": [
      {
        "name": "FireEmitter",
        "kind": "constant",
        "signature": "FireEmitter",
        "summary": ""
      },
      {
        "name": "SmokeEmitter",
        "kind": "constant",
        "signature": "SmokeEmitter",
        "summary": ""
      },
      {
        "name": "SteamEmitter",
        "kind": "constant",
        "signature": "SteamEmitter",
        "summary": ""
      },
      {
        "name": "WaterEmitter",
        "kind": "constant",
        "signature": "WaterEmitter",
        "summary": ""
      },
      {
        "name": "FountainEmitter",
        "kind": "constant",
        "signature": "FountainEmitter",
        "summary": ""
      },
      {
        "name": "LavaEmitter",
        "kind": "constant",
        "signature": "LavaEmitter",
        "summary": ""
      },
      {
        "name": "SnowEmitter",
        "kind": "constant",
        "signature": "SnowEmitter",
        "summary": ""
      },
      {
        "name": "SparksEmitter",
        "kind": "constant",
        "signature": "SparksEmitter",
        "summary": ""
      },
      {
        "name": "DebrisEmitter",
        "kind": "constant",
        "signature": "DebrisEmitter",
        "summary": ""
      },
      {
        "name": "PlasmaEmitter",
        "kind": "constant",
        "signature": "PlasmaEmitter",
        "summary": ""
      },
      {
        "name": "MagicEmitter",
        "kind": "constant",
        "signature": "MagicEmitter",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/index",
    "path": "editor/reference/spawnables/index.md",
    "source": "editor/js/spawnables/index.js",
    "import": "/editor/js/spawnables/index.js",
    "sourceHash": "595aa31072a16cd734c338631a1f908df25824e2116306b23df370e1140eacb8",
    "summary": "",
    "exports": [
      {
        "name": "getSpawnable",
        "kind": "function",
        "signature": "getSpawnable(id)",
        "summary": ""
      },
      {
        "name": "getSpawnablesByCategory",
        "kind": "function",
        "signature": "getSpawnablesByCategory(category)",
        "summary": ""
      },
      {
        "name": "getAllCategories",
        "kind": "function",
        "signature": "getAllCategories()",
        "summary": ""
      },
      {
        "name": "getAllSpawnables",
        "kind": "function",
        "signature": "getAllSpawnables()",
        "summary": ""
      },
      {
        "name": "spawnables",
        "kind": "constant",
        "signature": "spawnables",
        "summary": ""
      },
      {
        "name": "spawnableRegistry",
        "kind": "constant",
        "signature": "spawnableRegistry",
        "summary": ""
      },
      {
        "name": "categories",
        "kind": "constant",
        "signature": "categories",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/lights/DirectionalLight",
    "path": "editor/reference/spawnables/lights/DirectionalLight.md",
    "source": "editor/js/spawnables/lights/DirectionalLight.js",
    "import": "/editor/js/spawnables/lights/DirectionalLight.js",
    "sourceHash": "68e2d9c5b23fa7cbe36f7013759eff47784d3a5c527353f175d7788e90cfb32c",
    "summary": "",
    "exports": [
      {
        "name": "DirectionalLight",
        "kind": "class",
        "signature": "class DirectionalLight extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/lights/PointLight",
    "path": "editor/reference/spawnables/lights/PointLight.md",
    "source": "editor/js/spawnables/lights/PointLight.js",
    "import": "/editor/js/spawnables/lights/PointLight.js",
    "sourceHash": "b14c8f757628b2ea39a44610abbf250a4fc858f11d5775a8a3256a2f6cfc2449",
    "summary": "",
    "exports": [
      {
        "name": "PointLight",
        "kind": "class",
        "signature": "class PointLight extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/lights/SpotLight",
    "path": "editor/reference/spawnables/lights/SpotLight.md",
    "source": "editor/js/spawnables/lights/SpotLight.js",
    "import": "/editor/js/spawnables/lights/SpotLight.js",
    "sourceHash": "eafd370d38d63f7348b618400e3a67795cd81a7b9961ddfdcb21a9c31d5d92e1",
    "summary": "",
    "exports": [
      {
        "name": "SpotLight",
        "kind": "class",
        "signature": "class SpotLight extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Balloon",
    "path": "editor/reference/spawnables/physics/Balloon.md",
    "source": "editor/js/spawnables/physics/Balloon.js",
    "import": "/editor/js/spawnables/physics/Balloon.js",
    "sourceHash": "dabc368d2716c7738c65c676720f0f354b39888c674054038ce16841d9ab3861",
    "summary": "",
    "exports": [
      {
        "name": "Balloon",
        "kind": "class",
        "signature": "class Balloon extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Chain",
    "path": "editor/reference/spawnables/physics/Chain.md",
    "source": "editor/js/spawnables/physics/Chain.js",
    "import": "/editor/js/spawnables/physics/Chain.js",
    "sourceHash": "3ec6d2b59ab238906d4c4f6b5956e2e16c8d0b706a990c035e6e177280e8af22",
    "summary": "",
    "exports": [
      {
        "name": "Chain",
        "kind": "class",
        "signature": "class Chain extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Cloth",
    "path": "editor/reference/spawnables/physics/Cloth.md",
    "source": "editor/js/spawnables/physics/Cloth.js",
    "import": "/editor/js/spawnables/physics/Cloth.js",
    "sourceHash": "daa01e7b3324d11b95a12cdfb7243713132161f628099254ded2c001497c1c54",
    "summary": "",
    "exports": [
      {
        "name": "Cloth",
        "kind": "class",
        "signature": "class Cloth extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Fluid",
    "path": "editor/reference/spawnables/physics/Fluid.md",
    "source": "editor/js/spawnables/physics/Fluid.js",
    "import": "/editor/js/spawnables/physics/Fluid.js",
    "sourceHash": "723aa8d478a1254a151d7d966faf1d36ce04e038ff85018f614af2e4987e32e1",
    "summary": "",
    "exports": [
      {
        "name": "Fluid",
        "kind": "class",
        "signature": "class Fluid extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Hair",
    "path": "editor/reference/spawnables/physics/Hair.md",
    "source": "editor/js/spawnables/physics/Hair.js",
    "import": "/editor/js/spawnables/physics/Hair.js",
    "sourceHash": "fa67f44ccd2519563f8a6777f829976372491396cf6cf0dfc102d1f2f973beec",
    "summary": "",
    "exports": [
      {
        "name": "Hair",
        "kind": "class",
        "signature": "class Hair extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Ragdoll",
    "path": "editor/reference/spawnables/physics/Ragdoll.md",
    "source": "editor/js/spawnables/physics/Ragdoll.js",
    "import": "/editor/js/spawnables/physics/Ragdoll.js",
    "sourceHash": "51fbbc0849780fc09037b47a777daa32638ae8482b588e6653f75a9031e96bee",
    "summary": "",
    "exports": [
      {
        "name": "Ragdoll",
        "kind": "class",
        "signature": "class Ragdoll extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Rope",
    "path": "editor/reference/spawnables/physics/Rope.md",
    "source": "editor/js/spawnables/physics/Rope.js",
    "import": "/editor/js/spawnables/physics/Rope.js",
    "sourceHash": "77ba73989bb0eb85d247005402fc0d1d46ace877555eadc27ef7f882d5724569",
    "summary": "",
    "exports": [
      {
        "name": "Rope",
        "kind": "class",
        "signature": "class Rope extends SpawnableItem",
        "summary": ""
      },
      {
        "name": "FIBER_MATERIALS",
        "kind": "re-export",
        "signature": "FIBER_MATERIALS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/RopeSchema",
    "path": "editor/reference/spawnables/physics/RopeSchema.md",
    "source": "editor/js/spawnables/physics/RopeSchema.js",
    "import": "/editor/js/spawnables/physics/RopeSchema.js",
    "sourceHash": "6467fdf238bb85fe79cb3513ddce92f719731e6ce66e34afee5b293e757c2f36",
    "summary": "============================================================================= ROPE SCHEMA - Shared schema for RopeTool and PhysicsRopeComponentEditor =============================================================================",
    "exports": [
      {
        "name": "getFiberMaterial",
        "kind": "function",
        "signature": "getFiberMaterial(name)",
        "summary": "Get fiber material properties by name"
      },
      {
        "name": "applyFiberMaterial",
        "kind": "function",
        "signature": "applyFiberMaterial(data, materialName)",
        "summary": "Apply fiber material preset to rope data"
      },
      {
        "name": "FIBER_MATERIALS",
        "kind": "constant",
        "signature": "FIBER_MATERIALS",
        "summary": "Fiber material properties - affects both physics and rendering"
      },
      {
        "name": "ROPE_DEFAULTS",
        "kind": "constant",
        "signature": "ROPE_DEFAULTS",
        "summary": "Default values for rope properties"
      },
      {
        "name": "MATERIAL_PRESETS",
        "kind": "constant",
        "signature": "MATERIAL_PRESETS",
        "summary": "Material presets for quick setup"
      },
      {
        "name": "FIBER_MATERIAL_OPTIONS",
        "kind": "constant",
        "signature": "FIBER_MATERIAL_OPTIONS",
        "summary": "Fiber material options for dropdown"
      },
      {
        "name": "ROPE_INSPECTOR_SCHEMA",
        "kind": "constant",
        "signature": "ROPE_INSPECTOR_SCHEMA",
        "summary": "Unified inspector schema for rope properties Used by both RopeTool and PhysicsRopeComponentEditor Organized into logical groups with the most commonly used options first"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/SoftBody",
    "path": "editor/reference/spawnables/physics/SoftBody.md",
    "source": "editor/js/spawnables/physics/SoftBody.js",
    "import": "/editor/js/spawnables/physics/SoftBody.js",
    "sourceHash": "b23d60ae989bb6d57de17539a065a789b0ed29b0657193cec4fd4aef30d961c3",
    "summary": "",
    "exports": [
      {
        "name": "SoftBody",
        "kind": "class",
        "signature": "class SoftBody extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/physics/Wire",
    "path": "editor/reference/spawnables/physics/Wire.md",
    "source": "editor/js/spawnables/physics/Wire.js",
    "import": "/editor/js/spawnables/physics/Wire.js",
    "sourceHash": "9d95a3abc8add1dc4152c298a1dd1d4d1e0f1a1edff3052688acb5813c682084",
    "summary": "",
    "exports": [
      {
        "name": "Wire",
        "kind": "class",
        "signature": "class Wire extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Capsule",
    "path": "editor/reference/spawnables/primitives/Capsule.md",
    "source": "editor/js/spawnables/primitives/Capsule.js",
    "import": "/editor/js/spawnables/primitives/Capsule.js",
    "sourceHash": "24cd6928e080999525051c4ba39cdfd23fa0e0fd98ff3b7f9e711b0db18a211d",
    "summary": "",
    "exports": [
      {
        "name": "Capsule",
        "kind": "class",
        "signature": "class Capsule extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Cone",
    "path": "editor/reference/spawnables/primitives/Cone.md",
    "source": "editor/js/spawnables/primitives/Cone.js",
    "import": "/editor/js/spawnables/primitives/Cone.js",
    "sourceHash": "8761e98ef72045d9bef0892e3e97cc7d2a04fc8eccd6b7ae40650e36ee22ab0a",
    "summary": "",
    "exports": [
      {
        "name": "Cone",
        "kind": "class",
        "signature": "class Cone extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Cube",
    "path": "editor/reference/spawnables/primitives/Cube.md",
    "source": "editor/js/spawnables/primitives/Cube.js",
    "import": "/editor/js/spawnables/primitives/Cube.js",
    "sourceHash": "b7f0d0a0262792eee13c0b9d5c6c6c6883e8ab899c2d98055f40257da644fdc8",
    "summary": "",
    "exports": [
      {
        "name": "Cube",
        "kind": "class",
        "signature": "class Cube extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Cylinder",
    "path": "editor/reference/spawnables/primitives/Cylinder.md",
    "source": "editor/js/spawnables/primitives/Cylinder.js",
    "import": "/editor/js/spawnables/primitives/Cylinder.js",
    "sourceHash": "37023f7fd64ad3d14fccbeed0dab29f64e96e2fa287c4466c8416aff28075dc3",
    "summary": "",
    "exports": [
      {
        "name": "Cylinder",
        "kind": "class",
        "signature": "class Cylinder extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Plane",
    "path": "editor/reference/spawnables/primitives/Plane.md",
    "source": "editor/js/spawnables/primitives/Plane.js",
    "import": "/editor/js/spawnables/primitives/Plane.js",
    "sourceHash": "2da477b1d1ef7579bead9778849ee2584dcafa3641beabd2db9ae75fab16ba83",
    "summary": "",
    "exports": [
      {
        "name": "Plane",
        "kind": "class",
        "signature": "class Plane extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Sphere",
    "path": "editor/reference/spawnables/primitives/Sphere.md",
    "source": "editor/js/spawnables/primitives/Sphere.js",
    "import": "/editor/js/spawnables/primitives/Sphere.js",
    "sourceHash": "f0e528d593584f73e347c1e3947705cea5343e41855b0803536388a05bbd0553",
    "summary": "",
    "exports": [
      {
        "name": "Sphere",
        "kind": "class",
        "signature": "class Sphere extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/primitives/Torus",
    "path": "editor/reference/spawnables/primitives/Torus.md",
    "source": "editor/js/spawnables/primitives/Torus.js",
    "import": "/editor/js/spawnables/primitives/Torus.js",
    "sourceHash": "825162aac20dd5baec3991e82f67dd516570ed6c249225ae7d8852a4c77b45ec",
    "summary": "",
    "exports": [
      {
        "name": "Torus",
        "kind": "class",
        "signature": "class Torus extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/tools/ConstraintTool",
    "path": "editor/reference/spawnables/tools/ConstraintTool.md",
    "source": "editor/js/spawnables/tools/ConstraintTool.js",
    "import": "/editor/js/spawnables/tools/ConstraintTool.js",
    "sourceHash": "6e590ec574f3a1d6a2bcc482f4345b18340aa625570b2a9cc82d3e525e496d62",
    "summary": "",
    "exports": [
      {
        "name": "ConstraintTool",
        "kind": "class",
        "signature": "class ConstraintTool extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/tools/RemoverTool",
    "path": "editor/reference/spawnables/tools/RemoverTool.md",
    "source": "editor/js/spawnables/tools/RemoverTool.js",
    "import": "/editor/js/spawnables/tools/RemoverTool.js",
    "sourceHash": "77f116c0956e25ba142b02d0fd8b8674ef15d09538efa9c07df04402fa1d084c",
    "summary": "",
    "exports": [
      {
        "name": "RemoverTool",
        "kind": "class",
        "signature": "class RemoverTool extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/tools/RopeTool",
    "path": "editor/reference/spawnables/tools/RopeTool.md",
    "source": "editor/js/spawnables/tools/RopeTool.js",
    "import": "/editor/js/spawnables/tools/RopeTool.js",
    "sourceHash": "b295a96d0acc33f420f798e0427db3904e167a5f56ad3be852bf7aff99df7828",
    "summary": "",
    "exports": [
      {
        "name": "RopeTool",
        "kind": "class",
        "signature": "class RopeTool extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/tools/SpringTool",
    "path": "editor/reference/spawnables/tools/SpringTool.md",
    "source": "editor/js/spawnables/tools/SpringTool.js",
    "import": "/editor/js/spawnables/tools/SpringTool.js",
    "sourceHash": "969e5dd429a1fe9fc46c0a17dd995e446fbaf960e43911a99de030c3eb4d630f",
    "summary": "",
    "exports": [
      {
        "name": "SpringTool",
        "kind": "class",
        "signature": "class SpringTool extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "spawnables/tools/WeldTool",
    "path": "editor/reference/spawnables/tools/WeldTool.md",
    "source": "editor/js/spawnables/tools/WeldTool.js",
    "import": "/editor/js/spawnables/tools/WeldTool.js",
    "sourceHash": "ef05323b964962e45aaf5d2c6daca79b5ed32ebe478ffb84ad6af472116b6501",
    "summary": "",
    "exports": [
      {
        "name": "WeldTool",
        "kind": "class",
        "signature": "class WeldTool extends SpawnableItem",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/EditorPreferenceContracts",
    "path": "editor/reference/storage/EditorPreferenceContracts.md",
    "source": "editor/js/storage/EditorPreferenceContracts.js",
    "import": "/editor/js/storage/EditorPreferenceContracts.js",
    "sourceHash": "baa643eca439808d555ccc80d22f3198869ba478397fc0d355d6de8962a2a8d3",
    "summary": "Canonical localStorage contracts for structured editor preferences. The original keys remain v1 rollback mirrors. Current clients publish the legacy payload first and the v2 envelope last. The envelope remembers the exact legacy JSON it accompanied, allowing a later write from an older tab to be detected and read instead of being shadowed by stale v2 data.",
    "exports": [
      {
        "name": "EditorPreferenceContractError",
        "kind": "class",
        "signature": "class EditorPreferenceContractError extends Error",
        "summary": ""
      },
      {
        "name": "readEditorSettings",
        "kind": "function",
        "signature": "readEditorSettings(storage)",
        "summary": ""
      },
      {
        "name": "writeEditorSettings",
        "kind": "function",
        "signature": "writeEditorSettings(value, storage)",
        "summary": ""
      },
      {
        "name": "clearEditorSettings",
        "kind": "function",
        "signature": "clearEditorSettings(storage)",
        "summary": ""
      },
      {
        "name": "readEditorHotkeys",
        "kind": "function",
        "signature": "readEditorHotkeys(storage)",
        "summary": ""
      },
      {
        "name": "writeEditorHotkeys",
        "kind": "function",
        "signature": "writeEditorHotkeys(value, storage)",
        "summary": ""
      },
      {
        "name": "clearEditorHotkeys",
        "kind": "function",
        "signature": "clearEditorHotkeys(storage)",
        "summary": ""
      },
      {
        "name": "readRecentProjects",
        "kind": "function",
        "signature": "readRecentProjects(storage)",
        "summary": ""
      },
      {
        "name": "writeRecentProjects",
        "kind": "function",
        "signature": "writeRecentProjects(value, storage)",
        "summary": ""
      },
      {
        "name": "clearRecentProjectsRecord",
        "kind": "function",
        "signature": "clearRecentProjectsRecord(storage)",
        "summary": ""
      },
      {
        "name": "readWorldEnvironment",
        "kind": "function",
        "signature": "readWorldEnvironment(storage)",
        "summary": ""
      },
      {
        "name": "writeWorldEnvironment",
        "kind": "function",
        "signature": "writeWorldEnvironment(value, storage)",
        "summary": ""
      },
      {
        "name": "readWorldPostprocess",
        "kind": "function",
        "signature": "readWorldPostprocess(storage)",
        "summary": ""
      },
      {
        "name": "writeWorldPostprocess",
        "kind": "function",
        "signature": "writeWorldPostprocess(value, storage)",
        "summary": ""
      },
      {
        "name": "readWorldPanelCollapse",
        "kind": "function",
        "signature": "readWorldPanelCollapse(storage)",
        "summary": ""
      },
      {
        "name": "writeWorldPanelCollapse",
        "kind": "function",
        "signature": "writeWorldPanelCollapse(value, storage)",
        "summary": ""
      },
      {
        "name": "readCollabRoom",
        "kind": "function",
        "signature": "readCollabRoom(storage)",
        "summary": ""
      },
      {
        "name": "writeCollabRoom",
        "kind": "function",
        "signature": "writeCollabRoom(value, storage)",
        "summary": ""
      },
      {
        "name": "clearCollabRoom",
        "kind": "function",
        "signature": "clearCollabRoom(storage)",
        "summary": ""
      },
      {
        "name": "readAudioMotion",
        "kind": "function",
        "signature": "readAudioMotion(storage)",
        "summary": ""
      },
      {
        "name": "writeAudioMotion",
        "kind": "function",
        "signature": "writeAudioMotion(value, storage)",
        "summary": ""
      },
      {
        "name": "readAudioFavorites",
        "kind": "function",
        "signature": "readAudioFavorites(storage)",
        "summary": ""
      },
      {
        "name": "writeAudioFavorites",
        "kind": "function",
        "signature": "writeAudioFavorites(value, storage)",
        "summary": ""
      },
      {
        "name": "readAudioRecents",
        "kind": "function",
        "signature": "readAudioRecents(storage)",
        "summary": ""
      },
      {
        "name": "writeAudioRecents",
        "kind": "function",
        "signature": "writeAudioRecents(value, storage)",
        "summary": ""
      },
      {
        "name": "EDITOR_PREFERENCE_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "EDITOR_PREFERENCE_SCHEMA_VERSION",
        "summary": "Canonical localStorage contracts for structured editor preferences. The original keys remain v1 rollback mirrors. Current clients publish the legacy payload first and the v2 envelope last. The envelope remembers the exact legacy JSON it accompanied, allowing a later write from an older tab to be detected and read instead of being shadowed by stale v2 data."
      },
      {
        "name": "EDITOR_PREFERENCE_MAX_RECORD_BYTES",
        "kind": "constant",
        "signature": "EDITOR_PREFERENCE_MAX_RECORD_BYTES",
        "summary": ""
      },
      {
        "name": "EDITOR_PREFERENCE_CONTRACTS",
        "kind": "constant",
        "signature": "EDITOR_PREFERENCE_CONTRACTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/GameEditorDatabase",
    "path": "editor/reference/storage/GameEditorDatabase.md",
    "source": "editor/js/storage/GameEditorDatabase.js",
    "import": "/editor/js/storage/GameEditorDatabase.js",
    "sourceHash": "919572adb5c8e5e38c64501e08be49397d748da4149becacf2fb092861c34635",
    "summary": "The single schema owner for editor IndexedDB persistence. Version 1 was opened independently by main.js and ProjectStorage.js, which meant only the first caller's object store was created. Version 2 expands the database to contain both stores without removing any version-1 data.",
    "exports": [
      {
        "name": "closeGameEditorDatabase",
        "kind": "function",
        "signature": "closeGameEditorDatabase()",
        "summary": ""
      },
      {
        "name": "openGameEditorDatabase",
        "kind": "function",
        "signature": "openGameEditorDatabase()",
        "summary": ""
      },
      {
        "name": "GAME_EDITOR_DB_NAME",
        "kind": "constant",
        "signature": "GAME_EDITOR_DB_NAME",
        "summary": "The single schema owner for editor IndexedDB persistence. Version 1 was opened independently by main.js and ProjectStorage.js, which meant only the first caller's object store was created. Version 2 expands the database to contain both stores without removing any version-1 data."
      },
      {
        "name": "GAME_EDITOR_DB_VERSION",
        "kind": "constant",
        "signature": "GAME_EDITOR_DB_VERSION",
        "summary": ""
      },
      {
        "name": "PROJECT_HANDLES_STORE",
        "kind": "constant",
        "signature": "PROJECT_HANDLES_STORE",
        "summary": ""
      },
      {
        "name": "PROJECTS_STORE",
        "kind": "constant",
        "signature": "PROJECTS_STORE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/cyberpunk",
    "path": "editor/reference/themes/cyberpunk.md",
    "source": "editor/js/themes/cyberpunk.js",
    "import": "/editor/js/themes/cyberpunk.js",
    "sourceHash": "01d96011663fc488e8c1a728199f0ecb8cf6ccf7442d99c0f1d165d920ecffbf",
    "summary": "Cyberpunk Theme - Neon pink and cyan",
    "exports": [
      {
        "name": "themeCyberpunk",
        "kind": "constant",
        "signature": "themeCyberpunk",
        "summary": "Cyberpunk Theme - Neon pink and cyan"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/dark",
    "path": "editor/reference/themes/dark.md",
    "source": "editor/js/themes/dark.js",
    "import": "/editor/js/themes/dark.js",
    "sourceHash": "2562929b9f74e2ae1e4b77c7adfe52037abf012350917bff42566f5ab5834771",
    "summary": "Dark Theme - Default editor theme",
    "exports": [
      {
        "name": "themeDark",
        "kind": "constant",
        "signature": "themeDark",
        "summary": "Dark Theme - Default editor theme"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/index",
    "path": "editor/reference/themes/index.md",
    "source": "editor/js/themes/index.js",
    "import": "/editor/js/themes/index.js",
    "sourceHash": "f30d19f264bf5adee0759fb64421bbb783cd1d3d5a3c3747ab33fbddf6b35a25",
    "summary": "Theme System Index Central theme management with modular theme files",
    "exports": [
      {
        "name": "themes",
        "kind": "constant",
        "signature": "themes",
        "summary": ""
      },
      {
        "name": "themeManager",
        "kind": "constant",
        "signature": "themeManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/light",
    "path": "editor/reference/themes/light.md",
    "source": "editor/js/themes/light.js",
    "import": "/editor/js/themes/light.js",
    "sourceHash": "a9756ae07055ca2eed8cca4076e16f3f30ea481ba408abbea5825575fce94587",
    "summary": "Light Theme - Clean bright interface",
    "exports": [
      {
        "name": "themeLight",
        "kind": "constant",
        "signature": "themeLight",
        "summary": "Light Theme - Clean bright interface"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/matrix",
    "path": "editor/reference/themes/matrix.md",
    "source": "editor/js/themes/matrix.js",
    "import": "/editor/js/themes/matrix.js",
    "sourceHash": "0d8ab2841c7b55b443961e4f96c24c2cc35452493de7dcfedf1122ae9ac715fc",
    "summary": "Matrix Theme - Hacker green aesthetic",
    "exports": [
      {
        "name": "themeMatrix",
        "kind": "constant",
        "signature": "themeMatrix",
        "summary": "Matrix Theme - Hacker green aesthetic"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/midnight",
    "path": "editor/reference/themes/midnight.md",
    "source": "editor/js/themes/midnight.js",
    "import": "/editor/js/themes/midnight.js",
    "sourceHash": "1f30dcc3fd0977c841142cc18484a199f527be2adeb0d1f19c96f47b9f8318e4",
    "summary": "Midnight Blue Theme - Deep blue professional theme",
    "exports": [
      {
        "name": "themeMidnight",
        "kind": "constant",
        "signature": "themeMidnight",
        "summary": "Midnight Blue Theme - Deep blue professional theme"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/monokai",
    "path": "editor/reference/themes/monokai.md",
    "source": "editor/js/themes/monokai.js",
    "import": "/editor/js/themes/monokai.js",
    "sourceHash": "efbfed2e342ca71ce9ea3b3d435e9b6b70644750e328ff1ac3c55910fa94a14b",
    "summary": "Monokai Theme - Classic code editor colors",
    "exports": [
      {
        "name": "themeMonokai",
        "kind": "constant",
        "signature": "themeMonokai",
        "summary": "Monokai Theme - Classic code editor colors"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/nord",
    "path": "editor/reference/themes/nord.md",
    "source": "editor/js/themes/nord.js",
    "import": "/editor/js/themes/nord.js",
    "sourceHash": "204cad676eba278d247f54f2e06125b0e257f412eb5cc171c5f78af904e3639e",
    "summary": "Nord Theme - Arctic, north-bluish color palette",
    "exports": [
      {
        "name": "themeNord",
        "kind": "constant",
        "signature": "themeNord",
        "summary": "Nord Theme - Arctic, north-bluish color palette"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/ocean",
    "path": "editor/reference/themes/ocean.md",
    "source": "editor/js/themes/ocean.js",
    "import": "/editor/js/themes/ocean.js",
    "sourceHash": "ff0fc759e25e09c31cb4c85a2b08450a5320238c21cae7e92f741ae8f9ccf65e",
    "summary": "Ocean Theme - Deep sea blues and teals",
    "exports": [
      {
        "name": "themeOcean",
        "kind": "constant",
        "signature": "themeOcean",
        "summary": "Ocean Theme - Deep sea blues and teals"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/purple",
    "path": "editor/reference/themes/purple.md",
    "source": "editor/js/themes/purple.js",
    "import": "/editor/js/themes/purple.js",
    "sourceHash": "4957ca0ac55c9cf68ea5e4ee50e867f258e5793098b070e4ff0f427499f84bd9",
    "summary": "Purple Haze Theme - Vibrant purple aesthetic",
    "exports": [
      {
        "name": "themePurple",
        "kind": "constant",
        "signature": "themePurple",
        "summary": "Purple Haze Theme - Vibrant purple aesthetic"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "themes/solarized",
    "path": "editor/reference/themes/solarized.md",
    "source": "editor/js/themes/solarized.js",
    "import": "/editor/js/themes/solarized.js",
    "sourceHash": "cff589dc6e883e521cab2c2e24b6700282068bad183d92c31dc83fe36971814e",
    "summary": "Solarized Dark Theme - Ethan Schoonover's iconic palette",
    "exports": [
      {
        "name": "themeSolarized",
        "kind": "constant",
        "signature": "themeSolarized",
        "summary": "Solarized Dark Theme - Ethan Schoonover's iconic palette"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/CompressionManager",
    "path": "editor/reference/utils/CompressionManager.md",
    "source": "editor/js/utils/CompressionManager.js",
    "import": "/editor/js/utils/CompressionManager.js",
    "sourceHash": "388712d64979a40361c510ee48e21baea129a5f366d7b121636fe2e29981697c",
    "summary": "CompressionManager - Manages background compression via WebWorker Provides async compression/decompression for timeline and undo history",
    "exports": [
      {
        "name": "initCompressionWorker",
        "kind": "function",
        "signature": "initCompressionWorker()",
        "summary": "Initialize the compression worker"
      },
      {
        "name": "compressSnapshot",
        "kind": "function",
        "signature": "async compressSnapshot(snapshot)",
        "summary": ""
      },
      {
        "name": "computeDelta",
        "kind": "function",
        "signature": "async computeDelta(prev, current)",
        "summary": ""
      },
      {
        "name": "decompressSnapshot",
        "kind": "function",
        "signature": "async decompressSnapshot(compressed)",
        "summary": ""
      },
      {
        "name": "estimateCompressedSize",
        "kind": "function",
        "signature": "estimateCompressedSize(data)",
        "summary": "Get memory estimate for compressed data"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/DialogAnimations",
    "path": "editor/reference/utils/DialogAnimations.md",
    "source": "editor/js/utils/DialogAnimations.js",
    "import": "/editor/js/utils/DialogAnimations.js",
    "sourceHash": "d0906c8a193d6e0eb300d1483f43a4e5a07662e4ade8beffcfd58687a2f68cc9",
    "summary": "DialogAnimations.js - Smooth open/close animations for all dialogs Provides consistent animation utilities for modals and dialogs",
    "exports": [
      {
        "name": "smoothCloseDialog",
        "kind": "function",
        "signature": "smoothCloseDialog(dialog, duration = 300)",
        "summary": "Smoothly close a dialog with fade-out animation"
      },
      {
        "name": "smoothCloseModal",
        "kind": "function",
        "signature": "smoothCloseModal(modal, duration = 300)",
        "summary": "Smoothly close a modal with fade-out animation"
      },
      {
        "name": "closeOnBackdropClick",
        "kind": "function",
        "signature": "closeOnBackdropClick(dialog, contentSelector = '.editor-dialog-box, .modal-content, .settings-dialog')",
        "summary": "Close dialog on backdrop click (outside content area)"
      },
      {
        "name": "closeOnEscape",
        "kind": "function",
        "signature": "closeOnEscape(dialog)",
        "summary": "Close dialog on Escape key"
      },
      {
        "name": "setupDialogCloseHandlers",
        "kind": "function",
        "signature": "setupDialogCloseHandlers(dialog, options = {})",
        "summary": "Setup all standard dialog close handlers"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/FrameSpikeDetector",
    "path": "editor/reference/utils/FrameSpikeDetector.md",
    "source": "editor/js/utils/FrameSpikeDetector.js",
    "import": "/editor/js/utils/FrameSpikeDetector.js",
    "sourceHash": "03e62fbfbc0a4e09fde3ba4758d9a25818a70797f8f3d69392bd60af209648f5",
    "summary": "FrameSpikeDetector.js - Detect and log frame time spikes Monitors frame times and logs detailed information when spikes occur, helping identify performance bottlenecks and optimization opportunities.",
    "exports": [
      {
        "name": "FrameSpikeDetector",
        "kind": "class",
        "signature": "class FrameSpikeDetector",
        "summary": "FrameSpikeDetector.js - Detect and log frame time spikes Monitors frame times and logs detailed information when spikes occur, helping identify performance bottlenecks and optimization opportunities."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/FrustumCulling",
    "path": "editor/reference/utils/FrustumCulling.md",
    "source": "editor/js/utils/FrustumCulling.js",
    "import": "/editor/js/utils/FrustumCulling.js",
    "sourceHash": "59f878cb600c910cdac917199b413b636fc8ef9b3315464cd7002ee0ef0c0899",
    "summary": "Extract and normalize frustum planes from a 4×4 view-projection matrix. Uses Gribb-Hartmann method (column-major matrix). Must be called once per frame before any culling tests.",
    "exports": [
      {
        "name": "extractFrustumPlanes",
        "kind": "function",
        "signature": "extractFrustumPlanes(vp)",
        "summary": "Extract and normalize frustum planes from a 4×4 view-projection matrix. Uses Gribb-Hartmann method (column-major matrix). Must be called once per frame before any culling tests."
      },
      {
        "name": "isSphereInFrustum",
        "kind": "function",
        "signature": "isSphereInFrustum(center, radius, planes)",
        "summary": "Test if a bounding sphere is inside or intersects the frustum."
      },
      {
        "name": "isAABBInFrustum",
        "kind": "function",
        "signature": "isAABBInFrustum(minX, minY, minZ, maxX, maxY, maxZ, planes)",
        "summary": "Test if a world-space AABB intersects the frustum. Uses the P-vertex method: for each plane pick the AABB corner most in the direction of the plane normal (the \"positive\" vertex). If that corner is behind the plane, the entire box is outside."
      },
      {
        "name": "isAABBCenterExtentsInFrustum",
        "kind": "function",
        "signature": "isAABBCenterExtentsInFrustum(cx, cy, cz, ex, ey, ez, planes)",
        "summary": "Convenience: test AABB from center + half-extents (world space). Converts to min/max and delegates."
      },
      {
        "name": "isEntityAABBVisible",
        "kind": "function",
        "signature": "isEntityAABBVisible(entityPos, entityScale, localCenter, localExtents, planes)",
        "summary": "High-level entity visibility test using AABB. Takes the mesh's local-space AABB center+extents, the entity's world position and scale, and produces the world-space AABB for frustum testing."
      },
      {
        "name": "isEntitySphereVisible",
        "kind": "function",
        "signature": "isEntitySphereVisible(position, scale, baseRadius)",
        "summary": "Legacy: entity visibility using bounding sphere (kept for broad-phase / fallback)."
      },
      {
        "name": "getCullingStats",
        "kind": "function",
        "signature": "getCullingStats()",
        "summary": ""
      },
      {
        "name": "resetStats",
        "kind": "function",
        "signature": "resetStats()",
        "summary": ""
      },
      {
        "name": "getFrustumPlanes",
        "kind": "function",
        "signature": "getFrustumPlanes()",
        "summary": "Get current frustum planes (for debugging / external use)"
      },
      {
        "name": "getFrustumCorners",
        "kind": "function",
        "signature": "getFrustumCorners(invViewProjMatrix)",
        "summary": "Calculate frustum corners in world space (for debug visualization)"
      },
      {
        "name": "frustumContainsAABB",
        "kind": "re-export",
        "signature": "frustumContainsAABB",
        "summary": ""
      },
      {
        "name": "frustumContainsSphere",
        "kind": "re-export",
        "signature": "frustumContainsSphere",
        "summary": ""
      },
      {
        "name": "frustumFromMatrix",
        "kind": "re-export",
        "signature": "frustumFromMatrix",
        "summary": ""
      },
      {
        "name": "frustumNormalizePlanes",
        "kind": "re-export",
        "signature": "frustumNormalizePlanes",
        "summary": ""
      },
      {
        "name": "frustumTestAABB",
        "kind": "re-export",
        "signature": "frustumTestAABB",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/GPUBufferPool",
    "path": "editor/reference/utils/GPUBufferPool.md",
    "source": "editor/js/utils/GPUBufferPool.js",
    "import": "/editor/js/utils/GPUBufferPool.js",
    "sourceHash": "c611b996bb56ae4f1ca94a1f74d51baf8cd5678309f0d3340072c7dbb7172ae7",
    "summary": "Get a buffer from pool or create new one",
    "exports": [
      {
        "name": "getBuffer",
        "kind": "function",
        "signature": "getBuffer(device, size, usage, label = '')",
        "summary": "Get a buffer from pool or create new one"
      },
      {
        "name": "releaseBuffer",
        "kind": "function",
        "signature": "releaseBuffer(buffer, usage)",
        "summary": "Return a buffer to the pool"
      },
      {
        "name": "getPoolStats",
        "kind": "function",
        "signature": "getPoolStats()",
        "summary": "Get pool statistics"
      },
      {
        "name": "clearPools",
        "kind": "function",
        "signature": "clearPools()",
        "summary": "Clear all pools and destroy buffers"
      },
      {
        "name": "trimPools",
        "kind": "function",
        "signature": "trimPools(keepCount = 2)",
        "summary": "Trim pools to reduce memory"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/InterpolationCurves",
    "path": "editor/reference/utils/InterpolationCurves.md",
    "source": "editor/js/utils/InterpolationCurves.js",
    "import": "/editor/js/utils/InterpolationCurves.js",
    "sourceHash": "15f592eb2709edb8548608bb2cde818fdadf4af39a722a7c9be0d46f872db374",
    "summary": "Animation track - keyframe-based animation",
    "exports": [
      {
        "name": "AnimationTrack",
        "kind": "class",
        "signature": "class AnimationTrack",
        "summary": "Animation track - keyframe-based animation"
      },
      {
        "name": "Tween",
        "kind": "class",
        "signature": "class Tween",
        "summary": "Tween - simple value animation"
      },
      {
        "name": "smoothstep",
        "kind": "function",
        "signature": "smoothstep(t)",
        "summary": "Smoothstep interpolation (Hermite)"
      },
      {
        "name": "smootherstep",
        "kind": "function",
        "signature": "smootherstep(t)",
        "summary": "Smootherstep (Ken Perlin's improved version)"
      },
      {
        "name": "springInterpolation",
        "kind": "function",
        "signature": "springInterpolation(t, stiffness = 100, damping = 10)",
        "summary": "Spring interpolation with damping"
      },
      {
        "name": "bounceInterpolation",
        "kind": "function",
        "signature": "bounceInterpolation(t)",
        "summary": "Bounce interpolation"
      },
      {
        "name": "lerp",
        "kind": "function",
        "signature": "lerp(from, to, t, easing = 'linear')",
        "summary": "Interpolate between two values with easing"
      },
      {
        "name": "lerpVec3",
        "kind": "function",
        "signature": "lerpVec3(from, to, t, easing = 'linear')",
        "summary": "Interpolate between two vec3s with easing"
      },
      {
        "name": "slerp",
        "kind": "function",
        "signature": "slerp(q1, q2, t, easing = 'linear')",
        "summary": "Spherical linear interpolation for quaternions (SLERP)"
      },
      {
        "name": "catmullRom",
        "kind": "function",
        "signature": "catmullRom(points, t, closed = false)",
        "summary": "Catmull-Rom spline interpolation (passes through all control points)"
      },
      {
        "name": "bSpline",
        "kind": "function",
        "signature": "bSpline(points, t, degree = 3)",
        "summary": "B-Spline interpolation (smooth curve, doesn't pass through control points)"
      },
      {
        "name": "hermite",
        "kind": "function",
        "signature": "hermite(p0, m0, p1, m1, t)",
        "summary": "Hermite spline interpolation"
      },
      {
        "name": "EASING_FUNCTIONS",
        "kind": "constant",
        "signature": "EASING_FUNCTIONS",
        "summary": ""
      },
      {
        "name": "CubicBezier",
        "kind": "re-export",
        "signature": "CubicBezier",
        "summary": ""
      },
      {
        "name": "easeInBack",
        "kind": "re-export",
        "signature": "easeInBack",
        "summary": ""
      },
      {
        "name": "easeInCirc",
        "kind": "re-export",
        "signature": "easeInCirc",
        "summary": ""
      },
      {
        "name": "easeInCubic",
        "kind": "re-export",
        "signature": "easeInCubic",
        "summary": ""
      },
      {
        "name": "easeInElastic",
        "kind": "re-export",
        "signature": "easeInElastic",
        "summary": ""
      },
      {
        "name": "easeInExpo",
        "kind": "re-export",
        "signature": "easeInExpo",
        "summary": ""
      },
      {
        "name": "easeInOutBack",
        "kind": "re-export",
        "signature": "easeInOutBack",
        "summary": ""
      },
      {
        "name": "easeInOutCirc",
        "kind": "re-export",
        "signature": "easeInOutCirc",
        "summary": ""
      },
      {
        "name": "easeInOutCubic",
        "kind": "re-export",
        "signature": "easeInOutCubic",
        "summary": ""
      },
      {
        "name": "easeInOutElastic",
        "kind": "re-export",
        "signature": "easeInOutElastic",
        "summary": ""
      },
      {
        "name": "easeInOutExpo",
        "kind": "re-export",
        "signature": "easeInOutExpo",
        "summary": ""
      },
      {
        "name": "easeInOutQuad",
        "kind": "re-export",
        "signature": "easeInOutQuad",
        "summary": ""
      },
      {
        "name": "easeInOutQuart",
        "kind": "re-export",
        "signature": "easeInOutQuart",
        "summary": ""
      },
      {
        "name": "easeInOutQuint",
        "kind": "re-export",
        "signature": "easeInOutQuint",
        "summary": ""
      },
      {
        "name": "easeInOutSine",
        "kind": "re-export",
        "signature": "easeInOutSine",
        "summary": ""
      },
      {
        "name": "easeInQuad",
        "kind": "re-export",
        "signature": "easeInQuad",
        "summary": ""
      },
      {
        "name": "easeInQuart",
        "kind": "re-export",
        "signature": "easeInQuart",
        "summary": ""
      },
      {
        "name": "easeInQuint",
        "kind": "re-export",
        "signature": "easeInQuint",
        "summary": ""
      },
      {
        "name": "easeInSine",
        "kind": "re-export",
        "signature": "easeInSine",
        "summary": ""
      },
      {
        "name": "easeLinear",
        "kind": "re-export",
        "signature": "easeLinear",
        "summary": ""
      },
      {
        "name": "easeOutBack",
        "kind": "re-export",
        "signature": "easeOutBack",
        "summary": ""
      },
      {
        "name": "easeOutCirc",
        "kind": "re-export",
        "signature": "easeOutCirc",
        "summary": ""
      },
      {
        "name": "easeOutCubic",
        "kind": "re-export",
        "signature": "easeOutCubic",
        "summary": ""
      },
      {
        "name": "easeOutElastic",
        "kind": "re-export",
        "signature": "easeOutElastic",
        "summary": ""
      },
      {
        "name": "easeOutExpo",
        "kind": "re-export",
        "signature": "easeOutExpo",
        "summary": ""
      },
      {
        "name": "easeOutQuad",
        "kind": "re-export",
        "signature": "easeOutQuad",
        "summary": ""
      },
      {
        "name": "easeOutQuart",
        "kind": "re-export",
        "signature": "easeOutQuart",
        "summary": ""
      },
      {
        "name": "easeOutQuint",
        "kind": "re-export",
        "signature": "easeOutQuint",
        "summary": ""
      },
      {
        "name": "easeOutSine",
        "kind": "re-export",
        "signature": "easeOutSine",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/MemoryIntegration",
    "path": "editor/reference/utils/MemoryIntegration.md",
    "source": "editor/js/utils/MemoryIntegration.js",
    "import": "/editor/js/utils/MemoryIntegration.js",
    "sourceHash": "cd2fe6cdd7b0ed3a6891d326f9d5135313dc8899ec9a35c01def8ffd8f607e7d",
    "summary": "MemoryIntegration.js - Wires up off-heap memory to editor/engine systems Integrates OffHeapMemoryManager with: - Particle snapshot system (large frame buffers → WASM/Worker) - Editor history (old undo entries → IDB) - Asset cache (loaded assets → Worker memory) - Profiler timeline (frame history → off-heap)",
    "exports": [
      {
        "name": "initMemoryIntegration",
        "kind": "function",
        "signature": "async initMemoryIntegration(gpuDevice = null)",
        "summary": "Initialize memory integration"
      },
      {
        "name": "getMemoryPressure",
        "kind": "function",
        "signature": "getMemoryPressure()",
        "summary": "Get current memory pressure (0-1)"
      },
      {
        "name": "shouldOffload",
        "kind": "function",
        "signature": "shouldOffload()",
        "summary": "Check if we should offload to off-heap storage"
      },
      {
        "name": "storeParticleFrame",
        "kind": "function",
        "signature": "async storeParticleFrame(frameIndex, frameData)",
        "summary": "Store particle frame in off-heap memory Large frames (>100KB) go to worker memory"
      },
      {
        "name": "retrieveParticleFrame",
        "kind": "function",
        "signature": "async retrieveParticleFrame(frameIndex)",
        "summary": "Retrieve particle frame from off-heap storage"
      },
      {
        "name": "freeParticleFrame",
        "kind": "function",
        "signature": "async freeParticleFrame(frameIndex)",
        "summary": ""
      },
      {
        "name": "archiveHistoryEntry",
        "kind": "function",
        "signature": "async archiveHistoryEntry(index, entry)",
        "summary": "Store old history entry to IDB when memory pressure is high"
      },
      {
        "name": "retrieveHistoryEntry",
        "kind": "function",
        "signature": "async retrieveHistoryEntry(index)",
        "summary": "Retrieve archived history entry from IDB"
      },
      {
        "name": "cacheAsset",
        "kind": "function",
        "signature": "async cacheAsset(uuid, data)",
        "summary": "Store large asset in worker memory"
      },
      {
        "name": "retrieveCachedAsset",
        "kind": "function",
        "signature": "async retrieveCachedAsset(uuid, asText = false)",
        "summary": "Retrieve cached asset from worker memory"
      },
      {
        "name": "storeProfilerFrames",
        "kind": "function",
        "signature": "storeProfilerFrames(frames)",
        "summary": "Store profiler frame batch in WASM memory"
      },
      {
        "name": "getMemoryStats",
        "kind": "function",
        "signature": "async getMemoryStats()",
        "summary": "Get comprehensive memory stats"
      },
      {
        "name": "formatMemoryForProfiler",
        "kind": "function",
        "signature": "formatMemoryForProfiler(stats)",
        "summary": "Format memory stats for profiler display"
      },
      {
        "name": "getManager",
        "kind": "function",
        "signature": "getManager()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/ObjectPool",
    "path": "editor/reference/utils/ObjectPool.md",
    "source": "editor/js/utils/ObjectPool.js",
    "import": "/editor/js/utils/ObjectPool.js",
    "sourceHash": "4b5a94b58d6822b5d0b9a6b7cf858c5cf84ca8f1af947f93706d5d1b750ef984",
    "summary": "Get a Float32Array of specified size from pool",
    "exports": [
      {
        "name": "getFloat32Array",
        "kind": "function",
        "signature": "getFloat32Array(size)",
        "summary": "Get a Float32Array of specified size from pool"
      },
      {
        "name": "releaseFloat32Array",
        "kind": "function",
        "signature": "releaseFloat32Array(arr)",
        "summary": "Return a Float32Array to the pool"
      },
      {
        "name": "getArray",
        "kind": "function",
        "signature": "getArray()",
        "summary": "Get a generic array from pool"
      },
      {
        "name": "releaseArray",
        "kind": "function",
        "signature": "releaseArray(arr)",
        "summary": "Return a generic array to the pool"
      },
      {
        "name": "getVec3",
        "kind": "function",
        "signature": "getVec3(x = 0, y = 0, z = 0)",
        "summary": "Get a vec3 [x, y, z] from pool"
      },
      {
        "name": "releaseVec3",
        "kind": "function",
        "signature": "releaseVec3(v)",
        "summary": "Return a vec3 to pool"
      },
      {
        "name": "getVec4",
        "kind": "function",
        "signature": "getVec4(x = 0, y = 0, z = 0, w = 1)",
        "summary": "Get a vec4 [x, y, z, w] from pool"
      },
      {
        "name": "releaseVec4",
        "kind": "function",
        "signature": "releaseVec4(v)",
        "summary": "Return a vec4 to pool"
      },
      {
        "name": "getMat4",
        "kind": "function",
        "signature": "getMat4()",
        "summary": "Get a mat4 (16 floats) from pool"
      },
      {
        "name": "releaseMat4",
        "kind": "function",
        "signature": "releaseMat4(m)",
        "summary": "Return a mat4 to pool"
      },
      {
        "name": "getPoolStats",
        "kind": "function",
        "signature": "getPoolStats()",
        "summary": "Get pool statistics"
      },
      {
        "name": "clearPools",
        "kind": "function",
        "signature": "clearPools()",
        "summary": "Clear all pools (for memory pressure situations)"
      },
      {
        "name": "trimPools",
        "kind": "function",
        "signature": "trimPools(keepRatio = 0.5)",
        "summary": "Trim pools to reduce memory (keep some for reuse)"
      },
      {
        "name": "transformPool",
        "kind": "constant",
        "signature": "transformPool",
        "summary": ""
      },
      {
        "name": "snapshotEntityPool",
        "kind": "constant",
        "signature": "snapshotEntityPool",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/OffHeapMemory",
    "path": "editor/reference/utils/OffHeapMemory.md",
    "source": "editor/js/utils/OffHeapMemory.js",
    "import": "/editor/js/utils/OffHeapMemory.js",
    "sourceHash": "9c486be0279902350b24eacd1e64d7a1e3e0eef52dd1bcf87ad31e27185149a8",
    "summary": "OffHeapMemory.js - MAXIMUM Memory Expansion System Pushes browser memory limits to the absolute maximum using every available strategy: 1. Multi-WASM Pool - Multiple 4GB WASM modules (up to 16GB+ total) 2. Worker Memory Pool - Each worker has its own ~4GB heap 3. SharedArrayBuffer - Zero-copy cross-worker/thread communication 4. GPU Buffer Storage - VRAM is separate from system RAM limits 5. IndexedDB Sharding - Multiple databases for unlimited persistent storage 6. ArrayBuffer Pooling - Aggressive reuse to minimize GC pressure 7. Memory Pressure Management - Auto-offloading and tiered storage THEORETICAL MAXIMUM: - 4 WASM modules × 4GB = 16GB - 8 Workers × 4GB heap = 32GB (but shared address space limits this) - GPU buffers = Limited by VRAM (8-24GB on modern GPUs) - IndexedDB = Unlimited (disk-backed) PRACTICAL MAXIMUM: ~8-16GB usable off-heap memory",
    "exports": [
      {
        "name": "MultiWasmMemoryPool",
        "kind": "class",
        "signature": "class MultiWasmMemoryPool",
        "summary": "Multi-WASM Memory Pool Creates multiple WASM memory instances, each up to 4GB Total capacity: up to 16GB off-heap"
      },
      {
        "name": "ArrayBufferPool",
        "kind": "class",
        "signature": "class ArrayBufferPool",
        "summary": "ArrayBuffer pool for reducing GC pressure Reuses buffers instead of creating new ones"
      },
      {
        "name": "GPUBufferStorage",
        "kind": "class",
        "signature": "class GPUBufferStorage",
        "summary": "GPU buffer storage for large data Keeps data in VRAM instead of JS heap"
      },
      {
        "name": "IndexedDBStorage",
        "kind": "class",
        "signature": "class IndexedDBStorage",
        "summary": "IndexedDB storage for large persistent data"
      },
      {
        "name": "WorkerMemoryPool",
        "kind": "class",
        "signature": "class WorkerMemoryPool",
        "summary": "Worker-based memory expansion Each Web Worker has its own JS heap (~4GB potential) Spawn multiple workers to multiply available memory"
      },
      {
        "name": "SharedRingBuffer",
        "kind": "class",
        "signature": "class SharedRingBuffer",
        "summary": "SharedArrayBuffer Ring Buffer Zero-copy data sharing between main thread and workers Requires Cross-Origin-Isolation headers"
      },
      {
        "name": "MaxGPUBufferStorage",
        "kind": "class",
        "signature": "class MaxGPUBufferStorage extends GPUBufferStorage",
        "summary": "Maximum GPU Buffer Storage Aggressively uses VRAM for data storage"
      },
      {
        "name": "OffHeapMemoryManager",
        "kind": "class",
        "signature": "class OffHeapMemoryManager",
        "summary": "MAXIMUM Memory Expansion Manager Combines ALL strategies for absolute maximum memory capacity"
      },
      {
        "name": "invalidateLegacyOffHeapCaches",
        "kind": "function",
        "signature": "async invalidateLegacyOffHeapCaches(indexedDBApi = globalThis.indexedDB)",
        "summary": ""
      },
      {
        "name": "getOffHeapManager",
        "kind": "function",
        "signature": "getOffHeapManager()",
        "summary": ""
      },
      {
        "name": "initOffHeapManager",
        "kind": "function",
        "signature": "async initOffHeapManager(device = null, options = {})",
        "summary": ""
      },
      {
        "name": "OFFHEAP_CACHE_NAMESPACE",
        "kind": "constant",
        "signature": "OFFHEAP_CACHE_NAMESPACE",
        "summary": ""
      },
      {
        "name": "OFFHEAP_CACHE_VERSION",
        "kind": "constant",
        "signature": "OFFHEAP_CACHE_VERSION",
        "summary": ""
      },
      {
        "name": "OFFHEAP_CACHE_DB_NAME",
        "kind": "constant",
        "signature": "OFFHEAP_CACHE_DB_NAME",
        "summary": ""
      },
      {
        "name": "OFFHEAP_LEGACY_CACHE_DB_NAMES",
        "kind": "constant",
        "signature": "OFFHEAP_LEGACY_CACHE_DB_NAMES",
        "summary": ""
      },
      {
        "name": "WasmMemoryPool",
        "kind": "constant",
        "signature": "WasmMemoryPool",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/PhysicsBodyPool",
    "path": "editor/reference/utils/PhysicsBodyPool.md",
    "source": "editor/js/utils/PhysicsBodyPool.js",
    "import": "/editor/js/utils/PhysicsBodyPool.js",
    "sourceHash": "38f7c419908abc9483ee5b89ec23beb008e85bc4965af46389b7f2dd8a36dff5",
    "summary": "Get a body handle from pool or signal that new one is needed",
    "exports": [
      {
        "name": "getPooledBody",
        "kind": "function",
        "signature": "getPooledBody(simMode, colliderShape)",
        "summary": "Get a body handle from pool or signal that new one is needed"
      },
      {
        "name": "releaseBody",
        "kind": "function",
        "signature": "releaseBody(physicsWorld, bodyHandle, simMode, colliderShape)",
        "summary": "Return a body to the pool for reuse"
      },
      {
        "name": "resetPooledBody",
        "kind": "function",
        "signature": "resetPooledBody(physicsWorld, bodyHandle, position, rotation, scale)",
        "summary": "Reset a pooled body for reuse with new transform"
      },
      {
        "name": "getPoolStats",
        "kind": "function",
        "signature": "getPoolStats()",
        "summary": "Get pool statistics"
      },
      {
        "name": "clearPools",
        "kind": "function",
        "signature": "clearPools(physicsWorld)",
        "summary": "Clear all pools (destroys pooled bodies)"
      },
      {
        "name": "trimPools",
        "kind": "function",
        "signature": "trimPools(keepCount = 5)",
        "summary": "Trim pools to reduce memory"
      },
      {
        "name": "BODY_TYPES",
        "kind": "re-export",
        "signature": "BODY_TYPES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/RenderBundleCache",
    "path": "editor/reference/utils/RenderBundleCache.md",
    "source": "editor/js/utils/RenderBundleCache.js",
    "import": "/editor/js/utils/RenderBundleCache.js",
    "sourceHash": "435b4b2309494af850cd462728e09854185e25137376dd16cef7f0e9e4996df9",
    "summary": "Create or get cached render bundle",
    "exports": [
      {
        "name": "getOrCreateBundle",
        "kind": "function",
        "signature": "getOrCreateBundle(device, key, version, descriptor, recordFn)",
        "summary": "Create or get cached render bundle"
      },
      {
        "name": "invalidateBundle",
        "kind": "function",
        "signature": "invalidateBundle(key)",
        "summary": "Invalidate a specific bundle (force re-record next frame)"
      },
      {
        "name": "invalidateBundlesWithPrefix",
        "kind": "function",
        "signature": "invalidateBundlesWithPrefix(prefix)",
        "summary": "Invalidate all bundles matching a prefix"
      },
      {
        "name": "clearBundleCache",
        "kind": "function",
        "signature": "clearBundleCache()",
        "summary": "Clear all cached bundles"
      },
      {
        "name": "pruneOldBundles",
        "kind": "function",
        "signature": "pruneOldBundles(maxAgeMs = 60000)",
        "summary": "Remove bundles not used recently"
      },
      {
        "name": "getCacheStats",
        "kind": "function",
        "signature": "getCacheStats()",
        "summary": "Get cache statistics"
      },
      {
        "name": "createStandardDescriptor",
        "kind": "function",
        "signature": "createStandardDescriptor(colorFormat = 'bgra8unorm', depthFormat = 'depth24plus')",
        "summary": "Helper to create standard descriptor for color + depth rendering"
      },
      {
        "name": "executeBundles",
        "kind": "function",
        "signature": "executeBundles(passEncoder, bundles)",
        "summary": "Execute render bundles in a render pass"
      },
      {
        "name": "EngineRenderBundleCache",
        "kind": "re-export",
        "signature": "EngineRenderBundleCache",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/SIMDMath",
    "path": "editor/reference/utils/SIMDMath.md",
    "source": "editor/js/utils/SIMDMath.js",
    "import": "/editor/js/utils/SIMDMath.js",
    "sourceHash": "7c63032b5269c92c8a44ab789195c733b46b1aa6246998c4c86172b755552a2e",
    "summary": "Create a batch of vec3s in SoA format",
    "exports": [
      {
        "name": "createVec3Batch",
        "kind": "function",
        "signature": "createVec3Batch(count)",
        "summary": "Create a batch of vec3s in SoA format"
      },
      {
        "name": "vec3ArrayToBatch",
        "kind": "function",
        "signature": "vec3ArrayToBatch(vectors)",
        "summary": "Create batch from array of [x,y,z] vectors"
      },
      {
        "name": "batchToVec3Array",
        "kind": "function",
        "signature": "batchToVec3Array(batch)",
        "summary": "Convert batch back to array of [x,y,z]"
      },
      {
        "name": "batchAdd",
        "kind": "function",
        "signature": "batchAdd(a, b, out = createVec3Batch(a.count)",
        "summary": "Batch add: out = a + b"
      },
      {
        "name": "batchSub",
        "kind": "function",
        "signature": "batchSub(a, b, out = createVec3Batch(a.count)",
        "summary": "Batch subtract: out = a - b"
      },
      {
        "name": "batchScale",
        "kind": "function",
        "signature": "batchScale(a, scalar, out = createVec3Batch(a.count)",
        "summary": "Batch scale: out = a * scalar"
      },
      {
        "name": "batchMul",
        "kind": "function",
        "signature": "batchMul(a, b, out = createVec3Batch(a.count)",
        "summary": "Batch multiply component-wise: out = a * b"
      },
      {
        "name": "batchDot",
        "kind": "function",
        "signature": "batchDot(a, b, out = new Float32Array(a.count)",
        "summary": "Batch dot product: out[i] = dot(a[i], b[i])"
      },
      {
        "name": "batchCross",
        "kind": "function",
        "signature": "batchCross(a, b, out = createVec3Batch(a.count)",
        "summary": "Batch cross product: out = a × b"
      },
      {
        "name": "batchLengthSq",
        "kind": "function",
        "signature": "batchLengthSq(a, out = new Float32Array(a.count)",
        "summary": "Batch length squared: out[i] = |a[i]|²"
      },
      {
        "name": "batchLength",
        "kind": "function",
        "signature": "batchLength(a, out = new Float32Array(a.count)",
        "summary": "Batch length: out[i] = |a[i]|"
      },
      {
        "name": "batchNormalize",
        "kind": "function",
        "signature": "batchNormalize(a, out = createVec3Batch(a.count)",
        "summary": "Batch normalize: out[i] = normalize(a[i])"
      },
      {
        "name": "batchLerp",
        "kind": "function",
        "signature": "batchLerp(a, b, t, out = createVec3Batch(a.count)",
        "summary": "Batch lerp: out = lerp(a, b, t)"
      },
      {
        "name": "batchTransform",
        "kind": "function",
        "signature": "batchTransform(batch, m, out = createVec3Batch(batch.count)",
        "summary": "Batch transform by 4x4 matrix"
      },
      {
        "name": "batchDistanceToPoint",
        "kind": "function",
        "signature": "batchDistanceToPoint(batch, point, out = new Float32Array(batch.count)",
        "summary": "Batch distance to point"
      },
      {
        "name": "batchDistanceSqToPoint",
        "kind": "function",
        "signature": "batchDistanceSqToPoint(batch, point, out = new Float32Array(batch.count)",
        "summary": "Batch distance squared to point (faster, for comparisons)"
      },
      {
        "name": "batchFindWithinRadius",
        "kind": "function",
        "signature": "batchFindWithinRadius(batch, point, radius)",
        "summary": "Find indices within radius of point"
      },
      {
        "name": "batchFindKNearest",
        "kind": "function",
        "signature": "batchFindKNearest(batch, point, k)",
        "summary": "Find K nearest neighbors"
      },
      {
        "name": "batchComputeAABB",
        "kind": "function",
        "signature": "batchComputeAABB(batch)",
        "summary": "Batch AABB computation"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/SpatialIndex",
    "path": "editor/reference/utils/SpatialIndex.md",
    "source": "editor/js/utils/SpatialIndex.js",
    "import": "/editor/js/utils/SpatialIndex.js",
    "sourceHash": "ce07bd44a5fc58434a7d2a31fc067d039310487ad753ce81e013ccede4c9244d",
    "summary": "Simple Octree for dynamic entity queries Better for frequently changing scenes than BVH",
    "exports": [
      {
        "name": "Octree",
        "kind": "class",
        "signature": "class Octree",
        "summary": "Simple Octree for dynamic entity queries Better for frequently changing scenes than BVH"
      },
      {
        "name": "EntitySpatialIndex",
        "kind": "class",
        "signature": "class EntitySpatialIndex",
        "summary": "EntitySpatialIndex - Manages spatial indexing for editor entities"
      },
      {
        "name": "BVHBuilder",
        "kind": "re-export",
        "signature": "BVHBuilder",
        "summary": ""
      },
      {
        "name": "BVHNode",
        "kind": "re-export",
        "signature": "BVHNode",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/TextureCompression",
    "path": "editor/reference/utils/TextureCompression.md",
    "source": "editor/js/utils/TextureCompression.js",
    "import": "/editor/js/utils/TextureCompression.js",
    "sourceHash": "41f6e7d6b4ff7ec44bb32b57773db17a5b8dcdd0c8017055fefda182d41816ab",
    "summary": "TextureCompression - WebGPU compressed texture format support. Supports: - BC formats (Desktop: DXT/S3TC) - ASTC formats (Mobile/Apple) - ETC2 formats (Android/WebGL fallback)",
    "exports": [
      {
        "name": "detectCompressedFormats",
        "kind": "function",
        "signature": "detectCompressedFormats(adapter)",
        "summary": "Detect supported compressed texture formats."
      },
      {
        "name": "getOptimalFormat",
        "kind": "function",
        "signature": "getOptimalFormat(adapter, needsAlpha = true)",
        "summary": "Get optimal texture format for device."
      },
      {
        "name": "getCompressedSize",
        "kind": "function",
        "signature": "getCompressedSize(width, height, format)",
        "summary": "Calculate compressed texture size."
      },
      {
        "name": "getMemorySavings",
        "kind": "function",
        "signature": "getMemorySavings(width, height, compressedFormat)",
        "summary": "Calculate memory savings percentage."
      },
      {
        "name": "getQualitySizeScore",
        "kind": "function",
        "signature": "getQualitySizeScore(width, height, format, options = {})",
        "summary": "Calculate a quality-size report for picker and audit UI."
      },
      {
        "name": "createCompressedTexture",
        "kind": "function",
        "signature": "createCompressedTexture(device, adapter, descriptor)",
        "summary": "Create compressed texture with fallback."
      },
      {
        "name": "getFormatInfo",
        "kind": "function",
        "signature": "getFormatInfo(format)",
        "summary": "Get format info for display."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "utils/WeakCache",
    "path": "editor/reference/utils/WeakCache.md",
    "source": "editor/js/utils/WeakCache.js",
    "import": "/editor/js/utils/WeakCache.js",
    "sourceHash": "56411761902844f58da03283d3f8b22627c15e1d731c5bedc1e79dbdc33435e8",
    "summary": "WeakValueMap - Map with weak references to values Values are auto-removed when garbage collected",
    "exports": [
      {
        "name": "WeakValueMap",
        "kind": "class",
        "signature": "class WeakValueMap",
        "summary": "WeakValueMap - Map with weak references to values Values are auto-removed when garbage collected"
      },
      {
        "name": "LRUCache",
        "kind": "class",
        "signature": "class LRUCache",
        "summary": "LRUCache - Least Recently Used cache with max size"
      },
      {
        "name": "TTLCache",
        "kind": "class",
        "signature": "class TTLCache",
        "summary": "TTLCache - Cache with time-to-live expiration"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/AuraRenderer",
    "path": "editor/reference/viewport/AuraRenderer.md",
    "source": "editor/js/viewport/AuraRenderer.js",
    "import": "/editor/js/viewport/AuraRenderer.js",
    "sourceHash": "8456893608ffdb4fc3c6ef6ab0aca21b16b199a18cc77098b5edb3495edadd60",
    "summary": "AuraRenderer — System 1: Outer Energy Shell / Aura Layer ========================================================= Renders the actual model mesh at slightly expanded scale with electric blue-cyan color — same approach as SkinRenderer but bigger and more transparent. No hull approximation needed; the real mesh IS the aura shell. LAYER ROLE: Outermost visible layer — glowing energy field that exactly traces the body shape at AURA_SCALE (8% larger than entity scale). VISUAL: - Full-res model mesh, electric blue-cyan [0.2, 0.7, 1.0, 0.15] - Scale multiplied by AURA_SCALE so it sits slightly outside the skin - High roughness for a soft diffuse glow look DATA SOURCE: EntityMeshRenderer already has 'custom_<uuid>' registered. No extra work. INDEPENDENCE: - No imports needed beyond EntityMeshRenderer (draw) - No reference to SkinRenderer, SkeletonRenderer, SDFColliderRenderer",
    "exports": [
      {
        "name": "AuraRenderer",
        "kind": "class",
        "signature": "class AuraRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/CameraController",
    "path": "editor/reference/viewport/CameraController.md",
    "source": "editor/js/viewport/CameraController.js",
    "import": "/editor/js/viewport/CameraController.js",
    "sourceHash": "0f3cf6284abebfff96e9c7edf52ce7b0fae14991b940d46703ee6ae908490459",
    "summary": "",
    "exports": [
      {
        "name": "CameraController",
        "kind": "class",
        "signature": "class CameraController",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/CollabOverlayRenderer",
    "path": "editor/reference/viewport/CollabOverlayRenderer.md",
    "source": "editor/js/viewport/CollabOverlayRenderer.js",
    "import": "/editor/js/viewport/CollabOverlayRenderer.js",
    "sourceHash": "e5081da39c3b05c3657b2423b59f5afe6fee567013f27e6b5838a1d69d054dfa",
    "summary": "CollabOverlayRenderer.js Renders peer cameras as small 3D camcorder-style pyramids in the viewport, with colored tint matching the peer's chosen color and a floating name label. Uses the existing EntityMeshRenderer to draw pyramids (no new GPU pipelines needed). Name labels are HTML overlays positioned via 3D→2D projection.",
    "exports": [
      {
        "name": "CollabOverlayRenderer",
        "kind": "class",
        "signature": "class CollabOverlayRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/GhostPreviewRenderer",
    "path": "editor/reference/viewport/GhostPreviewRenderer.md",
    "source": "editor/js/viewport/GhostPreviewRenderer.js",
    "import": "/editor/js/viewport/GhostPreviewRenderer.js",
    "sourceHash": "f5fba947677b0d389645ab7efc411b55dd416f1480714d8040c2fa90c0a5addf",
    "summary": "",
    "exports": [
      {
        "name": "GhostPreviewRenderer",
        "kind": "class",
        "signature": "class GhostPreviewRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/SDFColliderRenderer",
    "path": "editor/reference/viewport/SDFColliderRenderer.md",
    "source": "editor/js/viewport/SDFColliderRenderer.js",
    "import": "/editor/js/viewport/SDFColliderRenderer.js",
    "sourceHash": "a31e779474372f262f8866dc8fc0158cc25e822f6b13f88dd28ffe5de82ff887",
    "summary": "",
    "exports": [
      {
        "name": "SDFColliderRenderer",
        "kind": "class",
        "signature": "class SDFColliderRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/ShapeWireframes",
    "path": "editor/reference/viewport/ShapeWireframes.md",
    "source": "editor/js/viewport/ShapeWireframes.js",
    "import": "/editor/js/viewport/ShapeWireframes.js",
    "sourceHash": "420ffad89328f100b5c1b77088cee47b5b0eb0189ce6eab94064cb94e843be6a",
    "summary": "ShapeWireframes.js — Shared shape-specific wireframe generators ================================================================ Used by SkeletonRenderer, SkinRenderer, and AuraRenderer to render shape-accurate wireframe overlays that match the SDF collider shapes. Each generator returns { joints: [[x,y,z],...], edges: [[i,j],...] } in LOCAL space. The caller transforms to world space.",
    "exports": [
      {
        "name": "generateShapeWireframe",
        "kind": "function",
        "signature": "generateShapeWireframe(meshType, es, ep, er, doRot)",
        "summary": "Generate a shape-specific wireframe for an entity."
      },
      {
        "name": "quatFromDir",
        "kind": "function",
        "signature": "quatFromDir(dx, dy, dz)",
        "summary": "Compute quaternion that aligns Y-axis [0,1,0] with direction [dx,dy,dz]. Exported for use in renderers that draw capsule sticks between joints."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/SkeletonRenderer",
    "path": "editor/reference/viewport/SkeletonRenderer.md",
    "source": "editor/js/viewport/SkeletonRenderer.js",
    "import": "/editor/js/viewport/SkeletonRenderer.js",
    "sourceHash": "e7d4dbd709b5d554151d2f13c28b7264f2d82e653e3a3a024dcf50f00592acb6",
    "summary": "SkeletonRenderer — System 3: X-Ray Skeleton / Bone Layer ========================================================= Renders the internal skeleton as solid physical geometry — gold ball joints at each bone pivot, ivory metallic bone sticks connecting them. Think medical X-ray imaging or the internal rig view in a 3D animation tool. LAYER ROLE: Innermost visible layer — inside the skin capsules. Fully opaque metallic geometry. Shows the exact bone hierarchy as a physical rig. VISUAL: Ball joints: gold [1.0, 0.85, 0.3, 1.0], metallic=0.9, roughness=0.15 Bone sticks: ivory [0.95, 0.9, 0.8, 1.0], metallic=0.85, roughness=0.2 Sizes scaled by body height — proportionally correct DATA SOURCE: getAnimatedBoneShapes() → .joints[] (all joint world positions + child links) INDEPENDENCE: - Imports ONLY from SkeletalAnimation.js (data) and EntityMeshRenderer (draw) - No reference to AuraRenderer, SkinRenderer, SDFColliderRenderer - Can be deleted without affecting any other system EDIT MODE vs PLAY MODE: Edit: animated bone joints from getAnimatedBoneShapes() Play (ragdoll): bone positions from live physics bodies",
    "exports": [
      {
        "name": "SkeletonRenderer",
        "kind": "class",
        "signature": "class SkeletonRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/SkinRenderer",
    "path": "editor/reference/viewport/SkinRenderer.md",
    "source": "editor/js/viewport/SkinRenderer.js",
    "import": "/editor/js/viewport/SkinRenderer.js",
    "sourceHash": "56e1889b47b491894bbe347759f68e378db4413251762af53a0762f31cf99f95",
    "summary": "SkinRenderer — System 2: High-Detail Body Skin ================================================ Renders the ACTUAL mesh geometry of the entity, semi-transparent, with a warm skin tone. Full triangle count of the imported model — this is NOT a hull approximation. The mesh IS the skin layer. LAYER ROLE: Inner visible layer — shows the real body geometry as a translucent skin shell. Since it uses the same mesh as the actual entity render, it is perfectly shape-accurate at full detail. VISUAL: - Full-res model mesh, warm skin tone [0.9, 0.6, 0.4, 0.28] - Rendered via the existing 'custom_<uuid>' mesh key already in EntityMeshRenderer - No separate mesh registration needed — the mesh is already uploaded DATA SOURCE: EntityMeshRenderer already has the 'custom_<uuid>' mesh registered when the entity loads. No separate computation needed — just pass entity transform directly. INDEPENDENCE: - No external imports needed beyond EntityMeshRenderer (draw) - No reference to AuraRenderer, SkeletonRenderer, SDFColliderRenderer",
    "exports": [
      {
        "name": "SkinRenderer",
        "kind": "class",
        "signature": "class SkinRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/SurfaceGridRenderer",
    "path": "editor/reference/viewport/SurfaceGridRenderer.md",
    "source": "editor/js/viewport/SurfaceGridRenderer.js",
    "import": "/editor/js/viewport/SurfaceGridRenderer.js",
    "sourceHash": "5e59066084c974ded5200d0a3b1faecb515b662ec38cb375cecaa2ab5d4efb2d",
    "summary": "SurfaceGridRenderer.js GMod-style surface grid overlay for precise tool placement Shows a transparent green grid aligned to the surface normal",
    "exports": [
      {
        "name": "SurfaceGridRenderer",
        "kind": "class",
        "signature": "class SurfaceGridRenderer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/ViewportMeshUtils",
    "path": "editor/reference/viewport/ViewportMeshUtils.md",
    "source": "editor/js/viewport/ViewportMeshUtils.js",
    "import": "/editor/js/viewport/ViewportMeshUtils.js",
    "sourceHash": "d6a6704aa13454e7e3ded7da3955846153918de2125a8df9354938df0066c3ba",
    "summary": "ViewportMeshUtils - Mesh type inference and color mapping utilities Extracted from Viewport.js for modularity",
    "exports": [
      {
        "name": "getSpawnIdLower",
        "kind": "function",
        "signature": "getSpawnIdLower(entityMeta)",
        "summary": "Get lowercase spawnId for an entityMeta (no caching — small string allocs are cheaper than WeakMap GC overhead)"
      },
      {
        "name": "isEmitterEntity",
        "kind": "function",
        "signature": "isEmitterEntity(entityMeta)",
        "summary": "Check if entityMeta represents an emitter"
      },
      {
        "name": "getEntityMeshTypes",
        "kind": "function",
        "signature": "getEntityMeshTypes(entityMeta, fallbackMeshType = null)",
        "summary": ""
      },
      {
        "name": "getEntityMeshParts",
        "kind": "function",
        "signature": "getEntityMeshParts(entityMeta, fallbackMeshType = null)",
        "summary": ""
      },
      {
        "name": "getModelPartLocalMatrix",
        "kind": "function",
        "signature": "getModelPartLocalMatrix(part, animatedMatrix = null)",
        "summary": ""
      },
      {
        "name": "composeEntityPartMatrix",
        "kind": "function",
        "signature": "composeEntityPartMatrix(position, rotation, scale, part, animatedMatrix = null)",
        "summary": ""
      },
      {
        "name": "transformAabbByMatrix",
        "kind": "function",
        "signature": "transformAabbByMatrix(bounds, matrix)",
        "summary": ""
      },
      {
        "name": "getAggregateMeshBounds",
        "kind": "function",
        "signature": "getAggregateMeshBounds(entityMeta, meshRenderer, fallbackMeshType = null, resolveAnimatedMatrix = null)",
        "summary": ""
      },
      {
        "name": "inferMeshMaterial",
        "kind": "function",
        "signature": "inferMeshMaterial(meshType)",
        "summary": "Get PBR material properties for a mesh type"
      },
      {
        "name": "inferEntityMeshTypeAndColor",
        "kind": "function",
        "signature": "inferEntityMeshTypeAndColor(entityMeta)",
        "summary": "Infer mesh type and color from entity metadata Results are cached for performance"
      },
      {
        "name": "clearMeshTypeCache",
        "kind": "function",
        "signature": "clearMeshTypeCache()",
        "summary": "Clear mesh type cache (call when entities are added/removed/renamed)"
      },
      {
        "name": "snapToGrid",
        "kind": "function",
        "signature": "snapToGrid(value, gridSize, enabled)",
        "summary": "Snap a value to grid"
      },
      {
        "name": "DEFAULT_COLOR",
        "kind": "re-export",
        "signature": "DEFAULT_COLOR",
        "summary": ""
      },
      {
        "name": "MESH_TYPE_COLORS",
        "kind": "re-export",
        "signature": "MESH_TYPE_COLORS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/ViewportProfiler",
    "path": "editor/reference/viewport/ViewportProfiler.md",
    "source": "editor/js/viewport/ViewportProfiler.js",
    "import": "/editor/js/viewport/ViewportProfiler.js",
    "sourceHash": "750e6d51fe652b34b79d0df1b853823de999463ce03420cd85fc48845a886cf4",
    "summary": "ViewportProfiler - Performance profiler UI for the viewport Extracted from Viewport.js for modularity",
    "exports": [
      {
        "name": "ViewportProfiler",
        "kind": "class",
        "signature": "class ViewportProfiler",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/ViewportRaycasting",
    "path": "editor/reference/viewport/ViewportRaycasting.md",
    "source": "editor/js/viewport/ViewportRaycasting.js",
    "import": "/editor/js/viewport/ViewportRaycasting.js",
    "sourceHash": "aab744e4f628740bea2ded19bb0457fff83e07c1cc845bee2fcefd12265d4807",
    "summary": "ViewportRaycasting.js - Pure raycasting math utilities Extracted from Viewport.js for modularity",
    "exports": [
      {
        "name": "rayGroundPlaneIntersect",
        "kind": "function",
        "signature": "rayGroundPlaneIntersect(rayOrigin, rayDir, planeY = 0)",
        "summary": "Ray-ground plane intersection"
      },
      {
        "name": "raySegmentDistance",
        "kind": "function",
        "signature": "raySegmentDistance(rayOrigin, rayDir, segA, segB)",
        "summary": "Calculate distance from ray to line segment (for rope picking)"
      },
      {
        "name": "raySphereIntersect",
        "kind": "function",
        "signature": "raySphereIntersect(rayOrigin, rayDir, sphereCenter, radius)",
        "summary": "Ray-sphere intersection test"
      },
      {
        "name": "rotatePointByQuaternion",
        "kind": "function",
        "signature": "rotatePointByQuaternion(point, quat)",
        "summary": "Rotate a point by quaternion"
      },
      {
        "name": "multiplyQuaternions",
        "kind": "function",
        "signature": "multiplyQuaternions(a, b)",
        "summary": "Multiply two quaternions: result = a * b"
      },
      {
        "name": "rayOBBIntersect",
        "kind": "function",
        "signature": "rayOBBIntersect(rayOrigin, rayDir, boxCenter, boxRotation, halfExtents)",
        "summary": "Ray-OBB (Oriented Bounding Box) intersection"
      },
      {
        "name": "closestPointOnAxis",
        "kind": "function",
        "signature": "closestPointOnAxis(rayOrigin, rayDir, axisOrigin, axisDir)",
        "summary": "Closest point on axis from ray"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/stages/FixedStepStages",
    "path": "editor/reference/viewport/stages/FixedStepStages.md",
    "source": "editor/js/viewport/stages/FixedStepStages.js",
    "import": "/editor/js/viewport/stages/FixedStepStages.js",
    "sourceHash": "a47d08836d2629a90568ccbc1624487771562c3309f0396e2c5f3701070871c3",
    "summary": "FixedStepStages — Physics, elastic drag, sim audio, particle step. These run 0..N times per frame on a fixed timestep accumulator. Only active in play mode (condition-gated).",
    "exports": [
      {
        "name": "registerFixedStepStages",
        "kind": "function",
        "signature": "registerFixedStepStages(pipeline, vp)",
        "summary": "Register all fixedStep-phase stages into the pipeline."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/stages/PostRenderStages",
    "path": "editor/reference/viewport/stages/PostRenderStages.md",
    "source": "editor/js/viewport/stages/PostRenderStages.js",
    "import": "/editor/js/viewport/stages/PostRenderStages.js",
    "sourceHash": "9e94d6f9f61ca501cba58a619e65410bc717ccde6eb69c3b95a86201ffbff715",
    "summary": "PostRenderStages — Composite passes, post-FX, GPU submit, profiler, spike detection, collab presence. During the transitional period, post-render work still lives inside Viewport.renderFrame(). These stages will be populated one-by-one as code is extracted.",
    "exports": [
      {
        "name": "registerPostRenderStages",
        "kind": "function",
        "signature": "registerPostRenderStages(pipeline, vp)",
        "summary": "Register all postRender-phase stages into the pipeline."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/stages/RenderStages",
    "path": "editor/reference/viewport/stages/RenderStages.md",
    "source": "editor/js/viewport/stages/RenderStages.js",
    "import": "/editor/js/viewport/stages/RenderStages.js",
    "sourceHash": "a98b5d5df8ab2502210769ef84efd71d8cf353142b99b859fc612abd776a010a",
    "summary": "RenderStages — GPU render pass stages: debug targets, volume compute, clear pass, grid, entities, physics lines, cloth, surface grid, particles, diagnostics, SDF colliders, bone directions, gizmos. During the transitional period, the main renderFrame() body still runs inline. These stages will be populated one-by-one as code is extracted from Viewport.renderFrame(). Stage order values reserve gaps (10, 20, 30…) so new stages can be inserted between existing ones without renumbering.",
    "exports": [
      {
        "name": "registerRenderStages",
        "kind": "function",
        "signature": "registerRenderStages(pipeline, vp)",
        "summary": "Register all render-phase stages into the pipeline."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "viewport/stages/UpdateStages",
    "path": "editor/reference/viewport/stages/UpdateStages.md",
    "source": "editor/js/viewport/stages/UpdateStages.js",
    "import": "/editor/js/viewport/stages/UpdateStages.js",
    "sourceHash": "ba2e50edc6527a13cae7f49c699ac4d5568a61bfcde124de823b2ff859a94ddc",
    "summary": "UpdateStages — Per-frame update logic: timing, vGPU, camera, matrices, lights, animation, frustum, collab, stats UI, cleanup. Runs once per frame before GPU render passes.",
    "exports": [
      {
        "name": "registerUpdateStages",
        "kind": "function",
        "signature": "registerUpdateStages(pipeline, vp)",
        "summary": "Register all update-phase stages into the pipeline."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "workers/CollabSignalWorker",
    "path": "editor/reference/workers/CollabSignalWorker.md",
    "source": "editor/js/workers/CollabSignalWorker.js",
    "import": "/editor/js/workers/CollabSignalWorker.js",
    "sourceHash": "b432979ffa2747b6e60d4ae1562351b249c0241d08c1ed78edf65b672a7e71e9",
    "summary": "CollabSignalWorker.js — SharedWorker In-memory SDP relay for all editor tabs on the same machine. Runs once per origin, shared across all tabs. Message types (client → worker): HELLO    { peerId, username } OFFER    { from, to, offerId, payload } ANSWER   { from, to, offerId, payload } CANDIDATE { from, to, offerId, payload } LEAVE    { peerId } LIST     (request peer list) Message types (worker → client): HELLO_ACK   { peerId, peers: [{peerId, username}] } PEER_JOINED { peerId, username } PEER_LEFT   { peerId } OFFER       { from, to, offerId, payload } ANSWER      { from, to, offerId, payload } CANDIDATE   { from, to, offerId, payload } LIST        { peers: [{peerId, username}] }",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "workers/CompressionWorker",
    "path": "editor/reference/workers/CompressionWorker.md",
    "source": "editor/js/workers/CompressionWorker.js",
    "import": "/editor/js/workers/CompressionWorker.js",
    "sourceHash": "da8c2f3f14a29e9c2dce9912936eef946bf180e835d7cea7b5e0423a72bc8b10",
    "summary": "CompressionWorker - Offloads timeline/history compression to background thread Uses delta+entropy residual encoding for lossless reconstruction",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "workers/ProfilerCanvasWorker",
    "path": "editor/reference/workers/ProfilerCanvasWorker.md",
    "source": "editor/js/workers/ProfilerCanvasWorker.js",
    "import": "/editor/js/workers/ProfilerCanvasWorker.js",
    "sourceHash": "f8c087f2eada652469df7f1ca9ac12d12cc481164bd979ec154ad7071d29c150",
    "summary": "ProfilerCanvasWorker.js - OffscreenCanvas worker for profiler rendering Moves ALL canvas rendering off the main thread: - Timeline graph - Thread lanes - Flame graph bars Main thread only sends frame data, worker handles all drawing.",
    "exports": []
  }
]