@thanhthbm/scene-editor 0.1.0

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 (136) hide show
  1. package/README.md +169 -0
  2. package/dist/index.css +921 -0
  3. package/dist/index.js +14076 -0
  4. package/package.json +49 -0
  5. package/src/editor/css/main.css +1030 -0
  6. package/src/editor/js/Animation.js +618 -0
  7. package/src/editor/js/AnimationResizer.js +73 -0
  8. package/src/editor/js/Command.js +40 -0
  9. package/src/editor/js/Config.js +86 -0
  10. package/src/editor/js/Editor.js +1006 -0
  11. package/src/editor/js/EditorControls.js +489 -0
  12. package/src/editor/js/GLTFImportDialog.js +112 -0
  13. package/src/editor/js/History.js +321 -0
  14. package/src/editor/js/Loader.js +1162 -0
  15. package/src/editor/js/LoaderUtils.js +90 -0
  16. package/src/editor/js/Menubar.Add.js +559 -0
  17. package/src/editor/js/Menubar.Edit.js +155 -0
  18. package/src/editor/js/Menubar.File.js +585 -0
  19. package/src/editor/js/Menubar.Help.js +73 -0
  20. package/src/editor/js/Menubar.Render.js +858 -0
  21. package/src/editor/js/Menubar.Status.js +51 -0
  22. package/src/editor/js/Menubar.View.js +193 -0
  23. package/src/editor/js/Menubar.js +29 -0
  24. package/src/editor/js/Player.js +53 -0
  25. package/src/editor/js/Resizer.js +65 -0
  26. package/src/editor/js/Script.js +532 -0
  27. package/src/editor/js/Selector.js +129 -0
  28. package/src/editor/js/Sidebar.Geometry.BoxGeometry.js +121 -0
  29. package/src/editor/js/Sidebar.Geometry.BufferGeometry.js +124 -0
  30. package/src/editor/js/Sidebar.Geometry.CapsuleGeometry.js +109 -0
  31. package/src/editor/js/Sidebar.Geometry.CircleGeometry.js +97 -0
  32. package/src/editor/js/Sidebar.Geometry.CylinderGeometry.js +121 -0
  33. package/src/editor/js/Sidebar.Geometry.DodecahedronGeometry.js +73 -0
  34. package/src/editor/js/Sidebar.Geometry.ExtrudeGeometry.js +196 -0
  35. package/src/editor/js/Sidebar.Geometry.IcosahedronGeometry.js +73 -0
  36. package/src/editor/js/Sidebar.Geometry.LatheGeometry.js +98 -0
  37. package/src/editor/js/Sidebar.Geometry.Modifiers.js +73 -0
  38. package/src/editor/js/Sidebar.Geometry.OctahedronGeometry.js +74 -0
  39. package/src/editor/js/Sidebar.Geometry.PlaneGeometry.js +97 -0
  40. package/src/editor/js/Sidebar.Geometry.RingGeometry.js +121 -0
  41. package/src/editor/js/Sidebar.Geometry.ShapeGeometry.js +76 -0
  42. package/src/editor/js/Sidebar.Geometry.SphereGeometry.js +133 -0
  43. package/src/editor/js/Sidebar.Geometry.TetrahedronGeometry.js +74 -0
  44. package/src/editor/js/Sidebar.Geometry.TextGeometry.js +136 -0
  45. package/src/editor/js/Sidebar.Geometry.TorusGeometry.js +109 -0
  46. package/src/editor/js/Sidebar.Geometry.TorusKnotGeometry.js +121 -0
  47. package/src/editor/js/Sidebar.Geometry.TubeGeometry.js +135 -0
  48. package/src/editor/js/Sidebar.Geometry.js +471 -0
  49. package/src/editor/js/Sidebar.Material.BooleanProperty.js +60 -0
  50. package/src/editor/js/Sidebar.Material.ColorProperty.js +87 -0
  51. package/src/editor/js/Sidebar.Material.ConstantProperty.js +62 -0
  52. package/src/editor/js/Sidebar.Material.MapProperty.js +277 -0
  53. package/src/editor/js/Sidebar.Material.NumberProperty.js +60 -0
  54. package/src/editor/js/Sidebar.Material.Program.js +73 -0
  55. package/src/editor/js/Sidebar.Material.RangeValueProperty.js +63 -0
  56. package/src/editor/js/Sidebar.Material.js +751 -0
  57. package/src/editor/js/Sidebar.Object.js +892 -0
  58. package/src/editor/js/Sidebar.Project.App.js +218 -0
  59. package/src/editor/js/Sidebar.Project.Materials.js +82 -0
  60. package/src/editor/js/Sidebar.Project.Renderer.js +193 -0
  61. package/src/editor/js/Sidebar.Project.Resources.js +242 -0
  62. package/src/editor/js/Sidebar.Project.js +21 -0
  63. package/src/editor/js/Sidebar.Properties.js +73 -0
  64. package/src/editor/js/Sidebar.Scene.js +643 -0
  65. package/src/editor/js/Sidebar.Script.js +129 -0
  66. package/src/editor/js/Sidebar.Settings.History.js +146 -0
  67. package/src/editor/js/Sidebar.Settings.Shortcuts.js +198 -0
  68. package/src/editor/js/Sidebar.Settings.js +58 -0
  69. package/src/editor/js/Sidebar.js +41 -0
  70. package/src/editor/js/Storage.js +98 -0
  71. package/src/editor/js/Strings.js +2718 -0
  72. package/src/editor/js/TextureParametersDialog.js +293 -0
  73. package/src/editor/js/Toolbar.js +75 -0
  74. package/src/editor/js/Viewport.Controls.js +98 -0
  75. package/src/editor/js/Viewport.Info.js +144 -0
  76. package/src/editor/js/Viewport.Pathtracer.js +27 -0
  77. package/src/editor/js/Viewport.ViewHelper.js +41 -0
  78. package/src/editor/js/Viewport.XR.js +7 -0
  79. package/src/editor/js/Viewport.js +982 -0
  80. package/src/editor/js/commands/AddObjectCommand.js +68 -0
  81. package/src/editor/js/commands/AddScriptCommand.js +75 -0
  82. package/src/editor/js/commands/Commands.js +24 -0
  83. package/src/editor/js/commands/MoveObjectCommand.js +117 -0
  84. package/src/editor/js/commands/MultiCmdsCommand.js +85 -0
  85. package/src/editor/js/commands/RemoveObjectCommand.js +88 -0
  86. package/src/editor/js/commands/RemoveScriptCommand.js +81 -0
  87. package/src/editor/js/commands/SetColorCommand.js +73 -0
  88. package/src/editor/js/commands/SetGeometryCommand.js +86 -0
  89. package/src/editor/js/commands/SetGeometryValueCommand.js +70 -0
  90. package/src/editor/js/commands/SetMaterialColorCommand.js +87 -0
  91. package/src/editor/js/commands/SetMaterialCommand.js +80 -0
  92. package/src/editor/js/commands/SetMaterialMapCommand.js +144 -0
  93. package/src/editor/js/commands/SetMaterialRangeCommand.js +92 -0
  94. package/src/editor/js/commands/SetMaterialValueCommand.js +91 -0
  95. package/src/editor/js/commands/SetMaterialVectorCommand.js +88 -0
  96. package/src/editor/js/commands/SetPositionCommand.js +84 -0
  97. package/src/editor/js/commands/SetRotationCommand.js +84 -0
  98. package/src/editor/js/commands/SetScaleCommand.js +84 -0
  99. package/src/editor/js/commands/SetSceneCommand.js +104 -0
  100. package/src/editor/js/commands/SetScriptValueCommand.js +80 -0
  101. package/src/editor/js/commands/SetShadowValueCommand.js +73 -0
  102. package/src/editor/js/commands/SetTextureParametersCommand.js +143 -0
  103. package/src/editor/js/commands/SetUuidCommand.js +70 -0
  104. package/src/editor/js/commands/SetValueCommand.js +75 -0
  105. package/src/editor/js/libs/acorn/acorn.js +3236 -0
  106. package/src/editor/js/libs/acorn/acorn_loose.js +1299 -0
  107. package/src/editor/js/libs/acorn/walk.js +344 -0
  108. package/src/editor/js/libs/app/index.html +51 -0
  109. package/src/editor/js/libs/app.js +14 -0
  110. package/src/editor/js/libs/codemirror/addon/dialog.css +32 -0
  111. package/src/editor/js/libs/codemirror/addon/dialog.js +163 -0
  112. package/src/editor/js/libs/codemirror/addon/show-hint.css +36 -0
  113. package/src/editor/js/libs/codemirror/addon/show-hint.js +529 -0
  114. package/src/editor/js/libs/codemirror/addon/tern.css +87 -0
  115. package/src/editor/js/libs/codemirror/addon/tern.js +750 -0
  116. package/src/editor/js/libs/codemirror/codemirror.css +344 -0
  117. package/src/editor/js/libs/codemirror/codemirror.js +9849 -0
  118. package/src/editor/js/libs/codemirror/mode/glsl.js +233 -0
  119. package/src/editor/js/libs/codemirror/mode/javascript.js +959 -0
  120. package/src/editor/js/libs/codemirror/theme/monokai.css +41 -0
  121. package/src/editor/js/libs/esprima.js +6401 -0
  122. package/src/editor/js/libs/jsonlint.js +453 -0
  123. package/src/editor/js/libs/signals.min.js +14 -0
  124. package/src/editor/js/libs/tern-threejs/build-defs.js +233 -0
  125. package/src/editor/js/libs/ternjs/comment.js +87 -0
  126. package/src/editor/js/libs/ternjs/def.js +588 -0
  127. package/src/editor/js/libs/ternjs/doc_comment.js +401 -0
  128. package/src/editor/js/libs/ternjs/infer.js +1635 -0
  129. package/src/editor/js/libs/ternjs/polyfill.js +80 -0
  130. package/src/editor/js/libs/ternjs/signal.js +26 -0
  131. package/src/editor/js/libs/ternjs/tern.js +993 -0
  132. package/src/editor/js/libs/ui.js +1305 -0
  133. package/src/editor/js/libs/ui.three.js +946 -0
  134. package/src/events.js +273 -0
  135. package/src/index.js +284 -0
  136. package/src/presets/machines.js +239 -0
