@shopware-ag/dive 1.19.0 → 1.19.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/build/dive.cjs +388 -220
  2. package/build/dive.cjs.map +1 -1
  3. package/build/dive.js +395 -21946
  4. package/build/dive.js.map +1 -1
  5. package/build/dive.mjs +28206 -0
  6. package/build/dive.mjs.map +1 -0
  7. package/build/src/ar/AR.d.ts +37 -14
  8. package/build/src/ar/arquicklook/ARQuickLook.d.ts +5 -6
  9. package/build/src/ar/sceneviewer/SceneViewer.d.ts +42 -6
  10. package/build/src/com/actions/scene/launchar.d.ts +5 -2
  11. package/build/src/converter/Converter.d.ts +21 -0
  12. package/build/src/dive.d.ts +3 -2
  13. package/build/src/exporter/Exporter.d.ts +11 -0
  14. package/build/src/helper/applyMixins/applyMixins.d.ts +22 -6
  15. package/build/src/info/Info.d.ts +37 -13
  16. package/build/src/interface/Movable.d.ts +5 -5
  17. package/build/src/interface/Selectable.d.ts +4 -4
  18. package/build/src/loader/Loader.d.ts +11 -0
  19. package/build/src/model/Model.d.ts +2 -2
  20. package/build/src/node/Node.d.ts +3 -3
  21. package/build/src/scene/root/Root.d.ts +1 -1
  22. package/build/src/types/ExporterOptions.d.ts +15 -0
  23. package/build/src/types/FileTypes.d.ts +27 -0
  24. package/build/src/types/index.d.ts +4 -0
  25. package/build/src/types/info/index.d.ts +66 -0
  26. package/package.json +17 -3
  27. package/build/src/exporters/usdz/USDZExporter.d.ts +0 -15
  28. package/build/src/loadingmanager/LoadingManager.d.ts +0 -14
  29. package/src/__test__/DIVE.test.ts +0 -274
  30. package/src/animation/AnimationSystem.ts +0 -34
  31. package/src/animation/__test__/AnimationSystem.test.ts +0 -40
  32. package/src/ar/AR.ts +0 -98
  33. package/src/ar/__test__/AR.test.ts +0 -187
  34. package/src/ar/arquicklook/ARQuickLook.ts +0 -93
  35. package/src/ar/arquicklook/__test__/ARQuickLook.test.ts +0 -93
  36. package/src/ar/sceneviewer/SceneViewer.ts +0 -74
  37. package/src/ar/sceneviewer/__test__/SceneViewer.test.ts +0 -93
  38. package/src/ar/webxr/WebXR.ts +0 -176
  39. package/src/ar/webxr/controller/WebXRController.ts +0 -340
  40. package/src/ar/webxr/crosshair/WebXRCrosshair.ts +0 -35
  41. package/src/ar/webxr/origin/WebXROrigin.ts +0 -192
  42. package/src/ar/webxr/overlay/Overlay.ts +0 -50
  43. package/src/ar/webxr/raycaster/WebXRRaycaster.ts +0 -131
  44. package/src/ar/webxr/raycaster/ar/WebXRRaycasterAR.ts +0 -102
  45. package/src/ar/webxr/raycaster/three/WebXRRaycasterTHREE.ts +0 -49
  46. package/src/ar/webxr/touchscreencontrols/WebXRTouchscreenControls.ts +0 -356
  47. package/src/axiscamera/AxisCamera.ts +0 -108
  48. package/src/axiscamera/__test__/AxisCamera.test.ts +0 -150
  49. package/src/camera/PerspectiveCamera.ts +0 -63
  50. package/src/camera/__test__/PerspectiveCamera.test.ts +0 -36
  51. package/src/com/Communication.ts +0 -808
  52. package/src/com/__test__/Communication.test.ts +0 -1024
  53. package/src/com/actions/camera/computeencompassingview.ts +0 -10
  54. package/src/com/actions/camera/getcameratransform.ts +0 -10
  55. package/src/com/actions/camera/movecamera.ts +0 -18
  56. package/src/com/actions/camera/resetcamera.ts +0 -5
  57. package/src/com/actions/camera/setcameralayer.ts +0 -5
  58. package/src/com/actions/camera/setcameratransform.ts +0 -10
  59. package/src/com/actions/camera/zoomcamera.ts +0 -5
  60. package/src/com/actions/index.ts +0 -61
  61. package/src/com/actions/media/generatemedia.ts +0 -18
  62. package/src/com/actions/object/addobject.ts +0 -7
  63. package/src/com/actions/object/deleteobject.ts +0 -7
  64. package/src/com/actions/object/deselectobject.ts +0 -7
  65. package/src/com/actions/object/getallobjects.ts +0 -7
  66. package/src/com/actions/object/getobjects.ts +0 -7
  67. package/src/com/actions/object/model/dropit.ts +0 -5
  68. package/src/com/actions/object/model/modelloaded.ts +0 -5
  69. package/src/com/actions/object/model/placeonfloor.ts +0 -5
  70. package/src/com/actions/object/selectobject.ts +0 -7
  71. package/src/com/actions/object/setparent.ts +0 -10
  72. package/src/com/actions/object/updateobject.ts +0 -7
  73. package/src/com/actions/renderer/startrender.ts +0 -5
  74. package/src/com/actions/scene/exportscene.ts +0 -7
  75. package/src/com/actions/scene/getallscenedata.ts +0 -7
  76. package/src/com/actions/scene/launchar.ts +0 -7
  77. package/src/com/actions/scene/setbackground.ts +0 -5
  78. package/src/com/actions/scene/updatescene.ts +0 -11
  79. package/src/com/actions/toolbox/select/setgizmomode.ts +0 -5
  80. package/src/com/actions/toolbox/transform/setgizmoscalelinked.ts +0 -5
  81. package/src/com/actions/toolbox/transform/setgizmovisible.ts +0 -5
  82. package/src/com/actions/toolbox/usetool.ts +0 -7
  83. package/src/com/types/COMBaseEntity.ts +0 -9
  84. package/src/com/types/COMEntity.ts +0 -7
  85. package/src/com/types/COMEntityType.ts +0 -1
  86. package/src/com/types/COMGeometry.ts +0 -8
  87. package/src/com/types/COMGeometryType.ts +0 -9
  88. package/src/com/types/COMGroup.ts +0 -9
  89. package/src/com/types/COMLight.ts +0 -11
  90. package/src/com/types/COMMaterial.ts +0 -12
  91. package/src/com/types/COMModel.ts +0 -12
  92. package/src/com/types/COMPov.ts +0 -8
  93. package/src/com/types/COMPrimitive.ts +0 -12
  94. package/src/com/types/index.ts +0 -23
  95. package/src/constant/AxisHelperColors.ts +0 -7
  96. package/src/constant/GridColors.ts +0 -2
  97. package/src/constant/VisibilityLayerMask.ts +0 -5
  98. package/src/controls/OrbitControls.ts +0 -211
  99. package/src/controls/__test__/OrbitControls.test.ts +0 -256
  100. package/src/dive.ts +0 -363
  101. package/src/events/EventExecutor.ts +0 -35
  102. package/src/exporters/usdz/USDZExporter.ts +0 -21
  103. package/src/exporters/usdz/__test__/USDZExporter.test.ts +0 -57
  104. package/src/gizmo/Gizmo.ts +0 -144
  105. package/src/gizmo/handles/AxisHandle.ts +0 -153
  106. package/src/gizmo/handles/RadialHandle.ts +0 -149
  107. package/src/gizmo/handles/ScaleHandle.ts +0 -195
  108. package/src/gizmo/plane/GizmoPlane.ts +0 -84
  109. package/src/gizmo/rotate/RotateGizmo.ts +0 -143
  110. package/src/gizmo/scale/ScaleGizmo.ts +0 -125
  111. package/src/gizmo/translate/TranslateGizmo.ts +0 -114
  112. package/src/grid/Grid.ts +0 -34
  113. package/src/grid/__test__/Grid.test.ts +0 -28
  114. package/src/group/Group.ts +0 -184
  115. package/src/group/__test__/Group.test.ts +0 -212
  116. package/src/helper/applyMixins/__test__/applyMixins.test.ts +0 -30
  117. package/src/helper/applyMixins/applyMixins.ts +0 -18
  118. package/src/helper/findInterface/__test__/findInterface.test.ts +0 -63
  119. package/src/helper/findInterface/findInterface.ts +0 -13
  120. package/src/helper/findSceneRecursive/__test__/findSceneRecursive.test.ts +0 -40
  121. package/src/helper/findSceneRecursive/findSceneRecursive.ts +0 -16
  122. package/src/helper/getObjectDelta/__test__/getObjectDelta.test.ts +0 -186
  123. package/src/helper/getObjectDelta/getObjectDelta.ts +0 -105
  124. package/src/helper/isInterface/__test__/implementsInterface.test.ts +0 -19
  125. package/src/helper/isInterface/implementsInterface.ts +0 -9
  126. package/src/info/Info.ts +0 -154
  127. package/src/info/__test__/Info.test.ts +0 -338
  128. package/src/interface/Draggable.ts +0 -14
  129. package/src/interface/Hoverable.ts +0 -14
  130. package/src/interface/Movable.ts +0 -12
  131. package/src/interface/Rotatable.ts +0 -10
  132. package/src/interface/Scalable.ts +0 -10
  133. package/src/interface/Selectable.ts +0 -11
  134. package/src/io/IO.ts +0 -62
  135. package/src/io/__test__/IO.test.ts +0 -116
  136. package/src/io/gltf/GLTFIO.ts +0 -56
  137. package/src/io/gltf/__test__/GLTFIO.test.ts +0 -108
  138. package/src/light/AmbientLight.ts +0 -39
  139. package/src/light/PointLight.ts +0 -115
  140. package/src/light/SceneLight.ts +0 -63
  141. package/src/light/__test__/AmbientLight.test.ts +0 -29
  142. package/src/light/__test__/PointLight.test.ts +0 -74
  143. package/src/light/__test__/SceneLight.test.ts +0 -47
  144. package/src/loadingmanager/LoadingManager.ts +0 -50
  145. package/src/loadingmanager/__test__/LoadingManager.test.ts +0 -27
  146. package/src/math/__test__/DIVEMath.test.ts +0 -12
  147. package/src/math/ceil/__test__/ceilExp.test.ts +0 -12
  148. package/src/math/ceil/ceilExp.ts +0 -6
  149. package/src/math/degToRad/__test__/degToRad.test.ts +0 -172
  150. package/src/math/degToRad/degToRad.ts +0 -5
  151. package/src/math/floor/__test__/floorExp.test.ts +0 -14
  152. package/src/math/floor/floorExp.ts +0 -6
  153. package/src/math/helper/__test__/shift.test.ts +0 -12
  154. package/src/math/helper/shift.ts +0 -4
  155. package/src/math/index.ts +0 -28
  156. package/src/math/radToDeg/__test__/radToDeg.test.ts +0 -155
  157. package/src/math/radToDeg/radToDeg.ts +0 -5
  158. package/src/math/round/__test__/roundExp.test.ts +0 -14
  159. package/src/math/round/roundExp.ts +0 -10
  160. package/src/math/signedAngleTo/__test__/signedAngleTo.test.ts +0 -20
  161. package/src/math/signedAngleTo/signedAngleTo.ts +0 -20
  162. package/src/math/toFixed/__test__/toFixedExp.test.ts +0 -14
  163. package/src/math/toFixed/toFixedExp.ts +0 -9
  164. package/src/math/truncate/__test__/truncateExp.test.ts +0 -14
  165. package/src/math/truncate/truncateExp.ts +0 -9
  166. package/src/mediacreator/MediaCreator.ts +0 -75
  167. package/src/mediacreator/__test__/MediaCreator.test.ts +0 -155
  168. package/src/model/Model.ts +0 -185
  169. package/src/model/__test__/Model.test.ts +0 -222
  170. package/src/module/Module.ts +0 -45
  171. package/src/module/__test__/Module.test.ts +0 -54
  172. package/src/node/Node.ts +0 -98
  173. package/src/node/__test__/Node.test.ts +0 -120
  174. package/src/primitive/Primitive.ts +0 -299
  175. package/src/primitive/__test__/Primitive.test.ts +0 -281
  176. package/src/primitive/floor/Floor.ts +0 -45
  177. package/src/primitive/floor/__test__/Floor.test.ts +0 -24
  178. package/src/renderer/Renderer.ts +0 -215
  179. package/src/renderer/__test__/Renderer.test.ts +0 -228
  180. package/src/scene/Scene.ts +0 -106
  181. package/src/scene/__test__/Scene.test.ts +0 -124
  182. package/src/scene/root/Root.ts +0 -426
  183. package/src/scene/root/__test__/Root.test.ts +0 -903
  184. package/src/scene/xrroot/XRRoot.ts +0 -56
  185. package/src/scene/xrroot/xrlightroot/XRLightRoot.ts +0 -80
  186. package/src/toolbox/BaseTool.ts +0 -319
  187. package/src/toolbox/Toolbox.ts +0 -129
  188. package/src/toolbox/__test__/BaseTool.test.ts +0 -627
  189. package/src/toolbox/__test__/Toolbox.test.ts +0 -143
  190. package/src/toolbox/select/SelectTool.ts +0 -92
  191. package/src/toolbox/select/__test__/SelectTool.test.ts +0 -237
  192. package/src/toolbox/transform/TransformTool.ts +0 -166
  193. package/src/toolbox/transform/__test__/TransformTool.test.ts +0 -147
  194. package/src/types/SceneData.ts +0 -26
  195. package/src/types/SceneObjects.ts +0 -14
  196. package/src/types/SceneType.ts +0 -14
  197. package/src/types/index.ts +0 -5
