@plastic-software/three 0.179.0 → 0.180.1
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 +167 -107
- package/build/three.core.js +112 -20
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +56 -90
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +30 -5
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +2896 -1048
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +2896 -1048
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +7 -7
- package/examples/jsm/controls/DragControls.js +6 -56
- package/examples/jsm/controls/FirstPersonControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +0 -8
- package/examples/jsm/exporters/GLTFExporter.js +30 -22
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +1 -1
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/GLTFLoader.js +9 -5
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +112 -32
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +2 -2
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
- package/examples/jsm/transpiler/TSLEncoder.js +2 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +27 -4
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +439 -90
- package/examples/jsm/tsl/display/GTAONode.js +8 -0
- package/examples/jsm/tsl/display/GaussianBlurNode.js +47 -35
- package/examples/jsm/tsl/display/OutlineNode.js +2 -2
- package/examples/jsm/tsl/display/SSRNode.js +180 -65
- package/examples/jsm/tsl/display/TRAANode.js +1 -1
- package/examples/jsm/tsl/display/boxBlur.js +64 -0
- package/examples/jsm/tsl/display/hashBlur.js +15 -18
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/package.json +1 -1
- package/src/Three.Core.js +1 -0
- package/src/Three.TSL.js +29 -4
- package/src/animation/AnimationClip.js +17 -2
- package/src/constants.js +11 -3
- package/src/core/BufferGeometry.js +2 -2
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/lib/earcut.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/materials/Material.js +12 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +1 -1
- package/src/math/ColorManagement.js +7 -1
- package/src/nodes/Nodes.js +3 -0
- package/src/nodes/TSL.js +3 -0
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +133 -7
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +2 -2
- package/src/nodes/accessors/InstanceNode.js +3 -1
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +1 -1
- package/src/nodes/accessors/Texture3DNode.js +13 -0
- package/src/nodes/accessors/TextureNode.js +71 -19
- package/src/nodes/code/FunctionCallNode.js +19 -0
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/AssignNode.js +4 -3
- package/src/nodes/core/ContextNode.js +24 -0
- package/src/nodes/core/Node.js +16 -20
- package/src/nodes/core/NodeBuilder.js +48 -14
- package/src/nodes/core/NodeFrame.js +1 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +1 -2
- package/src/nodes/core/StackNode.js +29 -4
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformNode.js +16 -9
- package/src/nodes/core/VarNode.js +0 -21
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/PassNode.js +1 -1
- package/src/nodes/display/ScreenNode.js +42 -13
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +42 -12
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
- package/src/nodes/lighting/LightsNode.js +1 -1
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +18 -2
- package/src/nodes/math/MathNode.js +3 -15
- package/src/nodes/math/OperatorNode.js +4 -3
- package/src/nodes/tsl/TSLCore.js +432 -152
- package/src/nodes/utils/JoinNode.js +3 -1
- package/src/nodes/utils/MemberNode.js +58 -7
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +51 -7
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/objects/BatchedMesh.js +2 -2
- package/src/objects/LOD.js +1 -1
- package/src/objects/Sprite.js +2 -2
- package/src/renderers/WebGLRenderer.js +1 -10
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +19 -1
- package/src/renderers/common/Bindings.js +2 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderObject.js +14 -2
- package/src/renderers/common/Renderer.js +39 -19
- package/src/renderers/common/SampledTexture.js +1 -1
- package/src/renderers/common/Sampler.js +25 -13
- package/src/renderers/common/Textures.js +34 -12
- package/src/renderers/common/TimestampQueryPool.js +3 -3
- package/src/renderers/common/XRManager.js +35 -19
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +5 -5
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
- package/src/renderers/webgl/WebGLProgram.js +4 -4
- package/src/renderers/webgl/WebGLShadowMap.js +1 -1
- package/src/renderers/webgl/WebGLTextures.js +1 -0
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +186 -135
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +110 -17
- package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +35 -31
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +124 -34
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +9 -18
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +114 -25
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +39 -24
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/Source.js +1 -1
- package/src/textures/VideoTexture.js +0 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import * as TSL from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
// some helpers below are ported from Blender and converted to TSL
|
|
5
|
+
|
|
6
|
+
const mapRange = TSL.Fn( ( [ x, fromMin, fromMax, toMin, toMax, clmp ] ) => {
|
|
7
|
+
|
|
8
|
+
const factor = x.sub( fromMin ).div( fromMax.sub( fromMin ) );
|
|
9
|
+
const result = toMin.add( factor.mul( toMax.sub( toMin ) ) );
|
|
10
|
+
|
|
11
|
+
return TSL.select( clmp, TSL.max( TSL.min( result, toMax ), toMin ), result );
|
|
12
|
+
|
|
13
|
+
} );
|
|
14
|
+
|
|
15
|
+
const voronoi3d = TSL.wgslFn( `
|
|
16
|
+
fn voronoi3d(x: vec3<f32>, smoothness: f32, randomness: f32) -> f32
|
|
17
|
+
{
|
|
18
|
+
let p = floor(x);
|
|
19
|
+
let f = fract(x);
|
|
20
|
+
|
|
21
|
+
var res = 0.0;
|
|
22
|
+
var totalWeight = 0.0;
|
|
23
|
+
|
|
24
|
+
for (var k = -1; k <= 1; k++)
|
|
25
|
+
{
|
|
26
|
+
for (var j = -1; j <= 1; j++)
|
|
27
|
+
{
|
|
28
|
+
for (var i = -1; i <= 1; i++)
|
|
29
|
+
{
|
|
30
|
+
let b = vec3<f32>(f32(i), f32(j), f32(k));
|
|
31
|
+
let hashOffset = hash3d(p + b) * randomness;
|
|
32
|
+
let r = b - f + hashOffset;
|
|
33
|
+
let d = length(r);
|
|
34
|
+
|
|
35
|
+
let weight = exp(-d * d / max(smoothness * smoothness, 0.001));
|
|
36
|
+
res += d * weight;
|
|
37
|
+
totalWeight += weight;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (totalWeight > 0.0)
|
|
43
|
+
{
|
|
44
|
+
res /= totalWeight;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return smoothstep(0.0, 1.0, res);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fn hash3d(p: vec3<f32>) -> vec3<f32>
|
|
51
|
+
{
|
|
52
|
+
var p3 = fract(p * vec3<f32>(0.1031, 0.1030, 0.0973));
|
|
53
|
+
p3 += dot(p3, p3.yzx + 33.33);
|
|
54
|
+
return fract((p3.xxy + p3.yzz) * p3.zyx);
|
|
55
|
+
}
|
|
56
|
+
` );
|
|
57
|
+
|
|
58
|
+
// const hash3d = TSL.Fn( ( [ p ] ) => {
|
|
59
|
+
|
|
60
|
+
// const p3 = p.mul( TSL.vec3( 0.1031, 0.1030, 0.0973 ) ).fract();
|
|
61
|
+
// const dotProduct = p3.dot( p3.yzx.add( 33.33 ) );
|
|
62
|
+
// p3.addAssign( dotProduct );
|
|
63
|
+
|
|
64
|
+
// return p3.xxy.add( p3.yzz ).mul( p3.zyx ).fract();
|
|
65
|
+
|
|
66
|
+
// } );
|
|
67
|
+
|
|
68
|
+
// const voronoi3d = TSL.Fn( ( [ x, smoothness, randomness ] ) => {
|
|
69
|
+
// let p = TSL.floor(x);
|
|
70
|
+
// let f = TSL.fract(x);
|
|
71
|
+
|
|
72
|
+
// var res = TSL.float(0.0);
|
|
73
|
+
// var totalWeight = TSL.float(0.0);
|
|
74
|
+
|
|
75
|
+
// TSL.Loop( 3, 3, 3, ( { k, j, i } ) => {
|
|
76
|
+
// let b = TSL.vec3(TSL.float(i).sub(1), TSL.float(j).sub(1), TSL.float(k).sub(1));
|
|
77
|
+
// let hashOffset = hash3d(p.add(b)).mul(randomness);
|
|
78
|
+
// let r = b.sub(f).add(hashOffset);
|
|
79
|
+
// let d = TSL.length(r);
|
|
80
|
+
|
|
81
|
+
// let weight = TSL.exp(d.negate().mul(d).div(TSL.max(smoothness.mul(smoothness), 0.001)));
|
|
82
|
+
// res.addAssign(d.mul(weight));
|
|
83
|
+
// totalWeight.addAssign(weight);
|
|
84
|
+
// } );
|
|
85
|
+
|
|
86
|
+
// res.assign(TSL.select(totalWeight.greaterThan(0.0), res.div(totalWeight), res));
|
|
87
|
+
|
|
88
|
+
// return TSL.smoothstep(0.0, 1.0, res);
|
|
89
|
+
// } );
|
|
90
|
+
|
|
91
|
+
const softLightMix = TSL.Fn( ( [ t, col1, col2 ] ) => {
|
|
92
|
+
|
|
93
|
+
const tm = TSL.float( 1.0 ).sub( t );
|
|
94
|
+
|
|
95
|
+
const one = TSL.vec3( 1.0 );
|
|
96
|
+
const scr = one.sub( one.sub( col2 ).mul( one.sub( col1 ) ) );
|
|
97
|
+
|
|
98
|
+
return tm.mul( col1 ).add( t.mul( one.sub( col1 ).mul( col2 ).mul( col1 ).add( col1.mul( scr ) ) ) );
|
|
99
|
+
|
|
100
|
+
} );
|
|
101
|
+
|
|
102
|
+
const noiseFbm = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
|
|
103
|
+
|
|
104
|
+
const fscale = TSL.float( 1.0 ).toVar();
|
|
105
|
+
const amp = TSL.float( 1.0 ).toVar();
|
|
106
|
+
const maxamp = TSL.float( 0.0 ).toVar();
|
|
107
|
+
const sum = TSL.float( 0.0 ).toVar();
|
|
108
|
+
|
|
109
|
+
const iterations = detail.floor();
|
|
110
|
+
|
|
111
|
+
TSL.Loop( iterations, () => {
|
|
112
|
+
|
|
113
|
+
const t = TSL.mx_noise_float( p.mul( fscale ) );
|
|
114
|
+
sum.addAssign( t.mul( amp ) );
|
|
115
|
+
maxamp.addAssign( amp );
|
|
116
|
+
amp.mulAssign( roughness );
|
|
117
|
+
fscale.mulAssign( lacunarity );
|
|
118
|
+
|
|
119
|
+
} );
|
|
120
|
+
|
|
121
|
+
const rmd = detail.sub( iterations );
|
|
122
|
+
const hasRemainder = rmd.greaterThan( 0.001 );
|
|
123
|
+
|
|
124
|
+
return TSL.select(
|
|
125
|
+
hasRemainder,
|
|
126
|
+
TSL.select(
|
|
127
|
+
useNormalize.equal( 1 ),
|
|
128
|
+
( () => {
|
|
129
|
+
|
|
130
|
+
const t = TSL.mx_noise_float( p.mul( fscale ) );
|
|
131
|
+
const sum2 = sum.add( t.mul( amp ) );
|
|
132
|
+
const maxamp2 = maxamp.add( amp );
|
|
133
|
+
const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
|
|
134
|
+
const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
|
|
135
|
+
return TSL.mix( normalizedSum, normalizedSum2, rmd );
|
|
136
|
+
|
|
137
|
+
} )(),
|
|
138
|
+
( () => {
|
|
139
|
+
|
|
140
|
+
const t = TSL.mx_noise_float( p.mul( fscale ) );
|
|
141
|
+
const sum2 = sum.add( t.mul( amp ) );
|
|
142
|
+
return TSL.mix( sum, sum2, rmd );
|
|
143
|
+
|
|
144
|
+
} )()
|
|
145
|
+
),
|
|
146
|
+
TSL.select(
|
|
147
|
+
useNormalize.equal( 1 ),
|
|
148
|
+
sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
|
|
149
|
+
sum
|
|
150
|
+
)
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
} );
|
|
154
|
+
|
|
155
|
+
const noiseFbm3d = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
|
|
156
|
+
|
|
157
|
+
const fscale = TSL.float( 1.0 ).toVar();
|
|
158
|
+
|
|
159
|
+
const amp = TSL.float( 1.0 ).toVar();
|
|
160
|
+
const maxamp = TSL.float( 0.0 ).toVar();
|
|
161
|
+
const sum = TSL.vec3( 0.0 ).toVar();
|
|
162
|
+
|
|
163
|
+
const iterations = detail.floor();
|
|
164
|
+
|
|
165
|
+
TSL.Loop( iterations, () => {
|
|
166
|
+
|
|
167
|
+
const t = TSL.mx_noise_vec3( p.mul( fscale ) );
|
|
168
|
+
sum.addAssign( t.mul( amp ) );
|
|
169
|
+
maxamp.addAssign( amp );
|
|
170
|
+
amp.mulAssign( roughness );
|
|
171
|
+
fscale.mulAssign( lacunarity );
|
|
172
|
+
|
|
173
|
+
} );
|
|
174
|
+
|
|
175
|
+
const rmd = detail.sub( iterations );
|
|
176
|
+
const hasRemainder = rmd.greaterThan( 0.001 );
|
|
177
|
+
|
|
178
|
+
return TSL.select(
|
|
179
|
+
hasRemainder,
|
|
180
|
+
TSL.select(
|
|
181
|
+
useNormalize.equal( 1 ),
|
|
182
|
+
( () => {
|
|
183
|
+
|
|
184
|
+
const t = TSL.mx_noise_vec3( p.mul( fscale ) );
|
|
185
|
+
const sum2 = sum.add( t.mul( amp ) );
|
|
186
|
+
const maxamp2 = maxamp.add( amp );
|
|
187
|
+
const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
|
|
188
|
+
const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
|
|
189
|
+
return TSL.mix( normalizedSum, normalizedSum2, rmd );
|
|
190
|
+
|
|
191
|
+
} )(),
|
|
192
|
+
( () => {
|
|
193
|
+
|
|
194
|
+
const t = TSL.mx_noise_vec3( p.mul( fscale ) );
|
|
195
|
+
const sum2 = sum.add( t.mul( amp ) );
|
|
196
|
+
return TSL.mix( sum, sum2, rmd );
|
|
197
|
+
|
|
198
|
+
} )()
|
|
199
|
+
),
|
|
200
|
+
TSL.select(
|
|
201
|
+
useNormalize.equal( 1 ),
|
|
202
|
+
sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
|
|
203
|
+
sum
|
|
204
|
+
)
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
} );
|
|
208
|
+
|
|
209
|
+
const woodCenter = TSL.Fn( ( [ p, centerSize ] ) => {
|
|
210
|
+
|
|
211
|
+
const pxyCenter = p.mul( TSL.vec3( 1, 1, 0 ) ).length();
|
|
212
|
+
const center = mapRange( pxyCenter, 0, 1, 0, centerSize, true );
|
|
213
|
+
|
|
214
|
+
return center;
|
|
215
|
+
|
|
216
|
+
} );
|
|
217
|
+
|
|
218
|
+
const spaceWarp = TSL.Fn( ( [ p, warpStrength, xyScale, zScale ] ) => {
|
|
219
|
+
|
|
220
|
+
const combinedXyz = TSL.vec3( xyScale, xyScale, zScale ).mul( p );
|
|
221
|
+
const noise = noiseFbm3d( combinedXyz.mul( 1.6 * 1.5 ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.int( 1 ) ).sub( 0.5 ).mul( warpStrength );
|
|
222
|
+
const pXy = p.mul( TSL.vec3( 1, 1, 0 ) );
|
|
223
|
+
const normalizedXy = pXy.normalize();
|
|
224
|
+
const warp = noise.mul( normalizedXy ).add( pXy );
|
|
225
|
+
|
|
226
|
+
return warp;
|
|
227
|
+
|
|
228
|
+
} );
|
|
229
|
+
|
|
230
|
+
const woodRings = TSL.Fn( ( [ w, ringThickness, ringBias, ringSizeVariance, ringVarianceScale, barkThickness ] ) => {
|
|
231
|
+
|
|
232
|
+
const rings = noiseFbm( w.mul( ringVarianceScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 1 ), TSL.int( 1 ) ).mul( ringSizeVariance ).add( w ).mul( ringThickness ).fract().mul( barkThickness );
|
|
233
|
+
|
|
234
|
+
const sharpRings = TSL.min( mapRange( rings, 0, ringBias, 0, 1, TSL.bool( true ) ), mapRange( rings, ringBias, 1, 1, 0, TSL.bool( true ) ) );
|
|
235
|
+
|
|
236
|
+
const blurAmount = TSL.max( TSL.positionView.length().div( 10 ), 1 );
|
|
237
|
+
const blurredRings = TSL.smoothstep( blurAmount.negate(), blurAmount, sharpRings.sub( 0.5 ) ).mul( 0.5 ).add( 0.5 );
|
|
238
|
+
|
|
239
|
+
return blurredRings;
|
|
240
|
+
|
|
241
|
+
} );
|
|
242
|
+
|
|
243
|
+
const woodDetail = TSL.Fn( ( [ warp, p, y, splotchScale ] ) => {
|
|
244
|
+
|
|
245
|
+
const radialCoords = TSL.clamp( TSL.atan( warp.y, warp.x ).div( TSL.PI2 ).add( 0.5 ), 0, 1 ).mul( TSL.PI2.mul( 3 ) );
|
|
246
|
+
const combinedXyz = TSL.vec3( radialCoords.sin(), y, radialCoords.cos().mul( p.z ) );
|
|
247
|
+
const scaled = TSL.vec3( 0.1, 1.19, 0.05 ).mul( combinedXyz );
|
|
248
|
+
|
|
249
|
+
return noiseFbm( scaled.mul( splotchScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.bool( true ) );
|
|
250
|
+
|
|
251
|
+
} );
|
|
252
|
+
|
|
253
|
+
const cellStructure = TSL.Fn( ( [ p, cellScale, cellSize ] ) => {
|
|
254
|
+
|
|
255
|
+
const warp = spaceWarp( p.mul( cellScale.div( 50 ) ), cellScale.div( 1000 ), 0.1, 1.77 );
|
|
256
|
+
const cells = voronoi3d( warp.xy.mul( 75 ), 0.5, 1 );
|
|
257
|
+
|
|
258
|
+
return mapRange( cells, cellSize, cellSize.add( 0.21 ), 0, 1, TSL.bool( true ) );
|
|
259
|
+
|
|
260
|
+
} );
|
|
261
|
+
|
|
262
|
+
const wood = TSL.Fn( ( [
|
|
263
|
+
p,
|
|
264
|
+
centerSize,
|
|
265
|
+
largeWarpScale,
|
|
266
|
+
largeGrainStretch,
|
|
267
|
+
smallWarpStrength,
|
|
268
|
+
smallWarpScale,
|
|
269
|
+
fineWarpStrength,
|
|
270
|
+
fineWarpScale,
|
|
271
|
+
ringThickness,
|
|
272
|
+
ringBias,
|
|
273
|
+
ringSizeVariance,
|
|
274
|
+
ringVarianceScale,
|
|
275
|
+
barkThickness,
|
|
276
|
+
splotchScale,
|
|
277
|
+
splotchIntensity,
|
|
278
|
+
cellScale,
|
|
279
|
+
cellSize,
|
|
280
|
+
darkGrainColor,
|
|
281
|
+
lightGrainColor
|
|
282
|
+
] ) => {
|
|
283
|
+
|
|
284
|
+
const center = woodCenter( p, centerSize );
|
|
285
|
+
const mainWarp = spaceWarp( spaceWarp( p, center, largeWarpScale, largeGrainStretch ), smallWarpStrength, smallWarpScale, 0.17 );
|
|
286
|
+
const detailWarp = spaceWarp( mainWarp, fineWarpStrength, fineWarpScale, 0.17 );
|
|
287
|
+
const rings = woodRings( detailWarp.length(), TSL.float( 1 ).div( ringThickness ), ringBias, ringSizeVariance, ringVarianceScale, barkThickness );
|
|
288
|
+
const detail = woodDetail( detailWarp, p, detailWarp.length(), splotchScale );
|
|
289
|
+
const cells = cellStructure( mainWarp, cellScale, cellSize.div( TSL.max( TSL.positionView.length().mul( 10 ), 1 ) ) );
|
|
290
|
+
const baseColor = TSL.mix( darkGrainColor, lightGrainColor, rings );
|
|
291
|
+
|
|
292
|
+
return softLightMix( splotchIntensity, softLightMix( 0.407, baseColor, cells ), detail );
|
|
293
|
+
|
|
294
|
+
} );
|
|
295
|
+
|
|
296
|
+
const woodParams = {
|
|
297
|
+
teak: {
|
|
298
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
299
|
+
centerSize: 1.11, largeWarpScale: 0.32, largeGrainStretch: 0.24, smallWarpStrength: 0.059,
|
|
300
|
+
smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1/34,
|
|
301
|
+
ringBias: 0.03, ringSizeVariance: 0.03, ringVarianceScale: 4.4, barkThickness: 0.3,
|
|
302
|
+
splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 910, cellSize: 0.1,
|
|
303
|
+
darkGrainColor: '#0c0504', lightGrainColor: '#926c50'
|
|
304
|
+
},
|
|
305
|
+
walnut: {
|
|
306
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
307
|
+
centerSize: 1.07, largeWarpScale: 0.42, largeGrainStretch: 0.34, smallWarpStrength: 0.016,
|
|
308
|
+
smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1/32,
|
|
309
|
+
ringBias: 0.08, ringSizeVariance: 0.03, ringVarianceScale: 5.5, barkThickness: 0.98,
|
|
310
|
+
splotchScale: 1.84, splotchIntensity: 0.97, cellScale: 710, cellSize: 0.31,
|
|
311
|
+
darkGrainColor: '#311e13', lightGrainColor: '#523424'
|
|
312
|
+
},
|
|
313
|
+
white_oak: {
|
|
314
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
315
|
+
centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.21, smallWarpStrength: 0.034,
|
|
316
|
+
smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1/34,
|
|
317
|
+
ringBias: 0.82, ringSizeVariance: 0.16, ringVarianceScale: 1.4, barkThickness: 0.7,
|
|
318
|
+
splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 800, cellSize: 0.28,
|
|
319
|
+
darkGrainColor: '#8b4c21', lightGrainColor: '#c57e43'
|
|
320
|
+
},
|
|
321
|
+
pine: {
|
|
322
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
323
|
+
centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.18, smallWarpStrength: 0.041,
|
|
324
|
+
smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1/24,
|
|
325
|
+
ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 5, barkThickness: 0.35,
|
|
326
|
+
splotchScale: 0.51, splotchIntensity: 3.32, cellScale: 1480, cellSize: 0.07,
|
|
327
|
+
darkGrainColor: '#c58355', lightGrainColor: '#d19d61'
|
|
328
|
+
},
|
|
329
|
+
poplar: {
|
|
330
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
331
|
+
centerSize: 1.43, largeWarpScale: 0.33, largeGrainStretch: 0.18, smallWarpStrength: 0.04,
|
|
332
|
+
smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1/37,
|
|
333
|
+
ringBias: 0.07, ringSizeVariance: 0.03, ringVarianceScale: 3.8, barkThickness: 0.3,
|
|
334
|
+
splotchScale: 1.92, splotchIntensity: 0.71, cellScale: 830, cellSize: 0.04,
|
|
335
|
+
darkGrainColor: '#716347', lightGrainColor: '#998966'
|
|
336
|
+
},
|
|
337
|
+
maple: {
|
|
338
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
339
|
+
centerSize: 1.4, largeWarpScale: 0.38, largeGrainStretch: 0.25, smallWarpStrength: 0.067,
|
|
340
|
+
smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1/35,
|
|
341
|
+
ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 4.6, barkThickness: 0.61,
|
|
342
|
+
splotchScale: 0.46, splotchIntensity: 1.49, cellScale: 800, cellSize: 0.03,
|
|
343
|
+
darkGrainColor: '#b08969', lightGrainColor: '#bc9d7d'
|
|
344
|
+
},
|
|
345
|
+
red_oak: {
|
|
346
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
347
|
+
centerSize: 1.21, largeWarpScale: 0.24, largeGrainStretch: 0.25, smallWarpStrength: 0.044,
|
|
348
|
+
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1/34,
|
|
349
|
+
ringBias: 0.92, ringSizeVariance: 0.03, ringVarianceScale: 5.6, barkThickness: 1.01,
|
|
350
|
+
splotchScale: 0.28, splotchIntensity: 3.48, cellScale: 800, cellSize: 0.25,
|
|
351
|
+
darkGrainColor: '#af613b', lightGrainColor: '#e0a27a'
|
|
352
|
+
},
|
|
353
|
+
cherry: {
|
|
354
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
355
|
+
centerSize: 1.33, largeWarpScale: 0.11, largeGrainStretch: 0.33, smallWarpStrength: 0.024,
|
|
356
|
+
smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/36,
|
|
357
|
+
ringBias: 0.02, ringSizeVariance: 0.04, ringVarianceScale: 6.5, barkThickness: 0.09,
|
|
358
|
+
splotchScale: 1.27, splotchIntensity: 1.24, cellScale: 1530, cellSize: 0.15,
|
|
359
|
+
darkGrainColor: '#913f27', lightGrainColor: '#b45837'
|
|
360
|
+
},
|
|
361
|
+
cedar: {
|
|
362
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
363
|
+
centerSize: 1.11, largeWarpScale: 0.39, largeGrainStretch: 0.12, smallWarpStrength: 0.061,
|
|
364
|
+
smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1/25,
|
|
365
|
+
ringBias: 0.01, ringSizeVariance: 0.07, ringVarianceScale: 6.7, barkThickness: 0.1,
|
|
366
|
+
splotchScale: 0.61, splotchIntensity: 2.54, cellScale: 630, cellSize: 0.19,
|
|
367
|
+
darkGrainColor: '#9a5b49', lightGrainColor: '#ae745e'
|
|
368
|
+
},
|
|
369
|
+
mahogany: {
|
|
370
|
+
transformationMatrix: new THREE.Matrix4().identity(),
|
|
371
|
+
centerSize: 1.25, largeWarpScale: 0.26, largeGrainStretch: 0.29, smallWarpStrength: 0.044,
|
|
372
|
+
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/38,
|
|
373
|
+
ringBias: 0.01, ringSizeVariance: 0.33, ringVarianceScale: 1.2, barkThickness: 0.07,
|
|
374
|
+
splotchScale: 0.77, splotchIntensity: 1.39, cellScale: 1400, cellSize: 0.23,
|
|
375
|
+
darkGrainColor: '#501d12', lightGrainColor: '#6d3722'
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
export const WoodGenuses = [ 'teak', 'walnut', 'white_oak', 'pine', 'poplar', 'maple', 'red_oak', 'cherry', 'cedar', 'mahogany' ];
|
|
380
|
+
export const Finishes = [ 'raw', 'matte', 'semigloss', 'gloss' ];
|
|
381
|
+
|
|
382
|
+
export function GetWoodPreset( genus, finish ) {
|
|
383
|
+
|
|
384
|
+
const params = woodParams[ genus ];
|
|
385
|
+
|
|
386
|
+
let clearcoat, clearcoatRoughness, clearcoatDarken;
|
|
387
|
+
|
|
388
|
+
switch ( finish ) {
|
|
389
|
+
|
|
390
|
+
case 'gloss':
|
|
391
|
+
clearcoatDarken = 0.2; clearcoatRoughness = 0.1; clearcoat = 1;
|
|
392
|
+
break;
|
|
393
|
+
|
|
394
|
+
case 'semigloss':
|
|
395
|
+
clearcoatDarken = 0.4; clearcoatRoughness = 0.4; clearcoat = 1;
|
|
396
|
+
break;
|
|
397
|
+
|
|
398
|
+
case 'matte':
|
|
399
|
+
clearcoatDarken = 0.6; clearcoatRoughness = 1; clearcoat = 1;
|
|
400
|
+
break;
|
|
401
|
+
|
|
402
|
+
case 'raw':
|
|
403
|
+
default:
|
|
404
|
+
clearcoatDarken = 1; clearcoatRoughness = 0; clearcoat = 0;
|
|
405
|
+
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return { ...params, transformationMatrix: new THREE.Matrix4().copy( params.transformationMatrix ), genus, finish, clearcoat, clearcoatRoughness, clearcoatDarken };
|
|
409
|
+
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const params = GetWoodPreset( WoodGenuses[ 0 ], Finishes[ 0 ] );
|
|
413
|
+
const uniforms = {};
|
|
414
|
+
|
|
415
|
+
uniforms.centerSize = TSL.uniform( params.centerSize ).onObjectUpdate( ( { material } ) => material.centerSize );
|
|
416
|
+
uniforms.largeWarpScale = TSL.uniform( params.largeWarpScale ).onObjectUpdate( ( { material } ) => material.largeWarpScale );
|
|
417
|
+
uniforms.largeGrainStretch = TSL.uniform( params.largeGrainStretch ).onObjectUpdate( ( { material } ) => material.largeGrainStretch );
|
|
418
|
+
uniforms.smallWarpStrength = TSL.uniform( params.smallWarpStrength ).onObjectUpdate( ( { material } ) => material.smallWarpStrength );
|
|
419
|
+
uniforms.smallWarpScale = TSL.uniform( params.smallWarpScale ).onObjectUpdate( ( { material } ) => material.smallWarpScale );
|
|
420
|
+
uniforms.fineWarpStrength = TSL.uniform( params.fineWarpStrength ).onObjectUpdate( ( { material } ) => material.fineWarpStrength );
|
|
421
|
+
uniforms.fineWarpScale = TSL.uniform( params.fineWarpScale ).onObjectUpdate( ( { material } ) => material.fineWarpScale );
|
|
422
|
+
uniforms.ringThickness = TSL.uniform( params.ringThickness ).onObjectUpdate( ( { material } ) => material.ringThickness );
|
|
423
|
+
uniforms.ringBias = TSL.uniform( params.ringBias ).onObjectUpdate( ( { material } ) => material.ringBias );
|
|
424
|
+
uniforms.ringSizeVariance = TSL.uniform( params.ringSizeVariance ).onObjectUpdate( ( { material } ) => material.ringSizeVariance );
|
|
425
|
+
uniforms.ringVarianceScale = TSL.uniform( params.ringVarianceScale ).onObjectUpdate( ( { material } ) => material.ringVarianceScale );
|
|
426
|
+
uniforms.barkThickness = TSL.uniform( params.barkThickness ).onObjectUpdate( ( { material } ) => material.barkThickness );
|
|
427
|
+
uniforms.splotchScale = TSL.uniform( params.splotchScale ).onObjectUpdate( ( { material } ) => material.splotchScale );
|
|
428
|
+
uniforms.splotchIntensity = TSL.uniform( params.splotchIntensity ).onObjectUpdate( ( { material } ) => material.splotchIntensity );
|
|
429
|
+
uniforms.cellScale = TSL.uniform( params.cellScale ).onObjectUpdate( ( { material } ) => material.cellScale );
|
|
430
|
+
uniforms.cellSize = TSL.uniform( params.cellSize ).onObjectUpdate( ( { material } ) => material.cellSize );
|
|
431
|
+
uniforms.darkGrainColor = TSL.uniform( new THREE.Color( params.darkGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.darkGrainColor ) );
|
|
432
|
+
uniforms.lightGrainColor = TSL.uniform( new THREE.Color( params.lightGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.lightGrainColor ) );
|
|
433
|
+
uniforms.transformationMatrix = TSL.uniform( new THREE.Matrix4().copy( params.transformationMatrix ) ).onObjectUpdate( ( { material } ) => material.transformationMatrix );
|
|
434
|
+
|
|
435
|
+
const colorNode = wood(
|
|
436
|
+
uniforms.transformationMatrix.mul( TSL.vec4(TSL.positionLocal, 1) ).xyz,
|
|
437
|
+
uniforms.centerSize,
|
|
438
|
+
uniforms.largeWarpScale,
|
|
439
|
+
uniforms.largeGrainStretch,
|
|
440
|
+
uniforms.smallWarpStrength,
|
|
441
|
+
uniforms.smallWarpScale,
|
|
442
|
+
uniforms.fineWarpStrength,
|
|
443
|
+
uniforms.fineWarpScale,
|
|
444
|
+
uniforms.ringThickness,
|
|
445
|
+
uniforms.ringBias,
|
|
446
|
+
uniforms.ringSizeVariance,
|
|
447
|
+
uniforms.ringVarianceScale,
|
|
448
|
+
uniforms.barkThickness,
|
|
449
|
+
uniforms.splotchScale,
|
|
450
|
+
uniforms.splotchIntensity,
|
|
451
|
+
uniforms.cellScale,
|
|
452
|
+
uniforms.cellSize,
|
|
453
|
+
uniforms.darkGrainColor,
|
|
454
|
+
uniforms.lightGrainColor
|
|
455
|
+
).mul( params.clearcoatDarken );
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Procedural wood material using TSL (Three.js Shading Language).
|
|
459
|
+
*
|
|
460
|
+
* Usage examples:
|
|
461
|
+
*
|
|
462
|
+
* // Using presets (recommended for common wood types)
|
|
463
|
+
* const material = WoodNodeMaterial.fromPreset('walnut', 'gloss');
|
|
464
|
+
*
|
|
465
|
+
* // Using custom parameters (for advanced customization)
|
|
466
|
+
* const material = new WoodNodeMaterial({
|
|
467
|
+
* centerSize: 1.2,
|
|
468
|
+
* ringThickness: 1/40,
|
|
469
|
+
* darkGrainColor: new THREE.Color('#2a1a0a'),
|
|
470
|
+
* lightGrainColor: new THREE.Color('#8b4513'),
|
|
471
|
+
* clearcoat: 1,
|
|
472
|
+
* clearcoatRoughness: 0.3
|
|
473
|
+
* });
|
|
474
|
+
*
|
|
475
|
+
* // Mixing presets with custom overrides
|
|
476
|
+
* const walnutParams = GetWoodPreset('walnut', 'raw');
|
|
477
|
+
* const material = new WoodNodeMaterial({
|
|
478
|
+
* ...walnutParams,
|
|
479
|
+
* ringThickness: 1/50, // Override specific parameter
|
|
480
|
+
* clearcoat: 1 // Add finish
|
|
481
|
+
* });
|
|
482
|
+
*/
|
|
483
|
+
export class WoodNodeMaterial extends THREE.MeshPhysicalMaterial {
|
|
484
|
+
|
|
485
|
+
static get type() {
|
|
486
|
+
|
|
487
|
+
return 'WoodNodeMaterial';
|
|
488
|
+
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
constructor( params = {} ) {
|
|
492
|
+
|
|
493
|
+
super();
|
|
494
|
+
|
|
495
|
+
this.isWoodNodeMaterial = true;
|
|
496
|
+
|
|
497
|
+
// Get default parameters from teak/raw preset
|
|
498
|
+
const defaultParams = GetWoodPreset( 'teak', 'raw' );
|
|
499
|
+
|
|
500
|
+
// Merge default params with provided params
|
|
501
|
+
const finalParams = { ...defaultParams, ...params };
|
|
502
|
+
|
|
503
|
+
for ( const key in finalParams ) {
|
|
504
|
+
|
|
505
|
+
if ( key === 'genus' || key === 'finish' ) continue;
|
|
506
|
+
|
|
507
|
+
if ( typeof finalParams[ key ] === 'string' ) {
|
|
508
|
+
|
|
509
|
+
this[ key ] = new THREE.Color( finalParams[ key ] );
|
|
510
|
+
|
|
511
|
+
} else {
|
|
512
|
+
|
|
513
|
+
this[ key ] = finalParams[ key ];
|
|
514
|
+
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
this.colorNode = colorNode;
|
|
520
|
+
this.clearcoatNode = finalParams.clearcoat;
|
|
521
|
+
this.clearcoatRoughness = finalParams.clearcoatRoughness;
|
|
522
|
+
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// Static method to create material from preset
|
|
526
|
+
static fromPreset( genus = 'teak', finish = 'raw' ) {
|
|
527
|
+
|
|
528
|
+
const params = GetWoodPreset( genus, finish );
|
|
529
|
+
return new WoodNodeMaterial( params );
|
|
530
|
+
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';
|
|
1
|
+
import { LinearTransfer, Matrix3, SRGBTransfer, SRGBColorSpace, ColorManagement } from 'three';
|
|
2
2
|
|
|
3
3
|
/** @module ColorSpaces */
|
|
4
4
|
|
|
@@ -114,6 +114,24 @@ export const LinearRec2020ColorSpaceImpl = {
|
|
|
114
114
|
luminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,
|
|
115
115
|
};
|
|
116
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Extended-sRGB color space.
|
|
119
|
+
*
|
|
120
|
+
* @type {string}
|
|
121
|
+
* @constant
|
|
122
|
+
*/
|
|
123
|
+
export const ExtendedSRGBColorSpace = 'extended-srgb';
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Implementation object for the Extended-sRGB color space.
|
|
127
|
+
*
|
|
128
|
+
* @type {module:ColorSpaces~ColorSpaceImpl}
|
|
129
|
+
* @constant
|
|
130
|
+
*/
|
|
131
|
+
export const ExtendedSRGBColorSpaceImpl = {
|
|
132
|
+
...ColorManagement.spaces[ SRGBColorSpace ],
|
|
133
|
+
outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace, toneMappingMode: 'extended' }
|
|
134
|
+
};
|
|
117
135
|
|
|
118
136
|
/**
|
|
119
137
|
* An object holding the color space implementation.
|
|
@@ -152,7 +152,7 @@ class ConvexHull {
|
|
|
152
152
|
*
|
|
153
153
|
* @param {Ray} ray - The ray to test.
|
|
154
154
|
* @param {Vector3} target - The target vector that is used to store the method's result.
|
|
155
|
-
* @return {Vector3
|
|
155
|
+
* @return {?Vector3} The intersection point. Returns `null` if not intersection was detected.
|
|
156
156
|
*/
|
|
157
157
|
intersectRay( ray, target ) {
|
|
158
158
|
|
|
@@ -1298,7 +1298,7 @@ class HalfEdge {
|
|
|
1298
1298
|
* Returns the origin vertex.
|
|
1299
1299
|
*
|
|
1300
1300
|
* @private
|
|
1301
|
-
* @return {VertexNode} The destination vertex.
|
|
1301
|
+
* @return {?VertexNode} The destination vertex.
|
|
1302
1302
|
*/
|
|
1303
1303
|
tail() {
|
|
1304
1304
|
|
package/examples/jsm/math/Lut.js
CHANGED
|
@@ -45,7 +45,7 @@ class Lut {
|
|
|
45
45
|
/**
|
|
46
46
|
* The currently selected color map.
|
|
47
47
|
*
|
|
48
|
-
* @type {Array}
|
|
48
|
+
* @type {Array<Array<number>>}
|
|
49
49
|
*/
|
|
50
50
|
this.map = [];
|
|
51
51
|
|
|
@@ -219,7 +219,7 @@ class Lut {
|
|
|
219
219
|
* Adds a color map to this Lut instance.
|
|
220
220
|
*
|
|
221
221
|
* @param {string} name - The name of the color map.
|
|
222
|
-
* @param {Array} arrayOfColors - An array of color values. Each value is an array
|
|
222
|
+
* @param {Array<Array<number>>} arrayOfColors - An array of color values. Each value is an array
|
|
223
223
|
* holding a threshold and the actual color value as a hexadecimal number.
|
|
224
224
|
* @return {Lut} A reference to this LUT.
|
|
225
225
|
*/
|
|
@@ -280,7 +280,7 @@ class ProgressiveLightMap {
|
|
|
280
280
|
*
|
|
281
281
|
* @private
|
|
282
282
|
* @param {number} res - The square resolution of this object's lightMap.
|
|
283
|
-
* @param {WebGLRenderTarget} [lightMap] - The lightmap to initialize the plane with.
|
|
283
|
+
* @param {?WebGLRenderTarget} [lightMap] - The lightmap to initialize the plane with.
|
|
284
284
|
*/
|
|
285
285
|
_initializeBlurPlane( res, lightMap = null ) {
|
|
286
286
|
|