@relu-interactives/spatial-ecs 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -0
- package/dist/System-rXAmagXA.d.cts +659 -0
- package/dist/System-rXAmagXA.d.ts +659 -0
- package/dist/Video-CDemv74U.d.cts +1261 -0
- package/dist/Video-ChKV1UI7.d.ts +1261 -0
- package/dist/assets/draco/draco_decoder.js +34 -0
- package/dist/assets/draco/draco_decoder.wasm +0 -0
- package/dist/assets/draco/draco_wasm_wrapper.js +117 -0
- package/dist/chunk-AYEF3X2P.js +223 -0
- package/dist/chunk-AYEF3X2P.js.map +1 -0
- package/dist/chunk-MAWBTMCG.js +1722 -0
- package/dist/chunk-MAWBTMCG.js.map +1 -0
- package/dist/chunk-NFDTIYR4.js +248 -0
- package/dist/chunk-NFDTIYR4.js.map +1 -0
- package/dist/chunk-OY7ZODZP.js +16 -0
- package/dist/chunk-OY7ZODZP.js.map +1 -0
- package/dist/chunk-P2YDX5DB.js +3304 -0
- package/dist/chunk-P2YDX5DB.js.map +1 -0
- package/dist/chunk-QHILSPT4.js +3 -0
- package/dist/chunk-QHILSPT4.js.map +1 -0
- package/dist/chunk-XWIEEJ7Z.js +1315 -0
- package/dist/chunk-XWIEEJ7Z.js.map +1 -0
- package/dist/components/index.cjs +1745 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +4 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/docs/api/Behaviour/classes/Behaviour.md +554 -0
- package/dist/docs/api/Behaviour/index.md +15 -0
- package/dist/docs/api/Component/classes/Component.md +57 -0
- package/dist/docs/api/Component/index.md +15 -0
- package/dist/docs/api/components/classes/AnimationComponent.md +318 -0
- package/dist/docs/api/components/classes/AudioComponent.md +114 -0
- package/dist/docs/api/components/classes/CameraComponent.md +59 -0
- package/dist/docs/api/components/classes/EntityType.md +48 -0
- package/dist/docs/api/components/classes/Environment.md +47 -0
- package/dist/docs/api/components/classes/ImageComponent.md +57 -0
- package/dist/docs/api/components/classes/ImageTarget.md +60 -0
- package/dist/docs/api/components/classes/ImageTargetAnchor.md +48 -0
- package/dist/docs/api/components/classes/LightComponent.md +70 -0
- package/dist/docs/api/components/classes/MaterialComponent.md +181 -0
- package/dist/docs/api/components/classes/MeshComponent.md +48 -0
- package/dist/docs/api/components/classes/MeshGeometryComponent.md +64 -0
- package/dist/docs/api/components/classes/ModelComponent.md +49 -0
- package/dist/docs/api/components/classes/Name.md +46 -0
- package/dist/docs/api/components/classes/Object3DRef.md +54 -0
- package/dist/docs/api/components/classes/ParentId.md +47 -0
- package/dist/docs/api/components/classes/PhysicsComponent.md +82 -0
- package/dist/docs/api/components/classes/Postprocessing.md +49 -0
- package/dist/docs/api/components/classes/ScriptComponent.md +54 -0
- package/dist/docs/api/components/classes/Selectable.md +46 -0
- package/dist/docs/api/components/classes/SelectionTransformState.md +54 -0
- package/dist/docs/api/components/classes/SpriteComponent.md +55 -0
- package/dist/docs/api/components/classes/TransformComponent.md +197 -0
- package/dist/docs/api/components/classes/VideoComponent.md +123 -0
- package/dist/docs/api/components/functions/normalizePhysicsState.md +23 -0
- package/dist/docs/api/components/index.md +94 -0
- package/dist/docs/api/components/type-aliases/AnimationComponentOptions.md +42 -0
- package/dist/docs/api/components/type-aliases/CameraComponentOptions.md +45 -0
- package/dist/docs/api/components/type-aliases/CameraProjection.md +15 -0
- package/dist/docs/api/components/type-aliases/CameraRuntimeType.md +15 -0
- package/dist/docs/api/components/type-aliases/ColliderShape.md +15 -0
- package/dist/docs/api/components/type-aliases/ColliderState.md +62 -0
- package/dist/docs/api/components/type-aliases/CubeMeshParameters.md +27 -0
- package/dist/docs/api/components/type-aliases/EditableMeshObjectKind.md +15 -0
- package/dist/docs/api/components/type-aliases/EnvironmentFogState.md +37 -0
- package/dist/docs/api/components/type-aliases/EnvironmentFogType.md +15 -0
- package/dist/docs/api/components/type-aliases/EnvironmentGradientEffect.md +15 -0
- package/dist/docs/api/components/type-aliases/EnvironmentSkyboxState.md +34 -0
- package/dist/docs/api/components/type-aliases/EnvironmentSkyboxType.md +15 -0
- package/dist/docs/api/components/type-aliases/EnvironmentState.md +29 -0
- package/dist/docs/api/components/type-aliases/ImageTargetAnchorOptions.md +25 -0
- package/dist/docs/api/components/type-aliases/ImageTargetReference.md +33 -0
- package/dist/docs/api/components/type-aliases/LightValueState.md +41 -0
- package/dist/docs/api/components/type-aliases/MaterialTypeValue.md +15 -0
- package/dist/docs/api/components/type-aliases/MaterialValueState.md +75 -0
- package/dist/docs/api/components/type-aliases/MeshGeometryParameters.md +13 -0
- package/dist/docs/api/components/type-aliases/MeshGeometryParametersByKind.md +33 -0
- package/dist/docs/api/components/type-aliases/PhysicsState.md +25 -0
- package/dist/docs/api/components/type-aliases/PlaneMeshParameters.md +25 -0
- package/dist/docs/api/components/type-aliases/PostprocessingState.md +164 -0
- package/dist/docs/api/components/type-aliases/RadiusHeightMeshParameters.md +25 -0
- package/dist/docs/api/components/type-aliases/RadiusMeshParameters.md +23 -0
- package/dist/docs/api/components/type-aliases/RigidbodyState.md +53 -0
- package/dist/docs/api/components/type-aliases/RigidbodyType.md +19 -0
- package/dist/docs/api/components/type-aliases/ScriptEntry.md +38 -0
- package/dist/docs/api/components/type-aliases/TextureFilteringValue.md +15 -0
- package/dist/docs/api/components/type-aliases/TransformData.md +27 -0
- package/dist/docs/api/components/type-aliases/TransformModeValue.md +15 -0
- package/dist/docs/api/components/type-aliases/TransformSpaceValue.md +15 -0
- package/dist/docs/api/components/type-aliases/Vec3.md +27 -0
- package/dist/docs/api/components/variables/DEFAULT_COLLIDER_STATE.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_STATE.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_MESH_GEOMETRY_PARAMETERS.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_PHYSICS_STATE.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_POSTPROCESSING_STATE.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_RIGIDBODY_STATE.md +13 -0
- package/dist/docs/api/index/classes/AnimationStateMachine.md +201 -0
- package/dist/docs/api/index/classes/AnimationStateManager.md +253 -0
- package/dist/docs/api/index/classes/AnimationSystem.md +68 -0
- package/dist/docs/api/index/classes/AudioSystem.md +98 -0
- package/dist/docs/api/index/classes/CameraSyncSystem.md +49 -0
- package/dist/docs/api/index/classes/EnvironmentSyncSystem.md +75 -0
- package/dist/docs/api/index/classes/InputSystem.md +449 -0
- package/dist/docs/api/index/classes/LightSyncSystem.md +49 -0
- package/dist/docs/api/index/classes/MaterialSyncSystem.md +67 -0
- package/dist/docs/api/index/classes/MeshGeometrySystem.md +49 -0
- package/dist/docs/api/index/classes/ObjectManagementSystem.md +298 -0
- package/dist/docs/api/index/classes/ObjectVisibilitySystem.md +49 -0
- package/dist/docs/api/index/classes/PhysicsSyncSystem.md +83 -0
- package/dist/docs/api/index/classes/PostprocessingSyncSystem.md +80 -0
- package/dist/docs/api/index/classes/RenderSystem.md +64 -0
- package/dist/docs/api/index/classes/ScriptBehaviourSystem.md +83 -0
- package/dist/docs/api/index/classes/TransformSyncSystem.md +49 -0
- package/dist/docs/api/index/classes/VideoSystem.md +97 -0
- package/dist/docs/api/index/classes/World.md +1405 -0
- package/dist/docs/api/index/functions/createAnimationComponent.md +28 -0
- package/dist/docs/api/index/functions/createAudioComponent.md +32 -0
- package/dist/docs/api/index/functions/createCameraComponent.md +28 -0
- package/dist/docs/api/index/functions/createEntityTypeComponent.md +28 -0
- package/dist/docs/api/index/functions/createEnvironmentComponent.md +28 -0
- package/dist/docs/api/index/functions/createImageComponent.md +28 -0
- package/dist/docs/api/index/functions/createImageTargetAnchorComponent.md +28 -0
- package/dist/docs/api/index/functions/createImageTargetComponent.md +28 -0
- package/dist/docs/api/index/functions/createLightComponent.md +28 -0
- package/dist/docs/api/index/functions/createMaterialComponent.md +28 -0
- package/dist/docs/api/index/functions/createMeshComponent.md +28 -0
- package/dist/docs/api/index/functions/createMeshGeometryComponent.md +28 -0
- package/dist/docs/api/index/functions/createModelComponent.md +28 -0
- package/dist/docs/api/index/functions/createNameComponent.md +28 -0
- package/dist/docs/api/index/functions/createObject3DRefComponent.md +28 -0
- package/dist/docs/api/index/functions/createParentIdComponent.md +28 -0
- package/dist/docs/api/index/functions/createPhysicsComponent.md +30 -0
- package/dist/docs/api/index/functions/createPostprocessingComponent.md +28 -0
- package/dist/docs/api/index/functions/createScriptComponent.md +28 -0
- package/dist/docs/api/index/functions/createSelectableComponent.md +28 -0
- package/dist/docs/api/index/functions/createSelectionTransformStateComponent.md +28 -0
- package/dist/docs/api/index/functions/createSpriteComponent.md +28 -0
- package/dist/docs/api/index/functions/createTransformComponent.md +28 -0
- package/dist/docs/api/index/functions/createVideoComponent.md +28 -0
- package/dist/docs/api/index/functions/hydrateWorldFromSnapshot.md +28 -0
- package/dist/docs/api/index/functions/hydrateWorldFromSnapshotDetailed.md +28 -0
- package/dist/docs/api/index/functions/registerDefaultComponentFactories.md +23 -0
- package/dist/docs/api/index/functions/registerDefaultFactories.md +23 -0
- package/dist/docs/api/index/index.md +249 -0
- package/dist/docs/api/index/interfaces/EcsSystem.md +50 -0
- package/dist/docs/api/index/interfaces/StateMachine.md +26 -0
- package/dist/docs/api/index/type-aliases/AnimationStateCallbacks.md +25 -0
- package/dist/docs/api/index/type-aliases/ComponentFactory.md +25 -0
- package/dist/docs/api/index/type-aliases/EcsComponentFactoryKind.md +37 -0
- package/dist/docs/api/index/type-aliases/EcsWorldComponentSnapshot.md +26 -0
- package/dist/docs/api/index/type-aliases/EcsWorldStateSnapshotLike.md +25 -0
- package/dist/docs/api/index/type-aliases/HydrateWorldFromSnapshotResult.md +23 -0
- package/dist/docs/api/index/type-aliases/KeyboardKey.md +13 -0
- package/dist/docs/api/index/type-aliases/MouseButton.md +13 -0
- package/dist/docs/api/index/type-aliases/SelectionContext.md +31 -0
- package/dist/docs/api/index/variables/HYDRATABLE_ENTITY_KINDS.md +13 -0
- package/dist/docs/api/index/variables/KeyboardKeys.md +195 -0
- package/dist/docs/api/index.md +15 -0
- package/dist/docs/api/typedoc-sidebar.json +1 -0
- package/dist/docs/api/types/index.md +34 -0
- package/dist/docs/api/types/type-aliases/AssetInput.md +23 -0
- package/dist/docs/api/types/type-aliases/CheckboxInput.md +13 -0
- package/dist/docs/api/types/type-aliases/ColorInput.md +13 -0
- package/dist/docs/api/types/type-aliases/ComponentInput.md +52 -0
- package/dist/docs/api/types/type-aliases/ComponentKind.md +37 -0
- package/dist/docs/api/types/type-aliases/DropdownInput.md +23 -0
- package/dist/docs/api/types/type-aliases/DropdownOption.md +23 -0
- package/dist/docs/api/types/type-aliases/EcsEntityEditorKind.md +15 -0
- package/dist/docs/api/types/type-aliases/EcsEntityKind.md +35 -0
- package/dist/docs/api/types/type-aliases/EntityId.md +16 -0
- package/dist/docs/api/types/type-aliases/EntityInput.md +23 -0
- package/dist/docs/api/types/type-aliases/FloatInput.md +13 -0
- package/dist/docs/api/types/type-aliases/IntersectionResult.md +29 -0
- package/dist/docs/api/types/type-aliases/ParentLookup.md +26 -0
- package/dist/docs/api/types/type-aliases/SelectionListener.md +25 -0
- package/dist/docs/api/types/type-aliases/SliderInput.md +27 -0
- package/dist/docs/api/types/type-aliases/TextInput.md +13 -0
- package/dist/docs/api/types/type-aliases/ToggleInput.md +13 -0
- package/dist/docs/api/types/type-aliases/Vec3.md +23 -0
- package/dist/docs/api/types/type-aliases/Vector2Input.md +23 -0
- package/dist/docs/api/types/type-aliases/Vector3Input.md +25 -0
- package/dist/docs/api/types/type-aliases/WorldEntityView.md +17 -0
- package/dist/docs/guide/accessing-components.md +399 -0
- package/dist/docs/guide/authoring-a-behaviour.md +166 -0
- package/dist/docs/guide/behaviour-lifecycle.md +43 -0
- package/dist/docs/guide/component-catalog.md +59 -0
- package/dist/docs/guide/components/_sidebar.json +78 -0
- package/dist/docs/guide/components/animation.md +171 -0
- package/dist/docs/guide/components/audio.md +181 -0
- package/dist/docs/guide/components/camera.md +179 -0
- package/dist/docs/guide/components/entity-type.md +141 -0
- package/dist/docs/guide/components/image-target-anchor.md +103 -0
- package/dist/docs/guide/components/image-target.md +122 -0
- package/dist/docs/guide/components/image.md +146 -0
- package/dist/docs/guide/components/light.md +157 -0
- package/dist/docs/guide/components/material.md +161 -0
- package/dist/docs/guide/components/mesh-geometry.md +153 -0
- package/dist/docs/guide/components/mesh.md +151 -0
- package/dist/docs/guide/components/model.md +96 -0
- package/dist/docs/guide/components/name.md +121 -0
- package/dist/docs/guide/components/object3d-ref.md +115 -0
- package/dist/docs/guide/components/parent-id.md +108 -0
- package/dist/docs/guide/components/physics.md +163 -0
- package/dist/docs/guide/components/script.md +142 -0
- package/dist/docs/guide/components/sprite.md +155 -0
- package/dist/docs/guide/components/transform.md +155 -0
- package/dist/docs/guide/components/video.md +153 -0
- package/dist/docs/guide/concepts.md +34 -0
- package/dist/docs/guide/getting-started/creating-objects.md +50 -0
- package/dist/docs/guide/getting-started/editing-objects.md +62 -0
- package/dist/docs/guide/getting-started/editor/assets-browser.md +55 -0
- package/dist/docs/guide/getting-started/editor/hierarchy.md +47 -0
- package/dist/docs/guide/getting-started/editor/index.md +16 -0
- package/dist/docs/guide/getting-started/editor/inspector.md +36 -0
- package/dist/docs/guide/getting-started/editor/modules.md +35 -0
- package/dist/docs/guide/getting-started/editor/scene-inspector.md +64 -0
- package/dist/docs/guide/getting-started/editor/toolbar.md +39 -0
- package/dist/docs/guide/getting-started/editor/viewport.md +43 -0
- package/dist/docs/guide/getting-started/first-launch.md +17 -0
- package/dist/docs/guide/getting-started/index.md +37 -0
- package/dist/docs/guide/getting-started/installation.md +59 -0
- package/dist/docs/guide/getting-started/preview-and-test.md +55 -0
- package/dist/docs/guide/getting-started/project-types/3d.md +30 -0
- package/dist/docs/guide/getting-started/project-types/ar.md +6 -0
- package/dist/docs/guide/getting-started/project-types/face-tracking.md +6 -0
- package/dist/docs/guide/getting-started/project-types/image-tracking.md +42 -0
- package/dist/docs/guide/getting-started/project-types/index.md +25 -0
- package/dist/docs/guide/getting-started/project-types/vr.md +6 -0
- package/dist/docs/guide/getting-started/projects.md +53 -0
- package/dist/docs/guide/getting-started/shortcuts.md +43 -0
- package/dist/docs/guide/inspector-data-binding.md +367 -0
- package/dist/docs/guide/reading-input.md +202 -0
- package/dist/docs/guide/scene/environment.md +101 -0
- package/dist/docs/guide/scene/index.md +36 -0
- package/dist/docs/guide/scene/postprocessing.md +108 -0
- package/dist/docs/guide/spawning/ambient-light.md +28 -0
- package/dist/docs/guide/spawning/area-light.md +32 -0
- package/dist/docs/guide/spawning/audio.md +42 -0
- package/dist/docs/guide/spawning/camera.md +50 -0
- package/dist/docs/guide/spawning/capsule.md +29 -0
- package/dist/docs/guide/spawning/cube.md +31 -0
- package/dist/docs/guide/spawning/cylinder.md +29 -0
- package/dist/docs/guide/spawning/directional-light.md +32 -0
- package/dist/docs/guide/spawning/empty.md +31 -0
- package/dist/docs/guide/spawning/image-target.md +48 -0
- package/dist/docs/guide/spawning/image.md +33 -0
- package/dist/docs/guide/spawning/index.md +79 -0
- package/dist/docs/guide/spawning/model.md +31 -0
- package/dist/docs/guide/spawning/plane.md +31 -0
- package/dist/docs/guide/spawning/point-light.md +32 -0
- package/dist/docs/guide/spawning/sphere.md +29 -0
- package/dist/docs/guide/spawning/spot-light.md +32 -0
- package/dist/docs/guide/spawning/sprite.md +31 -0
- package/dist/docs/guide/spawning/video.md +53 -0
- package/dist/docs/guide/system-overview.md +73 -0
- package/dist/docs/guide/systems/_sidebar.json +66 -0
- package/dist/docs/guide/systems/animation-system.md +32 -0
- package/dist/docs/guide/systems/audio-system.md +28 -0
- package/dist/docs/guide/systems/camera-sync-system.md +31 -0
- package/dist/docs/guide/systems/environment-sync-system.md +31 -0
- package/dist/docs/guide/systems/input-system.md +217 -0
- package/dist/docs/guide/systems/light-sync-system.md +29 -0
- package/dist/docs/guide/systems/material-sync-system.md +32 -0
- package/dist/docs/guide/systems/mesh-geometry-system.md +40 -0
- package/dist/docs/guide/systems/object-management-system.md +38 -0
- package/dist/docs/guide/systems/object-visibility-system.md +26 -0
- package/dist/docs/guide/systems/physics-sync-system.md +56 -0
- package/dist/docs/guide/systems/postprocessing-sync-system.md +43 -0
- package/dist/docs/guide/systems/render-system.md +22 -0
- package/dist/docs/guide/systems/script-behaviour-system.md +59 -0
- package/dist/docs/guide/systems/transform-sync-system.md +29 -0
- package/dist/docs/guide/systems/video-system.md +30 -0
- package/dist/docs/guide/world-api.md +405 -0
- package/dist/factories/index.cjs +3077 -0
- package/dist/factories/index.cjs.map +1 -0
- package/dist/factories/index.d.cts +69 -0
- package/dist/factories/index.d.ts +69 -0
- package/dist/factories/index.js +6 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/index-B4-YyUNR.d.cts +73 -0
- package/dist/index-BZUOKeTO.d.ts +73 -0
- package/dist/index.cjs +8584 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +283 -0
- package/dist/index.d.ts +283 -0
- package/dist/index.js +1729 -0
- package/dist/index.js.map +1 -0
- package/dist/systems/index.cjs +5119 -0
- package/dist/systems/index.cjs.map +1 -0
- package/dist/systems/index.d.cts +200 -0
- package/dist/systems/index.d.ts +200 -0
- package/dist/systems/index.js +6 -0
- package/dist/systems/index.js.map +1 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +3 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/worldSnapshotUtils.cjs +259 -0
- package/dist/worldSnapshotUtils.cjs.map +1 -0
- package/dist/worldSnapshotUtils.d.cts +3 -0
- package/dist/worldSnapshotUtils.d.ts +3 -0
- package/dist/worldSnapshotUtils.js +4 -0
- package/dist/worldSnapshotUtils.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,1315 @@
|
|
|
1
|
+
import { resolveDracoDecoderPath, createTransform, applyTransform } from './chunk-AYEF3X2P.js';
|
|
2
|
+
import { AnimationComponent, AudioComponent, Object3DRef, CameraComponent, PhysicsComponent, Environment, EntityType, ImageComponent, ImageTargetAnchor, ImageTarget, LightComponent, MaterialComponent, MeshComponent, MeshGeometryComponent, ModelComponent, Name, ParentId, Postprocessing, ScriptComponent, Selectable, SelectionTransformState, SpriteComponent, TransformComponent, VideoComponent } from './chunk-MAWBTMCG.js';
|
|
3
|
+
import { __name } from './chunk-OY7ZODZP.js';
|
|
4
|
+
import * as THREE20 from 'three';
|
|
5
|
+
import { RectAreaLightHelper } from 'three/examples/jsm/helpers/RectAreaLightHelper.js';
|
|
6
|
+
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
|
|
7
|
+
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
|
|
8
|
+
|
|
9
|
+
// core/factories/components/AnimationFactory.ts
|
|
10
|
+
function createAnimationComponent(world, entityId, ...args) {
|
|
11
|
+
const component = new AnimationComponent(...args);
|
|
12
|
+
world.addComponent(entityId, component);
|
|
13
|
+
return component;
|
|
14
|
+
}
|
|
15
|
+
__name(createAnimationComponent, "createAnimationComponent");
|
|
16
|
+
function normalizeDistanceModel(distanceModel) {
|
|
17
|
+
const normalized = distanceModel.trim().toLowerCase();
|
|
18
|
+
if (normalized === "linear" || normalized === "exponential") {
|
|
19
|
+
return normalized;
|
|
20
|
+
}
|
|
21
|
+
return "inverse";
|
|
22
|
+
}
|
|
23
|
+
__name(normalizeDistanceModel, "normalizeDistanceModel");
|
|
24
|
+
function createConfiguredAudio(listener, options) {
|
|
25
|
+
const sound = options.positional ? new THREE20.PositionalAudio(listener) : new THREE20.Audio(listener);
|
|
26
|
+
sound.setLoop(options.loop);
|
|
27
|
+
sound.setVolume(options.volume);
|
|
28
|
+
sound.setPlaybackRate(options.pitch);
|
|
29
|
+
if (sound instanceof THREE20.PositionalAudio) {
|
|
30
|
+
sound.setRefDistance(options.refDistance);
|
|
31
|
+
sound.setDistanceModel(normalizeDistanceModel(options.distanceModel));
|
|
32
|
+
sound.setRolloffFactor(options.rolloffFactor);
|
|
33
|
+
}
|
|
34
|
+
return sound;
|
|
35
|
+
}
|
|
36
|
+
__name(createConfiguredAudio, "createConfiguredAudio");
|
|
37
|
+
function createAudioEditorHelper() {
|
|
38
|
+
if (typeof document === "undefined") {
|
|
39
|
+
const geometry = new THREE20.EdgesGeometry(
|
|
40
|
+
new THREE20.OctahedronGeometry(0.22, 0)
|
|
41
|
+
);
|
|
42
|
+
const material2 = new THREE20.LineBasicMaterial({
|
|
43
|
+
color: "#8bc8ff",
|
|
44
|
+
transparent: true,
|
|
45
|
+
opacity: 0.95,
|
|
46
|
+
depthTest: false
|
|
47
|
+
});
|
|
48
|
+
const fallback = new THREE20.LineSegments(geometry, material2);
|
|
49
|
+
fallback.renderOrder = 10;
|
|
50
|
+
fallback.userData.ecsHelper = true;
|
|
51
|
+
fallback.visible = false;
|
|
52
|
+
return fallback;
|
|
53
|
+
}
|
|
54
|
+
const size = 96;
|
|
55
|
+
const canvas = document.createElement("canvas");
|
|
56
|
+
canvas.width = size;
|
|
57
|
+
canvas.height = size;
|
|
58
|
+
const ctx = canvas.getContext("2d");
|
|
59
|
+
if (!ctx) {
|
|
60
|
+
return new THREE20.Object3D();
|
|
61
|
+
}
|
|
62
|
+
ctx.clearRect(0, 0, size, size);
|
|
63
|
+
ctx.fillStyle = "rgba(27, 35, 52, 0.9)";
|
|
64
|
+
ctx.beginPath();
|
|
65
|
+
ctx.arc(size / 2, size / 2, 36, 0, Math.PI * 2);
|
|
66
|
+
ctx.fill();
|
|
67
|
+
ctx.strokeStyle = "rgba(137, 202, 255, 0.9)";
|
|
68
|
+
ctx.lineWidth = 4;
|
|
69
|
+
ctx.beginPath();
|
|
70
|
+
ctx.arc(size / 2, size / 2, 36, 0, Math.PI * 2);
|
|
71
|
+
ctx.stroke();
|
|
72
|
+
ctx.fillStyle = "#d9ecff";
|
|
73
|
+
ctx.beginPath();
|
|
74
|
+
ctx.moveTo(33, 56);
|
|
75
|
+
ctx.lineTo(43, 56);
|
|
76
|
+
ctx.lineTo(54, 66);
|
|
77
|
+
ctx.lineTo(54, 30);
|
|
78
|
+
ctx.lineTo(43, 40);
|
|
79
|
+
ctx.lineTo(33, 40);
|
|
80
|
+
ctx.closePath();
|
|
81
|
+
ctx.fill();
|
|
82
|
+
ctx.strokeStyle = "#7fd2ff";
|
|
83
|
+
ctx.lineWidth = 4;
|
|
84
|
+
ctx.lineCap = "round";
|
|
85
|
+
ctx.beginPath();
|
|
86
|
+
ctx.arc(56, 48, 10, -0.8, 0.8);
|
|
87
|
+
ctx.stroke();
|
|
88
|
+
ctx.beginPath();
|
|
89
|
+
ctx.arc(56, 48, 16, -0.8, 0.8);
|
|
90
|
+
ctx.stroke();
|
|
91
|
+
const texture = new THREE20.CanvasTexture(canvas);
|
|
92
|
+
texture.needsUpdate = true;
|
|
93
|
+
const material = new THREE20.SpriteMaterial({
|
|
94
|
+
map: texture,
|
|
95
|
+
transparent: true,
|
|
96
|
+
depthTest: false
|
|
97
|
+
});
|
|
98
|
+
const helper = new THREE20.Sprite(material);
|
|
99
|
+
helper.scale.set(0.68, 0.68, 0.68);
|
|
100
|
+
helper.renderOrder = 10;
|
|
101
|
+
helper.userData.ecsHelper = true;
|
|
102
|
+
helper.visible = false;
|
|
103
|
+
return helper;
|
|
104
|
+
}
|
|
105
|
+
__name(createAudioEditorHelper, "createAudioEditorHelper");
|
|
106
|
+
function createAudioComponent(world, entityId, path = "", options = {}, context) {
|
|
107
|
+
const component = new AudioComponent(path, options);
|
|
108
|
+
const anchor = context?.object ?? null;
|
|
109
|
+
const listener = context?.listener ?? null;
|
|
110
|
+
if (anchor && listener) {
|
|
111
|
+
component.object = anchor;
|
|
112
|
+
const sound = createConfiguredAudio(listener, component.options);
|
|
113
|
+
if (context?.isEditor) {
|
|
114
|
+
anchor.add(createAudioEditorHelper());
|
|
115
|
+
}
|
|
116
|
+
anchor.add(sound);
|
|
117
|
+
component.audio = sound;
|
|
118
|
+
}
|
|
119
|
+
world.addComponent(entityId, component);
|
|
120
|
+
return component;
|
|
121
|
+
}
|
|
122
|
+
__name(createAudioComponent, "createAudioComponent");
|
|
123
|
+
function createCameraComponent(world, entityId, payload = {}) {
|
|
124
|
+
const object = world.getComponent(entityId, Object3DRef)?.object;
|
|
125
|
+
const objectCamera = object instanceof THREE20.Camera ? object : void 0;
|
|
126
|
+
const component = new CameraComponent({
|
|
127
|
+
...payload,
|
|
128
|
+
camera: payload.camera ?? objectCamera
|
|
129
|
+
});
|
|
130
|
+
world.addComponent(entityId, component);
|
|
131
|
+
return component;
|
|
132
|
+
}
|
|
133
|
+
__name(createCameraComponent, "createCameraComponent");
|
|
134
|
+
|
|
135
|
+
// core/factories/components/PhysicsFactory.ts
|
|
136
|
+
function createPhysicsComponent(world, entityId, values) {
|
|
137
|
+
const component = new PhysicsComponent(values);
|
|
138
|
+
world.addComponent(entityId, component);
|
|
139
|
+
return component;
|
|
140
|
+
}
|
|
141
|
+
__name(createPhysicsComponent, "createPhysicsComponent");
|
|
142
|
+
|
|
143
|
+
// core/factories/components/EnvironmentFactory.ts
|
|
144
|
+
function createEnvironmentComponent(world, entityId, values) {
|
|
145
|
+
const component = new Environment(values);
|
|
146
|
+
world.addComponent(entityId, component);
|
|
147
|
+
return component;
|
|
148
|
+
}
|
|
149
|
+
__name(createEnvironmentComponent, "createEnvironmentComponent");
|
|
150
|
+
|
|
151
|
+
// core/factories/components/EntityTypeFactory.ts
|
|
152
|
+
function createEntityTypeComponent(world, entityId, ...args) {
|
|
153
|
+
const component = new EntityType(...args);
|
|
154
|
+
world.addComponent(entityId, component);
|
|
155
|
+
return component;
|
|
156
|
+
}
|
|
157
|
+
__name(createEntityTypeComponent, "createEntityTypeComponent");
|
|
158
|
+
|
|
159
|
+
// core/factories/components/ImageComponentFactory.ts
|
|
160
|
+
function createImageComponent(world, entityId, ...args) {
|
|
161
|
+
const component = new ImageComponent(...args);
|
|
162
|
+
world.addComponent(entityId, component);
|
|
163
|
+
return component;
|
|
164
|
+
}
|
|
165
|
+
__name(createImageComponent, "createImageComponent");
|
|
166
|
+
|
|
167
|
+
// core/factories/components/ImageTargetAnchorFactory.ts
|
|
168
|
+
function createImageTargetAnchorComponent(world, entityId, ...args) {
|
|
169
|
+
const component = new ImageTargetAnchor(...args);
|
|
170
|
+
world.addComponent(entityId, component);
|
|
171
|
+
return component;
|
|
172
|
+
}
|
|
173
|
+
__name(createImageTargetAnchorComponent, "createImageTargetAnchorComponent");
|
|
174
|
+
|
|
175
|
+
// core/factories/components/ImageTargetFactory.ts
|
|
176
|
+
function createImageTargetComponent(world, entityId, ...args) {
|
|
177
|
+
const component = new ImageTarget(...args);
|
|
178
|
+
world.addComponent(entityId, component);
|
|
179
|
+
return component;
|
|
180
|
+
}
|
|
181
|
+
__name(createImageTargetComponent, "createImageTargetComponent");
|
|
182
|
+
|
|
183
|
+
// core/factories/components/LightFactory.ts
|
|
184
|
+
function createLightComponent(world, entityId, ...args) {
|
|
185
|
+
const component = new LightComponent(...args);
|
|
186
|
+
world.addComponent(entityId, component);
|
|
187
|
+
return component;
|
|
188
|
+
}
|
|
189
|
+
__name(createLightComponent, "createLightComponent");
|
|
190
|
+
|
|
191
|
+
// core/factories/components/MaterialFactory.ts
|
|
192
|
+
function createMaterialComponent(world, entityId, ...args) {
|
|
193
|
+
const component = new MaterialComponent(...args);
|
|
194
|
+
world.addComponent(entityId, component);
|
|
195
|
+
return component;
|
|
196
|
+
}
|
|
197
|
+
__name(createMaterialComponent, "createMaterialComponent");
|
|
198
|
+
|
|
199
|
+
// core/factories/components/MeshFactory.ts
|
|
200
|
+
function createMeshComponent(world, entityId, ...args) {
|
|
201
|
+
const component = new MeshComponent(...args);
|
|
202
|
+
world.addComponent(entityId, component);
|
|
203
|
+
return component;
|
|
204
|
+
}
|
|
205
|
+
__name(createMeshComponent, "createMeshComponent");
|
|
206
|
+
|
|
207
|
+
// core/factories/components/MeshGeometryFactory.ts
|
|
208
|
+
function createMeshGeometryComponent(world, entityId, ...args) {
|
|
209
|
+
const component = new MeshGeometryComponent(...args);
|
|
210
|
+
world.addComponent(entityId, component);
|
|
211
|
+
return component;
|
|
212
|
+
}
|
|
213
|
+
__name(createMeshGeometryComponent, "createMeshGeometryComponent");
|
|
214
|
+
|
|
215
|
+
// core/factories/components/ModelFactory.ts
|
|
216
|
+
function createModelComponent(world, entityId, ...args) {
|
|
217
|
+
const component = new ModelComponent(...args);
|
|
218
|
+
world.addComponent(entityId, component);
|
|
219
|
+
return component;
|
|
220
|
+
}
|
|
221
|
+
__name(createModelComponent, "createModelComponent");
|
|
222
|
+
|
|
223
|
+
// core/factories/components/NameFactory.ts
|
|
224
|
+
function createNameComponent(world, entityId, ...args) {
|
|
225
|
+
const component = new Name(...args);
|
|
226
|
+
world.addComponent(entityId, component);
|
|
227
|
+
return component;
|
|
228
|
+
}
|
|
229
|
+
__name(createNameComponent, "createNameComponent");
|
|
230
|
+
|
|
231
|
+
// core/factories/components/Object3DRefFactory.ts
|
|
232
|
+
function createObject3DRefComponent(world, entityId, ...args) {
|
|
233
|
+
const component = new Object3DRef(...args);
|
|
234
|
+
world.addComponent(entityId, component);
|
|
235
|
+
return component;
|
|
236
|
+
}
|
|
237
|
+
__name(createObject3DRefComponent, "createObject3DRefComponent");
|
|
238
|
+
|
|
239
|
+
// core/factories/components/ParentIdFactory.ts
|
|
240
|
+
function createParentIdComponent(world, entityId, ...args) {
|
|
241
|
+
const component = new ParentId(...args);
|
|
242
|
+
world.addComponent(entityId, component);
|
|
243
|
+
return component;
|
|
244
|
+
}
|
|
245
|
+
__name(createParentIdComponent, "createParentIdComponent");
|
|
246
|
+
|
|
247
|
+
// core/factories/components/PostprocessingFactory.ts
|
|
248
|
+
function createPostprocessingComponent(world, entityId, values) {
|
|
249
|
+
const component = new Postprocessing(values);
|
|
250
|
+
world.addComponent(entityId, component);
|
|
251
|
+
return component;
|
|
252
|
+
}
|
|
253
|
+
__name(createPostprocessingComponent, "createPostprocessingComponent");
|
|
254
|
+
|
|
255
|
+
// core/factories/components/ScriptComponentFactory.ts
|
|
256
|
+
function createScriptComponent(world, entityId, payload = {}) {
|
|
257
|
+
const entries = Array.isArray(payload.entries) ? payload.entries.map((entry) => ({
|
|
258
|
+
entityId,
|
|
259
|
+
className: typeof entry.className === "string" ? entry.className : "",
|
|
260
|
+
scriptUrl: typeof entry.scriptUrl === "string" ? entry.scriptUrl : "",
|
|
261
|
+
enabled: typeof entry.enabled === "boolean" ? entry.enabled : true,
|
|
262
|
+
data: entry.data && typeof entry.data === "object" && !Array.isArray(entry.data) ? entry.data : {},
|
|
263
|
+
runtimeState: entry.runtimeState,
|
|
264
|
+
runtimeMessage: typeof entry.runtimeMessage === "string" ? entry.runtimeMessage : void 0
|
|
265
|
+
})) : [];
|
|
266
|
+
const component = new ScriptComponent(entries);
|
|
267
|
+
world.addComponent(entityId, component);
|
|
268
|
+
return component;
|
|
269
|
+
}
|
|
270
|
+
__name(createScriptComponent, "createScriptComponent");
|
|
271
|
+
|
|
272
|
+
// core/factories/components/SelectableFactory.ts
|
|
273
|
+
function createSelectableComponent(world, entityId, ...args) {
|
|
274
|
+
const component = new Selectable(...args);
|
|
275
|
+
world.addComponent(entityId, component);
|
|
276
|
+
return component;
|
|
277
|
+
}
|
|
278
|
+
__name(createSelectableComponent, "createSelectableComponent");
|
|
279
|
+
|
|
280
|
+
// core/factories/components/SelectionTransformStateFactory.ts
|
|
281
|
+
function createSelectionTransformStateComponent(world, entityId, ...args) {
|
|
282
|
+
const component = new SelectionTransformState(...args);
|
|
283
|
+
world.addComponent(entityId, component);
|
|
284
|
+
return component;
|
|
285
|
+
}
|
|
286
|
+
__name(createSelectionTransformStateComponent, "createSelectionTransformStateComponent");
|
|
287
|
+
|
|
288
|
+
// core/factories/components/SpriteFactory.ts
|
|
289
|
+
function createSpriteComponent(world, entityId, ...args) {
|
|
290
|
+
const component = new SpriteComponent(...args);
|
|
291
|
+
world.addComponent(entityId, component);
|
|
292
|
+
return component;
|
|
293
|
+
}
|
|
294
|
+
__name(createSpriteComponent, "createSpriteComponent");
|
|
295
|
+
|
|
296
|
+
// core/factories/components/TransformFactory.ts
|
|
297
|
+
function createTransformComponent(world, entityId, ...args) {
|
|
298
|
+
const component = new TransformComponent(...args);
|
|
299
|
+
world.addComponent(entityId, component);
|
|
300
|
+
return component;
|
|
301
|
+
}
|
|
302
|
+
__name(createTransformComponent, "createTransformComponent");
|
|
303
|
+
|
|
304
|
+
// core/factories/components/VideoFactory.ts
|
|
305
|
+
function createVideoComponent(world, entityId, ...args) {
|
|
306
|
+
const component = new VideoComponent(...args);
|
|
307
|
+
world.addComponent(entityId, component);
|
|
308
|
+
return component;
|
|
309
|
+
}
|
|
310
|
+
__name(createVideoComponent, "createVideoComponent");
|
|
311
|
+
|
|
312
|
+
// core/factories/registerDefaultComponentFactories.ts
|
|
313
|
+
function registerDefaultComponentFactories(objectManagementSystem) {
|
|
314
|
+
objectManagementSystem.registerComponentFactory("animation", createAnimationComponent);
|
|
315
|
+
objectManagementSystem.registerComponentFactory("audio", createAudioComponent);
|
|
316
|
+
objectManagementSystem.registerComponentFactory("camera", createCameraComponent);
|
|
317
|
+
objectManagementSystem.registerComponentFactory("physics", createPhysicsComponent);
|
|
318
|
+
objectManagementSystem.registerComponentFactory("environment", createEnvironmentComponent);
|
|
319
|
+
objectManagementSystem.registerComponentFactory("entityType", createEntityTypeComponent);
|
|
320
|
+
objectManagementSystem.registerComponentFactory("image", createImageComponent);
|
|
321
|
+
objectManagementSystem.registerComponentFactory(
|
|
322
|
+
"imageTargetAnchor",
|
|
323
|
+
createImageTargetAnchorComponent
|
|
324
|
+
);
|
|
325
|
+
objectManagementSystem.registerComponentFactory("imageTarget", createImageTargetComponent);
|
|
326
|
+
objectManagementSystem.registerComponentFactory("light", createLightComponent);
|
|
327
|
+
objectManagementSystem.registerComponentFactory("material", createMaterialComponent);
|
|
328
|
+
objectManagementSystem.registerComponentFactory("mesh", createMeshComponent);
|
|
329
|
+
objectManagementSystem.registerComponentFactory(
|
|
330
|
+
"meshGeometry",
|
|
331
|
+
createMeshGeometryComponent
|
|
332
|
+
);
|
|
333
|
+
objectManagementSystem.registerComponentFactory("model", createModelComponent);
|
|
334
|
+
objectManagementSystem.registerComponentFactory("name", createNameComponent);
|
|
335
|
+
objectManagementSystem.registerComponentFactory(
|
|
336
|
+
"object3DRef",
|
|
337
|
+
createObject3DRefComponent
|
|
338
|
+
);
|
|
339
|
+
objectManagementSystem.registerComponentFactory("parentId", createParentIdComponent);
|
|
340
|
+
objectManagementSystem.registerComponentFactory(
|
|
341
|
+
"postprocessing",
|
|
342
|
+
createPostprocessingComponent
|
|
343
|
+
);
|
|
344
|
+
objectManagementSystem.registerComponentFactory("script", createScriptComponent);
|
|
345
|
+
objectManagementSystem.registerComponentFactory("selectable", createSelectableComponent);
|
|
346
|
+
objectManagementSystem.registerComponentFactory(
|
|
347
|
+
"selectionTransformState",
|
|
348
|
+
createSelectionTransformStateComponent
|
|
349
|
+
);
|
|
350
|
+
objectManagementSystem.registerComponentFactory("sprite", createSpriteComponent);
|
|
351
|
+
objectManagementSystem.registerComponentFactory("transform", createTransformComponent);
|
|
352
|
+
objectManagementSystem.registerComponentFactory("video", createVideoComponent);
|
|
353
|
+
}
|
|
354
|
+
__name(registerDefaultComponentFactories, "registerDefaultComponentFactories");
|
|
355
|
+
|
|
356
|
+
// core/factories/objects/shared.ts
|
|
357
|
+
function createBaseEntity(world, object, options) {
|
|
358
|
+
const entityId = world.createEntity();
|
|
359
|
+
object.userData.entityId = entityId;
|
|
360
|
+
const transform = createTransform(options.transformInput);
|
|
361
|
+
applyTransform(object, transform);
|
|
362
|
+
world.addComponent(entityId, transform);
|
|
363
|
+
createObject3DRefComponent(world, entityId, object);
|
|
364
|
+
createNameComponent(world, entityId, options.label);
|
|
365
|
+
createEntityTypeComponent(world, entityId, options.entityType);
|
|
366
|
+
createParentIdComponent(world, entityId, options.parentId ?? null);
|
|
367
|
+
createSelectableComponent(world, entityId, true);
|
|
368
|
+
return entityId;
|
|
369
|
+
}
|
|
370
|
+
__name(createBaseEntity, "createBaseEntity");
|
|
371
|
+
|
|
372
|
+
// core/factories/objects/AudioFactory.ts
|
|
373
|
+
function getOrCreateListener(camera) {
|
|
374
|
+
const existing = camera.userData.ecsAudioListener;
|
|
375
|
+
if (existing instanceof THREE20.AudioListener) {
|
|
376
|
+
return existing;
|
|
377
|
+
}
|
|
378
|
+
const listener = new THREE20.AudioListener();
|
|
379
|
+
camera.add(listener);
|
|
380
|
+
camera.userData.ecsAudioListener = listener;
|
|
381
|
+
return listener;
|
|
382
|
+
}
|
|
383
|
+
__name(getOrCreateListener, "getOrCreateListener");
|
|
384
|
+
function createAudio({
|
|
385
|
+
world,
|
|
386
|
+
scene,
|
|
387
|
+
camera,
|
|
388
|
+
payload,
|
|
389
|
+
isEditor
|
|
390
|
+
}) {
|
|
391
|
+
const anchor = new THREE20.Object3D();
|
|
392
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
393
|
+
label: payload.name ?? "Audio",
|
|
394
|
+
entityType: "audio",
|
|
395
|
+
transformInput: payload.transform
|
|
396
|
+
});
|
|
397
|
+
const audio = createAudioComponent(
|
|
398
|
+
world,
|
|
399
|
+
entityId,
|
|
400
|
+
payload.path ?? "",
|
|
401
|
+
payload.options ?? {},
|
|
402
|
+
{
|
|
403
|
+
object: anchor,
|
|
404
|
+
listener: getOrCreateListener(camera),
|
|
405
|
+
isEditor
|
|
406
|
+
}
|
|
407
|
+
);
|
|
408
|
+
scene.add(anchor);
|
|
409
|
+
if (!audio.path) {
|
|
410
|
+
return entityId;
|
|
411
|
+
}
|
|
412
|
+
if (!isEditor) {
|
|
413
|
+
const loader = new THREE20.AudioLoader();
|
|
414
|
+
loader.load(
|
|
415
|
+
audio.path,
|
|
416
|
+
(buffer) => {
|
|
417
|
+
if (!world.hasEntity(entityId)) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const sound = audio.audio;
|
|
421
|
+
if (!sound) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
sound.setBuffer(buffer);
|
|
425
|
+
if (audio.options.autoplay) {
|
|
426
|
+
audio.play();
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
void 0,
|
|
430
|
+
(error) => {
|
|
431
|
+
console.error(`Failed to load audio: ${audio.path}`, error);
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
return entityId;
|
|
436
|
+
}
|
|
437
|
+
__name(createAudio, "createAudio");
|
|
438
|
+
var DEFAULT_NEAR = 0.1;
|
|
439
|
+
var DEFAULT_FAR = 2e3;
|
|
440
|
+
var DEFAULT_FOV = 50;
|
|
441
|
+
var DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT = 5;
|
|
442
|
+
function readViewportAspect() {
|
|
443
|
+
if (typeof window === "undefined") {
|
|
444
|
+
return 1;
|
|
445
|
+
}
|
|
446
|
+
const width = window.innerWidth;
|
|
447
|
+
const height = window.innerHeight;
|
|
448
|
+
if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
|
|
449
|
+
return width / height;
|
|
450
|
+
}
|
|
451
|
+
return 1;
|
|
452
|
+
}
|
|
453
|
+
__name(readViewportAspect, "readViewportAspect");
|
|
454
|
+
function toCameraCreateOptions(input) {
|
|
455
|
+
if (!input || typeof input !== "object") {
|
|
456
|
+
return {};
|
|
457
|
+
}
|
|
458
|
+
const value = input;
|
|
459
|
+
const type = value.type === "3d" || value.type === "ar" ? value.type : void 0;
|
|
460
|
+
const projection = value.projection === "orthographic" || value.projection === "perspective" ? value.projection : void 0;
|
|
461
|
+
return {
|
|
462
|
+
type,
|
|
463
|
+
isDefault: typeof value.isDefault === "boolean" ? value.isDefault : void 0,
|
|
464
|
+
projection,
|
|
465
|
+
fov: typeof value.fov === "number" && Number.isFinite(value.fov) ? value.fov : void 0,
|
|
466
|
+
near: typeof value.near === "number" && Number.isFinite(value.near) ? value.near : void 0,
|
|
467
|
+
far: typeof value.far === "number" && Number.isFinite(value.far) ? value.far : void 0,
|
|
468
|
+
left: typeof value.left === "number" && Number.isFinite(value.left) ? value.left : void 0,
|
|
469
|
+
right: typeof value.right === "number" && Number.isFinite(value.right) ? value.right : void 0,
|
|
470
|
+
top: typeof value.top === "number" && Number.isFinite(value.top) ? value.top : void 0,
|
|
471
|
+
bottom: typeof value.bottom === "number" && Number.isFinite(value.bottom) ? value.bottom : void 0,
|
|
472
|
+
zoom: typeof value.zoom === "number" && Number.isFinite(value.zoom) ? value.zoom : void 0
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
__name(toCameraCreateOptions, "toCameraCreateOptions");
|
|
476
|
+
function resolveCameraCreateOptions(payload) {
|
|
477
|
+
const next = toCameraCreateOptions(payload.options);
|
|
478
|
+
if (payload.options && typeof payload.options === "object") {
|
|
479
|
+
return next;
|
|
480
|
+
}
|
|
481
|
+
return toCameraCreateOptions(payload.camera);
|
|
482
|
+
}
|
|
483
|
+
__name(resolveCameraCreateOptions, "resolveCameraCreateOptions");
|
|
484
|
+
function applyCameraSettings(camera, options) {
|
|
485
|
+
const near = typeof options.near === "number" ? options.near : DEFAULT_NEAR;
|
|
486
|
+
const far = typeof options.far === "number" ? options.far : DEFAULT_FAR;
|
|
487
|
+
const projection = options.projection;
|
|
488
|
+
if (camera instanceof THREE20.PerspectiveCamera) {
|
|
489
|
+
if (!projection || projection === "perspective") {
|
|
490
|
+
camera.fov = typeof options.fov === "number" ? options.fov : DEFAULT_FOV;
|
|
491
|
+
}
|
|
492
|
+
camera.aspect = readViewportAspect();
|
|
493
|
+
camera.near = near;
|
|
494
|
+
camera.far = far;
|
|
495
|
+
camera.updateProjectionMatrix();
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
if (camera instanceof THREE20.OrthographicCamera) {
|
|
499
|
+
camera.left = typeof options.left === "number" ? options.left : -DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
500
|
+
camera.right = typeof options.right === "number" ? options.right : DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
501
|
+
camera.top = typeof options.top === "number" ? options.top : DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
502
|
+
camera.bottom = typeof options.bottom === "number" ? options.bottom : -DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
503
|
+
camera.zoom = typeof options.zoom === "number" ? options.zoom : 1;
|
|
504
|
+
camera.near = near;
|
|
505
|
+
camera.far = far;
|
|
506
|
+
camera.updateProjectionMatrix();
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
__name(applyCameraSettings, "applyCameraSettings");
|
|
510
|
+
function createCameraObject(options) {
|
|
511
|
+
const projection = options.projection ?? "perspective";
|
|
512
|
+
const near = options.near ?? DEFAULT_NEAR;
|
|
513
|
+
const far = options.far ?? DEFAULT_FAR;
|
|
514
|
+
if (projection === "orthographic") {
|
|
515
|
+
const top = options.top ?? DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
516
|
+
const bottom = options.bottom ?? -DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
517
|
+
const left = options.left ?? -DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
518
|
+
const right = options.right ?? DEFAULT_ORTHOGRAPHIC_HALF_HEIGHT;
|
|
519
|
+
const camera = new THREE20.OrthographicCamera(
|
|
520
|
+
left,
|
|
521
|
+
right,
|
|
522
|
+
top,
|
|
523
|
+
bottom,
|
|
524
|
+
near,
|
|
525
|
+
far
|
|
526
|
+
);
|
|
527
|
+
camera.zoom = options.zoom ?? 1;
|
|
528
|
+
camera.updateProjectionMatrix();
|
|
529
|
+
return camera;
|
|
530
|
+
}
|
|
531
|
+
return new THREE20.PerspectiveCamera(
|
|
532
|
+
options.fov ?? DEFAULT_FOV,
|
|
533
|
+
readViewportAspect(),
|
|
534
|
+
near,
|
|
535
|
+
far
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
__name(createCameraObject, "createCameraObject");
|
|
539
|
+
function createCamera({ world, scene, camera, payload, isEditor }) {
|
|
540
|
+
const options = resolveCameraCreateOptions(payload);
|
|
541
|
+
const useWorldCamera = !isEditor && (payload.useWorldCamera === true || Boolean(options.isDefault));
|
|
542
|
+
const object = useWorldCamera ? camera : createCameraObject(options);
|
|
543
|
+
const entityId = createBaseEntity(world, object, {
|
|
544
|
+
label: payload.name ?? "Camera",
|
|
545
|
+
entityType: "camera",
|
|
546
|
+
transformInput: payload.transform
|
|
547
|
+
});
|
|
548
|
+
const objectRef = world.getComponent(entityId, Object3DRef);
|
|
549
|
+
if (objectRef?.object instanceof THREE20.Camera) {
|
|
550
|
+
objectRef.object.userData.entityId = entityId;
|
|
551
|
+
}
|
|
552
|
+
const componentOptions = {
|
|
553
|
+
camera: object,
|
|
554
|
+
type: options.type,
|
|
555
|
+
isDefault: options.isDefault,
|
|
556
|
+
projection: options.projection,
|
|
557
|
+
fov: options.fov,
|
|
558
|
+
near: options.near,
|
|
559
|
+
far: options.far,
|
|
560
|
+
left: options.left,
|
|
561
|
+
right: options.right,
|
|
562
|
+
top: options.top,
|
|
563
|
+
bottom: options.bottom,
|
|
564
|
+
zoom: options.zoom
|
|
565
|
+
};
|
|
566
|
+
const component = createCameraComponent(world, entityId, componentOptions);
|
|
567
|
+
if (useWorldCamera) {
|
|
568
|
+
applyCameraSettings(object, options);
|
|
569
|
+
} else {
|
|
570
|
+
applyCameraSettings(object, options);
|
|
571
|
+
if (isEditor && component.isDefault) {
|
|
572
|
+
const helper = new THREE20.CameraHelper(object);
|
|
573
|
+
helper.onBeforeRender = () => {
|
|
574
|
+
helper.update();
|
|
575
|
+
};
|
|
576
|
+
helper.userData.ecsHelper = true;
|
|
577
|
+
helper.visible = false;
|
|
578
|
+
object.add(helper);
|
|
579
|
+
}
|
|
580
|
+
scene.add(object);
|
|
581
|
+
}
|
|
582
|
+
return entityId;
|
|
583
|
+
}
|
|
584
|
+
__name(createCamera, "createCamera");
|
|
585
|
+
function createCapsule({
|
|
586
|
+
world,
|
|
587
|
+
scene,
|
|
588
|
+
payload
|
|
589
|
+
}) {
|
|
590
|
+
const geometry = new THREE20.CapsuleGeometry(0.5, 1, 4, 8);
|
|
591
|
+
const material = new THREE20.MeshStandardMaterial({ color: "#ffffff" });
|
|
592
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
593
|
+
const entityId = createBaseEntity(world, mesh, {
|
|
594
|
+
label: payload.name ?? "Capsule",
|
|
595
|
+
entityType: "capsule",
|
|
596
|
+
transformInput: payload.transform
|
|
597
|
+
});
|
|
598
|
+
createMeshComponent(world, entityId, mesh);
|
|
599
|
+
createMaterialComponent(world, entityId, material);
|
|
600
|
+
createMeshGeometryComponent(world, entityId, "capsule", mesh, {
|
|
601
|
+
radius: 0.5,
|
|
602
|
+
height: 1
|
|
603
|
+
}, {
|
|
604
|
+
castShadow: false,
|
|
605
|
+
receiveShadow: false
|
|
606
|
+
});
|
|
607
|
+
scene.add(mesh);
|
|
608
|
+
return entityId;
|
|
609
|
+
}
|
|
610
|
+
__name(createCapsule, "createCapsule");
|
|
611
|
+
function createCube({ world, scene, payload }) {
|
|
612
|
+
const geometry = new THREE20.BoxGeometry(1, 1, 1);
|
|
613
|
+
const material = new THREE20.MeshStandardMaterial({ color: "#ffffff" });
|
|
614
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
615
|
+
const entityId = createBaseEntity(world, mesh, {
|
|
616
|
+
label: payload.name ?? "Cube",
|
|
617
|
+
entityType: "cube",
|
|
618
|
+
transformInput: payload.transform
|
|
619
|
+
});
|
|
620
|
+
createMeshComponent(world, entityId, mesh);
|
|
621
|
+
createMaterialComponent(world, entityId, material);
|
|
622
|
+
createMeshGeometryComponent(world, entityId, "cube", mesh, {
|
|
623
|
+
width: 1,
|
|
624
|
+
height: 1,
|
|
625
|
+
depth: 1
|
|
626
|
+
}, {
|
|
627
|
+
castShadow: false,
|
|
628
|
+
receiveShadow: false
|
|
629
|
+
});
|
|
630
|
+
scene.add(mesh);
|
|
631
|
+
return entityId;
|
|
632
|
+
}
|
|
633
|
+
__name(createCube, "createCube");
|
|
634
|
+
function createCylinder({
|
|
635
|
+
world,
|
|
636
|
+
scene,
|
|
637
|
+
payload
|
|
638
|
+
}) {
|
|
639
|
+
const geometry = new THREE20.CylinderGeometry(0.5, 0.5, 1, 20);
|
|
640
|
+
const material = new THREE20.MeshStandardMaterial({ color: "#ffffff" });
|
|
641
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
642
|
+
const entityId = createBaseEntity(world, mesh, {
|
|
643
|
+
label: payload.name ?? "Cylinder",
|
|
644
|
+
entityType: "cylinder",
|
|
645
|
+
transformInput: payload.transform
|
|
646
|
+
});
|
|
647
|
+
createMeshComponent(world, entityId, mesh);
|
|
648
|
+
createMaterialComponent(world, entityId, material);
|
|
649
|
+
createMeshGeometryComponent(world, entityId, "cylinder", mesh, {
|
|
650
|
+
radius: 0.5,
|
|
651
|
+
height: 1
|
|
652
|
+
}, {
|
|
653
|
+
castShadow: false,
|
|
654
|
+
receiveShadow: false
|
|
655
|
+
});
|
|
656
|
+
scene.add(mesh);
|
|
657
|
+
return entityId;
|
|
658
|
+
}
|
|
659
|
+
__name(createCylinder, "createCylinder");
|
|
660
|
+
function createEmpty({ world, scene, payload, isEditor }) {
|
|
661
|
+
const object = new THREE20.Group();
|
|
662
|
+
const entityId = createBaseEntity(world, object, {
|
|
663
|
+
label: payload.name ?? "Empty",
|
|
664
|
+
entityType: "empty",
|
|
665
|
+
transformInput: payload.transform
|
|
666
|
+
});
|
|
667
|
+
scene.add(object);
|
|
668
|
+
return entityId;
|
|
669
|
+
}
|
|
670
|
+
__name(createEmpty, "createEmpty");
|
|
671
|
+
function createImage({ world, scene, payload }) {
|
|
672
|
+
const anchor = new THREE20.Object3D();
|
|
673
|
+
const imagePath = payload.path ?? "";
|
|
674
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
675
|
+
label: payload.name ?? "Image",
|
|
676
|
+
entityType: "image",
|
|
677
|
+
transformInput: payload.transform
|
|
678
|
+
});
|
|
679
|
+
const image = createImageComponent(world, entityId, imagePath);
|
|
680
|
+
image.object = anchor;
|
|
681
|
+
scene.add(anchor);
|
|
682
|
+
if (!imagePath) {
|
|
683
|
+
return entityId;
|
|
684
|
+
}
|
|
685
|
+
const loader = new THREE20.TextureLoader();
|
|
686
|
+
loader.load(
|
|
687
|
+
imagePath,
|
|
688
|
+
(texture) => {
|
|
689
|
+
if (!world.hasEntity(entityId)) {
|
|
690
|
+
texture.dispose();
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const material = new THREE20.MeshBasicMaterial({
|
|
694
|
+
map: texture,
|
|
695
|
+
transparent: true,
|
|
696
|
+
side: THREE20.DoubleSide
|
|
697
|
+
});
|
|
698
|
+
const geometry = new THREE20.PlaneGeometry(1, 1);
|
|
699
|
+
const plane = new THREE20.Mesh(geometry, material);
|
|
700
|
+
plane.userData.entityId = entityId;
|
|
701
|
+
const textureImage = texture.image;
|
|
702
|
+
const width = textureImage?.width ?? 1;
|
|
703
|
+
const height = textureImage?.height ?? 1;
|
|
704
|
+
const aspect = height > 0 ? width / height : 1;
|
|
705
|
+
image.width = width;
|
|
706
|
+
image.height = height;
|
|
707
|
+
plane.scale.set(aspect, 1, 1);
|
|
708
|
+
anchor.add(plane);
|
|
709
|
+
image.texture = texture;
|
|
710
|
+
image.object = plane;
|
|
711
|
+
},
|
|
712
|
+
void 0,
|
|
713
|
+
(error) => {
|
|
714
|
+
console.error(`Failed to load image: ${imagePath}`, error);
|
|
715
|
+
}
|
|
716
|
+
);
|
|
717
|
+
return entityId;
|
|
718
|
+
}
|
|
719
|
+
__name(createImage, "createImage");
|
|
720
|
+
function toImageTargetOptions(input) {
|
|
721
|
+
if (!input || typeof input !== "object") {
|
|
722
|
+
return {};
|
|
723
|
+
}
|
|
724
|
+
const value = input;
|
|
725
|
+
const targets = Array.isArray(value.targets) ? value.targets.filter((target) => {
|
|
726
|
+
if (!target || typeof target !== "object") {
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
const candidate = target;
|
|
730
|
+
return typeof candidate.id === "number" && Number.isFinite(candidate.id) && typeof candidate.url === "string" && candidate.url.length > 0 && typeof candidate.width === "number" && Number.isFinite(candidate.width) && typeof candidate.height === "number" && Number.isFinite(candidate.height);
|
|
731
|
+
}) : void 0;
|
|
732
|
+
return {
|
|
733
|
+
targets,
|
|
734
|
+
compiledTargetUrl: typeof value.compiledTargetUrl === "string" ? value.compiledTargetUrl : void 0,
|
|
735
|
+
compiledTargetDir: typeof value.compiledTargetDir === "string" ? value.compiledTargetDir : void 0
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
__name(toImageTargetOptions, "toImageTargetOptions");
|
|
739
|
+
function createImageTarget({
|
|
740
|
+
world,
|
|
741
|
+
scene,
|
|
742
|
+
payload,
|
|
743
|
+
isEditor
|
|
744
|
+
}) {
|
|
745
|
+
const anchor = new THREE20.Object3D();
|
|
746
|
+
const imagePath = payload.path ?? "";
|
|
747
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
748
|
+
label: payload.name ?? "Image Target",
|
|
749
|
+
entityType: "imageTarget",
|
|
750
|
+
transformInput: payload.transform
|
|
751
|
+
});
|
|
752
|
+
const targetOptions = toImageTargetOptions(payload.options);
|
|
753
|
+
const imageTarget = createImageTargetComponent(
|
|
754
|
+
world,
|
|
755
|
+
entityId,
|
|
756
|
+
targetOptions
|
|
757
|
+
);
|
|
758
|
+
scene.add(anchor);
|
|
759
|
+
if (!isEditor || !imagePath) {
|
|
760
|
+
return entityId;
|
|
761
|
+
}
|
|
762
|
+
const loader = new THREE20.TextureLoader();
|
|
763
|
+
loader.load(
|
|
764
|
+
imagePath,
|
|
765
|
+
(texture) => {
|
|
766
|
+
if (!world.hasEntity(entityId)) {
|
|
767
|
+
texture.dispose();
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
const material = new THREE20.MeshBasicMaterial({
|
|
771
|
+
map: texture,
|
|
772
|
+
transparent: true,
|
|
773
|
+
side: THREE20.DoubleSide
|
|
774
|
+
});
|
|
775
|
+
const geometry = new THREE20.PlaneGeometry(1, 1);
|
|
776
|
+
const plane = new THREE20.Mesh(geometry, material);
|
|
777
|
+
plane.userData.entityId = entityId;
|
|
778
|
+
const textureImage = texture.image;
|
|
779
|
+
const width = textureImage?.width ?? 1;
|
|
780
|
+
const height = textureImage?.height ?? 1;
|
|
781
|
+
const aspect = height > 0 ? width / height : 1;
|
|
782
|
+
plane.scale.set(aspect, 1, 1);
|
|
783
|
+
anchor.add(plane);
|
|
784
|
+
imageTarget.texture = texture;
|
|
785
|
+
imageTarget.object = plane;
|
|
786
|
+
},
|
|
787
|
+
void 0,
|
|
788
|
+
(error) => {
|
|
789
|
+
console.error(`Failed to load image target: ${imagePath}`, error);
|
|
790
|
+
}
|
|
791
|
+
);
|
|
792
|
+
return entityId;
|
|
793
|
+
}
|
|
794
|
+
__name(createImageTarget, "createImageTarget");
|
|
795
|
+
function createAmbientLight({
|
|
796
|
+
world,
|
|
797
|
+
scene,
|
|
798
|
+
payload
|
|
799
|
+
}) {
|
|
800
|
+
const light = new THREE20.AmbientLight("#ffffff", 0.6);
|
|
801
|
+
const entityId = createBaseEntity(world, light, {
|
|
802
|
+
label: payload.name ?? "Ambient Light",
|
|
803
|
+
entityType: "ambientLight",
|
|
804
|
+
transformInput: payload.transform
|
|
805
|
+
});
|
|
806
|
+
createLightComponent(world, entityId, light);
|
|
807
|
+
scene.add(light);
|
|
808
|
+
return entityId;
|
|
809
|
+
}
|
|
810
|
+
__name(createAmbientLight, "createAmbientLight");
|
|
811
|
+
function createAreaLight({
|
|
812
|
+
world,
|
|
813
|
+
scene,
|
|
814
|
+
payload,
|
|
815
|
+
isEditor
|
|
816
|
+
}) {
|
|
817
|
+
const light = new THREE20.RectAreaLight("#ffffff", 5, 4, 4);
|
|
818
|
+
light.lookAt(0, 0, 0);
|
|
819
|
+
const entityId = createBaseEntity(world, light, {
|
|
820
|
+
label: payload.name ?? "Area Light",
|
|
821
|
+
entityType: "areaLight",
|
|
822
|
+
transformInput: payload.transform ?? {
|
|
823
|
+
position: { x: 0, y: 4, z: 0 }
|
|
824
|
+
}
|
|
825
|
+
});
|
|
826
|
+
createLightComponent(world, entityId, light);
|
|
827
|
+
if (isEditor) {
|
|
828
|
+
const helper = new RectAreaLightHelper(light, "#fb7185");
|
|
829
|
+
helper.onBeforeRender = () => {
|
|
830
|
+
helper.updateMatrixWorld(true);
|
|
831
|
+
};
|
|
832
|
+
helper.userData.ecsHelper = true;
|
|
833
|
+
helper.visible = false;
|
|
834
|
+
light.add(helper);
|
|
835
|
+
}
|
|
836
|
+
scene.add(light);
|
|
837
|
+
return entityId;
|
|
838
|
+
}
|
|
839
|
+
__name(createAreaLight, "createAreaLight");
|
|
840
|
+
function createDirectionalLight({
|
|
841
|
+
world,
|
|
842
|
+
scene,
|
|
843
|
+
payload,
|
|
844
|
+
isEditor
|
|
845
|
+
}) {
|
|
846
|
+
const light = new THREE20.DirectionalLight("#ffffff", 1.5);
|
|
847
|
+
light.castShadow = true;
|
|
848
|
+
const entityId = createBaseEntity(world, light, {
|
|
849
|
+
label: payload.name ?? "Directional Light",
|
|
850
|
+
entityType: "directionalLight",
|
|
851
|
+
transformInput: payload.transform ?? {
|
|
852
|
+
position: { x: 3, y: 6, z: 4 }
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
createLightComponent(world, entityId, light);
|
|
856
|
+
if (isEditor) {
|
|
857
|
+
const helper = new THREE20.DirectionalLightHelper(light, 1.8, "#38bdf8");
|
|
858
|
+
helper.onBeforeRender = () => {
|
|
859
|
+
helper.update();
|
|
860
|
+
};
|
|
861
|
+
helper.userData.ecsHelper = true;
|
|
862
|
+
helper.visible = false;
|
|
863
|
+
light.add(helper);
|
|
864
|
+
}
|
|
865
|
+
scene.add(light);
|
|
866
|
+
return entityId;
|
|
867
|
+
}
|
|
868
|
+
__name(createDirectionalLight, "createDirectionalLight");
|
|
869
|
+
function createPointLight({
|
|
870
|
+
world,
|
|
871
|
+
scene,
|
|
872
|
+
payload,
|
|
873
|
+
isEditor
|
|
874
|
+
}) {
|
|
875
|
+
const light = new THREE20.PointLight("#ffffff", 1, 10);
|
|
876
|
+
const entityId = createBaseEntity(world, light, {
|
|
877
|
+
label: payload.name ?? "Point Light",
|
|
878
|
+
entityType: "pointLight",
|
|
879
|
+
transformInput: payload.transform ?? {
|
|
880
|
+
position: { x: 2, y: 3, z: 2 }
|
|
881
|
+
}
|
|
882
|
+
});
|
|
883
|
+
createLightComponent(world, entityId, light);
|
|
884
|
+
if (isEditor) {
|
|
885
|
+
const helper = new THREE20.PointLightHelper(light, 0.35, "#fbbf24");
|
|
886
|
+
helper.onBeforeRender = () => {
|
|
887
|
+
helper.update();
|
|
888
|
+
};
|
|
889
|
+
helper.userData.ecsHelper = true;
|
|
890
|
+
helper.visible = false;
|
|
891
|
+
light.add(helper);
|
|
892
|
+
}
|
|
893
|
+
scene.add(light);
|
|
894
|
+
return entityId;
|
|
895
|
+
}
|
|
896
|
+
__name(createPointLight, "createPointLight");
|
|
897
|
+
function createSpotLight({
|
|
898
|
+
world,
|
|
899
|
+
scene,
|
|
900
|
+
payload,
|
|
901
|
+
isEditor
|
|
902
|
+
}) {
|
|
903
|
+
const light = new THREE20.SpotLight("#ffffff", 1, 20, Math.PI / 6, 0.1, 1);
|
|
904
|
+
const entityId = createBaseEntity(world, light, {
|
|
905
|
+
label: payload.name ?? "Spot Light",
|
|
906
|
+
entityType: "spotLight",
|
|
907
|
+
transformInput: payload.transform ?? {
|
|
908
|
+
position: { x: 2, y: 5, z: 2 }
|
|
909
|
+
}
|
|
910
|
+
});
|
|
911
|
+
createLightComponent(world, entityId, light);
|
|
912
|
+
if (isEditor) {
|
|
913
|
+
const helper = new THREE20.SpotLightHelper(light, "#f59e0b");
|
|
914
|
+
helper.onBeforeRender = () => {
|
|
915
|
+
helper.update();
|
|
916
|
+
};
|
|
917
|
+
helper.userData.ecsHelper = true;
|
|
918
|
+
helper.visible = false;
|
|
919
|
+
light.add(helper);
|
|
920
|
+
}
|
|
921
|
+
scene.add(light);
|
|
922
|
+
return entityId;
|
|
923
|
+
}
|
|
924
|
+
__name(createSpotLight, "createSpotLight");
|
|
925
|
+
var DEFAULT_DRACO_DECODER_PATH = resolveDracoDecoderPath();
|
|
926
|
+
function getModelFileName(path) {
|
|
927
|
+
const segments = path.split(/[\\/]/).filter(Boolean);
|
|
928
|
+
return segments[segments.length - 1] ?? "";
|
|
929
|
+
}
|
|
930
|
+
__name(getModelFileName, "getModelFileName");
|
|
931
|
+
function createModelLoader() {
|
|
932
|
+
const loader = new GLTFLoader();
|
|
933
|
+
try {
|
|
934
|
+
const dracoLoader = new DRACOLoader();
|
|
935
|
+
dracoLoader.setDecoderPath(DEFAULT_DRACO_DECODER_PATH);
|
|
936
|
+
loader.setDRACOLoader(dracoLoader);
|
|
937
|
+
} catch (error) {
|
|
938
|
+
console.warn("DRACOLoader could not be configured. Loading non-Draco models only.", error);
|
|
939
|
+
}
|
|
940
|
+
return loader;
|
|
941
|
+
}
|
|
942
|
+
__name(createModelLoader, "createModelLoader");
|
|
943
|
+
function createModel({ world, scene, payload }) {
|
|
944
|
+
const anchor = new THREE20.Object3D();
|
|
945
|
+
const modelPath = payload.path ?? "";
|
|
946
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
947
|
+
label: payload.name ?? "Model",
|
|
948
|
+
entityType: "model",
|
|
949
|
+
transformInput: payload.transform
|
|
950
|
+
});
|
|
951
|
+
const model = createModelComponent(world, entityId, modelPath);
|
|
952
|
+
const meshGeometry = createMeshGeometryComponent(world, entityId, "model", anchor, {}, {
|
|
953
|
+
modelName: getModelFileName(modelPath),
|
|
954
|
+
castShadow: false,
|
|
955
|
+
receiveShadow: false
|
|
956
|
+
});
|
|
957
|
+
model.object = anchor;
|
|
958
|
+
scene.add(anchor);
|
|
959
|
+
if (!modelPath) {
|
|
960
|
+
return entityId;
|
|
961
|
+
}
|
|
962
|
+
const loader = createModelLoader();
|
|
963
|
+
loader.load(
|
|
964
|
+
modelPath,
|
|
965
|
+
(gltf) => {
|
|
966
|
+
if (!world.hasEntity(entityId)) {
|
|
967
|
+
return;
|
|
968
|
+
}
|
|
969
|
+
const object = gltf.scene;
|
|
970
|
+
object.userData.entityId = entityId;
|
|
971
|
+
object.traverse((child) => {
|
|
972
|
+
child.userData.entityId = entityId;
|
|
973
|
+
});
|
|
974
|
+
anchor.add(object);
|
|
975
|
+
model.object = object;
|
|
976
|
+
meshGeometry.object = object;
|
|
977
|
+
if (gltf.animations.length > 0) {
|
|
978
|
+
let animation = world.getComponent(entityId, AnimationComponent);
|
|
979
|
+
if (!animation) {
|
|
980
|
+
animation = createAnimationComponent(world, entityId, {
|
|
981
|
+
clips: gltf.animations,
|
|
982
|
+
externalClipSources: [],
|
|
983
|
+
paused: false,
|
|
984
|
+
reverse: false,
|
|
985
|
+
timeScale: 1,
|
|
986
|
+
crossFadeDuration: 0
|
|
987
|
+
});
|
|
988
|
+
}
|
|
989
|
+
animation.setModelClips(gltf.animations);
|
|
990
|
+
}
|
|
991
|
+
},
|
|
992
|
+
void 0,
|
|
993
|
+
(error) => {
|
|
994
|
+
console.error(`Failed to load model: ${modelPath}`, error);
|
|
995
|
+
}
|
|
996
|
+
);
|
|
997
|
+
return entityId;
|
|
998
|
+
}
|
|
999
|
+
__name(createModel, "createModel");
|
|
1000
|
+
function createPlane({ world, scene, payload }) {
|
|
1001
|
+
const geometry = new THREE20.PlaneGeometry(100, 100);
|
|
1002
|
+
const material = new THREE20.MeshStandardMaterial({
|
|
1003
|
+
color: "#ffffff",
|
|
1004
|
+
side: THREE20.DoubleSide
|
|
1005
|
+
});
|
|
1006
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
1007
|
+
const entityId = createBaseEntity(
|
|
1008
|
+
world,
|
|
1009
|
+
mesh,
|
|
1010
|
+
{
|
|
1011
|
+
label: payload.name ?? "Plane",
|
|
1012
|
+
entityType: "plane",
|
|
1013
|
+
transformInput: {
|
|
1014
|
+
position: payload.transform?.position,
|
|
1015
|
+
rotation: payload.transform?.rotation ?? {
|
|
1016
|
+
x: -Math.PI / 2,
|
|
1017
|
+
y: 0,
|
|
1018
|
+
z: 0
|
|
1019
|
+
},
|
|
1020
|
+
scale: payload.transform?.scale
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
);
|
|
1024
|
+
createMeshComponent(world, entityId, mesh);
|
|
1025
|
+
createMaterialComponent(world, entityId, material);
|
|
1026
|
+
createMeshGeometryComponent(world, entityId, "plane", mesh, {
|
|
1027
|
+
width: 10,
|
|
1028
|
+
height: 10
|
|
1029
|
+
}, {
|
|
1030
|
+
castShadow: false,
|
|
1031
|
+
receiveShadow: false
|
|
1032
|
+
});
|
|
1033
|
+
scene.add(mesh);
|
|
1034
|
+
return entityId;
|
|
1035
|
+
}
|
|
1036
|
+
__name(createPlane, "createPlane");
|
|
1037
|
+
function createSprite({ world, scene, payload }) {
|
|
1038
|
+
const anchor = new THREE20.Object3D();
|
|
1039
|
+
const imagePath = payload.path ?? "";
|
|
1040
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
1041
|
+
label: payload.name ?? "Sprite",
|
|
1042
|
+
entityType: "sprite",
|
|
1043
|
+
transformInput: payload.transform
|
|
1044
|
+
});
|
|
1045
|
+
const spriteComponent = createSpriteComponent(world, entityId, imagePath);
|
|
1046
|
+
scene.add(anchor);
|
|
1047
|
+
if (!imagePath) {
|
|
1048
|
+
return entityId;
|
|
1049
|
+
}
|
|
1050
|
+
const loader = new THREE20.TextureLoader();
|
|
1051
|
+
loader.load(
|
|
1052
|
+
imagePath,
|
|
1053
|
+
(texture) => {
|
|
1054
|
+
if (!world.hasEntity(entityId)) {
|
|
1055
|
+
texture.dispose();
|
|
1056
|
+
return;
|
|
1057
|
+
}
|
|
1058
|
+
const material = new THREE20.SpriteMaterial({
|
|
1059
|
+
map: texture,
|
|
1060
|
+
transparent: true
|
|
1061
|
+
});
|
|
1062
|
+
const sprite = new THREE20.Sprite(material);
|
|
1063
|
+
sprite.userData.entityId = entityId;
|
|
1064
|
+
const textureImage = texture.image;
|
|
1065
|
+
spriteComponent.width = textureImage?.width ?? 1;
|
|
1066
|
+
spriteComponent.height = textureImage?.height ?? 1;
|
|
1067
|
+
anchor.add(sprite);
|
|
1068
|
+
spriteComponent.texture = texture;
|
|
1069
|
+
spriteComponent.object = sprite;
|
|
1070
|
+
},
|
|
1071
|
+
void 0,
|
|
1072
|
+
(error) => {
|
|
1073
|
+
console.error(`Failed to load sprite: ${imagePath}`, error);
|
|
1074
|
+
}
|
|
1075
|
+
);
|
|
1076
|
+
return entityId;
|
|
1077
|
+
}
|
|
1078
|
+
__name(createSprite, "createSprite");
|
|
1079
|
+
function createSphere({ world, scene, payload }) {
|
|
1080
|
+
const geometry = new THREE20.SphereGeometry(0.5, 24, 24);
|
|
1081
|
+
const material = new THREE20.MeshStandardMaterial({ color: "#ffffff" });
|
|
1082
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
1083
|
+
const entityId = createBaseEntity(world, mesh, {
|
|
1084
|
+
label: payload.name ?? "Sphere",
|
|
1085
|
+
entityType: "sphere",
|
|
1086
|
+
transformInput: payload.transform
|
|
1087
|
+
});
|
|
1088
|
+
createMeshComponent(world, entityId, mesh);
|
|
1089
|
+
createMaterialComponent(world, entityId, material);
|
|
1090
|
+
createMeshGeometryComponent(world, entityId, "sphere", mesh, {
|
|
1091
|
+
radius: 0.5
|
|
1092
|
+
}, {
|
|
1093
|
+
castShadow: false,
|
|
1094
|
+
receiveShadow: false
|
|
1095
|
+
});
|
|
1096
|
+
scene.add(mesh);
|
|
1097
|
+
return entityId;
|
|
1098
|
+
}
|
|
1099
|
+
__name(createSphere, "createSphere");
|
|
1100
|
+
function getOrCreateListener2(camera) {
|
|
1101
|
+
const existing = camera.userData.ecsAudioListener;
|
|
1102
|
+
if (existing instanceof THREE20.AudioListener) {
|
|
1103
|
+
return existing;
|
|
1104
|
+
}
|
|
1105
|
+
const listener = new THREE20.AudioListener();
|
|
1106
|
+
camera.add(listener);
|
|
1107
|
+
camera.userData.ecsAudioListener = listener;
|
|
1108
|
+
return listener;
|
|
1109
|
+
}
|
|
1110
|
+
__name(getOrCreateListener2, "getOrCreateListener");
|
|
1111
|
+
function normalizeDistanceModel2(value) {
|
|
1112
|
+
const v = value.trim().toLowerCase();
|
|
1113
|
+
if (v === "linear" || v === "exponential") return v;
|
|
1114
|
+
return "inverse";
|
|
1115
|
+
}
|
|
1116
|
+
__name(normalizeDistanceModel2, "normalizeDistanceModel");
|
|
1117
|
+
function toBool(value, fallback) {
|
|
1118
|
+
return typeof value === "boolean" ? value : fallback;
|
|
1119
|
+
}
|
|
1120
|
+
__name(toBool, "toBool");
|
|
1121
|
+
function toNumber(value, fallback) {
|
|
1122
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
1123
|
+
return fallback;
|
|
1124
|
+
}
|
|
1125
|
+
return value;
|
|
1126
|
+
}
|
|
1127
|
+
__name(toNumber, "toNumber");
|
|
1128
|
+
function toColor(value, fallback) {
|
|
1129
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
1130
|
+
return fallback;
|
|
1131
|
+
}
|
|
1132
|
+
return value;
|
|
1133
|
+
}
|
|
1134
|
+
__name(toColor, "toColor");
|
|
1135
|
+
function normalizeOptions(input) {
|
|
1136
|
+
return {
|
|
1137
|
+
autoplay: toBool(input?.autoplay, false),
|
|
1138
|
+
loop: toBool(input?.loop, true),
|
|
1139
|
+
volume: Math.max(0, Math.min(1, toNumber(input?.volume, 1))),
|
|
1140
|
+
width: Math.max(0.01, toNumber(input?.width, 1)),
|
|
1141
|
+
height: Math.max(0.01, toNumber(input?.height, 1)),
|
|
1142
|
+
isGreenScreen: toBool(input?.isGreenScreen, false),
|
|
1143
|
+
backgroundColor: toColor(input?.backgroundColor, "#00ff00"),
|
|
1144
|
+
similarity: Math.max(0.01, Math.min(1, toNumber(input?.similarity, 0.4))),
|
|
1145
|
+
smoothness: Math.max(1e-3, Math.min(1, toNumber(input?.smoothness, 0.08))),
|
|
1146
|
+
spill: Math.max(0, Math.min(1, toNumber(input?.spill, 0.12))),
|
|
1147
|
+
positional: toBool(input?.positional, false),
|
|
1148
|
+
refDistance: Math.max(0, toNumber(input?.refDistance, 1)),
|
|
1149
|
+
distanceModel: toColor(input?.distanceModel, "inverse"),
|
|
1150
|
+
rolloffFactor: Math.max(0, toNumber(input?.rolloffFactor, 1))
|
|
1151
|
+
};
|
|
1152
|
+
}
|
|
1153
|
+
__name(normalizeOptions, "normalizeOptions");
|
|
1154
|
+
function createChromaMaterial(texture, options) {
|
|
1155
|
+
return new THREE20.ShaderMaterial({
|
|
1156
|
+
uniforms: {
|
|
1157
|
+
tex: { value: texture },
|
|
1158
|
+
keyColor: { value: new THREE20.Color(options.backgroundColor) },
|
|
1159
|
+
similarity: { value: options.similarity },
|
|
1160
|
+
smoothness: { value: options.smoothness },
|
|
1161
|
+
spill: { value: options.spill }
|
|
1162
|
+
},
|
|
1163
|
+
vertexShader: `
|
|
1164
|
+
varying vec2 vUv;
|
|
1165
|
+
void main() {
|
|
1166
|
+
vUv = uv;
|
|
1167
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
1168
|
+
}
|
|
1169
|
+
`,
|
|
1170
|
+
fragmentShader: `
|
|
1171
|
+
uniform sampler2D tex;
|
|
1172
|
+
uniform vec3 keyColor;
|
|
1173
|
+
uniform float similarity;
|
|
1174
|
+
uniform float smoothness;
|
|
1175
|
+
uniform float spill;
|
|
1176
|
+
varying vec2 vUv;
|
|
1177
|
+
|
|
1178
|
+
void main() {
|
|
1179
|
+
vec4 texel = texture2D(tex, vUv);
|
|
1180
|
+
float chromaDist = distance(texel.rgb, keyColor);
|
|
1181
|
+
float alpha = smoothstep(similarity, similarity + smoothness, chromaDist);
|
|
1182
|
+
|
|
1183
|
+
float spillFactor = smoothstep(similarity, similarity + spill + smoothness, chromaDist);
|
|
1184
|
+
vec3 despilled = mix(vec3(dot(texel.rgb, vec3(0.299, 0.587, 0.114))), texel.rgb, spillFactor);
|
|
1185
|
+
|
|
1186
|
+
gl_FragColor = vec4(despilled, texel.a * alpha);
|
|
1187
|
+
}
|
|
1188
|
+
`,
|
|
1189
|
+
transparent: true,
|
|
1190
|
+
side: THREE20.DoubleSide
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
__name(createChromaMaterial, "createChromaMaterial");
|
|
1194
|
+
function createStandardMaterial(texture) {
|
|
1195
|
+
return new THREE20.MeshBasicMaterial({
|
|
1196
|
+
map: texture,
|
|
1197
|
+
transparent: true,
|
|
1198
|
+
side: THREE20.DoubleSide
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
__name(createStandardMaterial, "createStandardMaterial");
|
|
1202
|
+
function createVideoMesh(entityId, texture, options) {
|
|
1203
|
+
const geometry = new THREE20.PlaneGeometry(1, 1);
|
|
1204
|
+
const material = options.isGreenScreen ? createChromaMaterial(texture, options) : createStandardMaterial(texture);
|
|
1205
|
+
const mesh = new THREE20.Mesh(geometry, material);
|
|
1206
|
+
mesh.userData.entityId = entityId;
|
|
1207
|
+
mesh.scale.set(options.width, options.height, 1);
|
|
1208
|
+
return { mesh, material };
|
|
1209
|
+
}
|
|
1210
|
+
__name(createVideoMesh, "createVideoMesh");
|
|
1211
|
+
function applyMetadataSizing(video, mesh, options) {
|
|
1212
|
+
const width = video.videoWidth;
|
|
1213
|
+
const height = video.videoHeight;
|
|
1214
|
+
if (width <= 0 || height <= 0) {
|
|
1215
|
+
return;
|
|
1216
|
+
}
|
|
1217
|
+
const nextWidth = options.width > 0 ? options.width : width / height;
|
|
1218
|
+
const nextHeight = options.height > 0 ? options.height : 1;
|
|
1219
|
+
mesh.scale.set(nextWidth, nextHeight, 1);
|
|
1220
|
+
}
|
|
1221
|
+
__name(applyMetadataSizing, "applyMetadataSizing");
|
|
1222
|
+
function createVideoElement(path, options) {
|
|
1223
|
+
const video = document.createElement("video");
|
|
1224
|
+
video.src = path;
|
|
1225
|
+
video.crossOrigin = "anonymous";
|
|
1226
|
+
video.loop = options.loop;
|
|
1227
|
+
video.playsInline = true;
|
|
1228
|
+
video.preload = "auto";
|
|
1229
|
+
video.volume = options.volume;
|
|
1230
|
+
return video;
|
|
1231
|
+
}
|
|
1232
|
+
__name(createVideoElement, "createVideoElement");
|
|
1233
|
+
function createVideo({
|
|
1234
|
+
world,
|
|
1235
|
+
scene,
|
|
1236
|
+
camera,
|
|
1237
|
+
payload,
|
|
1238
|
+
isEditor
|
|
1239
|
+
}) {
|
|
1240
|
+
const anchor = new THREE20.Object3D();
|
|
1241
|
+
const path = payload.path ?? "";
|
|
1242
|
+
const options = normalizeOptions(payload.options);
|
|
1243
|
+
const entityId = createBaseEntity(world, anchor, {
|
|
1244
|
+
label: payload.name ?? "Video",
|
|
1245
|
+
entityType: "video",
|
|
1246
|
+
transformInput: payload.transform
|
|
1247
|
+
});
|
|
1248
|
+
const videoComponent = createVideoComponent(world, entityId, path, options);
|
|
1249
|
+
videoComponent.object = anchor;
|
|
1250
|
+
scene.add(anchor);
|
|
1251
|
+
if (!path || typeof document === "undefined") {
|
|
1252
|
+
return entityId;
|
|
1253
|
+
}
|
|
1254
|
+
const video = createVideoElement(path, options);
|
|
1255
|
+
const texture = new THREE20.VideoTexture(video);
|
|
1256
|
+
texture.colorSpace = THREE20.SRGBColorSpace;
|
|
1257
|
+
texture.needsUpdate = true;
|
|
1258
|
+
const { mesh, material } = createVideoMesh(entityId, texture, options);
|
|
1259
|
+
anchor.add(mesh);
|
|
1260
|
+
videoComponent.videoElement = video;
|
|
1261
|
+
videoComponent.texture = texture;
|
|
1262
|
+
videoComponent.material = material;
|
|
1263
|
+
videoComponent.object = mesh;
|
|
1264
|
+
video.addEventListener("loadedmetadata", () => {
|
|
1265
|
+
if (!world.hasEntity(entityId)) {
|
|
1266
|
+
return;
|
|
1267
|
+
}
|
|
1268
|
+
applyMetadataSizing(video, mesh, options);
|
|
1269
|
+
});
|
|
1270
|
+
if (!isEditor && options.positional) {
|
|
1271
|
+
const listener = getOrCreateListener2(camera);
|
|
1272
|
+
const audioNode = new THREE20.PositionalAudio(listener);
|
|
1273
|
+
audioNode.setVolume(options.volume);
|
|
1274
|
+
audioNode.setRefDistance(options.refDistance);
|
|
1275
|
+
audioNode.setDistanceModel(normalizeDistanceModel2(options.distanceModel));
|
|
1276
|
+
audioNode.setRolloffFactor(options.rolloffFactor);
|
|
1277
|
+
audioNode.setMediaElementSource(video);
|
|
1278
|
+
video.volume = 1;
|
|
1279
|
+
anchor.add(audioNode);
|
|
1280
|
+
videoComponent.audioNode = audioNode;
|
|
1281
|
+
}
|
|
1282
|
+
if (options.autoplay) {
|
|
1283
|
+
videoComponent.play();
|
|
1284
|
+
}
|
|
1285
|
+
return entityId;
|
|
1286
|
+
}
|
|
1287
|
+
__name(createVideo, "createVideo");
|
|
1288
|
+
|
|
1289
|
+
// core/factories/registerDefaultFactories.ts
|
|
1290
|
+
function registerDefaultFactories(objectManagementSystem) {
|
|
1291
|
+
objectManagementSystem.register("cube", createCube);
|
|
1292
|
+
objectManagementSystem.register("sphere", createSphere);
|
|
1293
|
+
objectManagementSystem.register("plane", createPlane);
|
|
1294
|
+
objectManagementSystem.register("capsule", createCapsule);
|
|
1295
|
+
objectManagementSystem.register("cylinder", createCylinder);
|
|
1296
|
+
objectManagementSystem.register("empty", createEmpty);
|
|
1297
|
+
objectManagementSystem.register("model", createModel);
|
|
1298
|
+
objectManagementSystem.register("image", createImage);
|
|
1299
|
+
objectManagementSystem.register("imageTarget", createImageTarget);
|
|
1300
|
+
objectManagementSystem.register("sprite", createSprite);
|
|
1301
|
+
objectManagementSystem.register("audio", createAudio);
|
|
1302
|
+
objectManagementSystem.register("camera", createCamera);
|
|
1303
|
+
objectManagementSystem.register("video", createVideo);
|
|
1304
|
+
objectManagementSystem.register("ambientLight", createAmbientLight);
|
|
1305
|
+
objectManagementSystem.register("directionalLight", createDirectionalLight);
|
|
1306
|
+
objectManagementSystem.register("pointLight", createPointLight);
|
|
1307
|
+
objectManagementSystem.register("spotLight", createSpotLight);
|
|
1308
|
+
objectManagementSystem.register("areaLight", createAreaLight);
|
|
1309
|
+
registerDefaultComponentFactories(objectManagementSystem);
|
|
1310
|
+
}
|
|
1311
|
+
__name(registerDefaultFactories, "registerDefaultFactories");
|
|
1312
|
+
|
|
1313
|
+
export { createAnimationComponent, createAudioComponent, createCameraComponent, createEntityTypeComponent, createEnvironmentComponent, createImageComponent, createImageTargetAnchorComponent, createImageTargetComponent, createLightComponent, createMaterialComponent, createMeshComponent, createMeshGeometryComponent, createModelComponent, createNameComponent, createObject3DRefComponent, createParentIdComponent, createPhysicsComponent, createPostprocessingComponent, createScriptComponent, createSelectableComponent, createSelectionTransformStateComponent, createSpriteComponent, createTransformComponent, createVideoComponent, registerDefaultComponentFactories, registerDefaultFactories };
|
|
1314
|
+
//# sourceMappingURL=chunk-XWIEEJ7Z.js.map
|
|
1315
|
+
//# sourceMappingURL=chunk-XWIEEJ7Z.js.map
|