super-three 0.160.1 → 0.162.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 (225) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +867 -499
  3. package/build/three.module.js +867 -496
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/Addons.js +5 -1
  6. package/examples/jsm/capabilities/WebGPU.js +13 -9
  7. package/examples/jsm/controls/DragControls.js +91 -30
  8. package/examples/jsm/controls/OrbitControls.js +130 -15
  9. package/examples/jsm/controls/TransformControls.js +6 -6
  10. package/examples/jsm/curves/NURBSUtils.js +59 -4
  11. package/examples/jsm/curves/NURBSVolume.js +62 -0
  12. package/examples/jsm/exporters/GLTFExporter.js +11 -1
  13. package/examples/jsm/exporters/USDZExporter.js +8 -7
  14. package/examples/jsm/helpers/TextureHelper.js +3 -3
  15. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  16. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  17. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  18. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  19. package/examples/jsm/libs/tween.module.js +32 -14
  20. package/examples/jsm/loaders/3DMLoader.js +57 -64
  21. package/examples/jsm/loaders/DDSLoader.js +1 -0
  22. package/examples/jsm/loaders/KTX2Loader.js +20 -5
  23. package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
  24. package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
  25. package/examples/jsm/loaders/LUTImageLoader.js +3 -2
  26. package/examples/jsm/loaders/MaterialXLoader.js +115 -16
  27. package/examples/jsm/loaders/SVGLoader.js +4 -3
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +7 -3
  30. package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/misc/Timer.js +13 -4
  33. package/examples/jsm/nodes/Nodes.js +24 -11
  34. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  35. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
  36. package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
  37. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  38. package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
  39. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  41. package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
  42. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +45 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
  48. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  49. package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
  50. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  51. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  52. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  53. package/examples/jsm/nodes/core/Node.js +14 -4
  54. package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
  55. package/examples/jsm/nodes/core/NodeFrame.js +18 -10
  56. package/examples/jsm/nodes/core/TempNode.js +1 -1
  57. package/examples/jsm/nodes/core/constants.js +1 -0
  58. package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
  59. package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
  60. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  61. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
  62. package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
  63. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  64. package/examples/jsm/nodes/display/PassNode.js +3 -2
  65. package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
  66. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
  67. package/examples/jsm/nodes/display/ViewportNode.js +0 -2
  68. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
  69. package/examples/jsm/nodes/fog/FogNode.js +2 -1
  70. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
  72. package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
  73. package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
  77. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
  78. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
  79. package/examples/jsm/nodes/math/CondNode.js +42 -7
  80. package/examples/jsm/nodes/math/MathNode.js +32 -2
  81. package/examples/jsm/nodes/math/MathUtils.js +15 -0
  82. package/examples/jsm/nodes/math/OperatorNode.js +13 -5
  83. package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
  85. package/examples/jsm/nodes/utils/JoinNode.js +2 -2
  86. package/examples/jsm/nodes/utils/LoopNode.js +5 -3
  87. package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
  88. package/examples/jsm/nodes/utils/RotateNode.js +68 -0
  89. package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
  90. package/examples/jsm/nodes/utils/SplitNode.js +4 -4
  91. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  92. package/examples/jsm/objects/GroundedSkybox.js +50 -0
  93. package/examples/jsm/objects/QuadMesh.js +8 -2
  94. package/examples/jsm/objects/Water2.js +8 -8
  95. package/examples/jsm/postprocessing/GTAOPass.js +11 -1
  96. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  97. package/examples/jsm/renderers/common/Backend.js +14 -0
  98. package/examples/jsm/renderers/common/Background.js +2 -2
  99. package/examples/jsm/renderers/common/Bindings.js +1 -1
  100. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  101. package/examples/jsm/renderers/common/DataMap.js +1 -1
  102. package/examples/jsm/renderers/common/Info.js +25 -1
  103. package/examples/jsm/renderers/common/Pipelines.js +8 -8
  104. package/examples/jsm/renderers/common/PostProcessing.js +2 -2
  105. package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
  106. package/examples/jsm/renderers/common/RenderContext.js +2 -0
  107. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  108. package/examples/jsm/renderers/common/RenderObject.js +46 -1
  109. package/examples/jsm/renderers/common/RenderObjects.js +3 -1
  110. package/examples/jsm/renderers/common/Renderer.js +290 -17
  111. package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
  112. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  113. package/examples/jsm/renderers/common/Textures.js +28 -18
  114. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  115. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
  116. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  117. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  118. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -2
  119. package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
  121. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
  122. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
  123. package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
  124. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
  125. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  126. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
  127. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
  128. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
  129. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
  130. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
  131. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
  132. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
  133. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
  134. package/examples/jsm/shaders/OutputShader.js +4 -0
  135. package/examples/jsm/transpiler/AST.js +1 -1
  136. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  137. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  138. package/examples/jsm/transpiler/TSLEncoder.js +1 -1
  139. package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
  140. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  141. package/examples/jsm/utils/SortUtils.js +2 -0
  142. package/examples/jsm/webxr/ARButton.js +12 -2
  143. package/examples/jsm/webxr/VRButton.js +25 -7
  144. package/examples/jsm/webxr/XRButton.js +12 -3
  145. package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
  146. package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
  147. package/package.json +5 -4
  148. package/src/Three.Legacy.js +20 -0
  149. package/src/Three.js +0 -1
  150. package/src/audio/Audio.js +1 -3
  151. package/src/cameras/PerspectiveCamera.js +35 -0
  152. package/src/constants.js +2 -6
  153. package/src/core/BufferAttribute.js +2 -12
  154. package/src/core/BufferGeometry.js +23 -29
  155. package/src/core/InterleavedBuffer.js +2 -1
  156. package/src/core/InterleavedBufferAttribute.js +20 -0
  157. package/src/core/Object3D.js +11 -0
  158. package/src/core/Raycaster.js +18 -4
  159. package/src/core/RenderTarget.js +44 -21
  160. package/src/extras/PMREMGenerator.js +2 -0
  161. package/src/extras/curves/EllipseCurve.js +2 -2
  162. package/src/helpers/SpotLightHelper.js +18 -1
  163. package/src/loaders/DataTextureLoader.js +0 -4
  164. package/src/loaders/MaterialLoader.js +1 -0
  165. package/src/loaders/ObjectLoader.js +2 -1
  166. package/src/materials/Material.js +2 -1
  167. package/src/materials/MeshBasicMaterial.js +3 -0
  168. package/src/materials/MeshLambertMaterial.js +3 -0
  169. package/src/materials/MeshPhongMaterial.js +3 -0
  170. package/src/materials/MeshStandardMaterial.js +3 -0
  171. package/src/materials/ShaderMaterial.js +2 -1
  172. package/src/math/Quaternion.js +13 -12
  173. package/src/math/Triangle.js +0 -30
  174. package/src/math/Vector3.js +7 -7
  175. package/src/objects/BatchedMesh.js +6 -7
  176. package/src/objects/InstancedMesh.js +53 -0
  177. package/src/objects/Mesh.js +0 -1
  178. package/src/objects/SkinnedMesh.js +0 -8
  179. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  180. package/src/renderers/WebGLRenderer.js +20 -23
  181. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
  182. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
  183. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  184. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  185. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  186. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  187. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  188. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  189. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +38 -7
  190. package/src/renderers/shaders/ShaderChunk.js +2 -0
  191. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  192. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -2
  193. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
  194. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
  195. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
  196. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  197. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
  198. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
  199. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  200. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
  201. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
  202. package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
  203. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  204. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderLib.js +2 -1
  206. package/src/renderers/shaders/UniformsLib.js +1 -0
  207. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  208. package/src/renderers/webgl/WebGLBackground.js +18 -0
  209. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  210. package/src/renderers/webgl/WebGLMaterials.js +24 -1
  211. package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
  212. package/src/renderers/webgl/WebGLProgram.js +42 -4
  213. package/src/renderers/webgl/WebGLPrograms.js +38 -27
  214. package/src/renderers/webgl/WebGLState.js +11 -21
  215. package/src/renderers/webgl/WebGLTextures.js +170 -66
  216. package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
  217. package/src/renderers/webxr/WebXRManager.js +46 -0
  218. package/src/scenes/Scene.js +8 -0
  219. package/src/textures/Source.js +1 -0
  220. package/src/textures/Texture.js +1 -29
  221. package/build/three.js +0 -54519
  222. package/build/three.min.js +0 -7
  223. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  224. package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
  225. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -0,0 +1,227 @@