@@ -1,131 +0,0 @@
1
- import { Matrix4, Mesh, Vector3 } from 'three';
2
- import { DIVERenderer } from '../../../renderer/Renderer';
3
- import { DIVEWebXRRaycasterAR } from './ar/WebXRRaycasterAR';
4
- import { DIVEWebXRRaycasterTHREE } from './three/WebXRRaycasterTHREE';
5
- import { DIVEScene } from '../../../scene/Scene';
6
- import { DIVEEventExecutor } from '../../../events/EventExecutor';
7
-
8
- /**
9
- * object is undefined when AR world is hit.
10
- */
11
- export type DIVEHitResult = {
12
- point: Vector3;
13
- matrix: Matrix4;
14
- object?: Mesh;
15
- };
16
-
17
- export type DIVEWebXRRaycasterEvents = {
18
- AR_HIT_FOUND: {
19
- hit: DIVEHitResult;
20
- };
21
- AR_HIT_LOST: undefined;
22
- SCENE_HIT_FOUND: {
23
- hit: DIVEHitResult;
24
- };
25
- SCENE_HIT_LOST: undefined;
26
- };
27
-
28
- export class DIVEWebXRRaycaster extends DIVEEventExecutor<DIVEWebXRRaycasterEvents> {
29
- private _session: XRSession;
30
-
31
- private _initialized: boolean = false;
32
-
33
- private _threeRaycaster: DIVEWebXRRaycasterTHREE;
34
- private _arRaycaster: DIVEWebXRRaycasterAR;
35
-
36
- private _arHitResultBuffer: DIVEHitResult[] = [];
37
- private _sceneHitResultBuffer: DIVEHitResult[] = [];
38
-
39
- // buffers
40
- private _hasHit: boolean = false;
41
-
42
- constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {
43
- super();
44
-
45
- this._session = session;
46
-
47
- this._threeRaycaster = new DIVEWebXRRaycasterTHREE(renderer, scene);
48
- this._arRaycaster = new DIVEWebXRRaycasterAR(session, renderer);
49
- }
50
-
51
- public Dispose(): void {
52
- // dispose code here
53
- this._initialized = false;
54
- }
55
-
56
- public async Init(): Promise<this> {
57
- if (!this._session) {
58
- console.error(
59
- 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',
60
- );
61
- return Promise.reject();
62
- }
63
-
64
- if (this._initialized) {
65
- console.error(
66
- 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',
67
- );
68
- return Promise.reject();
69
- }
70
-
71
- await this._threeRaycaster.Init();
72
- await this._arRaycaster.Init();
73
-
74
- console.log('DIVEWebXRRaycaster: Initialized');
75
-
76
- this._initialized = true;
77
-
78
- return Promise.resolve(this);
79
- }
80
-
81
- public GetARIntersections(frame: XRFrame): DIVEHitResult[] {
82
- // check for ar hits
83
- this._arHitResultBuffer = this._arRaycaster.GetIntersections(frame);
84
- if (this._arHitResultBuffer.length > 0) {
85
- // hit found
86
- this.onARHitFound(this._arHitResultBuffer[0]);
87
- } else {
88
- // hit nothing
89
- this.onARHitLost();
90
- }
91
- return this._arHitResultBuffer;
92
- }
93
-
94
- public GetSceneIntersections(): DIVEHitResult[] {
95
- // check for scene hits
96
- this._sceneHitResultBuffer = this._threeRaycaster.GetIntersections();
97
- if (this._sceneHitResultBuffer.length > 0) {
98
- // scene hit found
99
- this.onSceneHitFound(this._sceneHitResultBuffer[0]);
100
- // early return to prevent ar raycaster from overriding scene hit
101
- } else {
102
- // scene hit nothing
103
- this.onSceneHitLost();
104
- }
105
- return this._sceneHitResultBuffer;
106
- }
107
-
108
- private onARHitFound(hit: DIVEHitResult): void {
109
- this._hasHit = true;
110
- this.dispatch('AR_HIT_FOUND', { hit });
111
- }
112
-
113
- private onARHitLost(): void {
114
- if (!this._hasHit) return;
115
-
116
- this._hasHit = false;
117
- this.dispatch('AR_HIT_LOST');
118
- }
119
-
120
- private onSceneHitFound(hit: DIVEHitResult): void {
121
- this._hasHit = true;
122
- this.dispatch('SCENE_HIT_FOUND', { hit });
123
- }
124
-
125
- private onSceneHitLost(): void {
126
- if (!this._hasHit) return;
127
-
128
- this._hasHit = false;
129
- this.dispatch('SCENE_HIT_LOST');
130
- }
131
- }
@@ -1,102 +0,0 @@
1
- import { Matrix4, Vector3 } from 'three';
2
- import { type DIVERenderer } from '../../../../renderer/Renderer';
3
- import { type DIVEHitResult } from '../WebXRRaycaster';
4
-
5
- export class DIVEWebXRRaycasterAR {
6
- private _session: XRSession;
7
- private _renderer: DIVERenderer;
8
-
9
- private _transientHitTestSource: XRTransientInputHitTestSource | undefined;
10
- private _referenceSpaceBuffer: XRReferenceSpace | null = null;
11
-
12
- private _requesting: boolean = false;
13
- private _initialized: boolean = false;
14
-
15
- private _hitMatrixBuffer: Matrix4;
16
-
17
- constructor(session: XRSession, renderer: DIVERenderer) {
18
- this._session = session;
19
- this._renderer = renderer;
20
-
21
- this._hitMatrixBuffer = new Matrix4();
22
- }
23
-
24
- public Dispose(): void {
25
- this._transientHitTestSource?.cancel();
26
- this._transientHitTestSource = undefined;
27
-
28
- this._initialized = false;
29
- }
30
-
31
- public async Init(): Promise<this> {
32
- if (!this._session) {
33
- console.error(
34
- 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',
35
- );
36
- return Promise.reject();
37
- }
38
-
39
- if (this._requesting) {
40
- console.error(
41
- 'DIVEWebXRRaycaster: Currently initializing! Aborting initialization...',
42
- );
43
- return Promise.reject();
44
- }
45
-
46
- if (this._initialized) {
47
- console.error(
48
- 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',
49
- );
50
- return Promise.reject();
51
- }
52
-
53
- this._requesting = true;
54
- this._transientHitTestSource = await this._session
55
- .requestHitTestSourceForTransientInput!({
56
- profile: 'generic-touchscreen',
57
- });
58
- this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();
59
- this._requesting = false;
60
-
61
- if (!this._transientHitTestSource) {
62
- return Promise.reject();
63
- }
64
-
65
- this._initialized = true;
66
-
67
- console.log('DIVEWebXRRaycasterAR: Initialized');
68
-
69
- return Promise.resolve(this);
70
- }
71
-
72
- public GetIntersections(frame: XRFrame): DIVEHitResult[] {
73
- if (!this._transientHitTestSource) return [];
74
-
75
- const touches = frame.getHitTestResultsForTransientInput(
76
- this._transientHitTestSource,
77
- );
78
- if (touches.length === 0) return [];
79
-
80
- const hits = touches.map((touch: XRTransientInputHitTestResult) => {
81
- if (!this._referenceSpaceBuffer) return undefined;
82
- if (!touch.results[0]) return undefined;
83
- if (!touch.results[0].getPose) return undefined;
84
-
85
- const pose = touch.results[0].getPose(this._referenceSpaceBuffer);
86
- if (!pose) return undefined;
87
-
88
- this._hitMatrixBuffer.fromArray(pose.transform.matrix);
89
- const position = new Vector3().setFromMatrixPosition(
90
- this._hitMatrixBuffer,
91
- );
92
-
93
- return {
94
- point: position,
95
- matrix: this._hitMatrixBuffer,
96
- object: undefined,
97
- };
98
- });
99
-
100
- return hits.filter((hit) => hit !== undefined) as DIVEHitResult[];
101
- }
102
- }
@@ -1,49 +0,0 @@
1
- import {
2
- type Intersection,
3
- type Mesh,
4
- Raycaster,
5
- type XRTargetRaySpace,
6
- } from 'three';
7
- import { type DIVERenderer } from '../../../../renderer/Renderer';
8
- import { type DIVEScene } from '../../../../scene/Scene';
9
- import { type DIVEHitResult } from '../WebXRRaycaster';
10
-
11
- export class DIVEWebXRRaycasterTHREE {
12
- private _renderer: DIVERenderer;
13
- private _scene: DIVEScene;
14
-
15
- private _controller: XRTargetRaySpace;
16
-
17
- // internal raycaster
18
- private _raycaster: Raycaster = new Raycaster();
19
-
20
- constructor(renderer: DIVERenderer, scene: DIVEScene) {
21
- this._renderer = renderer;
22
- this._scene = scene;
23
-
24
- this._controller = this._renderer.xr.getController(0);
25
- }
26
-
27
- public async Init(): Promise<this> {
28
- console.log('DIVEWebXRRaycasterTHREE: Initialized');
29
- return Promise.resolve(this);
30
- }
31
-
32
- public GetIntersections(): DIVEHitResult[] {
33
- this._controller.updateMatrixWorld();
34
- this._raycaster.setFromXRController(this._controller);
35
- const intersections = this._raycaster.intersectObjects(
36
- this._scene.XRRoot.XRModelRoot.children,
37
- );
38
-
39
- if (intersections.length === 0) return [];
40
-
41
- return intersections.map((intersection: Intersection) => {
42
- return {
43
- point: intersection.point,
44
- matrix: intersection.object.matrixWorld,
45
- object: intersection.object as Mesh,
46
- };
47
- });
48
- }
49
- }
@@ -1,356 +0,0 @@
1
- import { Vector2 } from 'three';
2
- import { DIVEEventExecutor } from '../../../events/EventExecutor';
3
-
4
- export type DIVETouchscreenEvents = {
5
- TOUCH_START: {
6
- touches: {
7
- current: Vector2;
8
- }[];
9
- touchCount: number;
10
- };
11
- TOUCH_MOVE: {
12
- touches: {
13
- current: Vector2;
14
- delta: Vector2;
15
- }[];
16
- touchCount: number;
17
- };
18
- TOUCH_END: {
19
- touches: {
20
- current: Vector2;
21
- }[];
22
- touchCount: number;
23
- };
24
- ROTATE_START: {
25
- current: number;
26
- };
27
- ROTATE_MOVE: {
28
- current: number;
29
- delta: number;
30
- };
31
- ROTATE_END: {
32
- current: number;
33
- };
34
- PINCH_START: {
35
- current: number;
36
- };
37
- PINCH_MOVE: {
38
- current: number;
39
- delta: number;
40
- };
41
- PINCH_END: {
42
- current: number;
43
- };
44
- };
45
-
46
- type DIVETouch = {
47
- start: Vector2;
48
- current: Vector2;
49
- delta: Vector2;
50
- };
51
-
52
- export class DIVEWebXRTouchscreenControls extends DIVEEventExecutor<DIVETouchscreenEvents> {
53
- // general members
54
- private _session: XRSession;
55
-
56
- // touch members
57
- private _touchCount: number = 0;
58
- private _touches: DIVETouch[] = [];
59
-
60
- // rotate members
61
- private _handleRotateStarted: boolean = false;
62
- private _handleRotateMoved: boolean = false;
63
- private _handleRotateEnded: boolean = false;
64
-
65
- private _startAngle: number = 0;
66
- private _lastAngle: number = 0;
67
- private _angleDelta: number = 0;
68
-
69
- // scale members
70
- private _handlePinchStarted: boolean = false;
71
- private _handlePinchMoved: boolean = false;
72
- private _handlePinchEnded: boolean = false;
73
-
74
- private _scaleDistanceStart: number = 0;
75
- private _currentDistance: number = 1;
76
- private _deltaDistance: number = 0;
77
-
78
- constructor(session: XRSession) {
79
- super();
80
-
81
- this._session = session;
82
-
83
- this._touches = [
84
- {
85
- start: new Vector2(),
86
- current: new Vector2(),
87
- delta: new Vector2(),
88
- },
89
- {
90
- start: new Vector2(),
91
- current: new Vector2(),
92
- delta: new Vector2(),
93
- },
94
- ];
95
-
96
- this._handleRotateStarted = false;
97
-
98
- window.addEventListener('touchstart', (e: TouchEvent) =>
99
- this.onTouchStart(e),
100
- );
101
- window.addEventListener('touchmove', (e: TouchEvent) =>
102
- this.onTouchMove(e),
103
- );
104
- window.addEventListener('touchend', (e: TouchEvent) =>
105
- this.onTouchEnd(e),
106
- );
107
-
108
- this._session.addEventListener('selectstart', () =>
109
- this.onSessionSelectStart(),
110
- );
111
- this._session.addEventListener('selectend', () =>
112
- this.onSessionSelectEnd(),
113
- );
114
- }
115
-
116
- public Dispose(): void {
117
- window.removeEventListener('touchstart', (e: TouchEvent) =>
118
- this.onTouchStart(e),
119
- );
120
- window.removeEventListener('touchmove', (e: TouchEvent) =>
121
- this.onTouchMove(e),
122
- );
123
- window.removeEventListener('touchend', (e: TouchEvent) =>
124
- this.onTouchEnd(e),
125
- );
126
-
127
- this._session.removeEventListener('selectstart', () =>
128
- this.onSessionSelectStart(),
129
- );
130
- this._session.removeEventListener('selectend', () =>
131
- this.onSessionSelectEnd(),
132
- );
133
- }
134
-
135
- private onTouchStart(event: TouchEvent): void {
136
- this._touchCount = event.touches.length;
137
-
138
- this._touches[0].start.set(
139
- event.touches[0].clientX,
140
- event.touches[0].clientY,
141
- );
142
- this._touches[0].current.set(
143
- event.touches[0].clientX,
144
- event.touches[0].clientY,
145
- );
146
- this._touches[0].delta.set(0, 0);
147
-
148
- if (this._touchCount > 1) {
149
- this._touches[1].start.set(
150
- event.touches[1].clientX,
151
- event.touches[1].clientY,
152
- );
153
- this._touches[1].current.set(
154
- event.touches[1].clientX,
155
- event.touches[1].clientY,
156
- );
157
- this._touches[1].delta.set(0, 0);
158
- }
159
-
160
- if (this._touchCount === 2) {
161
- this.handleRotateStart();
162
- this.handlePinchStart();
163
- }
164
-
165
- if (this._handleRotateStarted) {
166
- this.dispatch('ROTATE_START', {
167
- current: 0,
168
- });
169
- this._handleRotateStarted = false;
170
- }
171
-
172
- if (this._handlePinchStarted) {
173
- this.dispatch('PINCH_START', {
174
- current: 0,
175
- });
176
- this._handlePinchStarted = false;
177
- }
178
- }
179
-
180
- private onTouchMove(event: TouchEvent): void {
181
- this._touchCount = event.touches.length;
182
-
183
- this._touches[0].start.set(
184
- event.touches[0].clientX,
185
- event.touches[0].clientY,
186
- );
187
- this._touches[0].current.set(
188
- event.touches[0].clientX,
189
- event.touches[0].clientY,
190
- );
191
- this._touches[0].delta.copy(
192
- this._touches[0].current.clone().sub(this._touches[0].start),
193
- );
194
-
195
- if (this._touchCount > 1) {
196
- this._touches[1].start.set(
197
- event.touches[1].clientX,
198
- event.touches[1].clientY,
199
- );
200
- this._touches[1].current.set(
201
- event.touches[1].clientX,
202
- event.touches[1].clientY,
203
- );
204
- this._touches[1].delta.copy(
205
- this._touches[1].current.clone().sub(this._touches[1].start),
206
- );
207
- }
208
-
209
- if (this._touchCount === 2) {
210
- this.handleRotateMoved();
211
- this.handlePinchMoved();
212
- }
213
-
214
- if (this._touchCount === 1) {
215
- this.dispatch('TOUCH_MOVE', {
216
- touches: [
217
- {
218
- current: this._touches[0].current.clone(),
219
- delta: this._touches[0].delta.clone(),
220
- },
221
- {
222
- current: this._touches[1].current.clone(),
223
- delta: this._touches[1].delta.clone(),
224
- },
225
- ],
226
- touchCount: this._touchCount,
227
- });
228
- }
229
-
230
- if (this._touchCount === 2) {
231
- if (this._handleRotateMoved) {
232
- this.dispatch('ROTATE_MOVE', {
233
- current: this._lastAngle,
234
- delta: this._angleDelta,
235
- });
236
- this._handleRotateMoved = false;
237
- }
238
-
239
- if (this._handlePinchMoved) {
240
- this.dispatch('PINCH_MOVE', {
241
- current: this._currentDistance,
242
- delta: this._deltaDistance,
243
- });
244
- this._handlePinchMoved = false;
245
- }
246
- }
247
- }
248
-
249
- private onTouchEnd(event: TouchEvent): void {
250
- this._touchCount = event.touches.length;
251
-
252
- if (this._touchCount === 0) {
253
- this._touches[0].start.set(0, 0);
254
- this._touches[0].current.set(0, 0);
255
- this._touches[0].delta.set(0, 0);
256
- }
257
-
258
- if (this._touchCount === 1) {
259
- this.handleRotateEnded();
260
- this.handlePinchEnded();
261
-
262
- this._touches[1].start.set(0, 0);
263
- this._touches[1].current.set(0, 0);
264
- this._touches[1].delta.set(0, 0);
265
- }
266
-
267
- if (this._handleRotateEnded) {
268
- this.dispatch('ROTATE_END', {
269
- current: this._lastAngle,
270
- });
271
- this._handleRotateEnded = false;
272
- }
273
-
274
- if (this._handlePinchEnded) {
275
- this.dispatch('PINCH_END', {
276
- current: this._currentDistance,
277
- });
278
- this._handlePinchEnded = false;
279
- }
280
- }
281
-
282
- private onSessionSelectStart(): void {
283
- this.dispatch('TOUCH_START', {
284
- touches: [
285
- {
286
- current: this._touches[0].current.clone(),
287
- },
288
- {
289
- current: this._touches[1].current.clone(),
290
- },
291
- ],
292
- touchCount: this._touchCount,
293
- });
294
- }
295
-
296
- private onSessionSelectEnd(): void {
297
- this.dispatch('TOUCH_END', {
298
- touches: [
299
- {
300
- current: this._touches[0].current.clone(),
301
- },
302
- {
303
- current: this._touches[1].current.clone(),
304
- },
305
- ],
306
- touchCount: this._touchCount,
307
- });
308
- }
309
-
310
- // rotation handler
311
- private handleRotateStart(): void {
312
- this._handleRotateStarted = true;
313
- this._startAngle = this._touches[1].start
314
- .clone()
315
- .sub(this._touches[0].current)
316
- .angle();
317
- }
318
-
319
- private handleRotateMoved(): void {
320
- this._handleRotateMoved = true;
321
- const currentAngle = this._touches[1].current
322
- .clone()
323
- .sub(this._touches[0].current)
324
- .angle();
325
- this._angleDelta = currentAngle - this._startAngle;
326
- this._lastAngle = this._angleDelta * -1;
327
- }
328
-
329
- private handleRotateEnded(): void {
330
- this._handleRotateEnded = true;
331
- }
332
-
333
- // pinch handler
334
- private handlePinchStart(): void {
335
- this._handlePinchStarted = true;
336
-
337
- this._scaleDistanceStart = this._touches[1].start.distanceTo(
338
- this._touches[0].current,
339
- );
340
- }
341
-
342
- private handlePinchMoved(): void {
343
- this._handlePinchMoved = true;
344
-
345
- const beforeDistance = this._currentDistance;
346
- const distance = this._touches[1].current.distanceTo(
347
- this._touches[0].current,
348
- );
349
- this._currentDistance = distance / this._scaleDistanceStart;
350
- this._deltaDistance = this._currentDistance - beforeDistance;
351
- }
352
-
353
- private handlePinchEnded(): void {
354
- this._handlePinchEnded = true;
355
- }
356
- }