super-three 0.161.0 → 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.
- package/build/three.cjs +490 -393
- package/build/three.module.js +490 -391
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/DragControls.js +91 -30
- package/examples/jsm/controls/OrbitControls.js +32 -6
- package/examples/jsm/controls/TransformControls.js +6 -6
- package/examples/jsm/exporters/GLTFExporter.js +11 -1
- package/examples/jsm/interactive/InteractiveGroup.js +15 -25
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/libs/tween.module.js +32 -14
- package/examples/jsm/loaders/3DMLoader.js +13 -21
- package/examples/jsm/loaders/VOXLoader.js +9 -2
- package/examples/jsm/loaders/VRMLLoader.js +6 -2
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
- package/examples/jsm/nodes/Nodes.js +9 -7
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
- package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
- package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
- package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
- package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
- package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
- package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
- package/examples/jsm/nodes/code/CodeNode.js +6 -0
- package/examples/jsm/nodes/core/AssignNode.js +68 -12
- package/examples/jsm/nodes/core/Node.js +14 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +3 -9
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
- package/examples/jsm/nodes/materials/NodeMaterial.js +37 -6
- package/examples/jsm/nodes/math/CondNode.js +42 -7
- package/examples/jsm/nodes/math/MathNode.js +20 -0
- package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
- package/examples/jsm/nodes/utils/LoopNode.js +2 -0
- package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Background.js +2 -2
- package/examples/jsm/renderers/common/ClippingContext.js +165 -0
- package/examples/jsm/renderers/common/RenderContext.js +2 -0
- package/examples/jsm/renderers/common/RenderContexts.js +2 -13
- package/examples/jsm/renderers/common/RenderObject.js +44 -1
- package/examples/jsm/renderers/common/RenderObjects.js +3 -1
- package/examples/jsm/renderers/common/Renderer.js +94 -37
- package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
- package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +3 -13
- package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
- package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +1 -0
- package/examples/jsm/renderers/webgl/WebGLBackend.js +26 -6
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +135 -10
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +7 -1
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +47 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +1 -0
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +13 -12
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +15 -40
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +7 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +2 -2
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/utils/SkeletonUtils.js +14 -3
- package/examples/jsm/webxr/VRButton.js +13 -5
- package/examples/jsm/webxr/XRButton.js +0 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
- package/package.json +4 -3
- package/src/Three.Legacy.js +20 -0
- package/src/Three.js +0 -1
- package/src/constants.js +2 -5
- package/src/core/BufferAttribute.js +0 -11
- package/src/core/BufferGeometry.js +23 -29
- package/src/core/Object3D.js +11 -0
- package/src/core/Raycaster.js +18 -4
- package/src/core/RenderTarget.js +44 -21
- package/src/extras/PMREMGenerator.js +2 -0
- package/src/extras/curves/EllipseCurve.js +2 -2
- package/src/helpers/SpotLightHelper.js +18 -1
- package/src/loaders/DataTextureLoader.js +0 -4
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +2 -1
- package/src/materials/Material.js +2 -1
- package/src/materials/MeshBasicMaterial.js +3 -0
- package/src/materials/MeshLambertMaterial.js +3 -0
- package/src/materials/MeshPhongMaterial.js +3 -0
- package/src/materials/MeshStandardMaterial.js +3 -0
- package/src/math/Quaternion.js +13 -12
- package/src/math/Vector3.js +7 -7
- package/src/objects/InstancedMesh.js +53 -0
- package/src/objects/Mesh.js +0 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -10
- package/src/renderers/WebGLRenderer.js +15 -22
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
- package/src/renderers/shaders/ShaderChunk.js +2 -0
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib.js +2 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/webgl/WebGLBackground.js +18 -0
- package/src/renderers/webgl/WebGLMaterials.js +24 -1
- package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
- package/src/renderers/webgl/WebGLProgram.js +12 -1
- package/src/renderers/webgl/WebGLPrograms.js +19 -16
- package/src/renderers/webgl/WebGLState.js +11 -21
- package/src/renderers/webgl/WebGLTextures.js +80 -50
- package/src/scenes/Scene.js +8 -0
- package/src/textures/Texture.js +1 -29
- package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
|
@@ -2,49 +2,63 @@ import Node, { addNodeClass } from '../core/Node.js';
|
|
|
2
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
import { texture } from './TextureNode.js';
|
|
5
|
+
import { buffer } from './BufferNode.js';
|
|
5
6
|
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
7
|
+
import { uniforms } from './UniformsNode.js';
|
|
8
|
+
import ArrayElementNode from '../utils/ArrayElementNode.js';
|
|
6
9
|
|
|
7
|
-
class
|
|
10
|
+
class ReferenceElementNode extends ArrayElementNode {
|
|
8
11
|
|
|
9
|
-
constructor(
|
|
12
|
+
constructor( referenceNode, indexNode ) {
|
|
10
13
|
|
|
11
|
-
super();
|
|
14
|
+
super( referenceNode, indexNode );
|
|
12
15
|
|
|
13
|
-
this.
|
|
14
|
-
this.index = null;
|
|
16
|
+
this.referenceNode = referenceNode;
|
|
15
17
|
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
this.object = object;
|
|
19
|
-
this.reference = null;
|
|
18
|
+
this.isReferenceElementNode = true;
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
}
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
getNodeType() {
|
|
24
23
|
|
|
25
|
-
this.
|
|
24
|
+
return this.referenceNode.uniformType;
|
|
26
25
|
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
generate( builder ) {
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
const snippet = super.generate( builder );
|
|
31
|
+
const arrayType = this.referenceNode.getNodeType();
|
|
32
|
+
const elementType = this.getNodeType();
|
|
32
33
|
|
|
33
|
-
return
|
|
34
|
+
return builder.format( snippet, arrayType, elementType );
|
|
34
35
|
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
}
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
class ReferenceNode extends Node {
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
constructor( property, uniformType, object = null, count = null ) {
|
|
43
|
+
|
|
44
|
+
super();
|
|
45
|
+
|
|
46
|
+
this.property = property;
|
|
47
|
+
this.uniformType = uniformType;
|
|
48
|
+
this.object = object;
|
|
49
|
+
this.count = count;
|
|
50
|
+
|
|
51
|
+
this.properties = property.split( '.' );
|
|
52
|
+
this.reference = null;
|
|
53
|
+
this.node = null;
|
|
54
|
+
|
|
55
|
+
this.updateType = NodeUpdateType.OBJECT;
|
|
42
56
|
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+
element( indexNode ) {
|
|
46
60
|
|
|
47
|
-
return this
|
|
61
|
+
return nodeObject( new ReferenceElementNode( this, nodeObject( indexNode ) ) );
|
|
48
62
|
|
|
49
63
|
}
|
|
50
64
|
|
|
@@ -52,13 +66,21 @@ class ReferenceNode extends Node {
|
|
|
52
66
|
|
|
53
67
|
let node = null;
|
|
54
68
|
|
|
55
|
-
if (
|
|
69
|
+
if ( this.count !== null ) {
|
|
70
|
+
|
|
71
|
+
node = buffer( null, uniformType, this.count );
|
|
72
|
+
|
|
73
|
+
} else if ( Array.isArray( this.getValueFromReference() ) ) {
|
|
74
|
+
|
|
75
|
+
node = uniforms( null, uniformType );
|
|
76
|
+
|
|
77
|
+
} else if ( uniformType === 'texture' ) {
|
|
56
78
|
|
|
57
79
|
node = texture( null );
|
|
58
80
|
|
|
59
81
|
} else {
|
|
60
82
|
|
|
61
|
-
node = uniform( uniformType );
|
|
83
|
+
node = uniform( null, uniformType );
|
|
62
84
|
|
|
63
85
|
}
|
|
64
86
|
|
|
@@ -72,31 +94,67 @@ class ReferenceNode extends Node {
|
|
|
72
94
|
|
|
73
95
|
}
|
|
74
96
|
|
|
75
|
-
|
|
97
|
+
getValueFromReference( object = this.reference ) {
|
|
76
98
|
|
|
77
|
-
|
|
99
|
+
const { properties } = this;
|
|
78
100
|
|
|
79
|
-
|
|
101
|
+
let value = object[ properties[ 0 ] ];
|
|
80
102
|
|
|
81
|
-
|
|
103
|
+
for ( let i = 1; i < properties.length; i ++ ) {
|
|
104
|
+
|
|
105
|
+
value = value[ properties[ i ] ];
|
|
82
106
|
|
|
83
107
|
}
|
|
84
108
|
|
|
85
|
-
|
|
109
|
+
return value;
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
setReference( state ) {
|
|
114
|
+
|
|
115
|
+
this.reference = this.object !== null ? this.object : state.object;
|
|
116
|
+
|
|
117
|
+
return this.reference;
|
|
86
118
|
|
|
87
119
|
}
|
|
88
120
|
|
|
89
|
-
setup(
|
|
121
|
+
setup() {
|
|
122
|
+
|
|
123
|
+
this.updateValue();
|
|
90
124
|
|
|
91
125
|
return this.node;
|
|
92
126
|
|
|
93
127
|
}
|
|
94
128
|
|
|
129
|
+
update( /*frame*/ ) {
|
|
130
|
+
|
|
131
|
+
this.updateValue();
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
updateValue() {
|
|
136
|
+
|
|
137
|
+
if ( this.node === null ) this.setNodeType( this.uniformType );
|
|
138
|
+
|
|
139
|
+
const value = this.getValueFromReference();
|
|
140
|
+
|
|
141
|
+
if ( Array.isArray( value ) ) {
|
|
142
|
+
|
|
143
|
+
this.node.array = value;
|
|
144
|
+
|
|
145
|
+
} else {
|
|
146
|
+
|
|
147
|
+
this.node.value = value;
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
95
153
|
}
|
|
96
154
|
|
|
97
155
|
export default ReferenceNode;
|
|
98
156
|
|
|
99
157
|
export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
|
|
100
|
-
export const
|
|
158
|
+
export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceNode( name, type, object, count ) );
|
|
101
159
|
|
|
102
160
|
addNodeClass( 'ReferenceNode', ReferenceNode );
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
|
-
import {
|
|
3
|
+
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
4
4
|
import { attribute } from '../core/AttributeNode.js';
|
|
5
|
-
import {
|
|
5
|
+
import { reference, referenceBuffer } from './ReferenceNode.js';
|
|
6
6
|
import { add } from '../math/OperatorNode.js';
|
|
7
|
-
import { buffer } from './BufferNode.js';
|
|
8
7
|
import { normalLocal } from './NormalNode.js';
|
|
9
8
|
import { positionLocal } from './PositionNode.js';
|
|
10
9
|
import { tangentLocal } from './TangentNode.js';
|
|
10
|
+
import { uniform } from '../core/UniformNode.js';
|
|
11
|
+
import { buffer } from './BufferNode.js';
|
|
11
12
|
|
|
12
13
|
class SkinningNode extends Node {
|
|
13
14
|
|
|
14
|
-
constructor( skinnedMesh ) {
|
|
15
|
+
constructor( skinnedMesh, useReference = false ) {
|
|
15
16
|
|
|
16
17
|
super( 'void' );
|
|
17
18
|
|
|
18
19
|
this.skinnedMesh = skinnedMesh;
|
|
20
|
+
this.useReference = useReference;
|
|
19
21
|
|
|
20
22
|
this.updateType = NodeUpdateType.OBJECT;
|
|
21
23
|
|
|
@@ -24,9 +26,25 @@ class SkinningNode extends Node {
|
|
|
24
26
|
this.skinIndexNode = attribute( 'skinIndex', 'uvec4' );
|
|
25
27
|
this.skinWeightNode = attribute( 'skinWeight', 'vec4' );
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
let bindMatrixNode, bindMatrixInverseNode, boneMatricesNode;
|
|
30
|
+
|
|
31
|
+
if ( useReference ) {
|
|
32
|
+
|
|
33
|
+
bindMatrixNode = reference( 'bindMatrix', 'mat4' );
|
|
34
|
+
bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );
|
|
35
|
+
boneMatricesNode = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );
|
|
36
|
+
|
|
37
|
+
} else {
|
|
38
|
+
|
|
39
|
+
bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
|
|
40
|
+
bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
|
|
41
|
+
boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.bindMatrixNode = bindMatrixNode;
|
|
46
|
+
this.bindMatrixInverseNode = bindMatrixInverseNode;
|
|
47
|
+
this.boneMatricesNode = boneMatricesNode;
|
|
30
48
|
|
|
31
49
|
}
|
|
32
50
|
|
|
@@ -88,9 +106,11 @@ class SkinningNode extends Node {
|
|
|
88
106
|
|
|
89
107
|
}
|
|
90
108
|
|
|
91
|
-
update() {
|
|
109
|
+
update( frame ) {
|
|
110
|
+
|
|
111
|
+
const object = this.useReference ? frame.object : this.skinnedMesh;
|
|
92
112
|
|
|
93
|
-
|
|
113
|
+
object.skeleton.update();
|
|
94
114
|
|
|
95
115
|
}
|
|
96
116
|
|
|
@@ -98,6 +118,7 @@ class SkinningNode extends Node {
|
|
|
98
118
|
|
|
99
119
|
export default SkinningNode;
|
|
100
120
|
|
|
101
|
-
export const skinning =
|
|
121
|
+
export const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) );
|
|
122
|
+
export const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) );
|
|
102
123
|
|
|
103
124
|
addNodeClass( 'SkinningNode', SkinningNode );
|
|
@@ -3,6 +3,7 @@ import { bufferAttribute } from './BufferAttributeNode.js';
|
|
|
3
3
|
import { addNodeClass } from '../core/Node.js';
|
|
4
4
|
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
5
5
|
import { varying } from '../core/VaryingNode.js';
|
|
6
|
+
import { storageElement } from '../utils/StorageArrayElementNode.js';
|
|
6
7
|
|
|
7
8
|
class StorageBufferNode extends BufferNode {
|
|
8
9
|
|
|
@@ -12,6 +13,8 @@ class StorageBufferNode extends BufferNode {
|
|
|
12
13
|
|
|
13
14
|
this.isStorageBufferNode = true;
|
|
14
15
|
|
|
16
|
+
this.bufferObject = false;
|
|
17
|
+
|
|
15
18
|
this._attribute = null;
|
|
16
19
|
this._varying = null;
|
|
17
20
|
|
|
@@ -23,6 +26,20 @@ class StorageBufferNode extends BufferNode {
|
|
|
23
26
|
|
|
24
27
|
}
|
|
25
28
|
|
|
29
|
+
element( indexNode ) {
|
|
30
|
+
|
|
31
|
+
return storageElement( this, indexNode );
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
setBufferObject( value ) {
|
|
36
|
+
|
|
37
|
+
this.bufferObject = value;
|
|
38
|
+
|
|
39
|
+
return this;
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
26
43
|
generate( builder ) {
|
|
27
44
|
|
|
28
45
|
if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );
|
|
@@ -50,5 +67,6 @@ class StorageBufferNode extends BufferNode {
|
|
|
50
67
|
export default StorageBufferNode;
|
|
51
68
|
|
|
52
69
|
export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
|
|
70
|
+
export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
|
|
53
71
|
|
|
54
72
|
addNodeClass( 'StorageBufferNode', StorageBufferNode );
|
|
@@ -5,7 +5,7 @@ import { varying } from '../core/VaryingNode.js';
|
|
|
5
5
|
import { normalize } from '../math/MathNode.js';
|
|
6
6
|
import { cameraViewMatrix } from './CameraNode.js';
|
|
7
7
|
import { modelViewMatrix } from './ModelNode.js';
|
|
8
|
-
import { nodeImmutable } from '../shadernode/ShaderNode.js';
|
|
8
|
+
import { nodeImmutable, vec4 } from '../shadernode/ShaderNode.js';
|
|
9
9
|
|
|
10
10
|
class TangentNode extends Node {
|
|
11
11
|
|
|
@@ -48,13 +48,19 @@ class TangentNode extends Node {
|
|
|
48
48
|
|
|
49
49
|
outputNode = attribute( 'tangent', 'vec4' );
|
|
50
50
|
|
|
51
|
+
if ( builder.geometry.hasAttribute( 'tangent' ) === false ) {
|
|
52
|
+
|
|
53
|
+
builder.geometry.computeTangents();
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
51
57
|
} else if ( scope === TangentNode.LOCAL ) {
|
|
52
58
|
|
|
53
59
|
outputNode = varying( tangentGeometry.xyz );
|
|
54
60
|
|
|
55
61
|
} else if ( scope === TangentNode.VIEW ) {
|
|
56
62
|
|
|
57
|
-
const vertexNode = modelViewMatrix.mul( tangentLocal ).xyz;
|
|
63
|
+
const vertexNode = modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz;
|
|
58
64
|
outputNode = normalize( varying( vertexNode ) );
|
|
59
65
|
|
|
60
66
|
} else if ( scope === TangentNode.WORLD ) {
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { addNodeClass } from '../core/Node.js';
|
|
2
|
+
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
3
|
+
import { NodeUpdateType } from '../core/constants.js';
|
|
4
|
+
import { getValueType } from '../core/NodeUtils.js';
|
|
5
|
+
import ArrayElementNode from '../utils/ArrayElementNode.js';
|
|
6
|
+
import BufferNode from './BufferNode.js';
|
|
7
|
+
|
|
8
|
+
class UniformsElementNode extends ArrayElementNode {
|
|
9
|
+
|
|
10
|
+
constructor( arrayBuffer, indexNode ) {
|
|
11
|
+
|
|
12
|
+
super( arrayBuffer, indexNode );
|
|
13
|
+
|
|
14
|
+
this.isArrayBufferElementNode = true;
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getNodeType( builder ) {
|
|
19
|
+
|
|
20
|
+
return this.node.getElementType( builder );
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
generate( builder ) {
|
|
25
|
+
|
|
26
|
+
const snippet = super.generate( builder );
|
|
27
|
+
const type = this.getNodeType();
|
|
28
|
+
|
|
29
|
+
return builder.format( snippet, 'vec4', type );
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
class UniformsNode extends BufferNode {
|
|
36
|
+
|
|
37
|
+
constructor( value, elementType = null ) {
|
|
38
|
+
|
|
39
|
+
super( null, 'vec4' );
|
|
40
|
+
|
|
41
|
+
this.array = value;
|
|
42
|
+
this.elementType = elementType;
|
|
43
|
+
|
|
44
|
+
this._elementType = null;
|
|
45
|
+
this._elementLength = 0;
|
|
46
|
+
|
|
47
|
+
this.updateType = NodeUpdateType.RENDER;
|
|
48
|
+
|
|
49
|
+
this.isArrayBufferNode = true;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
getElementType() {
|
|
54
|
+
|
|
55
|
+
return this.elementType || this._elementType;
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
getElementLength() {
|
|
60
|
+
|
|
61
|
+
return this._elementLength;
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
update( /*frame*/ ) {
|
|
66
|
+
|
|
67
|
+
const { array, value } = this;
|
|
68
|
+
|
|
69
|
+
const elementLength = this.getElementLength();
|
|
70
|
+
const elementType = this.getElementType();
|
|
71
|
+
|
|
72
|
+
if ( elementLength === 1 ) {
|
|
73
|
+
|
|
74
|
+
for ( let i = 0; i < array.length; i ++ ) {
|
|
75
|
+
|
|
76
|
+
const index = i * 4;
|
|
77
|
+
|
|
78
|
+
value[ index ] = array[ i ];
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
} else if ( elementType === 'color' ) {
|
|
83
|
+
|
|
84
|
+
for ( let i = 0; i < array.length; i ++ ) {
|
|
85
|
+
|
|
86
|
+
const index = i * 4;
|
|
87
|
+
const vector = array[ i ];
|
|
88
|
+
|
|
89
|
+
value[ index ] = vector.r;
|
|
90
|
+
value[ index + 1 ] = vector.g;
|
|
91
|
+
value[ index + 2 ] = vector.b || 0;
|
|
92
|
+
//value[ index + 3 ] = vector.a || 0;
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
} else {
|
|
97
|
+
|
|
98
|
+
for ( let i = 0; i < array.length; i ++ ) {
|
|
99
|
+
|
|
100
|
+
const index = i * 4;
|
|
101
|
+
const vector = array[ i ];
|
|
102
|
+
|
|
103
|
+
value[ index ] = vector.x;
|
|
104
|
+
value[ index + 1 ] = vector.y;
|
|
105
|
+
value[ index + 2 ] = vector.z || 0;
|
|
106
|
+
value[ index + 3 ] = vector.w || 0;
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
setup( builder ) {
|
|
115
|
+
|
|
116
|
+
const length = this.array.length;
|
|
117
|
+
|
|
118
|
+
this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType;
|
|
119
|
+
this._elementLength = builder.getTypeLength( this._elementType );
|
|
120
|
+
|
|
121
|
+
this.value = new Float32Array( length * 4 );
|
|
122
|
+
this.bufferCount = length;
|
|
123
|
+
|
|
124
|
+
return super.setup( builder );
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
element( indexNode ) {
|
|
129
|
+
|
|
130
|
+
return nodeObject( new UniformsElementNode( this, nodeObject( indexNode ) ) );
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export default UniformsNode;
|
|
137
|
+
|
|
138
|
+
export const uniforms = ( values, nodeType ) => nodeObject( new UniformsNode( values, nodeType ) );
|
|
139
|
+
|
|
140
|
+
addNodeClass( 'UniformsNode', UniformsNode );
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { addNodeClass } from '../core/Node.js';
|
|
2
2
|
import TempNode from '../core/TempNode.js';
|
|
3
3
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
4
|
+
import { vectorComponents } from '../core/constants.js';
|
|
4
5
|
|
|
5
6
|
class AssignNode extends TempNode {
|
|
6
7
|
|
|
@@ -25,40 +26,95 @@ class AssignNode extends TempNode {
|
|
|
25
26
|
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
needsSplitAssign( builder ) {
|
|
30
|
+
|
|
31
|
+
const { targetNode } = this;
|
|
32
|
+
|
|
33
|
+
if ( builder.isAvailable( 'swizzleAssign' ) === false && targetNode.isSplitNode && targetNode.components.length > 1 ) {
|
|
34
|
+
|
|
35
|
+
const targetLength = builder.getTypeLength( targetNode.node.getNodeType( builder ) );
|
|
36
|
+
const assignDiferentVector = vectorComponents.join( '' ).slice( 0, targetLength ) !== targetNode.components;
|
|
37
|
+
|
|
38
|
+
return assignDiferentVector;
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return false;
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
28
46
|
generate( builder, output ) {
|
|
29
47
|
|
|
30
|
-
const targetNode = this
|
|
31
|
-
|
|
48
|
+
const { targetNode, sourceNode } = this;
|
|
49
|
+
|
|
50
|
+
const needsSplitAssign = this.needsSplitAssign( builder );
|
|
32
51
|
|
|
33
52
|
const targetType = targetNode.getNodeType( builder );
|
|
34
53
|
|
|
35
|
-
const target = targetNode.build( builder );
|
|
54
|
+
const target = targetNode.context( { assign: true } ).build( builder );
|
|
36
55
|
const source = sourceNode.build( builder, targetType );
|
|
37
56
|
|
|
38
|
-
const
|
|
57
|
+
const sourceType = sourceNode.getNodeType( builder );
|
|
58
|
+
|
|
59
|
+
const nodeData = builder.getDataFromNode( this );
|
|
60
|
+
|
|
61
|
+
//
|
|
39
62
|
|
|
40
|
-
|
|
63
|
+
let snippet;
|
|
41
64
|
|
|
42
|
-
|
|
65
|
+
if ( nodeData.initialized === true ) {
|
|
66
|
+
|
|
67
|
+
if ( output !== 'void' ) {
|
|
68
|
+
|
|
69
|
+
snippet = target;
|
|
70
|
+
|
|
71
|
+
}
|
|
43
72
|
|
|
44
|
-
|
|
73
|
+
} else if ( needsSplitAssign ) {
|
|
74
|
+
|
|
75
|
+
const sourceVar = builder.getVarFromNode( this, null, targetType );
|
|
76
|
+
const sourceProperty = builder.getPropertyName( sourceVar );
|
|
77
|
+
|
|
78
|
+
builder.addLineFlowCode( `${ sourceProperty } = ${ source }` );
|
|
79
|
+
|
|
80
|
+
const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
|
|
81
|
+
|
|
82
|
+
for ( let i = 0; i < targetNode.components.length; i ++ ) {
|
|
83
|
+
|
|
84
|
+
const component = targetNode.components[ i ];
|
|
85
|
+
|
|
86
|
+
builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]` );
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if ( output !== 'void' ) {
|
|
91
|
+
|
|
92
|
+
snippet = target;
|
|
93
|
+
|
|
94
|
+
}
|
|
45
95
|
|
|
46
96
|
} else {
|
|
47
97
|
|
|
48
|
-
|
|
98
|
+
snippet = `${ target } = ${ source }`;
|
|
49
99
|
|
|
50
|
-
if ( sourceType === 'void' ) {
|
|
100
|
+
if ( output === 'void' || sourceType === 'void' ) {
|
|
51
101
|
|
|
52
102
|
builder.addLineFlowCode( snippet );
|
|
53
103
|
|
|
54
|
-
|
|
104
|
+
if ( output !== 'void' ) {
|
|
55
105
|
|
|
56
|
-
|
|
106
|
+
snippet = target;
|
|
57
107
|
|
|
58
|
-
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
}
|
|
59
111
|
|
|
60
112
|
}
|
|
61
113
|
|
|
114
|
+
nodeData.initialized = true;
|
|
115
|
+
|
|
116
|
+
return builder.format( snippet, targetType, output );
|
|
117
|
+
|
|
62
118
|
}
|
|
63
119
|
|
|
64
120
|
}
|
|
@@ -40,7 +40,7 @@ class Node extends EventDispatcher {
|
|
|
40
40
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
setReference( /*state*/ ) {
|
|
44
44
|
|
|
45
45
|
return this;
|
|
46
46
|
|
|
@@ -150,12 +150,20 @@ class Node extends EventDispatcher {
|
|
|
150
150
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
increaseUsage( builder ) {
|
|
154
154
|
|
|
155
155
|
const nodeData = builder.getDataFromNode( this );
|
|
156
|
-
nodeData.
|
|
156
|
+
nodeData.usageCount = nodeData.usageCount === undefined ? 1 : nodeData.usageCount + 1;
|
|
157
|
+
|
|
158
|
+
return nodeData.usageCount;
|
|
159
|
+
|
|
160
|
+
}
|
|
157
161
|
|
|
158
|
-
|
|
162
|
+
analyze( builder ) {
|
|
163
|
+
|
|
164
|
+
const usageCount = this.increaseUsage( builder );
|
|
165
|
+
|
|
166
|
+
if ( usageCount === 1 ) {
|
|
159
167
|
|
|
160
168
|
// node flow children
|
|
161
169
|
|
|
@@ -223,6 +231,8 @@ class Node extends EventDispatcher {
|
|
|
223
231
|
|
|
224
232
|
if ( buildStage === 'setup' ) {
|
|
225
233
|
|
|
234
|
+
this.setReference( builder );
|
|
235
|
+
|
|
226
236
|
const properties = builder.getNodeProperties( this );
|
|
227
237
|
|
|
228
238
|
if ( properties.initialized !== true || builder.context.tempRead === false ) {
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
|
|
16
16
|
} from '../../renderers/common/nodes/NodeUniform.js';
|
|
17
17
|
|
|
18
|
-
import { REVISION, RenderTarget, NoColorSpace,
|
|
18
|
+
import { REVISION, RenderTarget, NoColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
|
|
19
19
|
|
|
20
20
|
import { stack } from './StackNode.js';
|
|
21
21
|
import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
|
|
@@ -72,6 +72,8 @@ class NodeBuilder {
|
|
|
72
72
|
this.fogNode = null;
|
|
73
73
|
this.toneMappingNode = null;
|
|
74
74
|
|
|
75
|
+
this.clippingContext = null;
|
|
76
|
+
|
|
75
77
|
this.vertexShader = null;
|
|
76
78
|
this.fragmentShader = null;
|
|
77
79
|
this.computeShader = null;
|
|
@@ -472,14 +474,6 @@ class NodeBuilder {
|
|
|
472
474
|
|
|
473
475
|
}
|
|
474
476
|
|
|
475
|
-
/** @deprecated, r152 */
|
|
476
|
-
getTextureEncodingFromMap( map ) {
|
|
477
|
-
|
|
478
|
-
console.warn( 'THREE.NodeBuilder: Method .getTextureEncodingFromMap replaced by .getTextureColorSpaceFromMap in r152+.' );
|
|
479
|
-
return this.getTextureColorSpaceFromMap( map ) === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
|
|
480
|
-
|
|
481
|
-
}
|
|
482
|
-
|
|
483
477
|
getTextureColorSpaceFromMap( map ) {
|
|
484
478
|
|
|
485
479
|
let colorSpace;
|