@operato/scene-visualizer 9.1.1 → 10.0.0-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 (181) hide show
  1. package/dist/banner.d.ts +232 -3
  2. package/dist/banner.js +1 -2
  3. package/dist/banner.js.map +1 -1
  4. package/dist/camera.d.ts +232 -3
  5. package/dist/camera.js +1 -2
  6. package/dist/camera.js.map +1 -1
  7. package/dist/carrier.d.ts +263 -0
  8. package/dist/carrier.js +272 -0
  9. package/dist/carrier.js.map +1 -0
  10. package/dist/cube.d.ts +232 -4
  11. package/dist/cube.js +1 -2
  12. package/dist/cube.js.map +1 -1
  13. package/dist/cylinder.d.ts +1 -3
  14. package/dist/cylinder.js +1 -2
  15. package/dist/cylinder.js.map +1 -1
  16. package/dist/desk.d.ts +238 -3
  17. package/dist/desk.js +1 -2
  18. package/dist/desk.js.map +1 -1
  19. package/dist/editors/index.d.ts +1 -0
  20. package/dist/editors/index.js +5 -0
  21. package/dist/editors/index.js.map +1 -1
  22. package/dist/editors/property-editor-gltf-fill-targets.d.ts +17 -0
  23. package/dist/editors/property-editor-gltf-fill-targets.js +211 -0
  24. package/dist/editors/property-editor-gltf-fill-targets.js.map +1 -0
  25. package/dist/editors/property-editor-gltf-info.js +38 -29
  26. package/dist/editors/property-editor-gltf-info.js.map +1 -1
  27. package/dist/editors/property-editor-location-increase-pattern.js +91 -95
  28. package/dist/editors/property-editor-location-increase-pattern.js.map +1 -1
  29. package/dist/effects/outline.js +1 -1
  30. package/dist/effects/outline.js.map +1 -1
  31. package/dist/ellipse.js +2 -4
  32. package/dist/ellipse.js.map +1 -1
  33. package/dist/gltf-object.d.ts +232 -3
  34. package/dist/gltf-object.js +1 -2
  35. package/dist/gltf-object.js.map +1 -1
  36. package/dist/html-overlay-element.js +3 -7
  37. package/dist/html-overlay-element.js.map +1 -1
  38. package/dist/index.d.ts +5 -17
  39. package/dist/index.js +7 -17
  40. package/dist/index.js.map +1 -1
  41. package/dist/light.d.ts +1 -2
  42. package/dist/light.js +1 -2
  43. package/dist/light.js.map +1 -1
  44. package/dist/polygon.js +2 -4
  45. package/dist/polygon.js.map +1 -1
  46. package/dist/rack-table-3d.d.ts +16 -0
  47. package/dist/rack-table-3d.js +94 -0
  48. package/dist/rack-table-3d.js.map +1 -0
  49. package/dist/rack-table-cell.d.ts +238 -3
  50. package/dist/rack-table-cell.js +44 -51
  51. package/dist/rack-table-cell.js.map +1 -1
  52. package/dist/rack-table-location.d.ts +37 -0
  53. package/dist/rack-table-location.js +227 -0
  54. package/dist/rack-table-location.js.map +1 -0
  55. package/dist/rack-table.d.ts +13 -29
  56. package/dist/rack-table.js +108 -380
  57. package/dist/rack-table.js.map +1 -1
  58. package/dist/rack.d.ts +3 -5
  59. package/dist/rack.js +7 -9
  60. package/dist/rack.js.map +1 -1
  61. package/dist/rect.js +2 -4
  62. package/dist/rect.js.map +1 -1
  63. package/dist/signal-tower.d.ts +492 -0
  64. package/dist/signal-tower.js +275 -0
  65. package/dist/signal-tower.js.map +1 -0
  66. package/dist/sphere.d.ts +1 -3
  67. package/dist/sphere.js +1 -2
  68. package/dist/sphere.js.map +1 -1
  69. package/dist/sprite.d.ts +232 -3
  70. package/dist/sprite.js +1 -2
  71. package/dist/sprite.js.map +1 -1
  72. package/dist/stock.d.ts +22 -10
  73. package/dist/stock.js +130 -109
  74. package/dist/stock.js.map +1 -1
  75. package/dist/tank.d.ts +492 -0
  76. package/dist/tank.js +312 -0
  77. package/dist/tank.js.map +1 -0
  78. package/dist/templates/carrier.d.ts +19 -0
  79. package/dist/templates/carrier.js +20 -0
  80. package/dist/templates/carrier.js.map +1 -0
  81. package/dist/templates/cube.js +1 -1
  82. package/dist/templates/cube.js.map +1 -1
  83. package/dist/templates/cylinder.js +3 -3
  84. package/dist/templates/cylinder.js.map +1 -1
  85. package/dist/templates/index.d.ts +1 -0
  86. package/dist/templates/index.js +9 -1
  87. package/dist/templates/index.js.map +1 -1
  88. package/dist/templates/signal-tower.d.ts +21 -0
  89. package/dist/templates/signal-tower.js +22 -0
  90. package/dist/templates/signal-tower.js.map +1 -0
  91. package/dist/templates/sphere.d.ts +1 -0
  92. package/dist/templates/sphere.js +5 -4
  93. package/dist/templates/sphere.js.map +1 -1
  94. package/dist/templates/tank.d.ts +21 -0
  95. package/dist/templates/tank.js +22 -0
  96. package/dist/templates/tank.js.map +1 -0
  97. package/dist/templates/vehicle.d.ts +19 -0
  98. package/dist/templates/vehicle.js +20 -0
  99. package/dist/templates/vehicle.js.map +1 -0
  100. package/dist/text.js +2 -4
  101. package/dist/text.js.map +1 -1
  102. package/dist/three-container.d.ts +11 -35
  103. package/dist/three-container.js +128 -322
  104. package/dist/three-container.js.map +1 -1
  105. package/dist/three-controls.d.ts +101 -1
  106. package/dist/three-controls.js +339 -541
  107. package/dist/three-controls.js.map +1 -1
  108. package/dist/three-space.d.ts +6 -83
  109. package/dist/three-space.js +25 -537
  110. package/dist/three-space.js.map +1 -1
  111. package/dist/threed/index.d.ts +1 -0
  112. package/dist/threed/index.js +1 -0
  113. package/dist/threed/index.js.map +1 -1
  114. package/dist/threed/interfaces.d.ts +15 -0
  115. package/dist/threed/interfaces.js +5 -0
  116. package/dist/threed/interfaces.js.map +1 -0
  117. package/dist/threed/managers/camera-manager.d.ts +14 -0
  118. package/dist/threed/managers/camera-manager.js +60 -0
  119. package/dist/threed/managers/camera-manager.js.map +1 -0
  120. package/dist/threed/managers/controls-manager.d.ts +50 -0
  121. package/dist/threed/managers/controls-manager.js +249 -0
  122. package/dist/threed/managers/controls-manager.js.map +1 -0
  123. package/dist/threed/managers/event-manager3d.d.ts +19 -0
  124. package/dist/threed/managers/event-manager3d.js +76 -0
  125. package/dist/threed/managers/event-manager3d.js.map +1 -0
  126. package/dist/threed/managers/index.d.ts +7 -0
  127. package/dist/threed/managers/index.js +7 -0
  128. package/dist/threed/managers/index.js.map +1 -0
  129. package/dist/threed/managers/light-manager.d.ts +7 -0
  130. package/dist/threed/managers/light-manager.js +37 -0
  131. package/dist/threed/managers/light-manager.js.map +1 -0
  132. package/dist/threed/managers/renderer-manager.d.ts +30 -0
  133. package/dist/threed/managers/renderer-manager.js +120 -0
  134. package/dist/threed/managers/renderer-manager.js.map +1 -0
  135. package/dist/threed/managers/scene-manager.d.ts +15 -0
  136. package/dist/threed/managers/scene-manager.js +48 -0
  137. package/dist/threed/managers/scene-manager.js.map +1 -0
  138. package/dist/threed/managers/types.d.ts +36 -0
  139. package/dist/threed/managers/types.js +2 -0
  140. package/dist/threed/managers/types.js.map +1 -0
  141. package/dist/threed/real-object-dom-element.js +11 -3
  142. package/dist/threed/real-object-dom-element.js.map +1 -1
  143. package/dist/threed/real-object-extrude.d.ts +1 -0
  144. package/dist/threed/real-object-extrude.js +7 -0
  145. package/dist/threed/real-object-extrude.js.map +1 -1
  146. package/dist/threed/real-object-gltf.js +6 -2
  147. package/dist/threed/real-object-gltf.js.map +1 -1
  148. package/dist/threed/real-object-mesh.js +4 -6
  149. package/dist/threed/real-object-mesh.js.map +1 -1
  150. package/dist/threed/real-object-registry.d.ts +7 -0
  151. package/dist/threed/real-object-registry.js +32 -0
  152. package/dist/threed/real-object-registry.js.map +1 -0
  153. package/dist/threed/real-object-scene.js +10 -5
  154. package/dist/threed/real-object-scene.js.map +1 -1
  155. package/dist/threed/real-object-sprite-2d.js.map +1 -1
  156. package/dist/threed/real-object-sprite.js +2 -0
  157. package/dist/threed/real-object-sprite.js.map +1 -1
  158. package/dist/threed/real-object-text.js +2 -0
  159. package/dist/threed/real-object-text.js.map +1 -1
  160. package/dist/threed/real-object.d.ts +3 -2
  161. package/dist/threed/real-object.js +7 -16
  162. package/dist/threed/real-object.js.map +1 -1
  163. package/dist/threed/three-dimensional-container.d.ts +1 -2
  164. package/dist/threed/three-dimensional-container.js.map +1 -1
  165. package/dist/threed/utils/dispose.d.ts +2 -0
  166. package/dist/threed/utils/dispose.js +32 -0
  167. package/dist/threed/utils/dispose.js.map +1 -0
  168. package/dist/vehicle.d.ts +248 -0
  169. package/dist/vehicle.js +133 -0
  170. package/dist/vehicle.js.map +1 -0
  171. package/dist/visualizer.d.ts +4 -5
  172. package/dist/visualizer.js +15 -28
  173. package/dist/visualizer.js.map +1 -1
  174. package/dist/wall.d.ts +232 -4
  175. package/dist/wall.js +1 -2
  176. package/dist/wall.js.map +1 -1
  177. package/icons/carrier.png +0 -0
  178. package/icons/signal-tower.png +0 -0
  179. package/icons/tank.png +0 -0
  180. package/icons/vehicle.png +0 -0
  181. package/package.json +16 -18
