spoint 0.1.0 → 0.1.10

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 (204) hide show
  1. package/README.md +134 -209
  2. package/SKILL.md +95 -0
  3. package/apps/environment/index.js +200 -1
  4. package/apps/environment/models/decorative/.gitkeep +0 -0
  5. package/apps/environment/models/hazards/.gitkeep +0 -0
  6. package/apps/environment/models/interactive/.gitkeep +0 -0
  7. package/apps/environment/models/structures/.gitkeep +0 -0
  8. package/apps/environment/smartObjects.js +114 -0
  9. package/apps/interactable/index.js +155 -0
  10. package/apps/physics-crate/index.js +15 -9
  11. package/apps/power-crate/index.js +18 -12
  12. package/apps/tps-game/$GDUPI.vrm +0 -0
  13. package/apps/tps-game/Cleetus.vrm +0 -0
  14. package/apps/tps-game/index.js +185 -27
  15. package/apps/world/index.js +68 -22
  16. package/bin/create-app.js +337 -0
  17. package/client/ARControls.js +301 -0
  18. package/client/LoadingManager.js +117 -0
  19. package/client/MobileControls.js +1122 -0
  20. package/client/anim-lib.glb +0 -0
  21. package/client/animation.js +306 -0
  22. package/client/app.js +1341 -65
  23. package/client/camera.js +191 -33
  24. package/client/createLoadingScreen.js +69 -0
  25. package/client/editor/bridge.js +113 -0
  26. package/client/editor/css/main.css +794 -0
  27. package/client/editor/images/rotate.svg +4 -0
  28. package/client/editor/images/scale.svg +4 -0
  29. package/client/editor/images/translate.svg +4 -0
  30. package/client/editor/index.html +103 -0
  31. package/client/editor/js/Command.js +41 -0
  32. package/client/editor/js/Config.js +81 -0
  33. package/client/editor/js/Editor.js +785 -0
  34. package/client/editor/js/EditorControls.js +438 -0
  35. package/client/editor/js/History.js +321 -0
  36. package/client/editor/js/Loader.js +987 -0
  37. package/client/editor/js/LoaderUtils.js +90 -0
  38. package/client/editor/js/Menubar.Add.js +510 -0
  39. package/client/editor/js/Menubar.Edit.js +145 -0
  40. package/client/editor/js/Menubar.File.js +466 -0
  41. package/client/editor/js/Menubar.Help.js +73 -0
  42. package/client/editor/js/Menubar.Status.js +51 -0
  43. package/client/editor/js/Menubar.View.js +183 -0
  44. package/client/editor/js/Menubar.js +27 -0
  45. package/client/editor/js/Player.js +53 -0
  46. package/client/editor/js/Resizer.js +58 -0
  47. package/client/editor/js/Script.js +503 -0
  48. package/client/editor/js/Selector.js +102 -0
  49. package/client/editor/js/Sidebar.Geometry.BoxGeometry.js +121 -0
  50. package/client/editor/js/Sidebar.Geometry.BufferGeometry.js +115 -0
  51. package/client/editor/js/Sidebar.Geometry.CapsuleGeometry.js +97 -0
  52. package/client/editor/js/Sidebar.Geometry.CircleGeometry.js +97 -0
  53. package/client/editor/js/Sidebar.Geometry.CylinderGeometry.js +121 -0
  54. package/client/editor/js/Sidebar.Geometry.DodecahedronGeometry.js +73 -0
  55. package/client/editor/js/Sidebar.Geometry.ExtrudeGeometry.js +196 -0
  56. package/client/editor/js/Sidebar.Geometry.IcosahedronGeometry.js +73 -0
  57. package/client/editor/js/Sidebar.Geometry.LatheGeometry.js +98 -0
  58. package/client/editor/js/Sidebar.Geometry.Modifiers.js +73 -0
  59. package/client/editor/js/Sidebar.Geometry.OctahedronGeometry.js +74 -0
  60. package/client/editor/js/Sidebar.Geometry.PlaneGeometry.js +97 -0
  61. package/client/editor/js/Sidebar.Geometry.RingGeometry.js +121 -0
  62. package/client/editor/js/Sidebar.Geometry.ShapeGeometry.js +76 -0
  63. package/client/editor/js/Sidebar.Geometry.SphereGeometry.js +133 -0
  64. package/client/editor/js/Sidebar.Geometry.TetrahedronGeometry.js +74 -0
  65. package/client/editor/js/Sidebar.Geometry.TorusGeometry.js +109 -0
  66. package/client/editor/js/Sidebar.Geometry.TorusKnotGeometry.js +121 -0
  67. package/client/editor/js/Sidebar.Geometry.TubeGeometry.js +135 -0
  68. package/client/editor/js/Sidebar.Geometry.js +332 -0
  69. package/client/editor/js/Sidebar.Material.BooleanProperty.js +60 -0
  70. package/client/editor/js/Sidebar.Material.ColorProperty.js +87 -0
  71. package/client/editor/js/Sidebar.Material.ConstantProperty.js +62 -0
  72. package/client/editor/js/Sidebar.Material.MapProperty.js +249 -0
  73. package/client/editor/js/Sidebar.Material.NumberProperty.js +60 -0
  74. package/client/editor/js/Sidebar.Material.Program.js +73 -0
  75. package/client/editor/js/Sidebar.Material.RangeValueProperty.js +63 -0
  76. package/client/editor/js/Sidebar.Material.js +751 -0
  77. package/client/editor/js/Sidebar.Object.Animation.js +102 -0
  78. package/client/editor/js/Sidebar.Object.js +898 -0
  79. package/client/editor/js/Sidebar.Project.App.js +165 -0
  80. package/client/editor/js/Sidebar.Project.Image.js +225 -0
  81. package/client/editor/js/Sidebar.Project.Materials.js +82 -0
  82. package/client/editor/js/Sidebar.Project.Renderer.js +144 -0
  83. package/client/editor/js/Sidebar.Project.Video.js +242 -0
  84. package/client/editor/js/Sidebar.Project.js +31 -0
  85. package/client/editor/js/Sidebar.Properties.js +73 -0
  86. package/client/editor/js/Sidebar.Scene.js +585 -0
  87. package/client/editor/js/Sidebar.Script.js +129 -0
  88. package/client/editor/js/Sidebar.Settings.History.js +146 -0
  89. package/client/editor/js/Sidebar.Settings.Shortcuts.js +175 -0
  90. package/client/editor/js/Sidebar.Settings.js +60 -0
  91. package/client/editor/js/Sidebar.js +41 -0
  92. package/client/editor/js/Storage.js +98 -0
  93. package/client/editor/js/Strings.js +2028 -0
  94. package/client/editor/js/Toolbar.js +84 -0
  95. package/client/editor/js/Viewport.Controls.js +92 -0
  96. package/client/editor/js/Viewport.Info.js +136 -0
  97. package/client/editor/js/Viewport.Pathtracer.js +91 -0
  98. package/client/editor/js/Viewport.ViewHelper.js +39 -0
  99. package/client/editor/js/Viewport.XR.js +222 -0
  100. package/client/editor/js/Viewport.js +900 -0
  101. package/client/editor/js/commands/AddObjectCommand.js +68 -0
  102. package/client/editor/js/commands/AddScriptCommand.js +75 -0
  103. package/client/editor/js/commands/Commands.js +23 -0
  104. package/client/editor/js/commands/MoveObjectCommand.js +111 -0
  105. package/client/editor/js/commands/MultiCmdsCommand.js +85 -0
  106. package/client/editor/js/commands/RemoveObjectCommand.js +88 -0
  107. package/client/editor/js/commands/RemoveScriptCommand.js +81 -0
  108. package/client/editor/js/commands/SetColorCommand.js +73 -0
  109. package/client/editor/js/commands/SetGeometryCommand.js +87 -0
  110. package/client/editor/js/commands/SetGeometryValueCommand.js +70 -0
  111. package/client/editor/js/commands/SetMaterialColorCommand.js +86 -0
  112. package/client/editor/js/commands/SetMaterialCommand.js +79 -0
  113. package/client/editor/js/commands/SetMaterialMapCommand.js +143 -0
  114. package/client/editor/js/commands/SetMaterialRangeCommand.js +91 -0
  115. package/client/editor/js/commands/SetMaterialValueCommand.js +90 -0
  116. package/client/editor/js/commands/SetMaterialVectorCommand.js +79 -0
  117. package/client/editor/js/commands/SetPositionCommand.js +84 -0
  118. package/client/editor/js/commands/SetRotationCommand.js +84 -0
  119. package/client/editor/js/commands/SetScaleCommand.js +84 -0
  120. package/client/editor/js/commands/SetSceneCommand.js +103 -0
  121. package/client/editor/js/commands/SetScriptValueCommand.js +80 -0
  122. package/client/editor/js/commands/SetShadowValueCommand.js +73 -0
  123. package/client/editor/js/commands/SetUuidCommand.js +70 -0
  124. package/client/editor/js/commands/SetValueCommand.js +75 -0
  125. package/client/editor/js/libs/acorn/acorn.js +3236 -0
  126. package/client/editor/js/libs/acorn/acorn_loose.js +1299 -0
  127. package/client/editor/js/libs/acorn/walk.js +344 -0
  128. package/client/editor/js/libs/app/index.html +57 -0
  129. package/client/editor/js/libs/app.js +251 -0
  130. package/client/editor/js/libs/codemirror/addon/dialog.css +32 -0
  131. package/client/editor/js/libs/codemirror/addon/dialog.js +163 -0
  132. package/client/editor/js/libs/codemirror/addon/show-hint.css +36 -0
  133. package/client/editor/js/libs/codemirror/addon/show-hint.js +529 -0
  134. package/client/editor/js/libs/codemirror/addon/tern.css +87 -0
  135. package/client/editor/js/libs/codemirror/addon/tern.js +750 -0
  136. package/client/editor/js/libs/codemirror/codemirror.css +344 -0
  137. package/client/editor/js/libs/codemirror/codemirror.js +9849 -0
  138. package/client/editor/js/libs/codemirror/mode/glsl.js +233 -0
  139. package/client/editor/js/libs/codemirror/mode/javascript.js +959 -0
  140. package/client/editor/js/libs/codemirror/theme/monokai.css +41 -0
  141. package/client/editor/js/libs/esprima.js +6401 -0
  142. package/client/editor/js/libs/jsonlint.js +453 -0
  143. package/client/editor/js/libs/signals.min.js +14 -0
  144. package/client/editor/js/libs/tern-threejs/threejs.js +5031 -0
  145. package/client/editor/js/libs/ternjs/comment.js +87 -0
  146. package/client/editor/js/libs/ternjs/def.js +588 -0
  147. package/client/editor/js/libs/ternjs/doc_comment.js +401 -0
  148. package/client/editor/js/libs/ternjs/infer.js +1635 -0
  149. package/client/editor/js/libs/ternjs/polyfill.js +80 -0
  150. package/client/editor/js/libs/ternjs/signal.js +26 -0
  151. package/client/editor/js/libs/ternjs/tern.js +993 -0
  152. package/client/editor/js/libs/ui.js +1346 -0
  153. package/client/editor/js/libs/ui.three.js +855 -0
  154. package/client/facial-animation.js +455 -0
  155. package/client/index.html +7 -4
  156. package/client/loading.css +147 -0
  157. package/client/loading.html +25 -0
  158. package/client/style.css +251 -0
  159. package/package.json +7 -3
  160. package/server.js +9 -1
  161. package/src/apps/AppContext.js +1 -1
  162. package/src/apps/AppLoader.js +50 -37
  163. package/src/apps/AppRuntime.js +32 -8
  164. package/src/client/InputHandler.js +233 -0
  165. package/src/client/JitterBuffer.js +207 -0
  166. package/src/client/KalmanFilter.js +125 -0
  167. package/src/client/MessageHandler.js +101 -0
  168. package/src/client/PhysicsNetworkClient.js +141 -68
  169. package/src/client/ReconnectManager.js +62 -0
  170. package/src/client/SmoothInterpolation.js +127 -0
  171. package/src/client/SnapshotProcessor.js +144 -0
  172. package/src/connection/ConnectionManager.js +21 -3
  173. package/src/connection/SessionStore.js +13 -3
  174. package/src/index.client.js +4 -6
  175. package/src/netcode/EventLog.js +29 -15
  176. package/src/netcode/LagCompensator.js +25 -26
  177. package/src/netcode/NetworkState.js +4 -1
  178. package/src/netcode/PhysicsIntegration.js +20 -6
  179. package/src/netcode/PlayerManager.js +10 -2
  180. package/src/netcode/SnapshotEncoder.js +66 -19
  181. package/src/netcode/TickSystem.js +13 -4
  182. package/src/physics/World.js +66 -13
  183. package/src/protocol/msgpack.js +90 -63
  184. package/src/sdk/ReloadHandlers.js +12 -2
  185. package/src/sdk/ReloadManager.js +5 -0
  186. package/src/sdk/ServerHandlers.js +50 -11
  187. package/src/sdk/StaticHandler.js +22 -6
  188. package/src/sdk/TickHandler.js +101 -34
  189. package/src/sdk/scaffold.js +28 -0
  190. package/src/sdk/server.js +59 -33
  191. package/src/shared/movement.js +2 -1
  192. package/src/spatial/Octree.js +5 -0
  193. package/apps/interactive-door/index.js +0 -33
  194. package/apps/patrol-npc/index.js +0 -37
  195. package/src/connection/QualityMonitor.js +0 -46
  196. package/src/debug/StateInspector.js +0 -42
  197. package/src/index.js +0 -1
  198. package/src/index.server.js +0 -27
  199. package/src/protocol/Codec.js +0 -60
  200. package/src/protocol/SequenceTracker.js +0 -71
  201. package/src/sdk/ClientMessageHandler.js +0 -80
  202. package/src/sdk/client.js +0 -122
  203. package/world/kaira.glb +0 -0
  204. package/world/schwust.glb +0 -0
