super-three 0.157.0 → 0.158.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 (183) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +1486 -842
  3. package/build/three.js +1486 -842
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +1481 -843
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +290 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +12 -1
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +1 -1
  12. package/examples/jsm/exporters/GLTFExporter.js +72 -2
  13. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  14. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  15. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  16. package/examples/jsm/libs/opentype.module.js +13 -75
  17. package/examples/jsm/libs/surfaceNet.js +201 -0
  18. package/examples/jsm/loaders/GLTFLoader.js +12 -3
  19. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  20. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  22. package/examples/jsm/math/Capsule.js +0 -55
  23. package/examples/jsm/math/Octree.js +70 -3
  24. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  25. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  26. package/examples/jsm/nodes/Nodes.js +6 -6
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
  28. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  29. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  31. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  32. package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
  33. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  35. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  36. package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
  37. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  38. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  39. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  40. package/examples/jsm/nodes/core/Node.js +7 -12
  41. package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
  42. package/examples/jsm/nodes/core/NodeUtils.js +4 -2
  43. package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
  44. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  45. package/examples/jsm/nodes/core/PropertyNode.js +4 -10
  46. package/examples/jsm/nodes/core/StackNode.js +7 -17
  47. package/examples/jsm/nodes/core/TempNode.js +1 -1
  48. package/examples/jsm/nodes/core/VarNode.js +6 -35
  49. package/examples/jsm/nodes/core/VaryingNode.js +2 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  51. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  52. package/examples/jsm/nodes/display/ViewportNode.js +14 -4
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  54. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  55. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  56. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  57. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  58. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  59. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  60. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  61. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  62. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  63. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  65. package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
  66. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  67. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  68. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  69. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
  70. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  71. package/examples/jsm/nodes/materials/Materials.js +1 -0
  72. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  73. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  74. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  75. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  76. package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
  77. package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
  78. package/examples/jsm/nodes/math/OperatorNode.js +5 -21
  79. package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
  80. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  81. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  82. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  83. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  84. package/examples/jsm/nodes/utils/SplitNode.js +2 -0
  85. package/examples/jsm/objects/BatchedMesh.js +586 -0
  86. package/examples/jsm/objects/InstancedPoints.js +21 -0
  87. package/examples/jsm/objects/Lensflare.js +20 -0
  88. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  89. package/examples/jsm/objects/Refractor.js +3 -0
  90. package/examples/jsm/objects/Sky.js +5 -3
  91. package/examples/jsm/objects/Water.js +5 -2
  92. package/examples/jsm/objects/Water2.js +3 -0
  93. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  94. package/examples/jsm/physics/RapierPhysics.js +21 -0
  95. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  96. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  97. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  98. package/examples/jsm/postprocessing/Pass.js +14 -3
  99. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  100. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  101. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  102. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  103. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  104. package/examples/jsm/renderers/common/Bindings.js +1 -1
  105. package/examples/jsm/renderers/common/RenderObject.js +8 -1
  106. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  107. package/examples/jsm/renderers/common/Textures.js +4 -36
  108. package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
  109. package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
  110. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
  111. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  113. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
  114. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
  115. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  116. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  117. package/examples/jsm/shaders/BasicShader.js +2 -0
  118. package/examples/jsm/shaders/BlendShader.js +2 -0
  119. package/examples/jsm/shaders/BokehShader.js +2 -0
  120. package/examples/jsm/shaders/BokehShader2.js +4 -0
  121. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  122. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  123. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  124. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  125. package/examples/jsm/shaders/FXAAShader.js +2 -0
  126. package/examples/jsm/shaders/FilmShader.js +1 -1
  127. package/examples/jsm/shaders/FocusShader.js +2 -0
  128. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  129. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  130. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  131. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  132. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  133. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  134. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  135. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  136. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  137. package/examples/jsm/shaders/MirrorShader.js +2 -0
  138. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  139. package/examples/jsm/shaders/OutputShader.js +4 -5
  140. package/examples/jsm/shaders/SAOShader.js +5 -0
  141. package/examples/jsm/shaders/SMAAShader.js +6 -0
  142. package/examples/jsm/shaders/SSAOShader.js +6 -0
  143. package/examples/jsm/shaders/SSRShader.js +6 -0
  144. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  145. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  146. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  147. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  148. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  149. package/examples/jsm/shaders/VelocityShader.js +2 -0
  150. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  151. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  152. package/examples/jsm/transpiler/AST.js +231 -0
  153. package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
  154. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  155. package/examples/jsm/transpiler/TSLEncoder.js +611 -0
  156. package/examples/jsm/transpiler/Transpiler.js +18 -0
  157. package/examples/jsm/webxr/VRButton.js +1 -1
  158. package/examples/jsm/webxr/XRButton.js +7 -5
  159. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  160. package/package.json +4 -1
  161. package/src/constants.js +7 -1
  162. package/src/extras/PMREMGenerator.js +7 -1
  163. package/src/loaders/MaterialLoader.js +10 -2
  164. package/src/materials/Material.js +27 -13
  165. package/src/math/Box3.js +35 -18
  166. package/src/math/Vector3.js +11 -12
  167. package/src/objects/SkinnedMesh.js +6 -7
  168. package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
  169. package/src/renderers/WebGLRenderer.js +199 -45
  170. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  171. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  172. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  173. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  174. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
  175. package/src/renderers/webgl/WebGLBackground.js +1 -1
  176. package/src/renderers/webgl/WebGLMultiview.js +100 -0
  177. package/src/renderers/webgl/WebGLProgram.js +130 -50
  178. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  179. package/src/renderers/webgl/WebGLState.js +25 -4
  180. package/src/renderers/webgl/WebGLTextures.js +197 -20
  181. package/src/renderers/webxr/WebXRManager.js +36 -12
  182. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  183. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -0,0 +1,49 @@
