@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.
- package/README.md +169 -0
- package/dist/index.css +921 -0
- package/dist/index.js +14076 -0
- package/package.json +49 -0
- package/src/editor/css/main.css +1030 -0
- package/src/editor/js/Animation.js +618 -0
- package/src/editor/js/AnimationResizer.js +73 -0
- package/src/editor/js/Command.js +40 -0
- package/src/editor/js/Config.js +86 -0
- package/src/editor/js/Editor.js +1006 -0
- package/src/editor/js/EditorControls.js +489 -0
- package/src/editor/js/GLTFImportDialog.js +112 -0
- package/src/editor/js/History.js +321 -0
- package/src/editor/js/Loader.js +1162 -0
- package/src/editor/js/LoaderUtils.js +90 -0
- package/src/editor/js/Menubar.Add.js +559 -0
- package/src/editor/js/Menubar.Edit.js +155 -0
- package/src/editor/js/Menubar.File.js +585 -0
- package/src/editor/js/Menubar.Help.js +73 -0
- package/src/editor/js/Menubar.Render.js +858 -0
- package/src/editor/js/Menubar.Status.js +51 -0
- package/src/editor/js/Menubar.View.js +193 -0
- package/src/editor/js/Menubar.js +29 -0
- package/src/editor/js/Player.js +53 -0
- package/src/editor/js/Resizer.js +65 -0
- package/src/editor/js/Script.js +532 -0
- package/src/editor/js/Selector.js +129 -0
- package/src/editor/js/Sidebar.Geometry.BoxGeometry.js +121 -0
- package/src/editor/js/Sidebar.Geometry.BufferGeometry.js +124 -0
- package/src/editor/js/Sidebar.Geometry.CapsuleGeometry.js +109 -0
- package/src/editor/js/Sidebar.Geometry.CircleGeometry.js +97 -0
- package/src/editor/js/Sidebar.Geometry.CylinderGeometry.js +121 -0
- package/src/editor/js/Sidebar.Geometry.DodecahedronGeometry.js +73 -0
- package/src/editor/js/Sidebar.Geometry.ExtrudeGeometry.js +196 -0
- package/src/editor/js/Sidebar.Geometry.IcosahedronGeometry.js +73 -0
- package/src/editor/js/Sidebar.Geometry.LatheGeometry.js +98 -0
- package/src/editor/js/Sidebar.Geometry.Modifiers.js +73 -0
- package/src/editor/js/Sidebar.Geometry.OctahedronGeometry.js +74 -0
- package/src/editor/js/Sidebar.Geometry.PlaneGeometry.js +97 -0
- package/src/editor/js/Sidebar.Geometry.RingGeometry.js +121 -0
- package/src/editor/js/Sidebar.Geometry.ShapeGeometry.js +76 -0
- package/src/editor/js/Sidebar.Geometry.SphereGeometry.js +133 -0
- package/src/editor/js/Sidebar.Geometry.TetrahedronGeometry.js +74 -0
- package/src/editor/js/Sidebar.Geometry.TextGeometry.js +136 -0
- package/src/editor/js/Sidebar.Geometry.TorusGeometry.js +109 -0
- package/src/editor/js/Sidebar.Geometry.TorusKnotGeometry.js +121 -0
- package/src/editor/js/Sidebar.Geometry.TubeGeometry.js +135 -0
- package/src/editor/js/Sidebar.Geometry.js +471 -0
- package/src/editor/js/Sidebar.Material.BooleanProperty.js +60 -0
- package/src/editor/js/Sidebar.Material.ColorProperty.js +87 -0
- package/src/editor/js/Sidebar.Material.ConstantProperty.js +62 -0
- package/src/editor/js/Sidebar.Material.MapProperty.js +277 -0
- package/src/editor/js/Sidebar.Material.NumberProperty.js +60 -0
- package/src/editor/js/Sidebar.Material.Program.js +73 -0
- package/src/editor/js/Sidebar.Material.RangeValueProperty.js +63 -0
- package/src/editor/js/Sidebar.Material.js +751 -0
- package/src/editor/js/Sidebar.Object.js +892 -0
- package/src/editor/js/Sidebar.Project.App.js +218 -0
- package/src/editor/js/Sidebar.Project.Materials.js +82 -0
- package/src/editor/js/Sidebar.Project.Renderer.js +193 -0
- package/src/editor/js/Sidebar.Project.Resources.js +242 -0
- package/src/editor/js/Sidebar.Project.js +21 -0
- package/src/editor/js/Sidebar.Properties.js +73 -0
- package/src/editor/js/Sidebar.Scene.js +643 -0
- package/src/editor/js/Sidebar.Script.js +129 -0
- package/src/editor/js/Sidebar.Settings.History.js +146 -0
- package/src/editor/js/Sidebar.Settings.Shortcuts.js +198 -0
- package/src/editor/js/Sidebar.Settings.js +58 -0
- package/src/editor/js/Sidebar.js +41 -0
- package/src/editor/js/Storage.js +98 -0
- package/src/editor/js/Strings.js +2718 -0
- package/src/editor/js/TextureParametersDialog.js +293 -0
- package/src/editor/js/Toolbar.js +75 -0
- package/src/editor/js/Viewport.Controls.js +98 -0
- package/src/editor/js/Viewport.Info.js +144 -0
- package/src/editor/js/Viewport.Pathtracer.js +27 -0
- package/src/editor/js/Viewport.ViewHelper.js +41 -0
- package/src/editor/js/Viewport.XR.js +7 -0
- package/src/editor/js/Viewport.js +982 -0
- package/src/editor/js/commands/AddObjectCommand.js +68 -0
- package/src/editor/js/commands/AddScriptCommand.js +75 -0
- package/src/editor/js/commands/Commands.js +24 -0
- package/src/editor/js/commands/MoveObjectCommand.js +117 -0
- package/src/editor/js/commands/MultiCmdsCommand.js +85 -0
- package/src/editor/js/commands/RemoveObjectCommand.js +88 -0
- package/src/editor/js/commands/RemoveScriptCommand.js +81 -0
- package/src/editor/js/commands/SetColorCommand.js +73 -0
- package/src/editor/js/commands/SetGeometryCommand.js +86 -0
- package/src/editor/js/commands/SetGeometryValueCommand.js +70 -0
- package/src/editor/js/commands/SetMaterialColorCommand.js +87 -0
- package/src/editor/js/commands/SetMaterialCommand.js +80 -0
- package/src/editor/js/commands/SetMaterialMapCommand.js +144 -0
- package/src/editor/js/commands/SetMaterialRangeCommand.js +92 -0
- package/src/editor/js/commands/SetMaterialValueCommand.js +91 -0
- package/src/editor/js/commands/SetMaterialVectorCommand.js +88 -0
- package/src/editor/js/commands/SetPositionCommand.js +84 -0
- package/src/editor/js/commands/SetRotationCommand.js +84 -0
- package/src/editor/js/commands/SetScaleCommand.js +84 -0
- package/src/editor/js/commands/SetSceneCommand.js +104 -0
- package/src/editor/js/commands/SetScriptValueCommand.js +80 -0
- package/src/editor/js/commands/SetShadowValueCommand.js +73 -0
- package/src/editor/js/commands/SetTextureParametersCommand.js +143 -0
- package/src/editor/js/commands/SetUuidCommand.js +70 -0
- package/src/editor/js/commands/SetValueCommand.js +75 -0
- package/src/editor/js/libs/acorn/acorn.js +3236 -0
- package/src/editor/js/libs/acorn/acorn_loose.js +1299 -0
- package/src/editor/js/libs/acorn/walk.js +344 -0
- package/src/editor/js/libs/app/index.html +51 -0
- package/src/editor/js/libs/app.js +14 -0
- package/src/editor/js/libs/codemirror/addon/dialog.css +32 -0
- package/src/editor/js/libs/codemirror/addon/dialog.js +163 -0
- package/src/editor/js/libs/codemirror/addon/show-hint.css +36 -0
- package/src/editor/js/libs/codemirror/addon/show-hint.js +529 -0
- package/src/editor/js/libs/codemirror/addon/tern.css +87 -0
- package/src/editor/js/libs/codemirror/addon/tern.js +750 -0
- package/src/editor/js/libs/codemirror/codemirror.css +344 -0
- package/src/editor/js/libs/codemirror/codemirror.js +9849 -0
- package/src/editor/js/libs/codemirror/mode/glsl.js +233 -0
- package/src/editor/js/libs/codemirror/mode/javascript.js +959 -0
- package/src/editor/js/libs/codemirror/theme/monokai.css +41 -0
- package/src/editor/js/libs/esprima.js +6401 -0
- package/src/editor/js/libs/jsonlint.js +453 -0
- package/src/editor/js/libs/signals.min.js +14 -0
- package/src/editor/js/libs/tern-threejs/build-defs.js +233 -0
- package/src/editor/js/libs/ternjs/comment.js +87 -0
- package/src/editor/js/libs/ternjs/def.js +588 -0
- package/src/editor/js/libs/ternjs/doc_comment.js +401 -0
- package/src/editor/js/libs/ternjs/infer.js +1635 -0
- package/src/editor/js/libs/ternjs/polyfill.js +80 -0
- package/src/editor/js/libs/ternjs/signal.js +26 -0
- package/src/editor/js/libs/ternjs/tern.js +993 -0
- package/src/editor/js/libs/ui.js +1305 -0
- package/src/editor/js/libs/ui.three.js +946 -0
- package/src/events.js +273 -0
- package/src/index.js +284 -0
- 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 = ' ' + 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 = ' ' + 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 };
|