@@ -0,0 +1,438 @@
1
+ import * as THREE from 'three';
2
+
3
+ class EditorControls extends THREE.EventDispatcher {
4
+
5
+ constructor( object, domElement ) {
6
+
7
+ super();
8
+
9
+ // API
10
+
11
+ this.enabled = true;
12
+ this.center = new THREE.Vector3();
13
+ this.panSpeed = 0.002;
14
+ this.zoomSpeed = 0.1;
15
+ this.rotationSpeed = 0.005;
16
+
17
+ // internals
18
+
19
+ var scope = this;
20
+ var vector = new THREE.Vector3();
21
+ var delta = new THREE.Vector3();
22
+ var box = new THREE.Box3();
23
+
24
+ var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2 };
25
+ var state = STATE.NONE;
26
+
27
+ var center = this.center;
28
+ var normalMatrix = new THREE.Matrix3();
29
+ var pointer = new THREE.Vector2();
30
+ var pointerOld = new THREE.Vector2();
31
+ var spherical = new THREE.Spherical();
32
+ var sphere = new THREE.Sphere();
33
+
34
+ var pointers = [];
35
+ var pointerPositions = {};
36
+
37
+ // events
38
+
39
+ var changeEvent = { type: 'change' };
40
+
41
+ this.focus = function ( target ) {
42
+
43
+ var distance;
44
+
45
+ box.setFromObject( target );
46
+
47
+ if ( box.isEmpty() === false ) {
48
+
49
+ box.getCenter( center );
50
+ distance = box.getBoundingSphere( sphere ).radius;
51
+
52
+ } else {
53
+
54
+ // Focusing on an Group, AmbientLight, etc
55
+
56
+ center.setFromMatrixPosition( target.matrixWorld );
57
+ distance = 0.1;
58
+
59
+ }
60
+
61
+ delta.set( 0, 0, 1 );
62
+ delta.applyQuaternion( object.quaternion );
63
+ delta.multiplyScalar( distance * 4 );
64
+
65
+ object.position.copy( center ).add( delta );
66
+
67
+ scope.dispatchEvent( changeEvent );
68
+
69
+ };
70
+
71
+ this.pan = function ( delta ) {
72
+
73
+ var distance = object.position.distanceTo( center );
74
+
75
+ delta.multiplyScalar( distance * scope.panSpeed );
76
+ delta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );
77
+
78
+ object.position.add( delta );
79
+ center.add( delta );
80
+
81
+ scope.dispatchEvent( changeEvent );
82
+
83
+ };
84
+
85
+ this.zoom = function ( delta ) {
86
+
87
+ var distance = object.position.distanceTo( center );
88
+
89
+ delta.multiplyScalar( distance * scope.zoomSpeed );
90
+
91
+ if ( delta.length() > distance ) return;
92
+
93
+ delta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );
94
+
95
+ object.position.add( delta );
96
+
97
+ scope.dispatchEvent( changeEvent );
98
+
99
+ };
100
+
101
+ this.rotate = function ( delta ) {
102
+
103
+ vector.copy( object.position ).sub( center );
104
+
105
+ spherical.setFromVector3( vector );
106
+
107
+ spherical.theta += delta.x * scope.rotationSpeed;
108
+ spherical.phi += delta.y * scope.rotationSpeed;
109
+
110
+ spherical.makeSafe();
111
+
112
+ vector.setFromSpherical( spherical );
113
+
114
+ object.position.copy( center ).add( vector );
115
+
116
+ object.lookAt( center );
117
+
118
+ scope.dispatchEvent( changeEvent );
119
+
120
+ };
121
+
122
+ //
123
+
124
+ function onPointerDown( event ) {
125
+
126
+ if ( scope.enabled === false ) return;
127
+
128
+ if ( pointers.length === 0 ) {
129
+
130
+ domElement.setPointerCapture( event.pointerId );
131
+
132
+ domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
133
+ domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
134
+
135
+ }
136
+
137
+ //
138
+
139
+ if ( isTrackingPointer( event ) ) return;
140
+
141
+ //
142
+
143
+ addPointer( event );
144
+
145
+ if ( event.pointerType === 'touch' ) {
146
+
147
+ onTouchStart( event );
148
+
149
+ } else {
150
+
151
+ onMouseDown( event );
152
+
153
+ }
154
+
155
+ }
156
+
157
+ function onPointerMove( event ) {
158
+
159
+ if ( scope.enabled === false ) return;
160
+
161
+ if ( event.pointerType === 'touch' ) {
162
+
163
+ onTouchMove( event );
164
+
165
+ } else {
166
+
167
+ onMouseMove( event );
168
+
169
+ }
170
+
171
+ }
172
+
173
+ function onPointerUp( event ) {
174
+
175
+ removePointer( event );
176
+
177
+ switch ( pointers.length ) {
178
+
179
+ case 0:
180
+
181
+ domElement.releasePointerCapture( event.pointerId );
182
+
183
+ domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
184
+ domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
185
+
186
+ break;
187
+
188
+ case 1:
189
+
190
+ var pointerId = pointers[ 0 ];
191
+ var position = pointerPositions[ pointerId ];
192
+
193
+ // minimal placeholder event - allows state correction on pointer-up
194
+ onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );
195
+
196
+ break;
197
+
198
+ }
199
+
200
+ }
201
+
202
+ // mouse
203
+
204
+ function onMouseDown( event ) {
205
+
206
+ if ( event.button === 0 ) {
207
+
208
+ state = STATE.ROTATE;
209
+
210
+ } else if ( event.button === 1 ) {
211
+
212
+ state = STATE.ZOOM;
213
+
214
+ } else if ( event.button === 2 ) {
215
+
216
+ state = STATE.PAN;
217
+
218
+ }
219
+
220
+ pointerOld.set( event.clientX, event.clientY );
221
+
222
+ }
223
+
224
+ function onMouseMove( event ) {
225
+
226
+ pointer.set( event.clientX, event.clientY );
227
+
228
+ var movementX = pointer.x - pointerOld.x;
229
+ var movementY = pointer.y - pointerOld.y;
230
+
231
+ if ( state === STATE.ROTATE ) {
232
+
233
+ scope.rotate( delta.set( - movementX, - movementY, 0 ) );
234
+
235
+ } else if ( state === STATE.ZOOM ) {
236
+
237
+ scope.zoom( delta.set( 0, 0, movementY ) );
238
+
239
+ } else if ( state === STATE.PAN ) {
240
+
241
+ scope.pan( delta.set( - movementX, movementY, 0 ) );
242
+
243
+ }
244
+
245
+ pointerOld.set( event.clientX, event.clientY );
246
+
247
+ }
248
+
249
+ function onMouseUp() {
250
+
251
+ state = STATE.NONE;
252
+
253
+ }
254
+
255
+ function onMouseWheel( event ) {
256
+
257
+ if ( scope.enabled === false ) return;
258
+
259
+ event.preventDefault();
260
+
261
+ // Normalize deltaY due to https://bugzilla.mozilla.org/show_bug.cgi?id=1392460
262
+ scope.zoom( delta.set( 0, 0, event.deltaY > 0 ? 1 : - 1 ) );
263
+
264
+ }
265
+
266
+ function contextmenu( event ) {
267
+
268
+ event.preventDefault();
269
+
270
+ }
271
+
272
+ this.dispose = function () {
273
+
274
+ domElement.removeEventListener( 'contextmenu', contextmenu );
275
+ domElement.removeEventListener( 'dblclick', onMouseUp );
276
+ domElement.removeEventListener( 'wheel', onMouseWheel );
277
+
278
+ domElement.removeEventListener( 'pointerdown', onPointerDown );
279
+
280
+ };
281
+
282
+ domElement.addEventListener( 'contextmenu', contextmenu );
283
+ domElement.addEventListener( 'dblclick', onMouseUp );
284
+ domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
285
+
286
+ domElement.addEventListener( 'pointerdown', onPointerDown );
287
+
288
+ // touch
289
+
290
+ var touches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
291
+ var prevTouches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
292
+
293
+ var prevDistance = null;
294
+
295
+ function onTouchStart( event ) {
296
+
297
+ trackPointer( event );
298
+
299
+ switch ( pointers.length ) {
300
+
301
+ case 1:
302
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
303
+ touches[ 1 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
304
+ break;
305
+
306
+ case 2:
307
+
308
+ var position = getSecondPointerPosition( event );
309
+
310
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
311
+ touches[ 1 ].set( position.x, position.y, 0 ).divideScalar( window.devicePixelRatio );
312
+ prevDistance = touches[ 0 ].distanceTo( touches[ 1 ] );
313
+ break;
314
+
315
+ }
316
+
317
+ prevTouches[ 0 ].copy( touches[ 0 ] );
318
+ prevTouches[ 1 ].copy( touches[ 1 ] );
319
+
320
+ }
321
+
322
+
323
+ function onTouchMove( event ) {
324
+
325
+ trackPointer( event );
326
+
327
+ function getClosest( touch, touches ) {
328
+
329
+ var closest = touches[ 0 ];
330
+
331
+ for ( var touch2 of touches ) {
332
+
333
+ if ( closest.distanceTo( touch ) > touch2.distanceTo( touch ) ) closest = touch2;
334
+
335
+ }
336
+
337
+ return closest;
338
+
339
+ }
340
+
341
+ switch ( pointers.length ) {
342
+
343
+ case 1:
344
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
345
+ touches[ 1 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
346
+ scope.rotate( touches[ 0 ].sub( getClosest( touches[ 0 ], prevTouches ) ).multiplyScalar( - 1 ) );
347
+ break;
348
+
349
+ case 2:
350
+
351
+ var position = getSecondPointerPosition( event );
352
+
353
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
354
+ touches[ 1 ].set( position.x, position.y, 0 ).divideScalar( window.devicePixelRatio );
355
+ var distance = touches[ 0 ].distanceTo( touches[ 1 ] );
356
+ scope.zoom( delta.set( 0, 0, prevDistance - distance ) );
357
+ prevDistance = distance;
358
+
359
+
360
+ var offset0 = touches[ 0 ].clone().sub( getClosest( touches[ 0 ], prevTouches ) );
361
+ var offset1 = touches[ 1 ].clone().sub( getClosest( touches[ 1 ], prevTouches ) );
362
+ offset0.x = - offset0.x;
363
+ offset1.x = - offset1.x;
364
+
365
+ scope.pan( offset0.add( offset1 ) );
366
+
367
+ break;
368
+
369
+ }
370
+
371
+ prevTouches[ 0 ].copy( touches[ 0 ] );
372
+ prevTouches[ 1 ].copy( touches[ 1 ] );
373
+
374
+ }
375
+
376
+ function addPointer( event ) {
377
+
378
+ pointers.push( event.pointerId );
379
+
380
+ }
381
+
382
+ function removePointer( event ) {
383
+
384
+ delete pointerPositions[ event.pointerId ];
385
+
386
+ for ( var i = 0; i < pointers.length; i ++ ) {
387
+
388
+ if ( pointers[ i ] == event.pointerId ) {
389
+
390
+ pointers.splice( i, 1 );
391
+ return;
392
+
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+
399
+ function isTrackingPointer( event ) {
400
+
401
+ for ( var i = 0; i < pointers.length; i ++ ) {
402
+
403
+ if ( pointers[ i ] == event.pointerId ) return true;
404
+
405
+ }
406
+
407
+ return false;
408
+
409
+ }
410
+
411
+ function trackPointer( event ) {
412
+
413
+ var position = pointerPositions[ event.pointerId ];
414
+
415
+ if ( position === undefined ) {
416
+
417
+ position = new THREE.Vector2();
418
+ pointerPositions[ event.pointerId ] = position;
419
+
420
+ }
421
+
422
+ position.set( event.pageX, event.pageY );
423
+
424
+ }
425
+
426
+ function getSecondPointerPosition( event ) {
427
+
428
+ var pointerId = ( event.pointerId === pointers[ 0 ] ) ? pointers[ 1 ] : pointers[ 0 ];
429
+
430
+ return pointerPositions[ pointerId ];
431
+
432
+ }
433
+
434
+ }
435
+
436
+ }
437
+
438
+ export { EditorControls };