@@ -3,13 +3,9 @@
3
3
  */
4
4
  import { __decorate } from "tslib";
5
5
  import { Container, error, FPS, Layout, sceneComponent } from '@hatiolab/things-scene';
6
- import * as THREE from 'three';
7
- import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
8
- import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
9
- import ThreeControls from './three-controls.js';
10
6
  import './three-layout.js';
11
- import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
12
- import { createFloor } from './threed/floor/floor.js';
7
+ import { createRealObjectFor } from './threed/real-object-registry.js';
8
+ import { SceneManager, CameraManager, RendererManager, LightManager, ControlsManager, EventManager3D } from './threed/managers/index.js';
13
9
  const NATURE = {
14
10
  mutable: false,
15
11
  resizable: true,
@@ -21,45 +17,16 @@ const NATURE = {
21
17
  name: 'precision',
22
18
  property: {
23
19
  options: [
24
- {
25
- display: 'High',
26
- value: 'highp'
27
- },
28
- {
29
- display: 'Medium',
30
- value: 'mediump'
31
- },
32
- {
33
- display: 'Low',
34
- value: 'lowp'
35
- }
20
+ { display: 'High', value: 'highp' },
21
+ { display: 'Medium', value: 'mediump' },
22
+ { display: 'Low', value: 'lowp' }
36
23
  ]
37
24
  }
38
25
  },
39
- {
40
- type: 'checkbox',
41
- label: 'anti-alias',
42
- name: 'antialias',
43
- property: 'antialias'
44
- },
45
- {
46
- type: 'checkbox',
47
- label: '3dmode',
48
- name: 'threed',
49
- property: 'threed'
50
- },
51
- {
52
- type: 'checkbox',
53
- label: 'auto-rotate',
54
- name: 'autoRotate',
55
- property: 'autoRotate'
56
- },
57
- {
58
- type: 'checkbox',
59
- label: 'debug',
60
- name: 'debug',
61
- property: 'debug'
62
- }
26
+ { type: 'checkbox', label: 'anti-alias', name: 'antialias', property: 'antialias' },
27
+ { type: 'checkbox', label: '3dmode', name: 'threed', property: 'threed' },
28
+ { type: 'checkbox', label: 'auto-rotate', name: 'autoRotate', property: 'autoRotate' },
29
+ { type: 'checkbox', label: 'debug', name: 'debug', property: 'debug' }
63
30
  ],
