@vgai/engine 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/schemas/engine-capabilities.json +4 -4
- package/schemas/vgai-game.schema.json +2 -2
- package/src/adapter/authoring.ts +42 -0
- package/src/adapter/index.ts +3 -0
- package/src/adapter/ingest/overlay-apply.ts +50 -6
- package/src/adapter/ingest/scene-capture.ts +51 -2
- package/src/adapter/vgai-scene-game-adapter.ts +24 -0
- package/src/manifest/schema.ts +7 -3
- package/src/runtime/create-runtime.ts +97 -0
- package/src/runtime/game.ts +11 -1
- package/src/scene/asset-ref-check.ts +1 -1
- package/src/scene/scene-loader.ts +2 -2
- package/src/scene/user-data.ts +18 -0
- package/src/world3d-react/behavior.tsx +19 -11
- package/src/world3d-react/r3f-adapter.tsx +8 -0
- package/dist/adapter/adapter-surface.d.ts +0 -30
- package/dist/adapter/adapter-surface.d.ts.map +0 -1
- package/dist/adapter/adapter-surface.js +0 -18
- package/dist/adapter/authoring.d.ts +0 -461
- package/dist/adapter/authoring.d.ts.map +0 -1
- package/dist/adapter/authoring.js +0 -22
- package/dist/adapter/colyseus-networking-adapter.d.ts +0 -43
- package/dist/adapter/colyseus-networking-adapter.d.ts.map +0 -1
- package/dist/adapter/colyseus-networking-adapter.js +0 -38
- package/dist/adapter/first-party-systems.d.ts +0 -38
- package/dist/adapter/first-party-systems.d.ts.map +0 -1
- package/dist/adapter/first-party-systems.js +0 -77
- package/dist/adapter/game-adapter.d.ts +0 -133
- package/dist/adapter/game-adapter.d.ts.map +0 -1
- package/dist/adapter/game-adapter.js +0 -10
- package/dist/adapter/host-context.d.ts +0 -71
- package/dist/adapter/host-context.d.ts.map +0 -1
- package/dist/adapter/host-context.js +0 -16
- package/dist/adapter/index.d.ts +0 -22
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/index.js +0 -15
- package/dist/adapter/ingest/game-contract.d.ts +0 -53
- package/dist/adapter/ingest/game-contract.d.ts.map +0 -1
- package/dist/adapter/ingest/game-contract.js +0 -30
- package/dist/adapter/ingest/overlay-applier.d.ts +0 -118
- package/dist/adapter/ingest/overlay-applier.d.ts.map +0 -1
- package/dist/adapter/ingest/overlay-applier.js +0 -132
- package/dist/adapter/ingest/overlay-apply.d.ts +0 -60
- package/dist/adapter/ingest/overlay-apply.d.ts.map +0 -1
- package/dist/adapter/ingest/overlay-apply.js +0 -101
- package/dist/adapter/ingest/overlay-file.d.ts +0 -79
- package/dist/adapter/ingest/overlay-file.d.ts.map +0 -1
- package/dist/adapter/ingest/overlay-file.js +0 -66
- package/dist/adapter/ingest/overlay-report.d.ts +0 -113
- package/dist/adapter/ingest/overlay-report.d.ts.map +0 -1
- package/dist/adapter/ingest/overlay-report.js +0 -103
- package/dist/adapter/ingest/scene-capture.d.ts +0 -97
- package/dist/adapter/ingest/scene-capture.d.ts.map +0 -1
- package/dist/adapter/ingest/scene-capture.js +0 -248
- package/dist/adapter/ingest/upstream-pin.d.ts +0 -47
- package/dist/adapter/ingest/upstream-pin.d.ts.map +0 -1
- package/dist/adapter/ingest/upstream-pin.js +0 -50
- package/dist/adapter/loop-gate-report.d.ts +0 -34
- package/dist/adapter/loop-gate-report.d.ts.map +0 -1
- package/dist/adapter/loop-gate-report.js +0 -37
- package/dist/adapter/rapier-physics-adapter.d.ts +0 -12
- package/dist/adapter/rapier-physics-adapter.d.ts.map +0 -1
- package/dist/adapter/rapier-physics-adapter.js +0 -46
- package/dist/adapter/system-adapter.d.ts +0 -206
- package/dist/adapter/system-adapter.d.ts.map +0 -1
- package/dist/adapter/system-adapter.js +0 -13
- package/dist/adapter/transform.d.ts +0 -18
- package/dist/adapter/transform.d.ts.map +0 -1
- package/dist/adapter/transform.js +0 -1
- package/dist/adapter/vgai-scene-game-adapter.d.ts +0 -108
- package/dist/adapter/vgai-scene-game-adapter.d.ts.map +0 -1
- package/dist/adapter/vgai-scene-game-adapter.js +0 -762
- package/dist/ai/navigation.d.ts +0 -64
- package/dist/ai/navigation.d.ts.map +0 -1
- package/dist/ai/navigation.js +0 -133
- package/dist/animation/anim-graph-types.d.ts +0 -25
- package/dist/animation/anim-graph-types.d.ts.map +0 -1
- package/dist/animation/anim-graph-types.js +0 -1
- package/dist/animation/animation-clock.d.ts +0 -213
- package/dist/animation/animation-clock.d.ts.map +0 -1
- package/dist/animation/animation-clock.js +0 -301
- package/dist/animation/blend-node.d.ts +0 -22
- package/dist/animation/blend-node.d.ts.map +0 -1
- package/dist/animation/blend-node.js +0 -97
- package/dist/animation/camera-ownership.d.ts +0 -250
- package/dist/animation/camera-ownership.d.ts.map +0 -1
- package/dist/animation/camera-ownership.js +0 -169
- package/dist/animation/cinematic-cues.d.ts +0 -200
- package/dist/animation/cinematic-cues.d.ts.map +0 -1
- package/dist/animation/cinematic-cues.js +0 -213
- package/dist/animation/clip-map.d.ts +0 -12
- package/dist/animation/clip-map.d.ts.map +0 -1
- package/dist/animation/clip-map.js +0 -37
- package/dist/animation/gsap-registration.d.ts +0 -119
- package/dist/animation/gsap-registration.d.ts.map +0 -1
- package/dist/animation/gsap-registration.js +0 -92
- package/dist/animation/theatre-clock-binding.d.ts +0 -89
- package/dist/animation/theatre-clock-binding.d.ts.map +0 -1
- package/dist/animation/theatre-clock-binding.js +0 -29
- package/dist/animation/theatre-director.d.ts +0 -242
- package/dist/animation/theatre-director.d.ts.map +0 -1
- package/dist/animation/theatre-director.js +0 -235
- package/dist/animation/theatre-object-binding.d.ts +0 -305
- package/dist/animation/theatre-object-binding.d.ts.map +0 -1
- package/dist/animation/theatre-object-binding.js +0 -351
- package/dist/animation/xstate-animation-binding.d.ts +0 -56
- package/dist/animation/xstate-animation-binding.d.ts.map +0 -1
- package/dist/animation/xstate-animation-binding.js +0 -331
- package/dist/animation/xstate-animation-meta.d.ts +0 -266
- package/dist/animation/xstate-animation-meta.d.ts.map +0 -1
- package/dist/animation/xstate-animation-meta.js +0 -252
- package/dist/assets.d.ts +0 -26
- package/dist/assets.d.ts.map +0 -1
- package/dist/assets.js +0 -55
- package/dist/audio/index.d.ts +0 -4
- package/dist/audio/index.d.ts.map +0 -1
- package/dist/audio/index.js +0 -24
- package/dist/audio/tone-clock-binding.d.ts +0 -75
- package/dist/audio/tone-clock-binding.d.ts.map +0 -1
- package/dist/audio/tone-clock-binding.js +0 -29
- package/dist/audio/tone-context.d.ts +0 -114
- package/dist/audio/tone-context.d.ts.map +0 -1
- package/dist/audio/tone-context.js +0 -39
- package/dist/audio/tone-offline-render.d.ts +0 -90
- package/dist/audio/tone-offline-render.d.ts.map +0 -1
- package/dist/audio/tone-offline-render.js +0 -56
- package/dist/audio/wav-encode.d.ts +0 -38
- package/dist/audio/wav-encode.d.ts.map +0 -1
- package/dist/audio/wav-encode.js +0 -97
- package/dist/character/cloth-sim.d.ts +0 -179
- package/dist/character/cloth-sim.d.ts.map +0 -1
- package/dist/character/cloth-sim.js +0 -334
- package/dist/character/spring-chain.d.ts +0 -135
- package/dist/character/spring-chain.d.ts.map +0 -1
- package/dist/character/spring-chain.js +0 -165
- package/dist/core/game-loop.d.ts +0 -42
- package/dist/core/game-loop.d.ts.map +0 -1
- package/dist/core/game-loop.js +0 -167
- package/dist/core/seeded-random.d.ts +0 -69
- package/dist/core/seeded-random.d.ts.map +0 -1
- package/dist/core/seeded-random.js +0 -121
- package/dist/core/system-runner.d.ts +0 -120
- package/dist/core/system-runner.d.ts.map +0 -1
- package/dist/core/system-runner.js +0 -297
- package/dist/core/types.d.ts +0 -92
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -25
- package/dist/data/data-asset.d.ts +0 -101
- package/dist/data/data-asset.d.ts.map +0 -1
- package/dist/data/data-asset.js +0 -122
- package/dist/data/data-check-core.d.ts +0 -110
- package/dist/data/data-check-core.d.ts.map +0 -1
- package/dist/data/data-check-core.js +0 -178
- package/dist/data/data-ref.d.ts +0 -79
- package/dist/data/data-ref.d.ts.map +0 -1
- package/dist/data/data-ref.js +0 -130
- package/dist/data/vite-plugin-data.d.ts +0 -79
- package/dist/data/vite-plugin-data.d.ts.map +0 -1
- package/dist/data/vite-plugin-data.js +0 -217
- package/dist/dev/console-bridge.d.ts +0 -22
- package/dist/dev/console-bridge.d.ts.map +0 -1
- package/dist/dev/console-bridge.js +0 -71
- package/dist/dev/debug-draw.d.ts +0 -24
- package/dist/dev/debug-draw.d.ts.map +0 -1
- package/dist/dev/debug-draw.js +0 -73
- package/dist/dev/logger.d.ts +0 -30
- package/dist/dev/logger.d.ts.map +0 -1
- package/dist/dev/logger.js +0 -90
- package/dist/dev/performance-profiler.d.ts +0 -60
- package/dist/dev/performance-profiler.d.ts.map +0 -1
- package/dist/dev/performance-profiler.js +0 -181
- package/dist/dev/webgl-gpu-timer.d.ts +0 -8
- package/dist/dev/webgl-gpu-timer.d.ts.map +0 -1
- package/dist/dev/webgl-gpu-timer.js +0 -52
- package/dist/ecs/component-manager.d.ts +0 -205
- package/dist/ecs/component-manager.d.ts.map +0 -1
- package/dist/ecs/component-manager.js +0 -706
- package/dist/ecs/game-component.d.ts +0 -146
- package/dist/ecs/game-component.d.ts.map +0 -1
- package/dist/ecs/game-component.js +0 -141
- package/dist/ecs/hmr-swap-report.d.ts +0 -53
- package/dist/ecs/hmr-swap-report.d.ts.map +0 -1
- package/dist/ecs/hmr-swap-report.js +0 -55
- package/dist/humanoid/bake.operation.d.ts +0 -119
- package/dist/humanoid/bake.operation.d.ts.map +0 -1
- package/dist/humanoid/bake.operation.js +0 -228
- package/dist/humanoid/body.d.ts +0 -101
- package/dist/humanoid/body.d.ts.map +0 -1
- package/dist/humanoid/body.js +0 -530
- package/dist/humanoid/clips.d.ts +0 -62
- package/dist/humanoid/clips.d.ts.map +0 -1
- package/dist/humanoid/clips.js +0 -121
- package/dist/humanoid/compose.d.ts +0 -75
- package/dist/humanoid/compose.d.ts.map +0 -1
- package/dist/humanoid/compose.js +0 -176
- package/dist/humanoid/generate.d.ts +0 -92
- package/dist/humanoid/generate.d.ts.map +0 -1
- package/dist/humanoid/generate.js +0 -124
- package/dist/humanoid/index.d.ts +0 -24
- package/dist/humanoid/index.d.ts.map +0 -1
- package/dist/humanoid/index.js +0 -18
- package/dist/humanoid/schema.d.ts +0 -35
- package/dist/humanoid/schema.d.ts.map +0 -1
- package/dist/humanoid/schema.js +0 -87
- package/dist/humanoid/skeleton.d.ts +0 -103
- package/dist/humanoid/skeleton.d.ts.map +0 -1
- package/dist/humanoid/skeleton.js +0 -289
- package/dist/index.d.ts +0 -37
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -30
- package/dist/input/input-manager.d.ts +0 -945
- package/dist/input/input-manager.d.ts.map +0 -1
- package/dist/input/input-manager.js +0 -2207
- package/dist/input/input-types.d.ts +0 -174
- package/dist/input/input-types.d.ts.map +0 -1
- package/dist/input/input-types.js +0 -1
- package/dist/input/prompt-labels.d.ts +0 -21
- package/dist/input/prompt-labels.d.ts.map +0 -1
- package/dist/input/prompt-labels.js +0 -121
- package/dist/input/rebind-controller.d.ts +0 -59
- package/dist/input/rebind-controller.d.ts.map +0 -1
- package/dist/input/rebind-controller.js +0 -85
- package/dist/input/schema.d.ts +0 -16
- package/dist/input/schema.d.ts.map +0 -1
- package/dist/input/schema.js +0 -228
- package/dist/loader.d.ts +0 -43
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -59
- package/dist/manifest/index.d.ts +0 -5
- package/dist/manifest/index.d.ts.map +0 -1
- package/dist/manifest/index.js +0 -8
- package/dist/manifest/load-file.d.ts +0 -4
- package/dist/manifest/load-file.d.ts.map +0 -1
- package/dist/manifest/load-file.js +0 -14
- package/dist/manifest/load.d.ts +0 -144
- package/dist/manifest/load.d.ts.map +0 -1
- package/dist/manifest/load.js +0 -273
- package/dist/manifest/schema.d.ts +0 -230
- package/dist/manifest/schema.d.ts.map +0 -1
- package/dist/manifest/schema.js +0 -394
- package/dist/physics/collision-system.d.ts +0 -41
- package/dist/physics/collision-system.d.ts.map +0 -1
- package/dist/physics/collision-system.js +0 -64
- package/dist/physics/physics-registry.d.ts +0 -45
- package/dist/physics/physics-registry.d.ts.map +0 -1
- package/dist/physics/physics-registry.js +0 -65
- package/dist/physics/transform-writer.d.ts +0 -16
- package/dist/physics/transform-writer.d.ts.map +0 -1
- package/dist/physics/transform-writer.js +0 -38
- package/dist/physics/trigger-dispatch.d.ts +0 -24
- package/dist/physics/trigger-dispatch.d.ts.map +0 -1
- package/dist/physics/trigger-dispatch.js +0 -80
- package/dist/react/game-state.d.ts +0 -156
- package/dist/react/game-state.d.ts.map +0 -1
- package/dist/react/game-state.js +0 -222
- package/dist/react/root-adapter.d.ts +0 -11
- package/dist/react/root-adapter.d.ts.map +0 -1
- package/dist/react/root-adapter.js +0 -41
- package/dist/react/unmanaged-root-detector.d.ts +0 -12
- package/dist/react/unmanaged-root-detector.d.ts.map +0 -1
- package/dist/react/unmanaged-root-detector.js +0 -45
- package/dist/react/use-data.d.ts +0 -60
- package/dist/react/use-data.d.ts.map +0 -1
- package/dist/react/use-data.js +0 -101
- package/dist/react/use-selection.d.ts +0 -75
- package/dist/react/use-selection.d.ts.map +0 -1
- package/dist/react/use-selection.js +0 -90
- package/dist/render/auto-batcher.d.ts +0 -34
- package/dist/render/auto-batcher.d.ts.map +0 -1
- package/dist/render/auto-batcher.js +0 -140
- package/dist/render/render-batch-system.d.ts +0 -33
- package/dist/render/render-batch-system.d.ts.map +0 -1
- package/dist/render/render-batch-system.js +0 -230
- package/dist/render/render-features.d.ts +0 -47
- package/dist/render/render-features.d.ts.map +0 -1
- package/dist/render/render-features.js +0 -105
- package/dist/render/render-settings.d.ts +0 -36
- package/dist/render/render-settings.d.ts.map +0 -1
- package/dist/render/render-settings.js +0 -51
- package/dist/runtime/create-runtime.d.ts +0 -249
- package/dist/runtime/create-runtime.d.ts.map +0 -1
- package/dist/runtime/create-runtime.js +0 -641
- package/dist/runtime/debug-bridge.d.ts +0 -257
- package/dist/runtime/debug-bridge.d.ts.map +0 -1
- package/dist/runtime/debug-bridge.js +0 -224
- package/dist/runtime/debug-registry.d.ts +0 -288
- package/dist/runtime/debug-registry.d.ts.map +0 -1
- package/dist/runtime/debug-registry.js +0 -513
- package/dist/runtime/frame-selector-cache.d.ts +0 -41
- package/dist/runtime/frame-selector-cache.d.ts.map +0 -1
- package/dist/runtime/frame-selector-cache.js +0 -65
- package/dist/runtime/game.d.ts +0 -496
- package/dist/runtime/game.d.ts.map +0 -1
- package/dist/runtime/game.js +0 -741
- package/dist/runtime/gameplay-rng-trap.d.ts +0 -48
- package/dist/runtime/gameplay-rng-trap.d.ts.map +0 -1
- package/dist/runtime/gameplay-rng-trap.js +0 -96
- package/dist/runtime/input-router.d.ts +0 -78
- package/dist/runtime/input-router.d.ts.map +0 -1
- package/dist/runtime/input-router.js +0 -171
- package/dist/runtime/mount-game.d.ts +0 -129
- package/dist/runtime/mount-game.d.ts.map +0 -1
- package/dist/runtime/mount-game.js +0 -152
- package/dist/runtime/mount-manifest.d.ts +0 -173
- package/dist/runtime/mount-manifest.d.ts.map +0 -1
- package/dist/runtime/mount-manifest.js +0 -297
- package/dist/runtime/render-audio-control.d.ts +0 -110
- package/dist/runtime/render-audio-control.d.ts.map +0 -1
- package/dist/runtime/render-audio-control.js +0 -111
- package/dist/runtime/render-control.d.ts +0 -291
- package/dist/runtime/render-control.d.ts.map +0 -1
- package/dist/runtime/render-control.js +0 -264
- package/dist/runtime/render-seed.d.ts +0 -57
- package/dist/runtime/render-seed.d.ts.map +0 -1
- package/dist/runtime/render-seed.js +0 -74
- package/dist/runtime/state-bridge.d.ts +0 -61
- package/dist/runtime/state-bridge.d.ts.map +0 -1
- package/dist/runtime/state-bridge.js +0 -63
- package/dist/runtime/types.d.ts +0 -253
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/runtime/types.js +0 -1
- package/dist/scene/asset-loaders.d.ts +0 -79
- package/dist/scene/asset-loaders.d.ts.map +0 -1
- package/dist/scene/asset-loaders.js +0 -141
- package/dist/scene/asset-paths.d.ts +0 -11
- package/dist/scene/asset-paths.d.ts.map +0 -1
- package/dist/scene/asset-paths.js +0 -108
- package/dist/scene/asset-ref-check.d.ts +0 -88
- package/dist/scene/asset-ref-check.d.ts.map +0 -1
- package/dist/scene/asset-ref-check.js +0 -214
- package/dist/scene/asset-registry.d.ts +0 -38
- package/dist/scene/asset-registry.d.ts.map +0 -1
- package/dist/scene/asset-registry.js +0 -66
- package/dist/scene/collider-dimensions.d.ts +0 -63
- package/dist/scene/collider-dimensions.d.ts.map +0 -1
- package/dist/scene/collider-dimensions.js +0 -98
- package/dist/scene/component-registry.d.ts +0 -22
- package/dist/scene/component-registry.d.ts.map +0 -1
- package/dist/scene/component-registry.js +0 -37
- package/dist/scene/defaults.d.ts +0 -252
- package/dist/scene/defaults.d.ts.map +0 -1
- package/dist/scene/defaults.js +0 -151
- package/dist/scene/geometries/index.d.ts +0 -8
- package/dist/scene/geometries/index.d.ts.map +0 -1
- package/dist/scene/geometries/index.js +0 -7
- package/dist/scene/geometries/terrain.d.ts +0 -2
- package/dist/scene/geometries/terrain.d.ts.map +0 -1
- package/dist/scene/geometries/terrain.js +0 -37
- package/dist/scene/geometry-registry.d.ts +0 -24
- package/dist/scene/geometry-registry.d.ts.map +0 -1
- package/dist/scene/geometry-registry.js +0 -20
- package/dist/scene/instance-registry.d.ts +0 -36
- package/dist/scene/instance-registry.d.ts.map +0 -1
- package/dist/scene/instance-registry.js +0 -55
- package/dist/scene/instancers/grid.d.ts +0 -2
- package/dist/scene/instancers/grid.d.ts.map +0 -1
- package/dist/scene/instancers/grid.js +0 -36
- package/dist/scene/instancers/index.d.ts +0 -8
- package/dist/scene/instancers/index.d.ts.map +0 -1
- package/dist/scene/instancers/index.js +0 -7
- package/dist/scene/light-camera-factory.d.ts +0 -23
- package/dist/scene/light-camera-factory.d.ts.map +0 -1
- package/dist/scene/light-camera-factory.js +0 -68
- package/dist/scene/material-factory.d.ts +0 -17
- package/dist/scene/material-factory.d.ts.map +0 -1
- package/dist/scene/material-factory.js +0 -197
- package/dist/scene/material-registry.d.ts +0 -40
- package/dist/scene/material-registry.d.ts.map +0 -1
- package/dist/scene/material-registry.js +0 -44
- package/dist/scene/materials/index.d.ts +0 -8
- package/dist/scene/materials/index.d.ts.map +0 -1
- package/dist/scene/materials/index.js +0 -7
- package/dist/scene/materials/water.d.ts +0 -2
- package/dist/scene/materials/water.d.ts.map +0 -1
- package/dist/scene/materials/water.js +0 -54
- package/dist/scene/parse.d.ts +0 -23
- package/dist/scene/parse.d.ts.map +0 -1
- package/dist/scene/parse.js +0 -179
- package/dist/scene/particles-factory.d.ts +0 -33
- package/dist/scene/particles-factory.d.ts.map +0 -1
- package/dist/scene/particles-factory.js +0 -282
- package/dist/scene/scene-apply.d.ts +0 -109
- package/dist/scene/scene-apply.d.ts.map +0 -1
- package/dist/scene/scene-apply.js +0 -370
- package/dist/scene/scene-diff-schema.d.ts +0 -285
- package/dist/scene/scene-diff-schema.d.ts.map +0 -1
- package/dist/scene/scene-diff-schema.js +0 -92
- package/dist/scene/scene-diff-types.d.ts +0 -40
- package/dist/scene/scene-diff-types.d.ts.map +0 -1
- package/dist/scene/scene-diff-types.js +0 -14
- package/dist/scene/scene-loader.d.ts +0 -167
- package/dist/scene/scene-loader.d.ts.map +0 -1
- package/dist/scene/scene-loader.js +0 -1211
- package/dist/scene/scene-query.d.ts +0 -11
- package/dist/scene/scene-query.d.ts.map +0 -1
- package/dist/scene/scene-query.js +0 -63
- package/dist/scene/scene-types.d.ts +0 -10
- package/dist/scene/scene-types.d.ts.map +0 -1
- package/dist/scene/scene-types.js +0 -8
- package/dist/scene/scene-version.d.ts +0 -26
- package/dist/scene/scene-version.d.ts.map +0 -1
- package/dist/scene/scene-version.js +0 -34
- package/dist/scene/schema/animation.d.ts +0 -8
- package/dist/scene/schema/animation.d.ts.map +0 -1
- package/dist/scene/schema/animation.js +0 -42
- package/dist/scene/schema/audio.d.ts +0 -13
- package/dist/scene/schema/audio.d.ts.map +0 -1
- package/dist/scene/schema/audio.js +0 -22
- package/dist/scene/schema/camera.d.ts +0 -28
- package/dist/scene/schema/camera.d.ts.map +0 -1
- package/dist/scene/schema/camera.js +0 -17
- package/dist/scene/schema/collider.d.ts +0 -40
- package/dist/scene/schema/collider.d.ts.map +0 -1
- package/dist/scene/schema/collider.js +0 -55
- package/dist/scene/schema/entity-ref.d.ts +0 -31
- package/dist/scene/schema/entity-ref.d.ts.map +0 -1
- package/dist/scene/schema/entity-ref.js +0 -61
- package/dist/scene/schema/entity.d.ts +0 -1036
- package/dist/scene/schema/entity.d.ts.map +0 -1
- package/dist/scene/schema/entity.js +0 -153
- package/dist/scene/schema/environment.d.ts +0 -425
- package/dist/scene/schema/environment.d.ts.map +0 -1
- package/dist/scene/schema/environment.js +0 -357
- package/dist/scene/schema/index.d.ts +0 -37
- package/dist/scene/schema/index.d.ts.map +0 -1
- package/dist/scene/schema/index.js +0 -19
- package/dist/scene/schema/instances.d.ts +0 -14
- package/dist/scene/schema/instances.d.ts.map +0 -1
- package/dist/scene/schema/instances.js +0 -28
- package/dist/scene/schema/joint.d.ts +0 -23
- package/dist/scene/schema/joint.d.ts.map +0 -1
- package/dist/scene/schema/joint.js +0 -23
- package/dist/scene/schema/light.d.ts +0 -38
- package/dist/scene/schema/light.d.ts.map +0 -1
- package/dist/scene/schema/light.js +0 -26
- package/dist/scene/schema/material.d.ts +0 -199
- package/dist/scene/schema/material.d.ts.map +0 -1
- package/dist/scene/schema/material.js +0 -103
- package/dist/scene/schema/mesh.d.ts +0 -48
- package/dist/scene/schema/mesh.d.ts.map +0 -1
- package/dist/scene/schema/mesh.js +0 -82
- package/dist/scene/schema/particles.d.ts +0 -2178
- package/dist/scene/schema/particles.d.ts.map +0 -1
- package/dist/scene/schema/particles.js +0 -321
- package/dist/scene/schema/physics.d.ts +0 -56
- package/dist/scene/schema/physics.d.ts.map +0 -1
- package/dist/scene/schema/physics.js +0 -37
- package/dist/scene/schema/scene-file.d.ts +0 -303
- package/dist/scene/schema/scene-file.d.ts.map +0 -1
- package/dist/scene/schema/scene-file.js +0 -256
- package/dist/scene/schema/shadow.d.ts +0 -28
- package/dist/scene/schema/shadow.d.ts.map +0 -1
- package/dist/scene/schema/shadow.js +0 -20
- package/dist/scene/schema/spline.d.ts +0 -25
- package/dist/scene/schema/spline.d.ts.map +0 -1
- package/dist/scene/schema/spline.js +0 -15
- package/dist/scene/schema/tuples.d.ts +0 -12
- package/dist/scene/schema/tuples.d.ts.map +0 -1
- package/dist/scene/schema/tuples.js +0 -14
- package/dist/scene/user-data.d.ts +0 -185
- package/dist/scene/user-data.d.ts.map +0 -1
- package/dist/scene/user-data.js +0 -144
- package/dist/setup/setup-audio.d.ts +0 -20
- package/dist/setup/setup-audio.d.ts.map +0 -1
- package/dist/setup/setup-audio.js +0 -41
- package/dist/setup/setup-particles.d.ts +0 -17
- package/dist/setup/setup-particles.d.ts.map +0 -1
- package/dist/setup/setup-particles.js +0 -16
- package/dist/setup/setup-physics.d.ts +0 -25
- package/dist/setup/setup-physics.d.ts.map +0 -1
- package/dist/setup/setup-physics.js +0 -51
- package/dist/setup/setup-renderer.d.ts +0 -69
- package/dist/setup/setup-renderer.d.ts.map +0 -1
- package/dist/setup/setup-renderer.js +0 -363
- package/dist/tools/define-tool.d.ts +0 -130
- package/dist/tools/define-tool.d.ts.map +0 -1
- package/dist/tools/define-tool.js +0 -96
- package/dist/world2d/authoring-2d.d.ts +0 -80
- package/dist/world2d/authoring-2d.d.ts.map +0 -1
- package/dist/world2d/authoring-2d.js +0 -195
- package/dist/world2d/capture-to-scene2d.d.ts +0 -5
- package/dist/world2d/capture-to-scene2d.d.ts.map +0 -1
- package/dist/world2d/capture-to-scene2d.js +0 -49
- package/dist/world2d/collision-2d.d.ts +0 -52
- package/dist/world2d/collision-2d.d.ts.map +0 -1
- package/dist/world2d/collision-2d.js +0 -70
- package/dist/world2d/components-2d.d.ts +0 -47
- package/dist/world2d/components-2d.d.ts.map +0 -1
- package/dist/world2d/components-2d.js +0 -77
- package/dist/world2d/index.d.ts +0 -34
- package/dist/world2d/index.d.ts.map +0 -1
- package/dist/world2d/index.js +0 -32
- package/dist/world2d/ingest-iframe-2d.d.ts +0 -82
- package/dist/world2d/ingest-iframe-2d.d.ts.map +0 -1
- package/dist/world2d/ingest-iframe-2d.js +0 -166
- package/dist/world2d/ingest2d.d.ts +0 -97
- package/dist/world2d/ingest2d.d.ts.map +0 -1
- package/dist/world2d/ingest2d.js +0 -40
- package/dist/world2d/physics2d-registry.d.ts +0 -24
- package/dist/world2d/physics2d-registry.d.ts.map +0 -1
- package/dist/world2d/physics2d-registry.js +0 -38
- package/dist/world2d/pixi-game-adapter.d.ts +0 -107
- package/dist/world2d/pixi-game-adapter.d.ts.map +0 -1
- package/dist/world2d/pixi-game-adapter.js +0 -210
- package/dist/world2d/pixi-surface.d.ts +0 -39
- package/dist/world2d/pixi-surface.d.ts.map +0 -1
- package/dist/world2d/pixi-surface.js +0 -47
- package/dist/world2d/scene-capture-2d.d.ts +0 -43
- package/dist/world2d/scene-capture-2d.d.ts.map +0 -1
- package/dist/world2d/scene-capture-2d.js +0 -92
- package/dist/world2d/scene2d-loader.d.ts +0 -27
- package/dist/world2d/scene2d-loader.d.ts.map +0 -1
- package/dist/world2d/scene2d-loader.js +0 -275
- package/dist/world2d/schema/entity2d.d.ts +0 -102
- package/dist/world2d/schema/entity2d.d.ts.map +0 -1
- package/dist/world2d/schema/entity2d.js +0 -119
- package/dist/world2d/schema/physics2d.d.ts +0 -46
- package/dist/world2d/schema/physics2d.d.ts.map +0 -1
- package/dist/world2d/schema/physics2d.js +0 -45
- package/dist/world2d/schema/sprite.d.ts +0 -42
- package/dist/world2d/schema/sprite.d.ts.map +0 -1
- package/dist/world2d/schema/sprite.js +0 -63
- package/dist/world2d/schema/tilemap.d.ts +0 -15
- package/dist/world2d/schema/tilemap.d.ts.map +0 -1
- package/dist/world2d/schema/tilemap.js +0 -19
- package/dist/world2d/schema/tuples2d.d.ts +0 -20
- package/dist/world2d/schema/tuples2d.d.ts.map +0 -1
- package/dist/world2d/schema/tuples2d.js +0 -19
- package/dist/world2d/system-adapters-2d.d.ts +0 -16
- package/dist/world2d/system-adapters-2d.d.ts.map +0 -1
- package/dist/world2d/system-adapters-2d.js +0 -37
- package/dist/world2d/transform-writer-2d.d.ts +0 -16
- package/dist/world2d/transform-writer-2d.d.ts.map +0 -1
- package/dist/world2d/transform-writer-2d.js +0 -22
- package/dist/world2d/types.d.ts +0 -59
- package/dist/world2d/types.d.ts.map +0 -1
- package/dist/world2d/types.js +0 -1
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
import { N8AOPostPass } from 'n8ao';
|
|
2
|
-
import { BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, ColorDepthEffect, DepthOfFieldEffect, DotScreenEffect, EffectComposer, EffectPass, GlitchEffect, GodRaysEffect, GridEffect, HueSaturationEffect, LensDistortionEffect, NoiseEffect, NormalPass, OutlineEffect, PixelationEffect, RenderPass, ScanlineEffect, SepiaEffect, ShockWaveEffect, SMAAEffect, SMAAPreset, SSAOEffect, TiltShiftEffect, VignetteEffect, } from 'postprocessing';
|
|
3
|
-
import { MotionBlurEffect, SSGIEffect, SSREffect, VelocityDepthNormalPass } from 'realism-effects';
|
|
4
|
-
import * as THREE from 'three';
|
|
5
|
-
import { resolveRenderSettings } from '../render/render-settings';
|
|
6
|
-
import { DEFAULTS } from '../scene/defaults';
|
|
7
|
-
/**
|
|
8
|
-
* Apply the live renderer-level render settings (shadows, resolution scale) from
|
|
9
|
-
* the resolved cascade. `antialias`/`backend` are reload-only (renderer re-init)
|
|
10
|
-
* and are handled at construction, not here. Pass the scene `rendering` scope
|
|
11
|
-
* (e.g. `env.rendering`); absent values fall back to the registry defaults so
|
|
12
|
-
* behavior is unchanged when a scene omits `rendering`.
|
|
13
|
-
*
|
|
14
|
-
* `basePixelRatio` is the call-site's native pixel-ratio policy (the runtime caps
|
|
15
|
-
* at 2; the editor uses the raw devicePixelRatio); `resolutionScale` multiplies it.
|
|
16
|
-
*/
|
|
17
|
-
export function applyRendererSettings(renderer, rendering, basePixelRatio = Math.min(window.devicePixelRatio, 2)) {
|
|
18
|
-
const settings = resolveRenderSettings(rendering);
|
|
19
|
-
renderer.shadowMap.enabled = Boolean(settings['shadows']);
|
|
20
|
-
const scale = Number(settings['resolutionScale']) || 1;
|
|
21
|
-
renderer.setPixelRatio(basePixelRatio * scale);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Create ONLY the WebGL renderer. The HOST owns the renderer (see
|
|
25
|
-
* `HostContext.renderer`); the game/adapter owns the scene/camera/composer it
|
|
26
|
-
* renders into. Split out of `setupRenderer` for the adapter inversion.
|
|
27
|
-
*
|
|
28
|
-
* `rendering` is the scene-level render scope (`env.rendering`); it seeds the
|
|
29
|
-
* reload-only `antialias` option at construction and the live shadow/resolution
|
|
30
|
-
* settings (via {@link applyRendererSettings}). Absent → registry defaults.
|
|
31
|
-
*
|
|
32
|
-
* `opts` is additive (T6.1 slice 1, COMPOSITION-DESIGN.md D5 §1/§4): omitted
|
|
33
|
-
* entirely, construction is byte-identical to before (no `alpha`/
|
|
34
|
-
* `preserveDrawingBuffer` keys at all) — the legacy single-canvas host never
|
|
35
|
-
* passes it. The roots path passes `alpha:true` for every stacked canvas
|
|
36
|
-
* above the bottom one (so its clear-alpha-0 shows the layer below through
|
|
37
|
-
* it) and `preserveDrawingBuffer:true` for every stacked canvas (the
|
|
38
|
-
* recorded capture-tier cost, paid once here rather than re-derived later).
|
|
39
|
-
*/
|
|
40
|
-
export function createHostRenderer(canvas, width = window.innerWidth, height = window.innerHeight, rendering, opts) {
|
|
41
|
-
// A newly-shown editor tab can report 0x0 for one layout frame. WebGL render
|
|
42
|
-
// targets cannot have zero-sized attachments, so boot at the smallest valid
|
|
43
|
-
// backing size and let the normal resize path apply the real dimensions.
|
|
44
|
-
const safeWidth = Math.max(1, width);
|
|
45
|
-
const safeHeight = Math.max(1, height);
|
|
46
|
-
const settings = resolveRenderSettings(rendering);
|
|
47
|
-
const renderer = new THREE.WebGLRenderer({
|
|
48
|
-
canvas,
|
|
49
|
-
antialias: Boolean(settings['antialias']),
|
|
50
|
-
powerPreference: 'high-performance',
|
|
51
|
-
...(opts?.alpha ? { alpha: true } : {}),
|
|
52
|
-
...(opts?.preserveDrawingBuffer ? { preserveDrawingBuffer: true } : {}),
|
|
53
|
-
});
|
|
54
|
-
renderer.setSize(safeWidth, safeHeight);
|
|
55
|
-
applyRendererSettings(renderer, rendering);
|
|
56
|
-
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
|
|
57
|
-
renderer.toneMapping = toneMappingModes[DEFAULTS.toneMapping.mode] ?? THREE.ACESFilmicToneMapping;
|
|
58
|
-
renderer.toneMappingExposure = DEFAULTS.toneMapping.exposure;
|
|
59
|
-
return renderer;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Create the scene, camera, and postprocessing composer that a first-party game
|
|
63
|
-
* renders into, given a host-provided renderer. The GPU-only `composer` is
|
|
64
|
-
* created here; a headless host (no GPU) skips this entirely.
|
|
65
|
-
*/
|
|
66
|
-
export function createSceneView(renderer, width = window.innerWidth, height = window.innerHeight) {
|
|
67
|
-
const safeWidth = Math.max(1, width);
|
|
68
|
-
const safeHeight = Math.max(1, height);
|
|
69
|
-
const scene = new THREE.Scene();
|
|
70
|
-
scene.background = new THREE.Color(0x1a1a2e);
|
|
71
|
-
const camera = new THREE.PerspectiveCamera(DEFAULTS.camera.fov, safeWidth / safeHeight, DEFAULTS.camera.near, DEFAULTS.camera.far);
|
|
72
|
-
camera.position.set(0, 5, 10);
|
|
73
|
-
camera.lookAt(0, 0, 0);
|
|
74
|
-
const composer = new EffectComposer(renderer);
|
|
75
|
-
composer.addPass(new RenderPass(scene, camera));
|
|
76
|
-
composer.addPass(new EffectPass(camera, new BloomEffect({ luminanceThreshold: DEFAULTS.postProcessing.bloom.luminanceThreshold })));
|
|
77
|
-
return { scene, camera, composer };
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Creates the Three.js renderer, scene, camera, and postprocessing pipeline.
|
|
81
|
-
*
|
|
82
|
-
* This is direct Three.js setup — no abstraction. Edit freely. (Now a thin
|
|
83
|
-
* combination of {@link createHostRenderer} + {@link createSceneView}.)
|
|
84
|
-
*/
|
|
85
|
-
export function setupRenderer(canvas, width = window.innerWidth, height = window.innerHeight) {
|
|
86
|
-
const renderer = createHostRenderer(canvas, width, height);
|
|
87
|
-
const { scene, camera, composer } = createSceneView(renderer, width, height);
|
|
88
|
-
return { renderer, scene, camera, composer };
|
|
89
|
-
}
|
|
90
|
-
const toneMappingModes = {
|
|
91
|
-
none: THREE.NoToneMapping,
|
|
92
|
-
linear: THREE.LinearToneMapping,
|
|
93
|
-
reinhard: THREE.ReinhardToneMapping,
|
|
94
|
-
cineon: THREE.CineonToneMapping,
|
|
95
|
-
aces: THREE.ACESFilmicToneMapping,
|
|
96
|
-
agx: THREE.AgXToneMapping,
|
|
97
|
-
};
|
|
98
|
-
const smaaPresets = {
|
|
99
|
-
low: SMAAPreset.LOW,
|
|
100
|
-
medium: SMAAPreset.MEDIUM,
|
|
101
|
-
high: SMAAPreset.HIGH,
|
|
102
|
-
ultra: SMAAPreset.ULTRA,
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* Rebuild composer passes from scene environment settings.
|
|
106
|
-
* Scenes without toneMapping default to ACES (the runtime default).
|
|
107
|
-
* Code can further modify the composer after this call.
|
|
108
|
-
*
|
|
109
|
-
* Pass objectMap to enable entity-referencing effects (godRays, outline).
|
|
110
|
-
* Pass entities to resolve tag-based references (outline).
|
|
111
|
-
*/
|
|
112
|
-
export function applyScenePostProcessing(composer, renderer, scene, camera, env, objectMap, entityTags) {
|
|
113
|
-
// Dispose the existing passes before discarding them — removeAllPasses() just
|
|
114
|
-
// drops the references, so their GPU render targets would otherwise leak on
|
|
115
|
-
// every env edit / scene switch.
|
|
116
|
-
for (const pass of composer.passes) {
|
|
117
|
-
pass.dispose?.();
|
|
118
|
-
}
|
|
119
|
-
composer.removeAllPasses();
|
|
120
|
-
composer.addPass(new RenderPass(scene, camera));
|
|
121
|
-
// ── Tone mapping ──────────────────────────────────────────────────────
|
|
122
|
-
const tm = env?.toneMapping;
|
|
123
|
-
renderer.toneMapping =
|
|
124
|
-
toneMappingModes[tm?.mode ?? DEFAULTS.toneMapping.mode] ?? THREE.ACESFilmicToneMapping;
|
|
125
|
-
renderer.toneMappingExposure = tm?.exposure ?? DEFAULTS.toneMapping.exposure;
|
|
126
|
-
// ── Master switch ─────────────────────────────────────────────────────
|
|
127
|
-
// When post-processing is disabled at the scene/engine level, render the
|
|
128
|
-
// plain scene (the RenderPass added above) and skip every effect pass. The
|
|
129
|
-
// per-effect `enabled` flags below still apply when the master switch is on.
|
|
130
|
-
if (!resolveRenderSettings(env?.rendering)['postProcessing'])
|
|
131
|
-
return;
|
|
132
|
-
const pp = env?.postProcessing;
|
|
133
|
-
const d = DEFAULTS.postProcessing;
|
|
134
|
-
// ── Prerequisite passes ───────────────────────────────────────────────
|
|
135
|
-
// NormalPass — needed by SSAO
|
|
136
|
-
let normalPass;
|
|
137
|
-
if (pp?.ssao?.enabled) {
|
|
138
|
-
normalPass = new NormalPass(scene, camera);
|
|
139
|
-
composer.addPass(normalPass);
|
|
140
|
-
}
|
|
141
|
-
// VelocityDepthNormalPass — needed by SSR, SSGI, MotionBlur
|
|
142
|
-
let velocityPass;
|
|
143
|
-
if (pp?.ssr?.enabled || pp?.ssgi?.enabled || pp?.motionBlur?.enabled) {
|
|
144
|
-
velocityPass = new VelocityDepthNormalPass(scene, camera);
|
|
145
|
-
composer.addPass(velocityPass);
|
|
146
|
-
}
|
|
147
|
-
// N8AOPostPass — separate Pass, not an Effect
|
|
148
|
-
if (pp?.n8ao?.enabled) {
|
|
149
|
-
const n8aoPass = new N8AOPostPass(scene, camera);
|
|
150
|
-
const cfg = n8aoPass.configuration;
|
|
151
|
-
cfg.aoSamples = pp.n8ao.aoSamples ?? d.n8ao.aoSamples;
|
|
152
|
-
cfg.aoRadius = pp.n8ao.aoRadius ?? d.n8ao.aoRadius;
|
|
153
|
-
cfg.intensity = pp.n8ao.intensity ?? d.n8ao.intensity;
|
|
154
|
-
cfg.denoiseSamples = pp.n8ao.denoiseSamples ?? d.n8ao.denoiseSamples;
|
|
155
|
-
cfg.denoiseRadius = pp.n8ao.denoiseRadius ?? d.n8ao.denoiseRadius;
|
|
156
|
-
cfg.distanceFalloff = pp.n8ao.distanceFalloff ?? d.n8ao.distanceFalloff;
|
|
157
|
-
if (pp.n8ao.screenSpaceRadius !== undefined)
|
|
158
|
-
cfg.screenSpaceRadius = pp.n8ao.screenSpaceRadius;
|
|
159
|
-
if (pp.n8ao.halfRes !== undefined)
|
|
160
|
-
cfg.halfRes = pp.n8ao.halfRes;
|
|
161
|
-
if (pp.n8ao.color)
|
|
162
|
-
cfg.color = new THREE.Color(pp.n8ao.color);
|
|
163
|
-
composer.addPass(n8aoPass);
|
|
164
|
-
}
|
|
165
|
-
// ── Collect Effect instances ──────────────────────────────────────────
|
|
166
|
-
const effects = [];
|
|
167
|
-
// Anti-aliasing
|
|
168
|
-
if (pp?.smaa?.enabled) {
|
|
169
|
-
const preset = smaaPresets[pp.smaa.preset ?? d.smaa.preset] ?? SMAAPreset.HIGH;
|
|
170
|
-
effects.push(new SMAAEffect({ preset }));
|
|
171
|
-
}
|
|
172
|
-
// Ambient occlusion
|
|
173
|
-
if (pp?.ssao?.enabled && normalPass) {
|
|
174
|
-
effects.push(new SSAOEffect(camera, normalPass.texture, {
|
|
175
|
-
radius: pp.ssao.radius ?? d.ssao.radius,
|
|
176
|
-
intensity: pp.ssao.intensity ?? d.ssao.intensity,
|
|
177
|
-
bias: pp.ssao.bias ?? d.ssao.bias,
|
|
178
|
-
samples: pp.ssao.samples ?? d.ssao.samples,
|
|
179
|
-
rings: pp.ssao.rings ?? d.ssao.rings,
|
|
180
|
-
fade: pp.ssao.fade ?? d.ssao.fade,
|
|
181
|
-
...(pp.ssao.color ? { color: new THREE.Color(pp.ssao.color) } : {}),
|
|
182
|
-
}));
|
|
183
|
-
}
|
|
184
|
-
// SSR (realism-effects)
|
|
185
|
-
if (pp?.ssr?.enabled && velocityPass) {
|
|
186
|
-
effects.push(new SSREffect(scene, camera, velocityPass, {
|
|
187
|
-
intensity: pp.ssr.intensity ?? d.ssr.intensity,
|
|
188
|
-
exponent: pp.ssr.exponent ?? d.ssr.exponent,
|
|
189
|
-
distance: pp.ssr.distance ?? d.ssr.distance,
|
|
190
|
-
thickness: pp.ssr.thickness ?? d.ssr.thickness,
|
|
191
|
-
maxRoughness: pp.ssr.maxRoughness ?? d.ssr.maxRoughness,
|
|
192
|
-
}));
|
|
193
|
-
}
|
|
194
|
-
// SSGI (realism-effects)
|
|
195
|
-
if (pp?.ssgi?.enabled && velocityPass) {
|
|
196
|
-
effects.push(new SSGIEffect(scene, camera, velocityPass, {
|
|
197
|
-
intensity: pp.ssgi.intensity ?? d.ssgi.intensity,
|
|
198
|
-
distance: pp.ssgi.distance ?? d.ssgi.distance,
|
|
199
|
-
thickness: pp.ssgi.thickness ?? d.ssgi.thickness,
|
|
200
|
-
maxRoughness: pp.ssgi.maxRoughness ?? d.ssgi.maxRoughness,
|
|
201
|
-
}));
|
|
202
|
-
}
|
|
203
|
-
// Motion blur (realism-effects)
|
|
204
|
-
if (pp?.motionBlur?.enabled && velocityPass) {
|
|
205
|
-
effects.push(new MotionBlurEffect(velocityPass, {
|
|
206
|
-
intensity: pp.motionBlur.intensity ?? d.motionBlur.intensity,
|
|
207
|
-
jitter: pp.motionBlur.jitter ?? d.motionBlur.jitter,
|
|
208
|
-
samples: pp.motionBlur.samples ?? d.motionBlur.samples,
|
|
209
|
-
}));
|
|
210
|
-
}
|
|
211
|
-
// Bloom
|
|
212
|
-
if (pp?.bloom?.enabled) {
|
|
213
|
-
effects.push(new BloomEffect({
|
|
214
|
-
intensity: pp.bloom.intensity ?? d.bloom.intensity,
|
|
215
|
-
luminanceThreshold: pp.bloom.luminanceThreshold ?? d.bloom.luminanceThreshold,
|
|
216
|
-
luminanceSmoothing: pp.bloom.luminanceSmoothing ?? d.bloom.luminanceSmoothing,
|
|
217
|
-
}));
|
|
218
|
-
}
|
|
219
|
-
// Depth of field
|
|
220
|
-
if (pp?.depthOfField?.enabled) {
|
|
221
|
-
effects.push(new DepthOfFieldEffect(camera, {
|
|
222
|
-
worldFocusDistance: pp.depthOfField.worldFocusDistance ?? d.depthOfField.worldFocusDistance,
|
|
223
|
-
worldFocusRange: pp.depthOfField.worldFocusRange ?? d.depthOfField.worldFocusRange,
|
|
224
|
-
bokehScale: pp.depthOfField.bokehScale ?? d.depthOfField.bokehScale,
|
|
225
|
-
focalLength: pp.depthOfField.focalLength ?? d.depthOfField.focalLength,
|
|
226
|
-
}));
|
|
227
|
-
}
|
|
228
|
-
// Tilt shift
|
|
229
|
-
if (pp?.tiltShift?.enabled) {
|
|
230
|
-
effects.push(new TiltShiftEffect({
|
|
231
|
-
offset: pp.tiltShift.offset ?? d.tiltShift.offset,
|
|
232
|
-
rotation: pp.tiltShift.rotation ?? d.tiltShift.rotation,
|
|
233
|
-
focusArea: pp.tiltShift.focusArea ?? d.tiltShift.focusArea,
|
|
234
|
-
feather: pp.tiltShift.feather ?? d.tiltShift.feather,
|
|
235
|
-
}));
|
|
236
|
-
}
|
|
237
|
-
// God rays (needs entity reference)
|
|
238
|
-
if (pp?.godRays?.enabled && pp.godRays.sourceEntity && objectMap) {
|
|
239
|
-
const lightObj = objectMap.get(pp.godRays.sourceEntity);
|
|
240
|
-
if (lightObj instanceof THREE.Mesh || lightObj instanceof THREE.Points) {
|
|
241
|
-
effects.push(new GodRaysEffect(camera, lightObj, {
|
|
242
|
-
density: pp.godRays.density ?? d.godRays.density,
|
|
243
|
-
decay: pp.godRays.decay ?? d.godRays.decay,
|
|
244
|
-
weight: pp.godRays.weight ?? d.godRays.weight,
|
|
245
|
-
exposure: pp.godRays.exposure ?? d.godRays.exposure,
|
|
246
|
-
samples: pp.godRays.samples ?? d.godRays.samples,
|
|
247
|
-
}));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
// Outline (needs entity tag references)
|
|
251
|
-
if (pp?.outline?.enabled && objectMap) {
|
|
252
|
-
const outlineEffect = new OutlineEffect(scene, camera, {
|
|
253
|
-
edgeStrength: pp.outline.edgeStrength ?? d.outline.edgeStrength,
|
|
254
|
-
pulseSpeed: pp.outline.pulseSpeed ?? d.outline.pulseSpeed,
|
|
255
|
-
visibleEdgeColor: pp.outline.visibleEdgeColor
|
|
256
|
-
? new THREE.Color(pp.outline.visibleEdgeColor).getHex()
|
|
257
|
-
: new THREE.Color(d.outline.visibleEdgeColor).getHex(),
|
|
258
|
-
hiddenEdgeColor: pp.outline.hiddenEdgeColor
|
|
259
|
-
? new THREE.Color(pp.outline.hiddenEdgeColor).getHex()
|
|
260
|
-
: new THREE.Color(d.outline.hiddenEdgeColor).getHex(),
|
|
261
|
-
xRay: pp.outline.xRay ?? false,
|
|
262
|
-
});
|
|
263
|
-
// Add entities matching tags to selection
|
|
264
|
-
const tags = pp.outline.tags ?? [];
|
|
265
|
-
if (tags.length > 0 && entityTags) {
|
|
266
|
-
for (const [entityId, eTags] of entityTags) {
|
|
267
|
-
if (tags.some((t) => eTags.includes(t))) {
|
|
268
|
-
const obj = objectMap.get(entityId);
|
|
269
|
-
if (obj)
|
|
270
|
-
outlineEffect.selection.add(obj);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
effects.push(outlineEffect);
|
|
275
|
-
}
|
|
276
|
-
// Chromatic aberration
|
|
277
|
-
if (pp?.chromaticAberration?.enabled) {
|
|
278
|
-
effects.push(new ChromaticAberrationEffect({
|
|
279
|
-
offset: new THREE.Vector2(pp.chromaticAberration.offsetX ?? d.chromaticAberration.offsetX, pp.chromaticAberration.offsetY ?? d.chromaticAberration.offsetY),
|
|
280
|
-
radialModulation: pp.chromaticAberration.radialModulation ?? false,
|
|
281
|
-
modulationOffset: pp.chromaticAberration.modulationOffset ?? d.chromaticAberration.modulationOffset,
|
|
282
|
-
}));
|
|
283
|
-
}
|
|
284
|
-
// Lens distortion
|
|
285
|
-
if (pp?.lensDistortion?.enabled) {
|
|
286
|
-
effects.push(new LensDistortionEffect({
|
|
287
|
-
distortion: new THREE.Vector2(pp.lensDistortion.distortionX ?? d.lensDistortion.distortionX, pp.lensDistortion.distortionY ?? d.lensDistortion.distortionY),
|
|
288
|
-
principalPoint: new THREE.Vector2(0, 0),
|
|
289
|
-
focalLength: new THREE.Vector2(pp.lensDistortion.focalLengthX ?? d.lensDistortion.focalLengthX, pp.lensDistortion.focalLengthY ?? d.lensDistortion.focalLengthY),
|
|
290
|
-
skew: pp.lensDistortion.skew ?? d.lensDistortion.skew,
|
|
291
|
-
}));
|
|
292
|
-
}
|
|
293
|
-
// Shock wave
|
|
294
|
-
if (pp?.shockWave?.enabled) {
|
|
295
|
-
effects.push(new ShockWaveEffect(camera, new THREE.Vector3(pp.shockWave.positionX ?? 0, pp.shockWave.positionY ?? 0, pp.shockWave.positionZ ?? 0), {
|
|
296
|
-
speed: pp.shockWave.speed ?? d.shockWave.speed,
|
|
297
|
-
maxRadius: pp.shockWave.maxRadius ?? d.shockWave.maxRadius,
|
|
298
|
-
waveSize: pp.shockWave.waveSize ?? d.shockWave.waveSize,
|
|
299
|
-
amplitude: pp.shockWave.amplitude ?? d.shockWave.amplitude,
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
302
|
-
// Color adjustments
|
|
303
|
-
if (pp?.brightnessContrast?.enabled) {
|
|
304
|
-
effects.push(new BrightnessContrastEffect({
|
|
305
|
-
brightness: pp.brightnessContrast.brightness ?? d.brightnessContrast.brightness,
|
|
306
|
-
contrast: pp.brightnessContrast.contrast ?? d.brightnessContrast.contrast,
|
|
307
|
-
}));
|
|
308
|
-
}
|
|
309
|
-
if (pp?.hueSaturation?.enabled) {
|
|
310
|
-
effects.push(new HueSaturationEffect({
|
|
311
|
-
hue: pp.hueSaturation.hue ?? d.hueSaturation.hue,
|
|
312
|
-
saturation: pp.hueSaturation.saturation ?? d.hueSaturation.saturation,
|
|
313
|
-
}));
|
|
314
|
-
}
|
|
315
|
-
if (pp?.sepia?.enabled) {
|
|
316
|
-
effects.push(new SepiaEffect({ intensity: pp.sepia.intensity ?? d.sepia.intensity }));
|
|
317
|
-
}
|
|
318
|
-
if (pp?.colorDepth?.enabled) {
|
|
319
|
-
effects.push(new ColorDepthEffect({ bits: pp.colorDepth.bits ?? d.colorDepth.bits }));
|
|
320
|
-
}
|
|
321
|
-
// Film / retro
|
|
322
|
-
if (pp?.noise?.enabled) {
|
|
323
|
-
effects.push(new NoiseEffect({ premultiply: pp.noise.premultiply ?? d.noise.premultiply }));
|
|
324
|
-
}
|
|
325
|
-
if (pp?.scanline?.enabled) {
|
|
326
|
-
effects.push(new ScanlineEffect({ density: pp.scanline.density ?? d.scanline.density }));
|
|
327
|
-
}
|
|
328
|
-
if (pp?.dotScreen?.enabled) {
|
|
329
|
-
effects.push(new DotScreenEffect({
|
|
330
|
-
angle: pp.dotScreen.angle ?? d.dotScreen.angle,
|
|
331
|
-
scale: pp.dotScreen.scale ?? d.dotScreen.scale,
|
|
332
|
-
}));
|
|
333
|
-
}
|
|
334
|
-
if (pp?.grid?.enabled) {
|
|
335
|
-
effects.push(new GridEffect({
|
|
336
|
-
scale: pp.grid.scale ?? d.grid.scale,
|
|
337
|
-
lineWidth: pp.grid.lineWidth ?? d.grid.lineWidth,
|
|
338
|
-
}));
|
|
339
|
-
}
|
|
340
|
-
if (pp?.pixelation?.enabled) {
|
|
341
|
-
effects.push(new PixelationEffect(pp.pixelation.granularity ?? d.pixelation.granularity));
|
|
342
|
-
}
|
|
343
|
-
if (pp?.glitch?.enabled) {
|
|
344
|
-
effects.push(new GlitchEffect({
|
|
345
|
-
delay: new THREE.Vector2(pp.glitch.delayX ?? d.glitch.delayX, pp.glitch.delayY ?? d.glitch.delayY),
|
|
346
|
-
duration: new THREE.Vector2(pp.glitch.durationX ?? d.glitch.durationX, pp.glitch.durationY ?? d.glitch.durationY),
|
|
347
|
-
strength: new THREE.Vector2(pp.glitch.strengthX ?? d.glitch.strengthX, pp.glitch.strengthY ?? d.glitch.strengthY),
|
|
348
|
-
columns: pp.glitch.columns ?? d.glitch.columns,
|
|
349
|
-
ratio: pp.glitch.ratio ?? d.glitch.ratio,
|
|
350
|
-
}));
|
|
351
|
-
}
|
|
352
|
-
// Vignette (last color effect)
|
|
353
|
-
if (pp?.vignette?.enabled) {
|
|
354
|
-
effects.push(new VignetteEffect({
|
|
355
|
-
darkness: pp.vignette.darkness ?? d.vignette.darkness,
|
|
356
|
-
offset: pp.vignette.offset ?? d.vignette.offset,
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
// ── Merge all effects into a single EffectPass ────────────────────────
|
|
360
|
-
if (effects.length > 0) {
|
|
361
|
-
composer.addPass(new EffectPass(camera, ...effects));
|
|
362
|
-
}
|
|
363
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project tools — W4/W3 of `docs/DATA-TOOLS-DESIGN.md` (§3 contract).
|
|
3
|
-
*
|
|
4
|
-
* A project tool is ONE file, `src/tools/<name>.tool.tsx`, discovered by
|
|
5
|
-
* folder scan (same physics as data assets, §3.1: zero registration, delete
|
|
6
|
-
* the file → gone). The file exports exactly two things:
|
|
7
|
-
*
|
|
8
|
-
* ```tsx
|
|
9
|
-
* export const tool = defineTool({
|
|
10
|
-
* id: 'tuning', // stable slug — becomes the tab's test id
|
|
11
|
-
* title: 'Tuning', // the tab label (rendered after a ⚙ marker)
|
|
12
|
-
* placement: 'document', // project-global dashboard (§3.2; 'dock' = deprecated alias)
|
|
13
|
-
* });
|
|
14
|
-
* export default function Tuning() { … } // plain React
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* or, selection-scoped (W3 — §3.2's second placement):
|
|
18
|
-
*
|
|
19
|
-
* ```tsx
|
|
20
|
-
* export const tool = defineTool({
|
|
21
|
-
* id: 'spin',
|
|
22
|
-
* title: 'Spin',
|
|
23
|
-
* placement: 'inspector', // selection-scoped section
|
|
24
|
-
* match: (node) => node?.kind === 'mesh', // same contract as the
|
|
25
|
-
* }); // inspector-section registry
|
|
26
|
-
* export default function Spin({ node }: InspectorToolProps) { … }
|
|
27
|
-
* ```
|
|
28
|
-
*
|
|
29
|
-
* The editor renders dock tools as visually distinct tabs after a separator
|
|
30
|
-
* at the end of the bottom dock's tab row (§3.5); inspector tools render as
|
|
31
|
-
* a ⚙-marked section in the Inspector rail whenever `match` accepts the
|
|
32
|
-
* current selection. Both render inside an error boundary — a crashing tool
|
|
33
|
-
* never takes the editor down. Tools are EDITOR-ONLY: no game build bundles
|
|
34
|
-
* `src/tools/` (§4 — nothing in game code imports it), so dev/cheat surfaces
|
|
35
|
-
* can never leak into a tester serve.
|
|
36
|
-
*
|
|
37
|
-
* This module is deliberately react-free metadata (the engine core outside
|
|
38
|
-
* `src/react/` must not import react — `test/react-core-import-ban.test.ts`);
|
|
39
|
-
* the react-facing tool hooks live in `@engine/react/use-data`, and the
|
|
40
|
-
* editor-styled widget kit tools build panels from is `@editor/widgets`.
|
|
41
|
-
*/
|
|
42
|
-
import type { AuthoringAdapter, EditorNode } from '../adapter';
|
|
43
|
-
/**
|
|
44
|
-
* Tool placements. Since W0 of the editor workspace-shell program
|
|
45
|
-
* (docs/EDITOR-WORKSPACE-SHELL-TODO.md §7.2), placement describes MEANING,
|
|
46
|
-
* not a physical container:
|
|
47
|
-
*
|
|
48
|
-
* - `'document'` — a substantial project-global surface (tuning dashboard,
|
|
49
|
-
* table, graph) that belongs in the center workspace;
|
|
50
|
-
* - `'inspector'` — a selection-scoped section in the right Inspector rail;
|
|
51
|
-
* - `'utility'` — a transient output/debug surface for the bottom drawer;
|
|
52
|
-
* - `'dock'` — DEPRECATED physical compatibility alias. Existing dock tools
|
|
53
|
-
* remain in the bottom panel so projects do not lose the ability to tune
|
|
54
|
-
* them while watching the Game/Scene.
|
|
55
|
-
*
|
|
56
|
-
* Only an explicit `document` declaration replaces the center subject.
|
|
57
|
-
* `utility` and legacy `dock` remain in the bottom drawer. Deliberately
|
|
58
|
-
* still nothing else — no floating windows, no in-game overlay
|
|
59
|
-
* host (docs/DATA-TOOLS-DESIGN.md §3.2 "deliberately NOT built").
|
|
60
|
-
*/
|
|
61
|
-
export type ToolPlacement = 'document' | 'inspector' | 'utility' | 'dock';
|
|
62
|
-
/** The project-global (non-selection-scoped) placements. */
|
|
63
|
-
export type GlobalToolPlacement = 'document' | 'utility' | 'dock';
|
|
64
|
-
/**
|
|
65
|
-
* Compatibility means preserving behavior: legacy `'dock'` tools remain in
|
|
66
|
-
* the bottom panel. New tools choose `'document'`, `'utility'`, or
|
|
67
|
-
* `'inspector'` deliberately.
|
|
68
|
-
*/
|
|
69
|
-
export declare function normalizeToolPlacement(placement: ToolPlacement): 'document' | 'inspector' | 'utility';
|
|
70
|
-
/** Fields every tool declares — see {@link defineTool} for the contract. */
|
|
71
|
-
interface ToolConfigBase {
|
|
72
|
-
/**
|
|
73
|
-
* Stable slug for this tool: letters/digits/`-`/`_` only. It becomes the
|
|
74
|
-
* mount's `data-testid` (`bottom-tab-tool-<id>` for dock tools,
|
|
75
|
-
* `inspector-tool-<id>` for inspector tools), so keep it short and never
|
|
76
|
-
* rename it casually — automation and saved layouts key off it.
|
|
77
|
-
*/
|
|
78
|
-
id: string;
|
|
79
|
-
/** Human label: the dock tab text, or the inspector section's header,
|
|
80
|
-
* rendered after the ⚙ project-tool marker (§3.5). */
|
|
81
|
-
title: string;
|
|
82
|
-
}
|
|
83
|
-
/** A project-global tool (§3.2 W4; `'dock'` preserves its historical bottom
|
|
84
|
-
* placement through the `'utility'` compatibility normalization). */
|
|
85
|
-
export interface GlobalToolConfig extends ToolConfigBase {
|
|
86
|
-
placement: GlobalToolPlacement;
|
|
87
|
-
}
|
|
88
|
-
/** A selection-scoped Inspector section (§3.2, W3). */
|
|
89
|
-
export interface InspectorToolConfig extends ToolConfigBase {
|
|
90
|
-
placement: 'inspector';
|
|
91
|
-
/**
|
|
92
|
-
* When this section appears — the SAME contract as the editor's
|
|
93
|
-
* `inspector-section-registry`: called with the currently selected node
|
|
94
|
-
* (`null` in the no-selection/environment state) and the active authoring
|
|
95
|
-
* adapter; return `true` to render. Keep it cheap and pure — it runs on
|
|
96
|
-
* every inspector render. A `match` that throws is treated as `false`
|
|
97
|
-
* (with one console teaching error), never crashing the inspector.
|
|
98
|
-
*/
|
|
99
|
-
match: (node: EditorNode | null, adapter: AuthoringAdapter) => boolean;
|
|
100
|
-
}
|
|
101
|
-
/** Metadata for a project tool — a discriminated union on `placement`. */
|
|
102
|
-
export type ToolConfig = GlobalToolConfig | InspectorToolConfig;
|
|
103
|
-
/**
|
|
104
|
-
* Props the editor passes to an INSPECTOR tool's default-exported component
|
|
105
|
-
* (dock tools receive no props). Everything richer (live game store, field
|
|
106
|
-
* addresses) arrives through the §3.3 hooks, not through more props.
|
|
107
|
-
*/
|
|
108
|
-
export interface InspectorToolProps {
|
|
109
|
-
/** The selected node your `match` accepted (`null` in the no-selection
|
|
110
|
-
* state, if your `match` chose to accept it). */
|
|
111
|
-
node: EditorNode | null;
|
|
112
|
-
/** The selected node's stable id (`null` in the no-selection state). */
|
|
113
|
-
nodeId: string | null;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Validate and freeze a project tool's metadata (docs/DATA-TOOLS-DESIGN.md
|
|
117
|
-
* §3.1). Call it once at module scope of a `src/tools/<name>.tool.tsx` file
|
|
118
|
-
* and export the result as `tool`, next to a default-exported React
|
|
119
|
-
* component — the editor's folder scan picks the file up automatically.
|
|
120
|
-
*
|
|
121
|
-
* Fails loud (§6.5 "errors teach") on anything malformed rather than letting
|
|
122
|
-
* a half-shaped tool render confusingly: bad `id`/`title`, an unknown
|
|
123
|
-
* placement, an inspector tool without a callable `match`.
|
|
124
|
-
*
|
|
125
|
-
* The returned config is frozen: tool metadata is a definition, not state
|
|
126
|
-
* (the same immutability rule data assets follow, §2.1).
|
|
127
|
-
*/
|
|
128
|
-
export declare function defineTool(config: ToolConfig): Readonly<ToolConfig>;
|
|
129
|
-
export {};
|
|
130
|
-
//# sourceMappingURL=define-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define-tool.d.ts","sourceRoot":"","sources":["../../src/tools/define-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1E,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,aAAa,GACvB,UAAU,GAAG,WAAW,GAAG,SAAS,CAEtC;AAED,4EAA4E;AAC5E,UAAU,cAAc;IACtB;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;2DACuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;sEACsE;AACtE,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,SAAS,EAAE,WAAW,CAAC;IACvB;;;;;;;OAOG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC;CACxE;AAED,0EAA0E;AAC1E,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;sDACkD;IAClD,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,wEAAwE;IACxE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAyCnE"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project tools — W4/W3 of `docs/DATA-TOOLS-DESIGN.md` (§3 contract).
|
|
3
|
-
*
|
|
4
|
-
* A project tool is ONE file, `src/tools/<name>.tool.tsx`, discovered by
|
|
5
|
-
* folder scan (same physics as data assets, §3.1: zero registration, delete
|
|
6
|
-
* the file → gone). The file exports exactly two things:
|
|
7
|
-
*
|
|
8
|
-
* ```tsx
|
|
9
|
-
* export const tool = defineTool({
|
|
10
|
-
* id: 'tuning', // stable slug — becomes the tab's test id
|
|
11
|
-
* title: 'Tuning', // the tab label (rendered after a ⚙ marker)
|
|
12
|
-
* placement: 'document', // project-global dashboard (§3.2; 'dock' = deprecated alias)
|
|
13
|
-
* });
|
|
14
|
-
* export default function Tuning() { … } // plain React
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* or, selection-scoped (W3 — §3.2's second placement):
|
|
18
|
-
*
|
|
19
|
-
* ```tsx
|
|
20
|
-
* export const tool = defineTool({
|
|
21
|
-
* id: 'spin',
|
|
22
|
-
* title: 'Spin',
|
|
23
|
-
* placement: 'inspector', // selection-scoped section
|
|
24
|
-
* match: (node) => node?.kind === 'mesh', // same contract as the
|
|
25
|
-
* }); // inspector-section registry
|
|
26
|
-
* export default function Spin({ node }: InspectorToolProps) { … }
|
|
27
|
-
* ```
|
|
28
|
-
*
|
|
29
|
-
* The editor renders dock tools as visually distinct tabs after a separator
|
|
30
|
-
* at the end of the bottom dock's tab row (§3.5); inspector tools render as
|
|
31
|
-
* a ⚙-marked section in the Inspector rail whenever `match` accepts the
|
|
32
|
-
* current selection. Both render inside an error boundary — a crashing tool
|
|
33
|
-
* never takes the editor down. Tools are EDITOR-ONLY: no game build bundles
|
|
34
|
-
* `src/tools/` (§4 — nothing in game code imports it), so dev/cheat surfaces
|
|
35
|
-
* can never leak into a tester serve.
|
|
36
|
-
*
|
|
37
|
-
* This module is deliberately react-free metadata (the engine core outside
|
|
38
|
-
* `src/react/` must not import react — `test/react-core-import-ban.test.ts`);
|
|
39
|
-
* the react-facing tool hooks live in `@engine/react/use-data`, and the
|
|
40
|
-
* editor-styled widget kit tools build panels from is `@editor/widgets`.
|
|
41
|
-
*/
|
|
42
|
-
/**
|
|
43
|
-
* Compatibility means preserving behavior: legacy `'dock'` tools remain in
|
|
44
|
-
* the bottom panel. New tools choose `'document'`, `'utility'`, or
|
|
45
|
-
* `'inspector'` deliberately.
|
|
46
|
-
*/
|
|
47
|
-
export function normalizeToolPlacement(placement) {
|
|
48
|
-
return placement === 'dock' ? 'utility' : placement;
|
|
49
|
-
}
|
|
50
|
-
const TEMPLATE_EXAMPLE = 'the template worked example: src/tools/example.tool.tsx';
|
|
51
|
-
/** Teaching-error helper (§6.5): every rejection names the fix and cites the
|
|
52
|
-
* template example by path. */
|
|
53
|
-
function toolError(problem, fix) {
|
|
54
|
-
return new Error(`defineTool: ${problem} — ${fix} (see ${TEMPLATE_EXAMPLE}).`);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Validate and freeze a project tool's metadata (docs/DATA-TOOLS-DESIGN.md
|
|
58
|
-
* §3.1). Call it once at module scope of a `src/tools/<name>.tool.tsx` file
|
|
59
|
-
* and export the result as `tool`, next to a default-exported React
|
|
60
|
-
* component — the editor's folder scan picks the file up automatically.
|
|
61
|
-
*
|
|
62
|
-
* Fails loud (§6.5 "errors teach") on anything malformed rather than letting
|
|
63
|
-
* a half-shaped tool render confusingly: bad `id`/`title`, an unknown
|
|
64
|
-
* placement, an inspector tool without a callable `match`.
|
|
65
|
-
*
|
|
66
|
-
* The returned config is frozen: tool metadata is a definition, not state
|
|
67
|
-
* (the same immutability rule data assets follow, §2.1).
|
|
68
|
-
*/
|
|
69
|
-
export function defineTool(config) {
|
|
70
|
-
if (config === null || typeof config !== 'object') {
|
|
71
|
-
throw toolError('expected a config object', "call it as defineTool({ id, title, placement: 'document' })");
|
|
72
|
-
}
|
|
73
|
-
const { id, title, placement } = config;
|
|
74
|
-
if (placement !== 'document' &&
|
|
75
|
-
placement !== 'utility' &&
|
|
76
|
-
placement !== 'dock' &&
|
|
77
|
-
placement !== 'inspector') {
|
|
78
|
-
throw toolError(`unknown placement ${JSON.stringify(placement)}`, "the placements are 'document' (project-global center document), 'inspector' " +
|
|
79
|
-
"(selection-scoped section) and 'utility' (transient bottom-drawer output); " +
|
|
80
|
-
"'dock' remains accepted as a deprecated bottom-panel alias " +
|
|
81
|
-
'(docs/EDITOR-WORKSPACE-SHELL-TODO.md §7.2)');
|
|
82
|
-
}
|
|
83
|
-
if (typeof id !== 'string' || !/^[a-zA-Z0-9_-]+$/.test(id)) {
|
|
84
|
-
throw toolError(`invalid id ${JSON.stringify(id)}`, 'pass a non-empty slug of letters, digits, "-" or "_" — it becomes the tool\'s data-testid (bottom-tab-tool-<id> / inspector-tool-<id>)');
|
|
85
|
-
}
|
|
86
|
-
if (typeof title !== 'string' || title.trim() === '') {
|
|
87
|
-
throw toolError(`invalid title ${JSON.stringify(title)}`, 'pass a short human-readable label');
|
|
88
|
-
}
|
|
89
|
-
if (placement === 'inspector') {
|
|
90
|
-
if (typeof config.match !== 'function') {
|
|
91
|
-
throw toolError(`placement 'inspector' requires a match function (got ${JSON.stringify(config.match)})`, "pass match: (node) => boolean — e.g. match: (node) => node?.kind === 'mesh' — deciding which selections show this section");
|
|
92
|
-
}
|
|
93
|
-
return Object.freeze({ id, title, placement, match: config.match });
|
|
94
|
-
}
|
|
95
|
-
return Object.freeze({ id, title, placement });
|
|
96
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import type { Container } from 'pixi.js';
|
|
2
|
-
/**
|
|
3
|
-
* AuthoringAdapter-2D — the world2d analog of the editor AuthoringAdapter /
|
|
4
|
-
* IngestAuthoringAdapter, implemented DIRECTLY over a live PixiJS display tree
|
|
5
|
-
* (no fabricated Scene2D / SceneEntity — the anti-shim rule). Used by the editor to
|
|
6
|
-
* inspect + edit world2d entities (first-party OR an ingested unmodified game),
|
|
7
|
-
* with stable structural-path ids so edits re-bind after the tree rebuilds.
|
|
8
|
-
*/
|
|
9
|
-
export interface EditorNode2D {
|
|
10
|
-
id: string;
|
|
11
|
-
label: string;
|
|
12
|
-
kind: 'sprite' | 'animatedsprite' | 'text' | 'container' | string;
|
|
13
|
-
parentId: string | null;
|
|
14
|
-
childIds: string[];
|
|
15
|
-
}
|
|
16
|
-
export interface Transform2DValue {
|
|
17
|
-
position: [number, number];
|
|
18
|
-
rotation: number;
|
|
19
|
-
scale: [number, number];
|
|
20
|
-
}
|
|
21
|
-
export interface Property2D {
|
|
22
|
-
path: string;
|
|
23
|
-
label: string;
|
|
24
|
-
type: 'string' | 'number' | 'boolean' | 'vec2' | 'color';
|
|
25
|
-
value: unknown;
|
|
26
|
-
}
|
|
27
|
-
/** A persisted edit overlay keyed by structural-path id (the 2D analog of IngestOverlay). */
|
|
28
|
-
export interface Override2D {
|
|
29
|
-
label?: string;
|
|
30
|
-
alpha?: number;
|
|
31
|
-
position?: [number, number];
|
|
32
|
-
rotation?: number;
|
|
33
|
-
scale?: [number, number];
|
|
34
|
-
tint?: number;
|
|
35
|
-
visible?: boolean;
|
|
36
|
-
}
|
|
37
|
-
export type Overlay2D = Record<string, Override2D>;
|
|
38
|
-
export declare class AuthoringAdapter2D {
|
|
39
|
-
private readonly root;
|
|
40
|
-
private readonly byId;
|
|
41
|
-
private overlay;
|
|
42
|
-
private dirty;
|
|
43
|
-
constructor(root: Container, opts?: {
|
|
44
|
-
overlay?: Overlay2D;
|
|
45
|
-
});
|
|
46
|
-
/** Walk the live tree assigning deterministic structural-path ids, reapply overlay. */
|
|
47
|
-
refresh(): {
|
|
48
|
-
count: number;
|
|
49
|
-
sprites: number;
|
|
50
|
-
};
|
|
51
|
-
roots(): EditorNode2D[];
|
|
52
|
-
node(id: string): EditorNode2D | null;
|
|
53
|
-
displayObject(id: string): Container | null;
|
|
54
|
-
private toNode;
|
|
55
|
-
getTransform(id: string): Transform2DValue | null;
|
|
56
|
-
setTransform(id: string, t: Partial<Transform2DValue>): void;
|
|
57
|
-
properties(id: string): Property2D[];
|
|
58
|
-
set(id: string, path: string, value: unknown): void;
|
|
59
|
-
private applyOverride;
|
|
60
|
-
/**
|
|
61
|
-
* Re-apply a saved/external overlay onto the (already-walked) live tree, merging
|
|
62
|
-
* it into the in-memory overlay so a later `serializeOverlay()`/save preserves it
|
|
63
|
-
* and a later `refresh()` re-applies it again. Ids absent from the current tree
|
|
64
|
-
* are skipped (orphaned, not an error) — the 2D analog of
|
|
65
|
-
* `IngestAuthoringAdapter.applyOverlay` (T3.2 slice 3). Used both for the initial
|
|
66
|
-
* reload (constructor `opts.overlay`) and for `PersistenceProvider.applyExternal`
|
|
67
|
-
* (re-apply a changed overlay file without a full remount).
|
|
68
|
-
*/
|
|
69
|
-
applyOverlay(overlay: Overlay2D): {
|
|
70
|
-
applied: number;
|
|
71
|
-
orphaned: number;
|
|
72
|
-
};
|
|
73
|
-
isDirty(): boolean;
|
|
74
|
-
serializeOverlay(): Overlay2D;
|
|
75
|
-
/** Replace, rather than merge, overlay state after an exact history restore. */
|
|
76
|
-
replaceOverlay(overlay: Overlay2D): void;
|
|
77
|
-
/** Clear the dirty flag after a successful save (mirrors IngestAuthoringAdapter). */
|
|
78
|
-
markClean(): void;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=authoring-2d.d.ts.map
|