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.
- package/LICENSE +1 -1
- package/build/three.cjs +867 -499
- package/build/three.module.js +867 -496
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +5 -1
- package/examples/jsm/capabilities/WebGPU.js +13 -9
- package/examples/jsm/controls/DragControls.js +91 -30
- package/examples/jsm/controls/OrbitControls.js +130 -15
- package/examples/jsm/controls/TransformControls.js +6 -6
- package/examples/jsm/curves/NURBSUtils.js +59 -4
- package/examples/jsm/curves/NURBSVolume.js +62 -0
- package/examples/jsm/exporters/GLTFExporter.js +11 -1
- package/examples/jsm/exporters/USDZExporter.js +8 -7
- package/examples/jsm/helpers/TextureHelper.js +3 -3
- 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 +57 -64
- package/examples/jsm/loaders/DDSLoader.js +1 -0
- package/examples/jsm/loaders/KTX2Loader.js +20 -5
- package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
- package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
- package/examples/jsm/loaders/LUTImageLoader.js +3 -2
- package/examples/jsm/loaders/MaterialXLoader.js +115 -16
- package/examples/jsm/loaders/SVGLoader.js +4 -3
- package/examples/jsm/loaders/VOXLoader.js +9 -2
- package/examples/jsm/loaders/VRMLLoader.js +7 -3
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
- package/examples/jsm/misc/Timer.js +13 -4
- package/examples/jsm/nodes/Nodes.js +24 -11
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
- package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
- package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
- 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 +45 -0
- package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
- package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
- package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
- package/examples/jsm/nodes/code/CodeNode.js +6 -0
- package/examples/jsm/nodes/core/AssignNode.js +68 -12
- package/examples/jsm/nodes/core/AttributeNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +14 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
- package/examples/jsm/nodes/core/NodeFrame.js +18 -10
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/constants.js +1 -0
- package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
- package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
- package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
- package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
- package/examples/jsm/nodes/display/PassNode.js +3 -2
- package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
- package/examples/jsm/nodes/display/ViewportNode.js +0 -2
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
- package/examples/jsm/nodes/fog/FogNode.js +2 -1
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
- package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
- package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
- package/examples/jsm/nodes/math/CondNode.js +42 -7
- package/examples/jsm/nodes/math/MathNode.js +32 -2
- package/examples/jsm/nodes/math/MathUtils.js +15 -0
- package/examples/jsm/nodes/math/OperatorNode.js +13 -5
- package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
- package/examples/jsm/nodes/utils/JoinNode.js +2 -2
- package/examples/jsm/nodes/utils/LoopNode.js +5 -3
- package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
- package/examples/jsm/nodes/utils/RotateNode.js +68 -0
- package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
- package/examples/jsm/nodes/utils/SplitNode.js +4 -4
- package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
- package/examples/jsm/objects/GroundedSkybox.js +50 -0
- package/examples/jsm/objects/QuadMesh.js +8 -2
- package/examples/jsm/objects/Water2.js +8 -8
- package/examples/jsm/postprocessing/GTAOPass.js +11 -1
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Backend.js +14 -0
- package/examples/jsm/renderers/common/Background.js +2 -2
- package/examples/jsm/renderers/common/Bindings.js +1 -1
- package/examples/jsm/renderers/common/ClippingContext.js +165 -0
- package/examples/jsm/renderers/common/DataMap.js +1 -1
- package/examples/jsm/renderers/common/Info.js +25 -1
- package/examples/jsm/renderers/common/Pipelines.js +8 -8
- package/examples/jsm/renderers/common/PostProcessing.js +2 -2
- package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
- 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 +46 -1
- package/examples/jsm/renderers/common/RenderObjects.js +3 -1
- package/examples/jsm/renderers/common/Renderer.js +290 -17
- package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +28 -18
- package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
- 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 +5 -2
- package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/transpiler/AST.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/transpiler/TSLEncoder.js +1 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
- package/examples/jsm/utils/SkeletonUtils.js +14 -3
- package/examples/jsm/utils/SortUtils.js +2 -0
- package/examples/jsm/webxr/ARButton.js +12 -2
- package/examples/jsm/webxr/VRButton.js +25 -7
- package/examples/jsm/webxr/XRButton.js +12 -3
- package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
- package/package.json +5 -4
- package/src/Three.Legacy.js +20 -0
- package/src/Three.js +0 -1
- package/src/audio/Audio.js +1 -3
- package/src/cameras/PerspectiveCamera.js +35 -0
- package/src/constants.js +2 -6
- package/src/core/BufferAttribute.js +2 -12
- package/src/core/BufferGeometry.js +23 -29
- package/src/core/InterleavedBuffer.js +2 -1
- package/src/core/InterleavedBufferAttribute.js +20 -0
- 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/materials/ShaderMaterial.js +2 -1
- package/src/math/Quaternion.js +13 -12
- package/src/math/Triangle.js +0 -30
- package/src/math/Vector3.js +7 -7
- package/src/objects/BatchedMesh.js +6 -7
- package/src/objects/InstancedMesh.js +53 -0
- package/src/objects/Mesh.js +0 -1
- package/src/objects/SkinnedMesh.js +0 -8
- package/src/renderers/WebGLCubeRenderTarget.js +1 -10
- package/src/renderers/WebGLRenderer.js +20 -23
- package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
- 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 +38 -7
- 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 +3 -2
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib.js +2 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -2
- package/src/renderers/webgl/WebGLBackground.js +18 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -1
- package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
- package/src/renderers/webgl/WebGLProgram.js +42 -4
- package/src/renderers/webgl/WebGLPrograms.js +38 -27
- package/src/renderers/webgl/WebGLState.js +11 -21
- package/src/renderers/webgl/WebGLTextures.js +170 -66
- package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
- package/src/renderers/webxr/WebXRManager.js +46 -0
- package/src/scenes/Scene.js +8 -0
- package/src/textures/Source.js +1 -0
- package/src/textures/Texture.js +1 -29
- package/build/three.js +0 -54519
- package/build/three.min.js +0 -7
- package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
- package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import TempNode from '../core/TempNode.js';
|
|
2
|
-
import { nodeObject, addNodeElement, tslFn, float, vec2,
|
|
2
|
+
import { nodeObject, addNodeElement, tslFn, float, vec2, vec4 } from '../shadernode/ShaderNode.js';
|
|
3
3
|
import { NodeUpdateType } from '../core/constants.js';
|
|
4
4
|
import { mul } from '../math/OperatorNode.js';
|
|
5
5
|
import { uv } from '../accessors/UVNode.js';
|
|
6
|
-
import {
|
|
6
|
+
import { texturePass } from './PassNode.js';
|
|
7
7
|
import { uniform } from '../core/UniformNode.js';
|
|
8
8
|
import { Vector2, RenderTarget } from 'three';
|
|
9
9
|
import QuadMesh from '../../objects/QuadMesh.js';
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
// WebGPU: The use of a single QuadMesh for both gaussian blur passes results in a single RenderObject with a SampledTexture binding that
|
|
12
|
+
// alternates between source textures and triggers creation of new BindGroups and BindGroupLayouts every frame.
|
|
13
|
+
|
|
14
|
+
const quadMesh1 = new QuadMesh();
|
|
15
|
+
const quadMesh2 = new QuadMesh();
|
|
12
16
|
|
|
13
17
|
class GaussianBlurNode extends TempNode {
|
|
14
18
|
|
|
15
19
|
constructor( textureNode, sigma = 2 ) {
|
|
16
20
|
|
|
17
|
-
super(
|
|
21
|
+
super( 'vec4' );
|
|
18
22
|
|
|
19
23
|
this.textureNode = textureNode;
|
|
20
24
|
this.sigma = sigma;
|
|
@@ -25,7 +29,11 @@ class GaussianBlurNode extends TempNode {
|
|
|
25
29
|
this._passDirection = uniform( new Vector2() );
|
|
26
30
|
|
|
27
31
|
this._horizontalRT = new RenderTarget();
|
|
32
|
+
this._horizontalRT.texture.name = 'GaussianBlurNode.horizontal';
|
|
28
33
|
this._verticalRT = new RenderTarget();
|
|
34
|
+
this._verticalRT.texture.name = 'GaussianBlurNode.vertical';
|
|
35
|
+
|
|
36
|
+
this._textureNode = texturePass( this, this._verticalRT.texture );
|
|
29
37
|
|
|
30
38
|
this.updateBeforeType = NodeUpdateType.RENDER;
|
|
31
39
|
|
|
@@ -54,17 +62,23 @@ class GaussianBlurNode extends TempNode {
|
|
|
54
62
|
const currentRenderTarget = renderer.getRenderTarget();
|
|
55
63
|
const currentTexture = textureNode.value;
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
quadMesh1.material = this._material;
|
|
66
|
+
quadMesh2.material = this._material;
|
|
58
67
|
|
|
59
68
|
this.setSize( map.image.width, map.image.height );
|
|
60
69
|
|
|
70
|
+
const textureType = map.type;
|
|
71
|
+
|
|
72
|
+
this._horizontalRT.texture.type = textureType;
|
|
73
|
+
this._verticalRT.texture.type = textureType;
|
|
74
|
+
|
|
61
75
|
// horizontal
|
|
62
76
|
|
|
63
77
|
renderer.setRenderTarget( this._horizontalRT );
|
|
64
78
|
|
|
65
79
|
this._passDirection.value.set( 1, 0 );
|
|
66
80
|
|
|
67
|
-
|
|
81
|
+
quadMesh1.render( renderer );
|
|
68
82
|
|
|
69
83
|
// vertical
|
|
70
84
|
|
|
@@ -73,7 +87,7 @@ class GaussianBlurNode extends TempNode {
|
|
|
73
87
|
|
|
74
88
|
this._passDirection.value.set( 0, 1 );
|
|
75
89
|
|
|
76
|
-
|
|
90
|
+
quadMesh2.render( renderer );
|
|
77
91
|
|
|
78
92
|
// restore
|
|
79
93
|
|
|
@@ -82,6 +96,12 @@ class GaussianBlurNode extends TempNode {
|
|
|
82
96
|
|
|
83
97
|
}
|
|
84
98
|
|
|
99
|
+
getTextureNode() {
|
|
100
|
+
|
|
101
|
+
return this._textureNode;
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
85
105
|
setup( builder ) {
|
|
86
106
|
|
|
87
107
|
const textureNode = this.textureNode;
|
|
@@ -109,7 +129,7 @@ class GaussianBlurNode extends TempNode {
|
|
|
109
129
|
const direction = vec2( this.directionNode ).mul( this._passDirection );
|
|
110
130
|
|
|
111
131
|
const weightSum = float( gaussianCoefficients[ 0 ] ).toVar();
|
|
112
|
-
const diffuseSum =
|
|
132
|
+
const diffuseSum = vec4( sampleTexture( uvNode ).mul( weightSum ) ).toVar();
|
|
113
133
|
|
|
114
134
|
for ( let i = 1; i < kernelSize; i ++ ) {
|
|
115
135
|
|
|
@@ -118,21 +138,21 @@ class GaussianBlurNode extends TempNode {
|
|
|
118
138
|
|
|
119
139
|
const uvOffset = vec2( direction.mul( invSize.mul( x ) ) ).toVar();
|
|
120
140
|
|
|
121
|
-
const sample1 =
|
|
122
|
-
const sample2 =
|
|
141
|
+
const sample1 = vec4( sampleTexture( uvNode.add( uvOffset ) ) );
|
|
142
|
+
const sample2 = vec4( sampleTexture( uvNode.sub( uvOffset ) ) );
|
|
123
143
|
|
|
124
144
|
diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
|
|
125
145
|
weightSum.addAssign( mul( 2.0, w ) );
|
|
126
146
|
|
|
127
147
|
}
|
|
128
148
|
|
|
129
|
-
return
|
|
149
|
+
return diffuseSum.div( weightSum );
|
|
130
150
|
|
|
131
151
|
} );
|
|
132
152
|
|
|
133
153
|
//
|
|
134
154
|
|
|
135
|
-
const material = this._material || ( this._material = builder.createNodeMaterial(
|
|
155
|
+
const material = this._material || ( this._material = builder.createNodeMaterial() );
|
|
136
156
|
material.fragmentNode = blur();
|
|
137
157
|
|
|
138
158
|
//
|
|
@@ -142,7 +162,7 @@ class GaussianBlurNode extends TempNode {
|
|
|
142
162
|
|
|
143
163
|
//
|
|
144
164
|
|
|
145
|
-
return
|
|
165
|
+
return this._textureNode;
|
|
146
166
|
|
|
147
167
|
}
|
|
148
168
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import TempNode from '../core/TempNode.js';
|
|
2
2
|
import { add } from '../math/OperatorNode.js';
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
import { modelNormalMatrix } from '../accessors/ModelNode.js';
|
|
5
5
|
import { normalView } from '../accessors/NormalNode.js';
|
|
6
6
|
import { positionView } from '../accessors/PositionNode.js';
|
|
7
|
-
import {
|
|
7
|
+
import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
|
|
8
8
|
import { uv } from '../accessors/UVNode.js';
|
|
9
9
|
import { faceDirection } from './FrontFacingNode.js';
|
|
10
10
|
import { addNodeClass } from '../core/Node.js';
|
|
11
|
-
import { addNodeElement, tslFn, nodeProxy, vec3
|
|
11
|
+
import { addNodeElement, tslFn, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
|
|
12
12
|
|
|
13
13
|
import { TangentSpaceNormalMap, ObjectSpaceNormalMap } from 'three';
|
|
14
14
|
|
|
@@ -101,8 +101,6 @@ export default NormalMapNode;
|
|
|
101
101
|
|
|
102
102
|
export const normalMap = nodeProxy( NormalMapNode );
|
|
103
103
|
|
|
104
|
-
export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView );
|
|
105
|
-
|
|
106
104
|
addNodeElement( 'normalMap', normalMap );
|
|
107
105
|
|
|
108
106
|
addNodeClass( 'NormalMapNode', NormalMapNode );
|
|
@@ -5,7 +5,7 @@ import { NodeUpdateType } from '../core/constants.js';
|
|
|
5
5
|
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
6
6
|
import { uniform } from '../core/UniformNode.js';
|
|
7
7
|
import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDepthNode.js';
|
|
8
|
-
import { RenderTarget, Vector2, HalfFloatType, DepthTexture, FloatType
|
|
8
|
+
import { RenderTarget, Vector2, HalfFloatType, DepthTexture, NoToneMapping/*, FloatType*/ } from 'three';
|
|
9
9
|
|
|
10
10
|
class PassTextureNode extends TextureNode {
|
|
11
11
|
|
|
@@ -51,7 +51,7 @@ class PassNode extends TempNode {
|
|
|
51
51
|
|
|
52
52
|
const depthTexture = new DepthTexture();
|
|
53
53
|
depthTexture.isRenderTargetTexture = true;
|
|
54
|
-
depthTexture.type = FloatType;
|
|
54
|
+
//depthTexture.type = FloatType;
|
|
55
55
|
depthTexture.name = 'PostProcessingDepth';
|
|
56
56
|
|
|
57
57
|
const renderTarget = new RenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );
|
|
@@ -177,6 +177,7 @@ PassNode.DEPTH = 'depth';
|
|
|
177
177
|
export default PassNode;
|
|
178
178
|
|
|
179
179
|
export const pass = ( scene, camera ) => nodeObject( new PassNode( PassNode.COLOR, scene, camera ) );
|
|
180
|
+
export const texturePass = ( pass, texture ) => nodeObject( new PassTextureNode( pass, texture ) );
|
|
180
181
|
export const depthPass = ( scene, camera ) => nodeObject( new PassNode( PassNode.DEPTH, scene, camera ) );
|
|
181
182
|
|
|
182
183
|
addNodeClass( 'PassNode', PassNode );
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import TempNode from '../core/TempNode.js';
|
|
2
2
|
import { addNodeClass } from '../core/Node.js';
|
|
3
|
-
import { tslFn, nodeObject, float, mat3 } from '../shadernode/ShaderNode.js';
|
|
3
|
+
import { tslFn, nodeObject, float, mat3, vec3 } from '../shadernode/ShaderNode.js';
|
|
4
4
|
|
|
5
|
-
import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping } from 'three';
|
|
5
|
+
import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping } from 'three';
|
|
6
|
+
import { clamp, log2, max, pow } from '../math/MathNode.js';
|
|
7
|
+
import { mul } from '../math/OperatorNode.js';
|
|
6
8
|
|
|
7
9
|
// exposure only
|
|
8
10
|
const LinearToneMappingNode = tslFn( ( { color, exposure } ) => {
|
|
@@ -75,11 +77,52 @@ const ACESFilmicToneMappingNode = tslFn( ( { color, exposure } ) => {
|
|
|
75
77
|
|
|
76
78
|
} );
|
|
77
79
|
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
const LINEAR_REC2020_TO_LINEAR_SRGB = mat3( vec3( 1.6605, - 0.1246, - 0.0182 ), vec3( - 0.5876, 1.1329, - 0.1006 ), vec3( - 0.0728, - 0.0083, 1.1187 ) );
|
|
83
|
+
const LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( vec3( 0.6274, 0.0691, 0.0164 ), vec3( 0.3293, 0.9195, 0.0880 ), vec3( 0.0433, 0.0113, 0.8956 ) );
|
|
84
|
+
|
|
85
|
+
const agxDefaultContrastApprox = tslFn( ( [ x_immutable ] ) => {
|
|
86
|
+
|
|
87
|
+
const x = vec3( x_immutable ).toVar();
|
|
88
|
+
const x2 = vec3( x.mul( x ) ).toVar();
|
|
89
|
+
const x4 = vec3( x2.mul( x2 ) ).toVar();
|
|
90
|
+
|
|
91
|
+
return float( 15.5 ).mul( x4.mul( x2 ) ).sub( mul( 40.14, x4.mul( x ) ) ).add( mul( 31.96, x4 ).sub( mul( 6.868, x2.mul( x ) ) ).add( mul( 0.4298, x2 ).add( mul( 0.1191, x ).sub( 0.00232 ) ) ) );
|
|
92
|
+
|
|
93
|
+
} );
|
|
94
|
+
|
|
95
|
+
const AGXToneMappingNode = tslFn( ( { color, exposure } ) => {
|
|
96
|
+
|
|
97
|
+
const colortone = vec3( color ).toVar();
|
|
98
|
+
const AgXInsetMatrix = mat3( vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) );
|
|
99
|
+
const AgXOutsetMatrix = mat3( vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) );
|
|
100
|
+
const AgxMinEv = float( - 12.47393 );
|
|
101
|
+
const AgxMaxEv = float( 4.026069 );
|
|
102
|
+
colortone.mulAssign( exposure );
|
|
103
|
+
colortone.assign( LINEAR_SRGB_TO_LINEAR_REC2020.mul( colortone ) );
|
|
104
|
+
colortone.assign( AgXInsetMatrix.mul( colortone ) );
|
|
105
|
+
colortone.assign( max( colortone, 1e-10 ) );
|
|
106
|
+
colortone.assign( log2( colortone ) );
|
|
107
|
+
colortone.assign( colortone.sub( AgxMinEv ).div( AgxMaxEv.sub( AgxMinEv ) ) );
|
|
108
|
+
colortone.assign( clamp( colortone, 0.0, 1.0 ) );
|
|
109
|
+
colortone.assign( agxDefaultContrastApprox( colortone ) );
|
|
110
|
+
colortone.assign( AgXOutsetMatrix.mul( colortone ) );
|
|
111
|
+
colortone.assign( pow( max( vec3( 0.0 ), colortone ), vec3( 2.2 ) ) );
|
|
112
|
+
colortone.assign( LINEAR_REC2020_TO_LINEAR_SRGB.mul( colortone ) );
|
|
113
|
+
colortone.assign( clamp( colortone, 0.0, 1.0 ) );
|
|
114
|
+
|
|
115
|
+
return colortone;
|
|
116
|
+
|
|
117
|
+
} );
|
|
118
|
+
|
|
119
|
+
|
|
78
120
|
const toneMappingLib = {
|
|
79
121
|
[ LinearToneMapping ]: LinearToneMappingNode,
|
|
80
122
|
[ ReinhardToneMapping ]: ReinhardToneMappingNode,
|
|
81
123
|
[ CineonToneMapping ]: OptimizedCineonToneMappingNode,
|
|
82
|
-
[ ACESFilmicToneMapping ]: ACESFilmicToneMappingNode
|
|
124
|
+
[ ACESFilmicToneMapping ]: ACESFilmicToneMappingNode,
|
|
125
|
+
[ AgXToneMapping ]: AGXToneMappingNode
|
|
83
126
|
};
|
|
84
127
|
|
|
85
128
|
class ToneMappingNode extends TempNode {
|
|
@@ -2,7 +2,7 @@ import ViewportTextureNode from './ViewportTextureNode.js';
|
|
|
2
2
|
import { addNodeClass } from '../core/Node.js';
|
|
3
3
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
4
4
|
import { viewportTopLeft } from './ViewportNode.js';
|
|
5
|
-
import { DepthTexture
|
|
5
|
+
import { DepthTexture } from 'three';
|
|
6
6
|
|
|
7
7
|
let sharedDepthbuffer = null;
|
|
8
8
|
|
|
@@ -13,9 +13,6 @@ class ViewportDepthTextureNode extends ViewportTextureNode {
|
|
|
13
13
|
if ( sharedDepthbuffer === null ) {
|
|
14
14
|
|
|
15
15
|
sharedDepthbuffer = new DepthTexture();
|
|
16
|
-
sharedDepthbuffer.minFilter = NearestMipmapNearestFilter;
|
|
17
|
-
sharedDepthbuffer.type = UnsignedIntType;
|
|
18
|
-
sharedDepthbuffer.format = DepthFormat;
|
|
19
16
|
|
|
20
17
|
}
|
|
21
18
|
|
|
@@ -4,19 +4,19 @@ import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
|
4
4
|
import { viewportTopLeft } from './ViewportNode.js';
|
|
5
5
|
import { FramebufferTexture } from 'three';
|
|
6
6
|
|
|
7
|
-
let
|
|
7
|
+
let _sharedFramebuffer = null;
|
|
8
8
|
|
|
9
9
|
class ViewportSharedTextureNode extends ViewportTextureNode {
|
|
10
10
|
|
|
11
11
|
constructor( uvNode = viewportTopLeft, levelNode = null ) {
|
|
12
12
|
|
|
13
|
-
if (
|
|
13
|
+
if ( _sharedFramebuffer === null ) {
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
_sharedFramebuffer = new FramebufferTexture();
|
|
16
16
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
super( uvNode, levelNode,
|
|
19
|
+
super( uvNode, levelNode, _sharedFramebuffer );
|
|
20
20
|
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
|
+
import { mix } from '../math/MathNode.js';
|
|
2
3
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
3
4
|
|
|
4
5
|
class FogNode extends Node {
|
|
@@ -16,7 +17,7 @@ class FogNode extends Node {
|
|
|
16
17
|
|
|
17
18
|
mixAssign( outputNode ) {
|
|
18
19
|
|
|
19
|
-
return
|
|
20
|
+
return mix( outputNode, this.colorNode, this );
|
|
20
21
|
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -2,7 +2,7 @@ import LightingNode from './LightingNode.js';
|
|
|
2
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
import { addNodeClass } from '../core/Node.js';
|
|
5
|
-
import { /*vec2,*/ vec3 } from '../shadernode/ShaderNode.js';
|
|
5
|
+
import { /*vec2,*/ vec3, vec4 } from '../shadernode/ShaderNode.js';
|
|
6
6
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
7
7
|
import { texture } from '../accessors/TextureNode.js';
|
|
8
8
|
import { positionWorld } from '../accessors/PositionNode.js';
|
|
@@ -12,7 +12,7 @@ import { WebGPUCoordinateSystem } from 'three';
|
|
|
12
12
|
|
|
13
13
|
import { Color, DepthTexture, NearestFilter, LessCompare } from 'three';
|
|
14
14
|
|
|
15
|
-
let
|
|
15
|
+
let overrideMaterial = null;
|
|
16
16
|
|
|
17
17
|
class AnalyticLightNode extends LightingNode {
|
|
18
18
|
|
|
@@ -54,7 +54,13 @@ class AnalyticLightNode extends LightingNode {
|
|
|
54
54
|
|
|
55
55
|
if ( shadowNode === null ) {
|
|
56
56
|
|
|
57
|
-
if (
|
|
57
|
+
if ( overrideMaterial === null ) {
|
|
58
|
+
|
|
59
|
+
overrideMaterial = builder.createNodeMaterial();
|
|
60
|
+
overrideMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
|
|
61
|
+
overrideMaterial.isShadowNodeMaterial = true; // Use to avoid other overrideMaterial override material.fragmentNode unintentionally when using material.shadowNode
|
|
62
|
+
|
|
63
|
+
}
|
|
58
64
|
|
|
59
65
|
const shadow = this.light.shadow;
|
|
60
66
|
const rtt = builder.getRenderTarget( shadow.mapSize.width, shadow.mapSize.height );
|
|
@@ -142,8 +148,10 @@ class AnalyticLightNode extends LightingNode {
|
|
|
142
148
|
*/
|
|
143
149
|
//
|
|
144
150
|
|
|
151
|
+
const shadowColor = texture( rtt.texture, shadowCoord );
|
|
152
|
+
|
|
145
153
|
this.rtt = rtt;
|
|
146
|
-
this.colorNode = this.colorNode.mul( frustumTest.mix( 1, shadowNode ) );
|
|
154
|
+
this.colorNode = this.colorNode.mul( frustumTest.mix( 1, shadowNode.mix( shadowColor.a.mix( 1, shadowColor ), 1 ) ) );
|
|
147
155
|
|
|
148
156
|
this.shadowNode = shadowNode;
|
|
149
157
|
|
|
@@ -169,7 +177,7 @@ class AnalyticLightNode extends LightingNode {
|
|
|
169
177
|
|
|
170
178
|
const currentOverrideMaterial = scene.overrideMaterial;
|
|
171
179
|
|
|
172
|
-
scene.overrideMaterial =
|
|
180
|
+
scene.overrideMaterial = overrideMaterial;
|
|
173
181
|
|
|
174
182
|
rtt.setSize( light.shadow.mapSize.width, light.shadow.mapSize.height );
|
|
175
183
|
|
|
@@ -169,7 +169,7 @@ class LightsNode extends Node {
|
|
|
169
169
|
export default LightsNode;
|
|
170
170
|
|
|
171
171
|
export const lights = ( lights ) => nodeObject( new LightsNode().fromLights( lights ) );
|
|
172
|
-
export const
|
|
172
|
+
export const lightsNode = nodeProxy( LightsNode );
|
|
173
173
|
|
|
174
174
|
export function addLightNode( lightClass, lightNodeClass ) {
|
|
175
175
|
|
|
@@ -133,50 +133,38 @@ class Line2NodeMaterial extends NodeMaterial {
|
|
|
133
133
|
if ( useWorldUnits ) {
|
|
134
134
|
|
|
135
135
|
// get the offset direction as perpendicular to the view vector
|
|
136
|
-
const worldDir = end.xyz.sub( start.xyz ).normalize();
|
|
137
136
|
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
const worldDir = end.xyz.sub( start.xyz ).normalize();
|
|
138
|
+
const tmpFwd = mix( start.xyz, end.xyz, 0.5 ).normalize();
|
|
139
|
+
const worldUp = worldDir.cross( tmpFwd ).normalize();
|
|
140
|
+
const worldFwd = worldDir.cross( worldUp );
|
|
141
141
|
|
|
142
|
-
);
|
|
142
|
+
const worldPos = varyingProperty( 'vec4', 'worldPos' );
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
offset.assign( positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
|
|
144
|
+
worldPos.assign( positionGeometry.y.lessThan( 0.5 ).cond( start, end) );
|
|
146
145
|
|
|
147
|
-
|
|
146
|
+
// height offset
|
|
147
|
+
const hw = materialLineWidth.mul( 0.5 );
|
|
148
|
+
worldPos.addAssign( vec4( positionGeometry.x.lessThan( 0.0 ).cond( worldUp.mul( hw ), worldUp.mul( hw ).negate() ), 0 ) );
|
|
148
149
|
|
|
149
150
|
// don't extend the line if we're rendering dashes because we
|
|
150
151
|
// won't be rendering the endcaps
|
|
151
152
|
if ( ! useDash ) {
|
|
152
153
|
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
end.assign( end.add( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
|
|
154
|
+
// cap extension
|
|
155
|
+
worldPos.addAssign( vec4( positionGeometry.y.lessThan( 0.5 ).cond( worldDir.mul( hw ).negate(), worldDir.mul( hw ) ), 0 ) );
|
|
156
156
|
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
offset.z.assign( offset.z.add( 0.5 ) );
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// endcaps
|
|
157
|
+
// add width to the box
|
|
158
|
+
worldPos.addAssign( vec4( worldFwd.mul( hw ), 0 ) );
|
|
164
159
|
|
|
165
|
-
|
|
160
|
+
// endcaps
|
|
161
|
+
If( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), () => {
|
|
166
162
|
|
|
167
|
-
|
|
163
|
+
worldPos.subAssign( vec4( worldFwd.mul( 2.0 ).mul( hw ), 0 ) );
|
|
168
164
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
// adjust for linewidth
|
|
172
|
-
offset.assign( offset.mul( materialLineWidth ).mul( 0.5 ) );
|
|
173
|
-
|
|
174
|
-
// set the world position
|
|
175
|
-
|
|
176
|
-
const worldPos = varyingProperty( 'vec4', 'worldPos' );
|
|
165
|
+
} );
|
|
177
166
|
|
|
178
|
-
|
|
179
|
-
worldPos.assign( worldPos.add( vec4( offset, 0 ) ) );
|
|
167
|
+
}
|
|
180
168
|
|
|
181
169
|
// project the worldpos
|
|
182
170
|
clip.assign( cameraProjectionMatrix.mul( worldPos ) );
|
|
@@ -11,5 +11,6 @@ export { default as MeshLambertNodeMaterial } from './MeshLambertNodeMaterial.js
|
|
|
11
11
|
export { default as MeshPhongNodeMaterial } from './MeshPhongNodeMaterial.js';
|
|
12
12
|
export { default as MeshStandardNodeMaterial } from './MeshStandardNodeMaterial.js';
|
|
13
13
|
export { default as MeshPhysicalNodeMaterial } from './MeshPhysicalNodeMaterial.js';
|
|
14
|
+
export { default as MeshSSSNodeMaterial } from './MeshSSSNodeMaterial.js';
|
|
14
15
|
export { default as PointsNodeMaterial } from './PointsNodeMaterial.js';
|
|
15
16
|
export { default as SpriteNodeMaterial } from './SpriteNodeMaterial.js';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { addNodeMaterial } from './NodeMaterial.js';
|
|
2
|
+
import { transformedNormalView } from '../accessors/NormalNode.js';
|
|
3
|
+
import { positionViewDirection } from '../accessors/PositionNode.js';
|
|
4
|
+
import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
|
|
5
|
+
import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
|
|
6
|
+
import { float, vec3 } from '../shadernode/ShaderNode.js';
|
|
7
|
+
|
|
8
|
+
class SSSLightingModel extends PhysicalLightingModel {
|
|
9
|
+
|
|
10
|
+
constructor( useClearcoat, useSheen, useIridescence, useSSS ) {
|
|
11
|
+
|
|
12
|
+
super( useClearcoat, useSheen, useIridescence );
|
|
13
|
+
|
|
14
|
+
this.useSSS = useSSS;
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
direct( { lightDirection, lightColor, reflectedLight }, stack, builder ) {
|
|
19
|
+
|
|
20
|
+
if ( this.useSSS === true ) {
|
|
21
|
+
|
|
22
|
+
const material = builder.material;
|
|
23
|
+
|
|
24
|
+
const { thicknessColorNode, thicknessDistortionNode, thicknessAmbientNode, thicknessAttenuationNode, thicknessPowerNode, thicknessScaleNode } = material;
|
|
25
|
+
|
|
26
|
+
const scatteringHalf = lightDirection.add( transformedNormalView.mul( thicknessDistortionNode ) ).normalize();
|
|
27
|
+
const scatteringDot = float( positionViewDirection.dot( scatteringHalf.negate() ).saturate().pow( thicknessPowerNode ).mul( thicknessScaleNode ) );
|
|
28
|
+
const scatteringIllu = vec3( scatteringDot.add( thicknessAmbientNode ).mul( thicknessColorNode ) );
|
|
29
|
+
|
|
30
|
+
reflectedLight.directDiffuse.addAssign( scatteringIllu.mul( thicknessAttenuationNode.mul( lightColor ) ) );
|
|
31
|
+
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
super.direct( { lightDirection, lightColor, reflectedLight }, stack, builder );
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
class MeshSSSNodeMaterial extends MeshPhysicalNodeMaterial {
|
|
41
|
+
|
|
42
|
+
constructor( parameters ) {
|
|
43
|
+
|
|
44
|
+
super( parameters );
|
|
45
|
+
|
|
46
|
+
this.thicknessColorNode = null;
|
|
47
|
+
this.thicknessDistortionNode = float( 0.1 );
|
|
48
|
+
this.thicknessAmbientNode = float( 0.0 );
|
|
49
|
+
this.thicknessAttenuationNode = float( .1 );
|
|
50
|
+
this.thicknessPowerNode = float( 2.0 );
|
|
51
|
+
this.thicknessScaleNode = float( 10.0 );
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get useSSS() {
|
|
56
|
+
|
|
57
|
+
return this.thicknessColorNode !== null;
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
setupLightingModel( /*builder*/ ) {
|
|
62
|
+
|
|
63
|
+
return new SSSLightingModel( this.useClearcoat, this.useSheen, this.useIridescence, this.useSSS );
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
copy( source ) {
|
|
68
|
+
|
|
69
|
+
this.thicknessColorNode = source.thicknessColorNode;
|
|
70
|
+
this.thicknessDistortionNode = source.thicknessDistortionNode;
|
|
71
|
+
this.thicknessAmbientNode = source.thicknessAmbientNode;
|
|
72
|
+
this.thicknessAttenuationNode = source.thicknessAttenuationNode;
|
|
73
|
+
this.thicknessPowerNode = source.thicknessPowerNode;
|
|
74
|
+
this.thicknessScaleNode = source.thicknessScaleNode;
|
|
75
|
+
|
|
76
|
+
return super.copy( source );
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default MeshSSSNodeMaterial;
|
|
83
|
+
|
|
84
|
+
addNodeMaterial( 'MeshSSSNodeMaterial', MeshSSSNodeMaterial );
|