1
+ import TextureNode from '../accessors/TextureNode.js';
2
+ import { nodeObject, vec2 } from '../shadernode/ShaderNode.js';
3
+ import { NodeUpdateType } from '../core/constants.js';
4
+ import { viewportTopLeft } from '../display/ViewportNode.js';
5
+ import { Matrix4, Vector2, Vector3, Vector4, Object3D, Plane, RenderTarget, HalfFloatType, LinearMipMapLinearFilter } from 'three';
6
+
7
+ const _reflectorPlane = new Plane();
8
+ const _normal = new Vector3();
9
+ const _reflectorWorldPosition = new Vector3();
10
+ const _cameraWorldPosition = new Vector3();
11
+ const _rotationMatrix = new Matrix4();
12
+ const _lookAtPosition = new Vector3( 0, 0, - 1 );
13
+ const clipPlane = new Vector4();
14
+
15
+ const _view = new Vector3();
16
+ const _target = new Vector3();
17
+ const _q = new Vector4();
18
+
19
+ const _size = new Vector2();
20
+
21
+ const _defaultRT = new RenderTarget();
22
+ const _defaultUV = vec2( viewportTopLeft.x.oneMinus(), viewportTopLeft.y );
23
+
24
+ let _inReflector = false;
25
+
26
+ class ReflectorNode extends TextureNode {
27
+
28
+ constructor( parameters = {} ) {
29
+
30
+ super( _defaultRT.texture, _defaultUV );
31
+
32
+ const {
33
+ target = new Object3D(),
34
+ resolution = 1,
35
+ generateMipmaps = false,
36
+ bounces = true
37
+ } = parameters;
38
+
39
+ //
40
+
41
+ this.target = target;
42
+ this.resolution = resolution;
43
+ this.generateMipmaps = generateMipmaps;
44
+ this.bounces = bounces;
45
+
46
+ this.updateBeforeType = bounces ? NodeUpdateType.RENDER : NodeUpdateType.FRAME;
47
+
48
+ this.virtualCameras = new WeakMap();
49
+ this.renderTargets = new WeakMap();
50
+
51
+
52
+ }
53
+
54
+ _updateResolution( renderTarget, renderer ) {
55
+
56
+ const resolution = this.resolution;
57
+
58
+ renderer.getDrawingBufferSize( _size );
59
+
60
+ renderTarget.setSize( Math.round( _size.width * resolution ), Math.round( _size.height * resolution ) );
61
+
62
+ }
63
+
64
+ setup( builder ) {
65
+
66
+ this._updateResolution( _defaultRT, builder.renderer );
67
+
68
+ return super.setup( builder );
69
+
70
+ }
71
+
72
+ getTextureNode() {
73
+
74
+ return this.textureNode;
75
+
76
+ }
77
+
78
+ getVirtualCamera( camera ) {
79
+
80
+ let virtualCamera = this.virtualCameras.get( camera );
81
+
82
+ if ( virtualCamera === undefined ) {
83
+
84
+ virtualCamera = camera.clone();
85
+
86
+ this.virtualCameras.set( camera, virtualCamera );
87
+
88
+ }
89
+
90
+ return virtualCamera;
91
+
92
+ }
93
+
94
+ getRenderTarget( camera ) {
95
+
96
+ let renderTarget = this.renderTargets.get( camera );
97
+
98
+ if ( renderTarget === undefined ) {
99
+
100
+ renderTarget = new RenderTarget( 0, 0, { type: HalfFloatType } );
101
+
102
+ if ( this.generateMipmaps === true ) {
103
+
104
+ renderTarget.texture.minFilter = LinearMipMapLinearFilter;
105
+ renderTarget.texture.generateMipmaps = true;
106
+
107
+ }
108
+
109
+ this.renderTargets.set( camera, renderTarget );
110
+
111
+ }
112
+
113
+ return renderTarget;
114
+
115
+ }
116
+
117
+ updateBefore( frame ) {
118
+
119
+ if ( this.bounces === false && _inReflector ) return false;
120
+
121
+ _inReflector = true;
122
+
123
+ const { scene, camera, renderer, material } = frame;
124
+ const { target } = this;
125
+
126
+ const virtualCamera = this.getVirtualCamera( camera );
127
+ const renderTarget = this.getRenderTarget( virtualCamera );
128
+
129
+ renderer.getDrawingBufferSize( _size );
130
+
131
+ this._updateResolution( renderTarget, renderer );
132
+
133
+ //
134
+
135
+ _reflectorWorldPosition.setFromMatrixPosition( target.matrixWorld );
136
+ _cameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );
137
+
138
+ _rotationMatrix.extractRotation( target.matrixWorld );
139
+
140
+ _normal.set( 0, 0, 1 );
141
+ _normal.applyMatrix4( _rotationMatrix );
142
+
143
+ _view.subVectors( _reflectorWorldPosition, _cameraWorldPosition );
144
+
145
+ // Avoid rendering when reflector is facing away
146
+
147
+ if ( _view.dot( _normal ) > 0 ) return;
148
+
149
+ _view.reflect( _normal ).negate();
150
+ _view.add( _reflectorWorldPosition );
151
+
152
+ _rotationMatrix.extractRotation( camera.matrixWorld );
153
+
154
+ _lookAtPosition.set( 0, 0, - 1 );
155
+ _lookAtPosition.applyMatrix4( _rotationMatrix );
156
+ _lookAtPosition.add( _cameraWorldPosition );
157
+
158
+ _target.subVectors( _reflectorWorldPosition, _lookAtPosition );
159
+ _target.reflect( _normal ).negate();
160
+ _target.add( _reflectorWorldPosition );
161
+
162
+ //
163
+
164
+ virtualCamera.coordinateSystem = camera.coordinateSystem;
165
+ virtualCamera.position.copy( _view );
166
+ virtualCamera.up.set( 0, 1, 0 );
167
+ virtualCamera.up.applyMatrix4( _rotationMatrix );
168
+ virtualCamera.up.reflect( _normal );
169
+ virtualCamera.lookAt( _target );
170
+
171
+ virtualCamera.near = camera.near;
172
+ virtualCamera.far = camera.far;
173
+
174
+ virtualCamera.updateMatrixWorld();
175
+ virtualCamera.projectionMatrix.copy( camera.projectionMatrix );
176
+
177
+ // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
178
+ // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
179
+ _reflectorPlane.setFromNormalAndCoplanarPoint( _normal, _reflectorWorldPosition );
180
+ _reflectorPlane.applyMatrix4( virtualCamera.matrixWorldInverse );
181
+
182
+ clipPlane.set( _reflectorPlane.normal.x, _reflectorPlane.normal.y, _reflectorPlane.normal.z, _reflectorPlane.constant );
183
+
184
+ const projectionMatrix = virtualCamera.projectionMatrix;
185
+
186
+ _q.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ];
187
+ _q.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ];
188
+ _q.z = - 1.0;
189
+ _q.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ];
190
+
191
+ // Calculate the scaled plane vector
192
+ clipPlane.multiplyScalar( 1.0 / clipPlane.dot( _q ) );
193
+
194
+ const clipBias = 0;
195
+
196
+ // Replacing the third row of the projection matrix
197
+ projectionMatrix.elements[ 2 ] = clipPlane.x;
198
+ projectionMatrix.elements[ 6 ] = clipPlane.y;
199
+ projectionMatrix.elements[ 10 ] = clipPlane.z - clipBias;
200
+ projectionMatrix.elements[ 14 ] = clipPlane.w;
201
+
202
+ //
203
+
204
+ this.value = renderTarget.texture;
205
+
206
+ material.visible = false;
207
+
208
+ const currentRenderTarget = renderer.getRenderTarget();
209
+
210
+ renderer.setRenderTarget( renderTarget );
211
+
212
+ renderer.render( scene, virtualCamera );
213
+
214
+ renderer.setRenderTarget( currentRenderTarget );
215
+
216
+ material.visible = true;
217
+
218
+ _inReflector = false;
219
+
220
+ }
221
+
222
+ }
223
+
224
+ export const reflector = ( parameters ) => nodeObject( new ReflectorNode( parameters ) );
225
+
226
+ export default ReflectorNode;
227
+
@@ -0,0 +1,68 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import {
4
+ addNodeElement,
5
+ nodeProxy,
6
+ vec4,
7
+ mat2,
8
+ mat4,
9
+ } from '../shadernode/ShaderNode.js';
10
+ import { cos, sin } from '../math/MathNode.js';
11
+
12
+ class RotateNode extends TempNode {
13
+
14
+ constructor( positionNode, rotationNode ) {
15
+
16
+ super();
17
+
18
+ this.positionNode = positionNode;
19
+ this.rotationNode = rotationNode;
20
+
21
+ }
22
+
23
+ getNodeType( builder ) {
24
+
25
+ return this.positionNode.getNodeType( builder );
26
+
27
+ }
28
+
29
+ setup( builder ) {
30
+
31
+ const { rotationNode, positionNode } = this;
32
+
33
+ const nodeType = this.getNodeType( builder );
34
+
35
+ if ( nodeType === 'vec2' ) {
36
+
37
+ const cosAngle = rotationNode.cos();
38
+ const sinAngle = rotationNode.sin();
39
+
40
+ const rotationMatrix = mat2(
41
+ cosAngle, sinAngle,
42
+ sinAngle.negate(), cosAngle
43
+ );
44
+
45
+ return rotationMatrix.mul( positionNode );
46
+
47
+ } else {
48
+
49
+ const rotation = rotationNode;
50
+ const rotationXMatrix = mat4( vec4( 1.0, 0.0, 0.0, 0.0 ), vec4( 0.0, cos( rotation.x ), sin( rotation.x ).negate(), 0.0 ), vec4( 0.0, sin( rotation.x ), cos( rotation.x ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
51
+ const rotationYMatrix = mat4( vec4( cos( rotation.y ), 0.0, sin( rotation.y ), 0.0 ), vec4( 0.0, 1.0, 0.0, 0.0 ), vec4( sin( rotation.y ).negate(), 0.0, cos( rotation.y ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
52
+ const rotationZMatrix = mat4( vec4( cos( rotation.z ), sin( rotation.z ).negate(), 0.0, 0.0 ), vec4( sin( rotation.z ), cos( rotation.z ), 0.0, 0.0 ), vec4( 0.0, 0.0, 1.0, 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
53
+
54
+ return rotationXMatrix.mul( rotationYMatrix ).mul( rotationZMatrix ).mul( vec4( positionNode, 1.0 ) ).xyz;
55
+
56
+ }
57
+
58
+ }
59
+
60
+ }
61
+
62
+ export default RotateNode;
63
+
64
+ export const rotate = nodeProxy( RotateNode );
65
+
66
+ addNodeElement( 'rotate', rotate );
67
+
68
+ addNodeClass( 'RotateNode', RotateNode );
@@ -18,17 +18,9 @@ class RotateUVNode extends TempNode {
18
18
 
19
19
  const { uvNode, rotationNode, centerNode } = this;
20
20
 
21
- const cosAngle = rotationNode.cos();
22
- const sinAngle = rotationNode.sin();
23
-
24
21
  const vector = uvNode.sub( centerNode );
25
22
 
26
- const rotatedVector = vec2( // @TODO: Maybe we can create mat2 and write something like rotationMatrix.mul( vector )?
27
- vec2( cosAngle, sinAngle ).dot( vector ),
28
- vec2( sinAngle.negate(), cosAngle ).dot( vector )
29
- );
30
-
31
- return rotatedVector.add( centerNode );
23
+ return vector.rotate( rotationNode ).add( centerNode );
32
24
 
33
25
  }
34
26
 
@@ -30,15 +30,15 @@ class SplitNode extends Node {
30
30
 
31
31
  }
32
32
 
33
- getPrimitiveType( builder ) {
33
+ getComponentType( builder ) {
34
34
 
35
- return builder.getPrimitiveType( this.node.getNodeType( builder ) );
35
+ return builder.getComponentType( this.node.getNodeType( builder ) );
36
36
 
37
37
  }
38
38
 
39
39
  getNodeType( builder ) {
40
40
 
41
- return builder.getTypeFromLength( this.components.length, this.getPrimitiveType( builder ) );
41
+ return builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) );
42
42
 
43
43
  }
44
44
 
@@ -59,7 +59,7 @@ class SplitNode extends Node {
59
59
 
60
60
  // needed expand the input node
61
61
 
62
- type = builder.getTypeFromLength( this.getVectorLength(), this.getPrimitiveType( builder ) );
62
+ type = builder.getTypeFromLength( this.getVectorLength(), this.getComponentType( builder ) );
63
63
 
64
64
  }
65
65
 
@@ -0,0 +1,91 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import { nodeProxy, addNodeElement } from '../shadernode/ShaderNode.js';
3
+ import ArrayElementNode from './ArrayElementNode.js';
4
+
5
+ class StorageArrayElementNode extends ArrayElementNode {
6
+
7
+ constructor( storageBufferNode, indexNode ) {
8
+
9
+ super( storageBufferNode, indexNode );
10
+
11
+ this.isStorageArrayElementNode = true;
12
+
13
+ }
14
+
15
+ set storageBufferNode( value ) {
16
+
17
+ this.node = value;
18
+
19
+ }
20
+
21
+ get storageBufferNode() {
22
+
23
+ return this.node;
24
+
25
+ }
26
+
27
+ setup( builder ) {
28
+
29
+ if ( builder.isAvailable( 'storageBuffer' ) === false ) {
30
+
31
+ if ( ! this.node.instanceIndex && this.node.bufferObject === true ) {
32
+
33
+ builder.setupPBO( this.node );
34
+
35
+ }
36
+
37
+ }
38
+
39
+ return super.setup( builder );
40
+
41
+ }
42
+
43
+ generate( builder, output ) {
44
+
45
+ let snippet;
46
+
47
+ const isAssignContext = builder.context.assign;
48
+
49
+ //
50
+
51
+ if ( builder.isAvailable( 'storageBuffer' ) === false ) {
52
+
53
+ const { node } = this;
54
+
55
+ if ( ! node.instanceIndex && this.node.bufferObject === true && isAssignContext !== true ) {
56
+
57
+ snippet = builder.generatePBO( this );
58
+
59
+ } else {
60
+
61
+ snippet = node.build( builder );
62
+
63
+ }
64
+
65
+ } else {
66
+
67
+ snippet = super.generate( builder );
68
+
69
+ }
70
+
71
+ if ( isAssignContext !== true ) {
72
+
73
+ const type = this.getNodeType( builder );
74
+
75
+ snippet = builder.format( snippet, type, output );
76
+
77
+ }
78
+
79
+ return snippet;
80
+
81
+ }
82
+
83
+ }
84
+
85
+ export default StorageArrayElementNode;
86
+
87
+ export const storageElement = nodeProxy( StorageArrayElementNode );
88
+
89
+ addNodeElement( 'storageElement', storageElement );
90
+
91
+ addNodeClass( 'StorageArrayElementNode', StorageArrayElementNode );
@@ -0,0 +1,50 @@
1
+ import { Mesh, MeshBasicMaterial, SphereGeometry, Vector3 } from 'three';
2
+
3
+ /**
4
+ * A ground-projected skybox. The height is how far the camera that took the photo was above the ground -
5
+ * a larger value will magnify the downward part of the image. By default the object is centered at the camera,
6
+ * so it is often helpful to set skybox.position.y = height to put the ground at the origin. Set the radius
7
+ * large enough to ensure your user's camera stays inside.
8
+ */
9
+
10
+ class GroundedSkybox extends Mesh {
11
+
12
+ constructor( map, height, radius, resolution = 128 ) {
13
+
14
+ if ( height <= 0 || radius <= 0 || resolution <= 0 ) {
15
+
16
+ throw new Error( 'GroundedSkybox height, radius, and resolution must be positive.' );
17
+
18
+ }
19
+
20
+ const geometry = new SphereGeometry( radius, 2 * resolution, resolution );
21
+ geometry.scale( 1, 1, -1 );
22
+
23
+ const pos = geometry.getAttribute( 'position' );
24
+ const tmp = new Vector3();
25
+
26
+ for ( let i = 0; i < pos.count; ++ i ) {
27
+
28
+ tmp.fromBufferAttribute( pos, i );
29
+ if ( tmp.y < 0 ) {
30
+
31
+ // Smooth out the transition from flat floor to sphere:
32
+ const y1 = - height * 3 / 2;
33
+ const f =
34
+ tmp.y < y1 ? - height / tmp.y : ( 1 - tmp.y * tmp.y / ( 3 * y1 * y1 ) );
35
+ tmp.multiplyScalar( f );
36
+ tmp.toArray( pos.array, 3 * i );
37
+
38
+ }
39
+
40
+ }
41
+
42
+ pos.needsUpdate = true;
43
+
44
+ super( geometry, new MeshBasicMaterial( { map, depthWrite: false } ) );
45
+
46
+ }
47
+
48
+ }
49
+
50
+ export { GroundedSkybox };
@@ -37,9 +37,9 @@ class QuadMesh {
37
37
 
38
38
  }
39
39
 
40
- render( renderer ) {
40
+ async renderAsync( renderer ) {
41
41
 
42
- renderer.render( this._mesh, _camera );
42
+ await renderer.renderAsync( this._mesh, _camera );
43
43
 
44
44
  }
45
45
 
@@ -55,6 +55,12 @@ class QuadMesh {
55
55
 
56
56
  }
57
57
 
58
+ get render() {
59
+
60
+ return this.renderAsync;
61
+
62
+ }
63
+
58
64
  }
59
65
 
60
66
  export default QuadMesh;
@@ -34,14 +34,14 @@ class Water extends Mesh {
34
34
  const scope = this;
35
35
 
36
36
  const color = ( options.color !== undefined ) ? new Color( options.color ) : new Color( 0xFFFFFF );
37
- const textureWidth = options.textureWidth || 512;
38
- const textureHeight = options.textureHeight || 512;
39
- const clipBias = options.clipBias || 0;
40
- const flowDirection = options.flowDirection || new Vector2( 1, 0 );
41
- const flowSpeed = options.flowSpeed || 0.03;
42
- const reflectivity = options.reflectivity || 0.02;
43
- const scale = options.scale || 1;
44
- const shader = options.shader || Water.WaterShader;
37
+ const textureWidth = options.textureWidth !== undefined ? options.textureWidth : 512;
38
+ const textureHeight = options.textureHeight !== undefined ? options.textureHeight : 512;
39
+ const clipBias = options.clipBias !== undefined ? options.clipBias : 0;
40
+ const flowDirection = options.flowDirection !== undefined ? options.flowDirection : new Vector2( 1, 0 );
41
+ const flowSpeed = options.flowSpeed !== undefined ? options.flowSpeed : 0.03;
42
+ const reflectivity = options.reflectivity !== undefined ? options.reflectivity : 0.02;
43
+ const scale = options.scale !== undefined ? options.scale : 1;
44
+ const shader = options.shader !== undefined ? options.shader : Water.WaterShader;
45
45
 
46
46
  const textureLoader = new TextureLoader();
47
47
 
@@ -61,7 +61,7 @@ class GTAOPass extends Pass {
61
61
  depthTest: false,
62
62
  depthWrite: false,
63
63
  } );
64
- this.gtaoMaterial.definesPERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0;
64
+ this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0;
65
65
  this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture;
66
66
  this.gtaoMaterial.uniforms.resolution.value.set( this.width, this.height );
67
67
  this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near;
@@ -162,6 +162,12 @@ class GTAOPass extends Pass {
162
162
 
163
163
  }
164
164
 
165
+ get gtaoMap() {
166
+
167
+ return this.pdRenderTarget.texture;
168
+
169
+ }
170
+
165
171
  setGBuffer( depthTexture, normalTexture ) {
166
172
 
167
173
  if ( depthTexture !== undefined ) {
@@ -359,6 +365,9 @@ class GTAOPass extends Pass {
359
365
 
360
366
  switch ( this.output ) {
361
367
 
368
+ case GTAOPass.OUTPUT.Off:
369
+ break;
370
+
362
371
  case GTAOPass.OUTPUT.Diffuse:
363
372
 
364
373
  this.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture;
@@ -561,6 +570,7 @@ class GTAOPass extends Pass {
561
570
  }
562
571
 
563
572
  GTAOPass.OUTPUT = {
573
+ 'Off': - 1,
564
574
  'Default': 0,
565
575
  'Diffuse': 1,
566
576
  'Depth': 2,
@@ -7,6 +7,7 @@ import {
7
7
  CineonToneMapping,
8
8
  AgXToneMapping,
9
9
  ACESFilmicToneMapping,
10
+ NeutralToneMapping,
10
11
  SRGBTransfer
11
12
  } from 'three';
12
13
  import { Pass, FullScreenQuad } from './Pass.js';
@@ -61,6 +62,7 @@ class OutputPass extends Pass {
61
62
  else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
62
63
  else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
63
64
  else if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = '';
65
+ else if ( this._toneMapping === NeutralToneMapping ) this.material.defines.NEUTRAL_TONE_MAPPING = '';
64
66
 
65
67
  this.material.needsUpdate = true;
66
68
 
@@ -84,10 +84,16 @@ class Backend {
84
84
 
85
85
  // canvas
86
86
 
87
+ getContext() { }
88
+
87
89
  updateSize() { }
88
90
 
89
91
  // utils
90
92
 
93
+ resolveTimestampAsync( renderContext, type ) { }
94
+
95
+ hasFeatureAsync( name ) { } // return Boolean
96
+
91
97
  hasFeature( name ) { } // return Boolean
92
98
 
93
99
  getInstanceCount( renderObject ) {
@@ -114,6 +120,8 @@ class Backend {
114
120
 
115
121
  }
116
122
 
123
+ setScissorTest( boolean ) { }
124
+
117
125
  getClearColor() {
118
126
 
119
127
  const renderer = this.renderer;
@@ -170,6 +178,12 @@ class Backend {
170
178
 
171
179
  }
172
180
 
181
+ has( object ) {
182
+
183
+ return this.data.has( object );
184
+
185
+ }
186
+
173
187
  delete( object ) {
174
188
 
175
189
  this.data.delete( object );
@@ -1,7 +1,7 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import Color4 from './Color4.js';
3
3
  import { Mesh, SphereGeometry, BackSide } from 'three';
4
- import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
4
+ import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection, maxMipLevel } from '../../nodes/Nodes.js';
5
5
 
6
6
  const _clearColor = new Color4();
7
7
 
@@ -53,7 +53,7 @@ class Background extends DataMap {
53
53
  const backgroundMeshNode = context( vec4( backgroundNode ), {
54
54
  // @TODO: Add Texture2D support using node context
55
55
  getUV: () => normalWorld,
56
- getTextureLevel: () => backgroundBlurriness
56
+ getTextureLevel: ( textureNode ) => backgroundBlurriness.mul( maxMipLevel( textureNode ) )
57
57
  } ).mul( backgroundIntensity );
58
58
 
59
59
  let viewProj = modelViewProjection();
@@ -48,7 +48,7 @@ class Bindings extends DataMap {
48
48
 
49
49
  const nodeBuilderState = this.nodes.getForCompute( computeNode );
50
50
 
51
- const bindings = nodeBuilderState.bindings.compute;
51
+ const bindings = nodeBuilderState.bindings;
52
52
 
53
53
  data.bindings = bindings;
54
54