spoint 0.1.0 → 0.1.10

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 +28 -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,503 @@
1
+ import { UIElement, UIPanel, UIText } from './libs/ui.js';
2
+
3
+ import { SetScriptValueCommand } from './commands/SetScriptValueCommand.js';
4
+ import { SetMaterialValueCommand } from './commands/SetMaterialValueCommand.js';
5
+
6
+ function Script( editor ) {
7
+
8
+ const signals = editor.signals;
9
+ const strings = editor.strings;
10
+
11
+ const container = new UIPanel();
12
+ container.setId( 'script' );
13
+ container.setPosition( 'absolute' );
14
+ container.setBackgroundColor( '#272822' );
15
+ container.setDisplay( 'none' );
16
+
17
+ const header = new UIPanel();
18
+ header.setPadding( '10px' );
19
+ container.add( header );
20
+
21
+ const title = new UIText().setColor( '#fff' );
22
+ header.add( title );
23
+
24
+ const buttonSVG = ( function () {
25
+
26
+ const svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );
27
+ svg.setAttribute( 'width', 32 );
28
+ svg.setAttribute( 'height', 32 );
29
+ const path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );
30
+ path.setAttribute( 'd', 'M 12,12 L 22,22 M 22,12 12,22' );
31
+ path.setAttribute( 'stroke', '#fff' );
32
+ svg.appendChild( path );
33
+ return svg;
34
+
35
+ } )();
36
+
37
+ const close = new UIElement( buttonSVG );
38
+ close.setPosition( 'absolute' );
39
+ close.setTop( '3px' );
40
+ close.setRight( '1px' );
41
+ close.setCursor( 'pointer' );
42
+ close.onClick( function () {
43
+
44
+ container.setDisplay( 'none' );
45
+
46
+ } );
47
+ header.add( close );
48
+
49
+
50
+ let renderer;
51
+
52
+ signals.rendererCreated.add( function ( newRenderer ) {
53
+
54
+ renderer = newRenderer;
55
+
56
+ } );
57
+
58
+
59
+ let delay;
60
+ let currentMode;
61
+ let currentScript;
62
+ let currentObject;
63
+
64
+ const codemirror = CodeMirror( container.dom, {
65
+ value: '',
66
+ lineNumbers: true,
67
+ matchBrackets: true,
68
+ indentWithTabs: true,
69
+ tabSize: 4,
70
+ indentUnit: 4,
71
+ hintOptions: {
72
+ completeSingle: false
73
+ }
74
+ } );
75
+ codemirror.setOption( 'theme', 'monokai' );
76
+ codemirror.on( 'change', function () {
77
+
78
+ if ( codemirror.state.focused === false ) return;
79
+
80
+ clearTimeout( delay );
81
+ delay = setTimeout( function () {
82
+
83
+ const value = codemirror.getValue();
84
+
85
+ if ( ! validate( value ) ) return;
86
+
87
+ if ( typeof ( currentScript ) === 'object' ) {
88
+
89
+ if ( value !== currentScript.source ) {
90
+
91
+ editor.execute( new SetScriptValueCommand( editor, currentObject, currentScript, 'source', value ) );
92
+
93
+ }
94
+
95
+ return;
96
+
97
+ }
98
+
99
+ if ( currentScript !== 'programInfo' ) return;
100
+
101
+ const json = JSON.parse( value );
102
+
103
+ if ( JSON.stringify( currentObject.material.defines ) !== JSON.stringify( json.defines ) ) {
104
+
105
+ const cmd = new SetMaterialValueCommand( editor, currentObject, 'defines', json.defines );
106
+ cmd.updatable = false;
107
+ editor.execute( cmd );
108
+
109
+ }
110
+
111
+ if ( JSON.stringify( currentObject.material.uniforms ) !== JSON.stringify( json.uniforms ) ) {
112
+
113
+ const cmd = new SetMaterialValueCommand( editor, currentObject, 'uniforms', json.uniforms );
114
+ cmd.updatable = false;
115
+ editor.execute( cmd );
116
+
117
+ }
118
+
119
+ if ( JSON.stringify( currentObject.material.attributes ) !== JSON.stringify( json.attributes ) ) {
120
+
121
+ const cmd = new SetMaterialValueCommand( editor, currentObject, 'attributes', json.attributes );
122
+ cmd.updatable = false;
123
+ editor.execute( cmd );
124
+
125
+ }
126
+
127
+ }, 300 );
128
+
129
+ } );
130
+
131
+ // prevent backspace from deleting objects
132
+ const wrapper = codemirror.getWrapperElement();
133
+ wrapper.addEventListener( 'keydown', function ( event ) {
134
+
135
+ event.stopPropagation();
136
+
137
+ } );
138
+
139
+ // validate
140
+
141
+ const errorLines = [];
142
+ const widgets = [];
143
+
144
+ const validate = function ( string ) {
145
+
146
+ let valid;
147
+ let errors = [];
148
+
149
+ return codemirror.operation( function () {
150
+
151
+ while ( errorLines.length > 0 ) {
152
+
153
+ codemirror.removeLineClass( errorLines.shift(), 'background', 'errorLine' );
154
+
155
+ }
156
+
157
+ while ( widgets.length > 0 ) {
158
+
159
+ codemirror.removeLineWidget( widgets.shift() );
160
+
161
+ }
162
+
163
+ //
164
+
165
+ switch ( currentMode ) {
166
+
167
+ case 'javascript':
168
+
169
+ try {
170
+
171
+ const syntax = esprima.parse( string, { tolerant: true } );
172
+ errors = syntax.errors;
173
+
174
+ } catch ( error ) {
175
+
176
+ errors.push( {
177
+
178
+ lineNumber: error.lineNumber - 1,
179
+ message: error.message
180
+
181
+ } );
182
+
183
+ }
184
+
185
+ for ( let i = 0; i < errors.length; i ++ ) {
186
+
187
+ const error = errors[ i ];
188
+ error.message = error.message.replace( /Line [0-9]+: /, '' );
189
+
190
+ }
191
+
192
+ break;
193
+
194
+ case 'json':
195
+
196
+ errors = [];
197
+
198
+ jsonlint.parseError = function ( message, info ) {
199
+
200
+ message = message.split( '\n' )[ 3 ];
201
+
202
+ errors.push( {
203
+
204
+ lineNumber: info.loc.first_line - 1,
205
+ message: message
206
+
207
+ } );
208
+
209
+ };
210
+
211
+ try {
212
+
213
+ jsonlint.parse( string );
214
+
215
+ } catch ( error ) {
216
+
217
+ // ignore failed error recovery
218
+
219
+ }
220
+
221
+ break;
222
+
223
+ case 'glsl':
224
+
225
+ currentObject.material[ currentScript ] = string;
226
+ currentObject.material.needsUpdate = true;
227
+ signals.materialChanged.dispatch( currentObject, 0 ); // TODO: Add multi-material support
228
+
229
+ const programs = renderer.info.programs;
230
+
231
+ valid = true;
232
+ const parseMessage = /^(?:ERROR|WARNING): \d+:(\d+): (.*)/g;
233
+
234
+ for ( let i = 0, n = programs.length; i !== n; ++ i ) {
235
+
236
+ const diagnostics = programs[ i ].diagnostics;
237
+
238
+ if ( diagnostics === undefined ||
239
+ diagnostics.material !== currentObject.material ) continue;
240
+
241
+ if ( ! diagnostics.runnable ) valid = false;
242
+
243
+ const shaderInfo = diagnostics[ currentScript ];
244
+ const lineOffset = shaderInfo.prefix.split( /\r\n|\r|\n/ ).length;
245
+
246
+ while ( true ) {
247
+
248
+ const parseResult = parseMessage.exec( shaderInfo.log );
249
+ if ( parseResult === null ) break;
250
+
251
+ errors.push( {
252
+
253
+ lineNumber: parseResult[ 1 ] - lineOffset,
254
+ message: parseResult[ 2 ]
255
+
256
+ } );
257
+
258
+ } // messages
259
+
260
+ break;
261
+
262
+ } // programs
263
+
264
+ } // mode switch
265
+
266
+ for ( let i = 0; i < errors.length; i ++ ) {
267
+
268
+ const error = errors[ i ];
269
+
270
+ const message = document.createElement( 'div' );
271
+ message.className = 'esprima-error';
272
+ message.textContent = error.message;
273
+
274
+ const lineNumber = Math.max( error.lineNumber, 0 );
275
+ errorLines.push( lineNumber );
276
+
277
+ codemirror.addLineClass( lineNumber, 'background', 'errorLine' );
278
+
279
+ const widget = codemirror.addLineWidget( lineNumber, message );
280
+
281
+ widgets.push( widget );
282
+
283
+ }
284
+
285
+ return valid !== undefined ? valid : errors.length === 0;
286
+
287
+ } );
288
+
289
+ };
290
+
291
+ // tern js autocomplete
292
+
293
+ const server = new CodeMirror.TernServer( {
294
+ caseInsensitive: true,
295
+ plugins: { threejs: null }
296
+ } );
297
+
298
+ codemirror.setOption( 'extraKeys', {
299
+ 'Ctrl-Space': function ( cm ) {
300
+
301
+ server.complete( cm );
302
+
303
+ },
304
+ 'Ctrl-I': function ( cm ) {
305
+
306
+ server.showType( cm );
307
+
308
+ },
309
+ 'Ctrl-O': function ( cm ) {
310
+
311
+ server.showDocs( cm );
312
+
313
+ },
314
+ 'Alt-.': function ( cm ) {
315
+
316
+ server.jumpToDef( cm );
317
+
318
+ },
319
+ 'Alt-,': function ( cm ) {
320
+
321
+ server.jumpBack( cm );
322
+
323
+ },
324
+ 'Ctrl-Q': function ( cm ) {
325
+
326
+ server.rename( cm );
327
+
328
+ },
329
+ 'Ctrl-.': function ( cm ) {
330
+
331
+ server.selectName( cm );
332
+
333
+ }
334
+ } );
335
+
336
+ codemirror.on( 'cursorActivity', function ( cm ) {
337
+
338
+ if ( currentMode !== 'javascript' ) return;
339
+ server.updateArgHints( cm );
340
+
341
+ } );
342
+
343
+ codemirror.on( 'keypress', function ( cm, kb ) {
344
+
345
+ if ( currentMode !== 'javascript' ) return;
346
+ if ( /[\w\.]/.exec( kb.key ) ) {
347
+
348
+ server.complete( cm );
349
+
350
+ }
351
+
352
+ } );
353
+
354
+
355
+ //
356
+
357
+ signals.editorCleared.add( function () {
358
+
359
+ container.setDisplay( 'none' );
360
+
361
+ } );
362
+
363
+ function setTitle( object, script ) {
364
+
365
+ if ( typeof script === 'object' ) {
366
+
367
+ title.setValue( object.name + ' / ' + script.name );
368
+
369
+ } else {
370
+
371
+ switch ( script ) {
372
+
373
+ case 'vertexShader':
374
+
375
+ title.setValue( object.material.name + ' / ' + strings.getKey( 'script/title/vertexShader' ) );
376
+ break;
377
+
378
+ case 'fragmentShader':
379
+
380
+ title.setValue( object.material.name + ' / ' + strings.getKey( 'script/title/fragmentShader' ) );
381
+ break;
382
+
383
+ case 'programInfo':
384
+
385
+ title.setValue( object.material.name + ' / ' + strings.getKey( 'script/title/programInfo' ) );
386
+ break;
387
+
388
+ default:
389
+
390
+ throw new Error( 'setTitle: Unknown script' );
391
+
392
+ }
393
+
394
+ }
395
+
396
+ }
397
+
398
+ signals.editScript.add( function ( object, script ) {
399
+
400
+ let mode, source;
401
+
402
+ if ( typeof ( script ) === 'object' ) {
403
+
404
+ mode = 'javascript';
405
+ source = script.source;
406
+
407
+ } else {
408
+
409
+ switch ( script ) {
410
+
411
+ case 'vertexShader':
412
+
413
+ mode = 'glsl';
414
+ source = object.material.vertexShader || '';
415
+
416
+ break;
417
+
418
+ case 'fragmentShader':
419
+
420
+ mode = 'glsl';
421
+ source = object.material.fragmentShader || '';
422
+
423
+ break;
424
+
425
+ case 'programInfo':
426
+
427
+ mode = 'json';
428
+ const json = {
429
+ defines: object.material.defines,
430
+ uniforms: object.material.uniforms,
431
+ attributes: object.material.attributes
432
+ };
433
+ source = JSON.stringify( json, null, '\t' );
434
+
435
+ break;
436
+
437
+ default:
438
+
439
+ throw new Error( 'editScript: Unknown script' );
440
+
441
+ }
442
+
443
+ }
444
+
445
+ setTitle( object, script );
446
+
447
+ currentMode = mode;
448
+ currentScript = script;
449
+ currentObject = object;
450
+
451
+ container.setDisplay( '' );
452
+ codemirror.setValue( source );
453
+ codemirror.clearHistory();
454
+ if ( mode === 'json' ) mode = { name: 'javascript', json: true };
455
+ codemirror.setOption( 'mode', mode );
456
+
457
+ } );
458
+
459
+ signals.scriptRemoved.add( function ( script ) {
460
+
461
+ if ( currentScript === script ) {
462
+
463
+ container.setDisplay( 'none' );
464
+
465
+ }
466
+
467
+ } );
468
+
469
+ signals.objectChanged.add( function ( object ) {
470
+
471
+ if ( object !== currentObject ) return;
472
+
473
+ if ( [ 'programInfo', 'vertexShader', 'fragmentShader' ].includes( currentScript ) ) return;
474
+
475
+ setTitle( currentObject, currentScript );
476
+
477
+ } );
478
+
479
+ signals.scriptChanged.add( function ( script ) {
480
+
481
+ if ( script === currentScript ) {
482
+
483
+ setTitle( currentObject, currentScript );
484
+
485
+ }
486
+
487
+ } );
488
+
489
+ signals.materialChanged.add( function ( object, slot ) {
490
+
491
+ if ( object !== currentObject ) return;
492
+
493
+ // TODO: Adds multi-material support
494
+
495
+ setTitle( currentObject, currentScript );
496
+
497
+ } );
498
+
499
+ return container;
500
+
501
+ }
502
+
503
+ export { Script };
@@ -0,0 +1,102 @@
1
+ import * as THREE from 'three';
2
+
3
+ const mouse = new THREE.Vector2();
4
+ const raycaster = new THREE.Raycaster();
5
+
6
+ class Selector {
7
+
8
+ constructor( editor ) {
9
+
10
+ const signals = editor.signals;
11
+
12
+ this.editor = editor;
13
+ this.signals = signals;
14
+
15
+ // signals
16
+
17
+ signals.intersectionsDetected.add( ( intersects ) => {
18
+
19
+ if ( intersects.length > 0 ) {
20
+
21
+ const object = intersects[ 0 ].object;
22
+
23
+ if ( object.userData.object !== undefined ) {
24
+
25
+ // helper
26
+
27
+ this.select( object.userData.object );
28
+
29
+ } else {
30
+
31
+ this.select( object );
32
+
33
+ }
34
+
35
+ } else {
36
+
37
+ this.select( null );
38
+
39
+ }
40
+
41
+ } );
42
+
43
+ }
44
+
45
+ getIntersects( raycaster ) {
46
+
47
+ const objects = [];
48
+
49
+ this.editor.scene.traverseVisible( function ( child ) {
50
+
51
+ objects.push( child );
52
+
53
+ } );
54
+
55
+ this.editor.sceneHelpers.traverseVisible( function ( child ) {
56
+
57
+ if ( child.name === 'picker' ) objects.push( child );
58
+
59
+ } );
60
+
61
+ return raycaster.intersectObjects( objects, false );
62
+
63
+ }
64
+
65
+ getPointerIntersects( point, camera ) {
66
+
67
+ mouse.set( ( point.x * 2 ) - 1, - ( point.y * 2 ) + 1 );
68
+
69
+ raycaster.setFromCamera( mouse, camera );
70
+
71
+ return this.getIntersects( raycaster );
72
+
73
+ }
74
+
75
+ select( object ) {
76
+
77
+ if ( this.editor.selected === object ) return;
78
+
79
+ let uuid = null;
80
+
81
+ if ( object !== null ) {
82
+
83
+ uuid = object.uuid;
84
+
85
+ }
86
+
87
+ this.editor.selected = object;
88
+ this.editor.config.setKey( 'selected', uuid );
89
+
90
+ this.signals.objectSelected.dispatch( object );
91
+
92
+ }
93
+
94
+ deselect() {
95
+
96
+ this.select( null );
97
+
98
+ }
99
+
100
+ }
101
+
102
+ export { Selector };
@@ -0,0 +1,121 @@
1
+ import * as THREE from 'three';
2
+
3
+ import { UIDiv, UIRow, UIText, UINumber, UIInteger } from './libs/ui.js';
4
+
5
+ import { SetGeometryCommand } from './commands/SetGeometryCommand.js';
6
+
7
+ function GeometryParametersPanel( editor, object ) {
8
+
9
+ const strings = editor.strings;
10
+ const signals = editor.signals;
11
+
12
+ const container = new UIDiv();
13
+
14
+ const geometry = object.geometry;
15
+ const parameters = geometry.parameters;
16
+
17
+ // width
18
+
19
+ const widthRow = new UIRow();
20
+ const width = new UINumber().setPrecision( 3 ).setValue( parameters.width ).onChange( update );
21
+
22
+ widthRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/width' ) ).setClass( 'Label' ) );
23
+ widthRow.add( width );
24
+
25
+ container.add( widthRow );
26
+
27
+ // height
28
+
29
+ const heightRow = new UIRow();
30
+ const height = new UINumber().setPrecision( 3 ).setValue( parameters.height ).onChange( update );
31
+
32
+ heightRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/height' ) ).setClass( 'Label' ) );
33
+ heightRow.add( height );
34
+
35
+ container.add( heightRow );
36
+
37
+ // depth
38
+
39
+ const depthRow = new UIRow();
40
+ const depth = new UINumber().setPrecision( 3 ).setValue( parameters.depth ).onChange( update );
41
+
42
+ depthRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/depth' ) ).setClass( 'Label' ) );
43
+ depthRow.add( depth );
44
+
45
+ container.add( depthRow );
46
+
47
+ // widthSegments
48
+
49
+ const widthSegmentsRow = new UIRow();
50
+ const widthSegments = new UIInteger( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
51
+
52
+ widthSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/widthseg' ) ).setClass( 'Label' ) );
53
+ widthSegmentsRow.add( widthSegments );
54
+
55
+ container.add( widthSegmentsRow );
56
+
57
+ // heightSegments
58
+
59
+ const heightSegmentsRow = new UIRow();
60
+ const heightSegments = new UIInteger( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
61
+
62
+ heightSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/heightseg' ) ).setClass( 'Label' ) );
63
+ heightSegmentsRow.add( heightSegments );
64
+
65
+ container.add( heightSegmentsRow );
66
+
67
+ // depthSegments
68
+
69
+ const depthSegmentsRow = new UIRow();
70
+ const depthSegments = new UIInteger( parameters.depthSegments ).setRange( 1, Infinity ).onChange( update );
71
+
72
+ depthSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/box_geometry/depthseg' ) ).setClass( 'Label' ) );
73
+ depthSegmentsRow.add( depthSegments );
74
+
75
+ container.add( depthSegmentsRow );
76
+
77
+ //
78
+
79
+ function refreshUI() {
80
+
81
+ const parameters = object.geometry.parameters;
82
+
83
+ width.setValue( parameters.width );
84
+ height.setValue( parameters.height );
85
+ depth.setValue( parameters.depth );
86
+ widthSegments.setValue( parameters.widthSegments );
87
+ heightSegments.setValue( parameters.heightSegments );
88
+ depthSegments.setValue( parameters.depthSegments );
89
+
90
+ }
91
+
92
+ signals.geometryChanged.add( function ( mesh ) {
93
+
94
+ if ( mesh === object ) {
95
+
96
+ refreshUI();
97
+
98
+ }
99
+
100
+ } );
101
+
102
+ //
103
+
104
+ function update() {
105
+
106
+ editor.execute( new SetGeometryCommand( editor, object, new THREE.BoxGeometry(
107
+ width.getValue(),
108
+ height.getValue(),
109
+ depth.getValue(),
110
+ widthSegments.getValue(),
111
+ heightSegments.getValue(),
112
+ depthSegments.getValue()
113
+ ) ) );
114
+
115
+ }
116
+
117
+ return container;
118
+
119
+ }
120
+
121
+ export { GeometryParametersPanel };