@iwsdk/core 0.1.0
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/LICENSE +21 -0
- package/dist/asset/asset-manager.d.ts +72 -0
- package/dist/asset/asset-manager.d.ts.map +1 -0
- package/dist/asset/asset-manager.js +138 -0
- package/dist/asset/asset-manager.js.map +1 -0
- package/dist/asset/cache-manager.d.ts +44 -0
- package/dist/asset/cache-manager.d.ts.map +1 -0
- package/dist/asset/cache-manager.js +80 -0
- package/dist/asset/cache-manager.js.map +1 -0
- package/dist/asset/index.d.ts +9 -0
- package/dist/asset/index.d.ts.map +1 -0
- package/dist/asset/loaders/audio-loader.d.ts +21 -0
- package/dist/asset/loaders/audio-loader.d.ts.map +1 -0
- package/dist/asset/loaders/audio-loader.js +57 -0
- package/dist/asset/loaders/audio-loader.js.map +1 -0
- package/dist/asset/loaders/gltf-loader.d.ts +33 -0
- package/dist/asset/loaders/gltf-loader.d.ts.map +1 -0
- package/dist/asset/loaders/gltf-loader.js +79 -0
- package/dist/asset/loaders/gltf-loader.js.map +1 -0
- package/dist/asset/loaders/hdr-texture-loader.d.ts +18 -0
- package/dist/asset/loaders/hdr-texture-loader.d.ts.map +1 -0
- package/dist/asset/loaders/hdr-texture-loader.js +65 -0
- package/dist/asset/loaders/hdr-texture-loader.js.map +1 -0
- package/dist/asset/loaders/texture-loader.d.ts +21 -0
- package/dist/asset/loaders/texture-loader.d.ts.map +1 -0
- package/dist/asset/loaders/texture-loader.js +57 -0
- package/dist/asset/loaders/texture-loader.js.map +1 -0
- package/dist/audio/audio-pool.d.ts +59 -0
- package/dist/audio/audio-pool.d.ts.map +1 -0
- package/dist/audio/audio-pool.js +105 -0
- package/dist/audio/audio-pool.js.map +1 -0
- package/dist/audio/audio-system.d.ts +326 -0
- package/dist/audio/audio-system.d.ts.map +1 -0
- package/dist/audio/audio-system.js +478 -0
- package/dist/audio/audio-system.js.map +1 -0
- package/dist/audio/audio-utils.d.ts +71 -0
- package/dist/audio/audio-utils.d.ts.map +1 -0
- package/dist/audio/audio-utils.js +145 -0
- package/dist/audio/audio-utils.js.map +1 -0
- package/dist/audio/audio.d.ts +178 -0
- package/dist/audio/audio.d.ts.map +1 -0
- package/dist/audio/audio.js +104 -0
- package/dist/audio/audio.js.map +1 -0
- package/dist/audio/index.d.ts +11 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/ecs/component-registry.d.ts +54 -0
- package/dist/ecs/component-registry.d.ts.map +1 -0
- package/dist/ecs/component-registry.js +86 -0
- package/dist/ecs/component-registry.js.map +1 -0
- package/dist/ecs/component.d.ts +12 -0
- package/dist/ecs/component.d.ts.map +1 -0
- package/dist/ecs/entity.d.ts +17 -0
- package/dist/ecs/entity.d.ts.map +1 -0
- package/dist/ecs/entity.js +13 -0
- package/dist/ecs/entity.js.map +1 -0
- package/dist/ecs/index.d.ts +12 -0
- package/dist/ecs/index.d.ts.map +1 -0
- package/dist/ecs/system.d.ts +70 -0
- package/dist/ecs/system.d.ts.map +1 -0
- package/dist/ecs/system.js +79 -0
- package/dist/ecs/system.js.map +1 -0
- package/dist/ecs/world.d.ts +101 -0
- package/dist/ecs/world.d.ts.map +1 -0
- package/dist/ecs/world.js +165 -0
- package/dist/ecs/world.js.map +1 -0
- package/dist/environment/dome-gradient.d.ts +39 -0
- package/dist/environment/dome-gradient.d.ts.map +1 -0
- package/dist/environment/dome-gradient.js +30 -0
- package/dist/environment/dome-gradient.js.map +1 -0
- package/dist/environment/dome-texture.d.ts +39 -0
- package/dist/environment/dome-texture.d.ts.map +1 -0
- package/dist/environment/dome-texture.js +30 -0
- package/dist/environment/dome-texture.js.map +1 -0
- package/dist/environment/environment-system.d.ts +82 -0
- package/dist/environment/environment-system.d.ts.map +1 -0
- package/dist/environment/environment-system.js +389 -0
- package/dist/environment/environment-system.js.map +1 -0
- package/dist/environment/gradient-environment.d.ts +37 -0
- package/dist/environment/gradient-environment.d.ts.map +1 -0
- package/dist/environment/gradient-environment.js +99 -0
- package/dist/environment/gradient-environment.js.map +1 -0
- package/dist/environment/ibl-gradient.d.ts +38 -0
- package/dist/environment/ibl-gradient.d.ts.map +1 -0
- package/dist/environment/ibl-gradient.js +29 -0
- package/dist/environment/ibl-gradient.js.map +1 -0
- package/dist/environment/ibl-texture.d.ts +36 -0
- package/dist/environment/ibl-texture.d.ts.map +1 -0
- package/dist/environment/ibl-texture.js +30 -0
- package/dist/environment/ibl-texture.js.map +1 -0
- package/dist/environment/index.d.ts +12 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/grab/distance-grabbable.d.ts +115 -0
- package/dist/grab/distance-grabbable.d.ts.map +1 -0
- package/dist/grab/distance-grabbable.js +102 -0
- package/dist/grab/distance-grabbable.js.map +1 -0
- package/dist/grab/grab-system.d.ts +320 -0
- package/dist/grab/grab-system.d.ts.map +1 -0
- package/dist/grab/grab-system.js +239 -0
- package/dist/grab/grab-system.js.map +1 -0
- package/dist/grab/handles.d.ts +43 -0
- package/dist/grab/handles.d.ts.map +1 -0
- package/dist/grab/handles.js +132 -0
- package/dist/grab/handles.js.map +1 -0
- package/dist/grab/index.d.ts +13 -0
- package/dist/grab/index.d.ts.map +1 -0
- package/dist/grab/index.js +23 -0
- package/dist/grab/index.js.map +1 -0
- package/dist/grab/one-hand-grabbable.d.ts +80 -0
- package/dist/grab/one-hand-grabbable.d.ts.map +1 -0
- package/dist/grab/one-hand-grabbable.js +80 -0
- package/dist/grab/one-hand-grabbable.js.map +1 -0
- package/dist/grab/pointer-events-patch.d.ts +16 -0
- package/dist/grab/pointer-events-patch.d.ts.map +1 -0
- package/dist/grab/pointer-events-patch.js +223 -0
- package/dist/grab/pointer-events-patch.js.map +1 -0
- package/dist/grab/two-hands-grabbable.d.ts +103 -0
- package/dist/grab/two-hands-grabbable.d.ts.map +1 -0
- package/dist/grab/two-hands-grabbable.js +100 -0
- package/dist/grab/two-hands-grabbable.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/init/index.d.ts +9 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/world-initializer.d.ts +76 -0
- package/dist/init/world-initializer.d.ts.map +1 -0
- package/dist/init/world-initializer.js +403 -0
- package/dist/init/world-initializer.js.map +1 -0
- package/dist/init/xr.d.ts +87 -0
- package/dist/init/xr.d.ts.map +1 -0
- package/dist/init/xr.js +193 -0
- package/dist/init/xr.js.map +1 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/input-system.d.ts +52 -0
- package/dist/input/input-system.d.ts.map +1 -0
- package/dist/input/input-system.js +176 -0
- package/dist/input/input-system.js.map +1 -0
- package/dist/input/state-tags.d.ts +56 -0
- package/dist/input/state-tags.d.ts.map +1 -0
- package/dist/input/state-tags.js +63 -0
- package/dist/input/state-tags.js.map +1 -0
- package/dist/level/index.d.ts +12 -0
- package/dist/level/index.d.ts.map +1 -0
- package/dist/level/level-entity-creator.d.ts +27 -0
- package/dist/level/level-entity-creator.d.ts.map +1 -0
- package/dist/level/level-entity-creator.js +110 -0
- package/dist/level/level-entity-creator.js.map +1 -0
- package/dist/level/level-glxf-importer.d.ts +22 -0
- package/dist/level/level-glxf-importer.d.ts.map +1 -0
- package/dist/level/level-glxf-importer.js +40 -0
- package/dist/level/level-glxf-importer.js.map +1 -0
- package/dist/level/level-root.d.ts +18 -0
- package/dist/level/level-root.d.ts.map +1 -0
- package/dist/level/level-root.js +25 -0
- package/dist/level/level-root.js.map +1 -0
- package/dist/level/level-system.d.ts +54 -0
- package/dist/level/level-system.d.ts.map +1 -0
- package/dist/level/level-system.js +134 -0
- package/dist/level/level-system.js.map +1 -0
- package/dist/level/level-tag.d.ts +25 -0
- package/dist/level/level-tag.d.ts.map +1 -0
- package/dist/level/level-tag.js +28 -0
- package/dist/level/level-tag.js.map +1 -0
- package/dist/locomotion/geometries/beveled-cylinder.d.ts +12 -0
- package/dist/locomotion/geometries/beveled-cylinder.d.ts.map +1 -0
- package/dist/locomotion/geometries/beveled-cylinder.js +64 -0
- package/dist/locomotion/geometries/beveled-cylinder.js.map +1 -0
- package/dist/locomotion/index.d.ts +11 -0
- package/dist/locomotion/index.d.ts.map +1 -0
- package/dist/locomotion/locomotion.d.ts +239 -0
- package/dist/locomotion/locomotion.d.ts.map +1 -0
- package/dist/locomotion/locomotion.js +256 -0
- package/dist/locomotion/locomotion.js.map +1 -0
- package/dist/locomotion/materials/line.d.ts +24 -0
- package/dist/locomotion/materials/line.d.ts.map +1 -0
- package/dist/locomotion/materials/line.js +307 -0
- package/dist/locomotion/materials/line.js.map +1 -0
- package/dist/locomotion/slide.d.ts +76 -0
- package/dist/locomotion/slide.d.ts.map +1 -0
- package/dist/locomotion/slide.js +131 -0
- package/dist/locomotion/slide.js.map +1 -0
- package/dist/locomotion/teleport.d.ts +68 -0
- package/dist/locomotion/teleport.d.ts.map +1 -0
- package/dist/locomotion/teleport.js +150 -0
- package/dist/locomotion/teleport.js.map +1 -0
- package/dist/locomotion/turn.d.ts +77 -0
- package/dist/locomotion/turn.d.ts.map +1 -0
- package/dist/locomotion/turn.js +126 -0
- package/dist/locomotion/turn.js.map +1 -0
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.0.10_@pmndrs_uikit@1.0.32_super-three@0.177.0_/node_modules/@pmndrs/uikitml/dist/index.js +13 -0
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.0.10_@pmndrs_uikit@1.0.32_super-three@0.177.0_/node_modules/@pmndrs/uikitml/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.0.10_@pmndrs_uikit@1.0.32_super-three@0.177.0_/node_modules/@pmndrs/uikitml/dist/interpreter/index.js +154 -0
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.0.10_@pmndrs_uikit@1.0.32_super-three@0.177.0_/node_modules/@pmndrs/uikitml/dist/interpreter/index.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js +66 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js +162 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js +519 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js +15 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js +32 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js +10 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js +41 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js +35 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js +24 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js.map +1 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js +92 -0
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js.map +1 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js +382 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js.map +1 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js +2587 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js.map +1 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js +477 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js.map +1 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/src/math/MathUtils.js +17 -0
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/src/math/MathUtils.js.map +1 -0
- package/dist/physics/index.d.ts +11 -0
- package/dist/physics/index.d.ts.map +1 -0
- package/dist/physics/physics-system.d.ts +314 -0
- package/dist/physics/physics-system.d.ts.map +1 -0
- package/dist/physics/physics-system.js +419 -0
- package/dist/physics/physics-system.js.map +1 -0
- package/dist/physics/physicsBody.d.ts +83 -0
- package/dist/physics/physicsBody.d.ts.map +1 -0
- package/dist/physics/physicsBody.js +60 -0
- package/dist/physics/physicsBody.js.map +1 -0
- package/dist/physics/physicsManipulation.d.ts +51 -0
- package/dist/physics/physicsManipulation.d.ts.map +1 -0
- package/dist/physics/physicsManipulation.js +46 -0
- package/dist/physics/physicsManipulation.js.map +1 -0
- package/dist/physics/physicsShape.d.ts +133 -0
- package/dist/physics/physicsShape.d.ts.map +1 -0
- package/dist/physics/physicsShape.js +97 -0
- package/dist/physics/physicsShape.js.map +1 -0
- package/dist/physics/utils.d.ts +21 -0
- package/dist/physics/utils.d.ts.map +1 -0
- package/dist/physics/utils.js +130 -0
- package/dist/physics/utils.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/three.d.ts +8 -0
- package/dist/runtime/three.d.ts.map +1 -0
- package/dist/runtime/three.js +18 -0
- package/dist/runtime/three.js.map +1 -0
- package/dist/scene-understanding/anchor.d.ts +42 -0
- package/dist/scene-understanding/anchor.d.ts.map +1 -0
- package/dist/scene-understanding/anchor.js +45 -0
- package/dist/scene-understanding/anchor.js.map +1 -0
- package/dist/scene-understanding/index.d.ts +11 -0
- package/dist/scene-understanding/index.d.ts.map +1 -0
- package/dist/scene-understanding/mesh.d.ts +67 -0
- package/dist/scene-understanding/mesh.d.ts.map +1 -0
- package/dist/scene-understanding/mesh.js +55 -0
- package/dist/scene-understanding/mesh.js.map +1 -0
- package/dist/scene-understanding/plane.d.ts +39 -0
- package/dist/scene-understanding/plane.d.ts.map +1 -0
- package/dist/scene-understanding/plane.js +42 -0
- package/dist/scene-understanding/plane.js.map +1 -0
- package/dist/scene-understanding/scene-understanding-system.d.ts +180 -0
- package/dist/scene-understanding/scene-understanding-system.d.ts.map +1 -0
- package/dist/scene-understanding/scene-understanding-system.js +342 -0
- package/dist/scene-understanding/scene-understanding-system.js.map +1 -0
- package/dist/transform/index.d.ts +10 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/synced-quaternion.d.ts +35 -0
- package/dist/transform/synced-quaternion.d.ts.map +1 -0
- package/dist/transform/synced-quaternion.js +128 -0
- package/dist/transform/synced-quaternion.js.map +1 -0
- package/dist/transform/synced-vector3.d.ts +34 -0
- package/dist/transform/synced-vector3.d.ts.map +1 -0
- package/dist/transform/synced-vector3.js +106 -0
- package/dist/transform/synced-vector3.js.map +1 -0
- package/dist/transform/transform.d.ts +100 -0
- package/dist/transform/transform.d.ts.map +1 -0
- package/dist/transform/transform.js +194 -0
- package/dist/transform/transform.js.map +1 -0
- package/dist/types/webxr-augmentations.d.ts +23 -0
- package/dist/types/webxr-augmentations.d.ts.map +1 -0
- package/dist/ui/document.d.ts +112 -0
- package/dist/ui/document.d.ts.map +1 -0
- package/dist/ui/document.js +298 -0
- package/dist/ui/document.js.map +1 -0
- package/dist/ui/follow.d.ts +197 -0
- package/dist/ui/follow.d.ts.map +1 -0
- package/dist/ui/follow.js +143 -0
- package/dist/ui/follow.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/screenspace.d.ts +219 -0
- package/dist/ui/screenspace.d.ts.map +1 -0
- package/dist/ui/screenspace.js +215 -0
- package/dist/ui/screenspace.js.map +1 -0
- package/dist/ui/ui.d.ts +209 -0
- package/dist/ui/ui.d.ts.map +1 -0
- package/dist/ui/ui.js +185 -0
- package/dist/ui/ui.js.map +1 -0
- package/dist/vendor/basis/README.md +46 -0
- package/dist/vendor/basis/basis_transcoder.js +19 -0
- package/dist/vendor/basis/basis_transcoder.wasm +0 -0
- package/dist/vendor/draco/README.md +32 -0
- package/dist/vendor/draco/draco_decoder.js +34 -0
- package/dist/vendor/draco/draco_decoder.wasm +0 -0
- package/dist/vendor/draco/draco_encoder.js +33 -0
- package/dist/vendor/draco/draco_wasm_wrapper.js +117 -0
- package/dist/vendor/draco/gltf/draco_decoder.js +33 -0
- package/dist/vendor/draco/gltf/draco_decoder.wasm +0 -0
- package/dist/vendor/draco/gltf/draco_encoder.js +33 -0
- package/dist/vendor/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/visibility/index.d.ts +8 -0
- package/dist/visibility/index.d.ts.map +1 -0
- package/dist/visibility/visibility.d.ts +37 -0
- package/dist/visibility/visibility.d.ts.map +1 -0
- package/dist/visibility/visibility.js +52 -0
- package/dist/visibility/visibility.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { Component } from '@pmndrs/uikit';
|
|
2
|
+
import { signal } from '@preact/signals-core';
|
|
3
|
+
import { Group } from 'three';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
7
|
+
*
|
|
8
|
+
* This source code is licensed under the MIT license found in the
|
|
9
|
+
* LICENSE file in the root directory of this source tree.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Lightweight DOM-like wrapper around a UIKit root `Component` that lives in the 3D scene.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* - Provides query helpers (`getElementById`, `getElementsByClassName`, `querySelector(All)`).
|
|
16
|
+
* - Maintains reactive target dimensions via {@link targetWidth}/{@link targetHeight} and
|
|
17
|
+
* scales the group to fit while preserving aspect ratio.
|
|
18
|
+
* - Intended to be attached to an entity's `object3D` in world space or to the `camera` for
|
|
19
|
+
* screen‑space UI. Use together with {@link PanelUISystem} and {@link ScreenSpaceUISystem}.
|
|
20
|
+
*
|
|
21
|
+
* @category UI
|
|
22
|
+
*/
|
|
23
|
+
class UIKitDocument extends Group {
|
|
24
|
+
/**
|
|
25
|
+
* Create a document backed by a UIKit root component.
|
|
26
|
+
* @param rootComponent The root `Component` produced by `@pmndrs/uikitml` `interpret()`.
|
|
27
|
+
*/
|
|
28
|
+
constructor(rootComponent) {
|
|
29
|
+
super();
|
|
30
|
+
this.elementMap = new Map();
|
|
31
|
+
this.classMap = new Map();
|
|
32
|
+
this._abortController = new AbortController();
|
|
33
|
+
/** Reactive target width in meters. Set via {@link setTargetDimensions}. */
|
|
34
|
+
this.targetWidth = signal(0);
|
|
35
|
+
/** Reactive target height in meters. Set via {@link setTargetDimensions}. */
|
|
36
|
+
this.targetHeight = signal(0);
|
|
37
|
+
this._rootElement = rootComponent;
|
|
38
|
+
this.add(this._rootElement);
|
|
39
|
+
this.indexElements(rootComponent);
|
|
40
|
+
this.setupReactiveResizing();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Return the first element with a matching `id` (UIKit property).
|
|
44
|
+
* @param id The element identifier without the `#` prefix.
|
|
45
|
+
*/
|
|
46
|
+
getElementById(id) {
|
|
47
|
+
return this.elementMap.get(id) || null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Return all elements that include `className` in their class list.
|
|
51
|
+
* @param className The class without the preceding dot.
|
|
52
|
+
*/
|
|
53
|
+
getElementsByClassName(className) {
|
|
54
|
+
return this.classMap.get(className) || [];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Return the first element matching a simple CSS‑like selector.
|
|
58
|
+
*
|
|
59
|
+
* @remarks
|
|
60
|
+
* Supported selectors:
|
|
61
|
+
* - `#id`
|
|
62
|
+
* - `.class`
|
|
63
|
+
* - Descendant combinations, e.g. `#parent .child`
|
|
64
|
+
*/
|
|
65
|
+
querySelector(selector) {
|
|
66
|
+
const results = this.querySelectorAll(selector);
|
|
67
|
+
return results.length > 0 ? results[0] : null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Return all elements matching a simple CSS‑like selector. See {@link querySelector}.
|
|
71
|
+
*/
|
|
72
|
+
querySelectorAll(selector) {
|
|
73
|
+
// Handle descendant selectors (e.g., "#parent .child")
|
|
74
|
+
if (selector.includes(' ')) {
|
|
75
|
+
return this.parseDescendantSelector(selector);
|
|
76
|
+
}
|
|
77
|
+
// Handle simple selectors
|
|
78
|
+
if (selector.startsWith('#')) {
|
|
79
|
+
const element = this.getElementById(selector.substring(1));
|
|
80
|
+
return element ? [element] : [];
|
|
81
|
+
}
|
|
82
|
+
if (selector.startsWith('.')) {
|
|
83
|
+
return this.getElementsByClassName(selector.substring(1));
|
|
84
|
+
}
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
/** Parse descendant selectors like `#parent .child`. */
|
|
88
|
+
parseDescendantSelector(selector) {
|
|
89
|
+
const parts = selector.trim().split(/\s+/);
|
|
90
|
+
if (parts.length < 2) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
// Start with elements matching the first selector
|
|
94
|
+
let currentElements = this.querySelectorAll(parts[0]);
|
|
95
|
+
// For each subsequent selector part, find descendants
|
|
96
|
+
for (let i = 1; i < parts.length; i++) {
|
|
97
|
+
const nextSelector = parts[i];
|
|
98
|
+
const descendants = [];
|
|
99
|
+
for (const parent of currentElements) {
|
|
100
|
+
const childMatches = this.findDescendants(parent, nextSelector);
|
|
101
|
+
descendants.push(...childMatches);
|
|
102
|
+
}
|
|
103
|
+
currentElements = descendants;
|
|
104
|
+
if (currentElements.length === 0) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return currentElements;
|
|
109
|
+
}
|
|
110
|
+
/** Find all descendants of a parent that match a selector. */
|
|
111
|
+
findDescendants(parent, selector) {
|
|
112
|
+
const results = [];
|
|
113
|
+
this.searchDescendants(parent, selector, results);
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
/** Recursively search for descendants matching a selector. */
|
|
117
|
+
searchDescendants(parent, selector, results) {
|
|
118
|
+
for (const child of parent.children) {
|
|
119
|
+
if (child instanceof Component) {
|
|
120
|
+
if (this.matchesSelector(child, selector)) {
|
|
121
|
+
results.push(child);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Continue searching in children regardless of whether current child matched
|
|
125
|
+
this.searchDescendants(child, selector, results);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Check if a component matches a simple selector (`#id` or `.class`). */
|
|
129
|
+
matchesSelector(component, selector) {
|
|
130
|
+
var _a, _b, _c, _d;
|
|
131
|
+
if (selector.startsWith('#')) {
|
|
132
|
+
const id = (_c = (_b = (_a = component.properties) === null || _a === void 0 ? void 0 : _a.signal) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.value;
|
|
133
|
+
return id === selector.substring(1);
|
|
134
|
+
}
|
|
135
|
+
if (selector.startsWith('.')) {
|
|
136
|
+
const className = selector.substring(1);
|
|
137
|
+
const classList = component.classList
|
|
138
|
+
? ((_d = component.classList.list) === null || _d === void 0 ? void 0 : _d.filter((c) => typeof c === 'string')) || []
|
|
139
|
+
: [];
|
|
140
|
+
return classList.includes(className);
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if `element` is a descendant of `ancestor`.
|
|
146
|
+
* @returns `true` if `ancestor` appears in the parent chain of `element`.
|
|
147
|
+
*/
|
|
148
|
+
isDescendantOf(element, ancestor) {
|
|
149
|
+
let current = element.parent;
|
|
150
|
+
while (current) {
|
|
151
|
+
if (current === ancestor) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
current = current.parent;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
/** Convenience for `querySelectorAll("${parent} ${child}")`. */
|
|
159
|
+
querySelectorAllWithin(parentSelector, childSelector) {
|
|
160
|
+
return this.querySelectorAll(`${parentSelector} ${childSelector}`);
|
|
161
|
+
}
|
|
162
|
+
/** Convenience for the first match of `querySelectorAllWithin`. */
|
|
163
|
+
querySelectorWithin(parentSelector, childSelector) {
|
|
164
|
+
return this.querySelector(`${parentSelector} ${childSelector}`);
|
|
165
|
+
}
|
|
166
|
+
/** Set up reactivity that rescales the group when size or target changes. */
|
|
167
|
+
setupReactiveResizing() {
|
|
168
|
+
var _a;
|
|
169
|
+
const abortSignal = this._abortController.signal;
|
|
170
|
+
// React to changes in target dimensions or root component size to apply scaling
|
|
171
|
+
const targetWidthUnsubscribe = this.targetWidth.subscribe(() => this.updateScaling());
|
|
172
|
+
const targetHeightUnsubscribe = this.targetHeight.subscribe(() => this.updateScaling());
|
|
173
|
+
const sizeUnsubscribe = (_a = this._rootElement.size) === null || _a === void 0 ? void 0 : _a.subscribe(() => this.updateScaling());
|
|
174
|
+
abortSignal.addEventListener('abort', () => {
|
|
175
|
+
targetWidthUnsubscribe();
|
|
176
|
+
targetHeightUnsubscribe();
|
|
177
|
+
sizeUnsubscribe === null || sizeUnsubscribe === void 0 ? void 0 : sizeUnsubscribe();
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** Compute uniform scale to fit the target width/height while preserving aspect ratio. */
|
|
181
|
+
updateScaling() {
|
|
182
|
+
var _a;
|
|
183
|
+
const targetWorldWidth = this.targetWidth.value;
|
|
184
|
+
const targetWorldHeight = this.targetHeight.value;
|
|
185
|
+
const uiNaturalSize = (_a = this._rootElement.size) === null || _a === void 0 ? void 0 : _a.value;
|
|
186
|
+
if (targetWorldWidth > 0 &&
|
|
187
|
+
targetWorldHeight > 0 &&
|
|
188
|
+
uiNaturalSize &&
|
|
189
|
+
Array.isArray(uiNaturalSize) &&
|
|
190
|
+
uiNaturalSize.length >= 2) {
|
|
191
|
+
const [uiWidth, uiHeight] = uiNaturalSize;
|
|
192
|
+
if (typeof uiWidth === 'number' &&
|
|
193
|
+
typeof uiHeight === 'number' &&
|
|
194
|
+
uiWidth > 0 &&
|
|
195
|
+
uiHeight > 0) {
|
|
196
|
+
// Convert UIKit dimensions to world space units (UIKit uses cm units)
|
|
197
|
+
const uiWidthInWorldUnits = uiWidth / 100;
|
|
198
|
+
const uiHeightInWorldUnits = uiHeight / 100;
|
|
199
|
+
const scaleX = targetWorldWidth / uiWidthInWorldUnits;
|
|
200
|
+
const scaleY = targetWorldHeight / uiHeightInWorldUnits;
|
|
201
|
+
const optimalScale = Math.min(scaleX, scaleY);
|
|
202
|
+
// Apply scale to the Group (this), not the root element
|
|
203
|
+
this.scale.setScalar(optimalScale);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Set desired dimensions for the UI in meters. The document computes a uniform scale
|
|
209
|
+
* that fits these constraints while preserving aspect ratio.
|
|
210
|
+
* @param width Target width in meters.
|
|
211
|
+
* @param height Target height in meters.
|
|
212
|
+
*/
|
|
213
|
+
setTargetDimensions(width, height) {
|
|
214
|
+
this.targetWidth.value = width;
|
|
215
|
+
this.targetHeight.value = height;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Current intrinsic size of the UIKit root component (in UIKit units, centimeters),
|
|
219
|
+
* if available from the underlying component's `size` signal.
|
|
220
|
+
*/
|
|
221
|
+
get computedSize() {
|
|
222
|
+
var _a;
|
|
223
|
+
const sizeValue = (_a = this._rootElement.size) === null || _a === void 0 ? void 0 : _a.value;
|
|
224
|
+
if (sizeValue && Array.isArray(sizeValue) && sizeValue.length >= 2) {
|
|
225
|
+
const [width, height] = sizeValue;
|
|
226
|
+
if (typeof width === 'number' && typeof height === 'number') {
|
|
227
|
+
return { width, height };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
/** Return the most recently requested target size in meters. */
|
|
233
|
+
get targetSize() {
|
|
234
|
+
return {
|
|
235
|
+
width: this.targetWidth.value,
|
|
236
|
+
height: this.targetHeight.value,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/** The root UIKit component for this document. */
|
|
240
|
+
get rootElement() {
|
|
241
|
+
return this._rootElement;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Dispose of internal resources and detach children. Safe to call multiple times.
|
|
245
|
+
*/
|
|
246
|
+
dispose() {
|
|
247
|
+
// Abort all effects to clean up signal subscriptions
|
|
248
|
+
this._abortController.abort();
|
|
249
|
+
// Dispose of the root UIKit Component which will clean up all resources
|
|
250
|
+
if (this._rootElement && typeof this._rootElement.dispose === 'function') {
|
|
251
|
+
this._rootElement.dispose();
|
|
252
|
+
}
|
|
253
|
+
// Remove root element from this Group
|
|
254
|
+
this.remove(this._rootElement);
|
|
255
|
+
// Clear internal maps
|
|
256
|
+
this.elementMap.clear();
|
|
257
|
+
this.classMap.clear();
|
|
258
|
+
}
|
|
259
|
+
/** String summary useful for debugging. */
|
|
260
|
+
toString() {
|
|
261
|
+
const elementCount = this.elementMap.size;
|
|
262
|
+
const classCount = this.classMap.size;
|
|
263
|
+
const computed = this.computedSize;
|
|
264
|
+
const target = this.targetSize;
|
|
265
|
+
return `UIKitDocument { elements: ${elementCount}, classes: ${classCount}, computed: ${computed ? `${computed.width}x${computed.height}` : 'none'}, target: ${target.width}x${target.height} }`;
|
|
266
|
+
}
|
|
267
|
+
/** Index IDs and classes for DOM‑like queries. */
|
|
268
|
+
indexElements(object) {
|
|
269
|
+
var _a, _b, _c, _d;
|
|
270
|
+
// Only index UIKit Components, not all Object3Ds
|
|
271
|
+
if (object instanceof Component) {
|
|
272
|
+
// Access id from UIKit's properties system
|
|
273
|
+
const id = (_c = (_b = (_a = object.properties) === null || _a === void 0 ? void 0 : _a.signal) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.value;
|
|
274
|
+
// Access classes from UIKit's ClassList - work around iterator bug by accessing private list
|
|
275
|
+
const classList = object.classList
|
|
276
|
+
? ((_d = object.classList.list) === null || _d === void 0 ? void 0 : _d.filter((c) => typeof c === 'string')) || []
|
|
277
|
+
: [];
|
|
278
|
+
// Index by ID
|
|
279
|
+
if (id) {
|
|
280
|
+
this.elementMap.set(id, object);
|
|
281
|
+
}
|
|
282
|
+
// Index by class names
|
|
283
|
+
for (const className of classList) {
|
|
284
|
+
if (!this.classMap.has(className)) {
|
|
285
|
+
this.classMap.set(className, []);
|
|
286
|
+
}
|
|
287
|
+
this.classMap.get(className).push(object);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Recursively index children
|
|
291
|
+
for (const child of object.children) {
|
|
292
|
+
this.indexElements(child);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export { UIKitDocument };
|
|
298
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sources":["../../src/ui/document.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAAA;;;;;AAKG;AAMH;;;;;;;;;;;AAWG;AACG,MAAO,aAAc,SAAQ,KAAK,CAAA;AAWtC;;;AAGG;AACH,IAAA,WAAA,CAAY,aAA6B,EAAA;AACvC,QAAA,KAAK,EAAE;AAfD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,GAAG,EAA0B;AAC9C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,GAAG,EAA4B;AAE9C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,EAAE;;AAGvC,QAAA,IAAA,CAAA,WAAW,GAAmB,MAAM,CAAC,CAAC,CAAC;;AAEvC,QAAA,IAAA,CAAA,YAAY,GAAmB,MAAM,CAAC,CAAC,CAAC;AAS/C,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;QAEjC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,EAAU,EAAA;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;IACxC;AAEA;;;AAGG;AACH,IAAA,sBAAsB,CAAC,SAAiB,EAAA;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;IAC3C;AAEA;;;;;;;;AAQG;AACH,IAAA,aAAa,CAAC,QAAgB,EAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC/C,QAAA,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAC/C;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,QAAgB,EAAA;;AAE/B,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;QAC/C;;AAGA,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;QACjC;AACA,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3D;AAEA,QAAA,OAAO,EAAE;IACX;;AAGQ,IAAA,uBAAuB,CAAC,QAAgB,EAAA;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AAC1C,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,OAAO,EAAE;QACX;;QAGA,IAAI,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAGrD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;YAC7B,MAAM,WAAW,GAAqB,EAAE;AAExC,YAAA,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE;gBACpC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC;AAC/D,gBAAA,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;YACnC;YAEA,eAAe,GAAG,WAAW;AAC7B,YAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChC;YACF;QACF;AAEA,QAAA,OAAO,eAAe;IACxB;;IAGQ,eAAe,CACrB,MAAsB,EACtB,QAAgB,EAAA;QAEhB,MAAM,OAAO,GAAqB,EAAE;QACpC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AACjD,QAAA,OAAO,OAAO;IAChB;;AAGQ,IAAA,iBAAiB,CACvB,MAAgB,EAChB,QAAgB,EAChB,OAAyB,EAAA;AAEzB,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,IAAI,KAAK,YAAY,SAAS,EAAE;gBAC9B,IAAI,IAAI,CAAC,eAAe,CAAC,KAAuB,EAAE,QAAQ,CAAC,EAAE;AAC3D,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAY,CAAC;gBAC5B;YACF;;YAEA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;QAClD;IACF;;IAGQ,eAAe,CACrB,SAAyB,EACzB,QAAgB,EAAA;;AAEhB,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC5B,YAAA,MAAM,EAAE,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,SAAS,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;YAClD,OAAO,EAAE,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC;AAEA,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC;kBACxB,CAAC,CAAA,EAAA,GAAC,SAAS,CAAC,SAAiB,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CACxC,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,CACrB,KAAI;kBAClB,EAAE;AACN,YAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;;AAGG;IACH,cAAc,CAAC,OAAuB,EAAE,QAAwB,EAAA;AAC9D,QAAA,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM;QAC5B,OAAO,OAAO,EAAE;AACd,YAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;AACxB,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,OAAO,GAAG,OAAO,CAAC,MAAM;QAC1B;AACA,QAAA,OAAO,KAAK;IACd;;IAGA,sBAAsB,CACpB,cAAsB,EACtB,aAAqB,EAAA;QAErB,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAC;IACpE;;IAEA,mBAAmB,CACjB,cAAsB,EACtB,aAAqB,EAAA;QAErB,OAAO,IAAI,CAAC,aAAa,CAAC,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAC;IACjE;;IAEQ,qBAAqB,GAAA;;AAC3B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM;;AAGhD,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MACxD,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAC1D,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,MAAM,eAAe,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAC,MACxD,IAAI,CAAC,aAAa,EAAE,CACrB;AAED,QAAA,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AACzC,YAAA,sBAAsB,EAAE;AACxB,YAAA,uBAAuB,EAAE;AACzB,YAAA,eAAe,KAAA,IAAA,IAAf,eAAe,KAAA,MAAA,GAAA,MAAA,GAAf,eAAe,EAAI;AACrB,QAAA,CAAC,CAAC;IACJ;;IAGQ,aAAa,GAAA;;AACnB,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;AAC/C,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QACjD,MAAM,aAAa,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;QAEnD,IACE,gBAAgB,GAAG,CAAC;AACpB,YAAA,iBAAiB,GAAG,CAAC;YACrB,aAAa;AACb,YAAA,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;AAC5B,YAAA,aAAa,CAAC,MAAM,IAAI,CAAC,EACzB;AACA,YAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,aAAa;YACzC,IACE,OAAO,OAAO,KAAK,QAAQ;gBAC3B,OAAO,QAAQ,KAAK,QAAQ;AAC5B,gBAAA,OAAO,GAAG,CAAC;gBACX,QAAQ,GAAG,CAAC,EACZ;;AAEA,gBAAA,MAAM,mBAAmB,GAAG,OAAO,GAAG,GAAG;AACzC,gBAAA,MAAM,oBAAoB,GAAG,QAAQ,GAAG,GAAG;AAE3C,gBAAA,MAAM,MAAM,GAAG,gBAAgB,GAAG,mBAAmB;AACrD,gBAAA,MAAM,MAAM,GAAG,iBAAiB,GAAG,oBAAoB;gBACvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;;AAG7C,gBAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;YACpC;QACF;IACF;AAEA;;;;;AAKG;IACH,mBAAmB,CAAC,KAAa,EAAE,MAAc,EAAA;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM;IAClC;AAEA;;;AAGG;AACH,IAAA,IAAI,YAAY,GAAA;;QACd,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;AAC/C,QAAA,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;AAClE,YAAA,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS;YACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC3D,gBAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;YAC1B;QACF;AACA,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;AAC7B,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;SAChC;IACH;;AAGA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA;;AAEG;IACH,OAAO,GAAA;;AAEL,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;;AAG7B,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,KAAK,UAAU,EAAE;AACxE,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QAC7B;;AAGA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;;AAG9B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;IACvB;;IAGA,QAAQ,GAAA;AACN,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AACzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU;AAC9B,QAAA,OAAO,CAAA,0BAAA,EAA6B,YAAY,CAAA,WAAA,EAAc,UAAU,CAAA,YAAA,EAAe,QAAQ,GAAG,CAAA,EAAG,QAAQ,CAAC,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,CAAE,GAAG,MAAM,CAAA,UAAA,EAAa,MAAM,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,IAAI;IACjM;;AAGQ,IAAA,aAAa,CAAC,MAAgB,EAAA;;;AAEpC,QAAA,IAAI,MAAM,YAAY,SAAS,EAAE;;AAE/B,YAAA,MAAM,EAAE,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;;AAE/C,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC;kBACrB,CAAC,CAAA,EAAA,GAAC,MAAM,CAAC,SAAiB,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CACrC,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,CACrB,KAAI;kBAClB,EAAE;;YAGN,IAAI,EAAE,EAAE;gBACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAa,CAAC;YACxC;;AAGA,YAAA,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE;gBACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;oBACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClC;AACA,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,MAAa,CAAC;YACnD;QACF;;AAGA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAC3B;IACF;AACD;;;;"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
import { Types } from '../ecs/index.js';
|
|
8
|
+
/** Behavior modes for {@link Follower}. @category UI */
|
|
9
|
+
export declare const FollowBehavior: {
|
|
10
|
+
FaceTarget: string;
|
|
11
|
+
PivotY: string;
|
|
12
|
+
NoRotation: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Makes an entity follow a target `Object3D` with optional rotation behavior.
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* - `PivotY` keeps the follower level while rotating around the Y axis to face the target.
|
|
19
|
+
* - `FaceTarget` fully rotates to look at the target.
|
|
20
|
+
* - `NoRotation` only moves position.
|
|
21
|
+
*
|
|
22
|
+
* @example Attach to an entity to follow the HMD at shoulder‑height
|
|
23
|
+
* ```ts
|
|
24
|
+
* entity.addComponent(Follower, {
|
|
25
|
+
* target: xrRig.head,
|
|
26
|
+
* offsetPosition: [0.25, -0.2, -0.35],
|
|
27
|
+
* behavior: FollowBehavior.PivotY,
|
|
28
|
+
* speed: 5,
|
|
29
|
+
* tolerance: 0.3,
|
|
30
|
+
* })
|
|
31
|
+
* ```
|
|
32
|
+
* @category UI
|
|
33
|
+
*/
|
|
34
|
+
export declare const Follower: import("elics").Component<{
|
|
35
|
+
/** Object to follow (e.g., `world.player.head`). */
|
|
36
|
+
target: {
|
|
37
|
+
type: Types.Object;
|
|
38
|
+
default: undefined;
|
|
39
|
+
};
|
|
40
|
+
/** Offset from the target in the target's local space. */
|
|
41
|
+
offsetPosition: {
|
|
42
|
+
type: Types.Vec3;
|
|
43
|
+
default: [number, number, number];
|
|
44
|
+
};
|
|
45
|
+
behavior: {
|
|
46
|
+
type: Types.Enum;
|
|
47
|
+
enum: {
|
|
48
|
+
FaceTarget: string;
|
|
49
|
+
PivotY: string;
|
|
50
|
+
NoRotation: string;
|
|
51
|
+
};
|
|
52
|
+
default: string;
|
|
53
|
+
};
|
|
54
|
+
/** Degrees of allowable angular deviation before target snaps forward. */
|
|
55
|
+
maxAngle: {
|
|
56
|
+
type: Types.Float32;
|
|
57
|
+
default: number;
|
|
58
|
+
};
|
|
59
|
+
/** Meters of allowable positional slack before catching up. */
|
|
60
|
+
tolerance: {
|
|
61
|
+
type: Types.Float32;
|
|
62
|
+
default: number;
|
|
63
|
+
};
|
|
64
|
+
/** Lerp speed towards the target position. */
|
|
65
|
+
speed: {
|
|
66
|
+
type: Types.Float32;
|
|
67
|
+
default: number;
|
|
68
|
+
};
|
|
69
|
+
/** Internal: one‑time sync to jump to the target position. */
|
|
70
|
+
needsPositionSync: {
|
|
71
|
+
type: Types.Boolean;
|
|
72
|
+
default: true;
|
|
73
|
+
};
|
|
74
|
+
/** Internal: smoothed follow target in world space. */
|
|
75
|
+
_followTarget: {
|
|
76
|
+
type: Types.Vec3;
|
|
77
|
+
default: [number, number, number];
|
|
78
|
+
};
|
|
79
|
+
}>;
|
|
80
|
+
declare const FollowSystem_base: import("elics").SystemConstructor<import("elics").SystemSchema, {
|
|
81
|
+
follower: {
|
|
82
|
+
required: import("elics").Component<{
|
|
83
|
+
/** Object to follow (e.g., `world.player.head`). */
|
|
84
|
+
target: {
|
|
85
|
+
type: Types.Object;
|
|
86
|
+
default: undefined;
|
|
87
|
+
};
|
|
88
|
+
/** Offset from the target in the target's local space. */
|
|
89
|
+
offsetPosition: {
|
|
90
|
+
type: Types.Vec3;
|
|
91
|
+
default: [number, number, number];
|
|
92
|
+
};
|
|
93
|
+
behavior: {
|
|
94
|
+
type: Types.Enum;
|
|
95
|
+
enum: {
|
|
96
|
+
FaceTarget: string;
|
|
97
|
+
PivotY: string;
|
|
98
|
+
NoRotation: string;
|
|
99
|
+
};
|
|
100
|
+
default: string;
|
|
101
|
+
};
|
|
102
|
+
/** Degrees of allowable angular deviation before target snaps forward. */
|
|
103
|
+
maxAngle: {
|
|
104
|
+
type: Types.Float32;
|
|
105
|
+
default: number;
|
|
106
|
+
};
|
|
107
|
+
/** Meters of allowable positional slack before catching up. */
|
|
108
|
+
tolerance: {
|
|
109
|
+
type: Types.Float32;
|
|
110
|
+
default: number;
|
|
111
|
+
};
|
|
112
|
+
/** Lerp speed towards the target position. */
|
|
113
|
+
speed: {
|
|
114
|
+
type: Types.Float32;
|
|
115
|
+
default: number;
|
|
116
|
+
};
|
|
117
|
+
/** Internal: one‑time sync to jump to the target position. */
|
|
118
|
+
needsPositionSync: {
|
|
119
|
+
type: Types.Boolean;
|
|
120
|
+
default: true;
|
|
121
|
+
};
|
|
122
|
+
/** Internal: smoothed follow target in world space. */
|
|
123
|
+
_followTarget: {
|
|
124
|
+
type: Types.Vec3;
|
|
125
|
+
default: [number, number, number];
|
|
126
|
+
};
|
|
127
|
+
}>[];
|
|
128
|
+
};
|
|
129
|
+
}, import("../ecs/world.js").World, import("../ecs/system.js").System<import("elics").SystemSchema, {
|
|
130
|
+
follower: {
|
|
131
|
+
required: import("elics").Component<{
|
|
132
|
+
/** Object to follow (e.g., `world.player.head`). */
|
|
133
|
+
target: {
|
|
134
|
+
type: Types.Object;
|
|
135
|
+
default: undefined;
|
|
136
|
+
};
|
|
137
|
+
/** Offset from the target in the target's local space. */
|
|
138
|
+
offsetPosition: {
|
|
139
|
+
type: Types.Vec3;
|
|
140
|
+
default: [number, number, number];
|
|
141
|
+
};
|
|
142
|
+
behavior: {
|
|
143
|
+
type: Types.Enum;
|
|
144
|
+
enum: {
|
|
145
|
+
FaceTarget: string;
|
|
146
|
+
PivotY: string;
|
|
147
|
+
NoRotation: string;
|
|
148
|
+
};
|
|
149
|
+
default: string;
|
|
150
|
+
};
|
|
151
|
+
/** Degrees of allowable angular deviation before target snaps forward. */
|
|
152
|
+
maxAngle: {
|
|
153
|
+
type: Types.Float32;
|
|
154
|
+
default: number;
|
|
155
|
+
};
|
|
156
|
+
/** Meters of allowable positional slack before catching up. */
|
|
157
|
+
tolerance: {
|
|
158
|
+
type: Types.Float32;
|
|
159
|
+
default: number;
|
|
160
|
+
};
|
|
161
|
+
/** Lerp speed towards the target position. */
|
|
162
|
+
speed: {
|
|
163
|
+
type: Types.Float32;
|
|
164
|
+
default: number;
|
|
165
|
+
};
|
|
166
|
+
/** Internal: one‑time sync to jump to the target position. */
|
|
167
|
+
needsPositionSync: {
|
|
168
|
+
type: Types.Boolean;
|
|
169
|
+
default: true;
|
|
170
|
+
};
|
|
171
|
+
/** Internal: smoothed follow target in world space. */
|
|
172
|
+
_followTarget: {
|
|
173
|
+
type: Types.Vec3;
|
|
174
|
+
default: [number, number, number];
|
|
175
|
+
};
|
|
176
|
+
}>[];
|
|
177
|
+
};
|
|
178
|
+
}>>;
|
|
179
|
+
/**
|
|
180
|
+
* Updates entities with {@link Follower} to chase a target using smoothed motion,
|
|
181
|
+
* with constraints on angle and distance.
|
|
182
|
+
*
|
|
183
|
+
* @category UI
|
|
184
|
+
*/
|
|
185
|
+
export declare class FollowSystem extends FollowSystem_base {
|
|
186
|
+
private followTarget;
|
|
187
|
+
private strictFollowTarget;
|
|
188
|
+
private deltaVec3;
|
|
189
|
+
private targetPosition;
|
|
190
|
+
private followerPosition;
|
|
191
|
+
private targetForward;
|
|
192
|
+
private quat;
|
|
193
|
+
private euler;
|
|
194
|
+
update(delta: number): void;
|
|
195
|
+
}
|
|
196
|
+
export {};
|
|
197
|
+
//# sourceMappingURL=follow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/ui/follow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAiC,MAAM,iBAAiB,CAAC;AASvE,wDAAwD;AACxD,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,QAAQ;IAGjB,oDAAoD;;;;;IAEpD,0DAA0D;;;;;;;;;;;;;;IAO1D,0EAA0E;;;;;IAE1E,+DAA+D;;;;;IAE/D,8CAA8C;;;;;IAE9C,8DAA8D;;;;;IAE9D,uDAAuD;;;;;EAI1D,CAAC;;;;YArBE,oDAAoD;;;;;YAEpD,0DAA0D;;;;;;;;;;;;;;YAO1D,0EAA0E;;;;;YAE1E,+DAA+D;;;;;YAE/D,8CAA8C;;;;;YAE9C,8DAA8D;;;;;YAE9D,uDAAuD;;;;;;;;;;YAjBvD,oDAAoD;;;;;YAEpD,0DAA0D;;;;;;;;;;;;;;YAO1D,0EAA0E;;;;;YAE1E,+DAA+D;;;;;YAE/D,8CAA8C;;;;;YAE9C,8DAA8D;;;;;YAE9D,uDAAuD;;;;;;;;AAM3D;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,iBAEhC;IACA,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,kBAAkB,CAAiB;IAC3C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,gBAAgB,CAAiB;IACzC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,KAAK,CAAe;IAE5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAuE5B"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createSystem } from '../ecs/system.js';
|
|
2
|
+
import '../ecs/world.js';
|
|
3
|
+
import { createComponent, Types } from 'elics';
|
|
4
|
+
import '../ecs/component-registry.js';
|
|
5
|
+
import '../runtime/three.js';
|
|
6
|
+
import { Vector3, Quaternion, Euler, MathUtils } from 'three';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
10
|
+
*
|
|
11
|
+
* This source code is licensed under the MIT license found in the
|
|
12
|
+
* LICENSE file in the root directory of this source tree.
|
|
13
|
+
*/
|
|
14
|
+
/** Behavior modes for {@link Follower}. @category UI */
|
|
15
|
+
const FollowBehavior = {
|
|
16
|
+
FaceTarget: 'face-target',
|
|
17
|
+
PivotY: 'pivot-y',
|
|
18
|
+
NoRotation: 'no-rotation',
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Makes an entity follow a target `Object3D` with optional rotation behavior.
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* - `PivotY` keeps the follower level while rotating around the Y axis to face the target.
|
|
25
|
+
* - `FaceTarget` fully rotates to look at the target.
|
|
26
|
+
* - `NoRotation` only moves position.
|
|
27
|
+
*
|
|
28
|
+
* @example Attach to an entity to follow the HMD at shoulder‑height
|
|
29
|
+
* ```ts
|
|
30
|
+
* entity.addComponent(Follower, {
|
|
31
|
+
* target: xrRig.head,
|
|
32
|
+
* offsetPosition: [0.25, -0.2, -0.35],
|
|
33
|
+
* behavior: FollowBehavior.PivotY,
|
|
34
|
+
* speed: 5,
|
|
35
|
+
* tolerance: 0.3,
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
* @category UI
|
|
39
|
+
*/
|
|
40
|
+
const Follower = createComponent('Follower', {
|
|
41
|
+
/** Object to follow (e.g., `world.player.head`). */
|
|
42
|
+
target: { type: Types.Object, default: undefined },
|
|
43
|
+
/** Offset from the target in the target's local space. */
|
|
44
|
+
offsetPosition: { type: Types.Vec3, default: [0, 0, 0] },
|
|
45
|
+
behavior: {
|
|
46
|
+
type: Types.Enum,
|
|
47
|
+
enum: FollowBehavior,
|
|
48
|
+
default: FollowBehavior.PivotY,
|
|
49
|
+
},
|
|
50
|
+
/** Degrees of allowable angular deviation before target snaps forward. */
|
|
51
|
+
maxAngle: { type: Types.Float32, default: 30 },
|
|
52
|
+
/** Meters of allowable positional slack before catching up. */
|
|
53
|
+
tolerance: { type: Types.Float32, default: 0.4 },
|
|
54
|
+
/** Lerp speed towards the target position. */
|
|
55
|
+
speed: { type: Types.Float32, default: 1 },
|
|
56
|
+
/** Internal: one‑time sync to jump to the target position. */
|
|
57
|
+
needsPositionSync: { type: Types.Boolean, default: true },
|
|
58
|
+
/** Internal: smoothed follow target in world space. */
|
|
59
|
+
_followTarget: { type: Types.Vec3, default: [0, 0, 0] },
|
|
60
|
+
}, 'Component for following another object');
|
|
61
|
+
/**
|
|
62
|
+
* Updates entities with {@link Follower} to chase a target using smoothed motion,
|
|
63
|
+
* with constraints on angle and distance.
|
|
64
|
+
*
|
|
65
|
+
* @category UI
|
|
66
|
+
*/
|
|
67
|
+
class FollowSystem extends createSystem({
|
|
68
|
+
follower: { required: [Follower] },
|
|
69
|
+
}) {
|
|
70
|
+
constructor() {
|
|
71
|
+
super(...arguments);
|
|
72
|
+
this.followTarget = new Vector3();
|
|
73
|
+
this.strictFollowTarget = new Vector3();
|
|
74
|
+
this.deltaVec3 = new Vector3();
|
|
75
|
+
this.targetPosition = new Vector3();
|
|
76
|
+
this.followerPosition = new Vector3();
|
|
77
|
+
this.targetForward = new Vector3();
|
|
78
|
+
this.quat = new Quaternion();
|
|
79
|
+
this.euler = new Euler();
|
|
80
|
+
}
|
|
81
|
+
update(delta) {
|
|
82
|
+
this.queries.follower.entities.forEach((entity) => {
|
|
83
|
+
const object = entity.object3D;
|
|
84
|
+
const target = entity.getValue(Follower, 'target');
|
|
85
|
+
if (!object || !target || !object.parent) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const followTargetVecView = entity.getVectorView(Follower, '_followTarget');
|
|
89
|
+
this.followTarget.fromArray(followTargetVecView);
|
|
90
|
+
const behavior = entity.getValue(Follower, 'behavior');
|
|
91
|
+
const offsetPosition = entity.getVectorView(Follower, 'offsetPosition');
|
|
92
|
+
target.getWorldQuaternion(this.quat);
|
|
93
|
+
target.getWorldPosition(this.targetPosition);
|
|
94
|
+
if (behavior === FollowBehavior.PivotY) {
|
|
95
|
+
this.euler.setFromQuaternion(this.quat, 'YXZ');
|
|
96
|
+
this.euler.x = 0;
|
|
97
|
+
this.euler.z = 0;
|
|
98
|
+
this.quat.setFromEuler(this.euler);
|
|
99
|
+
}
|
|
100
|
+
this.strictFollowTarget
|
|
101
|
+
.fromArray(offsetPosition)
|
|
102
|
+
.applyQuaternion(this.quat)
|
|
103
|
+
.add(this.targetPosition);
|
|
104
|
+
this.targetForward.set(0, 0, -1).applyQuaternion(this.quat);
|
|
105
|
+
object.getWorldPosition(this.deltaVec3).sub(this.targetPosition);
|
|
106
|
+
if (behavior === FollowBehavior.PivotY) {
|
|
107
|
+
this.targetForward.y = 0;
|
|
108
|
+
this.deltaVec3.y = 0;
|
|
109
|
+
this.strictFollowTarget.y = this.targetPosition.y;
|
|
110
|
+
}
|
|
111
|
+
if (entity.getValue(Follower, 'needsPositionSync')) {
|
|
112
|
+
object.position
|
|
113
|
+
.copy(this.strictFollowTarget)
|
|
114
|
+
.toArray(followTargetVecView);
|
|
115
|
+
entity.setValue(Follower, 'needsPositionSync', false);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const distance = object.parent
|
|
119
|
+
.worldToLocal(this.strictFollowTarget)
|
|
120
|
+
.distanceTo(this.followTarget);
|
|
121
|
+
const deltaAngle = MathUtils.radToDeg(Math.acos(this.targetForward.normalize().dot(this.deltaVec3.normalize())));
|
|
122
|
+
if (distance > entity.getValue(Follower, 'tolerance') ||
|
|
123
|
+
deltaAngle > entity.getValue(Follower, 'maxAngle')) {
|
|
124
|
+
this.followTarget
|
|
125
|
+
.copy(this.strictFollowTarget)
|
|
126
|
+
.toArray(followTargetVecView);
|
|
127
|
+
}
|
|
128
|
+
const speed = entity.getValue(Follower, 'speed');
|
|
129
|
+
object.position.lerp(this.followTarget, delta * speed);
|
|
130
|
+
}
|
|
131
|
+
if (behavior === FollowBehavior.FaceTarget ||
|
|
132
|
+
behavior === FollowBehavior.PivotY) {
|
|
133
|
+
if (behavior === FollowBehavior.PivotY) {
|
|
134
|
+
this.targetPosition.y = object.getWorldPosition(this.followerPosition).y;
|
|
135
|
+
}
|
|
136
|
+
object.lookAt(this.targetPosition);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { FollowBehavior, FollowSystem, Follower };
|
|
143
|
+
//# sourceMappingURL=follow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow.js","sources":["../../src/ui/follow.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|