64
31
  help: 'scene/component/three-container'
65
32
  };
@@ -67,26 +34,33 @@ const WEBGL_NO_SUPPORT_TEXT = 'WebGL no support';
67
34
  let ThreeContainer = class ThreeContainer extends Container {
68
35
  constructor() {
69
36
  super(...arguments);
70
- this._noSupportWebgl = false;
71
- this._raycaster = new THREE.Raycaster();
37
+ this.sceneManager = new SceneManager();
38
+ this.cameraManager = new CameraManager();
39
+ this.rendererManager = new RendererManager();
40
+ this.lightManager = new LightManager();
41
+ this.controlsManager = new ControlsManager();
42
+ this.eventManager = new EventManager3D();
72
43
  }
73
44
  containable(component) {
74
- return component.is3dish();
45
+ return true;
75
46
  }
76
47
  is3dContainer() {
77
48
  return true;
78
49
  }
79
50
  /* THREE Object related .. */
80
51
  createObjects(components) {
81
- for (let component of components) {
52
+ for (const component of components) {
82
53
  try {
83
- var item = component.realObject;
54
+ const item = createRealObjectFor(component);
84
55
  if (item) {
56
+ component._realObject = item;
57
+ item.update();
58
+ item.updateTransform();
85
59
  if (component.isHTMLElement()) {
86
- this.css3DScene.add(item.object3d);
60
+ this.rendererManager.css3DScene.add(item.object3d);
87
61
  }
88
62
  else {
89
- this._scene3d.add(item.object3d);
63
+ this.sceneManager.scene.add(item.object3d);
90
64
  }
91
65
  }
92
66
  }
@@ -96,248 +70,141 @@ let ThreeContainer = class ThreeContainer extends Container {
96
70
  }
97
71
  }
98
72
  destroy_scene3d() {
99
- var _a;
100
73
  this.stop();
101
74
  window.removeEventListener('focus', this._onFocus);
102
75
  window.removeEventListener('resize', this._onResize);
103
- if (this._renderer3d)
104
- this._renderer3d.clear();
105
- if ((_a = this._controls) === null || _a === void 0 ? void 0 : _a.autoRotate) {
106
- this._controls.doAutoRotate(false);
107
- }
108
- delete this._renderer3d;
109
- delete this._camera;
110
- delete this._controls;
111
- if (this._scene3d) {
112
- let children = this._scene3d.children.slice();
113
- for (let i in children) {
114
- let child = children[i];
115
- if (child.dispose)
116
- child.dispose();
117
- if (child.geometry && child.geometry.dispose)
118
- child.geometry.dispose();
119
- if (child.material && child.material.dispose)
120
- child.material.dispose();
121
- if (child.texture && child.texture.dispose)
122
- child.texture.dispose();
123
- this._scene3d.remove(child);
124
- }
125
- }
126
- delete this._scene3d;
76
+ this.controlsManager.destroy();
77
+ this.lightManager.destroy();
78
+ this.rendererManager.destroy();
79
+ this.cameraManager.destroy();
80
+ this.sceneManager.destroy();
81
+ this.eventManager.destroy();
82
+ }
83
+ getLightingConfig() {
84
+ return {
85
+ hemisphere: { skyColor: 0xdddddd, groundColor: 0x333333, intensity: 0.035 }
86
+ };
87
+ }
88
+ getCss3DSceneAttribute() {
89
+ return 'three-container:css3d-renderer';
127
90
  }
128
91
  update() {
129
- var { width, height } = this.bounds;
130
- var { fov = 45, near = 0.1, far = 20000, antialias = true, precision = 'highp', cameraX, cameraY, cameraZ, exposure = 2.5 } = this.state;
131
- var components = this.components || [];
92
+ const { width, height } = this.bounds;
93
+ const { fov = 45, near = 0.1, far = 20000, antialias = true, precision = 'highp', cameraX, cameraY, cameraZ, exposure = 2.5 } = this.state;
94
+ const components = this.components || [];
132
95
  // SCENE
133
- this._scene3d = new THREE.Scene();
96
+ const scene = this.sceneManager.setup();
134
97
  // CAMERA
135
- var aspect = width / height;
136
- this._camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
137
- var cameraXPos = height * 0.8, cameraYPos = width * 0.8, cameraZPos = Math.min(500, Math.floor(Math.min(width, height)));
138
- // cameraZPos = Math.floor(Math.min(width, height))
139
- if (cameraX != undefined)
140
- cameraXPos = cameraX * width;
141
- if (cameraY != undefined)
142
- cameraYPos = cameraY * height;
143
- if (cameraZ != undefined)
144
- cameraZPos = cameraZ * Math.floor(Math.min(width, height));
145
- this._camera.position.set(cameraXPos, cameraZPos, cameraYPos);
146
- this._scene3d.add(this._camera);
147
- this._camera.lookAt(this._scene3d.position);
148
- this._camera.zoom = this.getState('zoom') * 0.01;
149
- try {
150
- const canvas = document.createElement('canvas');
151
- let context = canvas.getContext('webgl2');
152
- var renderer3d = new THREE.WebGLRenderer({
153
- canvas,
154
- context,
155
- precision,
156
- alpha: true,
157
- antialias
158
- });
159
- }
160
- catch (e) {
161
- this._noSupportWebgl = true;
98
+ const camera = this.cameraManager.setup(width, height, {
99
+ fov, near, far, zoom: this.getState('zoom'), cameraX, cameraY, cameraZ
100
+ });
101
+ this.cameraManager.addToScene(scene);
102
+ // RENDERER (WebGL)
103
+ if (!this.rendererManager.setupWebGL(width, height, { precision, antialias, exposure })) {
162
104
  return;
163
105
  }
164
- this._renderer3d = renderer3d;
165
- renderer3d.autoClear = true;
166
- // @ts-ignore for three@0.150.1
167
- renderer3d.outputColorSpace = THREE.SRGBColorSpace;
168
- renderer3d.useLegacyLights = false;
169
- renderer3d.toneMappingExposure = Math.pow(exposure, 5.0);
170
- renderer3d.toneMapping = THREE.LinearToneMapping;
171
- renderer3d.shadowMap.enabled = true;
172
- renderer3d.setClearColor(0xffffff, 0); // transparent
173
- renderer3d.setSize(width, height);
174
106
  // CONTROLS
175
- this._controls = new ThreeControls(this._camera, this);
176
- this._controls.cameraChanged = true;
177
- // Lights
178
- var _hemiLight = new THREE.HemisphereLight(0xdddddd, 0x333333, 0.035);
179
- this.scene3d.add(_hemiLight);
180
- this._mouse = new THREE.Vector2();
181
- this._clock = new THREE.Clock(true);
182
- this._mixer = new THREE.AnimationMixer(this.scene3d);
107
+ this.controlsManager.setup(camera, this);
108
+ // LIGHTS
109
+ this.lightManager.setup(scene, camera, this.getLightingConfig());
110
+ // MIXER
111
+ this.sceneManager.setupMixer();
112
+ // CREATE 3D OBJECTS
183
113
  this.createObjects(components);
184
- this._camera.updateProjectionMatrix();
185
- const floor = createFloor(this);
186
- if (floor) {
187
- this._scene3d.add(floor);
188
- }
189
- // postprocessing
190
- var composer = (this.composer = new EffectComposer(renderer3d));
191
- composer.setSize(width, height);
192
- const renderPass = new RenderPass(this._scene3d, this._camera);
193
- composer.addPass(renderPass);
194
- this._onFocus = (e) => {
195
- this.render_threed();
196
- };
197
- this._onResize = (e) => {
198
- this.resize();
199
- };
114
+ camera.updateProjectionMatrix();
115
+ // FLOOR
116
+ this.sceneManager.addFloor(this);
117
+ // POSTPROCESSING
118
+ this.rendererManager.setupComposer(scene, camera, width, height);
119
+ // CSS3D
120
+ this.rendererManager.setupCSS3D(this.app.isViewMode, this.getCss3DSceneAttribute());
121
+ // EVENT LISTENERS
122
+ this._onFocus = () => this.render_threed();
123
+ this._onResize = () => this.resize();
200
124
  window.addEventListener('resize', this._onResize);
201
125
  window.addEventListener('focus', this._onFocus);
202
126
  this.buildOverlays();
203
127
  this.resize();
204
128
  }
205
129
  resize() {
206
- var _a;
207
130
  const { width, height } = this.bounds;
208
- this._camera.aspect = width / height;
209
- this.renderer3d.setSize(width, height);
210
- this.css3DRenderer.setSize(width, height);
211
- (_a = this.composer) === null || _a === void 0 ? void 0 : _a.setSize(width, height);
212
- this._camera.updateProjectionMatrix();
131
+ this.cameraManager.updateAspect(width, height);
132
+ this.rendererManager.resize(width, height);
213
133
  }
214
134
  init_scene3d() {
215
135
  this.root.on('redraw', this.onredraw, this);
216
- if (this._scene3d) {
136
+ if (this.sceneManager.scene) {
217
137
  this.destroy_scene3d();
218
138
  }
219
139
  this.update();
220
140
  this.onchangeData && this.onchangeData(this.data, this.data);
221
141
  }
222
142
  threed_animate() {
223
- if (!this._controls) {
143
+ if (!this.controlsManager.isActive) {
224
144
  return;
225
145
  }
226
- if (this._mixer) {
227
- this._mixer.update(this._clock.getDelta());
228
- }
229
- this._controls.update();
230
- if (this.state.autoRotate) {
231
- this.invalidate();
232
- }
146
+ this.sceneManager.updateAnimation();
147
+ this.controlsManager.update();
233
148
  this.render_threed();
234
149
  }
235
150
  stop() { }
236
151
  get scene3d() {
237
- if (!this._scene3d) {
152
+ if (!this.sceneManager.scene) {
238
153
  this.init_scene3d();
239
154
  }
240
- return this._scene3d;
155
+ return this.sceneManager.scene;
241
156
  }
242
157
  get renderer3d() {
243
- return this._renderer3d;
158
+ return this.rendererManager.renderer;
244
159
  }
245
160
  get mixer() {
246
- return this._mixer;
161
+ return this.sceneManager.mixer;
247
162
  }
248
163
  get zoom() {
249
- var _a;
250
- return (_a = this._camera) === null || _a === void 0 ? void 0 : _a.zoom;
164
+ return this.cameraManager.zoom;
251
165
  }
252
- /**
253
- * CSS3DRenderer용 THREE.Scene을 제공
254
- */
255
166
  get css3DScene() {
256
- if (!this._css3DScene) {
257
- this._css3DScene = this.buildCSS3DScene();
258
- }
259
- return this._css3DScene;
167
+ return this.rendererManager.css3DScene;
260
168
  }
261
- buildCSS3DScene() {
262
- return new THREE.Scene();
263
- }
264
- disposeCSS3DScene() {
265
- var children = [...this.css3DScene.children];
266
- children.forEach(child => this.css3DScene.remove(child));
267
- }
268
- /* css3d-renderer */
269
- /**
270
- * css3d-renderer getter
271
- */
272
169
  get css3DRenderer() {
273
- if (!this._css3DRenderer) {
274
- this._css3DRenderer = this.createCSS3DRenderer();
275
- }
276
- return this._css3DRenderer;
277
- }
278
- createCSS3DRenderer() {
279
- var renderer = new CSS3DRenderer();
280
- var div = renderer.domElement;
281
- div.style.position = 'absolute';
282
- div.style.top = '0';
283
- div.style.pointerEvents = 'none';
284
- div.setAttribute('scene', 'three-container:css3d-renderer');
285
- if (this.app.isViewMode) {
286
- // disableAllUserEvents(div)
287
- }
288
- else {
289
- div.style.pointerEvents = 'none';
290
- }
291
- return renderer;
292
- }
293
- disposeCSS3DRenderer() {
294
- // Nothing to do
170
+ return this.rendererManager.css3DRenderer;
295
171
  }
296
- /**
297
- * element내부에 필요한 overlay들을 생성
298
- * ViewRenderer에서는 CSS3DRenderer와 GLRendering을 위한 canvas를 오버레이로 만든다.
299
- * Warn: this.element는 아직 만들어지지 않은 상태에 buildOverlays가 호출됨.
300
- * @param into
301
- */
302
172
  buildOverlays() {
303
173
  this.element.appendChild(this.css3DRenderer.domElement);
304
174
  }
305
175
  render_threed() {
306
- if (this.composer) {
307
- this.composer.render();
308
- }
176
+ this.rendererManager.render();
309
177
  }
310
- /* Container Overides .. */
178
+ /* Container Overrides */
311
179
  render(ctx) {
312
180
  if (this.app.isViewMode) {
313
181
  this.setState('threed', true);
314
182
  }
315
- if (this.state.threed && !this._noSupportWebgl && this._camera) {
316
- this.css3DRenderer.render(this.css3DScene, this._camera);
183
+ if (this.state.threed && !this.rendererManager.noSupportWebgl && this.cameraManager.camera) {
184
+ this.rendererManager.renderCSS3D(this.cameraManager.camera);
317
185
  return;
318
186
  }
319
187
  super.render(ctx);
320
188
  }
321
189
  postrender(ctx) {
322
- var { left, top, debug, threed } = this.state;
323
- var { width, height } = this.bounds;
324
- // ios에서 width, height에 소수점이 있으면 3d를 표현하지 못하는 문제가 있어 정수화
190
+ const { left, top, debug, threed } = this.state;
191
+ let { width, height } = this.bounds;
325
192
  width = Math.floor(width);
326
193
  height = Math.floor(height);
327
194
  if (threed) {
328
- if (!this._scene3d) {
195
+ if (!this.sceneManager.scene) {
329
196
  this.init_scene3d();
330
197
  this.render_threed();
331
198
  }
332
- if (this._noSupportWebgl) {
199
+ if (this.rendererManager.noSupportWebgl) {
333
200
  this._showWebglNoSupportText(ctx);
334
201
  return;
335
202
  }
336
- if (!this._renderer3d) {
203
+ if (!this.rendererManager.renderer) {
337
204
  return;
338
205
  }
339
- var { width: rendererWidth, height: rendererHeight } = this._renderer3d.getSize(new THREE.Vector2());
340
- ctx.drawImage(this._renderer3d.domElement, 0, 0, rendererWidth, rendererHeight, left, top, width, height);
206
+ const { width: rw, height: rh } = this.rendererManager.getSize();
207
+ ctx.drawImage(this.rendererManager.domElement, 0, 0, rw, rh, left, top, width, height);
341
208
  if (debug) {
342
209
  ctx.font = 100 + 'px Arial';
343
210
  ctx.textAlign = 'center';
@@ -351,10 +218,8 @@ let ThreeContainer = class ThreeContainer extends Container {
351
218
  }
352
219
  }
353
220
  dispose() {
354
- var _a;
355
221
  this.root.off('redraw', this.onredraw, this);
356
- this.disposeCSS3DScene();
357
- (_a = this.composer) === null || _a === void 0 ? void 0 : _a.dispose();
222
+ this.rendererManager.disposeCSS3DScene();
358
223
  this.destroy_scene3d();
359
224
  super.dispose();
360
225
  }
@@ -365,29 +230,18 @@ let ThreeContainer = class ThreeContainer extends Container {
365
230
  return NATURE;
366
231
  }
367
232
  getObjectByRaycast() {
368
- var intersects = this.getObjectsByRaycast();
369
- if (intersects && intersects.length > 0) {
370
- var object = intersects[0].object;
371
- while (object) {
372
- if (object.userData.context) {
373
- return object;
374
- }
375
- object = object.parent;
376
- }
377
- }
233
+ if (!this.cameraManager.camera || !this.sceneManager.scene)
234
+ return;
235
+ return this.eventManager.getObjectByRaycast(this.cameraManager.camera, this.sceneManager.scene);
378
236
  }
379
237
  getObjectsByRaycast() {
380
- var vector = this._mouse;
381
- if (!this._camera) {
238
+ if (!this.cameraManager.camera || !this.sceneManager.scene)
382
239
  return;
383
- }
384
- this._raycaster.setFromCamera(vector, this._camera);
385
- var intersects = this._raycaster.intersectObjects(this._scene3d.children, true);
386
- return intersects;
240
+ return this.eventManager.getObjectsByRaycast(this.cameraManager.camera, this.sceneManager.scene);
387
241
  }
388
242
  _showWebglNoSupportText(context) {
389
243
  context.save();
390
- var { width, height } = this.state;
244
+ const { width, height } = this.state;
391
245
  context.font = width / 20 + 'px Arial';
392
246
  context.textAlign = 'center';
393
247
  context.fillText(WEBGL_NO_SUPPORT_TEXT, width / 2 - width / 40, height / 2);
@@ -398,141 +252,95 @@ let ThreeContainer = class ThreeContainer extends Container {
398
252
  if (after.hasOwnProperty('width') || after.hasOwnProperty('height') || after.hasOwnProperty('threed'))
399
253
  this.destroy_scene3d();
400
254
  if (after.hasOwnProperty('autoRotate')) {
401
- if (this._controls) {
402
- this._controls.doAutoRotate(after.autoRotate);
403
- }
255
+ this.controlsManager.setAutoRotate(after.autoRotate);
404
256
  }
405
257
  if (after.hasOwnProperty('fov') ||
406
258
  after.hasOwnProperty('near') ||
407
259
  after.hasOwnProperty('far') ||
408
260
  after.hasOwnProperty('zoom')) {
409
- if (this._camera) {
410
- const { near, far, zoom, fov } = this.state;
411
- this._camera.near = near;
412
- this._camera.far = far;
413
- this._camera.zoom = zoom * 0.01;
414
- this._camera.fov = fov;
415
- this._camera.updateProjectionMatrix();
416
- this._controls.cameraChanged = true;
417
- }
418
- }
419
- }
420
- onmousedown(e) {
421
- if (this._controls) {
422
- this._controls.onMouseDown(e);
261
+ const { near, far, zoom, fov } = this.state;
262
+ this.cameraManager.updateProperties({ near, far, zoom, fov });
263
+ this.controlsManager.markCameraChanged();
423
264
  }
424
265
  }
266
+ onmousedown(e) { }
425
267
  onmouseup(e) {
426
- var _a;
427
- if (this._controls) {
428
- if (this._lastFocused) {
429
- ;
430
- this._lastFocused._focused = false;
431
- }
268
+ if (this.controlsManager.isActive) {
432
269
  const { left, top, width, height } = this.state;
433
- var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
434
- this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
435
- this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
436
- var object = this.getObjectByRaycast();
437
- var realObject = object === null || object === void 0 ? void 0 : object.userData.context;
438
- if (realObject) {
439
- ;
440
- realObject._focused = true;
441
- realObject._focusedAt = performance.now();
442
- this._lastFocused = realObject;
443
- (_a = realObject.component) === null || _a === void 0 ? void 0 : _a.trigger('click', e);
444
- }
270
+ const pointer = this.transcoordC2S(e.offsetX, e.offsetY);
271
+ this.eventManager.updateMouseNDC(pointer.x, pointer.y, left, top, width, height);
272
+ this.eventManager.handleClick(this.cameraManager.camera, this.sceneManager.scene, e);
445
273
  e.stopPropagation();
446
274
  }
447
275
  }
448
276
  onmousemove(e) {
449
- var _a, _b;
450
- if (this._controls) {
277
+ if (this.controlsManager.isActive) {
451
278
  const { left, top, width, height } = this.state;
452
- var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
453
- this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
454
- this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
455
- var object = this.getObjectByRaycast();
456
- var realObject = object === null || object === void 0 ? void 0 : object.userData.context;
457
- if (realObject !== this._lastHovered) {
458
- if (this._lastHovered) {
459
- (_a = this._lastHovered.component) === null || _a === void 0 ? void 0 : _a.trigger('mouseleave', e);
460
- delete this._lastHovered;
461
- }
462
- if (realObject) {
463
- this._lastHovered = realObject;
464
- (_b = this._lastHovered.component) === null || _b === void 0 ? void 0 : _b.trigger('mouseenter', e);
465
- }
466
- }
467
- this._controls.onMouseMove(e);
279
+ const pointer = this.transcoordC2S(e.offsetX, e.offsetY);
280
+ this.eventManager.updateMouseNDC(pointer.x, pointer.y, left, top, width, height);
281
+ this.eventManager.handleHover(this.cameraManager.camera, this.sceneManager.scene, e);
468
282
  e.stopPropagation();
469
283
  }
470
284
  }
471
285
  onmouseleave(e) { }
472
286
  onwheel(e) {
473
- if (this._controls) {
287
+ if (this.controlsManager.isActive) {
474
288
  this.handleMouseWheel(e);
475
289
  e.stopPropagation();
476
290
  }
477
291
  }
478
292
  ondblclick(e) {
479
- if (this._controls) {
293
+ if (this.controlsManager.isActive) {
480
294
  this.setState('zoom', this.getState('zoom'));
481
- this._controls.reset();
295
+ this.controlsManager.reset();
482
296
  e.stopPropagation();
483
297
  }
484
298
  }
299
+ // things-scene 이벤트 → ControlsManager (orbit/pan 처리)
485
300
  ondragstart(e) {
486
- if (this._controls) {
487
- var pointer = this.transcoordC2S(e.offsetX, e.offsetY);
488
- var { left, top, width, height } = this.bounds;
489
- this._mouse.x = ((pointer.x - left) / width) * 2 - 1;
490
- this._mouse.y = -((pointer.y - top) / height) * 2 + 1;
491
- this._controls.onDragStart(e);
301
+ if (this.controlsManager.isActive) {
302
+ this.controlsManager.onDragStart(e);
492
303
  e.stopPropagation();
493
304
  }
494
305
  }
495
306
  ondragmove(e) {
496
- if (this._controls) {
497
- this._controls.cameraChanged = true;
498
- this._controls.onDragMove(e);
307
+ if (this.controlsManager.isActive) {
308
+ this.controlsManager.onDragMove(e);
499
309
  e.stopPropagation();
500
310
  }
501
311
  }
502
312
  ondragend(e) {
503
- if (this._controls) {
504
- this._controls.cameraChanged = true;
505
- this._controls.onDragEnd(e);
313
+ if (this.controlsManager.isActive) {
314
+ this.controlsManager.onDragEnd(e);
506
315
  e.stopPropagation();
507
316
  }
508
317
  }
509
318
  ontouchstart(e) {
510
- if (this._controls) {
511
- this._controls.onTouchStart(e);
319
+ if (this.controlsManager.isActive) {
320
+ this.controlsManager.onTouchStart(e);
512
321
  e.stopPropagation();
513
322
  }
514
323
  }
515
324
  onpan(e) {
516
- if (this._controls) {
517
- this._controls.cameraChanged = true;
518
- this._controls.onTouchMove(e);
325
+ if (this.controlsManager.isActive) {
326
+ this.controlsManager.onTouchMove(e);
519
327
  e.stopPropagation();
520
328
  }
521
329
  }
522
330
  ontouchend(e) {
523
- if (this._controls) {
524
- this._controls.onTouchEnd(e);
331
+ if (this.controlsManager.isActive) {
332
+ this.controlsManager.onTouchEnd(e);
525
333
  e.stopPropagation();
526
334
  }
527
335
  }
528
336
  onkeydown(e) {
529
- if (this._controls) {
530
- this._controls.onKeyDown(e);
337
+ if (this.controlsManager.isActive) {
338
+ this.controlsManager.onKeyDown(e);
531
339
  e.stopPropagation();
532
340
  }
533
341
  }
534
342
  onpinch(e) {
535
- if (this._controls) {
343
+ if (this.controlsManager.isActive) {
536
344
  var zoom = this.getState('zoom');
537
345
  //@ts-ignore
538
346
  zoom *= e.scale;
@@ -543,13 +351,11 @@ let ThreeContainer = class ThreeContainer extends Container {
543
351
  }
544
352
  }
545
353
  ondoubletap() {
546
- this._controls.reset();
354
+ this.controlsManager.reset();
547
355
  }
548
356
  handleMouseWheel(event) {
549
- var delta = 0;
550
357
  var zoom = this.getState('zoom');
551
- delta = -event.deltaY;
552
- zoom += delta * 0.1;
358
+ zoom += -event.deltaY * 0.1;
553
359
  if (zoom < 100)
554
360
  zoom = 100;
555
361
  this.setState('zoom', zoom);