@needle-tools/engine 4.12.5 → 4.13.0-next.1eca7a7
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/CHANGELOG.md +5 -0
- package/README.md +38 -1
- package/components.needle.json +1 -1
- package/custom-elements.json +156 -5
- package/dist/{gltf-progressive-BqUnxvCx.umd.cjs → gltf-progressive-BURrJW0U.umd.cjs} +1 -1
- package/dist/{gltf-progressive-CSaX5HQb.min.js → gltf-progressive-DHLDFNvQ.min.js} +1 -1
- package/dist/{gltf-progressive-ChnIhDXx.js → gltf-progressive-eiJCrjLb.js} +3 -3
- package/dist/materialx-B9ddsHcF.min.js +90 -0
- package/dist/materialx-BF23AVE8.umd.cjs +90 -0
- package/dist/materialx-fkoFuRh3.js +4636 -0
- package/dist/{needle-engine.bundle-Cnemui9H.umd.cjs → needle-engine.bundle-BfrDWglE.umd.cjs} +124 -124
- package/dist/{needle-engine.bundle-B_IGIr6Z.min.js → needle-engine.bundle-Bx_Lq_3v.min.js} +131 -131
- package/dist/{needle-engine.bundle-Cj66livk.js → needle-engine.bundle-MQyZGnMF.js} +3754 -3374
- package/dist/needle-engine.d.ts +2791 -309
- package/dist/needle-engine.js +415 -414
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-12-UW7je.min.js → postprocessing-BVNrgYZK.min.js} +1 -1
- package/dist/{postprocessing-B3Hu0Ryi.umd.cjs → postprocessing-CI2TjWpu.umd.cjs} +1 -1
- package/dist/{postprocessing-R535krvT.js → postprocessing-DdM-tz1j.js} +2 -2
- package/dist/{three-BzxwLtUE.umd.cjs → three-BW2s1Yl-.umd.cjs} +25 -25
- package/dist/{three-DMvLgxja.min.js → three-I__hSXzr.min.js} +26 -26
- package/dist/{three-D9pcFbxc.js → three-VvRoMeIN.js} +22 -0
- package/dist/{three-examples-F0MJj0vr.js → three-examples-BhfOE7NG.js} +1 -1
- package/dist/{three-examples-CjSwCv_b.umd.cjs → three-examples-Bpfu6ke_.umd.cjs} +1 -1
- package/dist/{three-examples-CIv2roOA.min.js → three-examples-D8zAE_7t.min.js} +1 -1
- package/dist/{three-mesh-ui-BLnJQzMl.umd.cjs → three-mesh-ui-BU55xDxJ.umd.cjs} +1 -1
- package/dist/{three-mesh-ui-BllgajJz.min.js → three-mesh-ui-C3QbemOV.min.js} +1 -1
- package/dist/{three-mesh-ui-DYyiRn5Y.js → three-mesh-ui-CcMp-FQm.js} +1 -1
- package/dist/{vendor-BIFy-gRe.js → vendor-BiyIZ61v.js} +1 -1
- package/dist/{vendor-BFgQSG2m.umd.cjs → vendor-COVQl0b8.umd.cjs} +1 -1
- package/dist/{vendor-ChgmXMYr.min.js → vendor-DW7zqjuT.min.js} +1 -1
- package/lib/engine/engine_context.d.ts +16 -0
- package/lib/engine/engine_context.js +16 -0
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +72 -0
- package/lib/engine/engine_gameobject.js +38 -0
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_input.d.ts +80 -4
- package/lib/engine/engine_input.js +78 -2
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_loaders.js +7 -1
- package/lib/engine/engine_loaders.js.map +1 -1
- package/lib/engine/engine_math.d.ts +81 -2
- package/lib/engine/engine_math.js +68 -2
- package/lib/engine/engine_math.js.map +1 -1
- package/lib/engine/engine_modules.d.ts +9 -0
- package/lib/engine/engine_modules.js +25 -0
- package/lib/engine/engine_modules.js.map +1 -1
- package/lib/engine/engine_networking.d.ts +181 -14
- package/lib/engine/engine_networking.js +181 -14
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_networking_auto.d.ts +35 -8
- package/lib/engine/engine_networking_auto.js +35 -8
- package/lib/engine/engine_networking_auto.js.map +1 -1
- package/lib/engine/engine_physics.d.ts +35 -1
- package/lib/engine/engine_physics.js +35 -1
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/engine_physics_rapier.d.ts +76 -0
- package/lib/engine/engine_physics_rapier.js +76 -0
- package/lib/engine/engine_physics_rapier.js.map +1 -1
- package/lib/engine/engine_serialization_decorator.d.ts +28 -2
- package/lib/engine/engine_serialization_decorator.js +28 -2
- package/lib/engine/engine_serialization_decorator.js.map +1 -1
- package/lib/engine/engine_time.d.ts +23 -3
- package/lib/engine/engine_time.js +23 -3
- package/lib/engine/engine_time.js.map +1 -1
- package/lib/engine/engine_util_decorator.d.ts +31 -1
- package/lib/engine/engine_util_decorator.js +31 -1
- package/lib/engine/engine_util_decorator.js.map +1 -1
- package/lib/engine/engine_utils.d.ts +21 -5
- package/lib/engine/engine_utils.js +21 -5
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/engine_utils_format.d.ts +1 -1
- package/lib/engine/engine_utils_format.js +4 -1
- package/lib/engine/engine_utils_format.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_materialx.d.ts +29 -0
- package/lib/engine/extensions/NEEDLE_materialx.js +115 -0
- package/lib/engine/extensions/NEEDLE_materialx.js.map +1 -0
- package/lib/engine/extensions/extensions.js +2 -0
- package/lib/engine/extensions/extensions.js.map +1 -1
- package/lib/engine/extensions/index.d.ts +1 -0
- package/lib/engine/extensions/index.js +1 -0
- package/lib/engine/extensions/index.js.map +1 -1
- package/lib/engine-components/AlignmentConstraint.d.ts +23 -3
- package/lib/engine-components/AlignmentConstraint.js +23 -3
- package/lib/engine-components/AlignmentConstraint.js.map +1 -1
- package/lib/engine-components/Animation.d.ts +42 -0
- package/lib/engine-components/Animation.js +36 -0
- package/lib/engine-components/Animation.js.map +1 -1
- package/lib/engine-components/Animator.d.ts +37 -4
- package/lib/engine-components/Animator.js +37 -4
- package/lib/engine-components/Animator.js.map +1 -1
- package/lib/engine-components/AudioSource.d.ts +32 -10
- package/lib/engine-components/AudioSource.js +32 -10
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/AxesHelper.d.ts +22 -3
- package/lib/engine-components/AxesHelper.js +22 -3
- package/lib/engine-components/AxesHelper.js.map +1 -1
- package/lib/engine-components/BasicIKConstraint.d.ts +27 -4
- package/lib/engine-components/BasicIKConstraint.js +27 -4
- package/lib/engine-components/BasicIKConstraint.js.map +1 -1
- package/lib/engine-components/Camera.d.ts +31 -1
- package/lib/engine-components/Camera.js +31 -1
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CharacterController.d.ts +67 -3
- package/lib/engine-components/CharacterController.js +67 -3
- package/lib/engine-components/CharacterController.js.map +1 -1
- package/lib/engine-components/Collider.d.ts +69 -12
- package/lib/engine-components/Collider.js +69 -12
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/ContactShadows.d.ts +26 -6
- package/lib/engine-components/ContactShadows.js +46 -8
- package/lib/engine-components/ContactShadows.js.map +1 -1
- package/lib/engine-components/DeleteBox.d.ts +43 -2
- package/lib/engine-components/DeleteBox.js +43 -2
- package/lib/engine-components/DeleteBox.js.map +1 -1
- package/lib/engine-components/DeviceFlag.d.ts +21 -2
- package/lib/engine-components/DeviceFlag.js +21 -2
- package/lib/engine-components/DeviceFlag.js.map +1 -1
- package/lib/engine-components/DragControls.d.ts +32 -2
- package/lib/engine-components/DragControls.js +32 -2
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/DropListener.d.ts +33 -21
- package/lib/engine-components/DropListener.js +33 -21
- package/lib/engine-components/DropListener.js.map +1 -1
- package/lib/engine-components/Duplicatable.d.ts +36 -5
- package/lib/engine-components/Duplicatable.js +36 -5
- package/lib/engine-components/Duplicatable.js.map +1 -1
- package/lib/engine-components/EventList.d.ts +38 -10
- package/lib/engine-components/EventList.js +38 -10
- package/lib/engine-components/EventList.js.map +1 -1
- package/lib/engine-components/Fog.d.ts +23 -1
- package/lib/engine-components/Fog.js +23 -1
- package/lib/engine-components/Fog.js.map +1 -1
- package/lib/engine-components/GridHelper.d.ts +18 -2
- package/lib/engine-components/GridHelper.js +18 -2
- package/lib/engine-components/GridHelper.js.map +1 -1
- package/lib/engine-components/GroundProjection.d.ts +24 -2
- package/lib/engine-components/GroundProjection.js +24 -2
- package/lib/engine-components/GroundProjection.js.map +1 -1
- package/lib/engine-components/Interactable.d.ts +17 -2
- package/lib/engine-components/Interactable.js +17 -2
- package/lib/engine-components/Interactable.js.map +1 -1
- package/lib/engine-components/Joints.d.ts +50 -7
- package/lib/engine-components/Joints.js +50 -7
- package/lib/engine-components/Joints.js.map +1 -1
- package/lib/engine-components/LODGroup.d.ts +36 -14
- package/lib/engine-components/LODGroup.js +43 -11
- package/lib/engine-components/LODGroup.js.map +1 -1
- package/lib/engine-components/Light.d.ts +27 -5
- package/lib/engine-components/Light.js +27 -5
- package/lib/engine-components/Light.js.map +1 -1
- package/lib/engine-components/LookAtConstraint.d.ts +22 -7
- package/lib/engine-components/LookAtConstraint.js +22 -7
- package/lib/engine-components/LookAtConstraint.js.map +1 -1
- package/lib/engine-components/NeedleMenu.d.ts +27 -5
- package/lib/engine-components/NeedleMenu.js +27 -5
- package/lib/engine-components/NeedleMenu.js.map +1 -1
- package/lib/engine-components/NestedGltf.d.ts +39 -4
- package/lib/engine-components/NestedGltf.js +42 -4
- package/lib/engine-components/NestedGltf.js.map +1 -1
- package/lib/engine-components/OffsetConstraint.d.ts +27 -3
- package/lib/engine-components/OffsetConstraint.js +27 -3
- package/lib/engine-components/OffsetConstraint.js.map +1 -1
- package/lib/engine-components/OrbitControls.d.ts +41 -3
- package/lib/engine-components/OrbitControls.js +41 -3
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/ReflectionProbe.d.ts +17 -2
- package/lib/engine-components/ReflectionProbe.js +28 -10
- package/lib/engine-components/ReflectionProbe.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +34 -0
- package/lib/engine-components/Renderer.js +35 -2
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.d.ts +11 -0
- package/lib/engine-components/SceneSwitcher.js +11 -0
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/ScreenCapture.d.ts +38 -6
- package/lib/engine-components/ScreenCapture.js +38 -6
- package/lib/engine-components/ScreenCapture.js.map +1 -1
- package/lib/engine-components/Skybox.js +1 -1
- package/lib/engine-components/Skybox.js.map +1 -1
- package/lib/engine-components/SmoothFollow.d.ts +66 -7
- package/lib/engine-components/SmoothFollow.js +66 -7
- package/lib/engine-components/SmoothFollow.js.map +1 -1
- package/lib/engine-components/SpatialTrigger.d.ts +48 -1
- package/lib/engine-components/SpatialTrigger.js +48 -1
- package/lib/engine-components/SpatialTrigger.js.map +1 -1
- package/lib/engine-components/SpectatorCamera.d.ts +21 -3
- package/lib/engine-components/SpectatorCamera.js +21 -3
- package/lib/engine-components/SpectatorCamera.js.map +1 -1
- package/lib/engine-components/SyncedRoom.d.ts +6 -0
- package/lib/engine-components/SyncedRoom.js +6 -0
- package/lib/engine-components/SyncedRoom.js.map +1 -1
- package/lib/engine-components/SyncedTransform.d.ts +55 -6
- package/lib/engine-components/SyncedTransform.js +55 -6
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/TransformGizmo.d.ts +30 -3
- package/lib/engine-components/TransformGizmo.js +30 -3
- package/lib/engine-components/TransformGizmo.js.map +1 -1
- package/lib/engine-components/VideoPlayer.d.ts +33 -6
- package/lib/engine-components/VideoPlayer.js +45 -6
- package/lib/engine-components/VideoPlayer.js.map +1 -1
- package/lib/engine-components/Voip.d.ts +33 -2
- package/lib/engine-components/Voip.js +33 -2
- package/lib/engine-components/Voip.js.map +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +47 -13
- package/lib/engine-components/export/usdz/USDZExporter.js +47 -13
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +82 -3
- package/lib/engine-components/particlesystem/ParticleSystem.js +82 -3
- package/lib/engine-components/particlesystem/ParticleSystem.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.d.ts +99 -14
- package/lib/engine-components/timeline/PlayableDirector.js +91 -25
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/ui/Button.d.ts +29 -3
- package/lib/engine-components/ui/Button.js +29 -3
- package/lib/engine-components/ui/Button.js.map +1 -1
- package/lib/engine-components/ui/Canvas.d.ts +28 -3
- package/lib/engine-components/ui/Canvas.js +28 -3
- package/lib/engine-components/ui/Canvas.js.map +1 -1
- package/lib/engine-components/ui/Image.d.ts +22 -3
- package/lib/engine-components/ui/Image.js +22 -3
- package/lib/engine-components/ui/Image.js.map +1 -1
- package/lib/engine-components/ui/Raycaster.d.ts +55 -6
- package/lib/engine-components/ui/Raycaster.js +55 -6
- package/lib/engine-components/ui/Raycaster.js.map +1 -1
- package/lib/engine-components/ui/Text.d.ts +23 -1
- package/lib/engine-components/ui/Text.js +23 -1
- package/lib/engine-components/ui/Text.js.map +1 -1
- package/lib/engine-components/webxr/TeleportTarget.d.ts +21 -2
- package/lib/engine-components/webxr/TeleportTarget.js +21 -2
- package/lib/engine-components/webxr/TeleportTarget.js.map +1 -1
- package/lib/engine-components/webxr/WebXR.d.ts +10 -2
- package/lib/engine-components/webxr/WebXR.js +10 -2
- package/lib/engine-components/webxr/WebXR.js.map +1 -1
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +39 -2
- package/lib/engine-components/webxr/WebXRAvatar.js +35 -3
- package/lib/engine-components/webxr/WebXRAvatar.js.map +1 -1
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +266 -30
- package/lib/engine-components/webxr/WebXRImageTracking.js +266 -30
- package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
- package/lib/engine-components/webxr/XRFlag.d.ts +29 -2
- package/lib/engine-components/webxr/XRFlag.js +29 -2
- package/lib/engine-components/webxr/XRFlag.js.map +1 -1
- package/package.json +3 -2
- package/plugins/vite/custom-element-data.js +128 -19
- package/plugins/vite/dependencies.js +9 -4
- package/plugins/vite/index.js +0 -2
- package/src/engine/engine_context.ts +16 -0
- package/src/engine/engine_gameobject.ts +73 -0
- package/src/engine/engine_input.ts +83 -7
- package/src/engine/engine_loaders.ts +9 -2
- package/src/engine/engine_math.ts +81 -2
- package/src/engine/engine_modules.ts +24 -0
- package/src/engine/engine_networking.ts +187 -17
- package/src/engine/engine_networking_auto.ts +36 -9
- package/src/engine/engine_physics.ts +37 -1
- package/src/engine/engine_physics_rapier.ts +77 -0
- package/src/engine/engine_serialization_decorator.ts +28 -2
- package/src/engine/engine_time.ts +23 -3
- package/src/engine/engine_util_decorator.ts +31 -1
- package/src/engine/engine_utils.ts +21 -5
- package/src/engine/engine_utils_format.ts +6 -2
- package/src/engine/extensions/NEEDLE_materialx.ts +143 -0
- package/src/engine/extensions/extensions.ts +2 -0
- package/src/engine/extensions/index.ts +1 -0
- package/src/engine-components/AlignmentConstraint.ts +24 -4
- package/src/engine-components/Animation.ts +44 -2
- package/src/engine-components/Animator.ts +40 -7
- package/src/engine-components/AudioSource.ts +37 -15
- package/src/engine-components/AxesHelper.ts +23 -4
- package/src/engine-components/BasicIKConstraint.ts +28 -5
- package/src/engine-components/Camera.ts +33 -3
- package/src/engine-components/CharacterController.ts +73 -6
- package/src/engine-components/Collider.ts +78 -21
- package/src/engine-components/ContactShadows.ts +51 -11
- package/src/engine-components/DeleteBox.ts +43 -2
- package/src/engine-components/DeviceFlag.ts +22 -3
- package/src/engine-components/DragControls.ts +32 -2
- package/src/engine-components/DropListener.ts +42 -29
- package/src/engine-components/Duplicatable.ts +37 -6
- package/src/engine-components/EventList.ts +41 -13
- package/src/engine-components/Fog.ts +23 -1
- package/src/engine-components/GridHelper.ts +18 -2
- package/src/engine-components/GroundProjection.ts +25 -3
- package/src/engine-components/Interactable.ts +17 -2
- package/src/engine-components/Joints.ts +51 -8
- package/src/engine-components/LODGroup.ts +45 -11
- package/src/engine-components/Light.ts +30 -8
- package/src/engine-components/LookAtConstraint.ts +26 -8
- package/src/engine-components/NeedleMenu.ts +29 -7
- package/src/engine-components/NestedGltf.ts +40 -4
- package/src/engine-components/OffsetConstraint.ts +27 -3
- package/src/engine-components/OrbitControls.ts +41 -3
- package/src/engine-components/ReflectionProbe.ts +31 -13
- package/src/engine-components/Renderer.ts +34 -1
- package/src/engine-components/SceneSwitcher.ts +11 -0
- package/src/engine-components/ScreenCapture.ts +41 -9
- package/src/engine-components/Skybox.ts +1 -1
- package/src/engine-components/SmoothFollow.ts +69 -7
- package/src/engine-components/SpatialTrigger.ts +51 -4
- package/src/engine-components/SpectatorCamera.ts +23 -5
- package/src/engine-components/SyncedRoom.ts +6 -0
- package/src/engine-components/SyncedTransform.ts +59 -10
- package/src/engine-components/TransformGizmo.ts +31 -4
- package/src/engine-components/VideoPlayer.ts +48 -6
- package/src/engine-components/Voip.ts +33 -2
- package/src/engine-components/export/usdz/USDZExporter.ts +47 -13
- package/src/engine-components/particlesystem/ParticleSystem.ts +84 -5
- package/src/engine-components/timeline/PlayableDirector.ts +104 -27
- package/src/engine-components/ui/Button.ts +29 -3
- package/src/engine-components/ui/Canvas.ts +28 -3
- package/src/engine-components/ui/Image.ts +22 -3
- package/src/engine-components/ui/Raycaster.ts +57 -8
- package/src/engine-components/ui/Text.ts +24 -2
- package/src/engine-components/webxr/TeleportTarget.ts +23 -4
- package/src/engine-components/webxr/WebXR.ts +11 -3
- package/src/engine-components/webxr/WebXRAvatar.ts +41 -4
- package/src/engine-components/webxr/WebXRImageTracking.ts +282 -38
- package/src/engine-components/webxr/XRFlag.ts +30 -3
- package/plugins/vite/materialx.js +0 -32
|
@@ -55,12 +55,48 @@ onUpdate((ctx) => {
|
|
|
55
55
|
})
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* SyncedTransform synchronizes
|
|
59
|
-
*
|
|
60
|
-
*
|
|
58
|
+
* SyncedTransform synchronizes position and rotation of a GameObject across the network.
|
|
59
|
+
* When users interact with an object (e.g., via {@link DragControls}), they automatically
|
|
60
|
+
* take ownership and their changes are broadcast to other users.
|
|
61
|
+
*
|
|
62
|
+
* **Features:**
|
|
63
|
+
* - Automatic ownership transfer when interacting
|
|
64
|
+
* - Smooth interpolation of remote updates
|
|
65
|
+
* - Physics integration (can override kinematic state)
|
|
66
|
+
* - Fast mode for rapidly moving objects
|
|
67
|
+
*
|
|
68
|
+
* **Requirements:**
|
|
69
|
+
* - Active network connection via {@link SyncedRoom}
|
|
70
|
+
* - Objects must have unique GUIDs (set automatically in Unity/Blender export)
|
|
71
|
+
*
|
|
72
|
+
* **Ownership:**
|
|
73
|
+
* This component uses {@link OwnershipModel} internally to manage object ownership.
|
|
74
|
+
* Only the client that owns an object can send transform updates. Use `requestOwnership()`
|
|
75
|
+
* before modifying the transform, or check `hasOwnership()` to see if you can modify it.
|
|
76
|
+
*
|
|
77
|
+
* **Debug:** Use `?debugsync` URL parameter for logging.
|
|
78
|
+
*
|
|
79
|
+
* @example Basic networked object
|
|
80
|
+
* ```ts
|
|
81
|
+
* // Add to any object you want synced
|
|
82
|
+
* const sync = myObject.addComponent(SyncedTransform);
|
|
83
|
+
* sync.fastMode = true; // For fast-moving objects
|
|
84
|
+
*
|
|
85
|
+
* // Request ownership before modifying
|
|
86
|
+
* sync.requestOwnership();
|
|
87
|
+
* myObject.position.x += 1;
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* - Example: https://engine.needle.tools/samples/collaborative-sandbox
|
|
91
|
+
*
|
|
61
92
|
* @summary Synchronizes object transform over the network with ownership management
|
|
62
93
|
* @category Networking
|
|
63
94
|
* @group Components
|
|
95
|
+
* @see {@link SyncedRoom} for room/session management
|
|
96
|
+
* @see {@link OwnershipModel} for ownership management details
|
|
97
|
+
* @see {@link DragControls} for interactive dragging with sync
|
|
98
|
+
* @see {@link Duplicatable} for networked object spawning
|
|
99
|
+
* @link https://engine.needle.tools/docs/networking.html
|
|
64
100
|
*/
|
|
65
101
|
export class SyncedTransform extends Behaviour {
|
|
66
102
|
|
|
@@ -94,9 +130,18 @@ export class SyncedTransform extends Behaviour {
|
|
|
94
130
|
private _receivedFastUpdate: boolean = false;
|
|
95
131
|
private _shouldRequestOwnership: boolean = false;
|
|
96
132
|
|
|
97
|
-
/**
|
|
133
|
+
/**
|
|
98
134
|
* Requests ownership of this object on the network.
|
|
99
135
|
* You need to be connected to a room for this to work.
|
|
136
|
+
* Call this before modifying the object's transform to ensure your changes are synchronized.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* // Request ownership before modifying
|
|
141
|
+
* syncedTransform.requestOwnership();
|
|
142
|
+
* this.gameObject.position.y += 1;
|
|
143
|
+
* ```
|
|
144
|
+
* @see {@link OwnershipModel.requestOwnership} for more details
|
|
100
145
|
*/
|
|
101
146
|
public requestOwnership() {
|
|
102
147
|
if (debug)
|
|
@@ -110,25 +155,29 @@ export class SyncedTransform extends Behaviour {
|
|
|
110
155
|
}
|
|
111
156
|
|
|
112
157
|
/**
|
|
113
|
-
* Free ownership of this object on the network.
|
|
114
|
-
* You need to be connected to a room for this to work.
|
|
158
|
+
* Free ownership of this object on the network.
|
|
159
|
+
* You need to be connected to a room for this to work.
|
|
115
160
|
* This will also be called automatically when the component is disabled.
|
|
161
|
+
* Call this when you're done modifying an object to allow other users to interact with it.
|
|
162
|
+
* @see {@link OwnershipModel.freeOwnership} for more details
|
|
116
163
|
*/
|
|
117
164
|
public freeOwnership() {
|
|
118
165
|
this._model?.freeOwnership();
|
|
119
166
|
}
|
|
120
167
|
|
|
121
168
|
/**
|
|
122
|
-
* Checks if this client has ownership of the object
|
|
123
|
-
* @returns true if this client has ownership, false if not, undefined if ownership state is unknown
|
|
169
|
+
* Checks if this client has ownership of the object.
|
|
170
|
+
* @returns `true` if this client has ownership, `false` if not, `undefined` if ownership state is unknown
|
|
171
|
+
* @see {@link OwnershipModel.hasOwnership} for more details
|
|
124
172
|
*/
|
|
125
173
|
public hasOwnership(): boolean | undefined {
|
|
126
174
|
return this._model?.hasOwnership ?? undefined;
|
|
127
175
|
}
|
|
128
176
|
|
|
129
177
|
/**
|
|
130
|
-
* Checks if the object is owned by any client
|
|
131
|
-
* @returns true if the object is owned, false if not, undefined if ownership state is unknown
|
|
178
|
+
* Checks if the object is owned by any client (local or remote).
|
|
179
|
+
* @returns `true` if the object is owned, `false` if not, `undefined` if ownership state is unknown
|
|
180
|
+
* @see {@link OwnershipModel.isOwned} for more details
|
|
132
181
|
*/
|
|
133
182
|
public isOwned(): boolean | undefined {
|
|
134
183
|
return this._model?.isOwned;
|
|
@@ -8,12 +8,39 @@ import { OrbitControls } from "./OrbitControls.js";
|
|
|
8
8
|
import { SyncedTransform } from "./SyncedTransform.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* TransformGizmo displays manipulation controls for translating, rotating, and scaling objects
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* TransformGizmo displays manipulation controls for translating, rotating, and scaling objects.
|
|
12
|
+
* Wraps three.js {@link TransformControls} with keyboard shortcuts and snapping support.
|
|
13
|
+
*
|
|
14
|
+
* **Keyboard shortcuts:**
|
|
15
|
+
* - `W` - Translate mode
|
|
16
|
+
* - `E` - Rotate mode
|
|
17
|
+
* - `R` - Scale mode
|
|
18
|
+
* - `Q` - Toggle local/world space
|
|
19
|
+
* - `Shift` (hold) - Enable grid snapping
|
|
20
|
+
* - `+/-` - Adjust gizmo size
|
|
21
|
+
* - `X/Y/Z` - Toggle axis visibility
|
|
22
|
+
* - `Space` - Toggle controls enabled
|
|
23
|
+
*
|
|
24
|
+
* **Snapping:**
|
|
25
|
+
* Configure grid snapping with `translationSnap`, `rotationSnapAngle`, and `scaleSnap`.
|
|
26
|
+
*
|
|
27
|
+
* **Networking:**
|
|
28
|
+
* Automatically works with {@link SyncedTransform} for multiplayer editing.
|
|
29
|
+
*
|
|
30
|
+
* @example Add transform gizmo to an object
|
|
31
|
+
* ```ts
|
|
32
|
+
* const gizmo = editableObject.addComponent(TransformGizmo);
|
|
33
|
+
* gizmo.translationSnap = 0.5; // Snap to 0.5 unit grid
|
|
34
|
+
* gizmo.rotationSnapAngle = 45; // Snap to 45° increments
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @summary Object manipulation gizmo for translate/rotate/scale
|
|
15
38
|
* @category Helpers
|
|
16
39
|
* @group Components
|
|
40
|
+
* @see {@link DragControls} for simpler drag-only interaction
|
|
41
|
+
* @see {@link SyncedTransform} for network synchronization
|
|
42
|
+
* @see {@link OrbitControls} - automatically disabled during gizmo drag
|
|
43
|
+
* @link https://threejs.org/docs/index.html#examples/en/controls/TransformControls for underlying three.js controls and additional features
|
|
17
44
|
*/
|
|
18
45
|
export class TransformGizmo extends Behaviour {
|
|
19
46
|
|
|
@@ -9,6 +9,7 @@ import { getWorldScale } from "../engine/engine_three_utils.js";
|
|
|
9
9
|
import { getParam } from "../engine/engine_utils.js";
|
|
10
10
|
import { Behaviour, GameObject } from "./Component.js";
|
|
11
11
|
import { Renderer } from "./Renderer.js";
|
|
12
|
+
import { PointerEventData } from "./api.js";
|
|
12
13
|
|
|
13
14
|
const debug = getParam("debugvideo");
|
|
14
15
|
|
|
@@ -45,18 +46,45 @@ export enum VideoRenderMode {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* VideoPlayer plays video clips from URLs, media streams, or HLS playlists (m3u8 livestreams).
|
|
50
|
+
*
|
|
51
|
+
* **Supported formats:**
|
|
52
|
+
* - Standard video files (MP4, WebM, etc.)
|
|
53
|
+
* - Media streams (from webcam, screen capture, etc.)
|
|
54
|
+
* - HLS playlists (m3u8) for livestreaming
|
|
55
|
+
*
|
|
56
|
+
* 
|
|
57
|
+
*
|
|
58
|
+
* **Rendering modes:**
|
|
59
|
+
* Video can be rendered to a material texture, render texture, or camera planes.
|
|
60
|
+
* Set `targetMaterialRenderer` to apply video to a specific mesh's material.
|
|
61
|
+
*
|
|
62
|
+
* **Browser autoplay:**
|
|
63
|
+
* Videos may require user interaction to play with audio.
|
|
64
|
+
* Set `playOnAwake = true` for automatic playback (muted if needed).
|
|
65
|
+
*
|
|
66
|
+
* @example Basic video playback
|
|
67
|
+
* ```ts
|
|
52
68
|
* const videoPlayer = addComponent(obj, VideoPlayer, {
|
|
53
|
-
*
|
|
54
|
-
*
|
|
69
|
+
* url: "https://example.com/video.mp4",
|
|
70
|
+
* playOnAwake: true,
|
|
71
|
+
* loop: true,
|
|
55
72
|
* });
|
|
56
73
|
* ```
|
|
74
|
+
*
|
|
75
|
+
* @example Play video on a 3D surface
|
|
76
|
+
* ```ts
|
|
77
|
+
* const video = myScreen.getComponent(VideoPlayer);
|
|
78
|
+
* video.targetMaterialRenderer = myScreen.getComponent(Renderer);
|
|
79
|
+
* video.play();
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
57
82
|
* @summary Plays video clips from URLs or streams
|
|
58
83
|
* @category Multimedia
|
|
59
84
|
* @group Components
|
|
85
|
+
* @see {@link AudioSource} for audio-only playback
|
|
86
|
+
* @see {@link ScreenCapture} for capturing and sharing video
|
|
87
|
+
* @see {@link Renderer} for video texture targets
|
|
60
88
|
*/
|
|
61
89
|
export class VideoPlayer extends Behaviour {
|
|
62
90
|
|
|
@@ -72,6 +100,20 @@ export class VideoPlayer extends Behaviour {
|
|
|
72
100
|
@serializable()
|
|
73
101
|
aspectMode: AspectMode = AspectMode.None;
|
|
74
102
|
|
|
103
|
+
// /**
|
|
104
|
+
// * If true the video will toggle between play and pause when clicked.
|
|
105
|
+
// * Note that this requires the video element to be interactable which is not the case when using certain render modes like CameraNearPlane or CameraFarPlane. In those cases you can use the `requestPictureInPicture()` method to open the video in a separate window which allows interaction with the video element.
|
|
106
|
+
// */
|
|
107
|
+
// @serializable()
|
|
108
|
+
// clickToToggle: boolean = true;
|
|
109
|
+
|
|
110
|
+
// onPointerClick(_args: PointerEventData) {
|
|
111
|
+
// if (this.clickToToggle) {
|
|
112
|
+
// if (this.isPlaying) this.pause();
|
|
113
|
+
// else this.play();
|
|
114
|
+
// }
|
|
115
|
+
// }
|
|
116
|
+
|
|
75
117
|
@serializable(URL)
|
|
76
118
|
private clip?: string | MediaStream | null = null;
|
|
77
119
|
|
|
@@ -12,11 +12,42 @@ export const noVoip = "noVoip";
|
|
|
12
12
|
const debugParam = getParam("debugvoip");
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Voice over IP (VoIP) component for real-time audio communication between users.
|
|
16
|
+
* Allows sending and receiving audio streams in networked rooms.
|
|
17
|
+
*
|
|
18
|
+
* **Requirements:**
|
|
19
|
+
* - Active network connection (via {@link SyncedRoom} or manual connection)
|
|
20
|
+
* - User permission for microphone access (requested automatically)
|
|
21
|
+
* - HTTPS connection (required for WebRTC)
|
|
22
|
+
*
|
|
23
|
+
* **Features:**
|
|
24
|
+
* - Automatic connection when joining rooms (`autoConnect`)
|
|
25
|
+
* - Background audio support (`runInBackground`)
|
|
26
|
+
* - Optional UI toggle button (`createMenuButton`)
|
|
27
|
+
* - Mute/unmute control
|
|
28
|
+
*
|
|
29
|
+
* **Debug:** Use `?debugvoip` URL parameter or set `debug = true` for logging.
|
|
30
|
+
* Press 'v' to toggle mute, 'c' to connect/disconnect when debugging.
|
|
31
|
+
*
|
|
32
|
+
* @example Enable VoIP in your scene
|
|
33
|
+
* ```ts
|
|
34
|
+
* const voip = myObject.addComponent(Voip);
|
|
35
|
+
* voip.autoConnect = true;
|
|
36
|
+
* voip.createMenuButton = true;
|
|
37
|
+
*
|
|
38
|
+
* // Manual control
|
|
39
|
+
* voip.connect(); // Start sending audio
|
|
40
|
+
* voip.disconnect(); // Stop sending
|
|
41
|
+
* voip.setMuted(true); // Mute microphone
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
17
44
|
* @summary Voice over IP for networked audio communication
|
|
18
45
|
* @category Networking
|
|
19
46
|
* @group Components
|
|
47
|
+
* @see {@link SyncedRoom} for room management
|
|
48
|
+
* @see {@link NetworkedStreams} for the underlying streaming
|
|
49
|
+
* @see {@link ScreenCapture} for video streaming
|
|
50
|
+
* @link https://engine.needle.tools/docs/networking.html
|
|
20
51
|
*/
|
|
21
52
|
export class Voip extends Behaviour {
|
|
22
53
|
|
|
@@ -71,22 +71,56 @@ type BeforeLODExportArguments = {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
74
|
+
* USDZExporter creates USDZ files and opens them in Apple QuickLook on iOS/iPadOS/visionOS.
|
|
75
|
+
* Enables "View in AR" functionality for Apple devices directly from web experiences.
|
|
76
|
+
*
|
|
77
|
+
* **Key features:**
|
|
78
|
+
* - Auto-exports animations and audio sources
|
|
79
|
+
* - Interactive behaviors via Needle's "Everywhere Actions" system
|
|
80
|
+
* - RealityKit physics support (iOS 18+, visionOS 1+)
|
|
81
|
+
* - Custom QuickLook overlay with call-to-action buttons
|
|
82
|
+
* - Progressive texture/mesh LOD handling
|
|
83
|
+
*
|
|
84
|
+
* [](https://engine.needle.tools/samples/?overlay=samples&tag=usdz)
|
|
85
|
+
*
|
|
86
|
+
* **Automatic setup:**
|
|
87
|
+
* - Creates QuickLook button on compatible devices
|
|
88
|
+
* - Respects {@link XRFlag} for AR-specific visibility
|
|
89
|
+
* - Handles {@link WebARSessionRoot} scale
|
|
90
|
+
*
|
|
91
|
+
* **Custom extensions:**
|
|
92
|
+
* Add custom behaviors by implementing {@link IUSDExporterExtension} and adding to {@link extensions} array.
|
|
93
|
+
*
|
|
94
|
+
* **Debug:** Use `?debugusdz` URL parameter. Press 'T' to trigger export.
|
|
95
|
+
*
|
|
96
|
+
* @example Basic USDZ export
|
|
97
|
+
* ```ts
|
|
98
|
+
* const exporter = myObject.addComponent(USDZExporter);
|
|
99
|
+
* exporter.objectToExport = productModel;
|
|
100
|
+
* exporter.autoExportAnimations = true;
|
|
101
|
+
* exporter.interactive = true; // Enable QuickLook behaviors
|
|
102
|
+
*
|
|
103
|
+
* // Trigger export
|
|
104
|
+
* await exporter.exportAndOpen();
|
|
86
105
|
* ```
|
|
87
|
-
*
|
|
106
|
+
*
|
|
107
|
+
* @example Custom branding
|
|
108
|
+
* ```ts
|
|
109
|
+
* exporter.customBranding = {
|
|
110
|
+
* callToAction: "Buy Now",
|
|
111
|
+
* checkoutTitle: "Product Name",
|
|
112
|
+
* callToActionURL: "https://shop.example.com"
|
|
113
|
+
* };
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @summary Export 3D objects as USDZ files for Apple QuickLook AR
|
|
88
117
|
* @category XR
|
|
89
118
|
* @group Components
|
|
119
|
+
* @see {@link WebXR} for WebXR-based AR/VR
|
|
120
|
+
* @see {@link WebARSessionRoot} for AR placement and scaling
|
|
121
|
+
* @see {@link XRFlag} for AR-specific object visibility
|
|
122
|
+
* @see {@link CustomBranding} for QuickLook overlay customization
|
|
123
|
+
* @link https://engine.needle.tools/samples/?overlay=samples&tag=usdz
|
|
90
124
|
*/
|
|
91
125
|
export class USDZExporter extends Behaviour {
|
|
92
126
|
|
|
@@ -24,11 +24,20 @@ const debugProgressiveLoading = getParam("debugprogressive");
|
|
|
24
24
|
|
|
25
25
|
export type { Particle as QParticle, Behavior as QParticleBehaviour, TrailParticle as QTrailParticle } from "three.quarks"
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Defines when a sub-emitter spawns particles relative to the parent particle's lifecycle.
|
|
29
|
+
* Used to create complex effects like explosions on impact or trails following particles.
|
|
30
|
+
*/
|
|
27
31
|
export enum SubEmitterType {
|
|
32
|
+
/** Sub-emitter triggers when the parent particle is born */
|
|
28
33
|
Birth = 0,
|
|
34
|
+
/** Sub-emitter triggers when the parent particle collides */
|
|
29
35
|
Collision = 1,
|
|
36
|
+
/** Sub-emitter triggers when the parent particle dies */
|
|
30
37
|
Death = 2,
|
|
38
|
+
/** Sub-emitter triggers when the parent particle enters a trigger zone */
|
|
31
39
|
Trigger = 3,
|
|
40
|
+
/** Sub-emitter is triggered manually via code */
|
|
32
41
|
Manual = 4,
|
|
33
42
|
}
|
|
34
43
|
|
|
@@ -274,9 +283,33 @@ class ParticleSystemEmissionOverDistance extends BaseValueGenerator {
|
|
|
274
283
|
}
|
|
275
284
|
}
|
|
276
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Base class for custom particle behaviors. Extend this to create custom particle logic.
|
|
288
|
+
*
|
|
289
|
+
* Override `initialize()` to set up per-particle state when particles spawn.
|
|
290
|
+
* Override `update()` to modify particles each frame (position, velocity, color, size, etc.).
|
|
291
|
+
* Override `frameUpdate()` for logic that runs once per frame (not per particle).
|
|
292
|
+
*
|
|
293
|
+
* @example Custom wind effect
|
|
294
|
+
* ```ts
|
|
295
|
+
* class WindBehaviour extends ParticleSystemBaseBehaviour {
|
|
296
|
+
* windStrength = 2;
|
|
297
|
+
* windDirection = new Vector3(1, 0, 0);
|
|
298
|
+
*
|
|
299
|
+
* update(particle: Particle, delta: number) {
|
|
300
|
+
* particle.velocity.addScaledVector(this.windDirection, this.windStrength * delta);
|
|
301
|
+
* }
|
|
302
|
+
* }
|
|
303
|
+
* ```
|
|
304
|
+
*
|
|
305
|
+
* @see {@link ParticleSystem.addBehaviour} to register your custom behavior
|
|
306
|
+
* @link https://github.com/Alchemist0823/three.quarks
|
|
307
|
+
*/
|
|
277
308
|
export abstract class ParticleSystemBaseBehaviour implements Behavior {
|
|
278
309
|
|
|
310
|
+
/** Reference to the particle system this behavior belongs to */
|
|
279
311
|
system!: ParticleSystem;
|
|
312
|
+
/** Access to the engine context for timing, input, etc. */
|
|
280
313
|
get context() { return this.system.context; }
|
|
281
314
|
|
|
282
315
|
constructor(ps?: ParticleSystem) {
|
|
@@ -285,13 +318,18 @@ export abstract class ParticleSystemBaseBehaviour implements Behavior {
|
|
|
285
318
|
this.system = ps;
|
|
286
319
|
}
|
|
287
320
|
|
|
321
|
+
/** Behavior type identifier used by three.quarks */
|
|
288
322
|
type: string;
|
|
289
323
|
|
|
324
|
+
/** Called once when a particle is spawned. Use to initialize per-particle state. */
|
|
290
325
|
initialize(_particle: Particle): void { }
|
|
326
|
+
/** Called every frame for each active particle. Use to update particle properties. */
|
|
291
327
|
update(_particle: Particle, _delta: number): void { }
|
|
328
|
+
/** Called once per frame before particle updates. Use for shared calculations. */
|
|
292
329
|
frameUpdate(_delta: number): void { }
|
|
293
330
|
toJSON() { throw new Error("Method not implemented."); }
|
|
294
331
|
clone(): Behavior { throw new Error("Method not implemented."); }
|
|
332
|
+
/** Called when the particle system is reset. */
|
|
295
333
|
reset() { }
|
|
296
334
|
}
|
|
297
335
|
|
|
@@ -686,15 +724,56 @@ class ParticlesEmissionState implements EmissionState {
|
|
|
686
724
|
}
|
|
687
725
|
|
|
688
726
|
/**
|
|
689
|
-
*
|
|
690
|
-
*
|
|
691
|
-
* You can add custom behaviours to the particle system to fully customize the behaviour of the particles. See {@link ParticleSystemBaseBehaviour} and {@link ParticleSystem.addBehaviour} for more information.
|
|
692
|
-
*
|
|
693
|
-
* Needle Engine uses [three.quarks](https://github.com/Alchemist0823/three.quarks) under the hood to handle particles.
|
|
727
|
+
* ParticleSystem efficiently handles the motion and rendering of many individual particles.
|
|
728
|
+
* Use it for visual effects like fire, smoke, sparks, rain, magic spells, and more.
|
|
694
729
|
*
|
|
730
|
+
* 
|
|
731
|
+
* 
|
|
732
|
+
*
|
|
733
|
+
* **Modules:**
|
|
734
|
+
* Configure particle behavior through modules like {@link EmissionModule}, {@link ShapeModule},
|
|
735
|
+
* {@link ColorOverLifetimeModule}, {@link SizeOverLifetimeModule}, {@link VelocityOverLifetimeModule},
|
|
736
|
+
* {@link NoiseModule}, and {@link TrailModule}.
|
|
737
|
+
*
|
|
738
|
+
* **Custom behaviors:**
|
|
739
|
+
* Add custom particle behaviors by extending {@link ParticleSystemBaseBehaviour} and
|
|
740
|
+
* calling `addBehaviour()`. This gives you full control over particle initialization and updates.
|
|
741
|
+
*
|
|
742
|
+
* **Performance:**
|
|
743
|
+
* Particles are batched together for fast, performant rendering even on low-end devices.
|
|
744
|
+
* Needle Engine uses [three.quarks](https://github.com/Alchemist0823/three.quarks) internally.
|
|
745
|
+
*
|
|
746
|
+
* @example Basic playback control
|
|
747
|
+
* ```ts
|
|
748
|
+
* const ps = myObject.getComponent(ParticleSystem);
|
|
749
|
+
* ps.play();
|
|
750
|
+
* ps.emit(10); // Emit 10 particles immediately
|
|
751
|
+
* ps.pause();
|
|
752
|
+
* ps.stop(true, true); // Stop and clear all particles
|
|
753
|
+
* ```
|
|
754
|
+
*
|
|
755
|
+
* @example Custom particle behavior
|
|
756
|
+
* ```ts
|
|
757
|
+
* class GravityBehaviour extends ParticleSystemBaseBehaviour {
|
|
758
|
+
* update(particle: Particle, delta: number) {
|
|
759
|
+
* particle.velocity.y -= 9.8 * delta;
|
|
760
|
+
* }
|
|
761
|
+
* }
|
|
762
|
+
* particleSystem.addBehaviour(new GravityBehaviour());
|
|
763
|
+
* ```
|
|
764
|
+
*
|
|
765
|
+
* - Example: https://engine.needle.tools/samples/particles
|
|
766
|
+
* - Example: https://engine.needle.tools/samples/particle-bursts
|
|
767
|
+
* - Example: https://engine.needle.tools/samples/particles-on-collision
|
|
768
|
+
*
|
|
695
769
|
* @summary Handles the motion and rendering of many individual particles
|
|
696
770
|
* @category Rendering
|
|
697
771
|
* @group Components
|
|
772
|
+
* @see {@link ParticleSystemBaseBehaviour} for custom particle behaviors
|
|
773
|
+
* @see {@link EmissionModule} for emission configuration
|
|
774
|
+
* @see {@link ShapeModule} for emission shape control
|
|
775
|
+
* @see {@link TrailModule} for particle trails
|
|
776
|
+
* @link https://engine.needle.tools/docs/features/particles.html
|
|
698
777
|
*/
|
|
699
778
|
export class ParticleSystem extends Behaviour implements IParticleSystem {
|
|
700
779
|
|