@@ -0,0 +1,489 @@
1
+ import * as THREE from 'three';
2
+
3
+ class EditorControls extends THREE.EventDispatcher {
4
+
5
+ constructor( object ) {
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
+ var domElement = null;
38
+
39
+ // events
40
+
41
+ var changeEvent = { type: 'change' };
42
+
43
+ this.setCamera = function ( camera ) {
44
+
45
+ object = camera;
46
+
47
+ };
48
+
49
+ this.focus = function ( target ) {
50
+
51
+ var distance;
52
+
53
+ box.setFromObject( target );
54
+
55
+ if ( box.isEmpty() === false ) {
56
+
57
+ box.getCenter( center );
58
+ distance = box.getBoundingSphere( sphere ).radius;
59
+
60
+ } else {
61
+
62
+ // Focusing on an Group, AmbientLight, etc
63
+
64
+ center.setFromMatrixPosition( target.matrixWorld );
65
+ distance = 0.1;
66
+
67
+ }
68
+
69
+ delta.set( 0, 0, 1 );
70
+ delta.applyQuaternion( object.quaternion );
71
+ delta.multiplyScalar( distance * 4 );
72
+
73
+ object.position.copy( center ).add( delta );
74
+
75
+ if ( object.isOrthographicCamera ) {
76
+
77
+ object.zoom = ( object.top - object.bottom ) / ( distance * 2 );
78
+ object.updateProjectionMatrix();
79
+
80
+ }
81
+
82
+ scope.dispatchEvent( changeEvent );
83
+
84
+ };
85
+
86
+ this.pan = function ( delta ) {
87
+
88
+ var distance = object.isOrthographicCamera
89
+ ? ( object.top - object.bottom ) / object.zoom
90
+ : object.position.distanceTo( center );
91
+
92
+ delta.multiplyScalar( distance * scope.panSpeed );
93
+ delta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );
94
+
95
+ object.position.add( delta );
96
+ center.add( delta );
97
+
98
+ scope.dispatchEvent( changeEvent );
99
+
100
+ };
101
+
102
+ this.zoom = function ( delta ) {
103
+
104
+ if ( object.isOrthographicCamera ) {
105
+
106
+ object.zoom = Math.max( 0.0001, object.zoom * Math.pow( 0.95, delta.z ) );
107
+ object.updateProjectionMatrix();
108
+
109
+ } else {
110
+
111
+ var distance = object.position.distanceTo( center );
112
+
113
+ delta.multiplyScalar( distance * scope.zoomSpeed );
114
+
115
+ if ( delta.length() > distance ) return;
116
+
117
+ delta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );
118
+
119
+ object.position.add( delta );
120
+
121
+ }
122
+
123
+ scope.dispatchEvent( changeEvent );
124
+
125
+ };
126
+
127
+ this.rotate = function ( delta ) {
128
+
129
+ vector.copy( object.position ).sub( center );
130
+
131
+ spherical.setFromVector3( vector );
132
+
133
+ spherical.theta += delta.x * scope.rotationSpeed;
134
+ spherical.phi += delta.y * scope.rotationSpeed;
135
+
136
+ spherical.makeSafe();
137
+
138
+ vector.setFromSpherical( spherical );
139
+
140
+ object.position.copy( center ).add( vector );
141
+
142
+ object.lookAt( center );
143
+
144
+ scope.dispatchEvent( changeEvent );
145
+
146
+ };
147
+
148
+ //
149
+
150
+ function onPointerDown( event ) {
151
+
152
+ if ( scope.enabled === false ) return;
153
+
154
+ if ( pointers.length === 0 ) {
155
+
156
+ domElement.setPointerCapture( event.pointerId );
157
+
158
+ domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
159
+ domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
160
+
161
+ }
162
+
163
+ //
164
+
165
+ if ( isTrackingPointer( event ) ) return;
166
+
167
+ //
168
+
169
+ addPointer( event );
170
+
171
+ if ( event.pointerType === 'touch' ) {
172
+
173
+ onTouchStart( event );
174
+
175
+ } else {
176
+
177
+ onMouseDown( event );
178
+
179
+ }
180
+
181
+ }
182
+
183
+ function onPointerMove( event ) {
184
+
185
+ if ( scope.enabled === false ) return;
186
+
187
+ if ( event.pointerType === 'touch' ) {
188
+
189
+ onTouchMove( event );
190
+
191
+ } else {
192
+
193
+ onMouseMove( event );
194
+
195
+ }
196
+
197
+ }
198
+
199
+ function onPointerUp( event ) {
200
+
201
+ removePointer( event );
202
+
203
+ switch ( pointers.length ) {
204
+
205
+ case 0:
206
+
207
+ domElement.releasePointerCapture( event.pointerId );
208
+
209
+ domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
210
+ domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
211
+
212
+ break;
213
+
214
+ case 1:
215
+
216
+ var pointerId = pointers[ 0 ];
217
+ var position = pointerPositions[ pointerId ];
218
+
219
+ // minimal placeholder event - allows state correction on pointer-up
220
+ onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );
221
+
222
+ break;
223
+
224
+ }
225
+
226
+ }
227
+
228
+ // mouse
229
+
230
+ function onMouseDown( event ) {
231
+
232
+ if ( event.button === 0 ) {
233
+
234
+ state = STATE.ROTATE;
235
+
236
+ } else if ( event.button === 1 ) {
237
+
238
+ state = STATE.ZOOM;
239
+
240
+ } else if ( event.button === 2 ) {
241
+
242
+ state = STATE.PAN;
243
+
244
+ }
245
+
246
+ pointerOld.set( event.clientX, event.clientY );
247
+
248
+ }
249
+
250
+ function onMouseMove( event ) {
251
+
252
+ pointer.set( event.clientX, event.clientY );
253
+
254
+ var movementX = pointer.x - pointerOld.x;
255
+ var movementY = pointer.y - pointerOld.y;
256
+
257
+ if ( state === STATE.ROTATE ) {
258
+
259
+ scope.rotate( delta.set( - movementX, - movementY, 0 ) );
260
+
261
+ } else if ( state === STATE.ZOOM ) {
262
+
263
+ scope.zoom( delta.set( 0, 0, movementY ) );
264
+
265
+ } else if ( state === STATE.PAN ) {
266
+
267
+ scope.pan( delta.set( - movementX, movementY, 0 ) );
268
+
269
+ }
270
+
271
+ pointerOld.set( event.clientX, event.clientY );
272
+
273
+ }
274
+
275
+ function onMouseUp() {
276
+
277
+ state = STATE.NONE;
278
+
279
+ }
280
+
281
+ function onMouseWheel( event ) {
282
+
283
+ if ( scope.enabled === false ) return;
284
+
285
+ event.preventDefault();
286
+
287
+ // Normalize deltaY due to https://bugzilla.mozilla.org/show_bug.cgi?id=1392460
288
+ scope.zoom( delta.set( 0, 0, event.deltaY > 0 ? 1 : - 1 ) );
289
+
290
+ }
291
+
292
+ function contextmenu( event ) {
293
+
294
+ event.preventDefault();
295
+
296
+ }
297
+
298
+ this.connect = function ( element ) {
299
+
300
+ if ( domElement !== null ) this.disconnect();
301
+
302
+ domElement = element;
303
+
304
+ domElement.addEventListener( 'contextmenu', contextmenu );
305
+ domElement.addEventListener( 'dblclick', onMouseUp );
306
+ domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
307
+
308
+ domElement.addEventListener( 'pointerdown', onPointerDown );
309
+
310
+ };
311
+
312
+ this.disconnect = function () {
313
+
314
+ domElement.removeEventListener( 'contextmenu', contextmenu );
315
+ domElement.removeEventListener( 'dblclick', onMouseUp );
316
+ domElement.removeEventListener( 'wheel', onMouseWheel );
317
+
318
+ domElement.removeEventListener( 'pointerdown', onPointerDown );
319
+
320
+ domElement = null;
321
+
322
+ };
323
+
324
+ // touch
325
+
326
+ var touches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
327
+ var prevTouches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
328
+
329
+ var prevDistance = null;
330
+
331
+ function onTouchStart( event ) {
332
+
333
+ trackPointer( event );
334
+
335
+ switch ( pointers.length ) {
336
+
337
+ case 1:
338
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
339
+ touches[ 1 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
340
+ break;
341
+
342
+ case 2:
343
+
344
+ var position = getSecondPointerPosition( event );
345
+
346
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
347
+ touches[ 1 ].set( position.x, position.y, 0 ).divideScalar( window.devicePixelRatio );
348
+ prevDistance = touches[ 0 ].distanceTo( touches[ 1 ] );
349
+ break;
350
+
351
+ }
352
+
353
+ prevTouches[ 0 ].copy( touches[ 0 ] );
354
+ prevTouches[ 1 ].copy( touches[ 1 ] );
355
+
356
+ }
357
+
358
+
359
+ function onTouchMove( event ) {
360
+
361
+ trackPointer( event );
362
+
363
+ function getClosest( touch, touches ) {
364
+
365
+ var closest = touches[ 0 ];
366
+
367
+ for ( var touch2 of touches ) {
368
+
369
+ if ( closest.distanceTo( touch ) > touch2.distanceTo( touch ) ) closest = touch2;
370
+
371
+ }
372
+
373
+ return closest;
374
+
375
+ }
376
+
377
+ switch ( pointers.length ) {
378
+
379
+ case 1:
380
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
381
+ touches[ 1 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
382
+ scope.rotate( touches[ 0 ].sub( getClosest( touches[ 0 ], prevTouches ) ).multiplyScalar( - 1 ) );
383
+ break;
384
+
385
+ case 2:
386
+
387
+ var position = getSecondPointerPosition( event );
388
+
389
+ touches[ 0 ].set( event.pageX, event.pageY, 0 ).divideScalar( window.devicePixelRatio );
390
+ touches[ 1 ].set( position.x, position.y, 0 ).divideScalar( window.devicePixelRatio );
391
+ // Divide by 10 to offset inherent over-sensitivity (https://github.com/mrdoob/three.js/issues/32442)
392
+ var distance = touches[ 0 ].distanceTo( touches[ 1 ] ) / 10;
393
+ scope.zoom( delta.set( 0, 0, prevDistance - distance ) );
394
+ prevDistance = distance;
395
+
396
+
397
+ var offset0 = touches[ 0 ].clone().sub( getClosest( touches[ 0 ], prevTouches ) );
398
+ var offset1 = touches[ 1 ].clone().sub( getClosest( touches[ 1 ], prevTouches ) );
399
+ offset0.x = - offset0.x;
400
+ offset1.x = - offset1.x;
401
+
402
+ scope.pan( offset0.add( offset1 ) );
403
+
404
+ break;
405
+
406
+ }
407
+
408
+ prevTouches[ 0 ].copy( touches[ 0 ] );
409
+ prevTouches[ 1 ].copy( touches[ 1 ] );
410
+
411
+ }
412
+
413
+ function addPointer( event ) {
414
+
415
+ pointers.push( event.pointerId );
416
+
417
+ }
418
+
419
+ function removePointer( event ) {
420
+
421
+ delete pointerPositions[ event.pointerId ];
422
+
423
+ for ( var i = 0; i < pointers.length; i ++ ) {
424
+
425
+ if ( pointers[ i ] == event.pointerId ) {
426
+
427
+ pointers.splice( i, 1 );
428
+ return;
429
+
430
+ }
431
+
432
+ }
433
+
434
+ }
435
+
436
+ function isTrackingPointer( event ) {
437
+
438
+ for ( var i = 0; i < pointers.length; i ++ ) {
439
+
440
+ if ( pointers[ i ] == event.pointerId ) return true;
441
+
442
+ }
443
+
444
+ return false;
445
+
446
+ }
447
+
448
+ function trackPointer( event ) {
449
+
450
+ var position = pointerPositions[ event.pointerId ];
451
+
452
+ if ( position === undefined ) {
453
+
454
+ position = new THREE.Vector2();
455
+ pointerPositions[ event.pointerId ] = position;
456
+
457
+ }
458
+
459
+ position.set( event.pageX, event.pageY );
460
+
461
+ }
462
+
463
+ function getSecondPointerPosition( event ) {
464
+
465
+ var pointerId = ( event.pointerId === pointers[ 0 ] ) ? pointers[ 1 ] : pointers[ 0 ];
466
+
467
+ return pointerPositions[ pointerId ];
468
+
469
+ }
470
+
471
+ }
472
+
473
+ fromJSON( json ) {
474
+
475
+ if ( json.center !== undefined ) this.center.fromArray( json.center );
476
+
477
+ }
478
+
479
+ toJSON() {
480
+
481
+ return {
482
+ center: this.center.toArray()
483
+ };
484
+
485
+ }
486
+
487
+ }
488
+
489
+ export { EditorControls };
@@ -0,0 +1,112 @@
1
+ import { UIRow, UIText, UICheckbox, UIButton } from './libs/ui.js';
2
+
3
+ class GLTFImportDialog {
4
+
5
+ constructor( strings ) {
6
+
7
+ this.strings = strings;
8
+
9
+ const dom = document.createElement( 'div' );
10
+ dom.className = 'Dialog';
11
+ this.dom = dom;
12
+
13
+ const background = document.createElement( 'div' );
14
+ background.className = 'Dialog-background';
15
+ background.addEventListener( 'click', () => this.cancel() );
16
+ dom.appendChild( background );
17
+
18
+ const content = document.createElement( 'div' );
19
+ content.className = 'Dialog-content';
20
+ dom.appendChild( content );
21
+
22
+ // Title
23
+
24
+ const titleBar = document.createElement( 'div' );
25
+ titleBar.className = 'Dialog-title';
26
+ titleBar.textContent = strings.getKey( 'dialog/gltf/title' );
27
+ content.appendChild( titleBar );
28
+
29
+ // Body
30
+
31
+ const body = document.createElement( 'div' );
32
+ body.className = 'Dialog-body';
33
+ content.appendChild( body );
34
+
35
+ // As Scene Checkbox
36
+
37
+ const asSceneRow = new UIRow();
38
+ body.appendChild( asSceneRow.dom );
39
+
40
+ this.asSceneCheckbox = new UICheckbox( false );
41
+ asSceneRow.add( this.asSceneCheckbox );
42
+
43
+ asSceneRow.add( new UIText( strings.getKey( 'dialog/gltf/asScene' ) ).setMarginLeft( '6px' ) );
44
+
45
+ // Buttons
46
+
47
+ const buttonsRow = document.createElement( 'div' );
48
+ buttonsRow.className = 'Dialog-buttons';
49
+ body.appendChild( buttonsRow );
50
+
51
+ const okButton = new UIButton( strings.getKey( 'dialog/ok' ) );
52
+ okButton.setWidth( '80px' );
53
+ okButton.onClick( () => this.confirm() );
54
+ buttonsRow.appendChild( okButton.dom );
55
+
56
+ const cancelButton = new UIButton( strings.getKey( 'dialog/cancel' ) );
57
+ cancelButton.setWidth( '80px' );
58
+ cancelButton.setMarginLeft( '8px' );
59
+ cancelButton.onClick( () => this.cancel() );
60
+ buttonsRow.appendChild( cancelButton.dom );
61
+
62
+ // Promise handlers
63
+
64
+ this.resolve = null;
65
+ this.reject = null;
66
+
67
+ }
68
+
69
+ show() {
70
+
71
+ document.body.appendChild( this.dom );
72
+
73
+ return new Promise( ( resolve, reject ) => {
74
+
75
+ this.resolve = resolve;
76
+ this.reject = reject;
77
+
78
+ } );
79
+
80
+ }
81
+
82
+ confirm() {
83
+
84
+ const result = {
85
+ asScene: this.asSceneCheckbox.getValue()
86
+ };
87
+
88
+ this.dom.remove();
89
+
90
+ if ( this.resolve ) {
91
+
92
+ this.resolve( result );
93
+
94
+ }
95
+
96
+ }
97
+
98
+ cancel() {
99
+
100
+ this.dom.remove();
101
+
102
+ if ( this.reject ) {
103
+
104
+ this.reject( new Error( 'Import cancelled' ) );
105
+
106
+ }
107
+
108
+ }
109
+
110
+ }
111
+
112
+ export { GLTFImportDialog };