@aura3d/engine 1.4.5 → 1.5.1
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/README.md +95 -29
- package/dist/animation/Retargeting.d.ts +12 -0
- package/dist/animation/Retargeting.d.ts.map +1 -0
- package/dist/animation/Retargeting.js +19 -0
- package/dist/animation/Retargeting.js.map +1 -0
- package/dist/assets/GLTFLoader.d.ts +4 -0
- package/dist/assets/GLTFLoader.d.ts.map +1 -1
- package/dist/assets/GLTFLoader.js +39 -4
- package/dist/assets/GLTFLoader.js.map +1 -1
- package/dist/assets/GLTFRenderResources.d.ts +16 -0
- package/dist/assets/GLTFRenderResources.d.ts.map +1 -1
- package/dist/assets/GLTFRenderResources.js +42 -2
- package/dist/assets/GLTFRenderResources.js.map +1 -1
- package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.d.ts +6 -0
- package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.d.ts.map +1 -1
- package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.js +2 -1
- package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.js.map +1 -1
- package/dist/assets/index.d.ts +0 -1
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +0 -1
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/loaders/index.d.ts +0 -1
- package/dist/assets/loaders/index.d.ts.map +1 -1
- package/dist/assets/loaders/index.js +0 -1
- package/dist/assets/loaders/index.js.map +1 -1
- package/dist/aura3d-cli/asset-intent.d.ts +148 -0
- package/dist/aura3d-cli/asset-intent.d.ts.map +1 -0
- package/dist/aura3d-cli/asset-intent.js +145 -0
- package/dist/aura3d-cli/asset-intent.js.map +1 -0
- package/dist/aura3d-cli/asset-role-admission.d.ts +174 -0
- package/dist/aura3d-cli/asset-role-admission.d.ts.map +1 -0
- package/dist/aura3d-cli/asset-role-admission.js +381 -0
- package/dist/aura3d-cli/asset-role-admission.js.map +1 -0
- package/dist/aura3d-cli/asset-screening-effects.d.ts +95 -0
- package/dist/aura3d-cli/asset-screening-effects.d.ts.map +1 -0
- package/dist/aura3d-cli/asset-screening-effects.js +321 -0
- package/dist/aura3d-cli/asset-screening-effects.js.map +1 -0
- package/dist/aura3d-cli/asset-screening-pipeline.d.ts +132 -0
- package/dist/aura3d-cli/asset-screening-pipeline.d.ts.map +1 -0
- package/dist/aura3d-cli/asset-screening-pipeline.js +277 -0
- package/dist/aura3d-cli/asset-screening-pipeline.js.map +1 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts +15 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts.map +1 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.js +46 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.js.map +1 -0
- package/dist/aura3d-cli/cli-help.js +1 -1
- package/dist/aura3d-cli/cli.js +16 -2
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/index.d.ts +8 -0
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +390 -17
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge/search.d.ts +4 -0
- package/dist/aura3d-cli/pull-bridge/search.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge/search.js +22 -0
- package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge.d.ts +20 -5
- package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge.js +38 -1
- package/dist/aura3d-cli/pull-bridge.js.map +1 -1
- package/dist/controls/ControlState.d.ts +1 -1
- package/dist/controls/ControlState.d.ts.map +1 -1
- package/dist/controls/DragControls.d.ts +21 -1
- package/dist/controls/DragControls.d.ts.map +1 -1
- package/dist/controls/DragControls.js +24 -2
- package/dist/controls/DragControls.js.map +1 -1
- package/dist/controls/FirstPersonControls.d.ts +10 -1
- package/dist/controls/FirstPersonControls.d.ts.map +1 -1
- package/dist/controls/FirstPersonControls.js +18 -2
- package/dist/controls/FirstPersonControls.js.map +1 -1
- package/dist/controls/FlyControls.d.ts +42 -0
- package/dist/controls/FlyControls.d.ts.map +1 -1
- package/dist/controls/FlyControls.js +106 -3
- package/dist/controls/FlyControls.js.map +1 -1
- package/dist/controls/MapControls.d.ts +13 -0
- package/dist/controls/MapControls.d.ts.map +1 -1
- package/dist/controls/MapControls.js +40 -2
- package/dist/controls/MapControls.js.map +1 -1
- package/dist/controls/OrbitControls.d.ts +54 -0
- package/dist/controls/OrbitControls.d.ts.map +1 -1
- package/dist/controls/OrbitControls.js +133 -0
- package/dist/controls/OrbitControls.js.map +1 -1
- package/dist/controls/PointerLockControls.d.ts +12 -5
- package/dist/controls/PointerLockControls.d.ts.map +1 -1
- package/dist/controls/PointerLockControls.js +30 -11
- package/dist/controls/PointerLockControls.js.map +1 -1
- package/dist/controls/SelectionManager.d.ts +22 -1
- package/dist/controls/SelectionManager.d.ts.map +1 -1
- package/dist/controls/SelectionManager.js +64 -6
- package/dist/controls/SelectionManager.js.map +1 -1
- package/dist/controls/TransformControls.d.ts +135 -1
- package/dist/controls/TransformControls.d.ts.map +1 -1
- package/dist/controls/TransformControls.js +534 -10
- package/dist/controls/TransformControls.js.map +1 -1
- package/dist/controls/index.d.ts +7 -2
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +1 -1
- package/dist/controls/index.js.map +1 -1
- package/dist/create-aura3d/showcase-spec-game-geometry-extractor.d.ts +2 -0
- package/dist/create-aura3d/showcase-spec-game-geometry-extractor.d.ts.map +1 -1
- package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js +769 -42
- package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js.map +1 -1
- package/dist/create-aura3d/showcase-spec-game-template-evidence.d.ts.map +1 -1
- package/dist/create-aura3d/showcase-spec-game-template-evidence.js +22 -2
- package/dist/create-aura3d/showcase-spec-game-template-evidence.js.map +1 -1
- package/dist/create-aura3d/showcase-spec-replacement-candidates.js +26 -0
- package/dist/create-aura3d/showcase-spec-replacement-candidates.js.map +1 -1
- package/dist/ecs/components/MeshComponent.d.ts +5 -2
- package/dist/ecs/components/MeshComponent.d.ts.map +1 -1
- package/dist/ecs/components/MeshComponent.js.map +1 -1
- package/dist/editor-runtime/CartoonSceneEditor.d.ts +111 -0
- package/dist/editor-runtime/CartoonSceneEditor.d.ts.map +1 -0
- package/dist/editor-runtime/CartoonSceneEditor.js +285 -0
- package/dist/editor-runtime/CartoonSceneEditor.js.map +1 -0
- package/dist/editor-runtime/InteractiveTransformGizmo.d.ts +142 -0
- package/dist/editor-runtime/InteractiveTransformGizmo.d.ts.map +1 -0
- package/dist/editor-runtime/InteractiveTransformGizmo.js +468 -0
- package/dist/editor-runtime/InteractiveTransformGizmo.js.map +1 -0
- package/dist/editor-runtime/index.d.ts +2 -0
- package/dist/editor-runtime/index.d.ts.map +1 -1
- package/dist/editor-runtime/index.js +1 -0
- package/dist/editor-runtime/index.js.map +1 -1
- package/dist/engine/agent-api/ApplicationKits.d.ts +307 -0
- package/dist/engine/agent-api/ApplicationKits.d.ts.map +1 -0
- package/dist/engine/agent-api/ApplicationKits.js +650 -0
- package/dist/engine/agent-api/ApplicationKits.js.map +1 -0
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts +50 -0
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonAssetManifest.js +65 -0
- package/dist/engine/agent-api/CartoonAssetManifest.js.map +1 -0
- package/dist/engine/agent-api/CartoonDirector.d.ts +120 -0
- package/dist/engine/agent-api/CartoonDirector.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonDirector.js +432 -0
- package/dist/engine/agent-api/CartoonDirector.js.map +1 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.d.ts +51 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.js +79 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.js.map +1 -0
- package/dist/engine/agent-api/CartoonMotionQuality.d.ts +83 -0
- package/dist/engine/agent-api/CartoonMotionQuality.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonMotionQuality.js +128 -0
- package/dist/engine/agent-api/CartoonMotionQuality.js.map +1 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts +150 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonPerformance.js +345 -0
- package/dist/engine/agent-api/CartoonPerformance.js.map +1 -0
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts +143 -0
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonRenderQueue.js +410 -0
- package/dist/engine/agent-api/CartoonRenderQueue.js.map +1 -0
- package/dist/engine/agent-api/CartoonRouteProof.d.ts +112 -0
- package/dist/engine/agent-api/CartoonRouteProof.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonRouteProof.js +127 -0
- package/dist/engine/agent-api/CartoonRouteProof.js.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts +210 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.js +324 -0
- package/dist/engine/agent-api/CombatFrameData.js.map +1 -0
- package/dist/engine/agent-api/FocusSelection.d.ts +186 -0
- package/dist/engine/agent-api/FocusSelection.d.ts.map +1 -0
- package/dist/engine/agent-api/FocusSelection.js +436 -0
- package/dist/engine/agent-api/FocusSelection.js.map +1 -0
- package/dist/engine/agent-api/GameEvidence.d.ts +1 -0
- package/dist/engine/agent-api/GameEvidence.d.ts.map +1 -1
- package/dist/engine/agent-api/GameEvidence.js +1 -0
- package/dist/engine/agent-api/GameEvidence.js.map +1 -1
- package/dist/engine/agent-api/GameGenreKits.d.ts +43 -1
- package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
- package/dist/engine/agent-api/GameGenreKits.js +79 -13
- package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
- package/dist/engine/agent-api/GameRuntime.d.ts +1 -0
- package/dist/engine/agent-api/GameRuntime.d.ts.map +1 -1
- package/dist/engine/agent-api/GameRuntime.js +1 -0
- package/dist/engine/agent-api/GameRuntime.js.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts +22 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.js +9 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.js.map +1 -1
- package/dist/engine/agent-api/LayeredSceneComposition.d.ts +295 -0
- package/dist/engine/agent-api/LayeredSceneComposition.d.ts.map +1 -0
- package/dist/engine/agent-api/LayeredSceneComposition.js +387 -0
- package/dist/engine/agent-api/LayeredSceneComposition.js.map +1 -0
- package/dist/engine/agent-api/PlatformerMotion.d.ts +177 -0
- package/dist/engine/agent-api/PlatformerMotion.d.ts.map +1 -0
- package/dist/engine/agent-api/PlatformerMotion.js +207 -0
- package/dist/engine/agent-api/PlatformerMotion.js.map +1 -0
- package/dist/engine/agent-api/SceneGroundingUtils.d.ts +62 -0
- package/dist/engine/agent-api/SceneGroundingUtils.d.ts.map +1 -1
- package/dist/engine/agent-api/SceneGroundingUtils.js +37 -0
- package/dist/engine/agent-api/SceneGroundingUtils.js.map +1 -1
- package/dist/engine/agent-api/SceneQueries.d.ts +124 -0
- package/dist/engine/agent-api/SceneQueries.d.ts.map +1 -0
- package/dist/engine/agent-api/SceneQueries.js +221 -0
- package/dist/engine/agent-api/SceneQueries.js.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts +232 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.js +348 -0
- package/dist/engine/agent-api/SpatialAnchoring.js.map +1 -0
- package/dist/engine/agent-api/SubjectFramingUtils.d.ts +127 -0
- package/dist/engine/agent-api/SubjectFramingUtils.d.ts.map +1 -0
- package/dist/engine/agent-api/SubjectFramingUtils.js +126 -0
- package/dist/engine/agent-api/SubjectFramingUtils.js.map +1 -0
- package/dist/engine/agent-api/TouchControlBinding.d.ts +81 -0
- package/dist/engine/agent-api/TouchControlBinding.d.ts.map +1 -0
- package/dist/engine/agent-api/TouchControlBinding.js +116 -0
- package/dist/engine/agent-api/TouchControlBinding.js.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts +192 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.js +322 -0
- package/dist/engine/agent-api/VehicleChassis.js.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts +123 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.js +217 -0
- package/dist/engine/agent-api/VehicleDriverAi.js.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts +146 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js +331 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js.map +1 -0
- package/dist/engine/agent-api/index.d.ts +69 -0
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +633 -75
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/engine/production-runtime/GameRenderPreset.d.ts +32 -0
- package/dist/engine/production-runtime/GameRenderPreset.d.ts.map +1 -1
- package/dist/engine/production-runtime/GameRenderPreset.js +37 -2
- package/dist/engine/production-runtime/GameRenderPreset.js.map +1 -1
- package/dist/engine/production-runtime/TypedGLBActor.d.ts +8 -0
- package/dist/engine/production-runtime/TypedGLBActor.d.ts.map +1 -1
- package/dist/engine/production-runtime/TypedGLBActor.js +2 -1
- package/dist/engine/production-runtime/TypedGLBActor.js.map +1 -1
- package/dist/input/controls/PointerLockControls.d.ts +1 -1
- package/dist/input/controls/PointerLockControls.d.ts.map +1 -1
- package/dist/input/controls/PointerLockControls.js +12 -0
- package/dist/input/controls/PointerLockControls.js.map +1 -1
- package/dist/physics/Collider.d.ts +1 -1
- package/dist/physics/Collider.d.ts.map +1 -1
- package/dist/physics/Collider.js +2 -2
- package/dist/physics/Collider.js.map +1 -1
- package/dist/physics/CollisionEvents.d.ts +1 -0
- package/dist/physics/CollisionEvents.d.ts.map +1 -1
- package/dist/physics/CollisionEvents.js.map +1 -1
- package/dist/physics/NarrowPhase.d.ts +11 -0
- package/dist/physics/NarrowPhase.d.ts.map +1 -0
- package/dist/physics/NarrowPhase.js +565 -0
- package/dist/physics/NarrowPhase.js.map +1 -0
- package/dist/physics/PhysicsDebugDraw.js +19 -1
- package/dist/physics/PhysicsDebugDraw.js.map +1 -1
- package/dist/physics/PhysicsWorld.d.ts +43 -0
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +305 -30
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/RigidBody.d.ts +8 -1
- package/dist/physics/RigidBody.d.ts.map +1 -1
- package/dist/physics/RigidBody.js +32 -5
- package/dist/physics/RigidBody.js.map +1 -1
- package/dist/physics/Shape.d.ts +16 -2
- package/dist/physics/Shape.d.ts.map +1 -1
- package/dist/physics/Shape.js +93 -31
- package/dist/physics/Shape.js.map +1 -1
- package/dist/physics/TimeOfImpact.d.ts +15 -0
- package/dist/physics/TimeOfImpact.d.ts.map +1 -0
- package/dist/physics/TimeOfImpact.js +81 -0
- package/dist/physics/TimeOfImpact.js.map +1 -0
- package/dist/physics/index.d.ts +2 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +2 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/rendering/CascadedShadowMaps.d.ts +9 -1
- package/dist/rendering/CascadedShadowMaps.d.ts.map +1 -1
- package/dist/rendering/CascadedShadowMaps.js +68 -0
- package/dist/rendering/CascadedShadowMaps.js.map +1 -1
- package/dist/rendering/ClusteredForwardLighting.d.ts +28 -0
- package/dist/rendering/ClusteredForwardLighting.d.ts.map +1 -0
- package/dist/rendering/ClusteredForwardLighting.js +156 -0
- package/dist/rendering/ClusteredForwardLighting.js.map +1 -0
- package/dist/rendering/DepthPass.d.ts +14 -1
- package/dist/rendering/DepthPass.d.ts.map +1 -1
- package/dist/rendering/DepthPass.js +19 -4
- package/dist/rendering/DepthPass.js.map +1 -1
- package/dist/rendering/EnvironmentMapResources.d.ts +59 -1
- package/dist/rendering/EnvironmentMapResources.d.ts.map +1 -1
- package/dist/rendering/EnvironmentMapResources.js +140 -100
- package/dist/rendering/EnvironmentMapResources.js.map +1 -1
- package/dist/rendering/EnvironmentPlatform.d.ts +3 -2
- package/dist/rendering/EnvironmentPlatform.d.ts.map +1 -1
- package/dist/rendering/EnvironmentPlatform.js +99 -44
- package/dist/rendering/EnvironmentPlatform.js.map +1 -1
- package/dist/rendering/ForwardPass.d.ts +37 -0
- package/dist/rendering/ForwardPass.d.ts.map +1 -1
- package/dist/rendering/ForwardPass.js +234 -7
- package/dist/rendering/ForwardPass.js.map +1 -1
- package/dist/rendering/Geometry.d.ts +19 -0
- package/dist/rendering/Geometry.d.ts.map +1 -1
- package/dist/rendering/Geometry.js +64 -0
- package/dist/rendering/Geometry.js.map +1 -1
- package/dist/rendering/IBL.d.ts.map +1 -1
- package/dist/rendering/IBL.js +0 -1
- package/dist/rendering/IBL.js.map +1 -1
- package/dist/rendering/LightCollector.d.ts +5 -1
- package/dist/rendering/LightCollector.d.ts.map +1 -1
- package/dist/rendering/LightCollector.js +16 -3
- package/dist/rendering/LightCollector.js.map +1 -1
- package/dist/rendering/LightUniforms.d.ts +26 -1
- package/dist/rendering/LightUniforms.d.ts.map +1 -1
- package/dist/rendering/LightUniforms.js +140 -8
- package/dist/rendering/LightUniforms.js.map +1 -1
- package/dist/rendering/LightingRig.d.ts +77 -0
- package/dist/rendering/LightingRig.d.ts.map +1 -1
- package/dist/rendering/LightingRig.js +100 -11
- package/dist/rendering/LightingRig.js.map +1 -1
- package/dist/rendering/MeshConsolidation.d.ts +63 -0
- package/dist/rendering/MeshConsolidation.d.ts.map +1 -0
- package/dist/rendering/MeshConsolidation.js +251 -0
- package/dist/rendering/MeshConsolidation.js.map +1 -0
- package/dist/rendering/PMREM.d.ts +13 -1
- package/dist/rendering/PMREM.d.ts.map +1 -1
- package/dist/rendering/PMREM.js +18 -4
- package/dist/rendering/PMREM.js.map +1 -1
- package/dist/rendering/PostProcessPass.d.ts +24 -2
- package/dist/rendering/PostProcessPass.d.ts.map +1 -1
- package/dist/rendering/PostProcessPass.js +136 -18
- package/dist/rendering/PostProcessPass.js.map +1 -1
- package/dist/rendering/PrimitiveSubmissionAudit.d.ts +195 -0
- package/dist/rendering/PrimitiveSubmissionAudit.d.ts.map +1 -0
- package/dist/rendering/PrimitiveSubmissionAudit.js +280 -0
- package/dist/rendering/PrimitiveSubmissionAudit.js.map +1 -0
- package/dist/rendering/ProductTurntableFixtures.d.ts.map +1 -1
- package/dist/rendering/ProductTurntableFixtures.js +93 -13
- package/dist/rendering/ProductTurntableFixtures.js.map +1 -1
- package/dist/rendering/ReflectionProbe.d.ts +59 -0
- package/dist/rendering/ReflectionProbe.d.ts.map +1 -1
- package/dist/rendering/ReflectionProbe.js +224 -0
- package/dist/rendering/ReflectionProbe.js.map +1 -1
- package/dist/rendering/ReflectionSurfaces.d.ts +4 -2
- package/dist/rendering/ReflectionSurfaces.d.ts.map +1 -1
- package/dist/rendering/ReflectionSurfaces.js +13 -8
- package/dist/rendering/ReflectionSurfaces.js.map +1 -1
- package/dist/rendering/RenderBackend.d.ts +1 -1
- package/dist/rendering/RenderBackend.d.ts.map +1 -1
- package/dist/rendering/RenderBackend.js +5 -1
- package/dist/rendering/RenderBackend.js.map +1 -1
- package/dist/rendering/RenderDevice.d.ts +13 -2
- package/dist/rendering/RenderDevice.d.ts.map +1 -1
- package/dist/rendering/RenderDevice.js +5 -2
- package/dist/rendering/RenderDevice.js.map +1 -1
- package/dist/rendering/Renderer.d.ts +41 -1
- package/dist/rendering/Renderer.d.ts.map +1 -1
- package/dist/rendering/Renderer.js +406 -61
- package/dist/rendering/Renderer.js.map +1 -1
- package/dist/rendering/RendererPostprocessPlan.d.ts +10 -3
- package/dist/rendering/RendererPostprocessPlan.d.ts.map +1 -1
- package/dist/rendering/RendererPostprocessPlan.js +25 -5
- package/dist/rendering/RendererPostprocessPlan.js.map +1 -1
- package/dist/rendering/RendererVisualPipelineReport.d.ts +3 -2
- package/dist/rendering/RendererVisualPipelineReport.d.ts.map +1 -1
- package/dist/rendering/RendererVisualPipelineReport.js +2 -0
- package/dist/rendering/RendererVisualPipelineReport.js.map +1 -1
- package/dist/rendering/ScreenSpaceLineMaterial.d.ts +34 -0
- package/dist/rendering/ScreenSpaceLineMaterial.d.ts.map +1 -0
- package/dist/rendering/ScreenSpaceLineMaterial.js +93 -0
- package/dist/rendering/ScreenSpaceLineMaterial.js.map +1 -0
- package/dist/rendering/ShaderChunks.d.ts +7 -0
- package/dist/rendering/ShaderChunks.d.ts.map +1 -1
- package/dist/rendering/ShaderChunks.js +137 -0
- package/dist/rendering/ShaderChunks.js.map +1 -1
- package/dist/rendering/ShaderLibrary.d.ts +17 -0
- package/dist/rendering/ShaderLibrary.d.ts.map +1 -1
- package/dist/rendering/ShaderLibrary.js +940 -98
- package/dist/rendering/ShaderLibrary.js.map +1 -1
- package/dist/rendering/ShadowPass.d.ts +10 -0
- package/dist/rendering/ShadowPass.d.ts.map +1 -1
- package/dist/rendering/ShadowPass.js +8 -1
- package/dist/rendering/ShadowPass.js.map +1 -1
- package/dist/rendering/SkinnedLitMaterial.d.ts +6 -0
- package/dist/rendering/SkinnedLitMaterial.d.ts.map +1 -1
- package/dist/rendering/SkinnedLitMaterial.js +22 -8
- package/dist/rendering/SkinnedLitMaterial.js.map +1 -1
- package/dist/rendering/SkinnedUnlitMaterial.d.ts +8 -0
- package/dist/rendering/SkinnedUnlitMaterial.d.ts.map +1 -1
- package/dist/rendering/SkinnedUnlitMaterial.js +26 -9
- package/dist/rendering/SkinnedUnlitMaterial.js.map +1 -1
- package/dist/rendering/SpecularPrefilter.d.ts +42 -0
- package/dist/rendering/SpecularPrefilter.d.ts.map +1 -0
- package/dist/rendering/SpecularPrefilter.js +480 -0
- package/dist/rendering/SpecularPrefilter.js.map +1 -0
- package/dist/rendering/TerrainFixtures.d.ts +24 -0
- package/dist/rendering/TerrainFixtures.d.ts.map +1 -1
- package/dist/rendering/TerrainFixtures.js +96 -0
- package/dist/rendering/TerrainFixtures.js.map +1 -1
- package/dist/rendering/Texture.d.ts +7 -0
- package/dist/rendering/Texture.d.ts.map +1 -1
- package/dist/rendering/Texture.js +9 -0
- package/dist/rendering/Texture.js.map +1 -1
- package/dist/rendering/VertexFormat.d.ts +34 -1
- package/dist/rendering/VertexFormat.d.ts.map +1 -1
- package/dist/rendering/VertexFormat.js +61 -0
- package/dist/rendering/VertexFormat.js.map +1 -1
- package/dist/rendering/WebGL2Device.d.ts +48 -0
- package/dist/rendering/WebGL2Device.d.ts.map +1 -1
- package/dist/rendering/WebGL2Device.js +1298 -44
- package/dist/rendering/WebGL2Device.js.map +1 -1
- package/dist/rendering/WebGPUDevice.d.ts +7 -2
- package/dist/rendering/WebGPUDevice.d.ts.map +1 -1
- package/dist/rendering/WebGPUDevice.js +111 -17
- package/dist/rendering/WebGPUDevice.js.map +1 -1
- package/dist/rendering/WebGPUSkinningLimits.d.ts +14 -0
- package/dist/rendering/WebGPUSkinningLimits.d.ts.map +1 -0
- package/dist/rendering/WebGPUSkinningLimits.js +14 -0
- package/dist/rendering/WebGPUSkinningLimits.js.map +1 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts +19 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.js +13 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.js.map +1 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.d.ts +36 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.js +23 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.js.map +1 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.d.ts +130 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.js +303 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.js.map +1 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.d.ts +28 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.js +39 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.js.map +1 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts +79 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts.map +1 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.js +88 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.js.map +1 -0
- package/dist/rendering/cartoon/index.d.ts +6 -0
- package/dist/rendering/cartoon/index.d.ts.map +1 -0
- package/dist/rendering/cartoon/index.js +6 -0
- package/dist/rendering/cartoon/index.js.map +1 -0
- package/dist/rendering/index.d.ts +26 -15
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +15 -9
- package/dist/rendering/index.js.map +1 -1
- package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts +93 -0
- package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts.map +1 -0
- package/dist/rendering/postprocess/NativeLdrEffectLuts.js +202 -0
- package/dist/rendering/postprocess/NativeLdrEffectLuts.js.map +1 -0
- package/dist/rendering/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
- package/dist/rendering/production-runtime/PBRHDRPipeline.js +3 -0
- package/dist/rendering/production-runtime/PBRHDRPipeline.js.map +1 -1
- package/dist/rendering/production-runtime/ProductionRendererTypes.d.ts +1 -0
- package/dist/rendering/production-runtime/ProductionRendererTypes.d.ts.map +1 -1
- package/dist/rendering/production-runtime/ProductionRendererTypes.js.map +1 -1
- package/dist/rendering/production-runtime/ProductionWebGL2Renderer.d.ts.map +1 -1
- package/dist/rendering/production-runtime/ProductionWebGL2Renderer.js +5 -3
- package/dist/rendering/production-runtime/ProductionWebGL2Renderer.js.map +1 -1
- package/dist/rendering/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
- package/dist/rendering/production-runtime/ProductionWebGPURenderer.js +9 -5
- package/dist/rendering/production-runtime/ProductionWebGPURenderer.js.map +1 -1
- package/dist/rendering/production-runtime/TransmissionBackdropCapture.d.ts +5 -0
- package/dist/rendering/production-runtime/TransmissionBackdropCapture.d.ts.map +1 -1
- package/dist/rendering/production-runtime/TransmissionBackdropCapture.js +40 -0
- package/dist/rendering/production-runtime/TransmissionBackdropCapture.js.map +1 -1
- package/dist/rendering/production-runtime/environment/HDRLoader.d.ts +6 -0
- package/dist/rendering/production-runtime/environment/HDRLoader.d.ts.map +1 -1
- package/dist/rendering/production-runtime/environment/HDRLoader.js +19 -0
- package/dist/rendering/production-runtime/environment/HDRLoader.js.map +1 -1
- package/dist/rendering/production-runtime/index.d.ts +3 -1
- package/dist/rendering/production-runtime/index.d.ts.map +1 -1
- package/dist/rendering/production-runtime/index.js +1 -0
- package/dist/rendering/production-runtime/index.js.map +1 -1
- package/dist/scene/Light.d.ts +1 -1
- package/dist/scene/Light.d.ts.map +1 -1
- package/dist/scene/RectAreaLight.d.ts +22 -0
- package/dist/scene/RectAreaLight.d.ts.map +1 -0
- package/dist/scene/RectAreaLight.js +46 -0
- package/dist/scene/RectAreaLight.js.map +1 -0
- package/dist/scene/Scene.d.ts +6 -1
- package/dist/scene/Scene.d.ts.map +1 -1
- package/dist/scene/Scene.js +8 -1
- package/dist/scene/Scene.js.map +1 -1
- package/dist/scene/SceneSerializer.d.ts +3 -1
- package/dist/scene/SceneSerializer.d.ts.map +1 -1
- package/dist/scene/SceneSerializer.js +14 -7
- package/dist/scene/SceneSerializer.js.map +1 -1
- package/dist/scene/index.d.ts +1 -0
- package/dist/scene/index.d.ts.map +1 -1
- package/dist/scene/index.js +1 -0
- package/dist/scene/index.js.map +1 -1
- package/dist/scripting/CartoonNodeCategories.d.ts +3 -0
- package/dist/scripting/CartoonNodeCategories.d.ts.map +1 -0
- package/dist/scripting/CartoonNodeCategories.js +9 -0
- package/dist/scripting/CartoonNodeCategories.js.map +1 -0
- package/dist/scripting/CartoonVisualNodes.d.ts +3 -0
- package/dist/scripting/CartoonVisualNodes.d.ts.map +1 -0
- package/dist/scripting/CartoonVisualNodes.js +41 -0
- package/dist/scripting/CartoonVisualNodes.js.map +1 -0
- package/package.json +131 -114
- package/templates/production-asset-inspector/README.md +5 -0
- package/templates/production-asset-inspector/asset-manifest.json +9 -0
- package/templates/production-asset-inspector/index.html +2 -0
- package/templates/production-asset-inspector/package.json +17 -0
- package/templates/production-asset-inspector/src/main.ts +16 -0
- package/templates/production-material-studio/README.md +5 -0
- package/templates/production-material-studio/asset-manifest.json +9 -0
- package/templates/production-material-studio/index.html +2 -0
- package/templates/production-material-studio/package.json +17 -0
- package/templates/production-material-studio/src/main.ts +16 -0
- package/templates/production-product-configurator/README.md +5 -0
- package/templates/production-product-configurator/asset-manifest.json +9 -0
- package/templates/production-product-configurator/index.html +2 -0
- package/templates/production-product-configurator/package.json +17 -0
- package/templates/production-product-configurator/src/main.ts +16 -0
- package/templates/production-product-viewer/README.md +7 -0
- package/templates/production-product-viewer/asset-manifest.json +8 -0
- package/templates/production-product-viewer/index.html +26 -0
- package/templates/production-product-viewer/package.json +17 -0
- package/templates/production-product-viewer/src/main.ts +70 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable depth-layered environment composition.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* Skyline Runner reads as a clean prototype rather than a game, and the measured reason is
|
|
7
|
+
* composition, not asset quality: in the retained route-primary frame a single flat sky bucket covers
|
|
8
|
+
* **44.3%** of the scene viewport, and flat sky plus flat ground together cover **24.9%** even after
|
|
9
|
+
* quantisation, with the playable content compressed into one horizontal band. There is no
|
|
10
|
+
* foreground, no middle distance, and no atmospheric separation -- so every element reads at the same
|
|
11
|
+
* apparent depth and the frame has no hierarchy.
|
|
12
|
+
*
|
|
13
|
+
* The instinct is to hand-place more props in the route. That is exactly what produced 30,141 lines of
|
|
14
|
+
* route-local visual code across four showcase games against 3,072 reusable lines. Skyline needs the
|
|
15
|
+
* *capability*, not the placements: a route should declare depth layers, density targets and spacing
|
|
16
|
+
* constraints, and reusable code should produce a deterministic composition from them.
|
|
17
|
+
*
|
|
18
|
+
* ## What this module does and does not do
|
|
19
|
+
*
|
|
20
|
+
* It is a pure **placement planner**. It consumes a declarative spec and returns typed placements with
|
|
21
|
+
* layer identity, depth, scale and a variation seed. It deliberately does not construct scene nodes,
|
|
22
|
+
* reference any renderer type, or know about Skyline, platformers, or any specific asset -- so the same
|
|
23
|
+
* planner serves racing set dressing, city blocks, or arena surrounds.
|
|
24
|
+
*
|
|
25
|
+
* Determinism is a hard requirement, not a convenience: retained screenshot evidence is only
|
|
26
|
+
* comparable if the same spec yields byte-identical placements. Placement therefore uses an explicit
|
|
27
|
+
* seeded PRNG, never `Math.random`.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Plan a deterministic layered composition.
|
|
31
|
+
*
|
|
32
|
+
* Placement is rejection-sampled against `minSpacing` and `protectedZones` rather than nudged, because
|
|
33
|
+
* nudging a rejected placement biases props toward zone edges and produces visible clumping at exactly
|
|
34
|
+
* the boundaries gameplay cares about.
|
|
35
|
+
*/
|
|
36
|
+
export function planLayeredSceneComposition(spec) {
|
|
37
|
+
const densityScale = positiveOr(spec.densityScale, 1);
|
|
38
|
+
const placements = [];
|
|
39
|
+
const layerReports = [];
|
|
40
|
+
// One stream per layer, seeded from the spec seed and the layer index, so adding or removing a
|
|
41
|
+
// layer cannot reshuffle the layers before it.
|
|
42
|
+
for (const [layerIndex, layer] of spec.layers.entries()) {
|
|
43
|
+
const random = createSeededRandom(spec.seed + layerIndex * 0x9e37);
|
|
44
|
+
const span = normalizedRange(layer.span);
|
|
45
|
+
const spanWidth = Math.max(0, span[1] - span[0]);
|
|
46
|
+
const requested = Math.max(0, Math.round(spanWidth * Math.max(0, layer.densityPerUnit) * densityScale));
|
|
47
|
+
const candidates = weightedPropKinds(layer.props);
|
|
48
|
+
const heightRange = normalizedRange(layer.heightRange ?? [0, 0]);
|
|
49
|
+
const scaleRange = normalizedRange(layer.scaleRange);
|
|
50
|
+
const minSpacing = Math.max(0, layer.minSpacing ?? 0);
|
|
51
|
+
const atmosphere = clamp01(layer.atmosphere ?? 0);
|
|
52
|
+
const zones = (spec.protectedZones ?? []).filter((zone) => !zone.roles || zone.roles.includes(layer.role));
|
|
53
|
+
const placedXs = [];
|
|
54
|
+
let rejectedForSpacing = 0;
|
|
55
|
+
let rejectedForProtectedZone = 0;
|
|
56
|
+
const usedProps = new Set();
|
|
57
|
+
if (candidates.length > 0 && requested > 0 && spanWidth > 0) {
|
|
58
|
+
// Bounded attempts: a dense layer inside a tight span can be genuinely unsatisfiable, and a
|
|
59
|
+
// planner must degrade to fewer props rather than loop forever.
|
|
60
|
+
const maxAttempts = requested * 12 + 24;
|
|
61
|
+
for (let attempt = 0; attempt < maxAttempts && placedXs.length < requested; attempt += 1) {
|
|
62
|
+
const x = round4(span[0] + random() * spanWidth);
|
|
63
|
+
if (zones.some((zone) => withinRange(x, normalizedRange(zone.span)))) {
|
|
64
|
+
rejectedForProtectedZone += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (minSpacing > 0 && placedXs.some((existing) => Math.abs(existing - x) < minSpacing)) {
|
|
68
|
+
rejectedForSpacing += 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const kind = pickWeighted(candidates, random());
|
|
72
|
+
const baseScale = scaleRange[0] + random() * (scaleRange[1] - scaleRange[0]);
|
|
73
|
+
placedXs.push(x);
|
|
74
|
+
usedProps.add(kind.id);
|
|
75
|
+
placements.push({
|
|
76
|
+
layer: layer.role,
|
|
77
|
+
prop: kind.id,
|
|
78
|
+
x,
|
|
79
|
+
y: round4(heightRange[0] + random() * (heightRange[1] - heightRange[0])),
|
|
80
|
+
z: round4(layer.depth),
|
|
81
|
+
scale: round4(baseScale * positiveOr(kind.scaleBias, 1)),
|
|
82
|
+
// Full-circle yaw variation: repeated props are the main source of visible cloning.
|
|
83
|
+
rotationY: round4(random() * Math.PI * 2),
|
|
84
|
+
variation: round4(random()),
|
|
85
|
+
atmosphere
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
layerReports.push({
|
|
90
|
+
role: layer.role,
|
|
91
|
+
depth: round4(layer.depth),
|
|
92
|
+
requested,
|
|
93
|
+
placed: placedXs.length,
|
|
94
|
+
rejectedForSpacing,
|
|
95
|
+
rejectedForProtectedZone,
|
|
96
|
+
distinctProps: usedProps.size,
|
|
97
|
+
atmosphere
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
kind: "aura-layered-scene-composition",
|
|
102
|
+
seed: spec.seed,
|
|
103
|
+
placements,
|
|
104
|
+
layers: layerReports,
|
|
105
|
+
populatedRoles: layerReports.filter((report) => report.placed > 0).map((report) => report.role)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function platformerCompositionSpec(options) {
|
|
109
|
+
const span = normalizedRange(options.span);
|
|
110
|
+
const width = Math.max(0.001, span[1] - span[0]);
|
|
111
|
+
return {
|
|
112
|
+
seed: options.seed,
|
|
113
|
+
...(options.densityScale !== undefined ? { densityScale: options.densityScale } : {}),
|
|
114
|
+
...(options.protectedZones ? { protectedZones: options.protectedZones } : {}),
|
|
115
|
+
layers: [
|
|
116
|
+
{
|
|
117
|
+
// Nearest band, in front of the play plane. Sparse and large: it frames the shot and creates
|
|
118
|
+
// parallax without ever occluding gameplay, which is why its density is the lowest.
|
|
119
|
+
//
|
|
120
|
+
// Density is per *unit*, so a level whose visible window is only a fraction of its full span
|
|
121
|
+
// gets very few near props in frame. `0.5` keeps a near band present at typical side-scroller
|
|
122
|
+
// camera distances; the earlier `0.12` produced two props across the whole level, both of which
|
|
123
|
+
// fell outside the camera's view of the start area.
|
|
124
|
+
role: "foreground",
|
|
125
|
+
depth: options.gameplayDepth + width * 0.06,
|
|
126
|
+
span,
|
|
127
|
+
props: options.foregroundProps,
|
|
128
|
+
densityPerUnit: 0.28,
|
|
129
|
+
scaleRange: [0.9, 1.4],
|
|
130
|
+
minSpacing: width * 0.07,
|
|
131
|
+
heightRange: [-0.05, 0.05],
|
|
132
|
+
atmosphere: 0
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
// The layer Skyline is missing entirely. Densest of the set: middle distance is what makes a
|
|
136
|
+
// frame read as a populated world rather than props on an empty plane.
|
|
137
|
+
role: "midground",
|
|
138
|
+
depth: options.gameplayDepth - width * 0.1,
|
|
139
|
+
span: [span[0] - width * 0.08, span[1] + width * 0.08],
|
|
140
|
+
props: options.midgroundProps,
|
|
141
|
+
densityPerUnit: 1.0,
|
|
142
|
+
scaleRange: [0.55, 0.95],
|
|
143
|
+
minSpacing: width * 0.012,
|
|
144
|
+
heightRange: [-0.1, 0.25],
|
|
145
|
+
atmosphere: 0.35
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
// Far silhouettes. Heavily attenuated so they separate from the midground by value rather
|
|
149
|
+
// than by detail, which is what stops a low-poly asset set reading as flat.
|
|
150
|
+
role: "far-background",
|
|
151
|
+
depth: options.gameplayDepth - width * 0.34,
|
|
152
|
+
span: [span[0] - width * 0.2, span[1] + width * 0.2],
|
|
153
|
+
props: options.backgroundProps,
|
|
154
|
+
densityPerUnit: 0.5,
|
|
155
|
+
scaleRange: [1.1, 2.2],
|
|
156
|
+
minSpacing: width * 0.03,
|
|
157
|
+
heightRange: [-0.2, 0.5],
|
|
158
|
+
atmosphere: 0.72
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Measure how much of a frame is flat, unbroken sky or ground.
|
|
165
|
+
*
|
|
166
|
+
* Skyline's core defect is measurable and therefore gateable. This computes the dominant-flat-region
|
|
167
|
+
* fraction so a composition change can be held to a documented threshold instead of an opinion.
|
|
168
|
+
*/
|
|
169
|
+
export function measureFlatRegionFraction(pixels, width, height, options = {}) {
|
|
170
|
+
const channels = options.channels ?? 4;
|
|
171
|
+
const shift = Math.max(0, Math.min(7, options.quantiseBits ?? 4));
|
|
172
|
+
const total = Math.max(1, width * height);
|
|
173
|
+
const counts = new Map();
|
|
174
|
+
for (let index = 0; index + channels - 1 < pixels.length; index += channels) {
|
|
175
|
+
const r = (pixels[index] ?? 0) >> shift;
|
|
176
|
+
const g = (pixels[index + 1] ?? 0) >> shift;
|
|
177
|
+
const b = (pixels[index + 2] ?? 0) >> shift;
|
|
178
|
+
const key = (r << 16) | (g << 8) | b;
|
|
179
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
180
|
+
}
|
|
181
|
+
const sorted = [...counts.values()].sort((a, b) => b - a);
|
|
182
|
+
const dominant = sorted[0] ?? 0;
|
|
183
|
+
// Flat region = the two largest buckets, which for an outdoor frame are sky and ground.
|
|
184
|
+
const flat = dominant + (sorted[1] ?? 0);
|
|
185
|
+
return {
|
|
186
|
+
flatFraction: round4(flat / total),
|
|
187
|
+
dominantBucketFraction: round4(dominant / total),
|
|
188
|
+
distinctBuckets: counts.size
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Small deterministic PRNG (mulberry32).
|
|
193
|
+
*
|
|
194
|
+
* Chosen over any ambient randomness because retained screenshot evidence must be reproducible: the
|
|
195
|
+
* same spec has to yield identical placements on every machine and every run.
|
|
196
|
+
*/
|
|
197
|
+
function createSeededRandom(seed) {
|
|
198
|
+
let state = (seed | 0) + 0x6d2b79f5;
|
|
199
|
+
return () => {
|
|
200
|
+
state = (state + 0x6d2b79f5) | 0;
|
|
201
|
+
let t = Math.imul(state ^ (state >>> 15), 1 | state);
|
|
202
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
203
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function weightedPropKinds(props) {
|
|
207
|
+
const out = [];
|
|
208
|
+
let cumulative = 0;
|
|
209
|
+
for (const prop of props) {
|
|
210
|
+
const weight = positiveOr(prop.weight, 1);
|
|
211
|
+
cumulative += weight;
|
|
212
|
+
out.push({ ...prop, cumulative });
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
function pickWeighted(candidates, sample) {
|
|
217
|
+
const last = candidates[candidates.length - 1];
|
|
218
|
+
if (!last)
|
|
219
|
+
throw new Error("planLayeredSceneComposition requires at least one prop kind per populated layer.");
|
|
220
|
+
const target = sample * last.cumulative;
|
|
221
|
+
for (const candidate of candidates) {
|
|
222
|
+
if (target < candidate.cumulative)
|
|
223
|
+
return candidate;
|
|
224
|
+
}
|
|
225
|
+
return last;
|
|
226
|
+
}
|
|
227
|
+
function normalizedRange(range) {
|
|
228
|
+
return range[0] <= range[1] ? [range[0], range[1]] : [range[1], range[0]];
|
|
229
|
+
}
|
|
230
|
+
function withinRange(value, range) {
|
|
231
|
+
return value >= range[0] && value <= range[1];
|
|
232
|
+
}
|
|
233
|
+
function positiveOr(value, fallback) {
|
|
234
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
235
|
+
}
|
|
236
|
+
function clamp01(value) {
|
|
237
|
+
return Math.min(1, Math.max(0, value));
|
|
238
|
+
}
|
|
239
|
+
function round4(value) {
|
|
240
|
+
const rounded = Math.round(value * 10_000) / 10_000;
|
|
241
|
+
return rounded === 0 ? 0 : rounded;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Plan a banded sky backdrop from declarative intent.
|
|
245
|
+
*
|
|
246
|
+
* Bands above the horizon band are distributed with increasing height, because a linear split puts
|
|
247
|
+
* equal value change into the zenith (where a viewer reads none) and the horizon (where all of it is).
|
|
248
|
+
*/
|
|
249
|
+
export function planSkyBackdrop(spec) {
|
|
250
|
+
const span = normalizedRange(spec.span);
|
|
251
|
+
// Widen well past the span: a backdrop whose edge enters frame is worse than no backdrop, and the
|
|
252
|
+
// camera's horizontal view at side-scroller distances exceeds the level span.
|
|
253
|
+
const width = round4(Math.max(0.001, (span[1] - span[0]) * 1.6 + 12));
|
|
254
|
+
const height = Math.max(0.001, spec.height);
|
|
255
|
+
const bandCount = resolveBandCount(spec.bands, 4);
|
|
256
|
+
const horizonFraction = Math.min(0.8, Math.max(0.05, positiveOr(spec.horizonBandFraction, 0.22)));
|
|
257
|
+
const z = round4(spec.depth);
|
|
258
|
+
const bands = [];
|
|
259
|
+
// Sky side, upward from the horizon.
|
|
260
|
+
for (const band of gradedBands(height, bandCount, horizonFraction)) {
|
|
261
|
+
bands.push({
|
|
262
|
+
index: band.index,
|
|
263
|
+
side: "sky",
|
|
264
|
+
centerY: round4(spec.horizonY + band.offset + band.height / 2),
|
|
265
|
+
height: round4(band.height),
|
|
266
|
+
width,
|
|
267
|
+
z,
|
|
268
|
+
blend: round4(band.blend),
|
|
269
|
+
// Horizon glow: strongest at blend 0, never fully dark at the zenith.
|
|
270
|
+
emissiveIntensity: round4(0.52 - band.blend * 0.34)
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Ground side, downward from the horizon. Requested explicitly, because many scenes show nothing there.
|
|
274
|
+
const belowHeight = Math.max(0, spec.belowHorizonHeight ?? 0);
|
|
275
|
+
if (belowHeight > 0) {
|
|
276
|
+
const belowCount = resolveBandCount(spec.belowHorizonBands, Math.max(2, Math.round(bandCount / 2)));
|
|
277
|
+
for (const band of gradedBands(belowHeight, belowCount, horizonFraction)) {
|
|
278
|
+
bands.push({
|
|
279
|
+
index: band.index,
|
|
280
|
+
side: "ground",
|
|
281
|
+
centerY: round4(spec.horizonY - band.offset - band.height / 2),
|
|
282
|
+
height: round4(band.height),
|
|
283
|
+
width,
|
|
284
|
+
z,
|
|
285
|
+
blend: round4(band.blend),
|
|
286
|
+
// Ground darkens away from the horizon, mirroring the sky's falloff rather than repeating it.
|
|
287
|
+
emissiveIntensity: round4(0.34 - band.blend * 0.26)
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
kind: "aura-sky-backdrop-plan",
|
|
293
|
+
bands,
|
|
294
|
+
horizonY: round4(spec.horizonY),
|
|
295
|
+
zenithY: round4(spec.horizonY + height),
|
|
296
|
+
nadirY: round4(spec.horizonY - belowHeight)
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Clamp an explicitly provided band count rather than falling back to the default.
|
|
301
|
+
*
|
|
302
|
+
* `positiveOr(count, fallback)` would turn an explicit `0` into the default, which is unpredictable: a
|
|
303
|
+
* caller who computed a count and got zero would silently receive the default instead of the documented
|
|
304
|
+
* floor. `undefined` means "use the default"; any provided number is clamped into the supported range.
|
|
305
|
+
*/
|
|
306
|
+
function resolveBandCount(requested, fallback) {
|
|
307
|
+
if (requested === undefined || !Number.isFinite(requested))
|
|
308
|
+
return fallback;
|
|
309
|
+
// Upper bound raised from 12 to 32: at 5 bands over Skyline's own ramp the measured step was 21 per
|
|
310
|
+
// channel, which reads as visible banding rather than a gradient (see `skyBandCountForRamp`). Keeping a
|
|
311
|
+
// bound at all still prevents a caller from requesting thousands of quads by accident.
|
|
312
|
+
return Math.max(2, Math.min(32, Math.round(requested)));
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Distribute one side of the backdrop into contiguous bands, finest at the horizon.
|
|
316
|
+
*
|
|
317
|
+
* Band heights grow away from the horizon because a linear split puts equal value change into the zenith
|
|
318
|
+
* (where a viewer reads none) and the horizon (where all of it is).
|
|
319
|
+
*/
|
|
320
|
+
function gradedBands(height, count, horizonFraction) {
|
|
321
|
+
const horizonHeight = height * horizonFraction;
|
|
322
|
+
const remaining = height - horizonHeight;
|
|
323
|
+
const weights = [];
|
|
324
|
+
for (let index = 1; index < count; index += 1)
|
|
325
|
+
weights.push(index);
|
|
326
|
+
const weightTotal = weights.reduce((sum, weight) => sum + weight, 0) || 1;
|
|
327
|
+
const out = [];
|
|
328
|
+
let offset = 0;
|
|
329
|
+
for (let index = 0; index < count; index += 1) {
|
|
330
|
+
const bandHeight = index === 0 ? horizonHeight : (remaining * (weights[index - 1] ?? 1)) / weightTotal;
|
|
331
|
+
out.push({ index, offset, height: bandHeight, blend: count === 1 ? 0 : index / (count - 1) });
|
|
332
|
+
offset += bandHeight;
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Interpolate a hex colour ramp for a band's `blend`.
|
|
338
|
+
*
|
|
339
|
+
* Provided here rather than left to each route because "gradient sky" is only reusable if producing the
|
|
340
|
+
* per-band colour is reusable too; a route that has to write its own hex mixing has not been relieved
|
|
341
|
+
* of the art-direction code this layer exists to absorb.
|
|
342
|
+
*/
|
|
343
|
+
export function blendSkyBandColor(horizonColor, zenithColor, blend) {
|
|
344
|
+
const from = parseHexColor(horizonColor);
|
|
345
|
+
const to = parseHexColor(zenithColor);
|
|
346
|
+
const t = clamp01(blend);
|
|
347
|
+
const mix = (a, b) => Math.round(a + (b - a) * t);
|
|
348
|
+
return `#${[mix(from[0], to[0]), mix(from[1], to[1]), mix(from[2], to[2])]
|
|
349
|
+
.map((channel) => Math.min(255, Math.max(0, channel)).toString(16).padStart(2, "0"))
|
|
350
|
+
.join("")}`;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Minimum band count that keeps a colour ramp from reading as visible banding.
|
|
354
|
+
*
|
|
355
|
+
* ## Why this is a reusable function and not a constant
|
|
356
|
+
*
|
|
357
|
+
* A banded backdrop trades one defect for another if the band count is chosen by eye. Skyline's first
|
|
358
|
+
* banded sky used 5 bands over `#4e93b4 -> #173a5c`; sampling the rendered frame down a backdrop-only
|
|
359
|
+
* column measured hard steps of **21 per channel** at the horizon and 18 in the ground ramp -- a visible
|
|
360
|
+
* stair, replacing "flat sky" with "banded sky".
|
|
361
|
+
*
|
|
362
|
+
* The step size is a property of the *ramp*, not of taste: it is the largest per-channel endpoint
|
|
363
|
+
* distance divided by the number of gaps between bands. So the correct band count is derivable, and any
|
|
364
|
+
* route with any pair of colours can derive it instead of guessing. `maxChannelStep` defaults to 8, which
|
|
365
|
+
* is below the threshold where adjacent flat quads read as an edge at typical viewing sizes.
|
|
366
|
+
*/
|
|
367
|
+
export function skyBandCountForRamp(fromColor, toColor, maxChannelStep = 8) {
|
|
368
|
+
const from = parseHexColor(fromColor);
|
|
369
|
+
const to = parseHexColor(toColor);
|
|
370
|
+
const widestChannelRange = Math.max(Math.abs(from[0] - to[0]), Math.abs(from[1] - to[1]), Math.abs(from[2] - to[2]));
|
|
371
|
+
const step = Math.max(1, maxChannelStep);
|
|
372
|
+
// `+ 1` converts gaps to bands; a 2-band backdrop has one gap.
|
|
373
|
+
return Math.max(2, Math.ceil(widestChannelRange / step) + 1);
|
|
374
|
+
}
|
|
375
|
+
function parseHexColor(value) {
|
|
376
|
+
const hex = value.trim().replace(/^#/, "");
|
|
377
|
+
const expanded = hex.length === 3 ? hex.split("").map((char) => char + char).join("") : hex;
|
|
378
|
+
if (!/^[0-9a-fA-F]{6}$/.test(expanded)) {
|
|
379
|
+
throw new Error(`blendSkyBandColor requires a 3- or 6-digit hex colour, received "${value}".`);
|
|
380
|
+
}
|
|
381
|
+
return [
|
|
382
|
+
Number.parseInt(expanded.slice(0, 2), 16),
|
|
383
|
+
Number.parseInt(expanded.slice(2, 4), 16),
|
|
384
|
+
Number.parseInt(expanded.slice(4, 6), 16)
|
|
385
|
+
];
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=LayeredSceneComposition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayeredSceneComposition.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/LayeredSceneComposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable platformer motion tuning and level solvability.
|
|
3
|
+
*
|
|
4
|
+
* ## The defects this addresses
|
|
5
|
+
*
|
|
6
|
+
* Skyline Runner's jump was reported as unnatural, floaty, and unreliable to land,
|
|
7
|
+
* with a world that read as disconnected floating strips and a session that ended in
|
|
8
|
+
* about half a minute. Those are not four unrelated complaints; three of them follow
|
|
9
|
+
* from one number.
|
|
10
|
+
*
|
|
11
|
+
* The level ships `jumpVelocity: 7.4` and inherits the kit default `gravity: -22`.
|
|
12
|
+
* That gives an apex of `v^2 / 2g = 1.245` world units and an airtime of
|
|
13
|
+
* `2v / g = 0.673` seconds. The level's platforms step up by at most **0.36** units
|
|
14
|
+
* and are separated by gaps of at most **0.30** units. So every jump rises about
|
|
15
|
+
* 3.5x higher than the tallest step it needs to clear and travels well past the
|
|
16
|
+
* widest gap, with the character spending two thirds of a second in the air on a
|
|
17
|
+
* course whose obstacles need a fraction of that. The character therefore appears to
|
|
18
|
+
* float above the level rather than move through it, landings arrive long after the
|
|
19
|
+
* player expects them, and because the apex dwarfs the platform spacing the platforms
|
|
20
|
+
* read as unrelated strips rather than as a connected route.
|
|
21
|
+
*
|
|
22
|
+
* The engine defect is that nothing related jump tuning to level geometry, so a level
|
|
23
|
+
* could ship physically inconsistent with its own platforms and every gate would pass:
|
|
24
|
+
* the level is *solvable* (an over-powered jump clears everything), the screenshots
|
|
25
|
+
* look fine, and no metric compares apex to step height.
|
|
26
|
+
*
|
|
27
|
+
* This module closes that gap. {@link solvePlatformerMotion} derives gravity, jump
|
|
28
|
+
* velocity and move speed from what a level actually asks the player to do, and
|
|
29
|
+
* {@link validatePlatformerMotion} reports when a level's tuning is inconsistent with
|
|
30
|
+
* its geometry -- both over-powered (floaty) and under-powered (unclearable).
|
|
31
|
+
*
|
|
32
|
+
* Pure and dependency-free.
|
|
33
|
+
*/
|
|
34
|
+
export interface PlatformerPlatformLike {
|
|
35
|
+
readonly id?: string | undefined;
|
|
36
|
+
readonly x: number;
|
|
37
|
+
readonly y: number;
|
|
38
|
+
readonly width: number;
|
|
39
|
+
readonly height?: number | undefined;
|
|
40
|
+
}
|
|
41
|
+
export interface PlatformerGeometryFacts {
|
|
42
|
+
/** Largest upward step between consecutive platforms, in world units. */
|
|
43
|
+
readonly maxRise: number;
|
|
44
|
+
/** Largest horizontal gap between consecutive platforms, in world units. */
|
|
45
|
+
readonly maxGap: number;
|
|
46
|
+
/** Total horizontal span of the course. */
|
|
47
|
+
readonly courseLength: number;
|
|
48
|
+
/** Narrowest platform, which bounds how precise a landing must be. */
|
|
49
|
+
readonly minPlatformWidth: number;
|
|
50
|
+
readonly platformCount: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Measure what a level asks the player to do.
|
|
54
|
+
*
|
|
55
|
+
* Consecutive platforms are taken in x order, which matches how a side-scrolling
|
|
56
|
+
* course is traversed. Gaps are measured edge to edge and rises top to top.
|
|
57
|
+
*/
|
|
58
|
+
export declare function measurePlatformerGeometry(platforms: readonly PlatformerPlatformLike[]): PlatformerGeometryFacts;
|
|
59
|
+
export interface PlatformerMotionRequest {
|
|
60
|
+
/**
|
|
61
|
+
* Time from leaving the ground to the apex, in seconds.
|
|
62
|
+
*
|
|
63
|
+
* This is the parameter that decides how a jump *feels*, and it is a genuine design
|
|
64
|
+
* value rather than something to derive: platformers land between roughly 0.22s
|
|
65
|
+
* (snappy, arcade) and 0.42s (floaty, deliberate). Everything else follows from it
|
|
66
|
+
* plus the level's geometry.
|
|
67
|
+
*/
|
|
68
|
+
readonly riseSeconds?: number | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Headroom above the tallest step the jump must clear, as a multiple of that step.
|
|
71
|
+
*
|
|
72
|
+
* 1.0 would only just reach the next platform, which leaves no margin for a slightly
|
|
73
|
+
* late input. Around 1.6 reads as comfortable without floating.
|
|
74
|
+
*/
|
|
75
|
+
readonly apexHeadroom?: number | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Horizontal margin over the widest gap, as a multiple of that gap.
|
|
78
|
+
*
|
|
79
|
+
* Above 1 the player can clear the widest gap without a frame-perfect jump.
|
|
80
|
+
*/
|
|
81
|
+
readonly gapMargin?: number | undefined;
|
|
82
|
+
/** Minimum apex, so a level with no rises still has a usable jump. */
|
|
83
|
+
readonly minApex?: number | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Target session length in seconds, used to derive move speed from course length.
|
|
86
|
+
*
|
|
87
|
+
* A course is only as long as the time it takes to cross; deriving speed from an
|
|
88
|
+
* intended duration is how a level gets a session length on purpose rather than by
|
|
89
|
+
* accident. Skyline's 16.6-unit course at 1.15 units/second crosses in 14 seconds,
|
|
90
|
+
* which is why the session felt like it ended arbitrarily.
|
|
91
|
+
*/
|
|
92
|
+
readonly targetSessionSeconds?: number | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* Fraction of the session spent traversing rather than jumping, retrying and
|
|
95
|
+
* exploring. Below 1 because a player does not walk the course in a straight line.
|
|
96
|
+
*/
|
|
97
|
+
readonly traversalFraction?: number | undefined;
|
|
98
|
+
}
|
|
99
|
+
export interface PlatformerMotionSolution {
|
|
100
|
+
readonly kind: "aura-platformer-motion";
|
|
101
|
+
/** Gravity, negative (downward), in world units per second squared. */
|
|
102
|
+
readonly gravity: number;
|
|
103
|
+
/** Initial upward velocity of a full jump. */
|
|
104
|
+
readonly jumpVelocity: number;
|
|
105
|
+
/** Horizontal move speed. */
|
|
106
|
+
readonly moveSpeed: number;
|
|
107
|
+
/** Apex height above the takeoff surface. */
|
|
108
|
+
readonly apex: number;
|
|
109
|
+
/** Total airtime of a full jump, rise plus fall. */
|
|
110
|
+
readonly airtime: number;
|
|
111
|
+
/** Horizontal distance covered during a full jump at `moveSpeed`. */
|
|
112
|
+
readonly jumpReach: number;
|
|
113
|
+
/** Coyote time in milliseconds, scaled to airtime. */
|
|
114
|
+
readonly coyoteMs: number;
|
|
115
|
+
/** Jump buffer in milliseconds, scaled to airtime. */
|
|
116
|
+
readonly jumpBufferMs: number;
|
|
117
|
+
/** Terminal fall speed, so a long drop does not accelerate without limit. */
|
|
118
|
+
readonly terminalVelocity: number;
|
|
119
|
+
/** Geometry the solution was derived from. */
|
|
120
|
+
readonly geometry: PlatformerGeometryFacts;
|
|
121
|
+
/** Estimated time to traverse the course at `moveSpeed`. */
|
|
122
|
+
readonly traversalSeconds: number;
|
|
123
|
+
/** Estimated full session length including jumping and retries. */
|
|
124
|
+
readonly estimatedSessionSeconds: number;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Derive platformer motion from a level's own geometry.
|
|
128
|
+
*
|
|
129
|
+
* The apex is sized to the tallest step the player must clear, not chosen freely, so a
|
|
130
|
+
* jump cannot overshoot the level by 3.5x. Gravity then follows from the apex and the
|
|
131
|
+
* chosen rise time, and jump velocity from gravity and rise time. Move speed is sized
|
|
132
|
+
* so the jump clears the widest gap and the course takes a chosen amount of time.
|
|
133
|
+
*/
|
|
134
|
+
export declare function solvePlatformerMotion(platforms: readonly PlatformerPlatformLike[], request?: PlatformerMotionRequest): PlatformerMotionSolution;
|
|
135
|
+
export interface PlatformerMotionCheck {
|
|
136
|
+
readonly id: string;
|
|
137
|
+
readonly description: string;
|
|
138
|
+
readonly passes: boolean;
|
|
139
|
+
readonly detail: string;
|
|
140
|
+
}
|
|
141
|
+
export interface PlatformerMotionReport {
|
|
142
|
+
readonly schema: "aura3d-platformer-motion-invariants/1.0";
|
|
143
|
+
readonly geometry: PlatformerGeometryFacts;
|
|
144
|
+
readonly measured: {
|
|
145
|
+
readonly apex: number;
|
|
146
|
+
readonly airtime: number;
|
|
147
|
+
readonly jumpReach: number;
|
|
148
|
+
readonly apexToRiseRatio: number;
|
|
149
|
+
readonly reachToGapRatio: number;
|
|
150
|
+
};
|
|
151
|
+
readonly checks: readonly PlatformerMotionCheck[];
|
|
152
|
+
readonly passes: boolean;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check that a level's motion tuning is consistent with its geometry.
|
|
156
|
+
*
|
|
157
|
+
* This is the check that was missing. A level can be perfectly solvable and still feel
|
|
158
|
+
* wrong: an over-powered jump clears every obstacle, so solvability passes, while the
|
|
159
|
+
* character visibly floats. Both directions are failures.
|
|
160
|
+
*/
|
|
161
|
+
export declare function validatePlatformerMotion(platforms: readonly PlatformerPlatformLike[], motion: {
|
|
162
|
+
readonly gravity: number;
|
|
163
|
+
readonly jumpVelocity: number;
|
|
164
|
+
readonly moveSpeed: number;
|
|
165
|
+
}, limits?: {
|
|
166
|
+
/** Maximum apex as a multiple of the tallest step. Above this the jump floats. */
|
|
167
|
+
readonly maxApexToRiseRatio?: number | undefined;
|
|
168
|
+
/** Minimum apex as a multiple of the tallest step. Below this a step is unclearable. */
|
|
169
|
+
readonly minApexToRiseRatio?: number | undefined;
|
|
170
|
+
/** Maximum jump reach as a multiple of the widest gap. */
|
|
171
|
+
readonly maxReachToGapRatio?: number | undefined;
|
|
172
|
+
/** Minimum jump reach as a multiple of the widest gap. */
|
|
173
|
+
readonly minReachToGapRatio?: number | undefined;
|
|
174
|
+
/** Maximum airtime in seconds before a jump reads as floaty regardless of ratios. */
|
|
175
|
+
readonly maxAirtimeSeconds?: number | undefined;
|
|
176
|
+
}): PlatformerMotionReport;
|
|
177
|
+
//# sourceMappingURL=PlatformerMotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlatformerMotion.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PlatformerMotion.ts"],"names":[],"mappings":"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"}
|