1
+ import { Return, VariableDeclaration, Accessor } from './AST.js';
2
+ import GLSLDecoder from './GLSLDecoder.js';
3
+
4
+ class ShaderToyDecoder extends GLSLDecoder {
5
+
6
+ constructor() {
7
+
8
+ super();
9
+
10
+ this.addKeyword( 'iTime', 'float iTime = timerGlobal();' );
11
+ this.addKeyword( 'iResolution', 'vec2 iResolution = viewportResolution;' );
12
+ this.addKeyword( 'fragCoord', 'vec2 fragCoord = vec2( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y );' );
13
+
14
+ }
15
+
16
+ parseFunction() {
17
+
18
+ const node = super.parseFunction();
19
+
20
+ if ( node.name === 'mainImage' ) {
21
+
22
+ node.params = []; // remove default parameters
23
+ node.type = 'vec4';
24
+ node.layout = false; // for now
25
+
26
+ const fragColor = new Accessor( 'fragColor' );
27
+
28
+ for ( const subNode of node.body ) {
29
+
30
+ if ( subNode.isReturn ) {
31
+
32
+ subNode.value = fragColor;
33
+
34
+ }
35
+
36
+ }
37
+
38
+ node.body.unshift( new VariableDeclaration( 'vec4', 'fragColor' ) );
39
+ node.body.push( new Return( fragColor ) );
40
+
41
+ }
42
+
43
+ return node;
44
+
45
+ }
46
+
47
+ }
48
+
49
+ export default ShaderToyDecoder;
@@ -0,0 +1,611 @@
1
+ import { REVISION } from 'three';
2
+ import { VariableDeclaration, Accessor } from './AST.js';
3
+ import * as Nodes from 'three/nodes';
4
+
5
+ const opLib = {
6
+ '=': 'assign',
7
+ '+': 'add',
8
+ '-': 'sub',
9
+ '*': 'mul',
10
+ '/': 'div',
11
+ '%': 'remainder',
12
+ '<': 'lessThan',
13
+ '>': 'greaterThan',
14
+ '<=': 'lessThanEqual',
15
+ '>=': 'greaterThanEqual',
16
+ '==': 'equal',
17
+ '&&': 'and',
18
+ '||': 'or',
19
+ '^^': 'xor',
20
+ '&': 'bitAnd',
21
+ '|': 'bitOr',
22
+ '^': 'bitXor',
23
+ '<<': 'shiftLeft',
24
+ '>>': 'shiftRight',
25
+ '+=': 'addAssign',
26
+ '-=': 'subAssign',
27
+ '*=': 'mulAssign',
28
+ '/=': 'divAssign',
29
+ '%=': 'remainderAssign',
30
+ '^=': 'xorAssign',
31
+ '&=': 'bitAndAssign',
32
+ '|=': 'bitOrAssign',
33
+ '<<=': 'shiftLeftAssign',
34
+ '>>=': 'shiftRightAssign'
35
+ };
36
+
37
+ const unaryLib = {
38
+ '+': '', // positive
39
+ '-': 'negate',
40
+ '~': 'bitNot',
41
+ '!': 'not',
42
+ '++': 'increment', // incrementBefore
43
+ '--': 'decrement' // decrementBefore
44
+ };
45
+
46
+ const isPrimitive = ( value ) => /^(true|false|-?\d)/.test( value );
47
+
48
+ class TSLEncoder {
49
+
50
+ constructor() {
51
+
52
+ this.tab = '';
53
+ this.imports = new Set();
54
+ this.functions = new Set();
55
+ this.layoutsCode = '';
56
+ this.iife = false;
57
+ this.uniqueNames = false;
58
+
59
+ this._currentProperties = {};
60
+ this._lastStatment = null;
61
+
62
+ }
63
+
64
+ addImport( name ) {
65
+
66
+ // import only if it's a node
67
+
68
+ name = name.split( '.' )[ 0 ];
69
+
70
+ if ( Nodes[ name ] !== undefined && this.functions.has( name ) === false && this._currentProperties[ name ] === undefined ) {
71
+
72
+ this.imports.add( name );
73
+
74
+ }
75
+
76
+ }
77
+
78
+ emitExpression( node ) {
79
+
80
+ let code;
81
+
82
+ if ( node.isAccessor ) {
83
+
84
+ this.addImport( node.property );
85
+
86
+ code = node.property;
87
+
88
+ } else if ( node.isNumber ) {
89
+
90
+ if ( node.type === 'int' || node.type === 'uint' ) {
91
+
92
+ code = node.type + '( ' + node.value + ' )';
93
+
94
+ this.addImport( node.type );
95
+
96
+ } else {
97
+
98
+ code = node.value;
99
+
100
+ }
101
+
102
+ } else if ( node.isOperator ) {
103
+
104
+ const opFn = opLib[ node.type ] || node.type;
105
+
106
+ const left = this.emitExpression( node.left );
107
+ const right = this.emitExpression( node.right );
108
+
109
+ if ( isPrimitive( left ) && isPrimitive( right ) ) {
110
+
111
+ return left + ' ' + node.type + ' ' + right;
112
+
113
+ }
114
+
115
+ if ( isPrimitive( left ) ) {
116
+
117
+ code = opFn + '( ' + left + ', ' + right + ' )';
118
+
119
+ this.addImport( opFn );
120
+
121
+ } else {
122
+
123
+ code = left + '.' + opFn + '( ' + right + ' )';
124
+
125
+ }
126
+
127
+ } else if ( node.isFunctionCall ) {
128
+
129
+ const params = [];
130
+
131
+ for ( const parameter of node.params ) {
132
+
133
+ params.push( this.emitExpression( parameter ) );
134
+
135
+ }
136
+
137
+ this.addImport( node.name );
138
+
139
+ const paramsStr = params.length > 0 ? ' ' + params.join( ', ' ) + ' ' : '';
140
+
141
+ code = `${ node.name }(${ paramsStr })`;
142
+
143
+ } else if ( node.isReturn ) {
144
+
145
+ code = 'return';
146
+
147
+ if ( node.value ) {
148
+
149
+ code += ' ' + this.emitExpression( node.value );
150
+
151
+ }
152
+
153
+ } else if ( node.isAccessorElements ) {
154
+
155
+ code = node.property;
156
+
157
+ for ( const element of node.elements ) {
158
+
159
+ if ( element.isStaticElement ) {
160
+
161
+ code += '.' + this.emitExpression( element.value );
162
+
163
+ } else if ( element.isDynamicElement ) {
164
+
165
+ const value = this.emitExpression( element.value );
166
+
167
+ if ( isPrimitive( value ) ) {
168
+
169
+ code += `[ ${ value } ]`;
170
+
171
+ } else {
172
+
173
+ code += `.element( ${ value } )`;
174
+
175
+ }
176
+
177
+ }
178
+
179
+ }
180
+
181
+ } else if ( node.isDynamicElement ) {
182
+
183
+ code = this.emitExpression( node.value );
184
+
185
+ } else if ( node.isStaticElement ) {
186
+
187
+ code = this.emitExpression( node.value );
188
+
189
+ } else if ( node.isFor ) {
190
+
191
+ code = this.emitFor( node );
192
+
193
+ } else if ( node.isVariableDeclaration ) {
194
+
195
+ code = this.emitVariables( node );
196
+
197
+ } else if ( node.isTernary ) {
198
+
199
+ code = this.emitTernary( node );
200
+
201
+ } else if ( node.isConditional ) {
202
+
203
+ code = this.emitConditional( node );
204
+
205
+ } else if ( node.isUnary && node.expression.isNumber ) {
206
+
207
+ code = node.type + node.expression.value;
208
+
209
+ } else if ( node.isUnary ) {
210
+
211
+ let type = unaryLib[ node.type ];
212
+
213
+ if ( node.after === false && ( node.type === '++' || node.type === '--' ) ) {
214
+
215
+ type += 'Before';
216
+
217
+ }
218
+
219
+ const exp = this.emitExpression( node.expression );
220
+
221
+ if ( isPrimitive( exp ) ) {
222
+
223
+ this.addImport( type );
224
+
225
+ code = type + '( ' + exp + ' )';
226
+
227
+ } else {
228
+
229
+ code = exp + '.' + type + '()';
230
+
231
+ }
232
+
233
+ } else {
234
+
235
+ console.error( 'Unknown node type', node );
236
+
237
+ }
238
+
239
+ if ( ! code ) code = '/* unknown statement */';
240
+
241
+ return code;
242
+
243
+ }
244
+
245
+ emitBody( body ) {
246
+
247
+ this.setLastStatement( null );
248
+
249
+ let code = '';
250
+
251
+ this.tab += '\t';
252
+
253
+ for ( const statement of body ) {
254
+
255
+ code += this.emitExtraLine( statement );
256
+ code += this.tab + this.emitExpression( statement );
257
+
258
+ if ( code.slice( - 1 ) !== '}' ) code += ';';
259
+
260
+ code += '\n';
261
+
262
+ this.setLastStatement( statement );
263
+
264
+ }
265
+
266
+ code = code.slice( 0, - 1 ); // remove the last extra line
267
+
268
+ this.tab = this.tab.slice( 0, - 1 );
269
+
270
+ return code;
271
+
272
+
273
+ }
274
+
275
+ emitTernary( node ) {
276
+
277
+ const condStr = this.emitExpression( node.cond );
278
+ const leftStr = this.emitExpression( node.left );
279
+ const rightStr = this.emitExpression( node.right );
280
+
281
+ this.addImport( 'cond' );
282
+
283
+ return `cond( ${ condStr }, ${ leftStr }, ${ rightStr } )`;
284
+
285
+ }
286
+
287
+ emitConditional( node ) {
288
+
289
+ const condStr = this.emitExpression( node.cond );
290
+ const bodyStr = this.emitBody( node.body );
291
+
292
+ let ifStr = `If( ${ condStr }, () => {
293
+
294
+ ${ bodyStr }
295
+
296
+ ${ this.tab }} )`;
297
+
298
+ let current = node;
299
+
300
+ while ( current.elseConditional ) {
301
+
302
+ const elseBodyStr = this.emitBody( current.elseConditional.body );
303
+
304
+ if ( current.elseConditional.cond ) {
305
+
306
+ const elseCondStr = this.emitExpression( current.elseConditional.cond );
307
+
308
+ ifStr += `.elseif( ( ${ elseCondStr } ) => {
309
+
310
+ ${ elseBodyStr }
311
+
312
+ ${ this.tab }} )`;
313
+
314
+ } else {
315
+
316
+ ifStr += `.else( () => {
317
+
318
+ ${ elseBodyStr }
319
+
320
+ ${ this.tab }} )`;
321
+
322
+ }
323
+
324
+ current = current.elseConditional;
325
+
326
+
327
+ }
328
+
329
+ this.imports.add( 'If' );
330
+
331
+ return ifStr;
332
+
333
+ }
334
+
335
+ emitLoop( node ) {
336
+
337
+ const start = this.emitExpression( node.initialization.value );
338
+ const end = this.emitExpression( node.condition.right );
339
+
340
+ const name = node.initialization.name;
341
+ const type = node.initialization.type;
342
+ const condition = node.condition.type;
343
+ const update = node.afterthought.type;
344
+
345
+ const nameParam = name !== 'i' ? `, name: '${ name }'` : '';
346
+ const typeParam = type !== 'int' ? `, type: '${ type }'` : '';
347
+ const conditionParam = condition !== '<' ? `, condition: '${ condition }'` : '';
348
+ const updateParam = update !== '++' ? `, update: '${ update }'` : '';
349
+
350
+ let loopStr = `loop( { start: ${ start }, end: ${ end + nameParam + typeParam + conditionParam + updateParam } }, ( { ${ name } } ) => {\n\n`;
351
+
352
+ loopStr += this.emitBody( node.body ) + '\n\n';
353
+
354
+ loopStr += this.tab + '} )';
355
+
356
+ this.imports.add( 'loop' );
357
+
358
+ return loopStr;
359
+
360
+ }
361
+
362
+ emitFor( node ) {
363
+
364
+ const { initialization, condition, afterthought } = node;
365
+
366
+ if ( ( initialization && initialization.isVariableDeclaration && initialization.next === null ) &&
367
+ ( condition && condition.left.isAccessor && condition.left.property === initialization.name ) &&
368
+ ( afterthought && afterthought.isUnary ) &&
369
+ ( initialization.name === afterthought.expression.property )
370
+ ) {
371
+
372
+ return this.emitLoop( node );
373
+
374
+ }
375
+
376
+ return this.emitForWhile( node );
377
+
378
+ }
379
+
380
+ emitForWhile( node ) {
381
+
382
+ const initialization = this.emitExpression( node.initialization );
383
+ const condition = this.emitExpression( node.condition );
384
+ const afterthought = this.emitExpression( node.afterthought );
385
+
386
+ this.tab += '\t';
387
+
388
+ let forStr = '{\n\n' + this.tab + initialization + ';\n\n';
389
+ forStr += `${ this.tab }While( ${ condition }, () => {\n\n`;
390
+
391
+ forStr += this.emitBody( node.body ) + '\n\n';
392
+
393
+ forStr += this.tab + '\t' + afterthought + ';\n\n';
394
+
395
+ forStr += this.tab + '} )\n\n';
396
+
397
+ this.tab = this.tab.slice( 0, - 1 );
398
+
399
+ forStr += this.tab + '}';
400
+
401
+ this.imports.add( 'While' );
402
+
403
+ return forStr;
404
+
405
+ }
406
+
407
+ emitVariables( node, isRoot = true ) {
408
+
409
+ const { name, type, value, next } = node;
410
+
411
+ const valueStr = value ? this.emitExpression( value ) : '';
412
+
413
+ let varStr = isRoot ? 'const ' : '';
414
+ varStr += name;
415
+
416
+ if ( value ) {
417
+
418
+ if ( value.isFunctionCall && value.name === type ) {
419
+
420
+ varStr += ' = ' + valueStr;
421
+
422
+ } else {
423
+
424
+ varStr += ` = ${ type }( ${ valueStr } )`;
425
+
426
+ }
427
+
428
+ } else {
429
+
430
+ varStr += ` = ${ type }()`;
431
+
432
+ }
433
+
434
+ if ( node.immutable === false ) {
435
+
436
+ varStr += '.toVar()';
437
+
438
+ }
439
+
440
+ if ( next ) {
441
+
442
+ varStr += ', ' + this.emitVariables( next, false );
443
+
444
+ }
445
+
446
+ this.addImport( type );
447
+
448
+ return varStr;
449
+
450
+ }
451
+
452
+ emitFunction( node ) {
453
+
454
+ const { name, type } = node;
455
+
456
+ this._currentProperties = { name: node };
457
+
458
+ const params = [];
459
+ const inputs = [];
460
+ const mutableParams = [];
461
+
462
+ let hasPointer = false;
463
+
464
+ for ( const param of node.params ) {
465
+
466
+ let str = `{ name: '${ param.name }', type: '${ param.type }'`;
467
+
468
+ let name = param.name;
469
+
470
+ if ( param.immutable === false && ( param.qualifier !== 'inout' && param.qualifier !== 'out' ) ) {
471
+
472
+ name = name + '_immutable';
473
+
474
+ mutableParams.push( param );
475
+
476
+ }
477
+
478
+ if ( param.qualifier ) {
479
+
480
+ if ( param.qualifier === 'inout' || param.qualifier === 'out' ) {
481
+
482
+ hasPointer = true;
483
+
484
+ }
485
+
486
+ str += ', qualifier: \'' + param.qualifier + '\'';
487
+
488
+ }
489
+
490
+ inputs.push( str + ' }' );
491
+ params.push( name );
492
+
493
+ this._currentProperties[ name ] = param;
494
+
495
+ }
496
+
497
+ for ( const param of mutableParams ) {
498
+
499
+ node.body.unshift( new VariableDeclaration( param.type, param.name, new Accessor( param.name + '_immutable' ) ) );
500
+
501
+ }
502
+
503
+ const paramsStr = params.length > 0 ? ' [ ' + params.join( ', ' ) + ' ] ' : '';
504
+ const bodyStr = this.emitBody( node.body );
505
+
506
+ const funcStr = `const ${ name } = tslFn( (${ paramsStr }) => {
507
+
508
+ ${ bodyStr }
509
+
510
+ ${ this.tab }} );\n`;
511
+
512
+ const layoutInput = inputs.length > 0 ? '\n\t\t' + this.tab + inputs.join( ',\n\t\t' + this.tab ) + '\n\t' + this.tab : '';
513
+
514
+ if ( node.layout !== false && hasPointer === false ) {
515
+
516
+ const uniqueName = this.uniqueNames ? name + '_' + Math.random().toString( 36 ).slice( 2 ) : name;
517
+
518
+ this.layoutsCode += `${ this.tab + name }.setLayout( {
519
+ ${ this.tab }\tname: '${ uniqueName }',
520
+ ${ this.tab }\ttype: '${ type }',
521
+ ${ this.tab }\tinputs: [${ layoutInput }]
522
+ ${ this.tab }} );\n\n`;
523
+
524
+ }
525
+
526
+ this.imports.add( 'tslFn' );
527
+
528
+ this.functions.add( node.name );
529
+
530
+ return funcStr;
531
+
532
+ }
533
+
534
+ setLastStatement( statement ) {
535
+
536
+ this._lastStatment = statement;
537
+
538
+ }
539
+
540
+ emitExtraLine( statement ) {
541
+
542
+ const last = this._lastStatment;
543
+ if ( last === null ) return '';
544
+
545
+ if ( statement.isReturn ) return '\n';
546
+
547
+ const isExpression = ( st ) => st.isFunctionDeclaration !== true && st.isFor !== true && st.isConditional !== true;
548
+ const lastExp = isExpression( last );
549
+ const currExp = isExpression( statement );
550
+
551
+ if ( lastExp !== currExp || ( ! lastExp && ! currExp ) ) return '\n';
552
+
553
+ return '';
554
+
555
+ }
556
+
557
+ emit( ast ) {
558
+
559
+ let code = '\n';
560
+
561
+ if ( this.iife ) this.tab += '\t';
562
+
563
+ for ( const statement of ast.body ) {
564
+
565
+ code += this.emitExtraLine( statement );
566
+
567
+ if ( statement.isFunctionDeclaration ) {
568
+
569
+ code += this.tab + this.emitFunction( statement );
570
+
571
+ } else {
572
+
573
+ code += this.tab + this.emitExpression( statement ) + ';\n';
574
+
575
+ }
576
+
577
+ this.setLastStatement( statement );
578
+
579
+ }
580
+
581
+ const imports = [ ...this.imports ];
582
+ const functions = [ ...this.functions ];
583
+
584
+ const layouts = this.layoutsCode.length > 0 ? `\n${ this.tab }// layouts\n\n` + this.layoutsCode : '';
585
+
586
+ let header = '// Three.js Transpiler r' + REVISION + '\n\n';
587
+ let footer = '';
588
+
589
+ if ( this.iife ) {
590
+
591
+ header += '( function ( TSL ) {\n\n';
592
+
593
+ header += imports.length > 0 ? '\tconst { ' + imports.join( ', ' ) + ' } = TSL;\n' : '';
594
+ footer += functions.length > 0 ? '\treturn { ' + functions.join( ', ' ) + ' };\n' : '';
595
+
596
+ footer += '\n} );';
597
+
598
+ } else {
599
+
600
+ header += imports.length > 0 ? 'import { ' + imports.join( ', ' ) + ' } from \'three/nodes\';\n' : '';
601
+ footer += functions.length > 0 ? 'export { ' + functions.join( ', ' ) + ' };\n' : '';
602
+
603
+ }
604
+
605
+ return header + code + layouts + footer;
606
+
607
+ }
608
+
609
+ }
610
+
611
+ export default TSLEncoder;
@@ -0,0 +1,18 @@
1
+ class Transpiler {
2
+
3
+ constructor( decoder, encoder ) {
4
+
5
+ this.decoder = decoder;
6
+ this.encoder = encoder;
7
+
8
+ }
9
+
10
+ parse( source ) {
11
+
12
+ return this.encoder.emit( this.decoder.parse( source ) );
13
+
14
+ }
15
+
16
+ }
17
+
18
+ export default Transpiler;
@@ -176,7 +176,7 @@ class VRButton {
176
176
 
177
177
  static registerSessionGrantedListener() {
178
178
 
179
- if ( 'xr' in navigator ) {
179
+ if ( typeof navigator !== 'undefined' && 'xr' in navigator ) {
180
180
 
181
181
  // WebXRViewer (based on Firefox) has a bug where addEventListener
182
182
  // throws a silent exception and aborts execution entirely.
@@ -1,6 +1,6 @@
1
1
  class XRButton {
2
2
 
3
- static createButton( renderer ) {
3
+ static createButton( renderer, sessionInit = {} ) {
4
4
 
5
5
  const button = document.createElement( 'button' );
6
6
 
@@ -56,16 +56,18 @@ class XRButton {
56
56
 
57
57
  if ( currentSession === null ) {
58
58
 
59
- const sessionInit = {
59
+ const sessionOptions = {
60
+ ...sessionInit,
60
61
  optionalFeatures: [
61
62
  'local-floor',
62
63
  'bounded-floor',
63
64
  'hand-tracking',
64
- 'layers'
65
- ]
65
+ 'layers',
66
+ ...( sessionInit.optionalFeatures || [] )
67
+ ],
66
68
  };
67
69
 
68
- navigator.xr.requestSession( mode, sessionInit )
70
+ navigator.xr.requestSession( mode, sessionOptions )
69
71
  .then( onSessionStarted );
70
72
 
71
73
  } else {