@d5techs/3dgs-lib 1.4.66 → 1.4.67

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
@@ -2239,31 +2239,23 @@ fn dirToUv(d: vec3<f32>) -> vec2<f32> {
2239
2239
  @fragment fn fs(i: V) -> @location(0) vec4<f32> {
2240
2240
  let d = normalize(i.dir);
2241
2241
  let cx = u.cam.x;
2242
- let cy = u.cam.y;
2242
+ let cy = max(u.cam.y, 0.1);
2243
2243
  let cz = u.cam.z;
2244
- let captureH = u.cam.w;
2244
+ let R = u.cam.w;
2245
2245
 
2246
- // --- sky: sample HDR with original direction ---
2247
- let skyUv = dirToUv(d);
2246
+ // Ray-sphere intersection: camera at (cx, cy, cz), sphere radius R at origin
2247
+ let origin = vec3(cx, cy, cz);
2248
+ let halfB = dot(origin, d);
2249
+ let cVal = dot(origin, origin) - R * R;
2250
+ let disc = halfB * halfB - cVal;
2248
2251
 
2249
- // --- ground: ray→plane at Y=0, then map hit point to HDR direction ---
2250
- let dyClamped = min(d.y, -0.0001);
2251
- let t = -cy / dyClamped;
2252
- let hitX = cx + t * d.x;
2253
- let hitZ = cz + t * d.z;
2252
+ // Far intersection (camera is inside sphere)
2253
+ let t = -halfB + sqrt(max(disc, 0.0));
2254
+ let hitPoint = origin + t * d;
2255
+ let sampleDir = normalize(hitPoint);
2254
2256
 
2255
- // Direction from virtual capture point (0, captureH, 0) to ground hit point
2256
- let groundDir = normalize(vec3(hitX, -captureH, hitZ));
2257
- let groundUv = dirToUv(groundDir);
2258
-
2259
- // --- sample both (uniform control flow) ---
2260
- let skyColor = textureSample(envTexture, envSampler, skyUv).rgb;
2261
- let groundColor = textureSample(envTexture, envSampler, groundUv).rgb;
2262
-
2263
- // Sharp blend at horizon, no edge fade needed
2264
- let horizonBlend = smoothstep(0.002, -0.002, d.y);
2265
- let aboveGround = step(0.01, cy);
2266
- let c = mix(skyColor, groundColor, horizonBlend * aboveGround);
2257
+ let uv = dirToUv(sampleDir);
2258
+ let c = textureSample(envTexture, envSampler, uv).rgb;
2267
2259
 
2268
2260
  // Reinhard tone mapping + gamma
2269
2261
  let mapped = c / (c + vec3(1.));
@@ -19088,7 +19080,8 @@ class App {
19088
19080
  );
19089
19081
  }
19090
19082
  const camH = cam[1] - groundLevel;
19091
- this.skyboxRenderer.groundRadius = 50;
19083
+ const camDist = Math.sqrt(cam[0] * cam[0] + camH * camH + cam[2] * cam[2]);
19084
+ this.skyboxRenderer.groundRadius = Math.max(500, camDist + 200);
19092
19085
  this.skyboxRenderer.prepareFrame(
19093
19086
  this.camera.viewMatrix,
19094
19087
  this.camera.projectionMatrix,