@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,277 @@
1
+ import * as THREE from 'three';
2
+
3
+ import { UIButton, UICheckbox, UIDiv, UINumber, UIRow, UIText } from './libs/ui.js';
4
+ import { UITexture } from './libs/ui.three.js';
5
+ import { SetMaterialMapCommand } from './commands/SetMaterialMapCommand.js';
6
+ import { SetMaterialValueCommand } from './commands/SetMaterialValueCommand.js';
7
+ import { SetMaterialRangeCommand } from './commands/SetMaterialRangeCommand.js';
8
+ import { SetMaterialVectorCommand } from './commands/SetMaterialVectorCommand.js';
9
+ import { SetTextureParametersCommand } from './commands/SetTextureParametersCommand.js';
10
+ import { TextureParametersDialog } from './TextureParametersDialog.js';
11
+
12
+ function SidebarMaterialMapProperty( editor, property, name ) {
13
+
14
+ const signals = editor.signals;
15
+
16
+ const container = new UIRow();
17
+ container.add( new UIText( name ).setClass( 'Label' ) );
18
+
19
+ const enabled = new UICheckbox( false ).setMarginRight( '8px' ).onChange( onChange );
20
+ container.add( enabled );
21
+
22
+ const map = new UITexture( editor ).onChange( onMapChange );
23
+ container.add( map );
24
+
25
+ const settings = new UIButton( '⚙' ).setClass( 'TextureSettingsButton' ).setMarginRight( '4px' ).onClick( onSettingsClick );
26
+ settings.setDisabled( true );
27
+ container.add( settings );
28
+
29
+ const mapType = property.replace( 'Map', '' );
30
+
31
+ const colorMaps = [ 'map', 'emissiveMap', 'sheenColorMap', 'specularColorMap', 'envMap' ];
32
+
33
+ let intensity;
34
+
35
+ if ( property === 'aoMap' ) {
36
+
37
+ intensity = new UINumber( 1 ).setWidth( '30px' ).setRange( 0, 1 ).onChange( onIntensityChange );
38
+ container.add( intensity );
39
+
40
+ }
41
+
42
+ let scale;
43
+
44
+ if ( property === 'bumpMap' || property === 'displacementMap' ) {
45
+
46
+ scale = new UINumber().setWidth( '30px' ).onChange( onScaleChange );
47
+ container.add( scale );
48
+
49
+ }
50
+
51
+ let scaleX, scaleY;
52
+
53
+ if ( property === 'normalMap' || property === 'clearcoatNormalMap' ) {
54
+
55
+ scaleX = new UINumber().setWidth( '30px' ).onChange( onScaleXYChange );
56
+ container.add( scaleX );
57
+
58
+ scaleY = new UINumber().setWidth( '30px' ).onChange( onScaleXYChange );
59
+ container.add( scaleY );
60
+
61
+ }
62
+
63
+ let rangeMin, rangeMax;
64
+
65
+ if ( property === 'iridescenceThicknessMap' ) {
66
+
67
+ const range = new UIDiv().setMarginLeft( '3px' );
68
+ container.add( range );
69
+
70
+ const rangeMinRow = new UIRow().setMarginBottom( '0px' ).setStyle( 'min-height', '0px' );
71
+ range.add( rangeMinRow );
72
+
73
+ rangeMinRow.add( new UIText( 'min:' ).setWidth( '35px' ) );
74
+
75
+ rangeMin = new UINumber().setWidth( '40px' ).onChange( onRangeChange );
76
+ rangeMinRow.add( rangeMin );
77
+
78
+ const rangeMaxRow = new UIRow().setMarginBottom( '6px' ).setStyle( 'min-height', '0px' );
79
+ range.add( rangeMaxRow );
80
+
81
+ rangeMaxRow.add( new UIText( 'max:' ).setWidth( '35px' ) );
82
+
83
+ rangeMax = new UINumber().setWidth( '40px' ).onChange( onRangeChange );
84
+ rangeMaxRow.add( rangeMax );
85
+
86
+ // Additional settings for iridescenceThicknessMap
87
+ // Please add conditional if more maps are having a range property
88
+ rangeMin.setPrecision( 0 ).setRange( 0, Infinity ).setNudge( 1 ).setStep( 10 ).setUnit( 'nm' );
89
+ rangeMax.setPrecision( 0 ).setRange( 0, Infinity ).setNudge( 1 ).setStep( 10 ).setUnit( 'nm' );
90
+
91
+ }
92
+
93
+ let object = null;
94
+ let materialSlot = null;
95
+ let material = null;
96
+
97
+ function onChange() {
98
+
99
+ const newMap = enabled.getValue() ? map.getValue() : null;
100
+
101
+ if ( material[ property ] !== newMap ) {
102
+
103
+ if ( newMap !== null ) {
104
+
105
+ const geometry = object.geometry;
106
+
107
+ if ( geometry.hasAttribute( 'uv' ) === false ) console.warn( 'Geometry doesn\'t have uvs:', geometry );
108
+
109
+ if ( property === 'envMap' ) newMap.mapping = THREE.EquirectangularReflectionMapping;
110
+
111
+ }
112
+
113
+ editor.execute( new SetMaterialMapCommand( editor, object, property, newMap, materialSlot ) );
114
+
115
+ }
116
+
117
+ }
118
+
119
+ async function onSettingsClick() {
120
+
121
+ const texture = map.getValue();
122
+ if ( texture === null ) return;
123
+
124
+ const dialog = new TextureParametersDialog( editor, texture );
125
+
126
+ try {
127
+
128
+ const parameters = await dialog.show();
129
+ editor.execute( new SetTextureParametersCommand( editor, texture, parameters ) );
130
+
131
+ } catch ( e ) {
132
+
133
+ // Edit cancelled
134
+
135
+ }
136
+
137
+ }
138
+
139
+ function onMapChange( texture ) {
140
+
141
+ if ( texture !== null ) {
142
+
143
+ if ( colorMaps.includes( property ) && texture.isDataTexture !== true && texture.colorSpace !== THREE.SRGBColorSpace ) {
144
+
145
+ texture.colorSpace = THREE.SRGBColorSpace;
146
+ material.needsUpdate = true;
147
+
148
+ }
149
+
150
+ }
151
+
152
+ enabled.setDisabled( false );
153
+ settings.setDisabled( texture === null );
154
+
155
+ onChange();
156
+
157
+ }
158
+
159
+ function onIntensityChange() {
160
+
161
+ if ( material[ `${ property }Intensity` ] !== intensity.getValue() ) {
162
+
163
+ editor.execute( new SetMaterialValueCommand( editor, object, `${ property }Intensity`, intensity.getValue(), materialSlot ) );
164
+
165
+ }
166
+
167
+ }
168
+
169
+ function onScaleChange() {
170
+
171
+ if ( material[ `${ mapType }Scale` ] !== scale.getValue() ) {
172
+
173
+ editor.execute( new SetMaterialValueCommand( editor, object, `${ mapType }Scale`, scale.getValue(), materialSlot ) );
174
+
175
+ }
176
+
177
+ }
178
+
179
+ function onScaleXYChange() {
180
+
181
+ const value = [ scaleX.getValue(), scaleY.getValue() ];
182
+
183
+ if ( material[ `${ mapType }Scale` ].x !== value[ 0 ] || material[ `${ mapType }Scale` ].y !== value[ 1 ] ) {
184
+
185
+ editor.execute( new SetMaterialVectorCommand( editor, object, `${ mapType }Scale`, value, materialSlot ) );
186
+
187
+ }
188
+
189
+ }
190
+
191
+ function onRangeChange() {
192
+
193
+ const value = [ rangeMin.getValue(), rangeMax.getValue() ];
194
+
195
+ if ( material[ `${ mapType }Range` ][ 0 ] !== value[ 0 ] || material[ `${ mapType }Range` ][ 1 ] !== value[ 1 ] ) {
196
+
197
+ editor.execute( new SetMaterialRangeCommand( editor, object, `${ mapType }Range`, value[ 0 ], value[ 1 ], materialSlot ) );
198
+
199
+ }
200
+
201
+ }
202
+
203
+ function update( currentObject, currentMaterialSlot = 0 ) {
204
+
205
+ object = currentObject;
206
+ materialSlot = currentMaterialSlot;
207
+
208
+ if ( object === null ) return;
209
+ if ( object.material === undefined ) return;
210
+
211
+ material = editor.getObjectMaterial( object, materialSlot );
212
+
213
+ if ( property in material ) {
214
+
215
+ if ( material[ property ] !== null ) {
216
+
217
+ map.setValue( material[ property ] );
218
+
219
+ }
220
+
221
+ enabled.setValue( material[ property ] !== null );
222
+ enabled.setDisabled( map.getValue() === null );
223
+ settings.setDisabled( map.getValue() === null );
224
+
225
+ if ( intensity !== undefined ) {
226
+
227
+ intensity.setValue( material[ `${ property }Intensity` ] );
228
+
229
+ }
230
+
231
+ if ( scale !== undefined ) {
232
+
233
+ scale.setValue( material[ `${ mapType }Scale` ] );
234
+
235
+ }
236
+
237
+ if ( scaleX !== undefined ) {
238
+
239
+ scaleX.setValue( material[ `${ mapType }Scale` ].x );
240
+ scaleY.setValue( material[ `${ mapType }Scale` ].y );
241
+
242
+ }
243
+
244
+ if ( rangeMin !== undefined ) {
245
+
246
+ rangeMin.setValue( material[ `${ mapType }Range` ][ 0 ] );
247
+ rangeMax.setValue( material[ `${ mapType }Range` ][ 1 ] );
248
+
249
+ }
250
+
251
+ container.setDisplay( '' );
252
+
253
+ } else {
254
+
255
+ container.setDisplay( 'none' );
256
+
257
+ }
258
+
259
+ }
260
+
261
+ //
262
+
263
+ signals.objectSelected.add( function ( selected ) {
264
+
265
+ map.setValue( null );
266
+
267
+ update( selected );
268
+
269
+ } );
270
+
271
+ signals.materialChanged.add( update );
272
+
273
+ return container;
274
+
275
+ }
276
+
277
+ export { SidebarMaterialMapProperty };
@@ -0,0 +1,60 @@
1
+ import { UINumber, UIRow, UIText } from './libs/ui.js';
2
+ import { SetMaterialValueCommand } from './commands/SetMaterialValueCommand.js';
3
+
4
+ function SidebarMaterialNumberProperty( editor, property, name, range = [ - Infinity, Infinity ], precision = 2 ) {
5
+
6
+ const signals = editor.signals;
7
+
8
+ const container = new UIRow();
9
+ container.add( new UIText( name ).setClass( 'Label' ) );
10
+
11
+ const number = new UINumber().setWidth( '60px' ).setRange( range[ 0 ], range[ 1 ] ).setPrecision( precision ).onChange( onChange );
12
+ container.add( number );
13
+
14
+ let object = null;
15
+ let materialSlot = null;
16
+ let material = null;
17
+
18
+ function onChange() {
19
+
20
+ if ( material[ property ] !== number.getValue() ) {
21
+
22
+ editor.execute( new SetMaterialValueCommand( editor, object, property, number.getValue(), materialSlot ) );
23
+
24
+ }
25
+
26
+ }
27
+
28
+ function update( currentObject, currentMaterialSlot = 0 ) {
29
+
30
+ object = currentObject;
31
+ materialSlot = currentMaterialSlot;
32
+
33
+ if ( object === null ) return;
34
+ if ( object.material === undefined ) return;
35
+
36
+ material = editor.getObjectMaterial( object, materialSlot );
37
+
38
+ if ( property in material ) {
39
+
40
+ number.setValue( material[ property ] );
41
+ container.setDisplay( '' );
42
+
43
+ } else {
44
+
45
+ container.setDisplay( 'none' );
46
+
47
+ }
48
+
49
+ }
50
+
51
+ //
52
+
53
+ signals.objectSelected.add( update );
54
+ signals.materialChanged.add( update );
55
+
56
+ return container;
57
+
58
+ }
59
+
60
+ export { SidebarMaterialNumberProperty };
@@ -0,0 +1,73 @@
1
+ import { UIButton, UIRow, UIText } from './libs/ui.js';
2
+
3
+ function SidebarMaterialProgram( editor, property ) {
4
+
5
+ const signals = editor.signals;
6
+ const strings = editor.strings;
7
+
8
+ let object = null;
9
+ let materialSlot = null;
10
+ let material = null;
11
+
12
+ const container = new UIRow();
13
+ container.add( new UIText( strings.getKey( 'sidebar/material/program' ) ).setClass( 'Label' ) );
14
+
15
+ const programInfo = new UIButton( strings.getKey( 'sidebar/material/info' ) );
16
+ programInfo.setMarginRight( '4px' );
17
+ programInfo.onClick( function () {
18
+
19
+ signals.editScript.dispatch( object, 'programInfo' );
20
+
21
+ } );
22
+ container.add( programInfo );
23
+
24
+ const programVertex = new UIButton( strings.getKey( 'sidebar/material/vertex' ) );
25
+ programVertex.setMarginRight( '4px' );
26
+ programVertex.onClick( function () {
27
+
28
+ signals.editScript.dispatch( object, 'vertexShader' );
29
+
30
+ } );
31
+ container.add( programVertex );
32
+
33
+ const programFragment = new UIButton( strings.getKey( 'sidebar/material/fragment' ) );
34
+ programFragment.setMarginRight( '4px' );
35
+ programFragment.onClick( function () {
36
+
37
+ signals.editScript.dispatch( object, 'fragmentShader' );
38
+
39
+ } );
40
+ container.add( programFragment );
41
+
42
+ function update( currentObject, currentMaterialSlot = 0 ) {
43
+
44
+ object = currentObject;
45
+ materialSlot = currentMaterialSlot;
46
+
47
+ if ( object === null ) return;
48
+ if ( object.material === undefined ) return;
49
+
50
+ material = editor.getObjectMaterial( object, materialSlot );
51
+
52
+ if ( property in material ) {
53
+
54
+ container.setDisplay( '' );
55
+
56
+ } else {
57
+
58
+ container.setDisplay( 'none' );
59
+
60
+ }
61
+
62
+ }
63
+
64
+ //
65
+
66
+ signals.objectSelected.add( update );
67
+ signals.materialChanged.add( update );
68
+
69
+ return container;
70
+
71
+ }
72
+
73
+ export { SidebarMaterialProgram };
@@ -0,0 +1,63 @@
1
+ import { UINumber, UIRow, UIText } from './libs/ui.js';
2
+ import { SetMaterialRangeCommand } from './commands/SetMaterialRangeCommand.js';
3
+
4
+ function SidebarMaterialRangeValueProperty( editor, property, name, isMin, range = [ - Infinity, Infinity ], precision = 2, step = 1, nudge = 0.01, unit = '' ) {
5
+
6
+ const signals = editor.signals;
7
+
8
+ const container = new UIRow();
9
+ container.add( new UIText( name ).setClass( 'Label' ) );
10
+
11
+ const number = new UINumber().setWidth( '60px' ).setRange( range[ 0 ], range[ 1 ] ).setPrecision( precision ).setStep( step ).setNudge( nudge ).setUnit( unit ).onChange( onChange );
12
+ container.add( number );
13
+
14
+ let object = null;
15
+ let materialSlot = null;
16
+ let material = null;
17
+
18
+ function onChange() {
19
+
20
+ if ( material[ property ][ isMin ? 0 : 1 ] !== number.getValue() ) {
21
+
22
+ const minValue = isMin ? number.getValue() : material[ property ][ 0 ];
23
+ const maxValue = isMin ? material[ property ][ 1 ] : number.getValue();
24
+
25
+ editor.execute( new SetMaterialRangeCommand( editor, object, property, minValue, maxValue, materialSlot ) );
26
+
27
+ }
28
+
29
+ }
30
+
31
+ function update( currentObject, currentMaterialSlot = 0 ) {
32
+
33
+ object = currentObject;
34
+ materialSlot = currentMaterialSlot;
35
+
36
+ if ( object === null ) return;
37
+ if ( object.material === undefined ) return;
38
+
39
+ material = editor.getObjectMaterial( object, materialSlot );
40
+
41
+ if ( property in material ) {
42
+
43
+ number.setValue( material[ property ][ isMin ? 0 : 1 ] );
44
+ container.setDisplay( '' );
45
+
46
+ } else {
47
+
48
+ container.setDisplay( 'none' );
49
+
50
+ }
51
+
52
+ }
53
+
54
+ //
55
+
56
+ signals.objectSelected.add( update );
57
+ signals.materialChanged.add( update );
58
+
59
+ return container;
60
+
61
+ }
62
+
63
+ export { SidebarMaterialRangeValueProperty };