@operato/scene-visualizer 1.2.31 → 1.2.37

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 CHANGED
@@ -3,6 +3,24 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.2.37](https://github.com/things-scene/operato-scene/compare/v1.2.36...v1.2.37) (2023-05-21)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * add div element into form templates ([2f2ecdc](https://github.com/things-scene/operato-scene/commit/2f2ecdc0461265b5e5c666af9b3ded3242ae5689))
12
+
13
+
14
+
15
+ ## [1.2.36](https://github.com/things-scene/operato-scene/compare/v1.2.35...v1.2.36) (2023-05-13)
16
+
17
+
18
+ ### :bug: Bug Fix
19
+
20
+ * license ([d37d485](https://github.com/things-scene/operato-scene/commit/d37d48597407dea1ad022e674f2899720e56d695))
21
+
22
+
23
+
6
24
  ## [1.2.31](https://github.com/things-scene/operato-scene/compare/v1.2.30...v1.2.31) (2023-05-07)
7
25
 
8
26
 
package/db.sqlite CHANGED
Binary file
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=three-modeller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"three-modeller.js","sourceRoot":"","sources":["../src/three-modeller.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -0,0 +1,86 @@
1
+ /// <reference path="../src/component.d.ts" />
2
+ import { Component, ComponentNature, Container, Properties } from '@hatiolab/things-scene';
3
+ import * as THREE from 'three';
4
+ import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
5
+ import './three-layout';
6
+ import { RealObject } from './threed/real-object';
7
+ import { ThreeDimensionalContainer } from './threed/three-dimensional-container';
8
+ import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer';
9
+ export declare class ThreeSpace extends Container implements ThreeDimensionalContainer {
10
+ _scene3d?: THREE.Scene;
11
+ _initalizeComplete?: Promise<void>;
12
+ _mixer?: THREE.AnimationMixer;
13
+ _camera?: THREE.PerspectiveCamera;
14
+ _renderer3d?: THREE.WebGLRenderer;
15
+ _mouse?: THREE.Vector2;
16
+ _clock?: THREE.Clock;
17
+ _controls?: any;
18
+ _onFocus?: (e: FocusEvent) => void;
19
+ _onResize?: (e: Event) => void;
20
+ _noSupportWebgl: boolean;
21
+ _raycaster: THREE.Raycaster;
22
+ _lastFocused?: RealObject;
23
+ _lastHovered?: RealObject;
24
+ private _css3DScene?;
25
+ private _css3DRenderer?;
26
+ composer?: EffectComposer;
27
+ containable(component: Component): boolean;
28
+ is3dContainer(): boolean;
29
+ createObjects(components: Component[]): void;
30
+ destroy_scene3d(): void;
31
+ update(): void;
32
+ resize(): void;
33
+ init_scene3d(): void;
34
+ threed_animate(): void;
35
+ stop(): void;
36
+ get scene3d(): THREE.Scene | undefined;
37
+ get renderer3d(): THREE.WebGLRenderer | undefined;
38
+ get mixer(): THREE.AnimationMixer | undefined;
39
+ get zoom(): number | undefined;
40
+ /**
41
+ * CSS3DRenderer용 THREE.Scene을 제공
42
+ */
43
+ get css3DScene(): THREE.Scene;
44
+ protected buildCSS3DScene(): THREE.Scene;
45
+ protected disposeCSS3DScene(): void;
46
+ /**
47
+ * css3d-renderer getter
48
+ */
49
+ get css3DRenderer(): CSS3DRenderer;
50
+ protected createCSS3DRenderer(): CSS3DRenderer;
51
+ protected disposeCSS3DRenderer(): void;
52
+ /**
53
+ * element내부에 필요한 overlay들을 생성
54
+ * ViewRenderer에서는 CSS3DRenderer와 GLRendering을 위한 canvas를 오버레이로 만든다.
55
+ * Warn: this.element는 아직 만들어지지 않은 상태에 buildOverlays가 호출됨.
56
+ * @param into
57
+ */
58
+ buildOverlays(): void;
59
+ render_threed(): void;
60
+ render(ctx: CanvasRenderingContext2D): void;
61
+ postrender(ctx: CanvasRenderingContext2D): void;
62
+ dispose(): void;
63
+ get layout(): import("@hatiolab/things-scene").LAYOUT;
64
+ get nature(): ComponentNature;
65
+ getObjectByRaycast(): THREE.Object3D | undefined;
66
+ getObjectsByRaycast(): THREE.Intersection<THREE.Object3D<THREE.Event>>[] | undefined;
67
+ _showWebglNoSupportText(context: CanvasRenderingContext2D): void;
68
+ onchange(after: Properties, before: Properties): void;
69
+ onmousedown(e: MouseEvent): void;
70
+ onmouseup(e: MouseEvent): void;
71
+ onmousemove(e: MouseEvent): void;
72
+ onmouseleave(e: MouseEvent): void;
73
+ onwheel(e: WheelEvent): void;
74
+ ondblclick(e: MouseEvent): void;
75
+ ondragstart(e: DragEvent): void;
76
+ ondragmove(e: DragEvent): void;
77
+ ondragend(e: DragEvent): void;
78
+ ontouchstart(e: TouchEvent): void;
79
+ onpan(e: TouchEvent): void;
80
+ ontouchend(e: TouchEvent): void;
81
+ onkeydown(e: KeyboardEvent): void;
82
+ onpinch(e: TouchEvent): void;
83
+ ondoubletap(): void;
84
+ handleMouseWheel(event: WheelEvent): void;
85
+ onredraw(): void;
86
+ }
@@ -0,0 +1,566 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, Container, error, FPS, Layout } from '@hatiolab/things-scene';
5
+ import * as THREE from 'three';
6
+ import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
7
+ import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
8
+ import ThreeControls from './three-controls';
9
+ import './three-layout';
10
+ import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer';
11
+ import { createFloor } from './threed/floor/floor';
12
+ const NATURE = {
13
+ mutable: false,
14
+ resizable: true,
15
+ rotatable: true,
16
+ properties: [
17
+ {
18
+ type: 'select',
19
+ label: 'precision',
20
+ name: 'precision',
21
+ property: {
22
+ options: [
23
+ {
24
+ display: 'High',
25
+ value: 'highp'
26
+ },
27
+ {
28
+ display: 'Medium',
29
+ value: 'mediump'
30
+ },
31
+ {
32
+ display: 'Low',
33
+ value: 'lowp'
34
+ }
35
+ ]
36
+ }
37
+ },
38
+ {
39
+ type: 'checkbox',
40
+ label: 'anti-alias',
41
+ name: 'antialias',
42
+ property: 'antialias'
43
+ },
44
+ {
45
+ type: 'checkbox',
46
+ label: 'controller',
47
+ name: 'controller',
48
+ property: 'controller'
49
+ }
50
+ ],
51
+ help: 'scene/component/three-space'
52
+ };
53
+ const WEBGL_NO_SUPPORT_TEXT = 'WebGL no support';
54
+ export class ThreeSpace extends Container {
55
+ constructor() {
56
+ super(...arguments);
57
+ this._noSupportWebgl = false;
58
+ this._raycaster = new THREE.Raycaster();
59
+ }
60
+ containable(component) {
61
+ return component.is3dish();
62
+ }
63
+ is3dContainer() {
64
+ return true;
65
+ }
66
+ /* THREE Object related .. */
67
+ createObjects(components) {
68
+ for (let component of components) {
69
+ try {
70
+ var item = component.realObject;
71
+ if (item) {
72
+ if (component.isHTMLElement()) {
73
+ this.css3DScene.add(item.object3d);
74
+ }
75
+ else {
76
+ this._scene3d.add(item.object3d);
77
+ }
78
+ }
79
+ }
80
+ catch (err) {
81
+ error(err);
82
+ }
83
+ }
84
+ }
85
+ destroy_scene3d() {
86
+ var _a;
87
+ this.stop();
88
+ window.removeEventListener('focus', this._onFocus);
89
+ window.removeEventListener('resize', this._onResize);
90
+ if (this._renderer3d)
91
+ this._renderer3d.clear();
92
+ if ((_a = this._controls) === null || _a === void 0 ? void 0 : _a.autoRotate) {
93
+ this._controls.doAutoRotate(false);
94
+ }
95
+ delete this._renderer3d;
96
+ delete this._camera;
97
+ delete this._controls;
98
+ if (this._scene3d) {
99
+ let children = this._scene3d.children.slice();
100
+ for (let i in children) {
101
+ let child = children[i];
102
+ if (child.dispose)
103
+ child.dispose();
104
+ if (child.geometry && child.geometry.dispose)
105
+ child.geometry.dispose();
106
+ if (child.material && child.material.dispose)
107
+ child.material.dispose();
108
+ if (child.texture && child.texture.dispose)
109
+ child.texture.dispose();
110
+ this._scene3d.remove(child);
111
+ }
112
+ }
113
+ delete this._scene3d;
114
+ }
115
+ update() {
116
+ var { width, height } = this.bounds;
117
+ var { fov = 45, near = 0.1, far = 20000, antialias = true, precision = 'highp', cameraX, cameraY, cameraZ, exposure = 2.5 } = this.state;
118
+ var components = this.components || [];
119
+ // SCENE
120
+ this._scene3d = new THREE.Scene();
121
+ // CAMERA
122
+ var aspect = width / height;
123
+ this._camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
124
+ var cameraXPos = height * 0.8, cameraYPos = width * 0.8, cameraZPos = Math.min(500, Math.floor(Math.min(width, height)));
125
+ // cameraZPos = Math.floor(Math.min(width, height))
126
+ if (cameraX != undefined)
127
+ cameraXPos = cameraX * width;
128
+ if (cameraY != undefined)
129
+ cameraYPos = cameraY * height;
130
+ if (cameraZ != undefined)
131
+ cameraZPos = cameraZ * Math.floor(Math.min(width, height));
132
+ this._camera.position.set(cameraXPos, cameraZPos, cameraYPos);
133
+ this._scene3d.add(this._camera);
134
+ this._camera.lookAt(this._scene3d.position);
135
+ this._camera.zoom = this.getState('zoom') * 0.01;
136
+ try {
137
+ const canvas = document.createElement('canvas');
138
+ let context = canvas.getContext('webgl2');
139
+ var renderer3d = new THREE.WebGLRenderer({
140
+ canvas,
141
+ context,
142
+ precision,
143
+ alpha: true,
144
+ antialias
145
+ });
146
+ }
147
+ catch (e) {
148
+ this._noSupportWebgl = true;
149
+ return;
150
+ }
151
+ this._renderer3d = renderer3d;
152
+ renderer3d.autoClear = true;
153
+ // @ts-ignore for three@0.150.1
154
+ renderer3d.outputColorSpace = THREE.SRGBColorSpace;
155
+ renderer3d.useLegacyLights = false;
156
+ renderer3d.toneMappingExposure = Math.pow(exposure, 5.0);
157
+ renderer3d.toneMapping = THREE.LinearToneMapping;
158
+ renderer3d.shadowMap.enabled = true;
159
+ renderer3d.setClearColor(0xffffff, 0); // transparent
160
+ renderer3d.setSize(width, height);
161
+ // CONTROLS
162
+ this._controls = new ThreeControls(this._camera, this);
163
+ this._controls.cameraChanged = true;
164
+ // Lights
165
+ var _hemiLight = new THREE.HemisphereLight(0xdddddd, 0x333333, 0.035);
166
+ var _directionalLight = new THREE.DirectionalLight(0xd6e1ff, 0.01);
167
+ var _pointLight1 = new THREE.PointLight(0xd6e1ff, 1, undefined, 2);
168
+ _pointLight1.power = cameraZPos * 50;
169
+ _pointLight1.castShadow = true;
170
+ _pointLight1.position.set(0, cameraZPos, 0);
171
+ _pointLight1.shadow.camera.near = 0.1;
172
+ _pointLight1.shadow.camera.far = cameraZPos * 2;
173
+ // const helper = new THREE.CameraHelper(_pointLight1.shadow.camera)
174
+ // this._scene3d?.add(helper)
175
+ this.scene3d.add(_hemiLight);
176
+ this.scene3d.add(_pointLight1);
177
+ this._camera.add(_directionalLight);
178
+ this._mouse = new THREE.Vector2();
179
+ this._clock = new THREE.Clock(true);
180
+ this._mixer = new THREE.AnimationMixer(this.scene3d);
181
+ this.createObjects(components);
182
+ this._camera.updateProjectionMatrix();
183
+ const floor = createFloor(this);
184
+ // if (this._floor) {
185
+ // this.object3d.remove(this._floor)
186
+ // this._floor.clear()
187
+ // delete this._floor
188
+ // }
189
+ if (floor) {
190
+ // this._floor = floor
191
+ this._scene3d.add(floor);
192
+ }
193
+ // this.invalidate()
194
+ // postprocessing
195
+ var composer = (this.composer = new EffectComposer(renderer3d));
196
+ composer.setSize(width, height);
197
+ const renderPass = new RenderPass(this._scene3d, this._camera);
198
+ composer.addPass(renderPass);
199
+ this._onFocus = (e) => {
200
+ this.render_threed();
201
+ };
202
+ this._onResize = (e) => {
203
+ this.resize();
204
+ };
205
+ window.addEventListener('resize', this._onResize);
206
+ window.addEventListener('focus', this._onFocus);
207
+ this.buildOverlays();
208
+ this.resize();
209
+ }
210
+ resize() {
211
+ var _a;
212
+ const { width, height } = this.bounds;
213
+ this._camera.aspect = width / height;
214
+ this.renderer3d.setSize(width, height);
215
+ this.css3DRenderer.setSize(width, height);
216
+ (_a = this.composer) === null || _a === void 0 ? void 0 : _a.setSize(width, height);
217
+ this._camera.updateProjectionMatrix();
218
+ }
219
+ init_scene3d() {
220
+ this.root.on('redraw', this.onredraw, this);
221
+ if (this._scene3d) {
222
+ this.destroy_scene3d();
223
+ }
224
+ this.update();
225
+ this.onchangeData && this.onchangeData(this.data, this.data);
226
+ }
227
+ threed_animate() {
228
+ if (!this._controls) {
229
+ return;
230
+ }
231
+ if (this._mixer) {
232
+ this._mixer.update(this._clock.getDelta());
233
+ }
234
+ this._controls.update();
235
+ if (this.state.autoRotate) {
236
+ this.invalidate();
237
+ }
238
+ this.render_threed();
239
+ }
240
+ stop() { }
241
+ get scene3d() {
242
+ if (!this._scene3d) {
243
+ this.init_scene3d();
244
+ }
245
+ return this._scene3d;
246
+ }
247
+ get renderer3d() {
248
+ return this._renderer3d;
249
+ }
250
+ get mixer() {
251
+ return this._mixer;
252
+ }
253
+ get zoom() {
254
+ var _a;
255
+ return (_a = this._camera) === null || _a === void 0 ? void 0 : _a.zoom;
256
+ }
257
+ /**
258
+ * CSS3DRenderer용 THREE.Scene을 제공
259
+ */
260
+ get css3DScene() {
261
+ if (!this._css3DScene) {
262
+ this._css3DScene = this.buildCSS3DScene();
263
+ }
264
+ return this._css3DScene;
265
+ }
266
+ buildCSS3DScene() {
267
+ return new THREE.Scene();
268
+ }
269
+ disposeCSS3DScene() {
270
+ var children = [...this.css3DScene.children];
271
+ children.forEach(child => this.css3DScene.remove(child));
272
+ }
273
+ /* css3d-renderer */
274
+ /**
275
+ * css3d-renderer getter
276
+ */
277
+ get css3DRenderer() {
278
+ if (!this._css3DRenderer) {
279
+ this._css3DRenderer = this.createCSS3DRenderer();
280
+ }
281
+ return this._css3DRenderer;
282
+ }
283
+ createCSS3DRenderer() {
284
+ var renderer = new CSS3DRenderer();
285
+ var div = renderer.domElement;
286
+ div.style.position = 'absolute';
287
+ div.style.top = '0';
288
+ div.style.pointerEvents = 'none';
289
+ if (this.app.isViewMode) {
290
+ // disableAllUserEvents(div)
291
+ }
292
+ else {
293
+ div.style.pointerEvents = 'none';
294
+ }
295
+ return renderer;
296
+ }
297
+ disposeCSS3DRenderer() {
298
+ // Nothing to do
299
+ }
300
+ /**
301
+ * element내부에 필요한 overlay들을 생성
302
+ * ViewRenderer에서는 CSS3DRenderer와 GLRendering을 위한 canvas를 오버레이로 만든다.
303
+ * Warn: this.element는 아직 만들어지지 않은 상태에 buildOverlays가 호출됨.
304
+ * @param into
305
+ */
306
+ buildOverlays() {
307
+ this.element.appendChild(this.css3DRenderer.domElement);
308
+ }
309
+ render_threed() {
310
+ if (this.composer) {
311
+ this.composer.render();
312
+ }
313
+ }
314
+ /* Container Overides .. */
315
+ render(ctx) {
316
+ if (this.app.isViewMode) {
317
+ this.setState('threed', true);
318
+ }
319
+ if (this.state.threed && !this._noSupportWebgl && this._camera) {
320
+ this.css3DRenderer.render(this.css3DScene, this._camera);
321
+ return;
322
+ }
323
+ super.render(ctx);
324
+ }
325
+ postrender(ctx) {
326
+ var { left, top, debug, threed } = this.state;
327
+ var { width, height } = this.bounds;
328
+ // ios에서 width, height에 소수점이 있으면 3d를 표현하지 못하는 문제가 있어 정수화
329
+ width = Math.floor(width);
330
+ height = Math.floor(height);
331
+ if (threed) {
332
+ if (!this._scene3d) {
333
+ this.init_scene3d();
334
+ this.render_threed();
335
+ }
336
+ if (this._noSupportWebgl) {
337
+ this._showWebglNoSupportText(ctx);
338
+ return;
339
+ }
340
+ if (!this._renderer3d) {
341
+ return;
342
+ }
343
+ var { width: rendererWidth, height: rendererHeight } = this._renderer3d.getSize(new THREE.Vector2());
344
+ ctx.drawImage(this._renderer3d.domElement, 0, 0, rendererWidth, rendererHeight, left, top, width, height);
345
+ if (debug) {
346
+ ctx.font = 100 + 'px Arial';
347
+ ctx.textAlign = 'center';
348
+ ctx.fillStyle = 'black';
349
+ ctx.globalAlpha = 0.5;
350
+ ctx.fillText(String(FPS()), 100, 100);
351
+ }
352
+ }
353
+ else {
354
+ super.postrender(ctx);
355
+ }
356
+ }
357
+ dispose() {
358
+ var _a;
359
+ this.root.off('redraw', this.onredraw, this);
360
+ this.disposeCSS3DScene();
361
+ (_a = this.composer) === null || _a === void 0 ? void 0 : _a.dispose();
362
+ this.destroy_scene3d();
363
+ super.dispose();
364
+ }
365
+ get layout() {
366
+ return Layout.get('three');
367
+ }
368
+ get nature() {
369
+ return NATURE;
370
+ }
371
+ getObjectByRaycast() {
372
+ var intersects = this.getObjectsByRaycast();
373
+ if (intersects && intersects.length > 0) {
374
+ var object = intersects[0].object;
375
+ while (object) {
376
+ if (object.userData.context) {
377
+ return object;
378
+ }
379
+ object = object.parent;
380
+ }
381
+ }
382
+ }
383
+ getObjectsByRaycast() {
384
+ var vector = this._mouse;
385
+ if (!this._camera) {
386
+ return;
387
+ }
388
+ this._raycaster.setFromCamera(vector, this._camera);
389
+ var intersects = this._raycaster.intersectObjects(this._scene3d.children, true);
390
+ return intersects;
391
+ }
392
+ _showWebglNoSupportText(context) {
393
+ context.save();
394
+ var { width, height } = this.state;
395
+ context.font = width / 20 + 'px Arial';
396
+ context.textAlign = 'center';
397
+ context.fillText(WEBGL_NO_SUPPORT_TEXT, width / 2 - width / 40, height / 2);
398
+ context.restore();
399
+ }
400
+ /* Event Handlers */
401
+ onchange(after, before) {
402
+ if (after.hasOwnProperty('width') || after.hasOwnProperty('height') || after.hasOwnProperty('threed'))
403
+ this.destroy_scene3d();
404
+ if (after.hasOwnProperty('autoRotate')) {
405
+ if (this._controls) {
406
+ this._controls.doAutoRotate(after.autoRotate);
407
+ }
408
+ }
409
+ if (after.hasOwnProperty('fov') ||
410
+ after.hasOwnProperty('near') ||
411
+ after.hasOwnProperty('far') ||
412
+ after.hasOwnProperty('zoom')) {
413
+ if (this._camera) {
414
+ const { near, far, zoom, fov } = this.state;
415
+ this._camera.near = near;
416
+ this._camera.far = far;
417
+ this._camera.zoom = zoom * 0.01;
418
+ this._camera.fov = fov;
419
+ this._camera.updateProjectionMatrix();
420
+ this._controls.cameraChanged = true;
421
+ }
422
+ }
423
+ }
424
+ onmousedown(e) {
425
+ if (this._controls) {
426
+ this._controls.onMouseDown(e);
427
+ }
428
+ }
429
+ onmouseup(e) {
430
+ var _a;
431
+ if (this._controls) {
432
+ if (this._lastFocused) {
433
+ ;
434
+ this._lastFocused._focused = false;
435
+ }
436
+ const { left, top, width, height } = this.state;
437
+ var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
438
+ this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
439
+ this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
440
+ var object = this.getObjectByRaycast();
441
+ var realObject = object === null || object === void 0 ? void 0 : object.userData.context;
442
+ if (realObject) {
443
+ ;
444
+ realObject._focused = true;
445
+ realObject._focusedAt = performance.now();
446
+ this._lastFocused = realObject;
447
+ (_a = realObject.component) === null || _a === void 0 ? void 0 : _a.trigger('click', e);
448
+ }
449
+ e.stopPropagation();
450
+ }
451
+ }
452
+ onmousemove(e) {
453
+ var _a, _b;
454
+ if (this._controls) {
455
+ const { left, top, width, height } = this.state;
456
+ var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
457
+ this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
458
+ this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
459
+ var object = this.getObjectByRaycast();
460
+ var realObject = object === null || object === void 0 ? void 0 : object.userData.context;
461
+ if (realObject !== this._lastHovered) {
462
+ if (this._lastHovered) {
463
+ (_a = this._lastHovered.component) === null || _a === void 0 ? void 0 : _a.trigger('mouseleave', e);
464
+ delete this._lastHovered;
465
+ }
466
+ if (realObject) {
467
+ this._lastHovered = realObject;
468
+ (_b = this._lastHovered.component) === null || _b === void 0 ? void 0 : _b.trigger('mouseenter', e);
469
+ }
470
+ }
471
+ this._controls.onMouseMove(e);
472
+ e.stopPropagation();
473
+ }
474
+ }
475
+ onmouseleave(e) { }
476
+ onwheel(e) {
477
+ if (this._controls) {
478
+ this.handleMouseWheel(e);
479
+ e.stopPropagation();
480
+ }
481
+ }
482
+ ondblclick(e) {
483
+ if (this._controls) {
484
+ this.setState('zoom', this.get('zoom'));
485
+ this._controls.reset();
486
+ e.stopPropagation();
487
+ }
488
+ }
489
+ ondragstart(e) {
490
+ if (this._controls) {
491
+ var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
492
+ var { left, top, width, height } = this.bounds;
493
+ this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
494
+ this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
495
+ this._controls.onDragStart(e);
496
+ e.stopPropagation();
497
+ }
498
+ }
499
+ ondragmove(e) {
500
+ if (this._controls) {
501
+ this._controls.cameraChanged = true;
502
+ this._controls.onDragMove(e);
503
+ e.stopPropagation();
504
+ }
505
+ }
506
+ ondragend(e) {
507
+ if (this._controls) {
508
+ this._controls.cameraChanged = true;
509
+ this._controls.onDragEnd(e);
510
+ e.stopPropagation();
511
+ }
512
+ }
513
+ ontouchstart(e) {
514
+ if (this._controls) {
515
+ this._controls.onTouchStart(e);
516
+ e.stopPropagation();
517
+ }
518
+ }
519
+ onpan(e) {
520
+ if (this._controls) {
521
+ this._controls.cameraChanged = true;
522
+ this._controls.onTouchMove(e);
523
+ e.stopPropagation();
524
+ }
525
+ }
526
+ ontouchend(e) {
527
+ if (this._controls) {
528
+ this._controls.onTouchEnd(e);
529
+ e.stopPropagation();
530
+ }
531
+ }
532
+ onkeydown(e) {
533
+ if (this._controls) {
534
+ this._controls.onKeyDown(e);
535
+ e.stopPropagation();
536
+ }
537
+ }
538
+ onpinch(e) {
539
+ if (this._controls) {
540
+ var zoom = this.getState('zoom');
541
+ //@ts-ignore
542
+ zoom *= e.scale;
543
+ if (zoom < 100)
544
+ zoom = 100;
545
+ this.setState('zoom', zoom);
546
+ e.stopPropagation();
547
+ }
548
+ }
549
+ ondoubletap() {
550
+ this._controls.reset();
551
+ }
552
+ handleMouseWheel(event) {
553
+ var delta = 0;
554
+ var zoom = this.getState('zoom');
555
+ delta = -event.deltaY;
556
+ zoom += delta * 0.1;
557
+ if (zoom < 100)
558
+ zoom = 100;
559
+ this.setState('zoom', zoom);
560
+ }
561
+ onredraw() {
562
+ this.threed_animate();
563
+ }
564
+ }
565
+ Component.register('3d-space', ThreeSpace);
566
+ //# sourceMappingURL=three-space.js.map