@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.
Files changed (63) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/package.json +1 -1
  3. package/samples/terrain/from_image_2.js +2 -10
  4. package/src/engine/asset/loaders/image/ImageDecoderWorker.js +1 -1
  5. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
  6. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +6 -1
  7. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +1 -99
  8. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +1 -1
  9. package/src/engine/asset/loaders/image/png/PNGReader.js +31 -420
  10. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts +12 -0
  11. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -0
  12. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +53 -0
  13. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts +10 -0
  14. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -0
  15. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +42 -0
  16. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts +18 -0
  17. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts.map +1 -0
  18. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.js +59 -0
  19. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts +17 -0
  20. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -0
  21. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +55 -0
  22. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts +17 -0
  23. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts.map +1 -0
  24. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.js +74 -0
  25. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts +15 -0
  26. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -0
  27. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +34 -0
  28. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts +16 -0
  29. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -0
  30. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +46 -0
  31. package/src/engine/asset/loaders/image/png/inflate.d.ts +7 -0
  32. package/src/engine/asset/loaders/image/png/inflate.d.ts.map +1 -0
  33. package/src/engine/asset/loaders/image/png/inflate.js +20 -0
  34. package/src/engine/ecs/terrain/ecs/Terrain.js +1 -1
  35. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
  36. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +32 -9
  37. package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +202 -8
  38. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.d.ts +10 -0
  39. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.d.ts.map +1 -0
  40. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.js +418 -0
  41. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.d.ts +14 -0
  42. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.d.ts.map +1 -0
  43. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.js +757 -0
  44. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.d.ts +13 -0
  45. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.d.ts.map +1 -0
  46. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.js +380 -0
  47. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.d.ts +6 -0
  48. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.d.ts.map +1 -0
  49. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.js +406 -0
  50. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.d.ts.map +1 -1
  51. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js +8 -1
  52. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts +14 -0
  53. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts.map +1 -0
  54. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.js +356 -0
  55. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.d.ts.map +1 -1
  56. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.js +4 -1
  57. package/src/engine/graphics/shaders/TerrainShader.js +2 -2
  58. package/src/engine/intelligence/mcts/MonteCarlo.d.ts +35 -4
  59. package/src/engine/intelligence/mcts/MonteCarlo.d.ts.map +1 -1
  60. package/src/engine/intelligence/mcts/MonteCarlo.js +101 -31
  61. package/src/engine/intelligence/mcts/StateNode.d.ts +47 -24
  62. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  63. package/src/engine/intelligence/mcts/StateNode.js +364 -316
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Debug viz: outputs the reconstructed world-space surface normal as RGB
3
+ * (n*0.5+0.5). Same atlas / parallax math as ImpostorShaderLitV0 — this
4
+ * is the lit shader minus the lighting, so any wrongness visible here is
5
+ * mirrored 1:1 in the lit output.
6
+ *
7
+ * Same uniforms as ImpostorShaderV0.
8
+ */
9
+ export class ImpostorShaderNormalsV0 extends RawShaderMaterial {
10
+ constructor();
11
+ }
12
+ import { RawShaderMaterial } from "three";
13
+ //# sourceMappingURL=ImpostorShaderNormalsV0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImpostorShaderNormalsV0.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.js"],"names":[],"mappings":"AA+VA;;;;;;;GAOG;AACH;IACI,cAkBC;CACJ;kCAtXM,OAAO"}
@@ -0,0 +1,380 @@
1
+ import {
2
+ GLSL3,
3
+ NoBlending,
4
+ RawShaderMaterial,
5
+ Vector3
6
+ } from "three";
7
+
8
+ // Debug-viz variant: outputs the parallax-corrected world-space surface
9
+ // normal as RGB, mapped (-1..+1) -> (0..1). Use this side-by-side with
10
+ // the lit impostor to verify the atlas normal decode is producing the
11
+ // same normals the underlying mesh would.
12
+ //
13
+ // Same uniforms / card geometry as ImpostorShaderV0. Per-corner the atlas
14
+ // stores normals in bake-camera view space (see BakeShaderStandard.js), so
15
+ // we have to undo each frame's view rotation before blending — blending
16
+ // raw encoded bytes mixes incompatible bases.
17
+ //
18
+ // We grab modelMatrix in the fragment by declaring it explicitly: three.js
19
+ // auto-injects it in the vertex prefix but not fragment. WebGLRenderer.js
20
+ // still calls p_uniforms.setValue('modelMatrix', ...) every draw, so the
21
+ // declaration is enough to make it bind.
22
+ const shader_vx = `
23
+
24
+ in vec2 uv;
25
+ in vec3 position;
26
+
27
+ out vec2 vUv;
28
+ out vec3 vViewPos;
29
+
30
+ flat out vec2 vGridFloor;
31
+ flat out vec4 vWeights;
32
+
33
+ flat out vec3 vTangent;
34
+ flat out vec3 vBinormal;
35
+ flat out vec3 vNormal;
36
+
37
+ // Object-space corner-frame ray directions; the fragment shader uses
38
+ // each to rebuild that frame's bake basis and decode its atlas normal.
39
+ flat out vec3 vRay00;
40
+ flat out vec3 vRay10;
41
+ flat out vec3 vRay01;
42
+ flat out vec3 vRay11;
43
+
44
+ flat out vec4 vFrameXform00;
45
+ flat out vec4 vFrameXform10;
46
+ flat out vec4 vFrameXform01;
47
+ flat out vec4 vFrameXform11;
48
+
49
+ uniform mat4 modelViewMatrix;
50
+ uniform mat4 projectionMatrix;
51
+
52
+ uniform vec3 uOffset;
53
+ uniform float uRadius;
54
+ uniform float uFrames;
55
+ uniform bool uIsFullSphere;
56
+
57
+ vec2 VecToSphereOct(vec3 pivotToCamera)
58
+ {
59
+ vec3 octant = sign(pivotToCamera);
60
+ float sum = dot(pivotToCamera, octant);
61
+ vec3 octahedron = pivotToCamera / sum;
62
+ if (octahedron.y < 0.0) {
63
+ vec3 absolute = abs(octahedron);
64
+ octahedron.xz = octant.xz * vec2(1.0 - absolute.z, 1.0 - absolute.x);
65
+ }
66
+ return octahedron.xz;
67
+ }
68
+
69
+ vec2 VecToHemiSphereOct(vec3 v)
70
+ {
71
+ v.y = max(v.y, 0.001);
72
+ v = normalize(v);
73
+ vec3 octant = sign(v);
74
+ float sum = dot(v, octant);
75
+ vec3 octahedron = v / sum;
76
+ return vec2(
77
+ octahedron.x + octahedron.z,
78
+ octahedron.z - octahedron.x
79
+ );
80
+ }
81
+
82
+ vec2 VectorToGrid(vec3 v)
83
+ {
84
+ return uIsFullSphere ? VecToSphereOct(v) : VecToHemiSphereOct(v);
85
+ }
86
+
87
+ vec3 OctaSphereDec(vec2 coord)
88
+ {
89
+ coord = (coord - 0.5) * 2.0;
90
+ vec3 p = vec3(coord.x, 0.0, coord.y);
91
+ vec2 a = abs(p.xz);
92
+ p.y = 1.0 - a.x - a.y;
93
+ if (p.y < 0.0) {
94
+ p.xz = sign(p.xz) * vec2(1.0 - a.y, 1.0 - a.x);
95
+ }
96
+ return p;
97
+ }
98
+
99
+ vec3 OctaHemiSphereDec(vec2 coord)
100
+ {
101
+ vec3 p = vec3(coord.x - coord.y, 0.0, -1.0 + coord.x + coord.y);
102
+ vec2 a = abs(p.xz);
103
+ p.y = 1.0 - a.x - a.y;
104
+ return p;
105
+ }
106
+
107
+ vec3 GridToVector(vec2 coord)
108
+ {
109
+ return uIsFullSphere ? OctaSphereDec(coord) : OctaHemiSphereDec(coord);
110
+ }
111
+
112
+ vec3 FrameToRay(vec2 frame, vec2 framesMinusOne)
113
+ {
114
+ vec2 f = clamp(frame / framesMinusOne, 0.0, 1.0);
115
+ return normalize(GridToVector(f));
116
+ }
117
+
118
+ vec4 ComputeFrameXform(vec3 D_frame, vec3 tangent_OS, vec3 binormal_OS)
119
+ {
120
+ vec3 D = abs(D_frame.y) > 0.99999
121
+ ? normalize(D_frame + vec3(0.0, 0.0, 0.0001))
122
+ : D_frame;
123
+ vec3 bake_right = normalize(cross(vec3(0.0, 1.0, 0.0), D));
124
+ vec3 bake_up = cross(D, bake_right);
125
+ return vec4(
126
+ dot(tangent_OS, bake_right),
127
+ dot(binormal_OS, bake_right),
128
+ dot(tangent_OS, bake_up),
129
+ dot(binormal_OS, bake_up)
130
+ );
131
+ }
132
+
133
+ vec4 BilinearWeights(vec2 frac_uv)
134
+ {
135
+ vec2 omuv = vec2(1.0) - frac_uv;
136
+ return vec4(
137
+ omuv.x * omuv.y,
138
+ frac_uv.x * omuv.y,
139
+ omuv.x * frac_uv.y,
140
+ frac_uv.x * frac_uv.y
141
+ );
142
+ }
143
+
144
+ void main() {
145
+ vUv = uv;
146
+
147
+ vec3 cameraPos_OS = (inverse(modelViewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
148
+ // Atlas lookup must be relative to the bounding-sphere centre
149
+ // (uOffset), since the bake's D_frame is measured from the centre,
150
+ // not from the object origin.
151
+ vec3 pivotToCameraRay = normalize(cameraPos_OS - uOffset);
152
+
153
+ vec2 framesMinusOne = vec2(uFrames - 1.0);
154
+ vec2 octahedral_uv = clamp(VectorToGrid(pivotToCameraRay) * 0.5 + 0.5, 0.0, 1.0);
155
+ vec2 grid = octahedral_uv * framesMinusOne;
156
+ vec2 gridFloor = min(floor(grid), framesMinusOne - 1.0);
157
+ vec4 weights = BilinearWeights(grid - gridFloor);
158
+
159
+ vGridFloor = gridFloor;
160
+ vWeights = weights;
161
+
162
+ vec3 ray00 = FrameToRay(gridFloor + vec2(0.0, 0.0), framesMinusOne);
163
+ vec3 ray10 = FrameToRay(gridFloor + vec2(1.0, 0.0), framesMinusOne);
164
+ vec3 ray01 = FrameToRay(gridFloor + vec2(0.0, 1.0), framesMinusOne);
165
+ vec3 ray11 = FrameToRay(gridFloor + vec2(1.0, 1.0), framesMinusOne);
166
+
167
+ vRay00 = ray00;
168
+ vRay10 = ray10;
169
+ vRay01 = ray01;
170
+ vRay11 = ray11;
171
+
172
+ vec3 projectedRay = normalize(
173
+ ray00 * weights.x +
174
+ ray10 * weights.y +
175
+ ray01 * weights.z +
176
+ ray11 * weights.w
177
+ );
178
+
179
+ vec3 normal_OS = projectedRay;
180
+ vec3 up_OS = abs(normal_OS.y) > 0.999
181
+ ? vec3(0.0, 0.0, -1.0)
182
+ : vec3(0.0, 1.0, 0.0);
183
+ vec3 tangent_OS = normalize(cross(up_OS, normal_OS));
184
+ vec3 binormal_OS = cross(normal_OS, tangent_OS);
185
+
186
+ float card_diameter = uRadius * 2.0;
187
+ vec3 pos_OS = uOffset
188
+ + position.x * card_diameter * tangent_OS
189
+ + position.y * card_diameter * binormal_OS;
190
+
191
+ vec4 mvPosition = modelViewMatrix * vec4(pos_OS, 1.0);
192
+ vViewPos = mvPosition.xyz;
193
+ gl_Position = projectionMatrix * mvPosition;
194
+
195
+ mat3 m3 = mat3(modelViewMatrix);
196
+ vTangent = normalize(m3 * tangent_OS);
197
+ vBinormal = normalize(m3 * binormal_OS);
198
+ vNormal = normalize(m3 * normal_OS);
199
+
200
+ vFrameXform00 = ComputeFrameXform(ray00, tangent_OS, binormal_OS);
201
+ vFrameXform10 = ComputeFrameXform(ray10, tangent_OS, binormal_OS);
202
+ vFrameXform01 = ComputeFrameXform(ray01, tangent_OS, binormal_OS);
203
+ vFrameXform11 = ComputeFrameXform(ray11, tangent_OS, binormal_OS);
204
+ }
205
+ `;
206
+ const shader_fg = `
207
+ precision highp float;
208
+ precision highp int;
209
+
210
+ in vec2 vUv;
211
+ in vec3 vViewPos;
212
+
213
+ flat in vec2 vGridFloor;
214
+ flat in vec4 vWeights;
215
+
216
+ flat in vec3 vTangent;
217
+ flat in vec3 vBinormal;
218
+ flat in vec3 vNormal;
219
+
220
+ flat in vec3 vRay00;
221
+ flat in vec3 vRay10;
222
+ flat in vec3 vRay01;
223
+ flat in vec3 vRay11;
224
+
225
+ flat in vec4 vFrameXform00;
226
+ flat in vec4 vFrameXform10;
227
+ flat in vec4 vFrameXform01;
228
+ flat in vec4 vFrameXform11;
229
+
230
+ out vec4 color_out;
231
+
232
+ // three.js auto-injects modelMatrix only in the vertex prefix. Declare
233
+ // it explicitly here so WebGLRenderer.js's unconditional setValue call
234
+ // finds the location and binds object.matrixWorld.
235
+ uniform mat4 modelMatrix;
236
+
237
+ uniform sampler2D tBase;
238
+ uniform sampler2D tGeometry;
239
+ uniform float uFrames;
240
+ uniform float uDepthScale;
241
+
242
+ vec2 apply_frame_xform(vec2 card_uv, vec4 xform)
243
+ {
244
+ vec2 c = card_uv - 0.5;
245
+ return vec2(
246
+ xform.x * c.x + xform.y * c.y,
247
+ xform.z * c.x + xform.w * c.y
248
+ ) + 0.5;
249
+ }
250
+
251
+ // Decode encoded RGB (bake-view-space normal) back to OBJECT space
252
+ // using the corner's D_frame direction. Mirrors BakeShaderStandard's
253
+ // encode side.
254
+ vec3 decode_normal_OS(vec3 encoded, vec3 D_frame_OS)
255
+ {
256
+ vec3 n_bv = encoded * 2.0 - 1.0;
257
+ vec3 D = abs(D_frame_OS.y) > 0.99999
258
+ ? normalize(D_frame_OS + vec3(0.0, 0.0, 0.0001))
259
+ : D_frame_OS;
260
+ vec3 bake_right = normalize(cross(vec3(0.0, 1.0, 0.0), D));
261
+ vec3 bake_up = cross(D, bake_right);
262
+ return bake_right * n_bv.x + bake_up * n_bv.y + D * n_bv.z;
263
+ }
264
+
265
+ void main() {
266
+ // Same parallax shift as V0 so the visualised normals correspond
267
+ // to the surface positions you actually see in the colour pass.
268
+ vec3 view_dir_view = normalize(-vViewPos);
269
+ vec3 view_dir = vec3(
270
+ dot(vTangent, view_dir_view),
271
+ dot(vBinormal, view_dir_view),
272
+ dot(vNormal, view_dir_view)
273
+ );
274
+
275
+ vec2 frame_size = vec2(1.0 / uFrames);
276
+ vec2 base_uv = vUv;
277
+
278
+ vec2 uv00 = clamp(apply_frame_xform(base_uv, vFrameXform00), 0.0, 1.0);
279
+ vec2 uv10 = clamp(apply_frame_xform(base_uv, vFrameXform10), 0.0, 1.0);
280
+ vec2 uv01 = clamp(apply_frame_xform(base_uv, vFrameXform01), 0.0, 1.0);
281
+ vec2 uv11 = clamp(apply_frame_xform(base_uv, vFrameXform11), 0.0, 1.0);
282
+
283
+ vec2 atlas_uv00 = (vGridFloor + vec2(0.0, 0.0) + uv00) * frame_size;
284
+ vec2 atlas_uv10 = (vGridFloor + vec2(1.0, 0.0) + uv10) * frame_size;
285
+ vec2 atlas_uv01 = (vGridFloor + vec2(0.0, 1.0) + uv01) * frame_size;
286
+ vec2 atlas_uv11 = (vGridFloor + vec2(1.0, 1.0) + uv11) * frame_size;
287
+
288
+ // Pass 1: parallax depth shift.
289
+ float d00 = texture(tGeometry, atlas_uv00).a;
290
+ float d10 = texture(tGeometry, atlas_uv10).a;
291
+ float d01 = texture(tGeometry, atlas_uv01).a;
292
+ float d11 = texture(tGeometry, atlas_uv11).a;
293
+ float blended_depth =
294
+ d00 * vWeights.x + d10 * vWeights.y +
295
+ d01 * vWeights.z + d11 * vWeights.w;
296
+
297
+ base_uv += (view_dir.xy / view_dir.z) * (blended_depth - 0.5) * uDepthScale;
298
+ base_uv = clamp(base_uv, 0.0, 1.0);
299
+
300
+ // Pass 2: resample at parallax-shifted UV.
301
+ uv00 = clamp(apply_frame_xform(base_uv, vFrameXform00), 0.0, 1.0);
302
+ uv10 = clamp(apply_frame_xform(base_uv, vFrameXform10), 0.0, 1.0);
303
+ uv01 = clamp(apply_frame_xform(base_uv, vFrameXform01), 0.0, 1.0);
304
+ uv11 = clamp(apply_frame_xform(base_uv, vFrameXform11), 0.0, 1.0);
305
+
306
+ atlas_uv00 = (vGridFloor + vec2(0.0, 0.0) + uv00) * frame_size;
307
+ atlas_uv10 = (vGridFloor + vec2(1.0, 0.0) + uv10) * frame_size;
308
+ atlas_uv01 = (vGridFloor + vec2(0.0, 1.0) + uv01) * frame_size;
309
+ atlas_uv11 = (vGridFloor + vec2(1.0, 1.0) + uv11) * frame_size;
310
+
311
+ vec4 b00 = texture(tBase, atlas_uv00);
312
+ vec4 b10 = texture(tBase, atlas_uv10);
313
+ vec4 b01 = texture(tBase, atlas_uv01);
314
+ vec4 b11 = texture(tBase, atlas_uv11);
315
+ vec4 albedo =
316
+ b00 * vWeights.x + b10 * vWeights.y +
317
+ b01 * vWeights.z + b11 * vWeights.w;
318
+
319
+ if (albedo.a <= 0.5) {
320
+ // Honour the same cutout silhouette as V0 — otherwise the viz
321
+ // would show garbage normals in the discarded margin.
322
+ discard;
323
+ }
324
+
325
+ // Per-corner decode in each frame's own bake basis, then blend in
326
+ // object space. (Blending the encoded RGB first would mix bases
327
+ // and skew the normal toward whichever frames happened to have
328
+ // their bake_right pointing similarly.)
329
+ vec4 g00 = texture(tGeometry, atlas_uv00);
330
+ vec4 g10 = texture(tGeometry, atlas_uv10);
331
+ vec4 g01 = texture(tGeometry, atlas_uv01);
332
+ vec4 g11 = texture(tGeometry, atlas_uv11);
333
+
334
+ vec3 n_OS_00 = decode_normal_OS(g00.rgb, vRay00);
335
+ vec3 n_OS_10 = decode_normal_OS(g10.rgb, vRay10);
336
+ vec3 n_OS_01 = decode_normal_OS(g01.rgb, vRay01);
337
+ vec3 n_OS_11 = decode_normal_OS(g11.rgb, vRay11);
338
+ vec3 normal_OS = normalize(
339
+ n_OS_00 * vWeights.x + n_OS_10 * vWeights.y +
340
+ n_OS_01 * vWeights.z + n_OS_11 * vWeights.w
341
+ );
342
+
343
+ // Object -> world. Ignoring scale (mat3(modelMatrix) is fine for
344
+ // rotation-only or uniform-scale impostors, which is the common
345
+ // case). Non-uniform scale would need the inverse-transpose.
346
+ vec3 normal_world = normalize(mat3(modelMatrix) * normal_OS);
347
+
348
+ color_out = vec4(normal_world * 0.5 + 0.5, 1.0);
349
+ }
350
+ `;
351
+
352
+ /**
353
+ * Debug viz: outputs the reconstructed world-space surface normal as RGB
354
+ * (n*0.5+0.5). Same atlas / parallax math as ImpostorShaderLitV0 — this
355
+ * is the lit shader minus the lighting, so any wrongness visible here is
356
+ * mirrored 1:1 in the lit output.
357
+ *
358
+ * Same uniforms as ImpostorShaderV0.
359
+ */
360
+ export class ImpostorShaderNormalsV0 extends RawShaderMaterial {
361
+ constructor() {
362
+ super({
363
+ fragmentShader: shader_fg,
364
+ vertexShader: shader_vx,
365
+ uniforms: {
366
+ tBase: { value: null },
367
+ tGeometry: { value: null },
368
+ tMaterial: { value: null },
369
+ uFrames: { value: 0 },
370
+ uRadius: { value: 0 },
371
+ uOffset: { value: new Vector3(0, 0, 0) },
372
+ uIsFullSphere: { value: false },
373
+ uDepthScale: { value: 0.5 }
374
+ },
375
+ glslVersion: GLSL3
376
+ });
377
+
378
+ this.blending = NoBlending;
379
+ }
380
+ }
@@ -0,0 +1,6 @@
1
+ export class ImpostorShaderPerPixelV0 extends RawShaderMaterial {
2
+ constructor();
3
+ blendSrc: import("three").BlendingDstFactor;
4
+ }
5
+ import { RawShaderMaterial } from "three";
6
+ //# sourceMappingURL=ImpostorShaderPerPixelV0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImpostorShaderPerPixelV0.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.js"],"names":[],"mappings":"AA8WA;IACI,cAqCC;IAFG,4CAAyB;CAGhC;kCA7YM,OAAO"}