@woosh/meep-engine 2.138.13 → 2.138.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-image-decoder.js +1 -1
- package/package.json +1 -1
- package/samples/terrain/from_image_2.js +2 -10
- package/src/engine/asset/loaders/image/ImageDecoderWorker.js +1 -1
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +6 -1
- package/src/engine/asset/loaders/image/png/PNGReader.d.ts +1 -99
- package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/png/PNGReader.js +31 -420
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts +12 -0
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +53 -0
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts +10 -0
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +42 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts +18 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.js +59 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts +17 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +55 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts +17 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.js +74 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts +15 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +34 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts +16 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +46 -0
- package/src/engine/asset/loaders/image/png/inflate.d.ts +7 -0
- package/src/engine/asset/loaders/image/png/inflate.d.ts.map +1 -0
- package/src/engine/asset/loaders/image/png/inflate.js +20 -0
- package/src/engine/ecs/terrain/ecs/Terrain.js +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +32 -9
- package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +202 -8
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.d.ts +10 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.d.ts.map +1 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.js +418 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.d.ts +14 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.d.ts.map +1 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.js +757 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.d.ts +13 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.d.ts.map +1 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.js +380 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.d.ts +6 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.d.ts.map +1 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.js +406 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.d.ts.map +1 -1
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js +8 -1
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts +14 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts.map +1 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.js +356 -0
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.d.ts.map +1 -1
- package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.js +4 -1
- package/src/engine/graphics/shaders/TerrainShader.js +2 -2
- package/src/engine/intelligence/mcts/MonteCarlo.d.ts +35 -4
- package/src/engine/intelligence/mcts/MonteCarlo.d.ts.map +1 -1
- package/src/engine/intelligence/mcts/MonteCarlo.js +101 -31
- package/src/engine/intelligence/mcts/StateNode.d.ts +47 -24
- package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
- package/src/engine/intelligence/mcts/StateNode.js +364 -316
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AddEquation,
|
|
3
|
+
CustomBlending,
|
|
4
|
+
GLSL3,
|
|
5
|
+
OneFactor,
|
|
6
|
+
OneMinusSrcAlphaFactor,
|
|
7
|
+
RawShaderMaterial,
|
|
8
|
+
Vector3
|
|
9
|
+
} from "three";
|
|
10
|
+
|
|
11
|
+
// Per-pixel variant of ImpostorShaderV0. The atlas projection (octahedral
|
|
12
|
+
// grid lookup, cell selection, bilinear weights, card TBN and per-frame UV
|
|
13
|
+
// transforms) is computed once per FRAGMENT instead of once per VERTEX.
|
|
14
|
+
//
|
|
15
|
+
// In V0 those quantities are flat varyings — they don't depend on the
|
|
16
|
+
// individual vertex anyway (they're a function of cameraPos_OS, which is
|
|
17
|
+
// constant across the card), so V0 computes them once at the vertex stage
|
|
18
|
+
// and forwards them. This version does the same math in the fragment
|
|
19
|
+
// shader. Visual output matches V0; the difference is purely where the
|
|
20
|
+
// work lands on the GPU.
|
|
21
|
+
//
|
|
22
|
+
// Same uniforms as V0 so they're swap-in compatible.
|
|
23
|
+
const shader_vx = `
|
|
24
|
+
|
|
25
|
+
in vec2 uv;
|
|
26
|
+
in vec3 position;
|
|
27
|
+
|
|
28
|
+
out vec2 vUv;
|
|
29
|
+
out vec3 vViewPos;
|
|
30
|
+
|
|
31
|
+
uniform mat4 modelViewMatrix;
|
|
32
|
+
uniform mat4 projectionMatrix;
|
|
33
|
+
|
|
34
|
+
uniform vec3 uOffset;
|
|
35
|
+
uniform float uRadius;
|
|
36
|
+
uniform float uFrames;
|
|
37
|
+
uniform bool uIsFullSphere;
|
|
38
|
+
|
|
39
|
+
vec2 VecToSphereOct(vec3 pivotToCamera)
|
|
40
|
+
{
|
|
41
|
+
vec3 octant = sign(pivotToCamera);
|
|
42
|
+
float sum = dot(pivotToCamera, octant);
|
|
43
|
+
vec3 octahedron = pivotToCamera / sum;
|
|
44
|
+
if (octahedron.y < 0.0) {
|
|
45
|
+
vec3 absolute = abs(octahedron);
|
|
46
|
+
octahedron.xz = octant.xz * vec2(1.0 - absolute.z, 1.0 - absolute.x);
|
|
47
|
+
}
|
|
48
|
+
return octahedron.xz;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
vec2 VecToHemiSphereOct(vec3 v)
|
|
52
|
+
{
|
|
53
|
+
v.y = max(v.y, 0.001);
|
|
54
|
+
v = normalize(v);
|
|
55
|
+
vec3 octant = sign(v);
|
|
56
|
+
float sum = dot(v, octant);
|
|
57
|
+
vec3 octahedron = v / sum;
|
|
58
|
+
return vec2(
|
|
59
|
+
octahedron.x + octahedron.z,
|
|
60
|
+
octahedron.z - octahedron.x
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
vec2 VectorToGrid(vec3 v)
|
|
65
|
+
{
|
|
66
|
+
return uIsFullSphere ? VecToSphereOct(v) : VecToHemiSphereOct(v);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
vec3 OctaSphereDec(vec2 coord)
|
|
70
|
+
{
|
|
71
|
+
coord = (coord - 0.5) * 2.0;
|
|
72
|
+
vec3 p = vec3(coord.x, 0.0, coord.y);
|
|
73
|
+
vec2 a = abs(p.xz);
|
|
74
|
+
p.y = 1.0 - a.x - a.y;
|
|
75
|
+
if (p.y < 0.0) {
|
|
76
|
+
p.xz = sign(p.xz) * vec2(1.0 - a.y, 1.0 - a.x);
|
|
77
|
+
}
|
|
78
|
+
return p;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
vec3 OctaHemiSphereDec(vec2 coord)
|
|
82
|
+
{
|
|
83
|
+
vec3 p = vec3(coord.x - coord.y, 0.0, -1.0 + coord.x + coord.y);
|
|
84
|
+
vec2 a = abs(p.xz);
|
|
85
|
+
p.y = 1.0 - a.x - a.y;
|
|
86
|
+
return p;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
vec3 GridToVector(vec2 coord)
|
|
90
|
+
{
|
|
91
|
+
return uIsFullSphere ? OctaSphereDec(coord) : OctaHemiSphereDec(coord);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
vec3 FrameToRay(vec2 frame, vec2 framesMinusOne)
|
|
95
|
+
{
|
|
96
|
+
vec2 f = clamp(frame / framesMinusOne, 0.0, 1.0);
|
|
97
|
+
return normalize(GridToVector(f));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
vec4 BilinearWeights(vec2 frac_uv)
|
|
101
|
+
{
|
|
102
|
+
vec2 omuv = vec2(1.0) - frac_uv;
|
|
103
|
+
return vec4(
|
|
104
|
+
omuv.x * omuv.y,
|
|
105
|
+
frac_uv.x * omuv.y,
|
|
106
|
+
omuv.x * frac_uv.y,
|
|
107
|
+
frac_uv.x * frac_uv.y
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
void main() {
|
|
112
|
+
vUv = uv;
|
|
113
|
+
|
|
114
|
+
// Same card-positioning math as V0. We still need to do this in
|
|
115
|
+
// the vertex shader — the gl_Position has to come from somewhere,
|
|
116
|
+
// and card orientation depends on cameraPos_OS regardless of
|
|
117
|
+
// whether we sample per-pixel later.
|
|
118
|
+
vec3 cameraPos_OS = (inverse(modelViewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
|
|
119
|
+
// Atlas lookup must be relative to the bounding-sphere centre
|
|
120
|
+
// (uOffset), since the bake's D_frame is measured from the centre,
|
|
121
|
+
// not from the object origin.
|
|
122
|
+
vec3 pivotToCameraRay = normalize(cameraPos_OS - uOffset);
|
|
123
|
+
|
|
124
|
+
vec2 framesMinusOne = vec2(uFrames - 1.0);
|
|
125
|
+
vec2 octahedral_uv = clamp(VectorToGrid(pivotToCameraRay) * 0.5 + 0.5, 0.0, 1.0);
|
|
126
|
+
vec2 grid = octahedral_uv * framesMinusOne;
|
|
127
|
+
vec2 gridFloor = min(floor(grid), framesMinusOne - 1.0);
|
|
128
|
+
vec4 weights = BilinearWeights(grid - gridFloor);
|
|
129
|
+
|
|
130
|
+
vec3 ray00 = FrameToRay(gridFloor + vec2(0.0, 0.0), framesMinusOne);
|
|
131
|
+
vec3 ray10 = FrameToRay(gridFloor + vec2(1.0, 0.0), framesMinusOne);
|
|
132
|
+
vec3 ray01 = FrameToRay(gridFloor + vec2(0.0, 1.0), framesMinusOne);
|
|
133
|
+
vec3 ray11 = FrameToRay(gridFloor + vec2(1.0, 1.0), framesMinusOne);
|
|
134
|
+
vec3 projectedRay = normalize(
|
|
135
|
+
ray00 * weights.x +
|
|
136
|
+
ray10 * weights.y +
|
|
137
|
+
ray01 * weights.z +
|
|
138
|
+
ray11 * weights.w
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
vec3 normal_OS = projectedRay;
|
|
142
|
+
vec3 up_OS = abs(normal_OS.y) > 0.999
|
|
143
|
+
? vec3(0.0, 0.0, -1.0)
|
|
144
|
+
: vec3(0.0, 1.0, 0.0);
|
|
145
|
+
vec3 tangent_OS = normalize(cross(up_OS, normal_OS));
|
|
146
|
+
vec3 binormal_OS = cross(normal_OS, tangent_OS);
|
|
147
|
+
|
|
148
|
+
float card_diameter = uRadius * 2.0;
|
|
149
|
+
vec3 pos_OS = uOffset
|
|
150
|
+
+ position.x * card_diameter * tangent_OS
|
|
151
|
+
+ position.y * card_diameter * binormal_OS;
|
|
152
|
+
|
|
153
|
+
vec4 mvPosition = modelViewMatrix * vec4(pos_OS, 1.0);
|
|
154
|
+
vViewPos = mvPosition.xyz;
|
|
155
|
+
gl_Position = projectionMatrix * mvPosition;
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
const shader_fg = `
|
|
159
|
+
precision highp float;
|
|
160
|
+
precision highp int;
|
|
161
|
+
|
|
162
|
+
in vec2 vUv;
|
|
163
|
+
in vec3 vViewPos;
|
|
164
|
+
|
|
165
|
+
out vec4 color_out;
|
|
166
|
+
|
|
167
|
+
uniform mat4 modelViewMatrix;
|
|
168
|
+
|
|
169
|
+
uniform sampler2D tBase;
|
|
170
|
+
uniform sampler2D tGeometry;
|
|
171
|
+
uniform float uFrames;
|
|
172
|
+
uniform float uDepthScale;
|
|
173
|
+
|
|
174
|
+
uniform vec3 uOffset;
|
|
175
|
+
uniform float uRadius;
|
|
176
|
+
uniform bool uIsFullSphere;
|
|
177
|
+
|
|
178
|
+
vec2 VecToSphereOct(vec3 pivotToCamera)
|
|
179
|
+
{
|
|
180
|
+
vec3 octant = sign(pivotToCamera);
|
|
181
|
+
float sum = dot(pivotToCamera, octant);
|
|
182
|
+
vec3 octahedron = pivotToCamera / sum;
|
|
183
|
+
if (octahedron.y < 0.0) {
|
|
184
|
+
vec3 absolute = abs(octahedron);
|
|
185
|
+
octahedron.xz = octant.xz * vec2(1.0 - absolute.z, 1.0 - absolute.x);
|
|
186
|
+
}
|
|
187
|
+
return octahedron.xz;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
vec2 VecToHemiSphereOct(vec3 v)
|
|
191
|
+
{
|
|
192
|
+
v.y = max(v.y, 0.001);
|
|
193
|
+
v = normalize(v);
|
|
194
|
+
vec3 octant = sign(v);
|
|
195
|
+
float sum = dot(v, octant);
|
|
196
|
+
vec3 octahedron = v / sum;
|
|
197
|
+
return vec2(
|
|
198
|
+
octahedron.x + octahedron.z,
|
|
199
|
+
octahedron.z - octahedron.x
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
vec2 VectorToGrid(vec3 v)
|
|
204
|
+
{
|
|
205
|
+
return uIsFullSphere ? VecToSphereOct(v) : VecToHemiSphereOct(v);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
vec3 OctaSphereDec(vec2 coord)
|
|
209
|
+
{
|
|
210
|
+
coord = (coord - 0.5) * 2.0;
|
|
211
|
+
vec3 p = vec3(coord.x, 0.0, coord.y);
|
|
212
|
+
vec2 a = abs(p.xz);
|
|
213
|
+
p.y = 1.0 - a.x - a.y;
|
|
214
|
+
if (p.y < 0.0) {
|
|
215
|
+
p.xz = sign(p.xz) * vec2(1.0 - a.y, 1.0 - a.x);
|
|
216
|
+
}
|
|
217
|
+
return p;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
vec3 OctaHemiSphereDec(vec2 coord)
|
|
221
|
+
{
|
|
222
|
+
vec3 p = vec3(coord.x - coord.y, 0.0, -1.0 + coord.x + coord.y);
|
|
223
|
+
vec2 a = abs(p.xz);
|
|
224
|
+
p.y = 1.0 - a.x - a.y;
|
|
225
|
+
return p;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
vec3 GridToVector(vec2 coord)
|
|
229
|
+
{
|
|
230
|
+
return uIsFullSphere ? OctaSphereDec(coord) : OctaHemiSphereDec(coord);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
vec3 FrameToRay(vec2 frame, vec2 framesMinusOne)
|
|
234
|
+
{
|
|
235
|
+
vec2 f = clamp(frame / framesMinusOne, 0.0, 1.0);
|
|
236
|
+
return normalize(GridToVector(f));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
vec4 ComputeFrameXform(vec3 D_frame, vec3 tangent_OS, vec3 binormal_OS)
|
|
240
|
+
{
|
|
241
|
+
vec3 D = abs(D_frame.y) > 0.99999
|
|
242
|
+
? normalize(D_frame + vec3(0.0, 0.0, 0.0001))
|
|
243
|
+
: D_frame;
|
|
244
|
+
vec3 bake_right = normalize(cross(vec3(0.0, 1.0, 0.0), D));
|
|
245
|
+
vec3 bake_up = cross(D, bake_right);
|
|
246
|
+
return vec4(
|
|
247
|
+
dot(tangent_OS, bake_right),
|
|
248
|
+
dot(binormal_OS, bake_right),
|
|
249
|
+
dot(tangent_OS, bake_up),
|
|
250
|
+
dot(binormal_OS, bake_up)
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
vec4 BilinearWeights(vec2 frac_uv)
|
|
255
|
+
{
|
|
256
|
+
vec2 omuv = vec2(1.0) - frac_uv;
|
|
257
|
+
return vec4(
|
|
258
|
+
omuv.x * omuv.y,
|
|
259
|
+
frac_uv.x * omuv.y,
|
|
260
|
+
omuv.x * frac_uv.y,
|
|
261
|
+
frac_uv.x * frac_uv.y
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
vec2 apply_frame_xform(vec2 card_uv, vec4 xform)
|
|
266
|
+
{
|
|
267
|
+
vec2 c = card_uv - 0.5;
|
|
268
|
+
return vec2(
|
|
269
|
+
xform.x * c.x + xform.y * c.y,
|
|
270
|
+
xform.z * c.x + xform.w * c.y
|
|
271
|
+
) + 0.5;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
vec4 blend_4_frames(
|
|
275
|
+
sampler2D tex, vec2 card_uv,
|
|
276
|
+
vec2 gridFloor, vec4 w,
|
|
277
|
+
vec4 x00, vec4 x10, vec4 x01, vec4 x11
|
|
278
|
+
) {
|
|
279
|
+
vec2 frame_size = vec2(1.0 / uFrames);
|
|
280
|
+
vec2 uv00 = clamp(apply_frame_xform(card_uv, x00), 0.0, 1.0);
|
|
281
|
+
vec2 uv10 = clamp(apply_frame_xform(card_uv, x10), 0.0, 1.0);
|
|
282
|
+
vec2 uv01 = clamp(apply_frame_xform(card_uv, x01), 0.0, 1.0);
|
|
283
|
+
vec2 uv11 = clamp(apply_frame_xform(card_uv, x11), 0.0, 1.0);
|
|
284
|
+
vec4 s00 = texture(tex, (gridFloor + vec2(0.0, 0.0) + uv00) * frame_size);
|
|
285
|
+
vec4 s10 = texture(tex, (gridFloor + vec2(1.0, 0.0) + uv10) * frame_size);
|
|
286
|
+
vec4 s01 = texture(tex, (gridFloor + vec2(0.0, 1.0) + uv01) * frame_size);
|
|
287
|
+
vec4 s11 = texture(tex, (gridFloor + vec2(1.0, 1.0) + uv11) * frame_size);
|
|
288
|
+
return s00 * w.x + s10 * w.y + s01 * w.z + s11 * w.w;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
void main() {
|
|
292
|
+
// ---- per-pixel projection ----
|
|
293
|
+
// Recompute everything V0 flat-varies. cameraPos_OS is constant
|
|
294
|
+
// per-card so the math gives identical results to V0 — this just
|
|
295
|
+
// demonstrates running the projection in the fragment.
|
|
296
|
+
vec3 cameraPos_OS = (inverse(modelViewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
|
|
297
|
+
// Atlas lookup must be relative to the bounding-sphere centre
|
|
298
|
+
// (uOffset), since the bake's D_frame is measured from the centre,
|
|
299
|
+
// not from the object origin.
|
|
300
|
+
vec3 pivotToCameraRay = normalize(cameraPos_OS - uOffset);
|
|
301
|
+
|
|
302
|
+
vec2 framesMinusOne = vec2(uFrames - 1.0);
|
|
303
|
+
vec2 octahedral_uv = clamp(VectorToGrid(pivotToCameraRay) * 0.5 + 0.5, 0.0, 1.0);
|
|
304
|
+
vec2 grid = octahedral_uv * framesMinusOne;
|
|
305
|
+
vec2 gridFloor = min(floor(grid), framesMinusOne - 1.0);
|
|
306
|
+
vec4 weights = BilinearWeights(grid - gridFloor);
|
|
307
|
+
|
|
308
|
+
vec3 ray00 = FrameToRay(gridFloor + vec2(0.0, 0.0), framesMinusOne);
|
|
309
|
+
vec3 ray10 = FrameToRay(gridFloor + vec2(1.0, 0.0), framesMinusOne);
|
|
310
|
+
vec3 ray01 = FrameToRay(gridFloor + vec2(0.0, 1.0), framesMinusOne);
|
|
311
|
+
vec3 ray11 = FrameToRay(gridFloor + vec2(1.0, 1.0), framesMinusOne);
|
|
312
|
+
vec3 projectedRay = normalize(
|
|
313
|
+
ray00 * weights.x +
|
|
314
|
+
ray10 * weights.y +
|
|
315
|
+
ray01 * weights.z +
|
|
316
|
+
ray11 * weights.w
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
vec3 normal_OS = projectedRay;
|
|
320
|
+
vec3 up_OS = abs(normal_OS.y) > 0.999
|
|
321
|
+
? vec3(0.0, 0.0, -1.0)
|
|
322
|
+
: vec3(0.0, 1.0, 0.0);
|
|
323
|
+
vec3 tangent_OS = normalize(cross(up_OS, normal_OS));
|
|
324
|
+
vec3 binormal_OS = cross(normal_OS, tangent_OS);
|
|
325
|
+
|
|
326
|
+
mat3 m3 = mat3(modelViewMatrix);
|
|
327
|
+
vec3 tangent_VS = normalize(m3 * tangent_OS);
|
|
328
|
+
vec3 binormal_VS = normalize(m3 * binormal_OS);
|
|
329
|
+
vec3 normal_VS = normalize(m3 * normal_OS);
|
|
330
|
+
|
|
331
|
+
vec4 xform00 = ComputeFrameXform(ray00, tangent_OS, binormal_OS);
|
|
332
|
+
vec4 xform10 = ComputeFrameXform(ray10, tangent_OS, binormal_OS);
|
|
333
|
+
vec4 xform01 = ComputeFrameXform(ray01, tangent_OS, binormal_OS);
|
|
334
|
+
vec4 xform11 = ComputeFrameXform(ray11, tangent_OS, binormal_OS);
|
|
335
|
+
|
|
336
|
+
// ---- same sampling/parallax as V0 ----
|
|
337
|
+
vec3 view_dir_view = normalize(-vViewPos);
|
|
338
|
+
vec3 view_dir = vec3(
|
|
339
|
+
dot(tangent_VS, view_dir_view),
|
|
340
|
+
dot(binormal_VS, view_dir_view),
|
|
341
|
+
dot(normal_VS, view_dir_view)
|
|
342
|
+
);
|
|
343
|
+
|
|
344
|
+
vec2 base_uv = vUv;
|
|
345
|
+
float depth = blend_4_frames(
|
|
346
|
+
tGeometry, base_uv,
|
|
347
|
+
gridFloor, weights,
|
|
348
|
+
xform00, xform10, xform01, xform11
|
|
349
|
+
).a;
|
|
350
|
+
base_uv += (view_dir.xy / view_dir.z) * (depth - 0.5) * uDepthScale;
|
|
351
|
+
base_uv = clamp(base_uv, 0.0, 1.0);
|
|
352
|
+
|
|
353
|
+
vec4 texel_color = blend_4_frames(
|
|
354
|
+
tBase, base_uv,
|
|
355
|
+
gridFloor, weights,
|
|
356
|
+
xform00, xform10, xform01, xform11
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
if (texel_color.a <= 0.5) {
|
|
360
|
+
discard;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
color_out = texel_color;
|
|
364
|
+
}
|
|
365
|
+
`;
|
|
366
|
+
|
|
367
|
+
export class ImpostorShaderPerPixelV0 extends RawShaderMaterial {
|
|
368
|
+
constructor() {
|
|
369
|
+
super({
|
|
370
|
+
fragmentShader: shader_fg,
|
|
371
|
+
vertexShader: shader_vx,
|
|
372
|
+
uniforms: {
|
|
373
|
+
tBase: {
|
|
374
|
+
value: null
|
|
375
|
+
},
|
|
376
|
+
tGeometry: {
|
|
377
|
+
value: null
|
|
378
|
+
},
|
|
379
|
+
tMaterial: {
|
|
380
|
+
value: null
|
|
381
|
+
},
|
|
382
|
+
uFrames: {
|
|
383
|
+
value: 0
|
|
384
|
+
},
|
|
385
|
+
uRadius: {
|
|
386
|
+
value: 0
|
|
387
|
+
},
|
|
388
|
+
uOffset: {
|
|
389
|
+
value: new Vector3(0, 0, 0)
|
|
390
|
+
},
|
|
391
|
+
uIsFullSphere: {
|
|
392
|
+
value: false
|
|
393
|
+
},
|
|
394
|
+
uDepthScale: {
|
|
395
|
+
value: 0.5
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
glslVersion: GLSL3
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
this.blending = CustomBlending;
|
|
402
|
+
this.blendEquation = AddEquation;
|
|
403
|
+
this.blendSrc = OneFactor;
|
|
404
|
+
this.blendDst = OneMinusSrcAlphaFactor;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImpostorShaderV0.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ImpostorShaderV0.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js"],"names":[],"mappings":"AAwZA;IACI,cAmEC;IAHG,4CAAyB;CAIhC;kCArdM,OAAO"}
|
|
@@ -193,7 +193,14 @@ const shader_vx = `
|
|
|
193
193
|
// the bake. The encoded direction is what picks which atlas
|
|
194
194
|
// frames we'll sample.
|
|
195
195
|
vec3 cameraPos_OS = (inverse(modelViewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
|
|
196
|
-
|
|
196
|
+
// Direction from the bounding-sphere CENTRE (uOffset) — not from
|
|
197
|
+
// the object origin — to the camera. The bake camera is placed at
|
|
198
|
+
// center + radius*D_frame and the atlas is indexed by that D_frame,
|
|
199
|
+
// so the runtime lookup must also be measured from the centre,
|
|
200
|
+
// otherwise any model whose centre isn't at the origin (i.e. most
|
|
201
|
+
// GLTFs) gets a biased octahedral lookup and ends up sampling the
|
|
202
|
+
// wrong atlas frames.
|
|
203
|
+
vec3 pivotToCameraRay = normalize(cameraPos_OS - uOffset);
|
|
197
204
|
|
|
198
205
|
vec2 framesMinusOne = vec2(uFrames - 1.0);
|
|
199
206
|
vec2 octahedral_uv = clamp(VectorToGrid(pivotToCameraRay) * 0.5 + 0.5, 0.0, 1.0);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug viz: outputs the parallax-corrected surface's viewport depth
|
|
3
|
+
* (gl_FragCoord.z-equivalent) as grayscale. Same parallax + atlas-decode
|
|
4
|
+
* math as ImpostorShaderLitV0 and ImpostorShaderDepthV0, so anything
|
|
5
|
+
* that looks off here is also driving the lit shader's shadow coord
|
|
6
|
+
* and the caster's gl_FragDepth.
|
|
7
|
+
*
|
|
8
|
+
* Same uniforms as ImpostorShaderV0.
|
|
9
|
+
*/
|
|
10
|
+
export class ImpostorShaderViewportDepthV0 extends RawShaderMaterial {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
import { RawShaderMaterial } from "three";
|
|
14
|
+
//# sourceMappingURL=ImpostorShaderViewportDepthV0.d.ts.map
|
package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpostorShaderViewportDepthV0.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.js"],"names":[],"mappings":"AAsUA;;;;;;;;GAQG;AACH;IACI,cAkBC;CACJ;kCA9VM,OAAO"}
|