@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,129 @@
1
+ import { UIPanel, UIBreak, UIButton, UIRow, UIInput } from './libs/ui.js';
2
+
3
+ import { AddScriptCommand } from './commands/AddScriptCommand.js';
4
+ import { SetScriptValueCommand } from './commands/SetScriptValueCommand.js';
5
+ import { RemoveScriptCommand } from './commands/RemoveScriptCommand.js';
6
+
7
+ function SidebarScript( editor ) {
8
+
9
+ const strings = editor.strings;
10
+
11
+ const signals = editor.signals;
12
+
13
+ const container = new UIPanel();
14
+ container.setBorderTop( '0' );
15
+ container.setPaddingTop( '20px' );
16
+ container.setDisplay( 'none' );
17
+
18
+ //
19
+
20
+ const scriptsContainer = new UIRow();
21
+ container.add( scriptsContainer );
22
+
23
+ const newScript = new UIButton( strings.getKey( 'sidebar/script/new' ) );
24
+ newScript.onClick( function () {
25
+
26
+ const script = { name: '', source: 'function update( event ) {}' };
27
+ editor.execute( new AddScriptCommand( editor, editor.selected, script ) );
28
+
29
+ } );
30
+ container.add( newScript );
31
+
32
+ /*
33
+ let loadScript = new UI.Button( 'Load' );
34
+ loadScript.setMarginLeft( '4px' );
35
+ container.add( loadScript );
36
+ */
37
+
38
+ //
39
+
40
+ function update() {
41
+
42
+ scriptsContainer.clear();
43
+ scriptsContainer.setDisplay( 'none' );
44
+
45
+ const object = editor.selected;
46
+
47
+ if ( object === null ) {
48
+
49
+ return;
50
+
51
+ }
52
+
53
+ const scripts = editor.scripts[ object.uuid ];
54
+
55
+ if ( scripts !== undefined && scripts.length > 0 ) {
56
+
57
+ scriptsContainer.setDisplay( 'block' );
58
+
59
+ for ( let i = 0; i < scripts.length; i ++ ) {
60
+
61
+ ( function ( object, script ) {
62
+
63
+ const name = new UIInput( script.name ).setWidth( '130px' ).setFontSize( '12px' );
64
+ name.onChange( function () {
65
+
66
+ editor.execute( new SetScriptValueCommand( editor, editor.selected, script, 'name', this.getValue() ) );
67
+
68
+ } );
69
+ scriptsContainer.add( name );
70
+
71
+ const edit = new UIButton( strings.getKey( 'sidebar/script/edit' ) );
72
+ edit.setMarginLeft( '4px' );
73
+ edit.onClick( function () {
74
+
75
+ signals.editScript.dispatch( object, script );
76
+
77
+ } );
78
+ scriptsContainer.add( edit );
79
+
80
+ const remove = new UIButton( strings.getKey( 'sidebar/script/remove' ) );
81
+ remove.setMarginLeft( '4px' );
82
+ remove.onClick( function () {
83
+
84
+ if ( confirm( strings.getKey( 'prompt/script/remove' ) ) ) {
85
+
86
+ editor.execute( new RemoveScriptCommand( editor, editor.selected, script ) );
87
+
88
+ }
89
+
90
+ } );
91
+ scriptsContainer.add( remove );
92
+
93
+ scriptsContainer.add( new UIBreak() );
94
+
95
+ } )( object, scripts[ i ] );
96
+
97
+ }
98
+
99
+ }
100
+
101
+ }
102
+
103
+ // signals
104
+
105
+ signals.objectSelected.add( function ( object ) {
106
+
107
+ if ( object !== null && editor.camera !== object ) {
108
+
109
+ container.setDisplay( 'block' );
110
+
111
+ update();
112
+
113
+ } else {
114
+
115
+ container.setDisplay( 'none' );
116
+
117
+ }
118
+
119
+ } );
120
+
121
+ signals.scriptAdded.add( update );
122
+ signals.scriptRemoved.add( update );
123
+ signals.scriptChanged.add( update );
124
+
125
+ return container;
126
+
127
+ }
128
+
129
+ export { SidebarScript };
@@ -0,0 +1,146 @@
1
+
2
+ import { UIButton, UIPanel, UIBreak, UIText } from './libs/ui.js';
3
+ import { UIBoolean, UIOutliner } from './libs/ui.three.js';
4
+
5
+ function SidebarSettingsHistory( editor ) {
6
+
7
+ const strings = editor.strings;
8
+ const signals = editor.signals;
9
+ const config = editor.config;
10
+ const history = editor.history;
11
+
12
+ const container = new UIPanel();
13
+
14
+ container.add( new UIText( strings.getKey( 'sidebar/history' ).toUpperCase() ) );
15
+
16
+ //
17
+
18
+ const persistent = new UIBoolean( config.getKey( 'settings/history' ), strings.getKey( 'sidebar/history/persistent' ) );
19
+ persistent.setPosition( 'absolute' ).setRight( '8px' );
20
+ persistent.onChange( function () {
21
+
22
+ const value = this.getValue();
23
+
24
+ config.setKey( 'settings/history', value );
25
+
26
+ if ( value ) {
27
+
28
+ alert( strings.getKey( 'prompt/history/preserve' ) );
29
+
30
+ const lastUndoCmd = history.undos[ history.undos.length - 1 ];
31
+ const lastUndoId = ( lastUndoCmd !== undefined ) ? lastUndoCmd.id : 0;
32
+ editor.history.enableSerialization( lastUndoId );
33
+
34
+ } else {
35
+
36
+ signals.historyChanged.dispatch();
37
+
38
+ }
39
+
40
+ } );
41
+ container.add( persistent );
42
+
43
+ container.add( new UIBreak(), new UIBreak() );
44
+
45
+ let ignoreObjectSelectedSignal = false;
46
+
47
+ const outliner = new UIOutliner( editor );
48
+ outliner.onChange( function () {
49
+
50
+ ignoreObjectSelectedSignal = true;
51
+
52
+ editor.history.goToState( parseInt( outliner.getValue() ) );
53
+
54
+ ignoreObjectSelectedSignal = false;
55
+
56
+ } );
57
+ container.add( outliner );
58
+
59
+ container.add( new UIBreak() );
60
+
61
+ // Clear History
62
+
63
+ const option = new UIButton( strings.getKey( 'sidebar/history/clear' ) );
64
+ option.onClick( function () {
65
+
66
+ if ( confirm( strings.getKey( 'prompt/history/clear' ) ) ) {
67
+
68
+ editor.history.clear();
69
+
70
+ }
71
+
72
+ } );
73
+ container.add( option );
74
+
75
+ //
76
+
77
+ const refreshUI = function () {
78
+
79
+ const options = [];
80
+
81
+ function buildOption( object ) {
82
+
83
+ const option = document.createElement( 'div' );
84
+ option.value = object.id;
85
+
86
+ return option;
87
+
88
+ }
89
+
90
+ ( function addObjects( objects ) {
91
+
92
+ for ( let i = 0, l = objects.length; i < l; i ++ ) {
93
+
94
+ const object = objects[ i ];
95
+
96
+ const option = buildOption( object );
97
+ option.innerHTML = '&nbsp;' + object.name;
98
+
99
+ options.push( option );
100
+
101
+ }
102
+
103
+ } )( history.undos );
104
+
105
+
106
+ ( function addObjects( objects ) {
107
+
108
+ for ( let i = objects.length - 1; i >= 0; i -- ) {
109
+
110
+ const object = objects[ i ];
111
+
112
+ const option = buildOption( object );
113
+ option.innerHTML = '&nbsp;' + object.name;
114
+ option.style.opacity = 0.3;
115
+
116
+ options.push( option );
117
+
118
+ }
119
+
120
+ } )( history.redos );
121
+
122
+ outliner.setOptions( options );
123
+
124
+ };
125
+
126
+ refreshUI();
127
+
128
+ // events
129
+
130
+ signals.editorCleared.add( refreshUI );
131
+
132
+ signals.historyChanged.add( refreshUI );
133
+ signals.historyChanged.add( function ( cmd ) {
134
+
135
+ if ( ignoreObjectSelectedSignal === true ) return;
136
+
137
+ outliner.setValue( cmd !== undefined ? cmd.id : null );
138
+
139
+ } );
140
+
141
+
142
+ return container;
143
+
144
+ }
145
+
146
+ export { SidebarSettingsHistory };
@@ -0,0 +1,198 @@
1
+ import { UIPanel, UIText, UIRow, UIInput } from './libs/ui.js';
2
+
3
+ import { MultiCmdsCommand } from './commands/MultiCmdsCommand.js';
4
+ import { RemoveObjectCommand } from './commands/RemoveObjectCommand.js';
5
+
6
+ function SidebarSettingsShortcuts( editor ) {
7
+
8
+ const strings = editor.strings;
9
+
10
+ const IS_MAC = navigator.platform.toUpperCase().indexOf( 'MAC' ) >= 0;
11
+
12
+ function isValidKeyBinding( key ) {
13
+
14
+ return key.match( /^[A-Za-z0-9]$/i ); // Can't use z currently due to undo/redo
15
+
16
+ }
17
+
18
+ const config = editor.config;
19
+ const signals = editor.signals;
20
+
21
+ const container = new UIPanel();
22
+
23
+ const headerRow = new UIRow();
24
+ headerRow.add( new UIText( strings.getKey( 'sidebar/settings/shortcuts' ).toUpperCase() ) );
25
+ container.add( headerRow );
26
+
27
+ const shortcuts = [ 'translate', 'rotate', 'scale', 'undo', 'focus', 'perspective', 'orthographic' ];
28
+
29
+ function createShortcutInput( name ) {
30
+
31
+ const configName = 'settings/shortcuts/' + name;
32
+ const shortcutRow = new UIRow();
33
+
34
+ const shortcutInput = new UIInput().setWidth( '15px' ).setFontSize( '12px' );
35
+ shortcutInput.setTextAlign( 'center' );
36
+ shortcutInput.setTextTransform( 'lowercase' );
37
+ shortcutInput.onChange( function () {
38
+
39
+ const value = shortcutInput.getValue().toLowerCase();
40
+
41
+ if ( isValidKeyBinding( value ) ) {
42
+
43
+ config.setKey( configName, value );
44
+
45
+ }
46
+
47
+ } );
48
+
49
+ // Automatically highlight when selecting an input field
50
+ shortcutInput.dom.addEventListener( 'click', function () {
51
+
52
+ shortcutInput.dom.select();
53
+
54
+ } );
55
+
56
+ // If the value of the input field is invalid, revert the input field
57
+ // to contain the key binding stored in config
58
+ shortcutInput.dom.addEventListener( 'blur', function () {
59
+
60
+ if ( ! isValidKeyBinding( shortcutInput.getValue() ) ) {
61
+
62
+ shortcutInput.setValue( config.getKey( configName ) );
63
+
64
+ }
65
+
66
+ } );
67
+
68
+ // If a valid key binding character is entered, blur the input field
69
+ shortcutInput.dom.addEventListener( 'keyup', function ( event ) {
70
+
71
+ if ( isValidKeyBinding( event.key ) ) {
72
+
73
+ shortcutInput.dom.blur();
74
+
75
+ }
76
+
77
+ } );
78
+
79
+ if ( config.getKey( configName ) !== undefined ) {
80
+
81
+ shortcutInput.setValue( config.getKey( configName ) );
82
+
83
+ }
84
+
85
+ shortcutInput.dom.maxLength = 1;
86
+ shortcutRow.add( new UIText( strings.getKey( 'sidebar/settings/shortcuts/' + name ) ).setTextTransform( 'capitalize' ).setClass( 'Label' ) );
87
+ shortcutRow.add( shortcutInput );
88
+
89
+ container.add( shortcutRow );
90
+
91
+ }
92
+
93
+ for ( let i = 0; i < shortcuts.length; i ++ ) {
94
+
95
+ createShortcutInput( shortcuts[ i ] );
96
+
97
+ }
98
+
99
+ document.addEventListener( 'keydown', function ( event ) {
100
+
101
+ switch ( event.key.toLowerCase() ) {
102
+
103
+ case 'backspace':
104
+
105
+ event.preventDefault(); // prevent browser back
106
+
107
+ // fall-through
108
+
109
+ case 'delete':
110
+
111
+ const object = editor.selected;
112
+
113
+ if ( object === null || object.parent === null ) return;
114
+
115
+ if ( object.isSpotLight || object.isDirectionalLight ) {
116
+
117
+ editor.execute( new MultiCmdsCommand( editor, [
118
+ new RemoveObjectCommand( editor, object ),
119
+ new RemoveObjectCommand( editor, object.target )
120
+ ] ) );
121
+
122
+ } else {
123
+
124
+ editor.execute( new RemoveObjectCommand( editor, object ) );
125
+
126
+ }
127
+
128
+ break;
129
+
130
+ case config.getKey( 'settings/shortcuts/translate' ):
131
+
132
+ signals.transformModeChanged.dispatch( 'translate' );
133
+
134
+ break;
135
+
136
+ case config.getKey( 'settings/shortcuts/rotate' ):
137
+
138
+ signals.transformModeChanged.dispatch( 'rotate' );
139
+
140
+ break;
141
+
142
+ case config.getKey( 'settings/shortcuts/scale' ):
143
+
144
+ signals.transformModeChanged.dispatch( 'scale' );
145
+
146
+ break;
147
+
148
+ case config.getKey( 'settings/shortcuts/undo' ):
149
+
150
+ if ( IS_MAC ? event.metaKey : event.ctrlKey ) {
151
+
152
+ event.preventDefault(); // Prevent browser specific hotkeys
153
+
154
+ if ( event.shiftKey ) {
155
+
156
+ editor.redo();
157
+
158
+ } else {
159
+
160
+ editor.undo();
161
+
162
+ }
163
+
164
+ }
165
+
166
+ break;
167
+
168
+ case config.getKey( 'settings/shortcuts/focus' ):
169
+
170
+ if ( editor.selected !== null ) {
171
+
172
+ editor.focus( editor.selected );
173
+
174
+ }
175
+
176
+ break;
177
+
178
+ case config.getKey( 'settings/shortcuts/perspective' ):
179
+
180
+ editor.setCameraType( 'perspective' );
181
+
182
+ break;
183
+
184
+ case config.getKey( 'settings/shortcuts/orthographic' ):
185
+
186
+ editor.setCameraType( 'orthographic' );
187
+
188
+ break;
189
+
190
+ }
191
+
192
+ } );
193
+
194
+ return container;
195
+
196
+ }
197
+
198
+ export { SidebarSettingsShortcuts };
@@ -0,0 +1,58 @@
1
+ import { UIPanel, UIRow, UISelect, UISpan, UIText } from './libs/ui.js';
2
+
3
+ import { SidebarSettingsShortcuts } from './Sidebar.Settings.Shortcuts.js';
4
+ import { SidebarSettingsHistory } from './Sidebar.Settings.History.js';
5
+
6
+ function SidebarSettings( editor ) {
7
+
8
+ const config = editor.config;
9
+ const strings = editor.strings;
10
+
11
+ const container = new UISpan();
12
+
13
+ const settings = new UIPanel();
14
+ settings.setBorderTop( '0' );
15
+ settings.setPaddingTop( '20px' );
16
+ container.add( settings );
17
+
18
+ // language
19
+
20
+ const options = Object.fromEntries( [ 'en', 'fr', 'zh', 'ja', 'ko', 'fa' ].map( locale => {
21
+
22
+ return [ locale, new Intl.DisplayNames( locale, { type: 'language' } ).of( locale ) ];
23
+
24
+ } ) );
25
+
26
+ const languageRow = new UIRow();
27
+ const language = new UISelect().setWidth( '150px' );
28
+ language.setOptions( options );
29
+
30
+ if ( config.getKey( 'language' ) !== undefined ) {
31
+
32
+ language.setValue( config.getKey( 'language' ) );
33
+
34
+ }
35
+
36
+ language.onChange( function () {
37
+
38
+ const value = this.getValue();
39
+
40
+ editor.config.setKey( 'language', value );
41
+
42
+ } );
43
+
44
+ languageRow.add( new UIText( strings.getKey( 'sidebar/settings/language' ) ).setClass( 'Label' ) );
45
+ languageRow.add( language );
46
+
47
+ settings.add( languageRow );
48
+
49
+ //
50
+
51
+ container.add( new SidebarSettingsShortcuts( editor ) );
52
+ container.add( new SidebarSettingsHistory( editor ) );
53
+
54
+ return container;
55
+
56
+ }
57
+
58
+ export { SidebarSettings };
@@ -0,0 +1,41 @@
1
+ import { UITabbedPanel, UISpan } from './libs/ui.js';
2
+
3
+ import { SidebarScene } from './Sidebar.Scene.js';
4
+ import { SidebarProperties } from './Sidebar.Properties.js';
5
+ import { SidebarProject } from './Sidebar.Project.js';
6
+ import { SidebarSettings } from './Sidebar.Settings.js';
7
+
8
+ function Sidebar( editor ) {
9
+
10
+ const strings = editor.strings;
11
+
12
+ const container = new UITabbedPanel();
13
+ container.setId( 'sidebar' );
14
+
15
+ const sidebarProperties = new SidebarProperties( editor );
16
+
17
+ const scene = new UISpan().add(
18
+ new SidebarScene( editor ),
19
+ sidebarProperties
20
+ );
21
+ const project = new SidebarProject( editor );
22
+ const settings = new SidebarSettings( editor );
23
+
24
+ container.addTab( 'scene', strings.getKey( 'sidebar/scene' ), scene );
25
+ container.addTab( 'project', strings.getKey( 'sidebar/project' ), project );
26
+ container.addTab( 'settings', strings.getKey( 'sidebar/settings' ), settings );
27
+ container.select( 'scene' );
28
+
29
+ const sidebarPropertiesResizeObserver = new ResizeObserver( function () {
30
+
31
+ sidebarProperties.tabsDiv.setWidth( getComputedStyle( container.dom ).width );
32
+
33
+ } );
34
+
35
+ sidebarPropertiesResizeObserver.observe( container.tabsDiv.dom );
36
+
37
+ return container;
38
+
39
+ }
40
+
41
+ export { Sidebar };
@@ -0,0 +1,98 @@
1
+ function Storage() {
2
+
3
+ const indexedDB = window.indexedDB;
4
+
5
+ if ( indexedDB === undefined ) {
6
+
7
+ console.warn( 'Storage: IndexedDB not available.' );
8
+ return { init: function () {}, get: function () {}, set: function () {}, clear: function () {} };
9
+
10
+ }
11
+
12
+ const name = 'threejs-editor';
13
+ const version = 1;
14
+
15
+ let database;
16
+
17
+ return {
18
+
19
+ init: function ( callback ) {
20
+
21
+ const request = indexedDB.open( name, version );
22
+ request.onupgradeneeded = function ( event ) {
23
+
24
+ const db = event.target.result;
25
+
26
+ if ( db.objectStoreNames.contains( 'states' ) === false ) {
27
+
28
+ db.createObjectStore( 'states' );
29
+
30
+ }
31
+
32
+ };
33
+
34
+ request.onsuccess = function ( event ) {
35
+
36
+ database = event.target.result;
37
+
38
+ callback();
39
+
40
+ };
41
+
42
+ request.onerror = function ( event ) {
43
+
44
+ console.error( 'IndexedDB', event );
45
+
46
+ };
47
+
48
+
49
+ },
50
+
51
+ get: function ( callback ) {
52
+
53
+ const transaction = database.transaction( [ 'states' ], 'readonly' );
54
+ const objectStore = transaction.objectStore( 'states' );
55
+ const request = objectStore.get( 0 );
56
+ request.onsuccess = function ( event ) {
57
+
58
+ callback( event.target.result );
59
+
60
+ };
61
+
62
+ },
63
+
64
+ set: function ( data ) {
65
+
66
+ const start = performance.now();
67
+
68
+ const transaction = database.transaction( [ 'states' ], 'readwrite' );
69
+ const objectStore = transaction.objectStore( 'states' );
70
+ const request = objectStore.put( data, 0 );
71
+ request.onsuccess = function () {
72
+
73
+ console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[ 0 ] + ']', 'Saved state to IndexedDB. ' + ( performance.now() - start ).toFixed( 2 ) + 'ms' );
74
+
75
+ };
76
+
77
+ },
78
+
79
+ clear: function () {
80
+
81
+ if ( database === undefined ) return;
82
+
83
+ const transaction = database.transaction( [ 'states' ], 'readwrite' );
84
+ const objectStore = transaction.objectStore( 'states' );
85
+ const request = objectStore.clear();
86
+ request.onsuccess = function () {
87
+
88
+ console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[ 0 ] + ']', 'Cleared IndexedDB.' );
89
+
90
+ };
91
+
92
+ }
93
+
94
+ };
95
+
96
+ }
97
+
98
+ export { Storage };