@d5techs/3dgs-lib 1.4.60 → 1.4.61

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.js CHANGED
@@ -2215,7 +2215,7 @@ struct V { @builtin(position) pos: vec4<f32>, @location(0) dir: vec3<f32> };
2215
2215
  const EQUIRECT_WGSL = (
2216
2216
  /* wgsl */
2217
2217
  `
2218
- struct Uniforms { col0: vec4<f32>, col1: vec4<f32>, col2: vec4<f32>, extra: vec4<f32> };
2218
+ struct Uniforms { col0: vec4<f32>, col1: vec4<f32>, col2: vec4<f32>, cam: vec4<f32> };
2219
2219
  @group(0) @binding(0) var<uniform> u: Uniforms;
2220
2220
  @group(0) @binding(1) var envSampler: sampler;
2221
2221
  @group(0) @binding(2) var envTexture: texture_2d<f32>;
@@ -2235,37 +2235,40 @@ fn dirToUv(d: vec3<f32>) -> vec2<f32> {
2235
2235
  }
2236
2236
 
2237
2237
  @fragment fn fs(i: V) -> @location(0) vec4<f32> {
2238
- let d = normalize(i.dir);
2239
- let camH = u.extra.x;
2240
- let R = u.extra.y;
2238
+ let d = normalize(i.dir);
2239
+ let cx = u.cam.x;
2240
+ let cy = u.cam.y;
2241
+ let cz = u.cam.z;
2242
+ let R = u.cam.w;
2241
2243
 
2242
- // --- sky ---
2244
+ // --- sky (always computed for uniform control flow) ---
2243
2245
  let skyUv = dirToUv(d);
2244
2246
 
2245
- // --- ground: inverted bowl hemisphere at Y=0 ---
2247
+ // --- ground: ray from camera hits Y=0 plane ---
2246
2248
  let dyClamped = min(d.y, -0.0001);
2247
- let t = -camH / dyClamped;
2248
- let hitX = t * d.x;
2249
- let hitZ = t * d.z;
2250
- let hitDist = sqrt(hitX * hitX + hitZ * hitZ);
2249
+ let t = -cy / dyClamped;
2250
+ // Hit point in WORLD space (not camera-relative)
2251
+ let wx = cx + t * d.x;
2252
+ let wz = cz + t * d.z;
2253
+ let wDist = sqrt(wx * wx + wz * wz);
2251
2254
 
2252
- // Clamp hit point inside the bowl radius
2253
- let s = min(1.0, R * 0.999 / max(hitDist, 0.001));
2254
- let bx = hitX * s;
2255
- let bz = hitZ * s;
2256
- // Project onto the lower hemisphere: y = -sqrt(R² - x² - z²)
2255
+ // Clamp inside the bowl radius (centered at world origin)
2256
+ let s = min(1.0, R * 0.999 / max(wDist, 0.001));
2257
+ let bx = wx * s;
2258
+ let bz = wz * s;
2259
+ // Inverted bowl: y = -sqrt(R² - x² - z²)
2257
2260
  let bowlY = -sqrt(max(R * R - bx * bx - bz * bz, 0.0));
2258
2261
  let groundDir = normalize(vec3(bx, bowlY, bz));
2259
- let groundUv = dirToUv(groundDir);
2262
+ let groundUv = dirToUv(groundDir);
2260
2263
 
2261
2264
  // --- sample both (uniform control flow) ---
2262
- let skyColor = textureSample(envTexture, envSampler, skyUv).rgb;
2265
+ let skyColor = textureSample(envTexture, envSampler, skyUv).rgb;
2263
2266
  let groundColor = textureSample(envTexture, envSampler, groundUv).rgb;
2264
2267
 
2265
- // Blend near horizon + fade at bowl edge
2268
+ // Blend: horizon transition + fade at bowl edge
2266
2269
  let horizonBlend = smoothstep(0.0, -0.08, d.y);
2267
- let aboveGround = step(0.01, camH);
2268
- let edgeFade = 1.0 - smoothstep(R * 0.7, R, hitDist);
2270
+ let aboveGround = step(0.01, cy);
2271
+ let edgeFade = 1.0 - smoothstep(R * 0.7, R, wDist);
2269
2272
  let finalBlend = horizonBlend * aboveGround * edgeFade;
2270
2273
  let c = mix(skyColor, groundColor, finalBlend);
2271
2274
 
@@ -2290,7 +2293,7 @@ class SkyboxRenderer {
2290
2293
  __publicField(this, "frameReady", false);
2291
2294
  __publicField(this, "mode", "none");
2292
2295
  /** Ground projection sphere radius (world units). Larger = ground extends further, flatter. */
2293
- __publicField(this, "groundRadius", 1e3);
2296
+ __publicField(this, "groundRadius", 100);
2294
2297
  this.device = device;
2295
2298
  const depthStencil = {
2296
2299
  format: depthFormat,
@@ -2427,10 +2430,10 @@ class SkyboxRenderer {
2427
2430
  ud[9] = viewMatrix[9];
2428
2431
  ud[10] = viewMatrix[10];
2429
2432
  ud[11] = 0;
2430
- ud[12] = cameraPosition ? cameraPosition[1] : 0;
2431
- ud[13] = this.groundRadius;
2432
- ud[14] = 0;
2433
- ud[15] = 0;
2433
+ ud[12] = cameraPosition ? cameraPosition[0] : 0;
2434
+ ud[13] = cameraPosition ? cameraPosition[1] : 0;
2435
+ ud[14] = cameraPosition ? cameraPosition[2] : 0;
2436
+ ud[15] = this.groundRadius;
2434
2437
  this.device.queue.writeBuffer(this.uniformBuffer, 0, ud);
2435
2438
  this.frameReady = true;
2436
2439
  }