@meimu/mutracer 0.1.3 → 0.1.5
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/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +17 -9
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +8 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +42 -41
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,25 +12,25 @@ int triangleIndex = primitiveOffset + k;
|
|
|
12
12
|
${skipTriangleCode}
|
|
13
13
|
vec4 r3 = dp(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
fB tri = fB(
|
|
16
|
+
kG(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
|
+
kG(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
|
+
kG(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
|
|
20
|
+
eC hit = fM(o, d, tri, ey, gQ, tMax);
|
|
21
21
|
|
|
22
22
|
if (hit.t > 0.0) {
|
|
23
23
|
tMax = hit.t;
|
|
24
24
|
vec3 e1 = tri.p1 - tri.p0;
|
|
25
25
|
vec3 e2 = tri.p2 - tri.p0;
|
|
26
26
|
vec3 faceNormal = normalize(cross(e1, e2));
|
|
27
|
-
int
|
|
27
|
+
int kk = int(ae(
|
|
28
28
|
floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)
|
|
29
29
|
).x);
|
|
30
|
-
bool
|
|
31
|
-
|
|
30
|
+
bool iN = fetchMatData(
|
|
31
|
+
kk * MAT_DATA_SIZE + MAT_ROW_ALPHA
|
|
32
32
|
).z > 0.5;
|
|
33
|
-
if (!doubleSided && !
|
|
33
|
+
if (!doubleSided && !iN && dot(faceNormal, d) > 0.0) {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -41,31 +41,31 @@ ${handleHitCode}
|
|
|
41
41
|
return glsl `
|
|
42
42
|
ivec2 stack[STACK_SIZE];
|
|
43
43
|
int top = -1;
|
|
44
|
-
int
|
|
44
|
+
int sO = -1;
|
|
45
45
|
float tMax = ${initialTMax};
|
|
46
46
|
|
|
47
47
|
vec3 o = ray.o;
|
|
48
48
|
vec3 d = ray.d;
|
|
49
49
|
|
|
50
|
-
bool
|
|
51
|
-
vec3
|
|
50
|
+
bool rb = false;
|
|
51
|
+
vec3 hB;
|
|
52
52
|
vec3 aB;
|
|
53
|
-
ivec3
|
|
53
|
+
ivec3 hw;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
fB lB;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
top = 0;
|
|
59
59
|
stack[0] = ivec2(0, -1);
|
|
60
60
|
|
|
61
|
-
int
|
|
62
|
-
while(top >= 0 &&
|
|
63
|
-
|
|
61
|
+
int wr = 0;
|
|
62
|
+
while(top >= 0 && wr < 5000) {
|
|
63
|
+
wr++;
|
|
64
64
|
ivec2 node = stack[top--];
|
|
65
65
|
|
|
66
66
|
int cf = node.y;
|
|
67
67
|
|
|
68
|
-
if (cf !=
|
|
68
|
+
if (cf != sO) {
|
|
69
69
|
if (cf < 0) {
|
|
70
70
|
o = ray.o;
|
|
71
71
|
d = ray.d;
|
|
@@ -81,110 +81,110 @@ o = (w2l * vec4(ray.o, 1.0)).xyz;
|
|
|
81
81
|
d = (w2l * vec4(ray.d, 0.0)).xyz;
|
|
82
82
|
}
|
|
83
83
|
ey = maxDimension(abs(d));
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
gQ = mu(d, ey);
|
|
85
|
+
sO = cf;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
int bo = cf < 0 ? 0 : blasOffset;
|
|
89
|
-
uint
|
|
90
|
-
int
|
|
91
|
-
int
|
|
89
|
+
uint fK = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
+
int gS = int(fK >> 30u);
|
|
91
|
+
int eW = int(fK & 0x3fffffffu);
|
|
92
92
|
int bh = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
96
|
-
uint
|
|
97
|
-
if ((
|
|
98
|
-
bh = int((
|
|
99
|
-
primitiveOffset = bo +
|
|
95
|
+
if (gS == 3) {
|
|
96
|
+
uint hW = uint(node.x);
|
|
97
|
+
if ((hW & 0x80000000u) != 0u) {
|
|
98
|
+
bh = int((hW >> 23u) & 0xffu);
|
|
99
|
+
primitiveOffset = bo + eW + int(hW & 0x007fffffu);
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
102
|
int i = node.x + bo;
|
|
103
|
-
vec4
|
|
104
|
-
vec4
|
|
105
|
-
vec4
|
|
106
|
-
vec4
|
|
107
|
-
vec4
|
|
108
|
-
uint header = floatBitsToUint(
|
|
109
|
-
int
|
|
110
|
-
int
|
|
111
|
-
int
|
|
112
|
-
vec3
|
|
113
|
-
uintBitsToFloat(uint(
|
|
114
|
-
uintBitsToFloat(uint(
|
|
115
|
-
uintBitsToFloat(uint(
|
|
103
|
+
vec4 jA = dp(i);
|
|
104
|
+
vec4 fG = dp(i + 1);
|
|
105
|
+
vec4 mU = dp(i + 2);
|
|
106
|
+
vec4 mV = dp(i + 3);
|
|
107
|
+
vec4 mW = dp(i + 4);
|
|
108
|
+
uint header = floatBitsToUint(jA.w);
|
|
109
|
+
int rG = int(header << 24u) >> 24;
|
|
110
|
+
int rH = int((header >> 8u) << 24u) >> 24;
|
|
111
|
+
int rI = int((header >> 16u) << 24u) >> 24;
|
|
112
|
+
vec3 hJ = vec3(
|
|
113
|
+
uintBitsToFloat(uint(rG + 127) << 23u),
|
|
114
|
+
uintBitsToFloat(uint(rH + 127) << 23u),
|
|
115
|
+
uintBitsToFloat(uint(rI + 127) << 23u)
|
|
116
116
|
);
|
|
117
|
-
uint childBase = floatBitsToUint(
|
|
118
|
-
uint
|
|
117
|
+
uint childBase = floatBitsToUint(fG.x);
|
|
118
|
+
uint oP = floatBitsToUint(fG.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
|
-
uint
|
|
120
|
+
uint ut = (d.x < 0.0 ? 4u : 0u) |
|
|
121
121
|
(d.y < 0.0 ? 2u : 0u) |
|
|
122
122
|
(d.z < 0.0 ? 1u : 0u);
|
|
123
|
-
uint
|
|
124
|
-
floatBitsToUint(
|
|
125
|
-
floatBitsToUint(
|
|
126
|
-
floatBitsToUint(
|
|
127
|
-
floatBitsToUint(
|
|
128
|
-
floatBitsToUint(
|
|
129
|
-
floatBitsToUint(
|
|
123
|
+
uint gJ[12] = uint[12](
|
|
124
|
+
floatBitsToUint(mU.x), floatBitsToUint(mU.y),
|
|
125
|
+
floatBitsToUint(mU.z), floatBitsToUint(mU.w),
|
|
126
|
+
floatBitsToUint(mV.x), floatBitsToUint(mV.y),
|
|
127
|
+
floatBitsToUint(mV.z), floatBitsToUint(mV.w),
|
|
128
|
+
floatBitsToUint(mW.x), floatBitsToUint(mW.y),
|
|
129
|
+
floatBitsToUint(mW.z), floatBitsToUint(mW.w)
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
for (int order = 7; order >= 0; order--) {
|
|
133
|
-
uint slot = uint(order) ^
|
|
134
|
-
uint
|
|
135
|
-
? floatBitsToUint(
|
|
136
|
-
: floatBitsToUint(
|
|
137
|
-
uint meta = (
|
|
133
|
+
uint slot = uint(order) ^ ut;
|
|
134
|
+
uint sE = slot >= 4u
|
|
135
|
+
? floatBitsToUint(fG.w)
|
|
136
|
+
: floatBitsToUint(fG.z);
|
|
137
|
+
uint meta = (sE >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
140
|
-
uint
|
|
141
|
-
vec3
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
139
|
+
uint lX = (slot & 3u) * 8u;
|
|
140
|
+
uint kV = slot >> 2u;
|
|
141
|
+
vec3 tH = vec3(
|
|
142
|
+
float((gJ[kV] >> lX) & 0xffu),
|
|
143
|
+
float((gJ[2u + kV] >> lX) & 0xffu),
|
|
144
|
+
float((gJ[4u + kV] >> lX) & 0xffu)
|
|
145
145
|
);
|
|
146
|
-
vec3
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
146
|
+
vec3 tG = vec3(
|
|
147
|
+
float((gJ[6u + kV] >> lX) & 0xffu),
|
|
148
|
+
float((gJ[8u + kV] >> lX) & 0xffu),
|
|
149
|
+
float((gJ[10u + kV] >> lX) & 0xffu)
|
|
150
150
|
);
|
|
151
|
-
vec3
|
|
152
|
-
vec3
|
|
153
|
-
if (cM(o, d,
|
|
154
|
-
uint
|
|
155
|
-
if (
|
|
156
|
-
uint
|
|
157
|
-
uint
|
|
151
|
+
vec3 uW = jA.xyz + tH * hJ;
|
|
152
|
+
vec3 uV = jA.xyz + tG * hJ;
|
|
153
|
+
if (cM(o, d, uW, uV, tMax) <= 0.0) continue;
|
|
154
|
+
uint jC = meta & 0x1fu;
|
|
155
|
+
if (jC >= 24u) {
|
|
156
|
+
uint nr = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint sX = childBase + qT(nr);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
|
-
|
|
159
|
+
eW + int(sX * 5u), cf
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
|
-
uint triangleCount =
|
|
164
|
-
uint
|
|
165
|
-
uint
|
|
163
|
+
uint triangleCount = qT(meta >> 5u);
|
|
164
|
+
uint rS = oP + jC;
|
|
165
|
+
uint vh = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
|
-
(
|
|
168
|
-
stack[++top] = ivec2(int(
|
|
167
|
+
(rS & 0x007fffffu);
|
|
168
|
+
stack[++top] = ivec2(int(vh), cf);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
173
|
+
else if (gS == 2) {
|
|
174
174
|
int i = node.x + bo;
|
|
175
|
-
vec4
|
|
176
|
-
vec4
|
|
177
|
-
vec4
|
|
178
|
-
vec4
|
|
179
|
-
bh = int(floatBitsToUint(
|
|
175
|
+
vec4 uY = dp(i);
|
|
176
|
+
vec4 uZ = dp(i + 1);
|
|
177
|
+
vec4 va = dp(i + 2);
|
|
178
|
+
vec4 vb = dp(i + 3);
|
|
179
|
+
bh = int(floatBitsToUint(va.w));
|
|
180
180
|
if (bh > 0) {
|
|
181
|
-
primitiveOffset = bo +
|
|
181
|
+
primitiveOffset = bo + eW + int(floatBitsToUint(vb.w));
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
int left =
|
|
185
|
-
int right =
|
|
186
|
-
float d0 = cM(o, d,
|
|
187
|
-
float d1 = cM(o, d,
|
|
184
|
+
int left = eW + int(floatBitsToUint(uY.w) * 4u);
|
|
185
|
+
int right = eW + int(floatBitsToUint(uZ.w) * 4u);
|
|
186
|
+
float d0 = cM(o, d, uY.xyz, uZ.xyz, tMax);
|
|
187
|
+
float d1 = cM(o, d, va.xyz, vb.xyz, tMax);
|
|
188
188
|
if (d0 > d1) {
|
|
189
189
|
if (d0 > 0.0) stack[++top] = ivec2(left, cf);
|
|
190
190
|
if (d1 > 0.0) stack[++top] = ivec2(right, cf);
|
|
@@ -195,62 +195,62 @@ if (d0 > 0.0) stack[++top] = ivec2(left, cf);
|
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
else if (
|
|
199
|
-
uint
|
|
200
|
-
if ((
|
|
201
|
-
bh = int((
|
|
202
|
-
primitiveOffset = bo +
|
|
198
|
+
else if (gS == 1) {
|
|
199
|
+
uint hW = uint(node.x);
|
|
200
|
+
if ((hW & 0x80000000u) != 0u) {
|
|
201
|
+
bh = int((hW >> 23u) & 0xffu);
|
|
202
|
+
primitiveOffset = bo + eW + int(hW & 0x007fffffu);
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
205
|
int i = node.x + bo;
|
|
206
|
-
vec4
|
|
207
|
-
vec4
|
|
208
|
-
vec4
|
|
209
|
-
vec4
|
|
210
|
-
vec3 nodeMin =
|
|
211
|
-
vec3 ec = vec3(
|
|
212
|
-
uint
|
|
213
|
-
floatBitsToUint(
|
|
214
|
-
floatBitsToUint(
|
|
206
|
+
vec4 ui = dp(i);
|
|
207
|
+
vec4 ro = dp(i + 1);
|
|
208
|
+
vec4 rp = dp(i + 2);
|
|
209
|
+
vec4 rq = dp(i + 3);
|
|
210
|
+
vec3 nodeMin = ui.xyz;
|
|
211
|
+
vec3 ec = vec3(ui.w, ro.x, ro.y);
|
|
212
|
+
uint mg[4] = uint[4](
|
|
213
|
+
floatBitsToUint(ro.z), floatBitsToUint(ro.w),
|
|
214
|
+
floatBitsToUint(rp.x), floatBitsToUint(rp.y)
|
|
215
215
|
);
|
|
216
|
-
vec4
|
|
217
|
-
vec4
|
|
218
|
-
vec4
|
|
219
|
-
vec4
|
|
220
|
-
vec4
|
|
221
|
-
vec4
|
|
222
|
-
vec3
|
|
223
|
-
vec3 bJ =
|
|
224
|
-
vec4 tx0 = (nodeMin.x +
|
|
225
|
-
vec4 tx1 = (nodeMin.x +
|
|
226
|
-
vec4 ty0 = (nodeMin.y +
|
|
227
|
-
vec4 ty1 = (nodeMin.y +
|
|
228
|
-
vec4 tz0 = (nodeMin.z +
|
|
229
|
-
vec4 tz1 = (nodeMin.z +
|
|
230
|
-
vec4
|
|
231
|
-
vec4
|
|
232
|
-
vec4 distance = mix(
|
|
233
|
-
distance = mix(distance, vec4(-1.0), greaterThan(
|
|
234
|
-
float
|
|
216
|
+
vec4 rw = fc(floatBitsToUint(rp.z));
|
|
217
|
+
vec4 rA = fc(floatBitsToUint(rp.w));
|
|
218
|
+
vec4 rB = fc(floatBitsToUint(rq.x));
|
|
219
|
+
vec4 rt = fc(floatBitsToUint(rq.y));
|
|
220
|
+
vec4 ru = fc(floatBitsToUint(rq.z));
|
|
221
|
+
vec4 rv = fc(floatBitsToUint(rq.w));
|
|
222
|
+
vec3 gE = fb(d);
|
|
223
|
+
vec3 bJ = eZ(gE, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
|
|
230
|
+
vec4 mK = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
|
|
231
|
+
vec4 rU = min(min((max(tx0, tx1) + vec4(bJ.x)), (max(ty0, ty1) + vec4(bJ.y))), (max(tz0, tz1) + vec4(bJ.z)));
|
|
232
|
+
vec4 distance = mix(rU, mK, greaterThan(mK, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(mK, min(rU, vec4(tMax))));
|
|
234
|
+
float fd[4] = float[4](distance.x, distance.y, distance.z, distance.w);
|
|
235
235
|
|
|
236
236
|
|
|
237
237
|
for (int order = 0; order < 4; order++) {
|
|
238
238
|
float dX = -1.0;
|
|
239
239
|
int el = -1;
|
|
240
240
|
for (int child = 0; child < 4; child++) {
|
|
241
|
-
if (
|
|
242
|
-
dX =
|
|
241
|
+
if (mg[child] != 0u && fd[child] > dX) {
|
|
242
|
+
dX = fd[child];
|
|
243
243
|
el = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
if (el >= 0 && dX > 0.0) {
|
|
247
|
-
uint
|
|
248
|
-
int
|
|
249
|
-
if ((
|
|
250
|
-
|
|
247
|
+
uint nC = mg[el];
|
|
248
|
+
int jI = int(nC);
|
|
249
|
+
if ((nC & 0x80000000u) == 0u) {
|
|
250
|
+
jI += eW;
|
|
251
251
|
}
|
|
252
|
-
stack[++top] = ivec2(
|
|
253
|
-
|
|
252
|
+
stack[++top] = ivec2(jI, cf);
|
|
253
|
+
fd[el] = -1.0;
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
}
|
|
@@ -262,7 +262,7 @@ int bb = floatBitsToInt(r1.w);
|
|
|
262
262
|
|
|
263
263
|
if (bb >= 0) {
|
|
264
264
|
int left = node.x + 2;
|
|
265
|
-
int right = bb +
|
|
265
|
+
int right = bb + eW;
|
|
266
266
|
|
|
267
267
|
float d0 = cM(o, d, dp(left + bo).xyz, dp(left + 1 + bo).xyz, tMax);
|
|
268
268
|
float d1 = cM(o, d, dp(right + bo).xyz, dp(right + 1 + bo).xyz, tMax);
|
|
@@ -321,13 +321,13 @@ export default createShaderMixin({
|
|
|
321
321
|
},
|
|
322
322
|
main: glsl `
|
|
323
323
|
|
|
324
|
-
struct
|
|
324
|
+
struct fB {
|
|
325
325
|
vec3 p0;
|
|
326
326
|
vec3 p1;
|
|
327
327
|
vec3 p2;
|
|
328
328
|
};
|
|
329
329
|
#ifdef NUM_LIGHTS
|
|
330
|
-
float
|
|
330
|
+
float hx(float rad, vec3 pos, Ray r) {
|
|
331
331
|
vec3 op = pos - r.o;
|
|
332
332
|
float eps = 0.001;
|
|
333
333
|
float b = dot(op, r.d);
|
|
@@ -347,7 +347,7 @@ return t2;
|
|
|
347
347
|
return INF;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
float
|
|
350
|
+
float nh(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
|
|
351
351
|
float dt = dot(r.d, n);
|
|
352
352
|
float t = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
353
353
|
|
|
@@ -366,7 +366,7 @@ return t;
|
|
|
366
366
|
return INF;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
float
|
|
369
|
+
float my(Ray r, Light light, out LightSampleRec lightSample) {
|
|
370
370
|
|
|
371
371
|
|
|
372
372
|
|
|
@@ -383,7 +383,7 @@ vec3 normal = normalize(cross(u, v));
|
|
|
383
383
|
if (dot(normal, r.d) > 0.)
|
|
384
384
|
return INF;
|
|
385
385
|
|
|
386
|
-
d =
|
|
386
|
+
d = nh(pos, u, v, normal, r);
|
|
387
387
|
if (d < 0.) {
|
|
388
388
|
d = INF;
|
|
389
389
|
}
|
|
@@ -400,9 +400,9 @@ lightSample.emission = light.emission;
|
|
|
400
400
|
#ifdef HAS_SPHERE_LIGHTS
|
|
401
401
|
if (type == SPHERE_LIGHT) {
|
|
402
402
|
if (light.radius <= 0.0) {
|
|
403
|
-
vec3
|
|
404
|
-
float projection = dot(
|
|
405
|
-
vec3 ba =
|
|
403
|
+
vec3 ko = light.position - r.o;
|
|
404
|
+
float projection = dot(ko, r.d);
|
|
405
|
+
vec3 ba = ko - projection * r.d;
|
|
406
406
|
if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
|
|
407
407
|
d = projection;
|
|
408
408
|
lightSample.direction = r.d;
|
|
@@ -411,7 +411,7 @@ lightSample.dist = d;
|
|
|
411
411
|
lightSample.pdf = 1.0;
|
|
412
412
|
lightSample.isDelta = true;
|
|
413
413
|
} else {
|
|
414
|
-
d =
|
|
414
|
+
d = hx(light.radius, light.position, r);
|
|
415
415
|
lightSample.isDelta = false;
|
|
416
416
|
}
|
|
417
417
|
if (d < 0.) {
|
|
@@ -436,9 +436,9 @@ lightSample.emission = light.radius <= 0.0
|
|
|
436
436
|
#ifdef HAS_SPOT_LIGHTS
|
|
437
437
|
if (type == SPOT_LIGHT) {
|
|
438
438
|
if (light.radius <= 0.0) {
|
|
439
|
-
vec3
|
|
440
|
-
float projection = dot(
|
|
441
|
-
vec3 ba =
|
|
439
|
+
vec3 ko = light.position - r.o;
|
|
440
|
+
float projection = dot(ko, r.d);
|
|
441
|
+
vec3 ba = ko - projection * r.d;
|
|
442
442
|
if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
|
|
443
443
|
d = projection;
|
|
444
444
|
lightSample.direction = r.d;
|
|
@@ -447,13 +447,13 @@ lightSample.dist = d;
|
|
|
447
447
|
lightSample.pdf = 1.0;
|
|
448
448
|
lightSample.isDelta = true;
|
|
449
449
|
} else {
|
|
450
|
-
d =
|
|
450
|
+
d = hx(light.radius, light.position, r);
|
|
451
451
|
lightSample.isDelta = false;
|
|
452
452
|
}
|
|
453
453
|
if (d != INF) {
|
|
454
|
-
vec3
|
|
455
|
-
float
|
|
456
|
-
if (
|
|
454
|
+
vec3 ve = r.o + d * r.d;
|
|
455
|
+
float mB = bL(light, normalize(r.o - ve));
|
|
456
|
+
if (mB <= 0.0) return INF;
|
|
457
457
|
float aj = distance(r.o, light.position);
|
|
458
458
|
float cosThetaMax = aj <= light.radius
|
|
459
459
|
? -1.0
|
|
@@ -463,7 +463,7 @@ lightSample.pdf = aj <= light.radius
|
|
|
463
463
|
? INV4PI
|
|
464
464
|
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
465
465
|
}
|
|
466
|
-
lightSample.emission = light.emission *
|
|
466
|
+
lightSample.emission = light.emission * mB * (light.radius <= 0.0
|
|
467
467
|
? 1.0 / max(d * d, 1e-8)
|
|
468
468
|
: 1.0);
|
|
469
469
|
}
|
|
@@ -474,7 +474,7 @@ return d;
|
|
|
474
474
|
}
|
|
475
475
|
#endif
|
|
476
476
|
|
|
477
|
-
int
|
|
477
|
+
int fm(ivec4 m0, ivec4 m1, ivec4 m2, vec3 eK) {
|
|
478
478
|
vec2 m00 = ae(m0.x);
|
|
479
479
|
vec2 m01 = ae(m0.y);
|
|
480
480
|
vec2 m02 = ae(m0.z);
|
|
@@ -484,86 +484,92 @@ vec2 m12 = ae(m1.z);
|
|
|
484
484
|
vec2 m20 = ae(m2.x);
|
|
485
485
|
vec2 m21 = ae(m2.y);
|
|
486
486
|
vec2 m22 = ae(m2.z);
|
|
487
|
-
float w00 = m00.y *
|
|
488
|
-
float w01 = m01.y *
|
|
489
|
-
float w02 = m02.y *
|
|
490
|
-
float w10 = m10.y *
|
|
491
|
-
float w11 = m11.y *
|
|
492
|
-
float w12 = m12.y *
|
|
493
|
-
float w20 = m20.y *
|
|
494
|
-
float w21 = m21.y *
|
|
495
|
-
float w22 = m22.y *
|
|
496
|
-
|
|
497
|
-
float
|
|
498
|
-
|
|
499
|
-
w00 = w00 /
|
|
500
|
-
w01 = w01 /
|
|
501
|
-
w02 = w02 /
|
|
502
|
-
w10 = w10 /
|
|
503
|
-
w11 = w11 /
|
|
504
|
-
w12 = w12 /
|
|
505
|
-
w20 = w20 /
|
|
506
|
-
w21 = w21 /
|
|
507
|
-
w22 = w22 /
|
|
487
|
+
float w00 = m00.y * eK.x;
|
|
488
|
+
float w01 = m01.y * eK.x;
|
|
489
|
+
float w02 = m02.y * eK.x;
|
|
490
|
+
float w10 = m10.y * eK.y;
|
|
491
|
+
float w11 = m11.y * eK.y;
|
|
492
|
+
float w12 = m12.y * eK.y;
|
|
493
|
+
float w20 = m20.y * eK.z;
|
|
494
|
+
float w21 = m21.y * eK.z;
|
|
495
|
+
float w22 = m22.y * eK.z;
|
|
496
|
+
|
|
497
|
+
float hk = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
498
|
+
|
|
499
|
+
w00 = w00 / hk;
|
|
500
|
+
w01 = w01 / hk + w00;
|
|
501
|
+
w02 = w02 / hk + w01;
|
|
502
|
+
w10 = w10 / hk + w02;
|
|
503
|
+
w11 = w11 / hk + w10;
|
|
504
|
+
w12 = w12 / hk + w11;
|
|
505
|
+
w20 = w20 / hk + w12;
|
|
506
|
+
w21 = w21 / hk + w20;
|
|
507
|
+
w22 = w22 / hk + w21;
|
|
508
508
|
|
|
509
509
|
float rand = eo(0u);
|
|
510
|
-
float
|
|
510
|
+
float ni;
|
|
511
511
|
if (rand < w00) {
|
|
512
|
-
|
|
512
|
+
ni = m00.x;
|
|
513
513
|
} else if (rand < w01) {
|
|
514
|
-
|
|
514
|
+
ni = m01.x;
|
|
515
515
|
} else if (rand < w02) {
|
|
516
|
-
|
|
516
|
+
ni = m02.x;
|
|
517
517
|
} else if (rand < w10) {
|
|
518
|
-
|
|
518
|
+
ni = m10.x;
|
|
519
519
|
} else if (rand < w11) {
|
|
520
|
-
|
|
520
|
+
ni = m11.x;
|
|
521
521
|
} else if (rand < w12) {
|
|
522
|
-
|
|
522
|
+
ni = m12.x;
|
|
523
523
|
} else if (rand < w20) {
|
|
524
|
-
|
|
524
|
+
ni = m20.x;
|
|
525
525
|
} else if (rand < w21) {
|
|
526
|
-
|
|
526
|
+
ni = m21.x;
|
|
527
527
|
} else {
|
|
528
|
-
|
|
528
|
+
ni = m22.x;
|
|
529
529
|
}
|
|
530
|
-
return int(
|
|
530
|
+
return int(ni);
|
|
531
531
|
}
|
|
532
532
|
|
|
533
533
|
|
|
534
534
|
vec4 bv(int i);
|
|
535
535
|
|
|
536
536
|
|
|
537
|
-
mat2x3
|
|
538
|
-
float determinant =
|
|
539
|
-
vec3 t =
|
|
537
|
+
mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2 oc, vec2 od, vec4 aT) {
|
|
538
|
+
float determinant = oc.x * od.y - oc.y * od.x;
|
|
539
|
+
vec3 t = aT.xyz;
|
|
540
540
|
vec3 b = vec3(0.0);
|
|
541
541
|
|
|
542
|
-
float
|
|
542
|
+
float qC = abs(aT.w) > 1.5 ? 0.0 : aT.w;
|
|
543
543
|
if (abs(determinant) > 1e-12) {
|
|
544
|
-
vec3 dt = (dp1 *
|
|
545
|
-
vec3 db = (dp2 *
|
|
544
|
+
vec3 dt = (dp1 * od.y - dp2 * oc.y) / determinant;
|
|
545
|
+
vec3 db = (dp2 * oc.x - dp1 * od.x) / determinant;
|
|
546
546
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
547
|
-
if (
|
|
547
|
+
if (qC == 0.0) { qC = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
548
548
|
}
|
|
549
549
|
t -= normal * dot(normal, t);
|
|
550
550
|
if (dot(t, t) < 1e-8) {
|
|
551
|
-
float
|
|
552
|
-
float dW = -1.0 / (
|
|
551
|
+
float ik = (normal.z >= 0.0 ? 1.0 : -1.0);
|
|
552
|
+
float dW = -1.0 / (ik + normal.z);
|
|
553
553
|
float xy = normal.x * normal.y * dW;
|
|
554
|
-
t = vec3(1.0 +
|
|
555
|
-
b = vec3(xy,
|
|
554
|
+
t = vec3(1.0 + ik * normal.x * normal.x * dW, ik * xy, -ik * normal.x);
|
|
555
|
+
b = vec3(xy, ik + normal.y * normal.y * dW, -normal.y);
|
|
556
556
|
}
|
|
557
557
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
558
|
-
return mat2x3(t, b * (
|
|
558
|
+
return mat2x3(t, b * (qC < 0.0 ? -1.0 : 1.0));
|
|
559
559
|
}
|
|
560
560
|
|
|
561
|
-
void
|
|
561
|
+
void ht(inout ad si, fB tri, vec3 barycentric, ivec3 index) {
|
|
562
562
|
si.hit = true;
|
|
563
563
|
si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
564
|
-
ivec2 i0 =
|
|
565
|
-
ivec2 i1 =
|
|
566
|
-
ivec2 i2 =
|
|
564
|
+
ivec2 i0 = gR(index.x, vertexColumns);
|
|
565
|
+
ivec2 i1 = gR(index.y, vertexColumns);
|
|
566
|
+
ivec2 i2 = gR(index.z, vertexColumns);
|
|
567
|
+
si.vertexColor = vec3(1.0);
|
|
568
|
+
#ifdef USE_VERTEX_COLOR
|
|
569
|
+
si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
|
|
570
|
+
+ barycentric.y * texelFetch(colorBuffer, i1, 0).rgb
|
|
571
|
+
+ barycentric.z * texelFetch(colorBuffer, i2, 0).rgb;
|
|
572
|
+
#endif
|
|
567
573
|
|
|
568
574
|
vec3 n0 = texelFetch(normalBuffer, i0, 0).xyz;
|
|
569
575
|
vec3 n1 = texelFetch(normalBuffer, i1, 0).xyz;
|
|
@@ -576,14 +582,14 @@ si.vertexNormal = normal;
|
|
|
576
582
|
|
|
577
583
|
|
|
578
584
|
vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
579
|
-
vec3
|
|
585
|
+
vec3 km = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
|
|
580
586
|
float a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
581
587
|
float b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
582
588
|
float c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
583
589
|
float h = a * barycentric.x * (barycentric.x - 1.0)
|
|
584
590
|
+ (a + b + c) * barycentric.x * barycentric.y
|
|
585
591
|
+ b * barycentric.y * (barycentric.y - 1.0);
|
|
586
|
-
if (dot(
|
|
592
|
+
if (dot(km, geometricNormal) > 0.0) {
|
|
587
593
|
float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
588
594
|
float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
589
595
|
float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -601,7 +607,7 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
|
|
|
601
607
|
h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
|
|
602
608
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
603
609
|
}
|
|
604
|
-
si.shadowOffset =
|
|
610
|
+
si.shadowOffset = km * h;
|
|
605
611
|
|
|
606
612
|
|
|
607
613
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
@@ -609,7 +615,7 @@ ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
|
609
615
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
610
616
|
|
|
611
617
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
612
|
-
si.materialIndex =
|
|
618
|
+
si.materialIndex = fm(m0, m1, m2, barycentric);
|
|
613
619
|
}
|
|
614
620
|
|
|
615
621
|
vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
@@ -624,67 +630,69 @@ vec2 cX = barycentric.x * secondaryUv0
|
|
|
624
630
|
+ barycentric.y * secondaryUv1
|
|
625
631
|
+ barycentric.z * secondaryUv2;
|
|
626
632
|
|
|
627
|
-
vec4
|
|
628
|
-
int uvProjection = int(
|
|
633
|
+
vec4 lL = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
634
|
+
int uvProjection = int(lL.r);
|
|
629
635
|
if (uvProjection > 0) {
|
|
630
|
-
uv =
|
|
636
|
+
uv = gI(uvProjection, si.position, normal, lL.zw);
|
|
631
637
|
cX = uv;
|
|
632
638
|
} else {
|
|
633
|
-
uv *=
|
|
634
|
-
cX *=
|
|
639
|
+
uv *= lL.zw;
|
|
640
|
+
cX *= lL.zw;
|
|
635
641
|
}
|
|
636
642
|
#else
|
|
637
643
|
vec2 uv = vec2(0.0);
|
|
638
644
|
vec2 cX = vec2(0.0);
|
|
639
645
|
#endif
|
|
640
646
|
|
|
641
|
-
#ifdef
|
|
647
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
642
648
|
si.coatNormal = normal;
|
|
643
|
-
|
|
649
|
+
#ifdef NUM_COAT_NORMAL_MAPS
|
|
650
|
+
float oU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
651
|
+
#endif
|
|
644
652
|
#endif
|
|
645
653
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
646
|
-
float
|
|
647
|
-
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 ||
|
|
648
|
-
#ifdef
|
|
649
|
-
||
|
|
654
|
+
float tm = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
655
|
+
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || tm != 0.0
|
|
656
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
657
|
+
|| fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
|
|
650
658
|
#endif
|
|
651
659
|
) {
|
|
652
660
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
653
661
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
654
|
-
vec4
|
|
662
|
+
vec4 aT = vec4(0.0);
|
|
655
663
|
#ifdef USE_TANGENT
|
|
656
|
-
|
|
664
|
+
aT = barycentric.x * texelFetch(tangentBuffer, i0, 0)
|
|
657
665
|
+ barycentric.y * texelFetch(tangentBuffer, i1, 0)
|
|
658
666
|
+ barycentric.z * texelFetch(tangentBuffer, i2, 0);
|
|
659
667
|
#endif
|
|
660
|
-
mat2x3
|
|
661
|
-
si.geometryTangent =
|
|
662
|
-
si.geometryBitangent =
|
|
663
|
-
mat2x3
|
|
668
|
+
mat2x3 eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
669
|
+
si.geometryTangent = eS[0];
|
|
670
|
+
si.geometryBitangent = eS[1];
|
|
671
|
+
mat2x3 fZ = eS;
|
|
664
672
|
#ifdef NUM_ANISOTROPY_MAPS
|
|
665
673
|
if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
|
|
666
674
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
667
675
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
668
676
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
669
|
-
|
|
677
|
+
fZ = eE(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
|
|
670
678
|
}
|
|
671
679
|
#endif
|
|
672
|
-
si.directionTangent =
|
|
673
|
-
si.directionBitangent =
|
|
674
|
-
#
|
|
675
|
-
if (
|
|
676
|
-
int
|
|
677
|
-
mat2x3
|
|
678
|
-
if (mapUvChannel[
|
|
680
|
+
si.directionTangent = fZ[0];
|
|
681
|
+
si.directionBitangent = fZ[1];
|
|
682
|
+
#if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
|
|
683
|
+
if (oU >= 0.0) {
|
|
684
|
+
int kC = int(oU);
|
|
685
|
+
mat2x3 mh = eS;
|
|
686
|
+
if (mapUvChannel[kC] > 0.5) {
|
|
679
687
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
680
688
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
681
689
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
682
|
-
|
|
683
|
-
|
|
690
|
+
mh = eE(normal, dp1, dp2, a-c, b-c,
|
|
691
|
+
aT.w == 0.0 ? vec4(0.0) : aT);
|
|
684
692
|
}
|
|
685
|
-
vec3 decoded = sampleMap(
|
|
686
|
-
vec3 mapped =
|
|
687
|
-
+
|
|
693
|
+
vec3 decoded = sampleMap(kC, getMapUvSet(kC, uv, cX)).rgb * 2.0 - 1.0;
|
|
694
|
+
vec3 mapped = mh[0] * decoded.x * directionMaterial.z
|
|
695
|
+
+ mh[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
688
696
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
689
697
|
}
|
|
690
698
|
#endif
|
|
@@ -702,52 +710,52 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
|
|
|
702
710
|
#if defined(NUM_NORMAL_MAPS)
|
|
703
711
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
704
712
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
705
|
-
vec2
|
|
706
|
-
vec2
|
|
707
|
-
si.normal =
|
|
708
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
713
|
+
vec2 oc = uv0 - uv2;
|
|
714
|
+
vec2 od = uv1 - uv2;
|
|
715
|
+
si.normal = ol(
|
|
716
|
+
si.materialIndex, uv, normal, dp1, dp2, oc, od
|
|
709
717
|
);
|
|
710
718
|
#else
|
|
711
719
|
si.normal = normal;
|
|
712
720
|
#endif
|
|
713
721
|
}
|
|
714
722
|
|
|
715
|
-
struct
|
|
723
|
+
struct eC {
|
|
716
724
|
float t;
|
|
717
725
|
vec3 barycentric;
|
|
718
726
|
};
|
|
719
727
|
|
|
720
728
|
vec4 dp(int i) {
|
|
721
|
-
return
|
|
729
|
+
return kG(bvhBuffer, i, bvhColumns);
|
|
722
730
|
}
|
|
723
731
|
|
|
724
732
|
vec4 bv(int i) {
|
|
725
|
-
return
|
|
733
|
+
return kG(instancesBuffer, i, instancesColumns);
|
|
726
734
|
}
|
|
727
735
|
|
|
728
736
|
|
|
729
737
|
|
|
730
|
-
uint
|
|
738
|
+
uint qT(uint value) {
|
|
731
739
|
value -= (value >> 1u) & 0x55555555u;
|
|
732
740
|
value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
|
|
733
741
|
value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
734
742
|
return (value * 0x01010101u) >> 24u;
|
|
735
743
|
}
|
|
736
744
|
|
|
737
|
-
vec4
|
|
745
|
+
vec4 fc(uint lU) {
|
|
738
746
|
return vec4(
|
|
739
|
-
float(
|
|
740
|
-
float((
|
|
741
|
-
float((
|
|
742
|
-
float(
|
|
747
|
+
float(lU & 0xffu),
|
|
748
|
+
float((lU >> 8u) & 0xffu),
|
|
749
|
+
float((lU >> 16u) & 0xffu),
|
|
750
|
+
float(lU >> 24u)
|
|
743
751
|
) / 255.0;
|
|
744
752
|
}
|
|
745
753
|
|
|
746
754
|
|
|
747
755
|
|
|
748
756
|
|
|
749
|
-
|
|
750
|
-
|
|
757
|
+
eC fM(vec3 o, vec3 d, fB tri, int ey, vec3 gQ, float tMax) {
|
|
758
|
+
eC ti;
|
|
751
759
|
|
|
752
760
|
|
|
753
761
|
vec3 p0t = tri.p0 - o;
|
|
@@ -766,9 +774,9 @@ p2t = p2t.zxy;
|
|
|
766
774
|
}
|
|
767
775
|
|
|
768
776
|
|
|
769
|
-
p0t.xy +=
|
|
770
|
-
p1t.xy +=
|
|
771
|
-
p2t.xy +=
|
|
777
|
+
p0t.xy += gQ.xy * p0t.z;
|
|
778
|
+
p1t.xy += gQ.xy * p1t.z;
|
|
779
|
+
p2t.xy += gQ.xy * p2t.z;
|
|
772
780
|
|
|
773
781
|
|
|
774
782
|
vec3 e = vec3(
|
|
@@ -778,9 +786,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
778
786
|
);
|
|
779
787
|
|
|
780
788
|
#ifdef DEPTH_QUERY_MODE
|
|
781
|
-
vec3
|
|
789
|
+
vec3 rE = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
782
790
|
+ abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
783
|
-
e = mix(e, vec3(0.0), lessThanEqual(abs(e),
|
|
791
|
+
e = mix(e, vec3(0.0), lessThanEqual(abs(e), rE * 1e-6));
|
|
784
792
|
#endif
|
|
785
793
|
|
|
786
794
|
|
|
@@ -793,19 +801,19 @@ float det = e.x + e.y + e.z;
|
|
|
793
801
|
if (det == 0.0) return ti;
|
|
794
802
|
#endif
|
|
795
803
|
|
|
796
|
-
p0t.z *=
|
|
797
|
-
p1t.z *=
|
|
798
|
-
p2t.z *=
|
|
799
|
-
float
|
|
804
|
+
p0t.z *= gQ.z;
|
|
805
|
+
p1t.z *= gQ.z;
|
|
806
|
+
p2t.z *= gQ.z;
|
|
807
|
+
float rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
800
808
|
|
|
801
809
|
|
|
802
|
-
if (abs(
|
|
810
|
+
if (abs(rn) > abs(tMax * det)) {
|
|
803
811
|
return ti;
|
|
804
812
|
}
|
|
805
813
|
|
|
806
|
-
float
|
|
807
|
-
ti.t =
|
|
808
|
-
ti.barycentric = e *
|
|
814
|
+
float sw = 1. / det;
|
|
815
|
+
ti.t = rn * sw;
|
|
816
|
+
ti.barycentric = e * sw;
|
|
809
817
|
|
|
810
818
|
return ti;
|
|
811
819
|
}
|
|
@@ -816,7 +824,7 @@ vec3 max;
|
|
|
816
824
|
};
|
|
817
825
|
|
|
818
826
|
|
|
819
|
-
vec3
|
|
827
|
+
vec3 fb(vec3 d) {
|
|
820
828
|
#ifdef DEPTH_QUERY_MODE
|
|
821
829
|
vec3 ap = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
|
|
822
830
|
return 1.0 / ap;
|
|
@@ -825,9 +833,9 @@ return 1.0 / d;
|
|
|
825
833
|
#endif
|
|
826
834
|
}
|
|
827
835
|
|
|
828
|
-
vec3
|
|
836
|
+
vec3 eZ(vec3 gE, vec3 o) {
|
|
829
837
|
#ifdef DEPTH_QUERY_MODE
|
|
830
|
-
return abs(
|
|
838
|
+
return abs(gE) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
831
839
|
#else
|
|
832
840
|
return vec3(0.0);
|
|
833
841
|
#endif
|
|
@@ -835,21 +843,21 @@ return vec3(0.0);
|
|
|
835
843
|
|
|
836
844
|
|
|
837
845
|
|
|
838
|
-
float cM(vec3 o, vec3 d, vec3
|
|
846
|
+
float cM(vec3 o, vec3 d, vec3 vK, vec3 vJ, float tMax) {
|
|
839
847
|
#ifdef DEPTH_QUERY_MODE
|
|
840
|
-
vec3
|
|
841
|
-
vec3
|
|
842
|
-
vec3
|
|
843
|
-
vec3 bJ =
|
|
848
|
+
vec3 gE = fb(d);
|
|
849
|
+
vec3 uR = (vK - o) * gE;
|
|
850
|
+
vec3 uS = (vJ - o) * gE;
|
|
851
|
+
vec3 bJ = eZ(gE, o);
|
|
844
852
|
#else
|
|
845
|
-
vec3
|
|
846
|
-
vec3
|
|
853
|
+
vec3 uR = (vK - o) / d;
|
|
854
|
+
vec3 uS = (vJ - o) / d;
|
|
847
855
|
vec3 bJ = vec3(0.0);
|
|
848
856
|
#endif
|
|
849
|
-
vec3
|
|
850
|
-
vec3
|
|
851
|
-
float t0 = max(
|
|
852
|
-
float t1 = min(
|
|
857
|
+
vec3 mK = min(uR, uS) - bJ;
|
|
858
|
+
vec3 rU = max(uR, uS) + bJ;
|
|
859
|
+
float t0 = max(mK.x, max(mK.y, mK.z));
|
|
860
|
+
float t1 = min(rU.x, min(rU.y, rU.z));
|
|
853
861
|
|
|
854
862
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
855
863
|
}
|
|
@@ -858,7 +866,7 @@ int maxDimension(vec3 v) {
|
|
|
858
866
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
859
867
|
}
|
|
860
868
|
|
|
861
|
-
vec3
|
|
869
|
+
vec3 mu(vec3 d, int ey) {
|
|
862
870
|
|
|
863
871
|
|
|
864
872
|
if (ey == 0) {
|
|
@@ -871,7 +879,7 @@ return vec3(-d.x, -d.y, 1.0) / d.z;
|
|
|
871
879
|
}
|
|
872
880
|
|
|
873
881
|
|
|
874
|
-
void
|
|
882
|
+
void cZ(in Ray ray, inout ad si, bool doubleSided) {
|
|
875
883
|
si.hit = false;
|
|
876
884
|
|
|
877
885
|
if (isEmptyScene) {
|
|
@@ -879,24 +887,24 @@ return;
|
|
|
879
887
|
}
|
|
880
888
|
|
|
881
889
|
int ey = maxDimension(abs(ray.d));
|
|
882
|
-
vec3
|
|
890
|
+
vec3 gQ = mu(ray.d, ey);
|
|
883
891
|
int ao;
|
|
884
892
|
|
|
885
893
|
${getBVHTraverseCode(glsl `
|
|
886
894
|
si.triangleIndex = triangleIndex;
|
|
887
|
-
|
|
888
|
-
|
|
895
|
+
lB = tri;
|
|
896
|
+
hB = faceNormal;
|
|
889
897
|
aB = hit.barycentric;
|
|
890
|
-
|
|
891
|
-
|
|
898
|
+
hw = index;
|
|
899
|
+
rb = true;
|
|
892
900
|
ao = cf;
|
|
893
901
|
`)}
|
|
894
902
|
|
|
895
|
-
if (
|
|
903
|
+
if (rb) {
|
|
896
904
|
si.instanceIndex = ao;
|
|
897
905
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
898
906
|
|
|
899
|
-
|
|
907
|
+
ht(si, lB, aB, hw);
|
|
900
908
|
mat4 l2w = mat4(
|
|
901
909
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
902
910
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -910,10 +918,10 @@ bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
|
910
918
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
911
919
|
);
|
|
912
920
|
mat3 aD = transpose(mat3(w2l));
|
|
913
|
-
si.faceNormal = normalize(aD *
|
|
921
|
+
si.faceNormal = normalize(aD * hB);
|
|
914
922
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
915
923
|
si.normal = normalize(aD * si.normal);
|
|
916
|
-
#ifdef
|
|
924
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
917
925
|
si.coatNormal = normalize(aD * si.coatNormal);
|
|
918
926
|
#endif
|
|
919
927
|
#ifdef USE_TANGENT
|
|
@@ -931,7 +939,7 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
931
939
|
}
|
|
932
940
|
|
|
933
941
|
|
|
934
|
-
void
|
|
942
|
+
void iM(in Ray ray, inout ad si, int instanceIndex, float maxDistance) {
|
|
935
943
|
si.hit = false;
|
|
936
944
|
|
|
937
945
|
if (isEmptyScene) {
|
|
@@ -940,16 +948,16 @@ return;
|
|
|
940
948
|
|
|
941
949
|
bool doubleSided = true;
|
|
942
950
|
int ey = maxDimension(abs(ray.d));
|
|
943
|
-
vec3
|
|
951
|
+
vec3 gQ = mu(ray.d, ey);
|
|
944
952
|
int ao;
|
|
945
953
|
|
|
946
954
|
${getBVHTraverseCode(glsl `
|
|
947
955
|
si.triangleIndex = triangleIndex;
|
|
948
|
-
|
|
949
|
-
|
|
956
|
+
lB = tri;
|
|
957
|
+
hB = faceNormal;
|
|
950
958
|
aB = hit.barycentric;
|
|
951
|
-
|
|
952
|
-
|
|
959
|
+
hw = index;
|
|
960
|
+
rb = true;
|
|
953
961
|
ao = cf;
|
|
954
962
|
`, glsl `
|
|
955
963
|
if (cf != instanceIndex) {
|
|
@@ -957,10 +965,10 @@ continue;
|
|
|
957
965
|
}
|
|
958
966
|
`, 'maxDistance')}
|
|
959
967
|
|
|
960
|
-
if (
|
|
968
|
+
if (rb) {
|
|
961
969
|
si.instanceIndex = ao;
|
|
962
970
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
963
|
-
|
|
971
|
+
ht(si, lB, aB, hw);
|
|
964
972
|
mat4 l2w = mat4(
|
|
965
973
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
966
974
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -974,10 +982,10 @@ bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
|
974
982
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
975
983
|
);
|
|
976
984
|
mat3 aD = transpose(mat3(w2l));
|
|
977
|
-
si.faceNormal = normalize(aD *
|
|
985
|
+
si.faceNormal = normalize(aD * hB);
|
|
978
986
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
979
987
|
si.normal = normalize(aD * si.normal);
|
|
980
|
-
#ifdef
|
|
988
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
981
989
|
si.coatNormal = normalize(aD * si.coatNormal);
|
|
982
990
|
#endif
|
|
983
991
|
#ifdef USE_TANGENT
|
|
@@ -994,7 +1002,7 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
994
1002
|
}
|
|
995
1003
|
}
|
|
996
1004
|
|
|
997
|
-
bool ex(in Ray ray, float lightDistance, int
|
|
1005
|
+
bool ex(in Ray ray, float lightDistance, int jL) {
|
|
998
1006
|
|
|
999
1007
|
if (isEmptyScene) {
|
|
1000
1008
|
return false;
|
|
@@ -1002,27 +1010,27 @@ return false;
|
|
|
1002
1010
|
|
|
1003
1011
|
bool doubleSided = true;
|
|
1004
1012
|
int ey = maxDimension(abs(ray.d));
|
|
1005
|
-
vec3
|
|
1013
|
+
vec3 gQ = mu(ray.d, ey);
|
|
1006
1014
|
|
|
1007
1015
|
${getBVHTraverseCode(glsl `
|
|
1008
1016
|
|
|
1009
1017
|
|
|
1010
|
-
bool
|
|
1018
|
+
bool jt = true;
|
|
1011
1019
|
vec3 barycentric = hit.barycentric;
|
|
1012
1020
|
vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
1013
1021
|
|
|
1014
|
-
if (
|
|
1022
|
+
if (jt) {
|
|
1015
1023
|
#ifdef HAS_ALPHA
|
|
1016
1024
|
int materialIndex = int(ae(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1017
|
-
ivec2 i0 =
|
|
1018
|
-
ivec2 i1 =
|
|
1019
|
-
ivec2 i2 =
|
|
1025
|
+
ivec2 i0 = gR(index.x, vertexColumns);
|
|
1026
|
+
ivec2 i1 = gR(index.y, vertexColumns);
|
|
1027
|
+
ivec2 i2 = gR(index.z, vertexColumns);
|
|
1020
1028
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1021
1029
|
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1022
1030
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
1023
1031
|
|
|
1024
1032
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1025
|
-
materialIndex =
|
|
1033
|
+
materialIndex = fm(m0, m1, m2, barycentric);
|
|
1026
1034
|
}
|
|
1027
1035
|
|
|
1028
1036
|
int ii = materialIndex * MAT_DATA_SIZE;
|
|
@@ -1036,12 +1044,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1036
1044
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1037
1045
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1038
1046
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1039
|
-
vec4
|
|
1040
|
-
int uvProjection = int(
|
|
1047
|
+
vec4 lL = fetchMatData(ii + MAT_ROW_UV);
|
|
1048
|
+
int uvProjection = int(lL.r);
|
|
1041
1049
|
if (uvProjection > 0) {
|
|
1042
|
-
uv =
|
|
1050
|
+
uv = gI(uvProjection, position, hB, lL.zw);
|
|
1043
1051
|
} else {
|
|
1044
|
-
uv *=
|
|
1052
|
+
uv *= lL.zw;
|
|
1045
1053
|
}
|
|
1046
1054
|
|
|
1047
1055
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1055,32 +1063,32 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1055
1063
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1056
1064
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1057
1065
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1058
|
-
vec4
|
|
1059
|
-
int uvProjection = int(
|
|
1066
|
+
vec4 lL = fetchMatData(ii + MAT_ROW_UV);
|
|
1067
|
+
int uvProjection = int(lL.r);
|
|
1060
1068
|
if (uvProjection > 0) {
|
|
1061
|
-
uv =
|
|
1069
|
+
uv = gI(uvProjection, position, hB, lL.zw);
|
|
1062
1070
|
} else {
|
|
1063
|
-
uv *=
|
|
1071
|
+
uv *= lL.zw;
|
|
1064
1072
|
}
|
|
1065
1073
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1066
1074
|
}
|
|
1067
1075
|
#endif
|
|
1068
1076
|
float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
|
|
1069
|
-
alpha =
|
|
1077
|
+
alpha = lr(
|
|
1070
1078
|
alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
|
|
1071
1079
|
);
|
|
1072
1080
|
if (eo(0u) > alpha) {
|
|
1073
1081
|
|
|
1074
1082
|
tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1075
|
-
|
|
1083
|
+
jt = false;
|
|
1076
1084
|
}
|
|
1077
1085
|
#endif
|
|
1078
1086
|
}
|
|
1079
|
-
if (
|
|
1087
|
+
if (jt) {
|
|
1080
1088
|
return true;
|
|
1081
1089
|
}
|
|
1082
1090
|
`, glsl `
|
|
1083
|
-
if (triangleIndex ==
|
|
1091
|
+
if (triangleIndex == jL) {
|
|
1084
1092
|
continue;
|
|
1085
1093
|
}
|
|
1086
1094
|
`, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}
|