@plastic-software/three 0.183.4 → 0.184.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 +773 -286
- package/build/three.core.js +372 -110
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +426 -180
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +7 -1
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +2979 -1281
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +2942 -1281
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +11 -0
- package/examples/jsm/animation/CCDIKSolver.js +5 -1
- package/examples/jsm/controls/ArcballControls.js +4 -1
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/TrackballControls.js +2 -2
- package/examples/jsm/controls/TransformControls.js +34 -2
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/exporters/GLTFExporter.js +21 -5
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +169 -114
- package/examples/jsm/inspector/RendererInspector.js +2 -2
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +34 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +105 -3
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +273 -176
- package/examples/jsm/inspector/ui/Style.js +64 -10
- package/examples/jsm/inspector/ui/Tab.js +39 -7
- package/examples/jsm/inspector/ui/Values.js +39 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +8 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lines/LineMaterial.js +1 -1
- package/examples/jsm/loaders/EXRLoader.js +682 -43
- package/examples/jsm/loaders/FBXLoader.js +233 -33
- package/examples/jsm/loaders/GLTFLoader.js +24 -7
- package/examples/jsm/loaders/HDRLoader.js +1 -1
- package/examples/jsm/loaders/KTX2Loader.js +8 -2
- package/examples/jsm/loaders/LDrawLoader.js +39 -47
- package/examples/jsm/loaders/SVGLoader.js +1 -1
- package/examples/jsm/loaders/VTKLoader.js +5 -1
- package/examples/jsm/loaders/collada/ColladaComposer.js +101 -7
- package/examples/jsm/loaders/collada/ColladaParser.js +19 -4
- package/examples/jsm/loaders/usd/USDAParser.js +6 -0
- package/examples/jsm/loaders/usd/USDCParser.js +26 -0
- package/examples/jsm/loaders/usd/USDComposer.js +656 -103
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/Sky.js +14 -2
- package/examples/jsm/objects/SkyMesh.js +23 -6
- package/examples/jsm/renderers/Projector.js +18 -38
- package/examples/jsm/renderers/SVGRenderer.js +6 -25
- package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +10 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +11 -0
- package/examples/jsm/tsl/display/BilateralBlurNode.js +10 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/GTAONode.js +2 -1
- package/examples/jsm/tsl/display/GaussianBlurNode.js +10 -0
- package/examples/jsm/tsl/display/GodraysNode.js +2 -11
- package/examples/jsm/tsl/display/OutlineNode.js +66 -16
- package/examples/jsm/tsl/display/SSGINode.js +0 -4
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +48 -7
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +13 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +4 -4
- package/src/Three.Core.js +1 -0
- package/src/Three.TSL.js +6 -0
- package/src/Three.WebGPU.Nodes.js +3 -0
- package/src/Three.WebGPU.js +6 -0
- package/src/animation/AnimationAction.js +11 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/constants.js +1 -1
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/Clock.js +1 -1
- package/src/core/Object3D.js +1 -5
- package/src/core/RenderTarget.js +1 -0
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +1 -2
- package/src/loaders/ImageBitmapLoader.js +4 -6
- package/src/loaders/MaterialLoader.js +1 -1
- package/src/loaders/ObjectLoader.js +25 -4
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +27 -0
- package/src/materials/nodes/NodeMaterial.js +0 -27
- package/src/materials/nodes/manager/NodeMaterialObserver.js +188 -89
- package/src/math/Line3.js +3 -0
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +13 -9
- package/src/math/Plane.js +4 -3
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +12 -8
- package/src/math/Vector4.js +13 -9
- package/src/nodes/Nodes.js +0 -1
- package/src/nodes/TSL.js +1 -1
- package/src/nodes/accessors/BufferAttributeNode.js +9 -3
- package/src/nodes/accessors/CubeTextureNode.js +7 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/SceneProperties.js +2 -8
- package/src/nodes/accessors/StorageBufferNode.js +10 -4
- package/src/nodes/accessors/StorageTextureNode.js +4 -9
- package/src/nodes/accessors/TextureNode.js +10 -2
- package/src/nodes/accessors/UniformArrayNode.js +2 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +1 -1
- package/src/nodes/core/ArrayNode.js +1 -1
- package/src/nodes/core/AssignNode.js +1 -1
- package/src/nodes/core/AttributeNode.js +1 -1
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +1 -1
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/Node.js +83 -12
- package/src/nodes/core/NodeBuilder.js +117 -16
- package/src/nodes/core/NodeUtils.js +1 -1
- package/src/nodes/core/OutputStructNode.js +1 -1
- package/src/nodes/core/ParameterNode.js +1 -1
- package/src/nodes/core/StackNode.js +1 -1
- package/src/nodes/core/StructNode.js +1 -1
- package/src/nodes/core/StructTypeNode.js +1 -1
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/VarNode.js +1 -1
- package/src/nodes/core/VaryingNode.js +1 -1
- package/src/nodes/display/NormalMapNode.js +2 -2
- package/src/nodes/display/PassNode.js +27 -7
- package/src/nodes/display/RenderOutputNode.js +4 -4
- package/src/nodes/display/ScreenNode.js +1 -1
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +18 -7
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/geometry/RangeNode.js +1 -1
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +69 -44
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- package/src/nodes/lighting/LightsNode.js +6 -27
- package/src/nodes/lighting/ShadowNode.js +24 -2
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/ConditionalNode.js +1 -1
- package/src/nodes/math/MathNode.js +73 -1
- package/src/nodes/math/OperatorNode.js +1 -1
- package/src/nodes/math/PackFloatNode.js +1 -1
- package/src/nodes/math/UnpackFloatNode.js +1 -1
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +21 -3
- package/src/nodes/utils/ArrayElementNode.js +1 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +1 -1
- package/src/nodes/utils/EventNode.js +30 -0
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- package/src/nodes/utils/JoinNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/objects/BatchedMesh.js +17 -2
- package/src/objects/InstancedMesh.js +19 -3
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +147 -48
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +0 -8
- package/src/renderers/common/Background.js +2 -2
- package/src/renderers/common/BindGroup.js +1 -8
- package/src/renderers/common/Bindings.js +2 -2
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +1 -1
- package/src/renderers/common/Info.js +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Pipelines.js +36 -3
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +5 -2
- package/src/renderers/common/RenderObject.js +2 -2
- package/src/renderers/common/RenderObjects.js +3 -3
- package/src/renderers/common/RenderPipeline.js +35 -6
- package/src/renderers/common/Renderer.js +232 -53
- package/src/renderers/common/Textures.js +72 -3
- package/src/renderers/common/UniformsGroup.js +1 -1
- package/src/renderers/common/XRManager.js +34 -27
- package/src/renderers/common/extras/PMREMGenerator.js +23 -15
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeManager.js +230 -99
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -3
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk.js +2 -0
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib.js +0 -1
- package/src/renderers/shaders/UniformsLib.js +7 -2
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +13 -13
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +6 -0
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLMaterials.js +12 -13
- package/src/renderers/webgl/WebGLOutput.js +4 -1
- package/src/renderers/webgl/WebGLProgram.js +4 -0
- package/src/renderers/webgl/WebGLPrograms.js +19 -3
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLState.js +43 -0
- package/src/renderers/webgl/WebGLTextures.js +129 -26
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl-fallback/WebGLBackend.js +106 -65
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +29 -51
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +42 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +63 -50
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +160 -146
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +55 -33
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +103 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -0
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +91 -17
- package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -2
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +13 -2
- package/src/utils.js +23 -1
- package/src/nodes/utils/RemapNode.js +0 -125
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GLSL3,
|
|
3
|
+
UniformsGroup,
|
|
4
|
+
Compatibility,
|
|
5
|
+
Color,
|
|
6
|
+
UniformsLib,
|
|
7
|
+
UniformsUtils,
|
|
8
|
+
} from 'three';
|
|
9
|
+
import {
|
|
10
|
+
context,
|
|
11
|
+
cubeTexture,
|
|
12
|
+
reference,
|
|
13
|
+
texture,
|
|
14
|
+
fog,
|
|
15
|
+
rangeFogFactor,
|
|
16
|
+
densityFogFactor,
|
|
17
|
+
workingToColorSpace,
|
|
18
|
+
} from 'three/tsl';
|
|
19
|
+
import {
|
|
20
|
+
NodeUtils,
|
|
21
|
+
NodeFrame,
|
|
22
|
+
Lighting,
|
|
23
|
+
InspectorBase,
|
|
24
|
+
GLSLNodeBuilder,
|
|
25
|
+
BasicNodeLibrary,
|
|
26
|
+
WebGLCapabilities,
|
|
27
|
+
} from 'three/webgpu';
|
|
28
|
+
|
|
29
|
+
// Limitations
|
|
30
|
+
// - VSM shadows not supported
|
|
31
|
+
// - MRT not supported
|
|
32
|
+
// - Transmission not supported
|
|
33
|
+
// - WebGPU postprocessing stack not supported
|
|
34
|
+
// - Storage textures not supported
|
|
35
|
+
// - Fog / environment do not automatically update - must call "dispose"
|
|
36
|
+
// - instanced mesh geometry cannot be shared
|
|
37
|
+
// - Node materials cannot be used with "compile" function
|
|
38
|
+
|
|
39
|
+
// hash any object parameters that will impact the resulting shader so we can force
|
|
40
|
+
// a program update
|
|
41
|
+
function getObjectHash( object ) {
|
|
42
|
+
|
|
43
|
+
return '' + object.receiveShadow;
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Mirrors WebGLUniforms.seqWithValue from WebGLRenderer
|
|
48
|
+
function generateUniformsList( program, uniforms ) {
|
|
49
|
+
|
|
50
|
+
const progUniforms = program.getUniforms();
|
|
51
|
+
const uniformsList = [];
|
|
52
|
+
|
|
53
|
+
for ( let i = 0; i < progUniforms.seq.length; i ++ ) {
|
|
54
|
+
|
|
55
|
+
const u = progUniforms.seq[ i ];
|
|
56
|
+
if ( u.id in uniforms ) uniformsList.push( u );
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return uniformsList;
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// overrides shadow nodes to use the built in shadow textures
|
|
65
|
+
class WebGLNodeBuilder extends GLSLNodeBuilder {
|
|
66
|
+
|
|
67
|
+
addNode( node ) {
|
|
68
|
+
|
|
69
|
+
if ( node.isShadowNode ) {
|
|
70
|
+
|
|
71
|
+
node.setupRenderTarget = shadow => {
|
|
72
|
+
|
|
73
|
+
return { shadowMap: shadow.map, depthTexture: shadow.map.depthTexture };
|
|
74
|
+
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
node.updateBefore = () => {
|
|
78
|
+
|
|
79
|
+
// no need to rerender shadows since WebGLRenderer is handling it
|
|
80
|
+
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
super.addNode( node );
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// produce and update reusable nodes for a scene
|
|
92
|
+
class SceneContext {
|
|
93
|
+
|
|
94
|
+
constructor( renderer, scene ) {
|
|
95
|
+
|
|
96
|
+
// TODO: can / should we update the fog and environment node every frame for recompile?
|
|
97
|
+
this.renderer = renderer;
|
|
98
|
+
this.scene = scene;
|
|
99
|
+
this.lightsNode = renderer.lighting.getNode( scene );
|
|
100
|
+
this.fogNode = null;
|
|
101
|
+
this.environmentNode = null;
|
|
102
|
+
this.prevFog = null;
|
|
103
|
+
this.prevEnvironment = null;
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
getCacheKey() {
|
|
108
|
+
|
|
109
|
+
const { lightsNode, environmentNode, fogNode } = this;
|
|
110
|
+
const lightsHash = lightsNode.getCacheKey();
|
|
111
|
+
const envHash = environmentNode ? environmentNode.getCacheKey : 0;
|
|
112
|
+
const fogHash = fogNode ? fogNode.getCacheKey() : 0;
|
|
113
|
+
return NodeUtils.hashArray( [ lightsHash, envHash, fogHash ] );
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
update() {
|
|
118
|
+
|
|
119
|
+
const { scene, lightsNode } = this;
|
|
120
|
+
|
|
121
|
+
// update lighting
|
|
122
|
+
const sceneLights = [];
|
|
123
|
+
scene.traverse( object => {
|
|
124
|
+
|
|
125
|
+
if ( object.isLight ) {
|
|
126
|
+
|
|
127
|
+
sceneLights.push( object );
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
} );
|
|
132
|
+
|
|
133
|
+
lightsNode.setLights( sceneLights );
|
|
134
|
+
|
|
135
|
+
// update fog
|
|
136
|
+
if ( this.prevFog !== scene.fog ) {
|
|
137
|
+
|
|
138
|
+
this.fogNode = this.getFogNode();
|
|
139
|
+
this.prevFog = scene.fog;
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// update environment
|
|
144
|
+
if ( this.prevEnvironment !== scene.environment ) {
|
|
145
|
+
|
|
146
|
+
this.environmentNode = this.getEnvironmentNode();
|
|
147
|
+
this.prevEnvironment = scene.environment;
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
getFogNode() {
|
|
154
|
+
|
|
155
|
+
const { scene } = this;
|
|
156
|
+
if ( scene.fog && scene.fog.isFogExp2 ) {
|
|
157
|
+
|
|
158
|
+
const color = reference( 'color', 'color', scene.fog );
|
|
159
|
+
const density = reference( 'density', 'float', scene.fog );
|
|
160
|
+
return fog( color, densityFogFactor( density ) );
|
|
161
|
+
|
|
162
|
+
} else if ( scene.fog && scene.fog.isFog ) {
|
|
163
|
+
|
|
164
|
+
const color = reference( 'color', 'color', scene.fog );
|
|
165
|
+
const near = reference( 'near', 'float', scene.fog );
|
|
166
|
+
const far = reference( 'far', 'float', scene.fog );
|
|
167
|
+
return fog( color, rangeFogFactor( near, far ) );
|
|
168
|
+
|
|
169
|
+
} else {
|
|
170
|
+
|
|
171
|
+
return null;
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
getEnvironmentNode() {
|
|
178
|
+
|
|
179
|
+
const { scene } = this;
|
|
180
|
+
if ( scene.environment && scene.environment.isCubeTexture ) {
|
|
181
|
+
|
|
182
|
+
return cubeTexture( scene.environment );
|
|
183
|
+
|
|
184
|
+
} else if ( scene.environment && scene.environment.isTexture ) {
|
|
185
|
+
|
|
186
|
+
return texture( scene.environment );
|
|
187
|
+
|
|
188
|
+
} else {
|
|
189
|
+
|
|
190
|
+
return null;
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
class RendererProxy {
|
|
199
|
+
|
|
200
|
+
constructor( renderer ) {
|
|
201
|
+
|
|
202
|
+
const backend = {
|
|
203
|
+
isWebGPUBackend: false,
|
|
204
|
+
extensions: renderer.extensions,
|
|
205
|
+
gl: renderer.getContext(),
|
|
206
|
+
capabilities: null,
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
backend.capabilities = new WebGLCapabilities( backend );
|
|
210
|
+
|
|
211
|
+
this.contextNode = context();
|
|
212
|
+
this.inspector = new InspectorBase();
|
|
213
|
+
this.library = new BasicNodeLibrary();
|
|
214
|
+
this.lighting = new Lighting();
|
|
215
|
+
this.backend = backend;
|
|
216
|
+
|
|
217
|
+
const self = this;
|
|
218
|
+
return new Proxy( renderer, {
|
|
219
|
+
|
|
220
|
+
get( target, property ) {
|
|
221
|
+
|
|
222
|
+
return Reflect.get( property in self ? self : target, property );
|
|
223
|
+
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
set( target, property, value ) {
|
|
227
|
+
|
|
228
|
+
return Reflect.set( property in self ? self : target, property, value );
|
|
229
|
+
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
} );
|
|
233
|
+
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
hasInitialized() {
|
|
237
|
+
|
|
238
|
+
return true;
|
|
239
|
+
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
getMRT() {
|
|
243
|
+
|
|
244
|
+
return null;
|
|
245
|
+
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
hasCompatibility( name ) {
|
|
249
|
+
|
|
250
|
+
if ( name === Compatibility.TEXTURE_COMPARE ) {
|
|
251
|
+
|
|
252
|
+
return true;
|
|
253
|
+
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return false;
|
|
257
|
+
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
getCacheKey() {
|
|
261
|
+
|
|
262
|
+
return this.toneMapping + this.outputColorSpace;
|
|
263
|
+
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Compatibility loader and builder for TSL Node materials in WebGLRenderer.
|
|
270
|
+
*/
|
|
271
|
+
export class WebGLNodesHandler {
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Constructs a new WebGL node adapter.
|
|
275
|
+
*/
|
|
276
|
+
constructor() {
|
|
277
|
+
|
|
278
|
+
this.renderer = null;
|
|
279
|
+
this.nodeFrame = new NodeFrame();
|
|
280
|
+
this.sceneContexts = new WeakMap();
|
|
281
|
+
this.programCache = new Map();
|
|
282
|
+
this.renderStack = [];
|
|
283
|
+
|
|
284
|
+
const self = this;
|
|
285
|
+
this.onDisposeMaterialCallback = function () {
|
|
286
|
+
|
|
287
|
+
// dispose of all the uniform groups
|
|
288
|
+
const { programCache } = self;
|
|
289
|
+
if ( programCache.has( this ) ) {
|
|
290
|
+
|
|
291
|
+
self.programCache.get( this ).forEach( ( { uniformsGroups } ) => {
|
|
292
|
+
|
|
293
|
+
uniformsGroups.forEach( u => u.dispose() );
|
|
294
|
+
|
|
295
|
+
} );
|
|
296
|
+
|
|
297
|
+
self.programCache.delete( this );
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
this.removeEventListener( 'dispose', self.onDisposeMaterialCallback );
|
|
302
|
+
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
this.getOutputCallback = function ( outputNode ) {
|
|
306
|
+
|
|
307
|
+
// apply tone mapping and color spaces to the output
|
|
308
|
+
const { outputColorSpace, toneMapping } = self.renderer;
|
|
309
|
+
outputNode = outputNode.toneMapping( toneMapping );
|
|
310
|
+
outputNode = workingToColorSpace( outputNode, outputColorSpace );
|
|
311
|
+
|
|
312
|
+
return outputNode;
|
|
313
|
+
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
this.onBeforeRenderCallback = function ( renderer, scene, camera, geometry, object ) {
|
|
317
|
+
|
|
318
|
+
// update node frame references for update nodes
|
|
319
|
+
const { nodeFrame } = self;
|
|
320
|
+
nodeFrame.material = this;
|
|
321
|
+
nodeFrame.object = object;
|
|
322
|
+
|
|
323
|
+
// increment "frame" here to force uniform buffers to update for the material, which otherwise only get
|
|
324
|
+
// updated once per frame.
|
|
325
|
+
renderer.info.render.frame ++;
|
|
326
|
+
|
|
327
|
+
// update the uniform groups and nodes for the program if they're available before rendering
|
|
328
|
+
if ( renderer.properties.has( this ) ) {
|
|
329
|
+
|
|
330
|
+
const currentProgram = renderer.properties.get( this ).currentProgram;
|
|
331
|
+
const programs = self.programCache.get( this );
|
|
332
|
+
if ( programs && programs.has( currentProgram ) ) {
|
|
333
|
+
|
|
334
|
+
// update the nodes for the current object
|
|
335
|
+
const { updateNodes } = programs.get( currentProgram );
|
|
336
|
+
self.updateNodes( updateNodes );
|
|
337
|
+
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const objectHash = getObjectHash( object );
|
|
343
|
+
if ( this.prevObjectHash !== objectHash ) {
|
|
344
|
+
|
|
345
|
+
this.prevObjectHash = objectHash;
|
|
346
|
+
this.needsUpdate = true;
|
|
347
|
+
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
this.customProgramCacheKeyCallback = function () {
|
|
353
|
+
|
|
354
|
+
const { renderStack, renderer, nodeFrame } = self;
|
|
355
|
+
const sceneHash = renderStack[ renderStack.length - 1 ].sceneContext.getCacheKey();
|
|
356
|
+
const materialHash = this.constructor.prototype.customProgramCacheKey.call( this );
|
|
357
|
+
const rendererHash = renderer.getCacheKey();
|
|
358
|
+
|
|
359
|
+
return materialHash + sceneHash + rendererHash + getObjectHash( nodeFrame.object );
|
|
360
|
+
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
setRenderer( renderer ) {
|
|
366
|
+
|
|
367
|
+
const rendererProxy = new RendererProxy( renderer );
|
|
368
|
+
this.nodeFrame.renderer = rendererProxy;
|
|
369
|
+
this.renderer = rendererProxy;
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
onUpdateProgram( material, program, materialProperties ) {
|
|
374
|
+
|
|
375
|
+
const { programCache } = this;
|
|
376
|
+
if ( ! programCache.has( material ) ) {
|
|
377
|
+
|
|
378
|
+
programCache.set( material, new Map() );
|
|
379
|
+
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const programs = programCache.get( material );
|
|
383
|
+
if ( ! programs.has( program ) ) {
|
|
384
|
+
|
|
385
|
+
const builder = material._latestBuilder;
|
|
386
|
+
const uniforms = materialProperties.uniforms;
|
|
387
|
+
programs.set( program, {
|
|
388
|
+
uniformsGroups: this.collectUniformsGroups( builder ),
|
|
389
|
+
uniforms: uniforms,
|
|
390
|
+
uniformsList: generateUniformsList( program, uniforms ),
|
|
391
|
+
updateNodes: builder.updateNodes,
|
|
392
|
+
} );
|
|
393
|
+
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const { uniformsGroups, uniforms, uniformsList, updateNodes } = programs.get( program );
|
|
397
|
+
material.uniformsGroups = uniformsGroups;
|
|
398
|
+
materialProperties.uniforms = uniforms;
|
|
399
|
+
materialProperties.uniformsList = uniformsList;
|
|
400
|
+
this.updateNodes( updateNodes );
|
|
401
|
+
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
renderStart( scene, camera ) {
|
|
406
|
+
|
|
407
|
+
const { nodeFrame, renderStack, renderer, sceneContexts } = this;
|
|
408
|
+
nodeFrame.update();
|
|
409
|
+
nodeFrame.camera = camera;
|
|
410
|
+
nodeFrame.scene = scene;
|
|
411
|
+
nodeFrame.frameId ++;
|
|
412
|
+
|
|
413
|
+
let sceneContext = sceneContexts.get( scene );
|
|
414
|
+
if ( ! sceneContext ) {
|
|
415
|
+
|
|
416
|
+
sceneContext = new SceneContext( renderer, scene );
|
|
417
|
+
sceneContexts.set( scene, sceneContext );
|
|
418
|
+
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
sceneContext.update();
|
|
422
|
+
renderStack.push( { sceneContext, camera } );
|
|
423
|
+
|
|
424
|
+
// ensure all node material callbacks are initialized before
|
|
425
|
+
// traversal and build
|
|
426
|
+
const {
|
|
427
|
+
customProgramCacheKeyCallback,
|
|
428
|
+
onBeforeRenderCallback,
|
|
429
|
+
} = this;
|
|
430
|
+
|
|
431
|
+
scene.traverse( object => {
|
|
432
|
+
|
|
433
|
+
if ( object.material && object.material.isNodeMaterial ) {
|
|
434
|
+
|
|
435
|
+
object.material.customProgramCacheKey = customProgramCacheKeyCallback;
|
|
436
|
+
object.material.onBeforeRender = onBeforeRenderCallback;
|
|
437
|
+
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
} );
|
|
441
|
+
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
renderEnd() {
|
|
445
|
+
|
|
446
|
+
const { nodeFrame, renderStack } = this;
|
|
447
|
+
|
|
448
|
+
renderStack.pop();
|
|
449
|
+
|
|
450
|
+
const frame = renderStack[ renderStack.length - 1 ];
|
|
451
|
+
if ( frame ) {
|
|
452
|
+
|
|
453
|
+
const { camera, sceneContext } = frame;
|
|
454
|
+
nodeFrame.camera = camera;
|
|
455
|
+
nodeFrame.scene = sceneContext.scene;
|
|
456
|
+
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
build( material, object, parameters ) {
|
|
462
|
+
|
|
463
|
+
const {
|
|
464
|
+
nodeFrame,
|
|
465
|
+
renderer,
|
|
466
|
+
getOutputCallback,
|
|
467
|
+
onDisposeMaterialCallback,
|
|
468
|
+
renderStack,
|
|
469
|
+
} = this;
|
|
470
|
+
|
|
471
|
+
const {
|
|
472
|
+
camera,
|
|
473
|
+
sceneContext,
|
|
474
|
+
} = renderStack[ renderStack.length - 1 ];
|
|
475
|
+
|
|
476
|
+
const {
|
|
477
|
+
fogNode,
|
|
478
|
+
environmentNode,
|
|
479
|
+
lightsNode,
|
|
480
|
+
scene,
|
|
481
|
+
} = sceneContext;
|
|
482
|
+
|
|
483
|
+
// prepare the frame
|
|
484
|
+
nodeFrame.material = material;
|
|
485
|
+
nodeFrame.object = object;
|
|
486
|
+
|
|
487
|
+
// create & run the builder
|
|
488
|
+
const builder = new WebGLNodeBuilder( object, renderer );
|
|
489
|
+
builder.scene = scene;
|
|
490
|
+
builder.camera = camera;
|
|
491
|
+
builder.material = material;
|
|
492
|
+
builder.fogNode = fogNode;
|
|
493
|
+
builder.environmentNode = environmentNode;
|
|
494
|
+
builder.lightsNode = lightsNode;
|
|
495
|
+
builder.context.getOutput = getOutputCallback;
|
|
496
|
+
builder.build();
|
|
497
|
+
|
|
498
|
+
// update the shader parameters and geometry for program creation and rendering
|
|
499
|
+
this.updateShaderParameters( builder, parameters );
|
|
500
|
+
this.updateGeometryAttributes( builder, object.geometry );
|
|
501
|
+
|
|
502
|
+
// reset node frame settings to account for any intermediate renders
|
|
503
|
+
nodeFrame.material = material;
|
|
504
|
+
nodeFrame.object = object;
|
|
505
|
+
|
|
506
|
+
// set up callbacks for uniforms and node updates
|
|
507
|
+
material._latestBuilder = builder;
|
|
508
|
+
material.addEventListener( 'dispose', onDisposeMaterialCallback );
|
|
509
|
+
this.updateNodes( builder.updateNodes );
|
|
510
|
+
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
updateGeometryAttributes( builder, geometry ) {
|
|
514
|
+
|
|
515
|
+
// TODO: this may cause issues if the material / geometry is used in multiple places
|
|
516
|
+
|
|
517
|
+
// add instancing attributes
|
|
518
|
+
builder.bufferAttributes.forEach( v => {
|
|
519
|
+
|
|
520
|
+
geometry.setAttribute( v.name, v.node.attribute );
|
|
521
|
+
|
|
522
|
+
} );
|
|
523
|
+
|
|
524
|
+
// force WebGLAttributes & WebGLBindingStates to refresh
|
|
525
|
+
// could be fixed by running "build" sooner? Or calling "WebGLAttributes" separately for those
|
|
526
|
+
// associated with a material?
|
|
527
|
+
queueMicrotask( () => geometry.dispose() );
|
|
528
|
+
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
updateShaderParameters( builder, parameters ) {
|
|
532
|
+
|
|
533
|
+
// set up shaders
|
|
534
|
+
parameters.isRawShaderMaterial = true;
|
|
535
|
+
parameters.glslVersion = GLSL3;
|
|
536
|
+
parameters.vertexShader = builder.vertexShader.replace( /#version 300 es/, '' );
|
|
537
|
+
parameters.fragmentShader = builder.fragmentShader.replace( /#version 300 es/, '' );
|
|
538
|
+
|
|
539
|
+
// add uniforms accessed by WebGLRenderer
|
|
540
|
+
parameters.uniforms = {
|
|
541
|
+
fogColor: { value: new Color() },
|
|
542
|
+
fogNear: { value: 0 },
|
|
543
|
+
fogFar: { value: 0 },
|
|
544
|
+
envMapIntensity: { value: 0 },
|
|
545
|
+
...UniformsUtils.clone( UniformsLib.lights )
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
// init uniforms
|
|
549
|
+
const builderUniforms = [ ...builder.uniforms.vertex, ...builder.uniforms.fragment ];
|
|
550
|
+
for ( const uniform of builderUniforms ) {
|
|
551
|
+
|
|
552
|
+
parameters.uniforms[ uniform.name ] = uniform.node;
|
|
553
|
+
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
collectUniformsGroups( builder ) {
|
|
559
|
+
|
|
560
|
+
// create UniformsGroups for regular grouped uniforms
|
|
561
|
+
const uniformsGroups = [];
|
|
562
|
+
for ( const key in builder.uniformGroups ) {
|
|
563
|
+
|
|
564
|
+
const { uniforms } = builder.uniformGroups[ key ];
|
|
565
|
+
const group = new UniformsGroup();
|
|
566
|
+
group.name = key;
|
|
567
|
+
group.uniforms = uniforms.map( node => node.nodeUniform );
|
|
568
|
+
uniformsGroups.push( group );
|
|
569
|
+
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// init uniforms
|
|
573
|
+
const builderUniforms = [ ...builder.uniforms.vertex, ...builder.uniforms.fragment ];
|
|
574
|
+
for ( const uniform of builderUniforms ) {
|
|
575
|
+
|
|
576
|
+
if ( uniform.type === 'buffer' ) {
|
|
577
|
+
|
|
578
|
+
// buffer uniforms are all nested in groups
|
|
579
|
+
const group = new UniformsGroup();
|
|
580
|
+
group.name = uniform.node.name;
|
|
581
|
+
group.uniforms = [ uniform ];
|
|
582
|
+
uniformsGroups.push( group );
|
|
583
|
+
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
return uniformsGroups;
|
|
589
|
+
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
updateNodes( updateNodes ) {
|
|
593
|
+
|
|
594
|
+
// update nodes for render
|
|
595
|
+
const { nodeFrame } = this;
|
|
596
|
+
nodeFrame.renderId ++;
|
|
597
|
+
for ( const node of updateNodes ) {
|
|
598
|
+
|
|
599
|
+
nodeFrame.updateNode( node );
|
|
600
|
+
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
}
|
|
@@ -80,6 +80,14 @@ class AfterImageNode extends TempNode {
|
|
|
80
80
|
*/
|
|
81
81
|
this._textureNodeOld = texture( this._oldRT.texture );
|
|
82
82
|
|
|
83
|
+
/**
|
|
84
|
+
* The material for the composite pass.
|
|
85
|
+
*
|
|
86
|
+
* @private
|
|
87
|
+
* @type {?NodeMaterial}
|
|
88
|
+
*/
|
|
89
|
+
this._materialComposed = null;
|
|
90
|
+
|
|
83
91
|
/**
|
|
84
92
|
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
85
93
|
* its effect once per frame in `updateBefore()`.
|
|
@@ -226,6 +234,8 @@ class AfterImageNode extends TempNode {
|
|
|
226
234
|
this._compRT.dispose();
|
|
227
235
|
this._oldRT.dispose();
|
|
228
236
|
|
|
237
|
+
if ( this._materialComposed !== null ) this._materialComposed.dispose();
|
|
238
|
+
|
|
229
239
|
}
|
|
230
240
|
|
|
231
241
|
}
|
|
@@ -98,6 +98,15 @@ class AnamorphicNode extends TempNode {
|
|
|
98
98
|
*/
|
|
99
99
|
this._textureNode = passTexture( this, this._renderTarget.texture );
|
|
100
100
|
|
|
101
|
+
/**
|
|
102
|
+
* The material for the anamorphic pass.
|
|
103
|
+
*
|
|
104
|
+
* @private
|
|
105
|
+
* @type {?NodeMaterial}
|
|
106
|
+
*/
|
|
107
|
+
this._material = null;
|
|
108
|
+
|
|
109
|
+
|
|
101
110
|
/**
|
|
102
111
|
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
103
112
|
* its effect once per frame in `updateBefore()`.
|
|
@@ -239,6 +248,8 @@ class AnamorphicNode extends TempNode {
|
|
|
239
248
|
|
|
240
249
|
this._renderTarget.dispose();
|
|
241
250
|
|
|
251
|
+
if ( this._material !== null ) this._material.dispose();
|
|
252
|
+
|
|
242
253
|
}
|
|
243
254
|
|
|
244
255
|
/**
|
|
@@ -112,6 +112,14 @@ class BilateralBlurNode extends TempNode {
|
|
|
112
112
|
this._textureNode = passTexture( this, this._verticalRT.texture );
|
|
113
113
|
this._textureNode.uvNode = textureNode.uvNode;
|
|
114
114
|
|
|
115
|
+
/**
|
|
116
|
+
* The material for the blur pass.
|
|
117
|
+
*
|
|
118
|
+
* @private
|
|
119
|
+
* @type {?NodeMaterial}
|
|
120
|
+
*/
|
|
121
|
+
this._material = null;
|
|
122
|
+
|
|
115
123
|
/**
|
|
116
124
|
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
117
125
|
* its effect once per frame in `updateBefore()`.
|
|
@@ -318,6 +326,8 @@ class BilateralBlurNode extends TempNode {
|
|
|
318
326
|
this._horizontalRT.dispose();
|
|
319
327
|
this._verticalRT.dispose();
|
|
320
328
|
|
|
329
|
+
if ( this._material !== null ) this._material.dispose();
|
|
330
|
+
|
|
321
331
|
}
|
|
322
332
|
|
|
323
333
|
/**
|