super-three 0.172.0 → 0.173.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/build/three.cjs +439 -380
- package/build/three.core.js +413 -41
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +28 -344
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +11 -3
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +7550 -1798
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +7551 -1798
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +6 -5
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +23 -21
- package/examples/jsm/exporters/GLTFExporter.js +26 -25
- package/examples/jsm/geometries/TextGeometry.js +1 -12
- package/examples/jsm/interactive/InteractiveGroup.js +108 -51
- package/examples/jsm/libs/demuxer_mp4.js +109 -0
- package/examples/jsm/loaders/GCodeLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +0 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -1
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
- package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +4 -3
- package/examples/jsm/misc/Volume.js +7 -5
- package/examples/jsm/misc/VolumeSlice.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +25 -20
- package/examples/jsm/physics/JoltPhysics.js +7 -7
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +5 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
- package/examples/jsm/transpiler/TSLEncoder.js +2 -0
- package/package.json +1 -1
- package/src/Three.Core.js +2 -0
- package/src/Three.TSL.js +9 -1
- package/src/cameras/ArrayCamera.js +1 -0
- package/src/constants.js +6 -1
- package/src/core/BufferAttribute.js +4 -0
- package/src/core/EventDispatcher.js +8 -6
- package/src/extras/ImageUtils.js +1 -11
- package/src/loaders/nodes/NodeObjectLoader.js +1 -1
- package/src/materials/nodes/MeshBasicNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +5 -5
- package/src/materials/nodes/NodeMaterials.js +0 -1
- package/src/materials/nodes/PointsNodeMaterial.js +109 -7
- package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
- package/src/materials/nodes/VolumeNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +8 -0
- package/src/nodes/Nodes.js +4 -0
- package/src/nodes/TSL.js +4 -0
- package/src/nodes/accessors/Arrays.js +30 -8
- package/src/nodes/accessors/BatchNode.js +3 -3
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/Camera.js +64 -3
- package/src/nodes/accessors/InstanceNode.js +1 -1
- package/src/nodes/accessors/MaterialNode.js +9 -9
- package/src/nodes/accessors/ModelViewProjectionNode.js +1 -1
- package/src/nodes/accessors/Normal.js +6 -2
- package/src/nodes/accessors/Object3DNode.js +0 -1
- package/src/nodes/accessors/Position.js +6 -6
- package/src/nodes/accessors/ReferenceBaseNode.js +2 -4
- package/src/nodes/accessors/ReferenceNode.js +2 -3
- package/src/nodes/accessors/StorageBufferNode.js +42 -5
- package/src/nodes/accessors/Tangent.js +2 -2
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +12 -5
- package/src/nodes/accessors/UniformArrayNode.js +9 -3
- package/src/nodes/accessors/VelocityNode.js +0 -2
- package/src/nodes/code/ScriptableNode.js +3 -3
- package/src/nodes/core/ArrayNode.js +125 -0
- package/src/nodes/core/ConstNode.js +8 -0
- package/src/nodes/core/Node.js +14 -1
- package/src/nodes/core/NodeBuilder.js +229 -19
- package/src/nodes/core/NodeUtils.js +11 -1
- package/src/nodes/core/NodeVar.js +17 -1
- package/src/nodes/core/OutputStructNode.js +19 -9
- package/src/nodes/core/StackNode.js +20 -1
- package/src/nodes/core/StructNode.js +121 -0
- package/src/nodes/core/StructType.js +13 -0
- package/src/nodes/core/StructTypeNode.js +82 -21
- package/src/nodes/core/TempNode.js +1 -1
- package/src/nodes/core/VarNode.js +94 -7
- package/src/nodes/core/VaryingNode.js +19 -3
- package/src/nodes/display/BlendModes.js +88 -1
- package/src/nodes/display/BumpMapNode.js +6 -6
- package/src/nodes/display/NormalMapNode.js +6 -6
- package/src/nodes/display/PassNode.js +3 -1
- package/src/nodes/display/ScreenNode.js +9 -0
- package/src/nodes/fog/Fog.js +17 -0
- package/src/nodes/gpgpu/AtomicFunctionNode.js +20 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +8 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +1 -1
- package/src/nodes/lighting/ShadowNode.js +1 -1
- package/src/nodes/math/ConditionalNode.js +8 -1
- package/src/nodes/math/MathNode.js +14 -1
- package/src/nodes/math/OperatorNode.js +96 -18
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/shapes/Shapes.js +33 -0
- package/src/nodes/tsl/TSLBase.js +1 -0
- package/src/nodes/tsl/TSLCore.js +22 -2
- package/src/nodes/utils/ArrayElementNode.js +1 -1
- package/src/nodes/utils/LoopNode.js +8 -1
- package/src/nodes/utils/MemberNode.js +68 -0
- package/src/nodes/utils/StorageArrayElementNode.js +14 -0
- package/src/nodes/utils/Timer.js +21 -0
- package/src/objects/BatchedMesh.js +1 -1
- package/src/objects/Line.js +6 -6
- package/src/renderers/WebGLRenderer.js +7 -0
- package/src/renderers/common/Animation.js +23 -1
- package/src/renderers/common/Backend.js +58 -15
- package/src/renderers/common/Background.js +14 -0
- package/src/renderers/common/Binding.js +1 -1
- package/src/renderers/common/BufferUtils.js +1 -1
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +9 -7
- package/src/renderers/common/ClippingContext.js +1 -1
- package/src/renderers/common/Color4.js +7 -3
- package/src/renderers/common/Geometries.js +2 -23
- package/src/renderers/common/Info.js +1 -45
- package/src/renderers/common/Lighting.js +8 -6
- package/src/renderers/common/Pipelines.js +3 -3
- package/src/renderers/common/PostProcessing.js +24 -8
- package/src/renderers/common/QuadMesh.js +1 -1
- package/src/renderers/common/RenderBundles.js +9 -3
- package/src/renderers/common/RenderContext.js +37 -3
- package/src/renderers/common/RenderContexts.js +30 -17
- package/src/renderers/common/RenderList.js +2 -2
- package/src/renderers/common/RenderLists.js +9 -3
- package/src/renderers/common/RenderObject.js +76 -17
- package/src/renderers/common/RenderObjects.js +9 -7
- package/src/renderers/common/Renderer.js +86 -67
- package/src/renderers/common/SampledTexture.js +0 -1
- package/src/renderers/common/StorageBufferAttribute.js +1 -1
- package/src/renderers/common/StorageInstancedBufferAttribute.js +1 -1
- package/src/renderers/common/StorageTexture.js +1 -1
- package/src/renderers/common/Textures.js +14 -7
- package/src/renderers/common/TimestampQueryPool.js +39 -0
- package/src/renderers/common/Uniform.js +37 -1
- package/src/renderers/common/UniformsGroup.js +2 -0
- package/src/renderers/common/XRManager.js +1193 -0
- package/src/renderers/common/XRRenderTarget.js +74 -0
- package/src/renderers/common/extras/PMREMGenerator.js +53 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +4 -4
- package/src/renderers/common/nodes/NodeLibrary.js +5 -5
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -1
- package/src/renderers/common/nodes/NodeUniform.js +54 -2
- package/src/renderers/common/nodes/Nodes.js +25 -18
- package/src/renderers/webgl/WebGLBackground.js +4 -0
- package/src/renderers/webgl-fallback/WebGLBackend.js +295 -110
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -17
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +57 -0
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
- package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +167 -21
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
- package/src/renderers/webgpu/WebGPUBackend.js +132 -149
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +6 -4
- package/src/renderers/webgpu/WebGPURenderer.js +5 -4
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +615 -41
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +85 -6
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +85 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +257 -9
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
- package/src/renderers/webgpu/utils/WebGPUUtils.js +86 -4
- package/src/renderers/webxr/WebXRManager.js +13 -2
- package/src/textures/VideoFrameTexture.js +35 -0
- package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
- package/examples/jsm/objects/InstancedPoints.js +0 -19
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -209
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -37
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import SpriteNodeMaterial from './SpriteNodeMaterial.js';
|
|
2
|
+
import { viewport } from '../../nodes/display/ScreenNode.js';
|
|
3
|
+
import { positionGeometry, positionLocal, positionView } from '../../nodes/accessors/Position.js';
|
|
4
|
+
import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
|
|
5
|
+
import { materialPointSize } from '../../nodes/accessors/MaterialNode.js';
|
|
6
|
+
import { rotate } from '../../nodes/utils/RotateNode.js';
|
|
7
|
+
import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
|
|
2
8
|
|
|
3
9
|
import { PointsMaterial } from '../PointsMaterial.js';
|
|
4
10
|
|
|
@@ -7,14 +13,9 @@ const _defaultValues = /*@__PURE__*/ new PointsMaterial();
|
|
|
7
13
|
/**
|
|
8
14
|
* Node material version of `PointsMaterial`.
|
|
9
15
|
*
|
|
10
|
-
* Since WebGPU can render point primitives only with a size of one pixel,
|
|
11
|
-
* this material type does not evaluate the `size` and `sizeAttenuation`
|
|
12
|
-
* property of `PointsMaterial`. Use {@link InstancedPointsNodeMaterial}
|
|
13
|
-
* instead if you need points with a size larger than one pixel.
|
|
14
|
-
*
|
|
15
16
|
* @augments NodeMaterial
|
|
16
17
|
*/
|
|
17
|
-
class PointsNodeMaterial extends
|
|
18
|
+
class PointsNodeMaterial extends SpriteNodeMaterial {
|
|
18
19
|
|
|
19
20
|
static get type() {
|
|
20
21
|
|
|
@@ -31,6 +32,14 @@ class PointsNodeMaterial extends NodeMaterial {
|
|
|
31
32
|
|
|
32
33
|
super();
|
|
33
34
|
|
|
35
|
+
/**
|
|
36
|
+
* This node property provides an additional way to set the point size.
|
|
37
|
+
*
|
|
38
|
+
* @type {Node<vec2>?}
|
|
39
|
+
* @default null
|
|
40
|
+
*/
|
|
41
|
+
this.sizeNode = null;
|
|
42
|
+
|
|
34
43
|
/**
|
|
35
44
|
* This flag can be used for type testing.
|
|
36
45
|
*
|
|
@@ -46,6 +55,99 @@ class PointsNodeMaterial extends NodeMaterial {
|
|
|
46
55
|
|
|
47
56
|
}
|
|
48
57
|
|
|
58
|
+
setupPositionView() {
|
|
59
|
+
|
|
60
|
+
const { positionNode } = this;
|
|
61
|
+
|
|
62
|
+
return modelViewMatrix.mul( vec3( positionNode || positionLocal ) ).xyz;
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
setupVertex( builder ) {
|
|
67
|
+
|
|
68
|
+
const mvp = super.setupVertex( builder );
|
|
69
|
+
|
|
70
|
+
// skip further processing if the material is not a node material
|
|
71
|
+
|
|
72
|
+
if ( builder.material.isNodeMaterial !== true ) {
|
|
73
|
+
|
|
74
|
+
return mvp;
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ndc space
|
|
79
|
+
|
|
80
|
+
const { rotationNode, scaleNode, sizeNode } = this;
|
|
81
|
+
|
|
82
|
+
const alignedPosition = positionGeometry.xy.toVar();
|
|
83
|
+
const aspect = viewport.z.div( viewport.w );
|
|
84
|
+
|
|
85
|
+
// rotation
|
|
86
|
+
|
|
87
|
+
if ( rotationNode && rotationNode.isNode ) {
|
|
88
|
+
|
|
89
|
+
const rotation = float( rotationNode );
|
|
90
|
+
|
|
91
|
+
alignedPosition.assign( rotate( alignedPosition, rotation ) );
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// point size
|
|
96
|
+
|
|
97
|
+
let pointSize = sizeNode !== null ? vec2( sizeNode ) : materialPointSize;
|
|
98
|
+
|
|
99
|
+
if ( this.sizeAttenuation === true ) {
|
|
100
|
+
|
|
101
|
+
pointSize = pointSize.mul( pointSize.div( positionView.z.negate() ) );
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// scale
|
|
106
|
+
|
|
107
|
+
if ( scaleNode && scaleNode.isNode ) {
|
|
108
|
+
|
|
109
|
+
pointSize = pointSize.mul( vec2( scaleNode ) );
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
alignedPosition.mulAssign( pointSize.mul( 2 ) );
|
|
114
|
+
|
|
115
|
+
alignedPosition.assign( alignedPosition.div( viewport.z ) );
|
|
116
|
+
alignedPosition.y.assign( alignedPosition.y.mul( aspect ) );
|
|
117
|
+
|
|
118
|
+
// back to clip space
|
|
119
|
+
alignedPosition.assign( alignedPosition.mul( mvp.w ) );
|
|
120
|
+
|
|
121
|
+
//clipPos.xy += offset;
|
|
122
|
+
mvp.addAssign( vec4( alignedPosition, 0, 0 ) );
|
|
123
|
+
|
|
124
|
+
return mvp;
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether alpha to coverage should be used or not.
|
|
130
|
+
*
|
|
131
|
+
* @type {Boolean}
|
|
132
|
+
* @default true
|
|
133
|
+
*/
|
|
134
|
+
get alphaToCoverage() {
|
|
135
|
+
|
|
136
|
+
return this._useAlphaToCoverage;
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
set alphaToCoverage( value ) {
|
|
141
|
+
|
|
142
|
+
if ( this._useAlphaToCoverage !== value ) {
|
|
143
|
+
|
|
144
|
+
this._useAlphaToCoverage = value;
|
|
145
|
+
this.needsUpdate = true;
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
|
|
49
151
|
}
|
|
50
152
|
|
|
51
153
|
export default PointsNodeMaterial;
|
|
@@ -13,7 +13,7 @@ import { Color } from '../../math/Color.js';
|
|
|
13
13
|
/** @module VolumeNodeMaterial **/
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Node material intended for volume rendering. The
|
|
16
|
+
* Node material intended for volume rendering. The volumetric data are
|
|
17
17
|
* defined with an instance of {@link Data3DTexture}.
|
|
18
18
|
*
|
|
19
19
|
* @augments NodeMaterial
|
|
@@ -83,10 +83,10 @@ class VolumeNodeMaterial extends NodeMaterial {
|
|
|
83
83
|
* The volume rendering of this material works by shooting rays
|
|
84
84
|
* from the camera position through each fragment of the mesh's
|
|
85
85
|
* surface and sample the inner volume in a raymarching fashion
|
|
86
|
-
*
|
|
86
|
+
* multiple times.
|
|
87
87
|
*
|
|
88
88
|
* This node can be used to assign a callback function of type `Fn`
|
|
89
|
-
* that will be
|
|
89
|
+
* that will be executed per sample. The callback receives the
|
|
90
90
|
* texture, the sampled texture value as well as position on the surface
|
|
91
91
|
* where the rays enters the volume. The last parameter is a color
|
|
92
92
|
* that allows the callback to determine the final color.
|
|
@@ -143,6 +143,7 @@ class NodeMaterialObserver {
|
|
|
143
143
|
data = {
|
|
144
144
|
material: this.getMaterialData( material ),
|
|
145
145
|
geometry: {
|
|
146
|
+
id: geometry.id,
|
|
146
147
|
attributes: this.getAttributesData( geometry.attributes ),
|
|
147
148
|
indexVersion: geometry.index ? geometry.index.version : null,
|
|
148
149
|
drawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }
|
|
@@ -362,6 +363,13 @@ class NodeMaterialObserver {
|
|
|
362
363
|
const storedAttributeNames = Object.keys( storedAttributes );
|
|
363
364
|
const currentAttributeNames = Object.keys( attributes );
|
|
364
365
|
|
|
366
|
+
if ( storedGeometryData.id !== geometry.id ) {
|
|
367
|
+
|
|
368
|
+
storedGeometryData.id = geometry.id;
|
|
369
|
+
return false;
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
365
373
|
if ( storedAttributeNames.length !== currentAttributeNames.length ) {
|
|
366
374
|
|
|
367
375
|
renderObjectData.geometry.attributes = this.getAttributesData( attributes );
|
package/src/nodes/Nodes.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export * from './core/constants.js';
|
|
3
3
|
|
|
4
4
|
// core
|
|
5
|
+
export { default as ArrayNode } from './core/ArrayNode.js';
|
|
5
6
|
export { default as AssignNode } from './core/AssignNode.js';
|
|
6
7
|
export { default as AttributeNode } from './core/AttributeNode.js';
|
|
7
8
|
export { default as BypassNode } from './core/BypassNode.js';
|
|
@@ -28,6 +29,8 @@ export { default as TempNode } from './core/TempNode.js';
|
|
|
28
29
|
export { default as UniformGroupNode } from './core/UniformGroupNode.js';
|
|
29
30
|
export { default as UniformNode } from './core/UniformNode.js';
|
|
30
31
|
export { default as VaryingNode } from './core/VaryingNode.js';
|
|
32
|
+
export { default as StructNode } from './core/StructNode.js';
|
|
33
|
+
export { default as StructTypeNode } from './core/StructTypeNode.js';
|
|
31
34
|
export { default as OutputStructNode } from './core/OutputStructNode.js';
|
|
32
35
|
export { default as MRTNode } from './core/MRTNode.js';
|
|
33
36
|
|
|
@@ -52,6 +55,7 @@ export { default as StorageArrayElementNode } from './utils/StorageArrayElementN
|
|
|
52
55
|
export { default as TriplanarTexturesNode } from './utils/TriplanarTexturesNode.js';
|
|
53
56
|
export { default as ReflectorNode } from './utils/ReflectorNode.js';
|
|
54
57
|
export { default as RTTNode } from './utils/RTTNode.js';
|
|
58
|
+
export { default as MemberNode } from './utils/MemberNode.js';
|
|
55
59
|
|
|
56
60
|
// accessors
|
|
57
61
|
export { default as UniformArrayNode } from './accessors/UniformArrayNode.js';
|
package/src/nodes/TSL.js
CHANGED
|
@@ -11,6 +11,7 @@ export * from './core/IndexNode.js';
|
|
|
11
11
|
export * from './core/ParameterNode.js';
|
|
12
12
|
export * from './core/PropertyNode.js';
|
|
13
13
|
export * from './core/StackNode.js';
|
|
14
|
+
export * from './core/StructNode.js';
|
|
14
15
|
export * from './core/UniformGroupNode.js';
|
|
15
16
|
export * from './core/UniformNode.js';
|
|
16
17
|
export * from './core/VaryingNode.js';
|
|
@@ -142,6 +143,9 @@ export * from './pmrem/PMREMUtils.js';
|
|
|
142
143
|
// procedural
|
|
143
144
|
export * from './procedural/Checker.js';
|
|
144
145
|
|
|
146
|
+
// shapes
|
|
147
|
+
export * from './shapes/Shapes.js';
|
|
148
|
+
|
|
145
149
|
// materialX
|
|
146
150
|
export * from './materialx/MaterialXNodes.js';
|
|
147
151
|
|
|
@@ -9,14 +9,25 @@ import { getLengthFromType, getTypedArrayFromType } from '../core/NodeUtils.js';
|
|
|
9
9
|
* TSL function for creating a storage buffer node with a configured `StorageBufferAttribute`.
|
|
10
10
|
*
|
|
11
11
|
* @function
|
|
12
|
-
* @param {Number} count - The data count.
|
|
13
|
-
* @param {String} [type='float'] - The data type.
|
|
12
|
+
* @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument.
|
|
13
|
+
* @param {String|Struct} [type='float'] - The data type.
|
|
14
14
|
* @returns {StorageBufferNode}
|
|
15
15
|
*/
|
|
16
16
|
export const attributeArray = ( count, type = 'float' ) => {
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
let itemSize, typedArray;
|
|
19
|
+
|
|
20
|
+
if ( type.isStruct === true ) {
|
|
21
|
+
|
|
22
|
+
itemSize = type.layout.getLength();
|
|
23
|
+
typedArray = getTypedArrayFromType( 'float' );
|
|
24
|
+
|
|
25
|
+
} else {
|
|
26
|
+
|
|
27
|
+
itemSize = getLengthFromType( type );
|
|
28
|
+
typedArray = getTypedArrayFromType( type );
|
|
29
|
+
|
|
30
|
+
}
|
|
20
31
|
|
|
21
32
|
const buffer = new StorageBufferAttribute( count, itemSize, typedArray );
|
|
22
33
|
const node = storage( buffer, type, count );
|
|
@@ -29,14 +40,25 @@ export const attributeArray = ( count, type = 'float' ) => {
|
|
|
29
40
|
* TSL function for creating a storage buffer node with a configured `StorageInstancedBufferAttribute`.
|
|
30
41
|
*
|
|
31
42
|
* @function
|
|
32
|
-
* @param {Number} count - The data count.
|
|
33
|
-
* @param {String} [type='float'] - The data type.
|
|
43
|
+
* @param {Number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument.
|
|
44
|
+
* @param {String|Struct} [type='float'] - The data type.
|
|
34
45
|
* @returns {StorageBufferNode}
|
|
35
46
|
*/
|
|
36
47
|
export const instancedArray = ( count, type = 'float' ) => {
|
|
37
48
|
|
|
38
|
-
|
|
39
|
-
|
|
49
|
+
let itemSize, typedArray;
|
|
50
|
+
|
|
51
|
+
if ( type.isStruct === true ) {
|
|
52
|
+
|
|
53
|
+
itemSize = type.layout.getLength();
|
|
54
|
+
typedArray = getTypedArrayFromType( 'float' );
|
|
55
|
+
|
|
56
|
+
} else {
|
|
57
|
+
|
|
58
|
+
itemSize = getLengthFromType( type );
|
|
59
|
+
typedArray = getTypedArrayFromType( type );
|
|
60
|
+
|
|
61
|
+
}
|
|
40
62
|
|
|
41
63
|
const buffer = new StorageInstancedBufferAttribute( count, itemSize, typedArray );
|
|
42
64
|
const node = storage( buffer, type, count );
|
|
@@ -76,9 +76,9 @@ class BatchNode extends Node {
|
|
|
76
76
|
|
|
77
77
|
const getIndirectIndex = Fn( ( [ id ] ) => {
|
|
78
78
|
|
|
79
|
-
const size = textureSize( textureLoad( this.batchMesh._indirectTexture ), 0 );
|
|
80
|
-
const x = int( id ).modInt(
|
|
81
|
-
const y = int( id ).div(
|
|
79
|
+
const size = int( textureSize( textureLoad( this.batchMesh._indirectTexture ), 0 ) );
|
|
80
|
+
const x = int( id ).modInt( size );
|
|
81
|
+
const y = int( id ).div( size );
|
|
82
82
|
return textureLoad( this.batchMesh._indirectTexture, ivec2( x, y ) ).x;
|
|
83
83
|
|
|
84
84
|
} ).setLayout( {
|
|
@@ -271,7 +271,7 @@ class BufferAttributeNode extends InputNode {
|
|
|
271
271
|
/**
|
|
272
272
|
* Sets the `instanced` property to the given value.
|
|
273
273
|
*
|
|
274
|
-
* @param {
|
|
274
|
+
* @param {Boolean} value - The value to set.
|
|
275
275
|
* @return {BufferAttributeNode} A reference to this node.
|
|
276
276
|
*/
|
|
277
277
|
setInstanced( value ) {
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { uniform } from '../core/UniformNode.js';
|
|
2
|
-
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
2
|
+
import { renderGroup, sharedUniformGroup } from '../core/UniformGroupNode.js';
|
|
3
3
|
import { Vector3 } from '../../math/Vector3.js';
|
|
4
|
+
import { Fn } from '../tsl/TSLBase.js';
|
|
5
|
+
import { uniformArray } from './UniformArrayNode.js';
|
|
4
6
|
|
|
5
7
|
/** @module Camera **/
|
|
6
8
|
|
|
9
|
+
/**
|
|
10
|
+
* TSL object that represents the current `index` value of the camera if used ArrayCamera.
|
|
11
|
+
*
|
|
12
|
+
* @type {UniformNode<uint>}
|
|
13
|
+
*/
|
|
14
|
+
export const cameraIndex = /*@__PURE__*/ uniform( 0, 'uint' ).setGroup( sharedUniformGroup( 'cameraIndex' ) ).toVarying( 'v_cameraIndex' );
|
|
15
|
+
|
|
7
16
|
/**
|
|
8
17
|
* TSL object that represents the `near` value of the camera used for the current render.
|
|
9
18
|
*
|
|
@@ -23,7 +32,33 @@ export const cameraFar = /*@__PURE__*/ uniform( 'float' ).label( 'cameraFar' ).s
|
|
|
23
32
|
*
|
|
24
33
|
* @type {UniformNode<mat4>}
|
|
25
34
|
*/
|
|
26
|
-
export const cameraProjectionMatrix = /*@__PURE__*/
|
|
35
|
+
export const cameraProjectionMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
36
|
+
|
|
37
|
+
let cameraProjectionMatrix;
|
|
38
|
+
|
|
39
|
+
if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
|
|
40
|
+
|
|
41
|
+
const matrices = [];
|
|
42
|
+
|
|
43
|
+
for ( const subCamera of camera.cameras ) {
|
|
44
|
+
|
|
45
|
+
matrices.push( subCamera.projectionMatrix );
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const cameraProjectionMatrices = uniformArray( matrices ).setGroup( renderGroup ).label( 'cameraProjectionMatrices' );
|
|
50
|
+
|
|
51
|
+
cameraProjectionMatrix = cameraProjectionMatrices.element( cameraIndex ).toVar( 'cameraProjectionMatrix' );
|
|
52
|
+
|
|
53
|
+
} else {
|
|
54
|
+
|
|
55
|
+
cameraProjectionMatrix = uniform( 'mat4' ).label( 'cameraProjectionMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.projectionMatrix );
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return cameraProjectionMatrix;
|
|
60
|
+
|
|
61
|
+
} ).once() )();
|
|
27
62
|
|
|
28
63
|
/**
|
|
29
64
|
* TSL object that represents the inverse projection matrix of the camera used for the current render.
|
|
@@ -37,7 +72,33 @@ export const cameraProjectionMatrixInverse = /*@__PURE__*/ uniform( 'mat4' ).lab
|
|
|
37
72
|
*
|
|
38
73
|
* @type {UniformNode<mat4>}
|
|
39
74
|
*/
|
|
40
|
-
export const cameraViewMatrix = /*@__PURE__*/
|
|
75
|
+
export const cameraViewMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
76
|
+
|
|
77
|
+
let cameraViewMatrix;
|
|
78
|
+
|
|
79
|
+
if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
|
|
80
|
+
|
|
81
|
+
const matrices = [];
|
|
82
|
+
|
|
83
|
+
for ( const subCamera of camera.cameras ) {
|
|
84
|
+
|
|
85
|
+
matrices.push( subCamera.matrixWorldInverse );
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const cameraViewMatrices = uniformArray( matrices ).setGroup( renderGroup ).label( 'cameraViewMatrices' );
|
|
90
|
+
|
|
91
|
+
cameraViewMatrix = cameraViewMatrices.element( cameraIndex ).toVar( 'cameraViewMatrix' );
|
|
92
|
+
|
|
93
|
+
} else {
|
|
94
|
+
|
|
95
|
+
cameraViewMatrix = uniform( 'mat4' ).label( 'cameraViewMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.matrixWorldInverse );
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return cameraViewMatrix;
|
|
100
|
+
|
|
101
|
+
} ).once() )();
|
|
41
102
|
|
|
42
103
|
/**
|
|
43
104
|
* TSL object that represents the world matrix of the camera used for the current render.
|
|
@@ -435,7 +435,7 @@ MaterialNode.LINE_DASH_SIZE = 'dashSize';
|
|
|
435
435
|
MaterialNode.LINE_GAP_SIZE = 'gapSize';
|
|
436
436
|
MaterialNode.LINE_WIDTH = 'linewidth';
|
|
437
437
|
MaterialNode.LINE_DASH_OFFSET = 'dashOffset';
|
|
438
|
-
MaterialNode.
|
|
438
|
+
MaterialNode.POINT_SIZE = 'size';
|
|
439
439
|
MaterialNode.DISPERSION = 'dispersion';
|
|
440
440
|
MaterialNode.LIGHT_MAP = 'light';
|
|
441
441
|
MaterialNode.AO = 'ao';
|
|
@@ -520,7 +520,7 @@ export const materialReflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, M
|
|
|
520
520
|
|
|
521
521
|
/**
|
|
522
522
|
* TSL object that represents the roughness of the current material.
|
|
523
|
-
* The value is composed via `roughness` * `roughnessMap.g
|
|
523
|
+
* The value is composed via `roughness` * `roughnessMap.g`.
|
|
524
524
|
*
|
|
525
525
|
* @type {Node<float>}
|
|
526
526
|
*/
|
|
@@ -528,7 +528,7 @@ export const materialRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
|
|
|
528
528
|
|
|
529
529
|
/**
|
|
530
530
|
* TSL object that represents the metalness of the current material.
|
|
531
|
-
* The value is composed via `metalness` * `metalnessMap.b
|
|
531
|
+
* The value is composed via `metalness` * `metalnessMap.b`.
|
|
532
532
|
*
|
|
533
533
|
* @type {Node<float>}
|
|
534
534
|
*/
|
|
@@ -540,7 +540,7 @@ export const materialMetalness = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
|
|
|
540
540
|
*
|
|
541
541
|
* @type {Node<vec3>}
|
|
542
542
|
*/
|
|
543
|
-
export const materialNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.NORMAL )
|
|
543
|
+
export const materialNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.NORMAL );
|
|
544
544
|
|
|
545
545
|
/**
|
|
546
546
|
* TSL object that represents the clearcoat of the current material.
|
|
@@ -552,7 +552,7 @@ export const materialClearcoat = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
|
|
|
552
552
|
|
|
553
553
|
/**
|
|
554
554
|
* TSL object that represents the clearcoat roughness of the current material.
|
|
555
|
-
* The value is composed via `clearcoatRoughness` * `clearcoatRoughnessMap.r
|
|
555
|
+
* The value is composed via `clearcoatRoughness` * `clearcoatRoughnessMap.r`.
|
|
556
556
|
*
|
|
557
557
|
* @type {Node<float>}
|
|
558
558
|
*/
|
|
@@ -564,7 +564,7 @@ export const materialClearcoatRoughness = /*@__PURE__*/ nodeImmutable( MaterialN
|
|
|
564
564
|
*
|
|
565
565
|
* @type {Node<vec3>}
|
|
566
566
|
*/
|
|
567
|
-
export const materialClearcoatNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.CLEARCOAT_NORMAL )
|
|
567
|
+
export const materialClearcoatNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.CLEARCOAT_NORMAL );
|
|
568
568
|
|
|
569
569
|
/**
|
|
570
570
|
* TSL object that represents the rotation of the current sprite material.
|
|
@@ -583,7 +583,7 @@ export const materialSheen = /*@__PURE__*/ nodeImmutable( MaterialNode, Material
|
|
|
583
583
|
|
|
584
584
|
/**
|
|
585
585
|
* TSL object that represents the sheen roughness of the current material.
|
|
586
|
-
* The value is composed via `sheenRoughness` * `sheenRoughnessMap.a
|
|
586
|
+
* The value is composed via `sheenRoughness` * `sheenRoughnessMap.a`.
|
|
587
587
|
*
|
|
588
588
|
* @type {Node<float>}
|
|
589
589
|
*/
|
|
@@ -690,11 +690,11 @@ export const materialLineWidth = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
|
|
|
690
690
|
export const materialLineDashOffset = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_DASH_OFFSET );
|
|
691
691
|
|
|
692
692
|
/**
|
|
693
|
-
* TSL object that represents the point
|
|
693
|
+
* TSL object that represents the point size of the current points material.
|
|
694
694
|
*
|
|
695
695
|
* @type {Node<float>}
|
|
696
696
|
*/
|
|
697
|
-
export const
|
|
697
|
+
export const materialPointSize = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.POINT_SIZE );
|
|
698
698
|
|
|
699
699
|
/**
|
|
700
700
|
* TSL object that represents the dispersion of the current material.
|
|
@@ -77,7 +77,9 @@ export const normalWorld = /*@__PURE__*/ varying( normalView.transformDirection(
|
|
|
77
77
|
*/
|
|
78
78
|
export const transformedNormalView = /*@__PURE__*/ ( Fn( ( builder ) => {
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
// Use getUV context to avoid side effects from nodes overwriting getUV in the context (e.g. EnvironmentNode)
|
|
81
|
+
|
|
82
|
+
return builder.context.setupNormal().context( { getUV: null } );
|
|
81
83
|
|
|
82
84
|
}, 'vec3' ).once() )().mul( faceDirection ).toVar( 'transformedNormalView' );
|
|
83
85
|
|
|
@@ -95,7 +97,9 @@ export const transformedNormalWorld = /*@__PURE__*/ transformedNormalView.transf
|
|
|
95
97
|
*/
|
|
96
98
|
export const transformedClearcoatNormalView = /*@__PURE__*/ ( Fn( ( builder ) => {
|
|
97
99
|
|
|
98
|
-
|
|
100
|
+
// Use getUV context to avoid side effects from nodes overwriting getUV in the context (e.g. EnvironmentNode)
|
|
101
|
+
|
|
102
|
+
return builder.context.setupClearcoatNormal().context( { getUV: null } );
|
|
99
103
|
|
|
100
104
|
}, 'vec3' ).once() )().mul( faceDirection ).toVar( 'transformedClearcoatNormalView' );
|
|
101
105
|
|
|
@@ -16,7 +16,7 @@ export const positionGeometry = /*@__PURE__*/ attribute( 'position', 'vec3' );
|
|
|
16
16
|
*
|
|
17
17
|
* @type {AttributeNode<vec3>}
|
|
18
18
|
*/
|
|
19
|
-
export const positionLocal = /*@__PURE__*/ positionGeometry.
|
|
19
|
+
export const positionLocal = /*@__PURE__*/ positionGeometry.toVarying( 'positionLocal' );
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* TSL object that represents the previous vertex position in local space of the current rendered object.
|
|
@@ -24,21 +24,21 @@ export const positionLocal = /*@__PURE__*/ positionGeometry.varying( 'positionLo
|
|
|
24
24
|
*
|
|
25
25
|
* @type {AttributeNode<vec3>}
|
|
26
26
|
*/
|
|
27
|
-
export const positionPrevious = /*@__PURE__*/ positionGeometry.
|
|
27
|
+
export const positionPrevious = /*@__PURE__*/ positionGeometry.toVarying( 'positionPrevious' );
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* TSL object that represents the vertex position in world space of the current rendered object.
|
|
31
31
|
*
|
|
32
32
|
* @type {VaryingNode<vec3>}
|
|
33
33
|
*/
|
|
34
|
-
export const positionWorld = /*@__PURE__*/ modelWorldMatrix.mul( positionLocal ).xyz.
|
|
34
|
+
export const positionWorld = /*@__PURE__*/ modelWorldMatrix.mul( positionLocal ).xyz.toVarying( 'v_positionWorld' ).context( { needsPositionReassign: true } );
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* TSL object that represents the position world direction of the current rendered object.
|
|
38
38
|
*
|
|
39
39
|
* @type {Node<vec3>}
|
|
40
40
|
*/
|
|
41
|
-
export const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirection( modelWorldMatrix ).
|
|
41
|
+
export const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirection( modelWorldMatrix ).toVarying( 'v_positionWorldDirection' ).normalize().toVar( 'positionWorldDirection' ).context( { needsPositionReassign: true } );
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* TSL object that represents the vertex position in view space of the current rendered object.
|
|
@@ -49,11 +49,11 @@ export const positionView = /*@__PURE__*/ ( Fn( ( builder ) => {
|
|
|
49
49
|
|
|
50
50
|
return builder.context.setupPositionView();
|
|
51
51
|
|
|
52
|
-
}, 'vec3' ).once() )().
|
|
52
|
+
}, 'vec3' ).once() )().toVarying( 'v_positionView' ).context( { needsPositionReassign: true } );
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* TSL object that represents the position view direction of the current rendered object.
|
|
56
56
|
*
|
|
57
57
|
* @type {VaryingNode<vec3>}
|
|
58
58
|
*/
|
|
59
|
-
export const positionViewDirection = /*@__PURE__*/ positionView.negate().
|
|
59
|
+
export const positionViewDirection = /*@__PURE__*/ positionView.negate().toVarying( 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' );
|
|
@@ -26,7 +26,7 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
26
26
|
/**
|
|
27
27
|
* Constructs a new reference element node.
|
|
28
28
|
*
|
|
29
|
-
* @param {
|
|
29
|
+
* @param {ReferenceBaseNode?} referenceNode - The reference node.
|
|
30
30
|
* @param {Node} indexNode - The index node that defines the element access.
|
|
31
31
|
*/
|
|
32
32
|
constructor( referenceNode, indexNode ) {
|
|
@@ -37,7 +37,7 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
37
37
|
* Similar to {@link module:ReferenceBaseNode~ReferenceBaseNode#reference}, an additional
|
|
38
38
|
* property references to the current node.
|
|
39
39
|
*
|
|
40
|
-
* @type {
|
|
40
|
+
* @type {ReferenceBaseNode?}
|
|
41
41
|
* @default null
|
|
42
42
|
*/
|
|
43
43
|
this.referenceNode = referenceNode;
|
|
@@ -57,7 +57,6 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
57
57
|
* This method is overwritten since the node type is inferred from
|
|
58
58
|
* the uniform type of the reference node.
|
|
59
59
|
*
|
|
60
|
-
* @param {NodeBuilder} builder - The current node builder.
|
|
61
60
|
* @return {String} The node type.
|
|
62
61
|
*/
|
|
63
62
|
getNodeType() {
|
|
@@ -286,7 +285,6 @@ class ReferenceBaseNode extends Node {
|
|
|
286
285
|
/**
|
|
287
286
|
* The output of the reference node is the internal uniform node.
|
|
288
287
|
*
|
|
289
|
-
* @param {NodeBuilder} builder - The current node builder.
|
|
290
288
|
* @return {UniformNode} The output node.
|
|
291
289
|
*/
|
|
292
290
|
setup() {
|
|
@@ -30,7 +30,7 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
30
30
|
/**
|
|
31
31
|
* Constructs a new reference element node.
|
|
32
32
|
*
|
|
33
|
-
* @param {
|
|
33
|
+
* @param {ReferenceNode?} referenceNode - The reference node.
|
|
34
34
|
* @param {Node} indexNode - The index node that defines the element access.
|
|
35
35
|
*/
|
|
36
36
|
constructor( referenceNode, indexNode ) {
|
|
@@ -41,7 +41,7 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
41
41
|
* Similar to {@link module:ReferenceNode~ReferenceNode#reference}, an additional
|
|
42
42
|
* property references to the current node.
|
|
43
43
|
*
|
|
44
|
-
* @type {
|
|
44
|
+
* @type {ReferenceNode?}
|
|
45
45
|
* @default null
|
|
46
46
|
*/
|
|
47
47
|
this.referenceNode = referenceNode;
|
|
@@ -61,7 +61,6 @@ class ReferenceElementNode extends ArrayElementNode {
|
|
|
61
61
|
* This method is overwritten since the node type is inferred from
|
|
62
62
|
* the uniform type of the reference node.
|
|
63
63
|
*
|
|
64
|
-
* @param {NodeBuilder} builder - The current node builder.
|
|
65
64
|
* @return {String} The node type.
|
|
66
65
|
*/
|
|
67
66
|
getNodeType() {
|