@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.
Files changed (308) hide show
  1. package/README.md +125 -0
  2. package/dist/System-rXAmagXA.d.cts +659 -0
  3. package/dist/System-rXAmagXA.d.ts +659 -0
  4. package/dist/Video-CDemv74U.d.cts +1261 -0
  5. package/dist/Video-ChKV1UI7.d.ts +1261 -0
  6. package/dist/assets/draco/draco_decoder.js +34 -0
  7. package/dist/assets/draco/draco_decoder.wasm +0 -0
  8. package/dist/assets/draco/draco_wasm_wrapper.js +117 -0
  9. package/dist/chunk-AYEF3X2P.js +223 -0
  10. package/dist/chunk-AYEF3X2P.js.map +1 -0
  11. package/dist/chunk-MAWBTMCG.js +1722 -0
  12. package/dist/chunk-MAWBTMCG.js.map +1 -0
  13. package/dist/chunk-NFDTIYR4.js +248 -0
  14. package/dist/chunk-NFDTIYR4.js.map +1 -0
  15. package/dist/chunk-OY7ZODZP.js +16 -0
  16. package/dist/chunk-OY7ZODZP.js.map +1 -0
  17. package/dist/chunk-P2YDX5DB.js +3304 -0
  18. package/dist/chunk-P2YDX5DB.js.map +1 -0
  19. package/dist/chunk-QHILSPT4.js +3 -0
  20. package/dist/chunk-QHILSPT4.js.map +1 -0
  21. package/dist/chunk-XWIEEJ7Z.js +1315 -0
  22. package/dist/chunk-XWIEEJ7Z.js.map +1 -0
  23. package/dist/components/index.cjs +1745 -0
  24. package/dist/components/index.cjs.map +1 -0
  25. package/dist/components/index.d.cts +4 -0
  26. package/dist/components/index.d.ts +4 -0
  27. package/dist/components/index.js +4 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/docs/api/Behaviour/classes/Behaviour.md +554 -0
  30. package/dist/docs/api/Behaviour/index.md +15 -0
  31. package/dist/docs/api/Component/classes/Component.md +57 -0
  32. package/dist/docs/api/Component/index.md +15 -0
  33. package/dist/docs/api/components/classes/AnimationComponent.md +318 -0
  34. package/dist/docs/api/components/classes/AudioComponent.md +114 -0
  35. package/dist/docs/api/components/classes/CameraComponent.md +59 -0
  36. package/dist/docs/api/components/classes/EntityType.md +48 -0
  37. package/dist/docs/api/components/classes/Environment.md +47 -0
  38. package/dist/docs/api/components/classes/ImageComponent.md +57 -0
  39. package/dist/docs/api/components/classes/ImageTarget.md +60 -0
  40. package/dist/docs/api/components/classes/ImageTargetAnchor.md +48 -0
  41. package/dist/docs/api/components/classes/LightComponent.md +70 -0
  42. package/dist/docs/api/components/classes/MaterialComponent.md +181 -0
  43. package/dist/docs/api/components/classes/MeshComponent.md +48 -0
  44. package/dist/docs/api/components/classes/MeshGeometryComponent.md +64 -0
  45. package/dist/docs/api/components/classes/ModelComponent.md +49 -0
  46. package/dist/docs/api/components/classes/Name.md +46 -0
  47. package/dist/docs/api/components/classes/Object3DRef.md +54 -0
  48. package/dist/docs/api/components/classes/ParentId.md +47 -0
  49. package/dist/docs/api/components/classes/PhysicsComponent.md +82 -0
  50. package/dist/docs/api/components/classes/Postprocessing.md +49 -0
  51. package/dist/docs/api/components/classes/ScriptComponent.md +54 -0
  52. package/dist/docs/api/components/classes/Selectable.md +46 -0
  53. package/dist/docs/api/components/classes/SelectionTransformState.md +54 -0
  54. package/dist/docs/api/components/classes/SpriteComponent.md +55 -0
  55. package/dist/docs/api/components/classes/TransformComponent.md +197 -0
  56. package/dist/docs/api/components/classes/VideoComponent.md +123 -0
  57. package/dist/docs/api/components/functions/normalizePhysicsState.md +23 -0
  58. package/dist/docs/api/components/index.md +94 -0
  59. package/dist/docs/api/components/type-aliases/AnimationComponentOptions.md +42 -0
  60. package/dist/docs/api/components/type-aliases/CameraComponentOptions.md +45 -0
  61. package/dist/docs/api/components/type-aliases/CameraProjection.md +15 -0
  62. package/dist/docs/api/components/type-aliases/CameraRuntimeType.md +15 -0
  63. package/dist/docs/api/components/type-aliases/ColliderShape.md +15 -0
  64. package/dist/docs/api/components/type-aliases/ColliderState.md +62 -0
  65. package/dist/docs/api/components/type-aliases/CubeMeshParameters.md +27 -0
  66. package/dist/docs/api/components/type-aliases/EditableMeshObjectKind.md +15 -0
  67. package/dist/docs/api/components/type-aliases/EnvironmentFogState.md +37 -0
  68. package/dist/docs/api/components/type-aliases/EnvironmentFogType.md +15 -0
  69. package/dist/docs/api/components/type-aliases/EnvironmentGradientEffect.md +15 -0
  70. package/dist/docs/api/components/type-aliases/EnvironmentSkyboxState.md +34 -0
  71. package/dist/docs/api/components/type-aliases/EnvironmentSkyboxType.md +15 -0
  72. package/dist/docs/api/components/type-aliases/EnvironmentState.md +29 -0
  73. package/dist/docs/api/components/type-aliases/ImageTargetAnchorOptions.md +25 -0
  74. package/dist/docs/api/components/type-aliases/ImageTargetReference.md +33 -0
  75. package/dist/docs/api/components/type-aliases/LightValueState.md +41 -0
  76. package/dist/docs/api/components/type-aliases/MaterialTypeValue.md +15 -0
  77. package/dist/docs/api/components/type-aliases/MaterialValueState.md +75 -0
  78. package/dist/docs/api/components/type-aliases/MeshGeometryParameters.md +13 -0
  79. package/dist/docs/api/components/type-aliases/MeshGeometryParametersByKind.md +33 -0
  80. package/dist/docs/api/components/type-aliases/PhysicsState.md +25 -0
  81. package/dist/docs/api/components/type-aliases/PlaneMeshParameters.md +25 -0
  82. package/dist/docs/api/components/type-aliases/PostprocessingState.md +164 -0
  83. package/dist/docs/api/components/type-aliases/RadiusHeightMeshParameters.md +25 -0
  84. package/dist/docs/api/components/type-aliases/RadiusMeshParameters.md +23 -0
  85. package/dist/docs/api/components/type-aliases/RigidbodyState.md +53 -0
  86. package/dist/docs/api/components/type-aliases/RigidbodyType.md +19 -0
  87. package/dist/docs/api/components/type-aliases/ScriptEntry.md +38 -0
  88. package/dist/docs/api/components/type-aliases/TextureFilteringValue.md +15 -0
  89. package/dist/docs/api/components/type-aliases/TransformData.md +27 -0
  90. package/dist/docs/api/components/type-aliases/TransformModeValue.md +15 -0
  91. package/dist/docs/api/components/type-aliases/TransformSpaceValue.md +15 -0
  92. package/dist/docs/api/components/type-aliases/Vec3.md +27 -0
  93. package/dist/docs/api/components/variables/DEFAULT_COLLIDER_STATE.md +13 -0
  94. package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_STATE.md +13 -0
  95. package/dist/docs/api/components/variables/DEFAULT_MESH_GEOMETRY_PARAMETERS.md +13 -0
  96. package/dist/docs/api/components/variables/DEFAULT_PHYSICS_STATE.md +13 -0
  97. package/dist/docs/api/components/variables/DEFAULT_POSTPROCESSING_STATE.md +13 -0
  98. package/dist/docs/api/components/variables/DEFAULT_RIGIDBODY_STATE.md +13 -0
  99. package/dist/docs/api/index/classes/AnimationStateMachine.md +201 -0
  100. package/dist/docs/api/index/classes/AnimationStateManager.md +253 -0
  101. package/dist/docs/api/index/classes/AnimationSystem.md +68 -0
  102. package/dist/docs/api/index/classes/AudioSystem.md +98 -0
  103. package/dist/docs/api/index/classes/CameraSyncSystem.md +49 -0
  104. package/dist/docs/api/index/classes/EnvironmentSyncSystem.md +75 -0
  105. package/dist/docs/api/index/classes/InputSystem.md +449 -0
  106. package/dist/docs/api/index/classes/LightSyncSystem.md +49 -0
  107. package/dist/docs/api/index/classes/MaterialSyncSystem.md +67 -0
  108. package/dist/docs/api/index/classes/MeshGeometrySystem.md +49 -0
  109. package/dist/docs/api/index/classes/ObjectManagementSystem.md +298 -0
  110. package/dist/docs/api/index/classes/ObjectVisibilitySystem.md +49 -0
  111. package/dist/docs/api/index/classes/PhysicsSyncSystem.md +83 -0
  112. package/dist/docs/api/index/classes/PostprocessingSyncSystem.md +80 -0
  113. package/dist/docs/api/index/classes/RenderSystem.md +64 -0
  114. package/dist/docs/api/index/classes/ScriptBehaviourSystem.md +83 -0
  115. package/dist/docs/api/index/classes/TransformSyncSystem.md +49 -0
  116. package/dist/docs/api/index/classes/VideoSystem.md +97 -0
  117. package/dist/docs/api/index/classes/World.md +1405 -0
  118. package/dist/docs/api/index/functions/createAnimationComponent.md +28 -0
  119. package/dist/docs/api/index/functions/createAudioComponent.md +32 -0
  120. package/dist/docs/api/index/functions/createCameraComponent.md +28 -0
  121. package/dist/docs/api/index/functions/createEntityTypeComponent.md +28 -0
  122. package/dist/docs/api/index/functions/createEnvironmentComponent.md +28 -0
  123. package/dist/docs/api/index/functions/createImageComponent.md +28 -0
  124. package/dist/docs/api/index/functions/createImageTargetAnchorComponent.md +28 -0
  125. package/dist/docs/api/index/functions/createImageTargetComponent.md +28 -0
  126. package/dist/docs/api/index/functions/createLightComponent.md +28 -0
  127. package/dist/docs/api/index/functions/createMaterialComponent.md +28 -0
  128. package/dist/docs/api/index/functions/createMeshComponent.md +28 -0
  129. package/dist/docs/api/index/functions/createMeshGeometryComponent.md +28 -0
  130. package/dist/docs/api/index/functions/createModelComponent.md +28 -0
  131. package/dist/docs/api/index/functions/createNameComponent.md +28 -0
  132. package/dist/docs/api/index/functions/createObject3DRefComponent.md +28 -0
  133. package/dist/docs/api/index/functions/createParentIdComponent.md +28 -0
  134. package/dist/docs/api/index/functions/createPhysicsComponent.md +30 -0
  135. package/dist/docs/api/index/functions/createPostprocessingComponent.md +28 -0
  136. package/dist/docs/api/index/functions/createScriptComponent.md +28 -0
  137. package/dist/docs/api/index/functions/createSelectableComponent.md +28 -0
  138. package/dist/docs/api/index/functions/createSelectionTransformStateComponent.md +28 -0
  139. package/dist/docs/api/index/functions/createSpriteComponent.md +28 -0
  140. package/dist/docs/api/index/functions/createTransformComponent.md +28 -0
  141. package/dist/docs/api/index/functions/createVideoComponent.md +28 -0
  142. package/dist/docs/api/index/functions/hydrateWorldFromSnapshot.md +28 -0
  143. package/dist/docs/api/index/functions/hydrateWorldFromSnapshotDetailed.md +28 -0
  144. package/dist/docs/api/index/functions/registerDefaultComponentFactories.md +23 -0
  145. package/dist/docs/api/index/functions/registerDefaultFactories.md +23 -0
  146. package/dist/docs/api/index/index.md +249 -0
  147. package/dist/docs/api/index/interfaces/EcsSystem.md +50 -0
  148. package/dist/docs/api/index/interfaces/StateMachine.md +26 -0
  149. package/dist/docs/api/index/type-aliases/AnimationStateCallbacks.md +25 -0
  150. package/dist/docs/api/index/type-aliases/ComponentFactory.md +25 -0
  151. package/dist/docs/api/index/type-aliases/EcsComponentFactoryKind.md +37 -0
  152. package/dist/docs/api/index/type-aliases/EcsWorldComponentSnapshot.md +26 -0
  153. package/dist/docs/api/index/type-aliases/EcsWorldStateSnapshotLike.md +25 -0
  154. package/dist/docs/api/index/type-aliases/HydrateWorldFromSnapshotResult.md +23 -0
  155. package/dist/docs/api/index/type-aliases/KeyboardKey.md +13 -0
  156. package/dist/docs/api/index/type-aliases/MouseButton.md +13 -0
  157. package/dist/docs/api/index/type-aliases/SelectionContext.md +31 -0
  158. package/dist/docs/api/index/variables/HYDRATABLE_ENTITY_KINDS.md +13 -0
  159. package/dist/docs/api/index/variables/KeyboardKeys.md +195 -0
  160. package/dist/docs/api/index.md +15 -0
  161. package/dist/docs/api/typedoc-sidebar.json +1 -0
  162. package/dist/docs/api/types/index.md +34 -0
  163. package/dist/docs/api/types/type-aliases/AssetInput.md +23 -0
  164. package/dist/docs/api/types/type-aliases/CheckboxInput.md +13 -0
  165. package/dist/docs/api/types/type-aliases/ColorInput.md +13 -0
  166. package/dist/docs/api/types/type-aliases/ComponentInput.md +52 -0
  167. package/dist/docs/api/types/type-aliases/ComponentKind.md +37 -0
  168. package/dist/docs/api/types/type-aliases/DropdownInput.md +23 -0
  169. package/dist/docs/api/types/type-aliases/DropdownOption.md +23 -0
  170. package/dist/docs/api/types/type-aliases/EcsEntityEditorKind.md +15 -0
  171. package/dist/docs/api/types/type-aliases/EcsEntityKind.md +35 -0
  172. package/dist/docs/api/types/type-aliases/EntityId.md +16 -0
  173. package/dist/docs/api/types/type-aliases/EntityInput.md +23 -0
  174. package/dist/docs/api/types/type-aliases/FloatInput.md +13 -0
  175. package/dist/docs/api/types/type-aliases/IntersectionResult.md +29 -0
  176. package/dist/docs/api/types/type-aliases/ParentLookup.md +26 -0
  177. package/dist/docs/api/types/type-aliases/SelectionListener.md +25 -0
  178. package/dist/docs/api/types/type-aliases/SliderInput.md +27 -0
  179. package/dist/docs/api/types/type-aliases/TextInput.md +13 -0
  180. package/dist/docs/api/types/type-aliases/ToggleInput.md +13 -0
  181. package/dist/docs/api/types/type-aliases/Vec3.md +23 -0
  182. package/dist/docs/api/types/type-aliases/Vector2Input.md +23 -0
  183. package/dist/docs/api/types/type-aliases/Vector3Input.md +25 -0
  184. package/dist/docs/api/types/type-aliases/WorldEntityView.md +17 -0
  185. package/dist/docs/guide/accessing-components.md +399 -0
  186. package/dist/docs/guide/authoring-a-behaviour.md +166 -0
  187. package/dist/docs/guide/behaviour-lifecycle.md +43 -0
  188. package/dist/docs/guide/component-catalog.md +59 -0
  189. package/dist/docs/guide/components/_sidebar.json +78 -0
  190. package/dist/docs/guide/components/animation.md +171 -0
  191. package/dist/docs/guide/components/audio.md +181 -0
  192. package/dist/docs/guide/components/camera.md +179 -0
  193. package/dist/docs/guide/components/entity-type.md +141 -0
  194. package/dist/docs/guide/components/image-target-anchor.md +103 -0
  195. package/dist/docs/guide/components/image-target.md +122 -0
  196. package/dist/docs/guide/components/image.md +146 -0
  197. package/dist/docs/guide/components/light.md +157 -0
  198. package/dist/docs/guide/components/material.md +161 -0
  199. package/dist/docs/guide/components/mesh-geometry.md +153 -0
  200. package/dist/docs/guide/components/mesh.md +151 -0
  201. package/dist/docs/guide/components/model.md +96 -0
  202. package/dist/docs/guide/components/name.md +121 -0
  203. package/dist/docs/guide/components/object3d-ref.md +115 -0
  204. package/dist/docs/guide/components/parent-id.md +108 -0
  205. package/dist/docs/guide/components/physics.md +163 -0
  206. package/dist/docs/guide/components/script.md +142 -0
  207. package/dist/docs/guide/components/sprite.md +155 -0
  208. package/dist/docs/guide/components/transform.md +155 -0
  209. package/dist/docs/guide/components/video.md +153 -0
  210. package/dist/docs/guide/concepts.md +34 -0
  211. package/dist/docs/guide/getting-started/creating-objects.md +50 -0
  212. package/dist/docs/guide/getting-started/editing-objects.md +62 -0
  213. package/dist/docs/guide/getting-started/editor/assets-browser.md +55 -0
  214. package/dist/docs/guide/getting-started/editor/hierarchy.md +47 -0
  215. package/dist/docs/guide/getting-started/editor/index.md +16 -0
  216. package/dist/docs/guide/getting-started/editor/inspector.md +36 -0
  217. package/dist/docs/guide/getting-started/editor/modules.md +35 -0
  218. package/dist/docs/guide/getting-started/editor/scene-inspector.md +64 -0
  219. package/dist/docs/guide/getting-started/editor/toolbar.md +39 -0
  220. package/dist/docs/guide/getting-started/editor/viewport.md +43 -0
  221. package/dist/docs/guide/getting-started/first-launch.md +17 -0
  222. package/dist/docs/guide/getting-started/index.md +37 -0
  223. package/dist/docs/guide/getting-started/installation.md +59 -0
  224. package/dist/docs/guide/getting-started/preview-and-test.md +55 -0
  225. package/dist/docs/guide/getting-started/project-types/3d.md +30 -0
  226. package/dist/docs/guide/getting-started/project-types/ar.md +6 -0
  227. package/dist/docs/guide/getting-started/project-types/face-tracking.md +6 -0
  228. package/dist/docs/guide/getting-started/project-types/image-tracking.md +42 -0
  229. package/dist/docs/guide/getting-started/project-types/index.md +25 -0
  230. package/dist/docs/guide/getting-started/project-types/vr.md +6 -0
  231. package/dist/docs/guide/getting-started/projects.md +53 -0
  232. package/dist/docs/guide/getting-started/shortcuts.md +43 -0
  233. package/dist/docs/guide/inspector-data-binding.md +367 -0
  234. package/dist/docs/guide/reading-input.md +202 -0
  235. package/dist/docs/guide/scene/environment.md +101 -0
  236. package/dist/docs/guide/scene/index.md +36 -0
  237. package/dist/docs/guide/scene/postprocessing.md +108 -0
  238. package/dist/docs/guide/spawning/ambient-light.md +28 -0
  239. package/dist/docs/guide/spawning/area-light.md +32 -0
  240. package/dist/docs/guide/spawning/audio.md +42 -0
  241. package/dist/docs/guide/spawning/camera.md +50 -0
  242. package/dist/docs/guide/spawning/capsule.md +29 -0
  243. package/dist/docs/guide/spawning/cube.md +31 -0
  244. package/dist/docs/guide/spawning/cylinder.md +29 -0
  245. package/dist/docs/guide/spawning/directional-light.md +32 -0
  246. package/dist/docs/guide/spawning/empty.md +31 -0
  247. package/dist/docs/guide/spawning/image-target.md +48 -0
  248. package/dist/docs/guide/spawning/image.md +33 -0
  249. package/dist/docs/guide/spawning/index.md +79 -0
  250. package/dist/docs/guide/spawning/model.md +31 -0
  251. package/dist/docs/guide/spawning/plane.md +31 -0
  252. package/dist/docs/guide/spawning/point-light.md +32 -0
  253. package/dist/docs/guide/spawning/sphere.md +29 -0
  254. package/dist/docs/guide/spawning/spot-light.md +32 -0
  255. package/dist/docs/guide/spawning/sprite.md +31 -0
  256. package/dist/docs/guide/spawning/video.md +53 -0
  257. package/dist/docs/guide/system-overview.md +73 -0
  258. package/dist/docs/guide/systems/_sidebar.json +66 -0
  259. package/dist/docs/guide/systems/animation-system.md +32 -0
  260. package/dist/docs/guide/systems/audio-system.md +28 -0
  261. package/dist/docs/guide/systems/camera-sync-system.md +31 -0
  262. package/dist/docs/guide/systems/environment-sync-system.md +31 -0
  263. package/dist/docs/guide/systems/input-system.md +217 -0
  264. package/dist/docs/guide/systems/light-sync-system.md +29 -0
  265. package/dist/docs/guide/systems/material-sync-system.md +32 -0
  266. package/dist/docs/guide/systems/mesh-geometry-system.md +40 -0
  267. package/dist/docs/guide/systems/object-management-system.md +38 -0
  268. package/dist/docs/guide/systems/object-visibility-system.md +26 -0
  269. package/dist/docs/guide/systems/physics-sync-system.md +56 -0
  270. package/dist/docs/guide/systems/postprocessing-sync-system.md +43 -0
  271. package/dist/docs/guide/systems/render-system.md +22 -0
  272. package/dist/docs/guide/systems/script-behaviour-system.md +59 -0
  273. package/dist/docs/guide/systems/transform-sync-system.md +29 -0
  274. package/dist/docs/guide/systems/video-system.md +30 -0
  275. package/dist/docs/guide/world-api.md +405 -0
  276. package/dist/factories/index.cjs +3077 -0
  277. package/dist/factories/index.cjs.map +1 -0
  278. package/dist/factories/index.d.cts +69 -0
  279. package/dist/factories/index.d.ts +69 -0
  280. package/dist/factories/index.js +6 -0
  281. package/dist/factories/index.js.map +1 -0
  282. package/dist/index-B4-YyUNR.d.cts +73 -0
  283. package/dist/index-BZUOKeTO.d.ts +73 -0
  284. package/dist/index.cjs +8584 -0
  285. package/dist/index.cjs.map +1 -0
  286. package/dist/index.d.cts +283 -0
  287. package/dist/index.d.ts +283 -0
  288. package/dist/index.js +1729 -0
  289. package/dist/index.js.map +1 -0
  290. package/dist/systems/index.cjs +5119 -0
  291. package/dist/systems/index.cjs.map +1 -0
  292. package/dist/systems/index.d.cts +200 -0
  293. package/dist/systems/index.d.ts +200 -0
  294. package/dist/systems/index.js +6 -0
  295. package/dist/systems/index.js.map +1 -0
  296. package/dist/types.cjs +4 -0
  297. package/dist/types.cjs.map +1 -0
  298. package/dist/types.d.cts +3 -0
  299. package/dist/types.d.ts +3 -0
  300. package/dist/types.js +3 -0
  301. package/dist/types.js.map +1 -0
  302. package/dist/worldSnapshotUtils.cjs +259 -0
  303. package/dist/worldSnapshotUtils.cjs.map +1 -0
  304. package/dist/worldSnapshotUtils.d.cts +3 -0
  305. package/dist/worldSnapshotUtils.d.ts +3 -0
  306. package/dist/worldSnapshotUtils.js +4 -0
  307. package/dist/worldSnapshotUtils.js.map +1 -0
  308. 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