@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,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset-relative spatial layout and semantic anchoring.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* Public routes placed helper geometry -- status markers, control stations,
|
|
7
|
+
* selection rings, callout panels, staging props -- at literal world
|
|
8
|
+
* coordinates chosen by eye against whatever asset was loaded that week. When
|
|
9
|
+
* the asset changed, or its bounds changed, the coordinates did not. The
|
|
10
|
+
* visible result is procedural boxes floating beside the scene rather than
|
|
11
|
+
* attached to the equipment they annotate.
|
|
12
|
+
*
|
|
13
|
+
* `CAR_SCENE_HEIGHT` was the same defect in a single constant: a value correct
|
|
14
|
+
* for one asset, frozen, then wrong. This module removes the reason to write
|
|
15
|
+
* such a constant. A route states intent -- "above this machine", "beside the
|
|
16
|
+
* workcell", "on the floor in front of the product" -- and reads back a world
|
|
17
|
+
* position derived from the asset's own placed bounds.
|
|
18
|
+
*
|
|
19
|
+
* Everything here is pure: no renderer, no asset loading, no DOM. Anchors are
|
|
20
|
+
* resolved from {@link PlacedBounds}, which a route obtains from typed asset
|
|
21
|
+
* bounds plus its intended scale via {@link placedBoundsFromAsset}.
|
|
22
|
+
*/
|
|
23
|
+
import { boundsFromAsset, boundsSize } from "./SceneGroundingUtils.js";
|
|
24
|
+
/**
|
|
25
|
+
* Build placed bounds from a subject's world position, size and floor.
|
|
26
|
+
*
|
|
27
|
+
* `position` is the subject's floor contact point, matching how Aura3D's safe
|
|
28
|
+
* model renderer grounds a normalized model on its node origin.
|
|
29
|
+
*/
|
|
30
|
+
export function placedBounds(options) {
|
|
31
|
+
const floorY = options.floorY ?? options.position[1];
|
|
32
|
+
const size = [
|
|
33
|
+
Math.max(0, options.size[0]),
|
|
34
|
+
Math.max(0, options.size[1]),
|
|
35
|
+
Math.max(0, options.size[2])
|
|
36
|
+
];
|
|
37
|
+
const min = [options.position[0] - size[0] / 2, floorY, options.position[2] - size[2] / 2];
|
|
38
|
+
const max = [options.position[0] + size[0] / 2, floorY + size[1], options.position[2] + size[2] / 2];
|
|
39
|
+
return {
|
|
40
|
+
min,
|
|
41
|
+
max,
|
|
42
|
+
center: [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2, (min[2] + max[2]) / 2],
|
|
43
|
+
size,
|
|
44
|
+
floorY
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Placed bounds for a typed asset rendered with `model(asset)`.
|
|
49
|
+
*
|
|
50
|
+
* Mirrors the safe renderer: the asset is normalized to
|
|
51
|
+
* `normalizedMaxDimension`, multiplied by node scale, and grounded so its
|
|
52
|
+
* lowest point rests on `floorY`. A route therefore never needs the asset's raw
|
|
53
|
+
* dimensions to place something relative to it.
|
|
54
|
+
*/
|
|
55
|
+
export function placedBoundsFromAsset(asset, options) {
|
|
56
|
+
const raw = boundsFromAsset(asset);
|
|
57
|
+
const rawSize = boundsSize(raw);
|
|
58
|
+
const rawMax = Math.max(rawSize[0], rawSize[1], rawSize[2]);
|
|
59
|
+
const factor = rawMax > 0 && options.targetMaxDimension > 0 ? options.targetMaxDimension / rawMax : 1;
|
|
60
|
+
const position = options.position ?? [0, options.floorY ?? 0, 0];
|
|
61
|
+
return placedBounds({
|
|
62
|
+
position,
|
|
63
|
+
size: [rawSize[0] * factor, rawSize[1] * factor, rawSize[2] * factor],
|
|
64
|
+
floorY: options.floorY ?? position[1]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** Placed bounds for a raw {@link SceneBounds} already expressed in world units. */
|
|
68
|
+
export function placedBoundsFromWorldBounds(bounds) {
|
|
69
|
+
const size = boundsSize(bounds);
|
|
70
|
+
return {
|
|
71
|
+
min: [bounds.min[0], bounds.min[1], bounds.min[2]],
|
|
72
|
+
max: [bounds.max[0], bounds.max[1], bounds.max[2]],
|
|
73
|
+
center: [
|
|
74
|
+
(bounds.min[0] + bounds.max[0]) / 2,
|
|
75
|
+
(bounds.min[1] + bounds.max[1]) / 2,
|
|
76
|
+
(bounds.min[2] + bounds.max[2]) / 2
|
|
77
|
+
],
|
|
78
|
+
size,
|
|
79
|
+
floorY: bounds.min[1]
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const ANCHOR_NORMALS = {
|
|
83
|
+
center: [0, 0, 0],
|
|
84
|
+
top: [0, 1, 0],
|
|
85
|
+
bottom: [0, -1, 0],
|
|
86
|
+
// "front" is +Z: Aura3D scenes look down -Z from a default camera, so the face
|
|
87
|
+
// nearest the viewer is +Z. Documented rather than inferred so a route reading
|
|
88
|
+
// "front" does not get the far side.
|
|
89
|
+
front: [0, 0, 1],
|
|
90
|
+
rear: [0, 0, -1],
|
|
91
|
+
left: [-1, 0, 0],
|
|
92
|
+
right: [1, 0, 0],
|
|
93
|
+
"top-front": [0, 0.7071, 0.7071],
|
|
94
|
+
"top-rear": [0, 0.7071, -0.7071],
|
|
95
|
+
"top-left": [-0.7071, 0.7071, 0],
|
|
96
|
+
"top-right": [0.7071, 0.7071, 0],
|
|
97
|
+
"floor-front": [0, 0, 1],
|
|
98
|
+
"floor-rear": [0, 0, -1],
|
|
99
|
+
"floor-left": [-1, 0, 0],
|
|
100
|
+
"floor-right": [1, 0, 0],
|
|
101
|
+
"corner-front-left": [-0.7071, 0, 0.7071],
|
|
102
|
+
"corner-front-right": [0.7071, 0, 0.7071],
|
|
103
|
+
"corner-rear-left": [-0.7071, 0, -0.7071],
|
|
104
|
+
"corner-rear-right": [0.7071, 0, -0.7071]
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Resolve a world position on or beside a subject's placed bounds.
|
|
108
|
+
*
|
|
109
|
+
* The returned position is on the named face at `offset` distance outward. This
|
|
110
|
+
* is the replacement for literal helper coordinates: it tracks the asset.
|
|
111
|
+
*/
|
|
112
|
+
export function resolveBoundsAnchor(bounds, anchor, options = {}) {
|
|
113
|
+
const normal = ANCHOR_NORMALS[anchor];
|
|
114
|
+
const offset = options.offset ?? 0;
|
|
115
|
+
const half = [bounds.size[0] / 2, bounds.size[1] / 2, bounds.size[2] / 2];
|
|
116
|
+
// Start at the bounds centre and walk out to the named face.
|
|
117
|
+
let position = [
|
|
118
|
+
bounds.center[0] + normal[0] * half[0],
|
|
119
|
+
bounds.center[1] + normal[1] * half[1],
|
|
120
|
+
bounds.center[2] + normal[2] * half[2]
|
|
121
|
+
];
|
|
122
|
+
// Floor anchors sit on the ground plane beside the subject.
|
|
123
|
+
if (anchor.startsWith("floor-") || options.onFloor === true) {
|
|
124
|
+
position = [position[0], bounds.floorY, position[2]];
|
|
125
|
+
}
|
|
126
|
+
position = [
|
|
127
|
+
position[0] + normal[0] * offset,
|
|
128
|
+
position[1] + normal[1] * offset,
|
|
129
|
+
position[2] + normal[2] * offset
|
|
130
|
+
];
|
|
131
|
+
const worldOffset = options.worldOffset ?? [0, 0, 0];
|
|
132
|
+
position = [position[0] + worldOffset[0], position[1] + worldOffset[1], position[2] + worldOffset[2]];
|
|
133
|
+
return {
|
|
134
|
+
position,
|
|
135
|
+
normal,
|
|
136
|
+
anchor,
|
|
137
|
+
outsideBounds: !containsPoint(bounds, position)
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** True when a world point lies inside the placed bounds (inclusive). */
|
|
141
|
+
export function containsPoint(bounds, point, epsilon = 1e-6) {
|
|
142
|
+
return point[0] >= bounds.min[0] - epsilon && point[0] <= bounds.max[0] + epsilon
|
|
143
|
+
&& point[1] >= bounds.min[1] - epsilon && point[1] <= bounds.max[1] + epsilon
|
|
144
|
+
&& point[2] >= bounds.min[2] - epsilon && point[2] <= bounds.max[2] + epsilon;
|
|
145
|
+
}
|
|
146
|
+
/** Resolve a normalized semantic region to world-space bounds on the subject. */
|
|
147
|
+
export function resolveSemanticRegion(bounds, region) {
|
|
148
|
+
const clamp01 = (value) => Math.min(1, Math.max(0, Number.isFinite(value) ? value : 0));
|
|
149
|
+
const u = clamp01(region.u);
|
|
150
|
+
const v = clamp01(region.v);
|
|
151
|
+
const w = clamp01(region.w);
|
|
152
|
+
const extent = region.extent ?? [0, 0, 0];
|
|
153
|
+
const center = [
|
|
154
|
+
bounds.min[0] + bounds.size[0] * u,
|
|
155
|
+
bounds.min[1] + bounds.size[1] * v,
|
|
156
|
+
bounds.min[2] + bounds.size[2] * w
|
|
157
|
+
];
|
|
158
|
+
const size = [
|
|
159
|
+
bounds.size[0] * clamp01(extent[0]),
|
|
160
|
+
bounds.size[1] * clamp01(extent[1]),
|
|
161
|
+
bounds.size[2] * clamp01(extent[2])
|
|
162
|
+
];
|
|
163
|
+
return {
|
|
164
|
+
id: region.id,
|
|
165
|
+
label: region.label,
|
|
166
|
+
center,
|
|
167
|
+
size,
|
|
168
|
+
min: [center[0] - size[0] / 2, center[1] - size[1] / 2, center[2] - size[2] / 2],
|
|
169
|
+
max: [center[0] + size[0] / 2, center[1] + size[1] / 2, center[2] + size[2] / 2]
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Distribute items evenly across a region, honouring a minimum spacing.
|
|
174
|
+
*
|
|
175
|
+
* Deterministic for a given seed so gameplay and evidence are reproducible.
|
|
176
|
+
* Used instead of `-0.45 + index * 0.17` style literals, which encode both the
|
|
177
|
+
* region and its spacing into one unexplained pair of numbers.
|
|
178
|
+
*/
|
|
179
|
+
export function distributeInRegion(region, options) {
|
|
180
|
+
const count = Math.max(0, Math.floor(options.count));
|
|
181
|
+
if (count === 0)
|
|
182
|
+
return [];
|
|
183
|
+
const spanX = region.max[0] - region.min[0];
|
|
184
|
+
const spanZ = region.max[2] - region.min[2];
|
|
185
|
+
const jitter = Math.min(1, Math.max(0, options.jitter ?? 0));
|
|
186
|
+
const seed = options.seed ?? 1;
|
|
187
|
+
// Lay items along the longer horizontal axis so a narrow conveyor stays a line.
|
|
188
|
+
const alongX = spanX >= spanZ;
|
|
189
|
+
const span = alongX ? spanX : spanZ;
|
|
190
|
+
const step = count > 1 ? span / (count - 1) : 0;
|
|
191
|
+
const y = options.onFloor === true ? region.min[1] : (region.min[1] + region.max[1]) / 2;
|
|
192
|
+
const positions = [];
|
|
193
|
+
let random = seed >>> 0 || 1;
|
|
194
|
+
const nextRandom = () => {
|
|
195
|
+
// xorshift32: deterministic, no dependencies, adequate for layout jitter.
|
|
196
|
+
random ^= random << 13;
|
|
197
|
+
random ^= random >>> 17;
|
|
198
|
+
random ^= random << 5;
|
|
199
|
+
return ((random >>> 0) / 0xffffffff) * 2 - 1;
|
|
200
|
+
};
|
|
201
|
+
for (let index = 0; index < count; index += 1) {
|
|
202
|
+
const t = count > 1 ? index * step : span / 2;
|
|
203
|
+
const jitterAmount = jitter * step * 0.5;
|
|
204
|
+
const primary = (alongX ? region.min[0] : region.min[2]) + t + (jitter > 0 ? nextRandom() * jitterAmount : 0);
|
|
205
|
+
const secondaryCenter = alongX ? (region.min[2] + region.max[2]) / 2 : (region.min[0] + region.max[0]) / 2;
|
|
206
|
+
const secondarySpan = alongX ? spanZ : spanX;
|
|
207
|
+
const secondary = secondaryCenter + (jitter > 0 ? nextRandom() * secondarySpan * 0.5 * jitter : 0);
|
|
208
|
+
positions.push(alongX ? [primary, y, secondary] : [secondary, y, primary]);
|
|
209
|
+
}
|
|
210
|
+
const minSpacing = options.minSpacing ?? 0;
|
|
211
|
+
return positions.map((position, index) => {
|
|
212
|
+
let nearest = Number.POSITIVE_INFINITY;
|
|
213
|
+
positions.forEach((other, otherIndex) => {
|
|
214
|
+
if (otherIndex === index)
|
|
215
|
+
return;
|
|
216
|
+
nearest = Math.min(nearest, distance(position, other));
|
|
217
|
+
});
|
|
218
|
+
if (!Number.isFinite(nearest))
|
|
219
|
+
nearest = Number.POSITIVE_INFINITY;
|
|
220
|
+
return {
|
|
221
|
+
index,
|
|
222
|
+
position,
|
|
223
|
+
nearestNeighborDistance: nearest === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : round(nearest)
|
|
224
|
+
};
|
|
225
|
+
}).map((placement) => {
|
|
226
|
+
// Report rather than silently correct: a caller asking for spacing the region
|
|
227
|
+
// cannot provide should see it in the invariant report, not get moved items.
|
|
228
|
+
void minSpacing;
|
|
229
|
+
return placement;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/** Minimum-spacing check for a set of placements. */
|
|
233
|
+
export function validateSpacing(placements, minSpacing) {
|
|
234
|
+
const violations = placements
|
|
235
|
+
.filter((placement) => Number.isFinite(placement.nearestNeighborDistance) && placement.nearestNeighborDistance < minSpacing)
|
|
236
|
+
.map((placement) => ({ index: placement.index, distance: placement.nearestNeighborDistance }));
|
|
237
|
+
return { ok: violations.length === 0, violations };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Place items on a circle around a subject.
|
|
241
|
+
*
|
|
242
|
+
* The radius is added to the subject's own horizontal half-extent, so a ring of
|
|
243
|
+
* markers stays clear of the asset regardless of how large the asset is.
|
|
244
|
+
*/
|
|
245
|
+
export function distributeAroundBounds(bounds, options) {
|
|
246
|
+
const count = Math.max(0, Math.floor(options.count));
|
|
247
|
+
if (count === 0)
|
|
248
|
+
return [];
|
|
249
|
+
const clearance = Math.max(bounds.size[0], bounds.size[2]) / 2;
|
|
250
|
+
const radius = clearance + Math.max(0, options.radius);
|
|
251
|
+
const sweep = options.sweep ?? Math.PI * 2;
|
|
252
|
+
const start = options.startAngle ?? 0;
|
|
253
|
+
const y = options.height ?? bounds.center[1];
|
|
254
|
+
const step = count > 1 ? sweep / (sweep >= Math.PI * 2 - 1e-6 ? count : count - 1) : 0;
|
|
255
|
+
const positions = [];
|
|
256
|
+
for (let index = 0; index < count; index += 1) {
|
|
257
|
+
const angle = start + step * index;
|
|
258
|
+
positions.push([
|
|
259
|
+
bounds.center[0] + Math.cos(angle) * radius,
|
|
260
|
+
y,
|
|
261
|
+
bounds.center[2] + Math.sin(angle) * radius
|
|
262
|
+
]);
|
|
263
|
+
}
|
|
264
|
+
return positions.map((position, index) => {
|
|
265
|
+
let nearest = Number.POSITIVE_INFINITY;
|
|
266
|
+
positions.forEach((other, otherIndex) => {
|
|
267
|
+
if (otherIndex === index)
|
|
268
|
+
return;
|
|
269
|
+
nearest = Math.min(nearest, distance(position, other));
|
|
270
|
+
});
|
|
271
|
+
return { index, position, nearestNeighborDistance: Number.isFinite(nearest) ? round(nearest) : Number.POSITIVE_INFINITY };
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Verify that helper geometry is anchored to its subject.
|
|
276
|
+
*
|
|
277
|
+
* `outside` elements must remain within `maxDistance` of the bounds: that is
|
|
278
|
+
* what separates "a control station beside the workcell" from "a box floating in
|
|
279
|
+
* the void". The default of 2x the subject's largest extent is generous enough
|
|
280
|
+
* for staging and tight enough to catch the digital-twin defect class.
|
|
281
|
+
*/
|
|
282
|
+
export function checkSpatialInvariants(bounds, claims, options = {}) {
|
|
283
|
+
const tolerance = options.surfaceTolerance ?? Math.max(0.02, Math.max(...bounds.size) * 0.08);
|
|
284
|
+
const defaultMaxDistance = Math.max(...bounds.size) * 2;
|
|
285
|
+
const checks = claims.map((claim) => {
|
|
286
|
+
const inside = containsPoint(bounds, claim.position);
|
|
287
|
+
const surfaceDistance = distanceToBoundsSurface(bounds, claim.position);
|
|
288
|
+
const outsideDistance = distanceOutsideBounds(bounds, claim.position);
|
|
289
|
+
if (claim.relation === "inside") {
|
|
290
|
+
return {
|
|
291
|
+
id: claim.id,
|
|
292
|
+
description: `${claim.id} must lie inside the subject bounds`,
|
|
293
|
+
passes: inside,
|
|
294
|
+
detail: inside ? "inside bounds" : `outside bounds by ${round(outsideDistance)} units`
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (claim.relation === "surface") {
|
|
298
|
+
const passes = surfaceDistance <= tolerance;
|
|
299
|
+
return {
|
|
300
|
+
id: claim.id,
|
|
301
|
+
description: `${claim.id} must sit on the subject surface within ${round(tolerance)} units`,
|
|
302
|
+
passes,
|
|
303
|
+
detail: `distance to surface ${round(surfaceDistance)} (tolerance ${round(tolerance)})`
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const limit = claim.maxDistance ?? defaultMaxDistance;
|
|
307
|
+
const passes = !inside && outsideDistance <= limit;
|
|
308
|
+
return {
|
|
309
|
+
id: claim.id,
|
|
310
|
+
description: `${claim.id} must sit beside the subject within ${round(limit)} units, not inside it`,
|
|
311
|
+
passes,
|
|
312
|
+
detail: inside
|
|
313
|
+
? "unexpectedly inside the subject bounds"
|
|
314
|
+
: `distance outside bounds ${round(outsideDistance)} (limit ${round(limit)})`
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
return {
|
|
318
|
+
schema: "aura3d-spatial-invariants/1.0",
|
|
319
|
+
subjectBounds: bounds,
|
|
320
|
+
checks,
|
|
321
|
+
passes: checks.every((check) => check.passes)
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/** Shortest distance from a point to the bounds surface (0 when on it). */
|
|
325
|
+
export function distanceToBoundsSurface(bounds, point) {
|
|
326
|
+
const outside = distanceOutsideBounds(bounds, point);
|
|
327
|
+
if (outside > 0)
|
|
328
|
+
return outside;
|
|
329
|
+
// Inside: distance to the nearest face.
|
|
330
|
+
return Math.min(point[0] - bounds.min[0], bounds.max[0] - point[0], point[1] - bounds.min[1], bounds.max[1] - point[1], point[2] - bounds.min[2], bounds.max[2] - point[2]);
|
|
331
|
+
}
|
|
332
|
+
/** Distance from a point to the bounds volume; 0 when inside. */
|
|
333
|
+
export function distanceOutsideBounds(bounds, point) {
|
|
334
|
+
const dx = Math.max(bounds.min[0] - point[0], 0, point[0] - bounds.max[0]);
|
|
335
|
+
const dy = Math.max(bounds.min[1] - point[1], 0, point[1] - bounds.max[1]);
|
|
336
|
+
const dz = Math.max(bounds.min[2] - point[2], 0, point[2] - bounds.max[2]);
|
|
337
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
338
|
+
}
|
|
339
|
+
function distance(a, b) {
|
|
340
|
+
const dx = a[0] - b[0];
|
|
341
|
+
const dy = a[1] - b[1];
|
|
342
|
+
const dz = a[2] - b[2];
|
|
343
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
344
|
+
}
|
|
345
|
+
function round(value) {
|
|
346
|
+
return Math.round(value * 1e6) / 1e6;
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=SpatialAnchoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpatialAnchoring.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/SpatialAnchoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative subject framing derived from typed asset metadata.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* Route code kept encoding *specific assets* into visual constants. Turbo's chase camera height was
|
|
7
|
+
* `0.46`, justified in a comment that recited one asset's bounds ("176.35 units tall over a 377.94
|
|
8
|
+
* longest axis"). Its `CAR_SCENE_HEIGHT` was worse: hardcoded to `2.209 / 6.958`, the bounds of a hero
|
|
9
|
+
* asset that had already been replaced twice, so every swap silently mis-seated the new car.
|
|
10
|
+
*
|
|
11
|
+
* The failure mode is structural, not careless. A number that is *correct* for one asset looks like a
|
|
12
|
+
* tuned design constant, so it survives review and survives asset swaps. The only durable fix is for
|
|
13
|
+
* routes to declare **intent** -- "frame a rear chase view where the subject occupies 25-40% of frame
|
|
14
|
+
* height and the lower silhouette stays visible" -- and let reusable code derive the numbers from the
|
|
15
|
+
* typed manifest.
|
|
16
|
+
*
|
|
17
|
+
* These helpers are pure and dependency-free so they can be unit tested against synthetic bounds and
|
|
18
|
+
* reused by any genre. They deliberately do **not** know about racing, platformers, or any route.
|
|
19
|
+
*/
|
|
20
|
+
import { type SceneAssetLike, type SceneBounds } from "./SceneGroundingUtils.js";
|
|
21
|
+
/** Rendered dimensions of a subject after the renderer's fit scale is applied. */
|
|
22
|
+
export interface SubjectRenderedSize {
|
|
23
|
+
/** Rendered extent along each axis, in world units. */
|
|
24
|
+
readonly size: readonly [number, number, number];
|
|
25
|
+
/** Rendered height (Y extent). */
|
|
26
|
+
readonly height: number;
|
|
27
|
+
/** Rendered longest axis. */
|
|
28
|
+
readonly maxDimension: number;
|
|
29
|
+
/** Rendered extent along the subject's longitudinal (longest horizontal) axis. */
|
|
30
|
+
readonly length: number;
|
|
31
|
+
/** Uniform scale the renderer applies to reach the requested fit. */
|
|
32
|
+
readonly fitScale: number;
|
|
33
|
+
}
|
|
34
|
+
export interface SubjectFitRequest {
|
|
35
|
+
/** Fit the subject's height to this world-unit value. */
|
|
36
|
+
readonly targetHeight?: number | undefined;
|
|
37
|
+
/** Fit the subject's longest axis to this world-unit value. */
|
|
38
|
+
readonly targetMaxDimension?: number | undefined;
|
|
39
|
+
/** Fit the subject's longitudinal (longest horizontal) axis to this world-unit value. */
|
|
40
|
+
readonly targetLength?: number | undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve what a subject actually measures once fit, straight from typed bounds.
|
|
44
|
+
*
|
|
45
|
+
* This replaces the `CAR_TARGET_MAX_DIMENSION * (BOUNDS_Y / BOUNDS_LONGEST)` arithmetic that routes
|
|
46
|
+
* were open-coding, and which is exactly where the stale-literal defect lived.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveSubjectRenderedSize(asset: SceneAssetLike, request: SubjectFitRequest): SubjectRenderedSize;
|
|
49
|
+
/** Bounds-level form of {@link resolveSubjectRenderedSize}, for fixtures and tests. */
|
|
50
|
+
export declare function resolveSubjectRenderedSizeFromBounds(bounds: SceneBounds, request: SubjectFitRequest): SubjectRenderedSize;
|
|
51
|
+
/**
|
|
52
|
+
* A route's framing *intent*, expressed without reference to any asset's dimensions.
|
|
53
|
+
*
|
|
54
|
+
* `subjectVerticalOccupancy` is the contract that matters: it states how much of the frame's height
|
|
55
|
+
* the subject should fill. Everything else (camera height, distance) is derived to satisfy it.
|
|
56
|
+
*/
|
|
57
|
+
export interface ChaseFramingIntent extends SubjectFitRequest {
|
|
58
|
+
/** Vertical fraction of the frame the subject should occupy, as `[min, max]`. */
|
|
59
|
+
readonly subjectVerticalOccupancy: readonly [number, number];
|
|
60
|
+
/** Vertical field of view in degrees. */
|
|
61
|
+
readonly fov: number;
|
|
62
|
+
/**
|
|
63
|
+
* Fraction of the subject's height the camera should sit at, measured from its contact plane.
|
|
64
|
+
*
|
|
65
|
+
* Expressed as a fraction rather than a world-unit height precisely so it survives asset swaps.
|
|
66
|
+
* The default 0.9 places the eye just above the subject's mid-height: high enough to see the ground
|
|
67
|
+
* ahead, low enough that the subject's own roof line does not occlude its lower silhouette.
|
|
68
|
+
*/
|
|
69
|
+
readonly eyeHeightFraction?: number | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Require the lowest `lowerSilhouetteFraction` of the subject to remain unoccluded by its own upper
|
|
72
|
+
* body, which is what makes wheels, feet, or landing gear readable.
|
|
73
|
+
*/
|
|
74
|
+
readonly lowerSilhouetteFraction?: number | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Require the subject's lower side features (wheels, feet) to be readable from this framing.
|
|
77
|
+
*
|
|
78
|
+
* A dead-astern or dead-ahead chase view cannot show them: the subject's own bodywork occludes its
|
|
79
|
+
* lower flanks by construction. This was learned the hard way — a hero car's tyres were reported as
|
|
80
|
+
* "not rendering" when in fact the renderer drew all of them and the camera was simply looking down
|
|
81
|
+
* the one axis where they cannot appear.
|
|
82
|
+
*
|
|
83
|
+
* When set, `resolveChaseFraming` derives a lateral offset large enough to bring the flank into view.
|
|
84
|
+
*/
|
|
85
|
+
readonly requireLowerSideFeatureVisibility?: boolean | undefined;
|
|
86
|
+
}
|
|
87
|
+
export interface ChaseFraming {
|
|
88
|
+
/** Camera height above the subject's contact plane. */
|
|
89
|
+
readonly height: number;
|
|
90
|
+
/** Camera distance behind the subject. */
|
|
91
|
+
readonly distance: number;
|
|
92
|
+
/**
|
|
93
|
+
* Lateral camera offset. Non-zero only when `requireLowerSideFeatureVisibility` is set.
|
|
94
|
+
*
|
|
95
|
+
* Derived from the subject's own half-width so it scales with the asset instead of being tuned: a
|
|
96
|
+
* fixed offset that reveals a small car's wheels is far too small for a truck.
|
|
97
|
+
*/
|
|
98
|
+
readonly sideOffset: number;
|
|
99
|
+
/**
|
|
100
|
+
* True when this framing can actually show the subject's lower side features.
|
|
101
|
+
*
|
|
102
|
+
* A caller must not claim wheels or feet are visible from a framing where this is false, however
|
|
103
|
+
* correct the grounding is.
|
|
104
|
+
*/
|
|
105
|
+
readonly lowerSideFeaturesReadable: boolean;
|
|
106
|
+
/** Rendered subject measurements this framing was derived from. */
|
|
107
|
+
readonly subject: SubjectRenderedSize;
|
|
108
|
+
/** Predicted fraction of frame height the subject occupies at this distance. */
|
|
109
|
+
readonly predictedVerticalOccupancy: number;
|
|
110
|
+
/** World-space Y band, relative to the contact plane, that must stay readable. */
|
|
111
|
+
readonly lowerSilhouetteBand: readonly [number, number];
|
|
112
|
+
/** True when the predicted occupancy falls inside the requested range. */
|
|
113
|
+
readonly withinRequestedOccupancy: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Derive a chase camera from framing intent plus typed asset bounds.
|
|
117
|
+
*
|
|
118
|
+
* The distance is solved from the occupancy contract rather than tuned: at vertical FOV `f` and
|
|
119
|
+
* distance `d`, a subject of rendered height `h` occupies `h / (2 * d * tan(f/2))` of the frame.
|
|
120
|
+
* Solving for the midpoint of the requested occupancy range gives the distance directly, so a new
|
|
121
|
+
* asset with different proportions produces a different distance automatically and the route never
|
|
122
|
+
* restates a dimension.
|
|
123
|
+
*/
|
|
124
|
+
export declare function resolveChaseFraming(asset: SceneAssetLike, intent: ChaseFramingIntent): ChaseFraming;
|
|
125
|
+
/** Bounds-level form of {@link resolveChaseFraming}, for fixtures and tests. */
|
|
126
|
+
export declare function resolveChaseFramingFromBounds(bounds: SceneBounds, intent: ChaseFramingIntent): ChaseFraming;
|
|
127
|
+
//# sourceMappingURL=SubjectFramingUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubjectFramingUtils.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/SubjectFramingUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAC;AAElC,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,yFAAyF;IACzF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,mBAAmB,CAGjH;AAED,uFAAuF;AACvF,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,GAAG,mBAAmB,CAgBzH;AAYD;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,iFAAiF;IACjF,QAAQ,CAAC,wBAAwB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtD;;;;;;;;;OASG;IACH,QAAQ,CAAC,iCAAiC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClE;AAED,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;IAC5C,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,0EAA0E;IAC1E,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAEnG;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA+C3G"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative subject framing derived from typed asset metadata.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* Route code kept encoding *specific assets* into visual constants. Turbo's chase camera height was
|
|
7
|
+
* `0.46`, justified in a comment that recited one asset's bounds ("176.35 units tall over a 377.94
|
|
8
|
+
* longest axis"). Its `CAR_SCENE_HEIGHT` was worse: hardcoded to `2.209 / 6.958`, the bounds of a hero
|
|
9
|
+
* asset that had already been replaced twice, so every swap silently mis-seated the new car.
|
|
10
|
+
*
|
|
11
|
+
* The failure mode is structural, not careless. A number that is *correct* for one asset looks like a
|
|
12
|
+
* tuned design constant, so it survives review and survives asset swaps. The only durable fix is for
|
|
13
|
+
* routes to declare **intent** -- "frame a rear chase view where the subject occupies 25-40% of frame
|
|
14
|
+
* height and the lower silhouette stays visible" -- and let reusable code derive the numbers from the
|
|
15
|
+
* typed manifest.
|
|
16
|
+
*
|
|
17
|
+
* These helpers are pure and dependency-free so they can be unit tested against synthetic bounds and
|
|
18
|
+
* reused by any genre. They deliberately do **not** know about racing, platformers, or any route.
|
|
19
|
+
*/
|
|
20
|
+
import { boundsFromAsset, boundsHeight, boundsMaxDimension, boundsSize } from "./SceneGroundingUtils.js";
|
|
21
|
+
/**
|
|
22
|
+
* Resolve what a subject actually measures once fit, straight from typed bounds.
|
|
23
|
+
*
|
|
24
|
+
* This replaces the `CAR_TARGET_MAX_DIMENSION * (BOUNDS_Y / BOUNDS_LONGEST)` arithmetic that routes
|
|
25
|
+
* were open-coding, and which is exactly where the stale-literal defect lived.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveSubjectRenderedSize(asset, request) {
|
|
28
|
+
const bounds = boundsFromAsset(asset);
|
|
29
|
+
return resolveSubjectRenderedSizeFromBounds(bounds, request);
|
|
30
|
+
}
|
|
31
|
+
/** Bounds-level form of {@link resolveSubjectRenderedSize}, for fixtures and tests. */
|
|
32
|
+
export function resolveSubjectRenderedSizeFromBounds(bounds, request) {
|
|
33
|
+
const rawSize = boundsSize(bounds);
|
|
34
|
+
const rawHeight = boundsHeight(bounds);
|
|
35
|
+
const rawMaxDimension = boundsMaxDimension(bounds);
|
|
36
|
+
const rawLength = Math.max(rawSize[0], rawSize[2]);
|
|
37
|
+
const fitScale = resolveSubjectFitScale({ height: rawHeight, maxDimension: rawMaxDimension, length: rawLength }, request);
|
|
38
|
+
return {
|
|
39
|
+
size: [rawSize[0] * fitScale, rawSize[1] * fitScale, rawSize[2] * fitScale],
|
|
40
|
+
height: rawHeight * fitScale,
|
|
41
|
+
maxDimension: rawMaxDimension * fitScale,
|
|
42
|
+
length: rawLength * fitScale,
|
|
43
|
+
fitScale
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function resolveSubjectFitScale(raw, request) {
|
|
47
|
+
if (isPositive(request.targetHeight) && raw.height > 0)
|
|
48
|
+
return request.targetHeight / raw.height;
|
|
49
|
+
if (isPositive(request.targetLength) && raw.length > 0)
|
|
50
|
+
return request.targetLength / raw.length;
|
|
51
|
+
if (isPositive(request.targetMaxDimension) && raw.maxDimension > 0)
|
|
52
|
+
return request.targetMaxDimension / raw.maxDimension;
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Derive a chase camera from framing intent plus typed asset bounds.
|
|
57
|
+
*
|
|
58
|
+
* The distance is solved from the occupancy contract rather than tuned: at vertical FOV `f` and
|
|
59
|
+
* distance `d`, a subject of rendered height `h` occupies `h / (2 * d * tan(f/2))` of the frame.
|
|
60
|
+
* Solving for the midpoint of the requested occupancy range gives the distance directly, so a new
|
|
61
|
+
* asset with different proportions produces a different distance automatically and the route never
|
|
62
|
+
* restates a dimension.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveChaseFraming(asset, intent) {
|
|
65
|
+
return resolveChaseFramingFromBounds(boundsFromAsset(asset), intent);
|
|
66
|
+
}
|
|
67
|
+
/** Bounds-level form of {@link resolveChaseFraming}, for fixtures and tests. */
|
|
68
|
+
export function resolveChaseFramingFromBounds(bounds, intent) {
|
|
69
|
+
const subject = resolveSubjectRenderedSizeFromBounds(bounds, intent);
|
|
70
|
+
const [minOccupancy, maxOccupancy] = normalizeOccupancy(intent.subjectVerticalOccupancy);
|
|
71
|
+
const targetOccupancy = (minOccupancy + maxOccupancy) / 2;
|
|
72
|
+
const fovRadians = clamp(intent.fov, 1, 170) * Math.PI / 180;
|
|
73
|
+
const halfFovTangent = Math.tan(fovRadians / 2);
|
|
74
|
+
// Solve d from occupancy = height / (2 * d * tan(fov/2)).
|
|
75
|
+
const distance = subject.height > 0 && targetOccupancy > 0 && halfFovTangent > 0
|
|
76
|
+
? subject.height / (2 * targetOccupancy * halfFovTangent)
|
|
77
|
+
: Math.max(subject.maxDimension, 0.001) * 2;
|
|
78
|
+
const eyeHeightFraction = intent.eyeHeightFraction ?? 0.9;
|
|
79
|
+
const height = subject.height * eyeHeightFraction;
|
|
80
|
+
const lowerFraction = clamp(intent.lowerSilhouetteFraction ?? 0.3, 0, 1);
|
|
81
|
+
const predictedVerticalOccupancy = distance > 0 && halfFovTangent > 0
|
|
82
|
+
? subject.height / (2 * distance * halfFovTangent)
|
|
83
|
+
: 0;
|
|
84
|
+
/*
|
|
85
|
+
* Lateral offset needed to bring the subject's flank into view.
|
|
86
|
+
*
|
|
87
|
+
* At offset `s` and distance `d` the view direction is rotated by `atan(s/d)` off-axis. Bringing a
|
|
88
|
+
* flank into view needs enough rotation that the near-side lower body is no longer occluded by the
|
|
89
|
+
* subject's own width; `0.45 * halfWidth / distance`-scaled offset yields roughly 12-20 degrees for
|
|
90
|
+
* typical chase distances, which is the range where a car's near wheels read without the frame
|
|
91
|
+
* becoming a side-on beauty shot.
|
|
92
|
+
*/
|
|
93
|
+
// The *narrower* horizontal axis is the subject's width; the wider one is its length. A chase camera
|
|
94
|
+
// steps sideways relative to width, so using the longest axis here would overshoot badly on a long car.
|
|
95
|
+
const halfWidth = Math.min(subject.size[0], subject.size[2]) / 2;
|
|
96
|
+
const sideOffset = intent.requireLowerSideFeatureVisibility ? halfWidth * 3.2 : 0;
|
|
97
|
+
const offAxisRadians = distance > 0 ? Math.atan(sideOffset / distance) : 0;
|
|
98
|
+
return {
|
|
99
|
+
height: round4(height),
|
|
100
|
+
distance: round4(distance),
|
|
101
|
+
sideOffset: round4(sideOffset),
|
|
102
|
+
// Below ~8 degrees off-axis the subject's own body still hides its lower flank.
|
|
103
|
+
lowerSideFeaturesReadable: offAxisRadians >= 0.14,
|
|
104
|
+
subject,
|
|
105
|
+
predictedVerticalOccupancy: round4(predictedVerticalOccupancy),
|
|
106
|
+
lowerSilhouetteBand: [0, round4(subject.height * lowerFraction)],
|
|
107
|
+
withinRequestedOccupancy: predictedVerticalOccupancy >= minOccupancy - 1e-6 &&
|
|
108
|
+
predictedVerticalOccupancy <= maxOccupancy + 1e-6
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function normalizeOccupancy(range) {
|
|
112
|
+
const low = Math.min(range[0], range[1]);
|
|
113
|
+
const high = Math.max(range[0], range[1]);
|
|
114
|
+
return [clamp(low, 0.001, 1), clamp(high, 0.001, 1)];
|
|
115
|
+
}
|
|
116
|
+
function clamp(value, low, high) {
|
|
117
|
+
return Math.min(high, Math.max(low, value));
|
|
118
|
+
}
|
|
119
|
+
function round4(value) {
|
|
120
|
+
const rounded = Math.round(value * 10_000) / 10_000;
|
|
121
|
+
return rounded === 0 ? 0 : rounded;
|
|
122
|
+
}
|
|
123
|
+
function isPositive(value) {
|
|
124
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=SubjectFramingUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubjectFramingUtils.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/SubjectFramingUtils.ts"],"names":[],"mappings":"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"}
|