spoint 0.1.0 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +134 -209
  2. package/SKILL.md +95 -0
  3. package/apps/environment/index.js +200 -1
  4. package/apps/environment/models/decorative/.gitkeep +0 -0
  5. package/apps/environment/models/hazards/.gitkeep +0 -0
  6. package/apps/environment/models/interactive/.gitkeep +0 -0
  7. package/apps/environment/models/structures/.gitkeep +0 -0
  8. package/apps/environment/smartObjects.js +114 -0
  9. package/apps/interactable/index.js +155 -0
  10. package/apps/physics-crate/index.js +15 -9
  11. package/apps/power-crate/index.js +18 -12
  12. package/apps/tps-game/$GDUPI.vrm +0 -0
  13. package/apps/tps-game/Cleetus.vrm +0 -0
  14. package/apps/tps-game/index.js +185 -27
  15. package/apps/world/index.js +68 -22
  16. package/bin/create-app.js +337 -0
  17. package/client/ARControls.js +301 -0
  18. package/client/LoadingManager.js +117 -0
  19. package/client/MobileControls.js +1122 -0
  20. package/client/anim-lib.glb +0 -0
  21. package/client/animation.js +306 -0
  22. package/client/app.js +1341 -65
  23. package/client/camera.js +191 -33
  24. package/client/createLoadingScreen.js +69 -0
  25. package/client/editor/bridge.js +113 -0
  26. package/client/editor/css/main.css +794 -0
  27. package/client/editor/images/rotate.svg +4 -0
  28. package/client/editor/images/scale.svg +4 -0
  29. package/client/editor/images/translate.svg +4 -0
  30. package/client/editor/index.html +103 -0
  31. package/client/editor/js/Command.js +41 -0
  32. package/client/editor/js/Config.js +81 -0
  33. package/client/editor/js/Editor.js +785 -0
  34. package/client/editor/js/EditorControls.js +438 -0
  35. package/client/editor/js/History.js +321 -0
  36. package/client/editor/js/Loader.js +987 -0
  37. package/client/editor/js/LoaderUtils.js +90 -0
  38. package/client/editor/js/Menubar.Add.js +510 -0
  39. package/client/editor/js/Menubar.Edit.js +145 -0
  40. package/client/editor/js/Menubar.File.js +466 -0
  41. package/client/editor/js/Menubar.Help.js +73 -0
  42. package/client/editor/js/Menubar.Status.js +51 -0
  43. package/client/editor/js/Menubar.View.js +183 -0
  44. package/client/editor/js/Menubar.js +27 -0
  45. package/client/editor/js/Player.js +53 -0
  46. package/client/editor/js/Resizer.js +58 -0
  47. package/client/editor/js/Script.js +503 -0
  48. package/client/editor/js/Selector.js +102 -0
  49. package/client/editor/js/Sidebar.Geometry.BoxGeometry.js +121 -0
  50. package/client/editor/js/Sidebar.Geometry.BufferGeometry.js +115 -0
  51. package/client/editor/js/Sidebar.Geometry.CapsuleGeometry.js +97 -0
  52. package/client/editor/js/Sidebar.Geometry.CircleGeometry.js +97 -0
  53. package/client/editor/js/Sidebar.Geometry.CylinderGeometry.js +121 -0
  54. package/client/editor/js/Sidebar.Geometry.DodecahedronGeometry.js +73 -0
  55. package/client/editor/js/Sidebar.Geometry.ExtrudeGeometry.js +196 -0
  56. package/client/editor/js/Sidebar.Geometry.IcosahedronGeometry.js +73 -0
  57. package/client/editor/js/Sidebar.Geometry.LatheGeometry.js +98 -0
  58. package/client/editor/js/Sidebar.Geometry.Modifiers.js +73 -0
  59. package/client/editor/js/Sidebar.Geometry.OctahedronGeometry.js +74 -0
  60. package/client/editor/js/Sidebar.Geometry.PlaneGeometry.js +97 -0
  61. package/client/editor/js/Sidebar.Geometry.RingGeometry.js +121 -0
  62. package/client/editor/js/Sidebar.Geometry.ShapeGeometry.js +76 -0
  63. package/client/editor/js/Sidebar.Geometry.SphereGeometry.js +133 -0
  64. package/client/editor/js/Sidebar.Geometry.TetrahedronGeometry.js +74 -0
  65. package/client/editor/js/Sidebar.Geometry.TorusGeometry.js +109 -0
  66. package/client/editor/js/Sidebar.Geometry.TorusKnotGeometry.js +121 -0
  67. package/client/editor/js/Sidebar.Geometry.TubeGeometry.js +135 -0
  68. package/client/editor/js/Sidebar.Geometry.js +332 -0
  69. package/client/editor/js/Sidebar.Material.BooleanProperty.js +60 -0
  70. package/client/editor/js/Sidebar.Material.ColorProperty.js +87 -0
  71. package/client/editor/js/Sidebar.Material.ConstantProperty.js +62 -0
  72. package/client/editor/js/Sidebar.Material.MapProperty.js +249 -0
  73. package/client/editor/js/Sidebar.Material.NumberProperty.js +60 -0
  74. package/client/editor/js/Sidebar.Material.Program.js +73 -0
  75. package/client/editor/js/Sidebar.Material.RangeValueProperty.js +63 -0
  76. package/client/editor/js/Sidebar.Material.js +751 -0
  77. package/client/editor/js/Sidebar.Object.Animation.js +102 -0
  78. package/client/editor/js/Sidebar.Object.js +898 -0
  79. package/client/editor/js/Sidebar.Project.App.js +165 -0
  80. package/client/editor/js/Sidebar.Project.Image.js +225 -0
  81. package/client/editor/js/Sidebar.Project.Materials.js +82 -0
  82. package/client/editor/js/Sidebar.Project.Renderer.js +144 -0
  83. package/client/editor/js/Sidebar.Project.Video.js +242 -0
  84. package/client/editor/js/Sidebar.Project.js +31 -0
  85. package/client/editor/js/Sidebar.Properties.js +73 -0
  86. package/client/editor/js/Sidebar.Scene.js +585 -0
  87. package/client/editor/js/Sidebar.Script.js +129 -0
  88. package/client/editor/js/Sidebar.Settings.History.js +146 -0
  89. package/client/editor/js/Sidebar.Settings.Shortcuts.js +175 -0
  90. package/client/editor/js/Sidebar.Settings.js +60 -0
  91. package/client/editor/js/Sidebar.js +41 -0
  92. package/client/editor/js/Storage.js +98 -0
  93. package/client/editor/js/Strings.js +2028 -0
  94. package/client/editor/js/Toolbar.js +84 -0
  95. package/client/editor/js/Viewport.Controls.js +92 -0
  96. package/client/editor/js/Viewport.Info.js +136 -0
  97. package/client/editor/js/Viewport.Pathtracer.js +91 -0
  98. package/client/editor/js/Viewport.ViewHelper.js +39 -0
  99. package/client/editor/js/Viewport.XR.js +222 -0
  100. package/client/editor/js/Viewport.js +900 -0
  101. package/client/editor/js/commands/AddObjectCommand.js +68 -0
  102. package/client/editor/js/commands/AddScriptCommand.js +75 -0
  103. package/client/editor/js/commands/Commands.js +23 -0
  104. package/client/editor/js/commands/MoveObjectCommand.js +111 -0
  105. package/client/editor/js/commands/MultiCmdsCommand.js +85 -0
  106. package/client/editor/js/commands/RemoveObjectCommand.js +88 -0
  107. package/client/editor/js/commands/RemoveScriptCommand.js +81 -0
  108. package/client/editor/js/commands/SetColorCommand.js +73 -0
  109. package/client/editor/js/commands/SetGeometryCommand.js +87 -0
  110. package/client/editor/js/commands/SetGeometryValueCommand.js +70 -0
  111. package/client/editor/js/commands/SetMaterialColorCommand.js +86 -0
  112. package/client/editor/js/commands/SetMaterialCommand.js +79 -0
  113. package/client/editor/js/commands/SetMaterialMapCommand.js +143 -0
  114. package/client/editor/js/commands/SetMaterialRangeCommand.js +91 -0
  115. package/client/editor/js/commands/SetMaterialValueCommand.js +90 -0
  116. package/client/editor/js/commands/SetMaterialVectorCommand.js +79 -0
  117. package/client/editor/js/commands/SetPositionCommand.js +84 -0
  118. package/client/editor/js/commands/SetRotationCommand.js +84 -0
  119. package/client/editor/js/commands/SetScaleCommand.js +84 -0
  120. package/client/editor/js/commands/SetSceneCommand.js +103 -0
  121. package/client/editor/js/commands/SetScriptValueCommand.js +80 -0
  122. package/client/editor/js/commands/SetShadowValueCommand.js +73 -0
  123. package/client/editor/js/commands/SetUuidCommand.js +70 -0
  124. package/client/editor/js/commands/SetValueCommand.js +75 -0
  125. package/client/editor/js/libs/acorn/acorn.js +3236 -0
  126. package/client/editor/js/libs/acorn/acorn_loose.js +1299 -0
  127. package/client/editor/js/libs/acorn/walk.js +344 -0
  128. package/client/editor/js/libs/app/index.html +57 -0
  129. package/client/editor/js/libs/app.js +251 -0
  130. package/client/editor/js/libs/codemirror/addon/dialog.css +32 -0
  131. package/client/editor/js/libs/codemirror/addon/dialog.js +163 -0
  132. package/client/editor/js/libs/codemirror/addon/show-hint.css +36 -0
  133. package/client/editor/js/libs/codemirror/addon/show-hint.js +529 -0
  134. package/client/editor/js/libs/codemirror/addon/tern.css +87 -0
  135. package/client/editor/js/libs/codemirror/addon/tern.js +750 -0
  136. package/client/editor/js/libs/codemirror/codemirror.css +344 -0
  137. package/client/editor/js/libs/codemirror/codemirror.js +9849 -0
  138. package/client/editor/js/libs/codemirror/mode/glsl.js +233 -0
  139. package/client/editor/js/libs/codemirror/mode/javascript.js +959 -0
  140. package/client/editor/js/libs/codemirror/theme/monokai.css +41 -0
  141. package/client/editor/js/libs/esprima.js +6401 -0
  142. package/client/editor/js/libs/jsonlint.js +453 -0
  143. package/client/editor/js/libs/signals.min.js +14 -0
  144. package/client/editor/js/libs/tern-threejs/threejs.js +5031 -0
  145. package/client/editor/js/libs/ternjs/comment.js +87 -0
  146. package/client/editor/js/libs/ternjs/def.js +588 -0
  147. package/client/editor/js/libs/ternjs/doc_comment.js +401 -0
  148. package/client/editor/js/libs/ternjs/infer.js +1635 -0
  149. package/client/editor/js/libs/ternjs/polyfill.js +80 -0
  150. package/client/editor/js/libs/ternjs/signal.js +26 -0
  151. package/client/editor/js/libs/ternjs/tern.js +993 -0
  152. package/client/editor/js/libs/ui.js +1346 -0
  153. package/client/editor/js/libs/ui.three.js +855 -0
  154. package/client/facial-animation.js +455 -0
  155. package/client/index.html +7 -4
  156. package/client/loading.css +147 -0
  157. package/client/loading.html +25 -0
  158. package/client/style.css +251 -0
  159. package/package.json +7 -3
  160. package/server.js +9 -1
  161. package/src/apps/AppContext.js +1 -1
  162. package/src/apps/AppLoader.js +50 -37
  163. package/src/apps/AppRuntime.js +32 -8
  164. package/src/client/InputHandler.js +233 -0
  165. package/src/client/JitterBuffer.js +207 -0
  166. package/src/client/KalmanFilter.js +125 -0
  167. package/src/client/MessageHandler.js +101 -0
  168. package/src/client/PhysicsNetworkClient.js +141 -68
  169. package/src/client/ReconnectManager.js +62 -0
  170. package/src/client/SmoothInterpolation.js +127 -0
  171. package/src/client/SnapshotProcessor.js +144 -0
  172. package/src/connection/ConnectionManager.js +21 -3
  173. package/src/connection/SessionStore.js +13 -3
  174. package/src/index.client.js +4 -6
  175. package/src/netcode/EventLog.js +29 -15
  176. package/src/netcode/LagCompensator.js +25 -26
  177. package/src/netcode/NetworkState.js +4 -1
  178. package/src/netcode/PhysicsIntegration.js +20 -6
  179. package/src/netcode/PlayerManager.js +10 -2
  180. package/src/netcode/SnapshotEncoder.js +66 -19
  181. package/src/netcode/TickSystem.js +13 -4
  182. package/src/physics/World.js +66 -13
  183. package/src/protocol/msgpack.js +90 -63
  184. package/src/sdk/ReloadHandlers.js +12 -2
  185. package/src/sdk/ReloadManager.js +5 -0
  186. package/src/sdk/ServerHandlers.js +50 -11
  187. package/src/sdk/StaticHandler.js +22 -6
  188. package/src/sdk/TickHandler.js +101 -34
  189. package/src/sdk/scaffold.js +31 -0
  190. package/src/sdk/server.js +59 -33
  191. package/src/shared/movement.js +2 -1
  192. package/src/spatial/Octree.js +5 -0
  193. package/apps/interactive-door/index.js +0 -33
  194. package/apps/patrol-npc/index.js +0 -37
  195. package/src/connection/QualityMonitor.js +0 -46
  196. package/src/debug/StateInspector.js +0 -42
  197. package/src/index.js +0 -1
  198. package/src/index.server.js +0 -27
  199. package/src/protocol/Codec.js +0 -60
  200. package/src/protocol/SequenceTracker.js +0 -71
  201. package/src/sdk/ClientMessageHandler.js +0 -80
  202. package/src/sdk/client.js +0 -122
  203. package/world/kaira.glb +0 -0
  204. package/world/schwust.glb +0 -0
