angular-three-soba 1.10.0 → 1.11.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/abstractions/index.d.ts +1 -0
- package/abstractions/lib/edges/edges.d.ts +18 -0
- package/cameras/index.d.ts +1 -0
- package/cameras/lib/camera/camera-content.d.ts +1 -1
- package/cameras/lib/cube-camera/cube-camera.d.ts +27 -0
- package/esm2020/abstractions/index.mjs +2 -1
- package/esm2020/abstractions/lib/edges/edges.mjs +95 -0
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +8 -3
- package/esm2020/abstractions/lib/text-3d/text-3d.mjs +1 -1
- package/esm2020/cameras/index.mjs +2 -1
- package/esm2020/cameras/lib/camera/camera-content.mjs +1 -1
- package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +130 -0
- package/esm2020/materials/index.mjs +3 -1
- package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +157 -0
- package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +237 -0
- package/esm2020/misc/lib/fbo/fbo.mjs +5 -4
- package/esm2020/performance/lib/detailed/detailed.mjs +6 -3
- package/esm2020/shaders/index.mjs +6 -1
- package/esm2020/shaders/lib/caustics-material/caustics-material.mjs +128 -0
- package/esm2020/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +33 -0
- package/esm2020/shaders/lib/discard-material/discard-material.mjs +3 -0
- package/esm2020/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
- package/esm2020/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +33 -0
- package/esm2020/staging/index.mjs +2 -1
- package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +7 -38
- package/esm2020/staging/lib/accumulative-shadows/progressive-light-map.mjs +2 -3
- package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +6 -6
- package/esm2020/staging/lib/caustics/caustics.mjs +363 -0
- package/esm2020/staging/lib/center/center.mjs +6 -6
- package/fesm2015/angular-three-soba-abstractions.mjs +98 -4
- package/fesm2015/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2015/angular-three-soba-cameras.mjs +127 -4
- package/fesm2015/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2015/angular-three-soba-materials.mjs +386 -2
- package/fesm2015/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2015/angular-three-soba-misc.mjs +4 -3
- package/fesm2015/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2015/angular-three-soba-performance.mjs +5 -2
- package/fesm2015/angular-three-soba-performance.mjs.map +1 -1
- package/fesm2015/angular-three-soba-shaders.mjs +485 -31
- package/fesm2015/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2015/angular-three-soba-staging.mjs +376 -53
- package/fesm2015/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2020/angular-three-soba-abstractions.mjs +98 -4
- package/fesm2020/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2020/angular-three-soba-cameras.mjs +127 -4
- package/fesm2020/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2020/angular-three-soba-materials.mjs +384 -2
- package/fesm2020/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2020/angular-three-soba-misc.mjs +4 -3
- package/fesm2020/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2020/angular-three-soba-performance.mjs +5 -2
- package/fesm2020/angular-three-soba-performance.mjs.map +1 -1
- package/fesm2020/angular-three-soba-shaders.mjs +491 -34
- package/fesm2020/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2020/angular-three-soba-staging.mjs +375 -53
- package/fesm2020/angular-three-soba-staging.mjs.map +1 -1
- package/materials/index.d.ts +2 -0
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +28 -0
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +46 -0
- package/misc/lib/fbo/fbo.d.ts +8 -6
- package/package.json +3 -4
- package/performance/lib/detailed/detailed.d.ts +2 -1
- package/plugin/package.json +1 -1
- package/shaders/index.d.ts +5 -0
- package/shaders/lib/caustics-material/caustics-material.d.ts +4 -0
- package/shaders/lib/caustics-projection-material/caustics-projection-material.d.ts +4 -0
- package/shaders/lib/discard-material/discard-material.d.ts +3 -0
- package/shaders/lib/mesh-transmission-material/mesh-transmission-material.d.ts +25 -0
- package/shaders/lib/soft-shadow-material/soft-shadow-material.d.ts +10 -0
- package/staging/index.d.ts +1 -0
- package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +2 -8
- package/staging/lib/accumulative-shadows/randomized-lights.d.ts +1 -1
- package/staging/lib/caustics/caustics.d.ts +47 -0
- package/staging/lib/environment/environment-cube.d.ts +1 -1
- package/staging/lib/environment/environment-ground.d.ts +1 -1
- package/staging/lib/environment/utils.d.ts +1 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '../shader-material/shader-material';
|
|
3
|
+
export const CausticsMaterial = shaderMaterial({
|
|
4
|
+
cameraMatrixWorld: new THREE.Matrix4(),
|
|
5
|
+
cameraProjectionMatrixInv: new THREE.Matrix4(),
|
|
6
|
+
normalTexture: null,
|
|
7
|
+
depthTexture: null,
|
|
8
|
+
lightDir: new THREE.Vector3(0, 1, 0),
|
|
9
|
+
lightPlaneNormal: new THREE.Vector3(0, 1, 0),
|
|
10
|
+
lightPlaneConstant: 0,
|
|
11
|
+
near: 0.1,
|
|
12
|
+
far: 100,
|
|
13
|
+
modelMatrix: new THREE.Matrix4(),
|
|
14
|
+
worldRadius: 1 / 40,
|
|
15
|
+
ior: 1.1,
|
|
16
|
+
bounces: 0,
|
|
17
|
+
resolution: 1024,
|
|
18
|
+
size: 10,
|
|
19
|
+
intensity: 0.5,
|
|
20
|
+
},
|
|
21
|
+
/* glsl */ `varying vec2 vUv;
|
|
22
|
+
void main() {
|
|
23
|
+
vUv = uv;
|
|
24
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
25
|
+
}`,
|
|
26
|
+
/* glsl */ `uniform mat4 cameraMatrixWorld;
|
|
27
|
+
uniform mat4 cameraProjectionMatrixInv;
|
|
28
|
+
uniform vec3 lightDir;
|
|
29
|
+
uniform vec3 lightPlaneNormal;
|
|
30
|
+
uniform float lightPlaneConstant;
|
|
31
|
+
uniform float near;
|
|
32
|
+
uniform float far;
|
|
33
|
+
uniform float time;
|
|
34
|
+
uniform float worldRadius;
|
|
35
|
+
uniform float resolution;
|
|
36
|
+
uniform float size;
|
|
37
|
+
uniform float intensity;
|
|
38
|
+
uniform float ior;
|
|
39
|
+
precision highp isampler2D;
|
|
40
|
+
precision highp usampler2D;
|
|
41
|
+
uniform sampler2D normalTexture;
|
|
42
|
+
uniform sampler2D depthTexture;
|
|
43
|
+
uniform float bounces;
|
|
44
|
+
varying vec2 vUv;
|
|
45
|
+
vec3 WorldPosFromDepth(float depth, vec2 coord) {
|
|
46
|
+
float z = depth * 2.0 - 1.0;
|
|
47
|
+
vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
|
|
48
|
+
vec4 viewSpacePosition = cameraProjectionMatrixInv * clipSpacePosition;
|
|
49
|
+
// Perspective division
|
|
50
|
+
viewSpacePosition /= viewSpacePosition.w;
|
|
51
|
+
vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
|
|
52
|
+
return worldSpacePosition.xyz;
|
|
53
|
+
}
|
|
54
|
+
float sdPlane( vec3 p, vec3 n, float h ) {
|
|
55
|
+
// n must be normalized
|
|
56
|
+
return dot(p,n) + h;
|
|
57
|
+
}
|
|
58
|
+
float planeIntersect( vec3 ro, vec3 rd, vec4 p ) {
|
|
59
|
+
return -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz);
|
|
60
|
+
}
|
|
61
|
+
vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 pos, vec3 normal, float ior, out vec3 rayOrigin, out vec3 rayDirection) {
|
|
62
|
+
rayOrigin = ro;
|
|
63
|
+
rayDirection = rd;
|
|
64
|
+
rayDirection = refract(rayDirection, normal, 1.0 / ior);
|
|
65
|
+
rayOrigin = pos + rayDirection * 0.1;
|
|
66
|
+
return rayDirection;
|
|
67
|
+
}
|
|
68
|
+
void main() {
|
|
69
|
+
// Each sample consists of random offset in the x and y direction
|
|
70
|
+
float caustic = 0.0;
|
|
71
|
+
float causticTexelSize = (1.0 / resolution) * size * 2.0;
|
|
72
|
+
float texelsNeeded = worldRadius / causticTexelSize;
|
|
73
|
+
float sampleRadius = texelsNeeded / resolution;
|
|
74
|
+
float sum = 0.0;
|
|
75
|
+
if (texture2D(depthTexture, vUv).x == 1.0) {
|
|
76
|
+
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
vec2 offset1 = vec2(-0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
|
|
80
|
+
vec2 offset2 = vec2(-0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
|
|
81
|
+
vec2 offset3 = vec2(0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
|
|
82
|
+
vec2 offset4 = vec2(0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
|
|
83
|
+
vec2 uv1 = vUv + offset1 * sampleRadius;
|
|
84
|
+
vec2 uv2 = vUv + offset2 * sampleRadius;
|
|
85
|
+
vec2 uv3 = vUv + offset3 * sampleRadius;
|
|
86
|
+
vec2 uv4 = vUv + offset4 * sampleRadius;
|
|
87
|
+
vec3 normal1 = texture2D(normalTexture, uv1, -10.0).rgb * 2.0 - 1.0;
|
|
88
|
+
vec3 normal2 = texture2D(normalTexture, uv2, -10.0).rgb * 2.0 - 1.0;
|
|
89
|
+
vec3 normal3 = texture2D(normalTexture, uv3, -10.0).rgb * 2.0 - 1.0;
|
|
90
|
+
vec3 normal4 = texture2D(normalTexture, uv4, -10.0).rgb * 2.0 - 1.0;
|
|
91
|
+
float depth1 = texture2D(depthTexture, uv1, -10.0).x;
|
|
92
|
+
float depth2 = texture2D(depthTexture, uv2, -10.0).x;
|
|
93
|
+
float depth3 = texture2D(depthTexture, uv3, -10.0).x;
|
|
94
|
+
float depth4 = texture2D(depthTexture, uv4, -10.0).x;
|
|
95
|
+
// Sanity check the depths
|
|
96
|
+
if (depth1 == 1.0 || depth2 == 1.0 || depth3 == 1.0 || depth4 == 1.0) {
|
|
97
|
+
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
vec3 pos1 = WorldPosFromDepth(depth1, uv1);
|
|
101
|
+
vec3 pos2 = WorldPosFromDepth(depth2, uv2);
|
|
102
|
+
vec3 pos3 = WorldPosFromDepth(depth3, uv3);
|
|
103
|
+
vec3 pos4 = WorldPosFromDepth(depth4, uv4);
|
|
104
|
+
vec3 originPos1 = WorldPosFromDepth(0.0, uv1);
|
|
105
|
+
vec3 originPos2 = WorldPosFromDepth(0.0, uv2);
|
|
106
|
+
vec3 originPos3 = WorldPosFromDepth(0.0, uv3);
|
|
107
|
+
vec3 originPos4 = WorldPosFromDepth(0.0, uv4);
|
|
108
|
+
vec3 endPos1, endPos2, endPos3, endPos4;
|
|
109
|
+
vec3 endDir1, endDir2, endDir3, endDir4;
|
|
110
|
+
totalInternalReflection(originPos1, lightDir, pos1, normal1, ior, endPos1, endDir1);
|
|
111
|
+
totalInternalReflection(originPos2, lightDir, pos2, normal2, ior, endPos2, endDir2);
|
|
112
|
+
totalInternalReflection(originPos3, lightDir, pos3, normal3, ior, endPos3, endDir3);
|
|
113
|
+
totalInternalReflection(originPos4, lightDir, pos4, normal4, ior, endPos4, endDir4);
|
|
114
|
+
float lightPosArea = length(cross(originPos2 - originPos1, originPos3 - originPos1)) + length(cross(originPos3 - originPos1, originPos4 - originPos1));
|
|
115
|
+
float t1 = planeIntersect(endPos1, endDir1, vec4(lightPlaneNormal, lightPlaneConstant));
|
|
116
|
+
float t2 = planeIntersect(endPos2, endDir2, vec4(lightPlaneNormal, lightPlaneConstant));
|
|
117
|
+
float t3 = planeIntersect(endPos3, endDir3, vec4(lightPlaneNormal, lightPlaneConstant));
|
|
118
|
+
float t4 = planeIntersect(endPos4, endDir4, vec4(lightPlaneNormal, lightPlaneConstant));
|
|
119
|
+
vec3 finalPos1 = endPos1 + endDir1 * t1;
|
|
120
|
+
vec3 finalPos2 = endPos2 + endDir2 * t2;
|
|
121
|
+
vec3 finalPos3 = endPos3 + endDir3 * t3;
|
|
122
|
+
vec3 finalPos4 = endPos4 + endDir4 * t4;
|
|
123
|
+
float finalArea = length(cross(finalPos2 - finalPos1, finalPos3 - finalPos1)) + length(cross(finalPos3 - finalPos1, finalPos4 - finalPos1));
|
|
124
|
+
caustic += intensity * (lightPosArea / finalArea);
|
|
125
|
+
// Calculate the area of the triangle in light spaces
|
|
126
|
+
gl_FragColor = vec4(vec3(max(caustic, 0.0)), 1.0);
|
|
127
|
+
}`);
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MtbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9saWIvY2F1c3RpY3MtbWF0ZXJpYWwvY2F1c3RpY3MtbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FDMUM7SUFDSSxpQkFBaUIsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7SUFDdEMseUJBQXlCLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0lBQzlDLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsZ0JBQWdCLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxFQUFFLEdBQUc7SUFDVCxHQUFHLEVBQUUsR0FBRztJQUNSLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7SUFDaEMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFO0lBQ25CLEdBQUcsRUFBRSxHQUFHO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixVQUFVLEVBQUUsSUFBSTtJQUNoQixJQUFJLEVBQUUsRUFBRTtJQUNSLFNBQVMsRUFBRSxHQUFHO0NBQ2pCO0FBQ0QsVUFBVSxDQUFDOzs7O0VBSWI7QUFDRSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUdiLENBQ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IHNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vc2hhZGVyLW1hdGVyaWFsL3NoYWRlci1tYXRlcmlhbCc7XG5cbmV4cG9ydCBjb25zdCBDYXVzdGljc01hdGVyaWFsID0gc2hhZGVyTWF0ZXJpYWwoXG4gICAge1xuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZDogbmV3IFRIUkVFLk1hdHJpeDQoKSxcbiAgICAgICAgY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludjogbmV3IFRIUkVFLk1hdHJpeDQoKSxcbiAgICAgICAgbm9ybWFsVGV4dHVyZTogbnVsbCxcbiAgICAgICAgZGVwdGhUZXh0dXJlOiBudWxsLFxuICAgICAgICBsaWdodERpcjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCksXG4gICAgICAgIGxpZ2h0UGxhbmVOb3JtYWw6IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApLFxuICAgICAgICBsaWdodFBsYW5lQ29uc3RhbnQ6IDAsXG4gICAgICAgIG5lYXI6IDAuMSxcbiAgICAgICAgZmFyOiAxMDAsXG4gICAgICAgIG1vZGVsTWF0cml4OiBuZXcgVEhSRUUuTWF0cml4NCgpLFxuICAgICAgICB3b3JsZFJhZGl1czogMSAvIDQwLFxuICAgICAgICBpb3I6IDEuMSxcbiAgICAgICAgYm91bmNlczogMCxcbiAgICAgICAgcmVzb2x1dGlvbjogMTAyNCxcbiAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgIGludGVuc2l0eTogMC41LFxuICAgIH0sXG4gICAgLyogZ2xzbCAqLyBgdmFyeWluZyB2ZWMyIHZVdjtcbnZvaWQgbWFpbigpIHtcbiAgICB2VXYgPSB1djtcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xufWAsXG4gICAgLyogZ2xzbCAqLyBgdW5pZm9ybSBtYXQ0IGNhbWVyYU1hdHJpeFdvcmxkO1xudW5pZm9ybSBtYXQ0IGNhbWVyYVByb2plY3Rpb25NYXRyaXhJbnY7XG51bmlmb3JtIHZlYzMgbGlnaHREaXI7XG51bmlmb3JtIHZlYzMgbGlnaHRQbGFuZU5vcm1hbDtcbnVuaWZvcm0gZmxvYXQgbGlnaHRQbGFuZUNvbnN0YW50O1xudW5pZm9ybSBmbG9hdCBuZWFyO1xudW5pZm9ybSBmbG9hdCBmYXI7XG51bmlmb3JtIGZsb2F0IHRpbWU7XG51bmlmb3JtIGZsb2F0IHdvcmxkUmFkaXVzO1xudW5pZm9ybSBmbG9hdCByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XG51bmlmb3JtIGZsb2F0IGlvcjtcbnByZWNpc2lvbiBoaWdocCBpc2FtcGxlcjJEO1xucHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxUZXh0dXJlO1xudW5pZm9ybSBzYW1wbGVyMkQgZGVwdGhUZXh0dXJlO1xudW5pZm9ybSBmbG9hdCBib3VuY2VzO1xudmFyeWluZyB2ZWMyIHZVdjtcbnZlYzMgV29ybGRQb3NGcm9tRGVwdGgoZmxvYXQgZGVwdGgsIHZlYzIgY29vcmQpIHtcbiAgZmxvYXQgeiA9IGRlcHRoICogMi4wIC0gMS4wO1xuICB2ZWM0IGNsaXBTcGFjZVBvc2l0aW9uID0gdmVjNChjb29yZCAqIDIuMCAtIDEuMCwgeiwgMS4wKTtcbiAgdmVjNCB2aWV3U3BhY2VQb3NpdGlvbiA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXhJbnYgKiBjbGlwU3BhY2VQb3NpdGlvbjtcbiAgLy8gUGVyc3BlY3RpdmUgZGl2aXNpb25cbiAgdmlld1NwYWNlUG9zaXRpb24gLz0gdmlld1NwYWNlUG9zaXRpb24udztcbiAgdmVjNCB3b3JsZFNwYWNlUG9zaXRpb24gPSBjYW1lcmFNYXRyaXhXb3JsZCAqIHZpZXdTcGFjZVBvc2l0aW9uO1xuICByZXR1cm4gd29ybGRTcGFjZVBvc2l0aW9uLnh5ejtcbn1cbmZsb2F0IHNkUGxhbmUoIHZlYzMgcCwgdmVjMyBuLCBmbG9hdCBoICkge1xuICAvLyBuIG11c3QgYmUgbm9ybWFsaXplZFxuICByZXR1cm4gZG90KHAsbikgKyBoO1xufVxuZmxvYXQgcGxhbmVJbnRlcnNlY3QoIHZlYzMgcm8sIHZlYzMgcmQsIHZlYzQgcCApIHtcbiAgcmV0dXJuIC0oZG90KHJvLHAueHl6KStwLncpL2RvdChyZCxwLnh5eik7XG59XG52ZWMzIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKHZlYzMgcm8sIHZlYzMgcmQsIHZlYzMgcG9zLCB2ZWMzIG5vcm1hbCwgZmxvYXQgaW9yLCBvdXQgdmVjMyByYXlPcmlnaW4sIG91dCB2ZWMzIHJheURpcmVjdGlvbikge1xuICByYXlPcmlnaW4gPSBybztcbiAgcmF5RGlyZWN0aW9uID0gcmQ7XG4gIHJheURpcmVjdGlvbiA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBub3JtYWwsIDEuMCAvIGlvcik7XG4gIHJheU9yaWdpbiA9IHBvcyArIHJheURpcmVjdGlvbiAqIDAuMTtcbiAgcmV0dXJuIHJheURpcmVjdGlvbjtcbn1cbnZvaWQgbWFpbigpIHtcbiAgLy8gRWFjaCBzYW1wbGUgY29uc2lzdHMgb2YgcmFuZG9tIG9mZnNldCBpbiB0aGUgeCBhbmQgeSBkaXJlY3Rpb25cbiAgZmxvYXQgY2F1c3RpYyA9IDAuMDtcbiAgZmxvYXQgY2F1c3RpY1RleGVsU2l6ZSA9ICgxLjAgLyByZXNvbHV0aW9uKSAqIHNpemUgKiAyLjA7XG4gIGZsb2F0IHRleGVsc05lZWRlZCA9IHdvcmxkUmFkaXVzIC8gY2F1c3RpY1RleGVsU2l6ZTtcbiAgZmxvYXQgc2FtcGxlUmFkaXVzID0gdGV4ZWxzTmVlZGVkIC8gcmVzb2x1dGlvbjtcbiAgZmxvYXQgc3VtID0gMC4wO1xuICBpZiAodGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdlV2KS54ID09IDEuMCkge1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmVjMiBvZmZzZXQxID0gdmVjMigtMC41LCAtMC41KTsvL3ZlYzIocmFuZCgpIC0gMC41LCByYW5kKCkgLSAwLjUpO1xuICB2ZWMyIG9mZnNldDIgPSB2ZWMyKC0wLjUsIDAuNSk7Ly92ZWMyKHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KTtcbiAgdmVjMiBvZmZzZXQzID0gdmVjMigwLjUsIDAuNSk7Ly92ZWMyKHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KTtcbiAgdmVjMiBvZmZzZXQ0ID0gdmVjMigwLjUsIC0wLjUpOy8vdmVjMihyYW5kKCkgLSAwLjUsIHJhbmQoKSAtIDAuNSk7XG4gIHZlYzIgdXYxID0gdlV2ICsgb2Zmc2V0MSAqIHNhbXBsZVJhZGl1cztcbiAgdmVjMiB1djIgPSB2VXYgKyBvZmZzZXQyICogc2FtcGxlUmFkaXVzO1xuICB2ZWMyIHV2MyA9IHZVdiArIG9mZnNldDMgKiBzYW1wbGVSYWRpdXM7XG4gIHZlYzIgdXY0ID0gdlV2ICsgb2Zmc2V0NCAqIHNhbXBsZVJhZGl1cztcbiAgdmVjMyBub3JtYWwxID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MSwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWwyID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MiwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWwzID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2MywgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgdmVjMyBub3JtYWw0ID0gdGV4dHVyZTJEKG5vcm1hbFRleHR1cmUsIHV2NCwgLTEwLjApLnJnYiAqIDIuMCAtIDEuMDtcbiAgZmxvYXQgZGVwdGgxID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYxLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGgyID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYyLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGgzID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXYzLCAtMTAuMCkueDtcbiAgZmxvYXQgZGVwdGg0ID0gdGV4dHVyZTJEKGRlcHRoVGV4dHVyZSwgdXY0LCAtMTAuMCkueDtcbiAgLy8gU2FuaXR5IGNoZWNrIHRoZSBkZXB0aHNcbiAgaWYgKGRlcHRoMSA9PSAxLjAgfHwgZGVwdGgyID09IDEuMCB8fCBkZXB0aDMgPT0gMS4wIHx8IGRlcHRoNCA9PSAxLjApIHtcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZlYzMgcG9zMSA9IFdvcmxkUG9zRnJvbURlcHRoKGRlcHRoMSwgdXYxKTtcbiAgdmVjMyBwb3MyID0gV29ybGRQb3NGcm9tRGVwdGgoZGVwdGgyLCB1djIpO1xuICB2ZWMzIHBvczMgPSBXb3JsZFBvc0Zyb21EZXB0aChkZXB0aDMsIHV2Myk7XG4gIHZlYzMgcG9zNCA9IFdvcmxkUG9zRnJvbURlcHRoKGRlcHRoNCwgdXY0KTtcbiAgdmVjMyBvcmlnaW5Qb3MxID0gV29ybGRQb3NGcm9tRGVwdGgoMC4wLCB1djEpO1xuICB2ZWMzIG9yaWdpblBvczIgPSBXb3JsZFBvc0Zyb21EZXB0aCgwLjAsIHV2Mik7XG4gIHZlYzMgb3JpZ2luUG9zMyA9IFdvcmxkUG9zRnJvbURlcHRoKDAuMCwgdXYzKTtcbiAgdmVjMyBvcmlnaW5Qb3M0ID0gV29ybGRQb3NGcm9tRGVwdGgoMC4wLCB1djQpO1xuICB2ZWMzIGVuZFBvczEsIGVuZFBvczIsIGVuZFBvczMsIGVuZFBvczQ7XG4gIHZlYzMgZW5kRGlyMSwgZW5kRGlyMiwgZW5kRGlyMywgZW5kRGlyNDtcbiAgdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ob3JpZ2luUG9zMSwgbGlnaHREaXIsIHBvczEsIG5vcm1hbDEsIGlvciwgZW5kUG9zMSwgZW5kRGlyMSk7XG4gIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKG9yaWdpblBvczIsIGxpZ2h0RGlyLCBwb3MyLCBub3JtYWwyLCBpb3IsIGVuZFBvczIsIGVuZERpcjIpO1xuICB0b3RhbEludGVybmFsUmVmbGVjdGlvbihvcmlnaW5Qb3MzLCBsaWdodERpciwgcG9zMywgbm9ybWFsMywgaW9yLCBlbmRQb3MzLCBlbmREaXIzKTtcbiAgdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ob3JpZ2luUG9zNCwgbGlnaHREaXIsIHBvczQsIG5vcm1hbDQsIGlvciwgZW5kUG9zNCwgZW5kRGlyNCk7XG4gIGZsb2F0IGxpZ2h0UG9zQXJlYSA9IGxlbmd0aChjcm9zcyhvcmlnaW5Qb3MyIC0gb3JpZ2luUG9zMSwgb3JpZ2luUG9zMyAtIG9yaWdpblBvczEpKSArIGxlbmd0aChjcm9zcyhvcmlnaW5Qb3MzIC0gb3JpZ2luUG9zMSwgb3JpZ2luUG9zNCAtIG9yaWdpblBvczEpKTtcbiAgZmxvYXQgdDEgPSBwbGFuZUludGVyc2VjdChlbmRQb3MxLCBlbmREaXIxLCB2ZWM0KGxpZ2h0UGxhbmVOb3JtYWwsIGxpZ2h0UGxhbmVDb25zdGFudCkpO1xuICBmbG9hdCB0MiA9IHBsYW5lSW50ZXJzZWN0KGVuZFBvczIsIGVuZERpcjIsIHZlYzQobGlnaHRQbGFuZU5vcm1hbCwgbGlnaHRQbGFuZUNvbnN0YW50KSk7XG4gIGZsb2F0IHQzID0gcGxhbmVJbnRlcnNlY3QoZW5kUG9zMywgZW5kRGlyMywgdmVjNChsaWdodFBsYW5lTm9ybWFsLCBsaWdodFBsYW5lQ29uc3RhbnQpKTtcbiAgZmxvYXQgdDQgPSBwbGFuZUludGVyc2VjdChlbmRQb3M0LCBlbmREaXI0LCB2ZWM0KGxpZ2h0UGxhbmVOb3JtYWwsIGxpZ2h0UGxhbmVDb25zdGFudCkpO1xuICB2ZWMzIGZpbmFsUG9zMSA9IGVuZFBvczEgKyBlbmREaXIxICogdDE7XG4gIHZlYzMgZmluYWxQb3MyID0gZW5kUG9zMiArIGVuZERpcjIgKiB0MjtcbiAgdmVjMyBmaW5hbFBvczMgPSBlbmRQb3MzICsgZW5kRGlyMyAqIHQzO1xuICB2ZWMzIGZpbmFsUG9zNCA9IGVuZFBvczQgKyBlbmREaXI0ICogdDQ7XG4gIGZsb2F0IGZpbmFsQXJlYSA9IGxlbmd0aChjcm9zcyhmaW5hbFBvczIgLSBmaW5hbFBvczEsIGZpbmFsUG9zMyAtIGZpbmFsUG9zMSkpICsgbGVuZ3RoKGNyb3NzKGZpbmFsUG9zMyAtIGZpbmFsUG9zMSwgZmluYWxQb3M0IC0gZmluYWxQb3MxKSk7XG4gIGNhdXN0aWMgKz0gaW50ZW5zaXR5ICogKGxpZ2h0UG9zQXJlYSAvIGZpbmFsQXJlYSk7XG4gIC8vIENhbGN1bGF0ZSB0aGUgYXJlYSBvZiB0aGUgdHJpYW5nbGUgaW4gbGlnaHQgc3BhY2VzXG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQodmVjMyhtYXgoY2F1c3RpYywgMC4wKSksIDEuMCk7XG59YFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '../shader-material/shader-material';
|
|
3
|
+
export const CausticsProjectionMaterial = shaderMaterial({
|
|
4
|
+
causticsTexture: null,
|
|
5
|
+
causticsTextureB: null,
|
|
6
|
+
color: new THREE.Color(),
|
|
7
|
+
lightProjMatrix: new THREE.Matrix4(),
|
|
8
|
+
lightViewMatrix: new THREE.Matrix4(),
|
|
9
|
+
},
|
|
10
|
+
/* glsl */ `varying vec3 vWorldPosition;
|
|
11
|
+
void main() {
|
|
12
|
+
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);
|
|
13
|
+
vec4 worldPosition = modelMatrix * vec4(position, 1.);
|
|
14
|
+
vWorldPosition = worldPosition.xyz;
|
|
15
|
+
}`,
|
|
16
|
+
/* glsl */ `varying vec3 vWorldPosition;
|
|
17
|
+
uniform vec3 color;
|
|
18
|
+
uniform sampler2D causticsTexture;
|
|
19
|
+
uniform sampler2D causticsTextureB;
|
|
20
|
+
uniform mat4 lightProjMatrix;
|
|
21
|
+
uniform mat4 lightViewMatrix;
|
|
22
|
+
void main() {
|
|
23
|
+
// Apply caustics
|
|
24
|
+
vec4 lightSpacePos = lightProjMatrix * lightViewMatrix * vec4(vWorldPosition, 1.0);
|
|
25
|
+
lightSpacePos.xyz /= lightSpacePos.w;
|
|
26
|
+
lightSpacePos.xyz = lightSpacePos.xyz * 0.5 + 0.5;
|
|
27
|
+
vec3 front = texture2D(causticsTexture, lightSpacePos.xy).rgb;
|
|
28
|
+
vec3 back = texture2D(causticsTextureB, lightSpacePos.xy).rgb;
|
|
29
|
+
gl_FragColor = vec4((front + back) * color, 1.0);
|
|
30
|
+
#include <tonemapping_fragment>
|
|
31
|
+
#include <encodings_fragment>
|
|
32
|
+
}`);
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MtcHJvamVjdGlvbi1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMvc3JjL2xpYi9jYXVzdGljcy1wcm9qZWN0aW9uLW1hdGVyaWFsL2NhdXN0aWNzLXByb2plY3Rpb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLGNBQWMsQ0FDcEQ7SUFDSSxlQUFlLEVBQUUsSUFBSTtJQUNyQixnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7SUFDeEIsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtJQUNwQyxlQUFlLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0NBQ3ZDO0FBQ0QsVUFBVSxDQUFDOzs7OztFQUtiO0FBQ0UsVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0VBZ0JiLENBQ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IHNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vc2hhZGVyLW1hdGVyaWFsL3NoYWRlci1tYXRlcmlhbCc7XG5cbmV4cG9ydCBjb25zdCBDYXVzdGljc1Byb2plY3Rpb25NYXRlcmlhbCA9IHNoYWRlck1hdGVyaWFsKFxuICAgIHtcbiAgICAgICAgY2F1c3RpY3NUZXh0dXJlOiBudWxsLFxuICAgICAgICBjYXVzdGljc1RleHR1cmVCOiBudWxsLFxuICAgICAgICBjb2xvcjogbmV3IFRIUkVFLkNvbG9yKCksXG4gICAgICAgIGxpZ2h0UHJvak1hdHJpeDogbmV3IFRIUkVFLk1hdHJpeDQoKSxcbiAgICAgICAgbGlnaHRWaWV3TWF0cml4OiBuZXcgVEhSRUUuTWF0cml4NCgpLFxuICAgIH0sXG4gICAgLyogZ2xzbCAqLyBgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLik7XG4gIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4pO1xuICB2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xufWAsXG4gICAgLyogZ2xzbCAqLyBgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xudW5pZm9ybSB2ZWMzIGNvbG9yO1xudW5pZm9ybSBzYW1wbGVyMkQgY2F1c3RpY3NUZXh0dXJlO1xudW5pZm9ybSBzYW1wbGVyMkQgY2F1c3RpY3NUZXh0dXJlQjtcbnVuaWZvcm0gbWF0NCBsaWdodFByb2pNYXRyaXg7XG51bmlmb3JtIG1hdDQgbGlnaHRWaWV3TWF0cml4O1xuIHZvaWQgbWFpbigpIHtcbiAgLy8gQXBwbHkgY2F1c3RpY3NcbiAgdmVjNCBsaWdodFNwYWNlUG9zID0gbGlnaHRQcm9qTWF0cml4ICogbGlnaHRWaWV3TWF0cml4ICogdmVjNCh2V29ybGRQb3NpdGlvbiwgMS4wKTtcbiAgbGlnaHRTcGFjZVBvcy54eXogLz0gbGlnaHRTcGFjZVBvcy53O1xuICBsaWdodFNwYWNlUG9zLnh5eiA9IGxpZ2h0U3BhY2VQb3MueHl6ICogMC41ICsgMC41O1xuICB2ZWMzIGZyb250ID0gdGV4dHVyZTJEKGNhdXN0aWNzVGV4dHVyZSwgbGlnaHRTcGFjZVBvcy54eSkucmdiO1xuICB2ZWMzIGJhY2sgPSB0ZXh0dXJlMkQoY2F1c3RpY3NUZXh0dXJlQiwgbGlnaHRTcGFjZVBvcy54eSkucmdiO1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KChmcm9udCArIGJhY2spICogY29sb3IsIDEuMCk7XG4gICNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cbiAgI2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn1gXG4pO1xuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { shaderMaterial } from '../shader-material/shader-material';
|
|
2
|
+
export const DiscardMaterial = shaderMaterial({}, 'void main() { }', 'void main() { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); discard; }');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY2FyZC1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMvc3JjL2xpYi9kaXNjYXJkLW1hdGVyaWFsL2Rpc2NhcmQtbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQ3pDLEVBQUUsRUFDRixpQkFBaUIsRUFDakIsb0VBQW9FLENBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaGFkZXJNYXRlcmlhbCB9IGZyb20gJy4uL3NoYWRlci1tYXRlcmlhbC9zaGFkZXItbWF0ZXJpYWwnO1xuXG5leHBvcnQgY29uc3QgRGlzY2FyZE1hdGVyaWFsID0gc2hhZGVyTWF0ZXJpYWwoXG4gICAge30sXG4gICAgJ3ZvaWQgbWFpbigpIHsgfScsXG4gICAgJ3ZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApOyBkaXNjYXJkOyAgfSdcbik7XG4iXX0=
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export class MeshTransmissionMaterial extends THREE.MeshPhysicalMaterial {
|
|
3
|
+
constructor(samples = 6, transmissionSampler = false) {
|
|
4
|
+
super();
|
|
5
|
+
this.uniforms = {
|
|
6
|
+
chromaticAberration: { value: 0.05 },
|
|
7
|
+
// Transmission must always be 0, unless transmissionSampler is being used
|
|
8
|
+
transmission: { value: 0 },
|
|
9
|
+
// Instead a workaround is used, see below for reasons why
|
|
10
|
+
_transmission: { value: 1 },
|
|
11
|
+
transmissionMap: { value: null },
|
|
12
|
+
// Roughness is 1 in THREE.MeshPhysicalMaterial but it makes little sense in a transmission material
|
|
13
|
+
roughness: { value: 0 },
|
|
14
|
+
thickness: { value: 0 },
|
|
15
|
+
thicknessMap: { value: null },
|
|
16
|
+
attenuationDistance: { value: Infinity },
|
|
17
|
+
attenuationColor: { value: new THREE.Color('white') },
|
|
18
|
+
anisotropy: { value: 0.1 },
|
|
19
|
+
time: { value: 0 },
|
|
20
|
+
distortion: { value: 0.0 },
|
|
21
|
+
distortionScale: { value: 0.5 },
|
|
22
|
+
temporalDistortion: { value: 0.0 },
|
|
23
|
+
buffer: { value: null },
|
|
24
|
+
};
|
|
25
|
+
this.onBeforeCompile = (shader) => {
|
|
26
|
+
shader.uniforms = {
|
|
27
|
+
...shader.uniforms,
|
|
28
|
+
...this.uniforms,
|
|
29
|
+
};
|
|
30
|
+
// If the transmission sampler is active inject a flag
|
|
31
|
+
if (transmissionSampler)
|
|
32
|
+
shader.defines['USE_SAMPLER'] = '';
|
|
33
|
+
// Otherwise we do use use .transmission and must therefore force USE_TRANSMISSION
|
|
34
|
+
// because threejs won't inject it for us
|
|
35
|
+
else
|
|
36
|
+
shader.defines['USE_TRANSMISSION'] = '';
|
|
37
|
+
// Head
|
|
38
|
+
shader.fragmentShader =
|
|
39
|
+
/*glsl*/ `
|
|
40
|
+
uniform float chromaticAberration;
|
|
41
|
+
uniform float anisotropy;
|
|
42
|
+
uniform float time;
|
|
43
|
+
uniform float distortion;
|
|
44
|
+
uniform float distortionScale;
|
|
45
|
+
uniform float temporalDistortion;
|
|
46
|
+
uniform sampler2D buffer;
|
|
47
|
+
|
|
48
|
+
vec3 random3(vec3 c) {
|
|
49
|
+
float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));
|
|
50
|
+
vec3 r;
|
|
51
|
+
r.z = fract(512.0*j);
|
|
52
|
+
j *= .125;
|
|
53
|
+
r.x = fract(512.0*j);
|
|
54
|
+
j *= .125;
|
|
55
|
+
r.y = fract(512.0*j);
|
|
56
|
+
return r-0.5;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
float seed = 0.0;
|
|
60
|
+
uint hash( uint x ) {
|
|
61
|
+
x += ( x << 10u );
|
|
62
|
+
x ^= ( x >> 6u );
|
|
63
|
+
x += ( x << 3u );
|
|
64
|
+
x ^= ( x >> 11u );
|
|
65
|
+
x += ( x << 15u );
|
|
66
|
+
return x;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Compound versions of the hashing algorithm I whipped together.
|
|
70
|
+
uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y) ); }
|
|
71
|
+
uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ); }
|
|
72
|
+
uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }
|
|
73
|
+
|
|
74
|
+
// Construct a float with half-open range [0:1] using low 23 bits.
|
|
75
|
+
// All zeroes yields 0.0, all ones yields the next smallest representable value below 1.0.
|
|
76
|
+
float floatConstruct( uint m ) {
|
|
77
|
+
const uint ieeeMantissa = 0x007FFFFFu; // binary32 mantissa bitmask
|
|
78
|
+
const uint ieeeOne = 0x3F800000u; // 1.0 in IEEE binary32
|
|
79
|
+
m &= ieeeMantissa; // Keep only mantissa bits (fractional part)
|
|
80
|
+
m |= ieeeOne; // Add fractional part to 1.0
|
|
81
|
+
float f = uintBitsToFloat( m ); // Range [1:2]
|
|
82
|
+
return f - 1.0; // Range [0:1]
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Pseudo-random value in half-open range [0:1].
|
|
86
|
+
float random( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
|
|
87
|
+
float random( vec2 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
88
|
+
float random( vec3 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
89
|
+
float random( vec4 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
|
|
90
|
+
|
|
91
|
+
float rand() {
|
|
92
|
+
float result = random(vec3(gl_FragCoord.xy, seed));
|
|
93
|
+
seed += 1.0;
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const float F3 = 0.3333333;
|
|
98
|
+
const float G3 = 0.1666667;
|
|
99
|
+
|
|
100
|
+
float snoise(vec3 p) {
|
|
101
|
+
vec3 s = floor(p + dot(p, vec3(F3)));
|
|
102
|
+
vec3 x = p - s + dot(s, vec3(G3));
|
|
103
|
+
vec3 e = step(vec3(0.0), x - x.yzx);
|
|
104
|
+
vec3 i1 = e*(1.0 - e.zxy);
|
|
105
|
+
vec3 i2 = 1.0 - e.zxy*(1.0 - e);
|
|
106
|
+
vec3 x1 = x - i1 + G3;
|
|
107
|
+
vec3 x2 = x - i2 + 2.0*G3;
|
|
108
|
+
vec3 x3 = x - 1.0 + 3.0*G3;
|
|
109
|
+
vec4 w, d;
|
|
110
|
+
w.x = dot(x, x);
|
|
111
|
+
w.y = dot(x1, x1);
|
|
112
|
+
w.z = dot(x2, x2);
|
|
113
|
+
w.w = dot(x3, x3);
|
|
114
|
+
w = max(0.6 - w, 0.0);
|
|
115
|
+
d.x = dot(random3(s), x);
|
|
116
|
+
d.y = dot(random3(s + i1), x1);
|
|
117
|
+
d.z = dot(random3(s + i2), x2);
|
|
118
|
+
d.w = dot(random3(s + 1.0), x3);
|
|
119
|
+
w *= w;
|
|
120
|
+
w *= w;
|
|
121
|
+
d *= w;
|
|
122
|
+
return dot(d, vec4(52.0));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
float snoiseFractal(vec3 m) {
|
|
126
|
+
return 0.5333333* snoise(m)
|
|
127
|
+
+0.2666667* snoise(2.0*m)
|
|
128
|
+
+0.1333333* snoise(4.0*m)
|
|
129
|
+
+0.0666667* snoise(8.0*m);
|
|
130
|
+
}\n` + shader.fragmentShader;
|
|
131
|
+
// Remove transmission
|
|
132
|
+
shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_pars_fragment>',
|
|
133
|
+
/*glsl*/ `
|
|
134
|
+
#ifdef USE_TRANSMISSION
|
|
135
|
+
// Transmission code is based on glTF-Sampler-Viewer
|
|
136
|
+
// https://github.com/KhronosGroup/glTF-Sample-Viewer
|
|
137
|
+
uniform float _transmission;
|
|
138
|
+
uniform float thickness;
|
|
139
|
+
uniform float attenuationDistance;
|
|
140
|
+
uniform vec3 attenuationColor;
|
|
141
|
+
#ifdef USE_TRANSMISSIONMAP
|
|
142
|
+
uniform sampler2D transmissionMap;
|
|
143
|
+
#endif
|
|
144
|
+
#ifdef USE_THICKNESSMAP
|
|
145
|
+
uniform sampler2D thicknessMap;
|
|
146
|
+
#endif
|
|
147
|
+
uniform vec2 transmissionSamplerSize;
|
|
148
|
+
uniform sampler2D transmissionSamplerMap;
|
|
149
|
+
uniform mat4 modelMatrix;
|
|
150
|
+
uniform mat4 projectionMatrix;
|
|
151
|
+
varying vec3 vWorldPosition;
|
|
152
|
+
vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {
|
|
153
|
+
// Direction of refracted light.
|
|
154
|
+
vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );
|
|
155
|
+
// Compute rotation-independant scaling of the model matrix.
|
|
156
|
+
vec3 modelScale;
|
|
157
|
+
modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );
|
|
158
|
+
modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );
|
|
159
|
+
modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );
|
|
160
|
+
// The thickness is specified in local space.
|
|
161
|
+
return normalize( refractionVector ) * thickness * modelScale;
|
|
162
|
+
}
|
|
163
|
+
float applyIorToRoughness( const in float roughness, const in float ior ) {
|
|
164
|
+
// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and
|
|
165
|
+
// an IOR of 1.5 results in the default amount of microfacet refraction.
|
|
166
|
+
return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );
|
|
167
|
+
}
|
|
168
|
+
vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {
|
|
169
|
+
float framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );
|
|
170
|
+
#ifdef USE_SAMPLER
|
|
171
|
+
#ifdef texture2DLodEXT
|
|
172
|
+
return texture2DLodEXT(transmissionSamplerMap, fragCoord.xy, framebufferLod);
|
|
173
|
+
#else
|
|
174
|
+
return texture2D(transmissionSamplerMap, fragCoord.xy, framebufferLod);
|
|
175
|
+
#endif
|
|
176
|
+
#else
|
|
177
|
+
return texture2D(buffer, fragCoord.xy);
|
|
178
|
+
#endif
|
|
179
|
+
}
|
|
180
|
+
vec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {
|
|
181
|
+
if ( isinf( attenuationDistance ) ) {
|
|
182
|
+
// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.
|
|
183
|
+
return radiance;
|
|
184
|
+
} else {
|
|
185
|
+
// Compute light attenuation using Beer's law.
|
|
186
|
+
vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;
|
|
187
|
+
vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law
|
|
188
|
+
return transmittance * radiance;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
|
|
192
|
+
const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
|
|
193
|
+
const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
|
|
194
|
+
const in vec3 attenuationColor, const in float attenuationDistance ) {
|
|
195
|
+
vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
|
|
196
|
+
vec3 refractedRayExit = position + transmissionRay;
|
|
197
|
+
// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
|
|
198
|
+
vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
|
|
199
|
+
vec2 refractionCoords = ndcPos.xy / ndcPos.w;
|
|
200
|
+
refractionCoords += 1.0;
|
|
201
|
+
refractionCoords /= 2.0;
|
|
202
|
+
// Sample framebuffer to get pixel the refracted ray hits.
|
|
203
|
+
vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
|
|
204
|
+
vec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );
|
|
205
|
+
// Get the specular component.
|
|
206
|
+
vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );
|
|
207
|
+
return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );
|
|
208
|
+
}
|
|
209
|
+
#endif\n`);
|
|
210
|
+
// Add refraction
|
|
211
|
+
shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_fragment>',
|
|
212
|
+
/*glsl*/ `
|
|
213
|
+
// Improve the refraction to use the world pos
|
|
214
|
+
material.transmission = _transmission;
|
|
215
|
+
material.transmissionAlpha = 1.0;
|
|
216
|
+
material.thickness = thickness;
|
|
217
|
+
material.attenuationDistance = attenuationDistance;
|
|
218
|
+
material.attenuationColor = attenuationColor;
|
|
219
|
+
#ifdef USE_TRANSMISSIONMAP
|
|
220
|
+
material.transmission *= texture2D( transmissionMap, vUv ).r;
|
|
221
|
+
#endif
|
|
222
|
+
#ifdef USE_THICKNESSMAP
|
|
223
|
+
material.thickness *= texture2D( thicknessMap, vUv ).g;
|
|
224
|
+
#endif
|
|
225
|
+
|
|
226
|
+
vec3 pos = vWorldPosition;
|
|
227
|
+
vec3 v = normalize( cameraPosition - pos );
|
|
228
|
+
vec3 n = inverseTransformDirection( normal, viewMatrix );
|
|
229
|
+
vec3 transmission = vec3(0.0);
|
|
230
|
+
float transmissionR, transmissionB, transmissionG;
|
|
231
|
+
float randomCoords = rand();
|
|
232
|
+
float thickness_smear = thickness * max(pow(roughnessFactor, 0.33), anisotropy);
|
|
233
|
+
vec3 distortionNormal = vec3(0.0);
|
|
234
|
+
vec3 temporalOffset = vec3(time, -time, -time) * temporalDistortion;
|
|
235
|
+
if (distortion > 0.0) {
|
|
236
|
+
distortionNormal = distortion * vec3(snoiseFractal(vec3((pos * distortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * distortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * distortionScale + temporalOffset)));
|
|
237
|
+
}
|
|
238
|
+
for (float i = 0.0; i < ${samples}.0; i ++) {
|
|
239
|
+
vec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand() - 0.5, rand() - 0.5, rand() - 0.5)) * pow(rand(), 0.33) + distortionNormal);
|
|
240
|
+
transmissionR = getIBLVolumeRefraction(
|
|
241
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
242
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
243
|
+
material.attenuationColor, material.attenuationDistance
|
|
244
|
+
).r;
|
|
245
|
+
transmissionG = getIBLVolumeRefraction(
|
|
246
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
247
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + chromaticAberration * (i + randomCoords) / float(${samples})) , material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
248
|
+
material.attenuationColor, material.attenuationDistance
|
|
249
|
+
).g;
|
|
250
|
+
transmissionB = getIBLVolumeRefraction(
|
|
251
|
+
sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
252
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * chromaticAberration * (i + randomCoords) / float(${samples})), material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
|
|
253
|
+
material.attenuationColor, material.attenuationDistance
|
|
254
|
+
).b;
|
|
255
|
+
transmission.r += transmissionR;
|
|
256
|
+
transmission.g += transmissionG;
|
|
257
|
+
transmission.b += transmissionB;
|
|
258
|
+
}
|
|
259
|
+
transmission /= ${samples}.0;
|
|
260
|
+
totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n`);
|
|
261
|
+
};
|
|
262
|
+
Object.keys(this.uniforms).forEach((name) => Object.defineProperty(this, name, {
|
|
263
|
+
get: () => this.uniforms[name].value,
|
|
264
|
+
set: (v) => (this.uniforms[name].value = v),
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9saWIvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNL0IsTUFBTSxPQUFPLHdCQUF5QixTQUFRLEtBQUssQ0FBQyxvQkFBb0I7SUFtQnBFLFlBQVksT0FBTyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ2hELEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNaLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNwQywwRUFBMEU7WUFDMUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMxQiwwREFBMEQ7WUFDMUQsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMzQixlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2hDLG9HQUFvRztZQUNwRyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDdkIsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM3QixtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDeEMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JELFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDMUIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFCLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0Isa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7U0FDMUIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxNQUE2RCxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLFFBQVEsR0FBRztnQkFDZCxHQUFHLE1BQU0sQ0FBQyxRQUFRO2dCQUNsQixHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ25CLENBQUM7WUFFRixzREFBc0Q7WUFDdEQsSUFBSSxtQkFBbUI7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUQsa0ZBQWtGO1lBQ2xGLHlDQUF5Qzs7Z0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFN0MsT0FBTztZQUNQLE1BQU0sQ0FBQyxjQUFjO2dCQUNqQixRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7VUEyRmYsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBRXZCLHNCQUFzQjtZQUN0QixNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUNqRCx1Q0FBdUM7WUFDdkMsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQTRFUixDQUNKLENBQUM7WUFFRixpQkFBaUI7WUFDakIsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FDakQsa0NBQWtDO1lBQ2xDLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBMEJTLE9BQU87Ozs7K0lBSXNHLE9BQU87Ozs7O3NJQUtoQixPQUFPLDBFQUEwRSxPQUFPOzs7OzsySUFLbkYsT0FBTyx5RUFBeUUsT0FBTzs7Ozs7OzswQkFPeE0sT0FBTzt1RkFDc0QsQ0FDMUUsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUM5QixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLFFBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztZQUN0RCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsSUFBSSxDQUFDLFFBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5ndEFueVJlY29yZCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgVW5pZm9ybTxUPiB7XG4gICAgdmFsdWU6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNZXNoVHJhbnNtaXNzaW9uTWF0ZXJpYWwgZXh0ZW5kcyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCB7XG4gICAgdW5pZm9ybXM6IHtcbiAgICAgICAgY2hyb21hdGljQWJlcnJhdGlvbjogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0cmFuc21pc3Npb246IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgdHJhbnNtaXNzaW9uTWFwOiBVbmlmb3JtPFRIUkVFLlRleHR1cmUgfCBudWxsPjtcbiAgICAgICAgX3RyYW5zbWlzc2lvbjogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0aGlja25lc3M6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgcm91Z2huZXNzOiBVbmlmb3JtPG51bWJlcj47XG4gICAgICAgIHRoaWNrbmVzc01hcDogVW5pZm9ybTxUSFJFRS5UZXh0dXJlIHwgbnVsbD47XG4gICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgYXR0ZW51YXRpb25Db2xvcjogVW5pZm9ybTxUSFJFRS5Db2xvcj47XG4gICAgICAgIGFuaXNvdHJvcHk6IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgdGltZTogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICBkaXN0b3J0aW9uOiBVbmlmb3JtPG51bWJlcj47XG4gICAgICAgIGRpc3RvcnRpb25TY2FsZTogVW5pZm9ybTxudW1iZXI+O1xuICAgICAgICB0ZW1wb3JhbERpc3RvcnRpb246IFVuaWZvcm08bnVtYmVyPjtcbiAgICAgICAgYnVmZmVyOiBVbmlmb3JtPFRIUkVFLlRleHR1cmUgfCBudWxsPjtcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3Ioc2FtcGxlcyA9IDYsIHRyYW5zbWlzc2lvblNhbXBsZXIgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7XG4gICAgICAgICAgICBjaHJvbWF0aWNBYmVycmF0aW9uOiB7IHZhbHVlOiAwLjA1IH0sXG4gICAgICAgICAgICAvLyBUcmFuc21pc3Npb24gbXVzdCBhbHdheXMgYmUgMCwgdW5sZXNzIHRyYW5zbWlzc2lvblNhbXBsZXIgaXMgYmVpbmcgdXNlZFxuICAgICAgICAgICAgdHJhbnNtaXNzaW9uOiB7IHZhbHVlOiAwIH0sXG4gICAgICAgICAgICAvLyBJbnN0ZWFkIGEgd29ya2Fyb3VuZCBpcyB1c2VkLCBzZWUgYmVsb3cgZm9yIHJlYXNvbnMgd2h5XG4gICAgICAgICAgICBfdHJhbnNtaXNzaW9uOiB7IHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB0cmFuc21pc3Npb25NYXA6IHsgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIC8vIFJvdWdobmVzcyBpcyAxIGluIFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsIGJ1dCBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgaW4gYSB0cmFuc21pc3Npb24gbWF0ZXJpYWxcbiAgICAgICAgICAgIHJvdWdobmVzczogeyB2YWx1ZTogMCB9LFxuICAgICAgICAgICAgdGhpY2tuZXNzOiB7IHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB0aGlja25lc3NNYXA6IHsgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6IHsgdmFsdWU6IEluZmluaXR5IH0sXG4gICAgICAgICAgICBhdHRlbnVhdGlvbkNvbG9yOiB7IHZhbHVlOiBuZXcgVEhSRUUuQ29sb3IoJ3doaXRlJykgfSxcbiAgICAgICAgICAgIGFuaXNvdHJvcHk6IHsgdmFsdWU6IDAuMSB9LFxuICAgICAgICAgICAgdGltZTogeyB2YWx1ZTogMCB9LFxuICAgICAgICAgICAgZGlzdG9ydGlvbjogeyB2YWx1ZTogMC4wIH0sXG4gICAgICAgICAgICBkaXN0b3J0aW9uU2NhbGU6IHsgdmFsdWU6IDAuNSB9LFxuICAgICAgICAgICAgdGVtcG9yYWxEaXN0b3J0aW9uOiB7IHZhbHVlOiAwLjAgfSxcbiAgICAgICAgICAgIGJ1ZmZlcjogeyB2YWx1ZTogbnVsbCB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMub25CZWZvcmVDb21waWxlID0gKHNoYWRlcjogVEhSRUUuU2hhZGVyICYgeyBkZWZpbmVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0pID0+IHtcbiAgICAgICAgICAgIHNoYWRlci51bmlmb3JtcyA9IHtcbiAgICAgICAgICAgICAgICAuLi5zaGFkZXIudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy51bmlmb3JtcyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc21pc3Npb24gc2FtcGxlciBpcyBhY3RpdmUgaW5qZWN0IGEgZmxhZ1xuICAgICAgICAgICAgaWYgKHRyYW5zbWlzc2lvblNhbXBsZXIpIHNoYWRlci5kZWZpbmVzWydVU0VfU0FNUExFUiddID0gJyc7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgZG8gdXNlIHVzZSAudHJhbnNtaXNzaW9uIGFuZCBtdXN0IHRoZXJlZm9yZSBmb3JjZSBVU0VfVFJBTlNNSVNTSU9OXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRocmVlanMgd29uJ3QgaW5qZWN0IGl0IGZvciB1c1xuICAgICAgICAgICAgZWxzZSBzaGFkZXIuZGVmaW5lc1snVVNFX1RSQU5TTUlTU0lPTiddID0gJyc7XG5cbiAgICAgICAgICAgIC8vIEhlYWRcbiAgICAgICAgICAgIHNoYWRlci5mcmFnbWVudFNoYWRlciA9XG4gICAgICAgICAgICAgICAgLypnbHNsKi8gYFxuICAgICAgdW5pZm9ybSBmbG9hdCBjaHJvbWF0aWNBYmVycmF0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBhbmlzb3Ryb3B5O1xuICAgICAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uU2NhbGU7XG4gICAgICB1bmlmb3JtIGZsb2F0IHRlbXBvcmFsRGlzdG9ydGlvbjtcbiAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIGJ1ZmZlcjtcblxuICAgICAgdmVjMyByYW5kb20zKHZlYzMgYykge1xuICAgICAgICBmbG9hdCBqID0gNDA5Ni4wKnNpbihkb3QoYyx2ZWMzKDE3LjAsIDU5LjQsIDE1LjApKSk7XG4gICAgICAgIHZlYzMgcjtcbiAgICAgICAgci56ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci54ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci55ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIHJldHVybiByLTAuNTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgc2VlZCA9IDAuMDtcbiAgICAgIHVpbnQgaGFzaCggdWludCB4ICkge1xuICAgICAgICB4ICs9ICggeCA8PCAxMHUgKTtcbiAgICAgICAgeCBePSAoIHggPj4gIDZ1ICk7XG4gICAgICAgIHggKz0gKCB4IDw8ICAzdSApO1xuICAgICAgICB4IF49ICggeCA+PiAxMXUgKTtcbiAgICAgICAgeCArPSAoIHggPDwgMTV1ICk7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wb3VuZCB2ZXJzaW9ucyBvZiB0aGUgaGFzaGluZyBhbGdvcml0aG0gSSB3aGlwcGVkIHRvZ2V0aGVyLlxuICAgICAgdWludCBoYXNoKCB1dmVjMiB2ICkgeyByZXR1cm4gaGFzaCggdi54IF4gaGFzaCh2LnkpICAgICAgICAgICAgICAgICAgICAgICAgICk7IH1cbiAgICAgIHVpbnQgaGFzaCggdXZlYzMgdiApIHsgcmV0dXJuIGhhc2goIHYueCBeIGhhc2godi55KSBeIGhhc2godi56KSAgICAgICAgICAgICApOyB9XG4gICAgICB1aW50IGhhc2goIHV2ZWM0IHYgKSB7IHJldHVybiBoYXNoKCB2LnggXiBoYXNoKHYueSkgXiBoYXNoKHYueikgXiBoYXNoKHYudykgKTsgfVxuXG4gICAgICAvLyBDb25zdHJ1Y3QgYSBmbG9hdCB3aXRoIGhhbGYtb3BlbiByYW5nZSBbMDoxXSB1c2luZyBsb3cgMjMgYml0cy5cbiAgICAgIC8vIEFsbCB6ZXJvZXMgeWllbGRzIDAuMCwgYWxsIG9uZXMgeWllbGRzIHRoZSBuZXh0IHNtYWxsZXN0IHJlcHJlc2VudGFibGUgdmFsdWUgYmVsb3cgMS4wLlxuICAgICAgZmxvYXQgZmxvYXRDb25zdHJ1Y3QoIHVpbnQgbSApIHtcbiAgICAgICAgY29uc3QgdWludCBpZWVlTWFudGlzc2EgPSAweDAwN0ZGRkZGdTsgLy8gYmluYXJ5MzIgbWFudGlzc2EgYml0bWFza1xuICAgICAgICBjb25zdCB1aW50IGllZWVPbmUgICAgICA9IDB4M0Y4MDAwMDB1OyAvLyAxLjAgaW4gSUVFRSBiaW5hcnkzMlxuICAgICAgICBtICY9IGllZWVNYW50aXNzYTsgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9ubHkgbWFudGlzc2EgYml0cyAoZnJhY3Rpb25hbCBwYXJ0KVxuICAgICAgICBtIHw9IGllZWVPbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZnJhY3Rpb25hbCBwYXJ0IHRvIDEuMFxuICAgICAgICBmbG9hdCAgZiA9IHVpbnRCaXRzVG9GbG9hdCggbSApOyAgICAgICAvLyBSYW5nZSBbMToyXVxuICAgICAgICByZXR1cm4gZiAtIDEuMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBbMDoxXVxuICAgICAgfVxuXG4gICAgICAvLyBQc2V1ZG8tcmFuZG9tIHZhbHVlIGluIGhhbGYtb3BlbiByYW5nZSBbMDoxXS5cbiAgICAgIGZsb2F0IHJhbmRvbSggZmxvYXQgeCApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHgpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMiAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMyAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjNCAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cblxuICAgICAgZmxvYXQgcmFuZCgpIHtcbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gcmFuZG9tKHZlYzMoZ2xfRnJhZ0Nvb3JkLnh5LCBzZWVkKSk7XG4gICAgICAgIHNlZWQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmbG9hdCBGMyA9ICAwLjMzMzMzMzM7XG4gICAgICBjb25zdCBmbG9hdCBHMyA9ICAwLjE2NjY2Njc7XG5cbiAgICAgIGZsb2F0IHNub2lzZSh2ZWMzIHApIHtcbiAgICAgICAgdmVjMyBzID0gZmxvb3IocCArIGRvdChwLCB2ZWMzKEYzKSkpO1xuICAgICAgICB2ZWMzIHggPSBwIC0gcyArIGRvdChzLCB2ZWMzKEczKSk7XG4gICAgICAgIHZlYzMgZSA9IHN0ZXAodmVjMygwLjApLCB4IC0geC55engpO1xuICAgICAgICB2ZWMzIGkxID0gZSooMS4wIC0gZS56eHkpO1xuICAgICAgICB2ZWMzIGkyID0gMS4wIC0gZS56eHkqKDEuMCAtIGUpO1xuICAgICAgICB2ZWMzIHgxID0geCAtIGkxICsgRzM7XG4gICAgICAgIHZlYzMgeDIgPSB4IC0gaTIgKyAyLjAqRzM7XG4gICAgICAgIHZlYzMgeDMgPSB4IC0gMS4wICsgMy4wKkczO1xuICAgICAgICB2ZWM0IHcsIGQ7XG4gICAgICAgIHcueCA9IGRvdCh4LCB4KTtcbiAgICAgICAgdy55ID0gZG90KHgxLCB4MSk7XG4gICAgICAgIHcueiA9IGRvdCh4MiwgeDIpO1xuICAgICAgICB3LncgPSBkb3QoeDMsIHgzKTtcbiAgICAgICAgdyA9IG1heCgwLjYgLSB3LCAwLjApO1xuICAgICAgICBkLnggPSBkb3QocmFuZG9tMyhzKSwgeCk7XG4gICAgICAgIGQueSA9IGRvdChyYW5kb20zKHMgKyBpMSksIHgxKTtcbiAgICAgICAgZC56ID0gZG90KHJhbmRvbTMocyArIGkyKSwgeDIpO1xuICAgICAgICBkLncgPSBkb3QocmFuZG9tMyhzICsgMS4wKSwgeDMpO1xuICAgICAgICB3ICo9IHc7XG4gICAgICAgIHcgKj0gdztcbiAgICAgICAgZCAqPSB3O1xuICAgICAgICByZXR1cm4gZG90KGQsIHZlYzQoNTIuMCkpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBzbm9pc2VGcmFjdGFsKHZlYzMgbSkge1xuICAgICAgICByZXR1cm4gMC41MzMzMzMzKiBzbm9pc2UobSlcbiAgICAgICAgICAgICAgKzAuMjY2NjY2Nyogc25vaXNlKDIuMCptKVxuICAgICAgICAgICAgICArMC4xMzMzMzMzKiBzbm9pc2UoNC4wKm0pXG4gICAgICAgICAgICAgICswLjA2NjY2NjcqIHNub2lzZSg4LjAqbSk7XG4gICAgICB9XFxuYCArIHNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYW5zbWlzc2lvblxuICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD4nLFxuICAgICAgICAgICAgICAgIC8qZ2xzbCovIGBcbiAgICAgICAgI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cbiAgICAgICAgICAvLyBUcmFuc21pc3Npb24gY29kZSBpcyBiYXNlZCBvbiBnbFRGLVNhbXBsZXItVmlld2VyXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXJcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IF90cmFuc21pc3Npb247XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuICAgICAgICAgIHVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yO1xuICAgICAgICAgICNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG4gICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XG4gICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgI2lmZGVmIFVTRV9USElDS05FU1NNQVBcbiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHRoaWNrbmVzc01hcDtcbiAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICB1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7XG4gICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uU2FtcGxlck1hcDtcbiAgICAgICAgICB1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7XG4gICAgICAgICAgdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgICAgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIG1hdDQgbW9kZWxNYXRyaXggKSB7XG4gICAgICAgICAgICAvLyBEaXJlY3Rpb24gb2YgcmVmcmFjdGVkIGxpZ2h0LlxuICAgICAgICAgICAgdmVjMyByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCggLSB2LCBub3JtYWxpemUoIG4gKSwgMS4wIC8gaW9yICk7XG4gICAgICAgICAgICAvLyBDb21wdXRlIHJvdGF0aW9uLWluZGVwZW5kYW50IHNjYWxpbmcgb2YgdGhlIG1vZGVsIG1hdHJpeC5cbiAgICAgICAgICAgIHZlYzMgbW9kZWxTY2FsZTtcbiAgICAgICAgICAgIG1vZGVsU2NhbGUueCA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54eXogKSApO1xuICAgICAgICAgICAgbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7XG4gICAgICAgICAgICBtb2RlbFNjYWxlLnogPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAyIF0ueHl6ICkgKTtcbiAgICAgICAgICAgIC8vIFRoZSB0aGlja25lc3MgaXMgc3BlY2lmaWVkIGluIGxvY2FsIHNwYWNlLlxuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxvYXQgYXBwbHlJb3JUb1JvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IgKSB7XG4gICAgICAgICAgICAvLyBTY2FsZSByb3VnaG5lc3Mgd2l0aCBJT1Igc28gdGhhdCBhbiBJT1Igb2YgMS4wIHJlc3VsdHMgaW4gbm8gbWljcm9mYWNldCByZWZyYWN0aW9uIGFuZFxuICAgICAgICAgICAgLy8gYW4gSU9SIG9mIDEuNSByZXN1bHRzIGluIHRoZSBkZWZhdWx0IGFtb3VudCBvZiBtaWNyb2ZhY2V0IHJlZnJhY3Rpb24uXG4gICAgICAgICAgICByZXR1cm4gcm91Z2huZXNzICogY2xhbXAoIGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHtcbiAgICAgICAgICAgIGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMiggdHJhbnNtaXNzaW9uU2FtcGxlclNpemUueCApICogYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKTtcbiAgICAgICAgICAgICNpZmRlZiBVU0VfU0FNUExFUlxuICAgICAgICAgICAgICAjaWZkZWYgdGV4dHVyZTJETG9kRVhUXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHR1cmUyRExvZEVYVCh0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGZyYW1lYnVmZmVyTG9kKTtcbiAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZTJEKHRyYW5zbWlzc2lvblNhbXBsZXJNYXAsIGZyYWdDb29yZC54eSwgZnJhbWVidWZmZXJMb2QpO1xuICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNlbHNlXG4gICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlMkQoYnVmZmVyLCBmcmFnQ29vcmQueHkpO1xuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgfVxuICAgICAgICAgIHZlYzMgYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gZmxvYXQgdHJhbnNtaXNzaW9uRGlzdGFuY2UsIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHtcbiAgICAgICAgICAgIGlmICggaXNpbmYoIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW51YXRpb24gZGlzdGFuY2UgaXMgK+KIniwgaS5lLiB0aGUgdHJhbnNtaXR0ZWQgY29sb3IgaXMgbm90IGF0dGVudWF0ZWQgYXQgYWxsLlxuICAgICAgICAgICAgICByZXR1cm4gcmFkaWFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDb21wdXRlIGxpZ2h0IGF0dGVudWF0aW9uIHVzaW5nIEJlZXIncyBsYXcuXG4gICAgICAgICAgICAgIHZlYzMgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IC1sb2coIGF0dGVudWF0aW9uQ29sb3IgKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XG4gICAgICAgICAgICAgIHZlYzMgdHJhbnNtaXR0YW5jZSA9IGV4cCggLSBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ICogdHJhbnNtaXNzaW9uRGlzdGFuY2UgKTsgLy8gQmVlcidzIGxhd1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNtaXR0YW5jZSAqIHJhZGlhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2ZWM0IGdldElCTFZvbHVtZVJlZnJhY3Rpb24oIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yLFxuICAgICAgICAgICAgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCxcbiAgICAgICAgICAgIGNvbnN0IGluIG1hdDQgdmlld01hdHJpeCwgY29uc3QgaW4gbWF0NCBwcm9qTWF0cml4LCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcyxcbiAgICAgICAgICAgIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHtcbiAgICAgICAgICAgIHZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTtcbiAgICAgICAgICAgIHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xuICAgICAgICAgICAgLy8gUHJvamVjdCByZWZyYWN0ZWQgdmVjdG9yIG9uIHRoZSBmcmFtZWJ1ZmZlciwgd2hpbGUgbWFwcGluZyB0byBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKTtcbiAgICAgICAgICAgIHZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53O1xuICAgICAgICAgICAgcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG4gICAgICAgICAgICByZWZyYWN0aW9uQ29vcmRzIC89IDIuMDtcbiAgICAgICAgICAgIC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cbiAgICAgICAgICAgIHZlYzQgdHJhbnNtaXR0ZWRMaWdodCA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3IgKTtcbiAgICAgICAgICAgIHZlYzMgYXR0ZW51YXRlZENvbG9yID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggdHJhbnNtaXR0ZWRMaWdodC5yZ2IsIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgc3BlY3VsYXIgY29tcG9uZW50LlxuICAgICAgICAgICAgdmVjMyBGID0gRW52aXJvbm1lbnRCUkRGKCBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzICk7XG4gICAgICAgICAgICByZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IgKiBkaWZmdXNlQ29sb3IsIHRyYW5zbWl0dGVkTGlnaHQuYSApO1xuICAgICAgICAgIH1cbiAgICAgICAgI2VuZGlmXFxuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHJlZnJhY3Rpb25cbiAgICAgICAgICAgIHNoYWRlci5mcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNoYWRlci5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICcjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PicsXG4gICAgICAgICAgICAgICAgLypnbHNsKi8gYFxuICAgICAgICAvLyBJbXByb3ZlIHRoZSByZWZyYWN0aW9uIHRvIHVzZSB0aGUgd29ybGQgcG9zXG4gICAgICAgIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA9IF90cmFuc21pc3Npb247XG4gICAgICAgIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhID0gMS4wO1xuICAgICAgICBtYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7XG4gICAgICAgIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yID0gYXR0ZW51YXRpb25Db2xvcjtcbiAgICAgICAgI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcbiAgICAgICAgICBtYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZVdiApLnI7XG4gICAgICAgICNlbmRpZlxuICAgICAgICAjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxuICAgICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyAqPSB0ZXh0dXJlMkQoIHRoaWNrbmVzc01hcCwgdlV2ICkuZztcbiAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgdmVjMyBwb3MgPSB2V29ybGRQb3NpdGlvbjtcbiAgICAgICAgdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApO1xuICAgICAgICB2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcbiAgICAgICAgdmVjMyB0cmFuc21pc3Npb24gPSB2ZWMzKDAuMCk7XG4gICAgICAgIGZsb2F0IHRyYW5zbWlzc2lvblIsIHRyYW5zbWlzc2lvbkIsIHRyYW5zbWlzc2lvbkc7XG4gICAgICAgIGZsb2F0IHJhbmRvbUNvb3JkcyA9IHJhbmQoKTtcbiAgICAgICAgZmxvYXQgdGhpY2tuZXNzX3NtZWFyID0gdGhpY2tuZXNzICogbWF4KHBvdyhyb3VnaG5lc3NGYWN0b3IsIDAuMzMpLCBhbmlzb3Ryb3B5KTtcbiAgICAgICAgdmVjMyBkaXN0b3J0aW9uTm9ybWFsID0gdmVjMygwLjApO1xuICAgICAgICB2ZWMzIHRlbXBvcmFsT2Zmc2V0ID0gdmVjMyh0aW1lLCAtdGltZSwgLXRpbWUpICogdGVtcG9yYWxEaXN0b3J0aW9uO1xuICAgICAgICBpZiAoZGlzdG9ydGlvbiA+IDAuMCkge1xuICAgICAgICAgIGRpc3RvcnRpb25Ob3JtYWwgPSBkaXN0b3J0aW9uICogdmVjMyhzbm9pc2VGcmFjdGFsKHZlYzMoKHBvcyAqIGRpc3RvcnRpb25TY2FsZSArIHRlbXBvcmFsT2Zmc2V0KSkpLCBzbm9pc2VGcmFjdGFsKHZlYzMocG9zLnp4eSAqIGRpc3RvcnRpb25TY2FsZSAtIHRlbXBvcmFsT2Zmc2V0KSksIHNub2lzZUZyYWN0YWwodmVjMyhwb3MueXh6ICogZGlzdG9ydGlvblNjYWxlICsgdGVtcG9yYWxPZmZzZXQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChmbG9hdCBpID0gMC4wOyBpIDwgJHtzYW1wbGVzfS4wOyBpICsrKSB7XG4gICAgICAgICAgdmVjMyBzYW1wbGVOb3JtID0gbm9ybWFsaXplKG4gKyByb3VnaG5lc3NGYWN0b3IgKiByb3VnaG5lc3NGYWN0b3IgKiAyLjAgKiBub3JtYWxpemUodmVjMyhyYW5kKCkgLSAwLjUsIHJhbmQoKSAtIDAuNSwgcmFuZCgpIC0gMC41KSkgKiBwb3cocmFuZCgpLCAwLjMzKSArIGRpc3RvcnRpb25Ob3JtYWwpO1xuICAgICAgICAgIHRyYW5zbWlzc2lvblIgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MgICsgdGhpY2tuZXNzX3NtZWFyICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSksXG4gICAgICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlXG4gICAgICAgICAgKS5yO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbkcgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yICAqICgxLjAgKyBjaHJvbWF0aWNBYmVycmF0aW9uICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSkpICwgbWF0ZXJpYWwudGhpY2tuZXNzICsgdGhpY2tuZXNzX3NtZWFyICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSksXG4gICAgICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlXG4gICAgICAgICAgKS5nO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbkIgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuICAgICAgICAgICAgc2FtcGxlTm9ybSwgdiwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLFxuICAgICAgICAgICAgcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yICogKDEuMCArIDIuMCAqIGNocm9tYXRpY0FiZXJyYXRpb24gKiAoaSArIHJhbmRvbUNvb3JkcykgLyBmbG9hdCgke3NhbXBsZXN9KSksIG1hdGVyaWFsLnRoaWNrbmVzcyArIHRoaWNrbmVzc19zbWVhciAqIChpICsgcmFuZG9tQ29vcmRzKSAvIGZsb2F0KCR7c2FtcGxlc30pLFxuICAgICAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZVxuICAgICAgICAgICkuYjtcbiAgICAgICAgICB0cmFuc21pc3Npb24uciArPSB0cmFuc21pc3Npb25SO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbi5nICs9IHRyYW5zbWlzc2lvbkc7XG4gICAgICAgICAgdHJhbnNtaXNzaW9uLmIgKz0gdHJhbnNtaXNzaW9uQjtcbiAgICAgICAgfVxuICAgICAgICB0cmFuc21pc3Npb24gLz0gJHtzYW1wbGVzfS4wO1xuICAgICAgICB0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXNzaW9uLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7XFxuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnVuaWZvcm1zKS5mb3JFYWNoKChuYW1lKSA9PlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+ICh0aGlzLnVuaWZvcm1zIGFzIE5ndEFueVJlY29yZClbbmFtZV0udmFsdWUsXG4gICAgICAgICAgICAgICAgc2V0OiAodikgPT4gKCh0aGlzLnVuaWZvcm1zIGFzIE5ndEFueVJlY29yZClbbmFtZV0udmFsdWUgPSB2KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '../shader-material/shader-material';
|
|
3
|
+
export const SoftShadowMaterial = shaderMaterial({
|
|
4
|
+
color: new THREE.Color(),
|
|
5
|
+
blend: 2.0,
|
|
6
|
+
alphaTest: 0.75,
|
|
7
|
+
opacity: 0,
|
|
8
|
+
map: null,
|
|
9
|
+
},
|
|
10
|
+
// language=GLSL
|
|
11
|
+
`
|
|
12
|
+
varying vec2 vUv;
|
|
13
|
+
void main() {
|
|
14
|
+
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);
|
|
15
|
+
vUv = uv;
|
|
16
|
+
}
|
|
17
|
+
`,
|
|
18
|
+
// language=GLSL
|
|
19
|
+
`
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
uniform sampler2D map;
|
|
22
|
+
uniform vec3 color;
|
|
23
|
+
uniform float blend;
|
|
24
|
+
uniform float opacity;
|
|
25
|
+
uniform float alphaTest;
|
|
26
|
+
void main() {
|
|
27
|
+
vec4 sampledDiffuseColor = texture2D(map, vUv);
|
|
28
|
+
gl_FragColor = vec4(color * sampledDiffuseColor.r * blend, max(0.0, (1.0 - (sampledDiffuseColor.r + sampledDiffuseColor.g + sampledDiffuseColor.b) / alphaTest)) * opacity);
|
|
29
|
+
#include <tonemapping_fragment>
|
|
30
|
+
#include <encodings_fragment>
|
|
31
|
+
}
|
|
32
|
+
`);
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1zaGFkb3ctbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzL3NyYy9saWIvc29mdC1zaGFkb3ctbWF0ZXJpYWwvc29mdC1zaGFkb3ctbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FDNUM7SUFDSSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0lBQ3hCLEtBQUssRUFBRSxHQUFHO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxJQUFJO0NBQ1o7QUFDRCxnQkFBZ0I7QUFDaEI7Ozs7OztHQU1EO0FBQ0MsZ0JBQWdCO0FBQ2hCOzs7Ozs7Ozs7Ozs7O0dBYUQsQ0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgc2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi9zaGFkZXItbWF0ZXJpYWwvc2hhZGVyLW1hdGVyaWFsJztcblxuZXhwb3J0IGNvbnN0IFNvZnRTaGFkb3dNYXRlcmlhbCA9IHNoYWRlck1hdGVyaWFsKFxuICAgIHtcbiAgICAgICAgY29sb3I6IG5ldyBUSFJFRS5Db2xvcigpLFxuICAgICAgICBibGVuZDogMi4wLFxuICAgICAgICBhbHBoYVRlc3Q6IDAuNzUsXG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIG1hcDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGxhbmd1YWdlPUdMU0xcbiAgICBgXG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLik7XG4gIHZVdiA9IHV2O1xufVxuICBgLFxuICAgIC8vIGxhbmd1YWdlPUdMU0xcbiAgICBgXG52YXJ5aW5nIHZlYzIgdlV2O1xudW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xudW5pZm9ybSB2ZWMzIGNvbG9yO1xudW5pZm9ybSBmbG9hdCBibGVuZDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgYWxwaGFUZXN0O1xudm9pZCBtYWluKCkge1xuICB2ZWM0IHNhbXBsZWREaWZmdXNlQ29sb3IgPSB0ZXh0dXJlMkQobWFwLCB2VXYpO1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yICogc2FtcGxlZERpZmZ1c2VDb2xvci5yICogYmxlbmQsIG1heCgwLjAsICgxLjAgLSAoc2FtcGxlZERpZmZ1c2VDb2xvci5yICsgc2FtcGxlZERpZmZ1c2VDb2xvci5nICsgc2FtcGxlZERpZmZ1c2VDb2xvci5iKSAvIGFscGhhVGVzdCkpICogb3BhY2l0eSk7XG4gICNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cbiAgI2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn1cbiAgYFxuKTtcblxuZXhwb3J0IHR5cGUgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzID0ge1xuICAgIG1hcDogVEhSRUUuVGV4dHVyZTtcbiAgICBjb2xvcj86IFRIUkVFLkNvbG9yUmVwcmVzZW50YXRpb247XG4gICAgYWxwaGFUZXN0PzogbnVtYmVyO1xuICAgIGJsZW5kPzogbnVtYmVyO1xufTtcbiJdfQ==
|
|
@@ -2,6 +2,7 @@ export { NgtsAccumulativeShadows } from './lib/accumulative-shadows/accumulative
|
|
|
2
2
|
export { NgtsRandomizedLights } from './lib/accumulative-shadows/randomized-lights';
|
|
3
3
|
export * from './lib/bounds/bounds';
|
|
4
4
|
export * from './lib/camera-shake/camera-shake';
|
|
5
|
+
export * from './lib/caustics/caustics';
|
|
5
6
|
export * from './lib/center/center';
|
|
6
7
|
export * from './lib/cloud/cloud';
|
|
7
8
|
export * from './lib/contact-shadows/contact-shadows';
|
|
@@ -14,4 +15,4 @@ export * from './lib/spot-light/spot-light';
|
|
|
14
15
|
export * from './lib/spot-light/spot-light-shadow';
|
|
15
16
|
export * from './lib/stage/stage';
|
|
16
17
|
export * from './lib/stars/stars';
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93cyB9IGZyb20gJy4vbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcbmV4cG9ydCB7IE5ndHNSYW5kb21pemVkTGlnaHRzIH0gZnJvbSAnLi9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYm91bmRzL2JvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jYW1lcmEtc2hha2UvY2FtZXJhLXNoYWtlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NhdXN0aWNzL2NhdXN0aWNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NlbnRlci9jZW50ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2xvdWQvY2xvdWQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udGFjdC1zaGFkb3dzL2NvbnRhY3Qtc2hhZG93cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9lbnZpcm9ubWVudC9hc3NldHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZW52aXJvbm1lbnQvZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmxvYXQvZmxvYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2t5L3NreSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcGFya2xlcy9zcGFya2xlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcG90LWxpZ2h0L3Nwb3QtbGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3BvdC1saWdodC9zcG90LWxpZ2h0LXNoYWRvdyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdGFnZS9zdGFnZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdGFycy9zdGFycyc7XG4iXX0=
|