@d5techs/3dgs-lib 1.4.57 → 1.4.58

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/3dgs-lib.cjs CHANGED
@@ -2238,40 +2238,36 @@ fn dirToUv(d: vec3<f32>) -> vec2<f32> {
2238
2238
 
2239
2239
  @fragment fn fs(i: V) -> @location(0) vec4<f32> {
2240
2240
  let d = normalize(i.dir);
2241
- let camY = u.extra.x;
2242
- let sphereR = u.extra.y;
2241
+ let camH = u.extra.x;
2242
+ let projR = u.extra.y;
2243
2243
 
2244
- // --- sky UV (always computed) ---
2244
+ // --- sky UV (always computed for uniform control flow) ---
2245
2245
  let skyUv = dirToUv(d);
2246
2246
 
2247
- // --- ground projection (always computed for uniform control flow) ---
2248
- // Ray from camera (0, camY, 0) in direction d hits plane y=0 at t
2247
+ // --- flat ground projection ---
2248
+ // Ray from camera at height camH above ground, direction d,
2249
+ // hits ground plane at t = -camH / d.y
2249
2250
  let dyClamped = min(d.y, -0.0001);
2250
- let t = -camY / dyClamped;
2251
+ let t = -camH / dyClamped;
2251
2252
  let hitX = t * d.x;
2252
2253
  let hitZ = t * d.z;
2253
2254
  let hitDist = sqrt(hitX * hitX + hitZ * hitZ);
2254
2255
 
2255
- // Project the ground hit point back onto a sphere of radius R
2256
- // centered at the camera projection on y=0 (i.e. center = origin).
2257
- // For points beyond R, fade to horizon sampling.
2258
- let ratio = min(hitDist, sphereR) / max(hitDist, 0.001);
2259
- let pX = hitX * ratio;
2260
- let pZ = hitZ * ratio;
2261
- let pY = -sqrt(max(sphereR * sphereR - pX * pX - pZ * pZ, 0.0));
2262
- let groundDir = normalize(vec3(pX, pY, pZ));
2256
+ // Reconstruct a sampling direction as if looking from HDR capture
2257
+ // height (1.7m) straight down at the hit point FLAT ground
2258
+ let captureH = 1.7;
2259
+ let groundDir = normalize(vec3(hitX, -captureH, hitZ));
2263
2260
  let groundUv = dirToUv(groundDir);
2264
2261
 
2265
- // --- sample both (unconditional = uniform control flow) ---
2262
+ // --- sample both unconditionally (uniform control flow) ---
2266
2263
  let skyColor = textureSample(envTexture, envSampler, skyUv).rgb;
2267
2264
  let groundColor = textureSample(envTexture, envSampler, groundUv).rgb;
2268
2265
 
2269
2266
  // Blend: smooth transition near horizon
2270
- // step(0.01, camY) disables ground projection when camera is at/below ground
2271
- let groundFactor = smoothstep(0.01, -0.15, d.y) * step(0.01, camY);
2272
- // Fade out ground color at the sphere edge to avoid hard seam
2273
- let edgeFade = 1.0 - smoothstep(sphereR * 0.7, sphereR * 0.99, hitDist);
2274
- let finalBlend = groundFactor * edgeFade;
2267
+ let horizonBlend = smoothstep(0.0, -0.12, d.y);
2268
+ let aboveGround = step(0.01, camH);
2269
+ let edgeFade = 1.0 - smoothstep(projR * 0.6, projR, hitDist);
2270
+ let finalBlend = horizonBlend * aboveGround * edgeFade;
2275
2271
  let c = mix(skyColor, groundColor, finalBlend);
2276
2272
 
2277
2273
  // Reinhard tone mapping + gamma
@@ -19081,9 +19077,7 @@ class App {
19081
19077
  const bbox = gsRenderer2.getBoundingBox();
19082
19078
  if (bbox) {
19083
19079
  const m = gsRenderer2.getModelMatrix();
19084
- const minLocalY = bbox.center[1] - bbox.radius;
19085
- groundY = minLocalY * m[5] + bbox.center[1] * (m[5] - m[5]) + m[13];
19086
- groundY = (bbox.center[1] - bbox.radius) * m[5] + m[13];
19080
+ groundY = m[5] * bbox.min[1] + m[13];
19087
19081
  }
19088
19082
  }
19089
19083
  this.skyboxRenderer.prepareFrame(