@@ -0,0 +1,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,175 @@
1
+ import { UIPanel, UIText, UIRow, UIInput } from './libs/ui.js';
2
+
3
+ import { RemoveObjectCommand } from './commands/RemoveObjectCommand.js';
4
+
5
+ function SidebarSettingsShortcuts( editor ) {
6
+
7
+ const strings = editor.strings;
8
+
9
+ const IS_MAC = navigator.platform.toUpperCase().indexOf( 'MAC' ) >= 0;
10
+
11
+ function isValidKeyBinding( key ) {
12
+
13
+ return key.match( /^[A-Za-z0-9]$/i ); // Can't use z currently due to undo/redo
14
+
15
+ }
16
+
17
+ const config = editor.config;
18
+ const signals = editor.signals;
19
+
20
+ const container = new UIPanel();
21
+
22
+ const headerRow = new UIRow();
23
+ headerRow.add( new UIText( strings.getKey( 'sidebar/settings/shortcuts' ).toUpperCase() ) );
24
+ container.add( headerRow );
25
+
26
+ const shortcuts = [ 'translate', 'rotate', 'scale', 'undo', 'focus' ];
27
+
28
+ function createShortcutInput( name ) {
29
+
30
+ const configName = 'settings/shortcuts/' + name;
31
+ const shortcutRow = new UIRow();
32
+
33
+ const shortcutInput = new UIInput().setWidth( '15px' ).setFontSize( '12px' );
34
+ shortcutInput.setTextAlign( 'center' );
35
+ shortcutInput.setTextTransform( 'lowercase' );
36
+ shortcutInput.onChange( function () {
37
+
38
+ const value = shortcutInput.getValue().toLowerCase();
39
+
40
+ if ( isValidKeyBinding( value ) ) {
41
+
42
+ config.setKey( configName, value );
43
+
44
+ }
45
+
46
+ } );
47
+
48
+ // Automatically highlight when selecting an input field
49
+ shortcutInput.dom.addEventListener( 'click', function () {
50
+
51
+ shortcutInput.dom.select();
52
+
53
+ } );
54
+
55
+ // If the value of the input field is invalid, revert the input field
56
+ // to contain the key binding stored in config
57
+ shortcutInput.dom.addEventListener( 'blur', function () {
58
+
59
+ if ( ! isValidKeyBinding( shortcutInput.getValue() ) ) {
60
+
61
+ shortcutInput.setValue( config.getKey( configName ) );
62
+
63
+ }
64
+
65
+ } );
66
+
67
+ // If a valid key binding character is entered, blur the input field
68
+ shortcutInput.dom.addEventListener( 'keyup', function ( event ) {
69
+
70
+ if ( isValidKeyBinding( event.key ) ) {
71
+
72
+ shortcutInput.dom.blur();
73
+
74
+ }
75
+
76
+ } );
77
+
78
+ if ( config.getKey( configName ) !== undefined ) {
79
+
80
+ shortcutInput.setValue( config.getKey( configName ) );
81
+
82
+ }
83
+
84
+ shortcutInput.dom.maxLength = 1;
85
+ shortcutRow.add( new UIText( strings.getKey( 'sidebar/settings/shortcuts/' + name ) ).setTextTransform( 'capitalize' ).setClass( 'Label' ) );
86
+ shortcutRow.add( shortcutInput );
87
+
88
+ container.add( shortcutRow );
89
+
90
+ }
91
+
92
+ for ( let i = 0; i < shortcuts.length; i ++ ) {
93
+
94
+ createShortcutInput( shortcuts[ i ] );
95
+
96
+ }
97
+
98
+ document.addEventListener( 'keydown', function ( event ) {
99
+
100
+ switch ( event.key.toLowerCase() ) {
101
+
102
+ case 'backspace':
103
+
104
+ event.preventDefault(); // prevent browser back
105
+
106
+ // fall-through
107
+
108
+ case 'delete':
109
+
110
+ const object = editor.selected;
111
+
112
+ if ( object === null ) return;
113
+
114
+ const parent = object.parent;
115
+ if ( parent !== null ) editor.execute( new RemoveObjectCommand( editor, object ) );
116
+
117
+ break;
118
+
119
+ case config.getKey( 'settings/shortcuts/translate' ):
120
+
121
+ signals.transformModeChanged.dispatch( 'translate' );
122
+
123
+ break;
124
+
125
+ case config.getKey( 'settings/shortcuts/rotate' ):
126
+
127
+ signals.transformModeChanged.dispatch( 'rotate' );
128
+
129
+ break;
130
+
131
+ case config.getKey( 'settings/shortcuts/scale' ):
132
+
133
+ signals.transformModeChanged.dispatch( 'scale' );
134
+
135
+ break;
136
+
137
+ case config.getKey( 'settings/shortcuts/undo' ):
138
+
139
+ if ( IS_MAC ? event.metaKey : event.ctrlKey ) {
140
+
141
+ event.preventDefault(); // Prevent browser specific hotkeys
142
+
143
+ if ( event.shiftKey ) {
144
+
145
+ editor.redo();
146
+
147
+ } else {
148
+
149
+ editor.undo();
150
+
151
+ }
152
+
153
+ }
154
+
155
+ break;
156
+
157
+ case config.getKey( 'settings/shortcuts/focus' ):
158
+
159
+ if ( editor.selected !== null ) {
160
+
161
+ editor.focus( editor.selected );
162
+
163
+ }
164
+
165
+ break;
166
+
167
+ }
168
+
169
+ } );
170
+
171
+ return container;
172
+
173
+ }
174
+
175
+ export { SidebarSettingsShortcuts };
@@ -0,0 +1,60 @@
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 = {
21
+ en: 'English',
22
+ fr: 'Français',
23
+ zh: '中文',
24
+ ja: '日本語',
25
+ ko: '한국어',
26
+ };
27
+
28
+ const languageRow = new UIRow();
29
+ const language = new UISelect().setWidth( '150px' );
30
+ language.setOptions( options );
31
+
32
+ if ( config.getKey( 'language' ) !== undefined ) {
33
+
34
+ language.setValue( config.getKey( 'language' ) );
35
+
36
+ }
37
+
38
+ language.onChange( function () {
39
+
40
+ const value = this.getValue();
41
+
42
+ editor.config.setKey( 'language', value );
43
+
44
+ } );
45
+
46
+ languageRow.add( new UIText( strings.getKey( 'sidebar/settings/language' ) ).setClass( 'Label' ) );
47
+ languageRow.add( language );
48
+
49
+ settings.add( languageRow );
50
+
51
+ //
52
+
53
+ container.add( new SidebarSettingsShortcuts( editor ) );
54
+ container.add( new SidebarSettingsHistory( editor ) );
55
+
56
+ return container;
57
+
58
+ }
59
+
60
+ 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 };