{
  "createdAt": "2026-10-05T07:59:10.257Z",
  "assets": [
    {
      "kind": "day",
      "asset": "evening_road_01_puresky",
      "source": "models/office/materials/premium/evening_road_01_puresky_8k.hdr",
      "runtime": "evening-road-2k.hdr",
      "sourceResolution": [
        8192,
        4096
      ],
      "page": "https://polyhaven.com/a/evening_road_01_puresky",
      "license": "CC0-1.0",
      "licenseURL": "https://polyhaven.com/license",
      "sourceBytes": 66926900,
      "sourceSHA256": "867d7f775357901b368aa363296e86e482b3bc13f1d4a9a13c11d0d7efc02a9e",
      "runtimeBytes": 5031569,
      "runtimeSHA256": "5c8118c93316dcd0bdc39bce548a1f10fe7241b2db4306ac82d8f54ce0229305",
      "runtimeResolution": [
        2048,
        1024
      ],
      "runtimeFormat": "Radiance RGBE, scene-linear sRGB primaries",
      "maximumLinearChannel": 28.611764907836914,
      "processing": "ImageMagick 7.1.2-13 Q16-HDRI; box-filter resample in scene-linear RGB to 2048x1024; re-encoded as RGBE. No exposure, color grade, sun replacement or original file modification."
    },
    {
      "kind": "night",
      "asset": "qwantani_dusk_1_puresky",
      "source": "shanghai-closure-20260922/assets/qwantani_dusk_1_puresky_4k.hdr",
      "runtime": "qwantani-blue-hour-2k.hdr",
      "sourceResolution": [
        4096,
        2048
      ],
      "page": "https://polyhaven.com/a/qwantani_dusk_1_puresky",
      "license": "CC0-1.0",
      "licenseURL": "https://polyhaven.com/license",
      "sourceBytes": 15803347,
      "sourceSHA256": "d7383120c7f4332d88bc5c3559208dddc95c576e7ffad8c63ea2cadbe0882d3e",
      "runtimeBytes": 4034535,
      "runtimeSHA256": "555913fd1aa28c7c515275c8afa9f249e3e829def001c4fcff6bf3c4067dc68b",
      "runtimeResolution": [
        2048,
        1024
      ],
      "runtimeFormat": "Radiance RGBE, scene-linear sRGB primaries",
      "maximumLinearChannel": 4.266666889190674,
      "processing": "ImageMagick 7.1.2-13 Q16-HDRI; box-filter resample in scene-linear RGB to 2048x1024; re-encoded as RGBE. No exposure, color grade, sun replacement or original file modification."
    },
    {
      "kind": "spring",
      "asset": "kloofendal_48d_partly_cloudy_puresky",
      "source": "models/office/materials/premium/kloofendal_48d_partly_cloudy_puresky_8k.hdr",
      "runtime": "spring-partly-cloudy-2k.hdr",
      "sourceResolution": [
        8192,
        4096
      ],
      "page": "https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky",
      "license": "CC0-1.0",
      "licenseURL": "https://polyhaven.com/license",
      "sourceBytes": 74844926,
      "sourceSHA256": "30ff6bb1eec58c11b52254e89b5dc39aaf756dd332c9a14a4976d68f23feaa71",
      "runtimeBytes": 5474665,
      "runtimeSHA256": "d935607b62793b7e323f762746e3501319ffd7d637f7703072aad357314237c6",
      "runtimeResolution": [
        2048,
        1024
      ],
      "runtimeFormat": "Radiance RGBE, scene-linear sRGB primaries",
      "maximumLinearChannel": 18375.78125,
      "sunPeakPixelTopLeft": [
        1220,
        239
      ],
      "processing": "Existing local CC0 master; no download. ImageMagick 7 Q16-HDRI box-filter resample in scene-linear RGB to 2048x1024, multiply radiance by 0.25 for half-float headroom, horizontal wrap roll +2 pixels to align solar azimuth, re-encode RGBE. No vertical warp, horizon tilt, sun replacement, or original file modification."
    },
    {
      "kind": "autumn",
      "asset": "qwantani_sunset_puresky",
      "source": "models/office/materials/premium/qwantani_sunset_puresky_8k.hdr",
      "runtime": "autumn-sunset-2k.hdr",
      "sourceResolution": [
        8192,
        4096
      ],
      "page": "https://polyhaven.com/a/qwantani_sunset_puresky",
      "license": "CC0-1.0",
      "licenseURL": "https://polyhaven.com/license",
      "sourceBytes": 66426842,
      "sourceSHA256": "4b3939973ff5fafcda49b1bd10665451f5d96fade3ccd774648e58903bc029fb",
      "runtimeBytes": 4260845,
      "runtimeSHA256": "c942c38c587ddf8637de40881b5d889642e375092a7cadf78fee88435e0753b8",
      "runtimeResolution": [
        2048,
        1024
      ],
      "runtimeFormat": "Radiance RGBE, scene-linear sRGB primaries",
      "maximumLinearChannel": 31482.98046875,
      "sunPeakPixelTopLeft": [
        1220,
        477
      ],
      "processing": "Existing local CC0 master; no download. ImageMagick 7 Q16-HDRI box-filter resample in scene-linear RGB to 2048x1024, multiply radiance by 0.25 for half-float headroom, horizontal wrap roll -8 pixels to align solar azimuth, re-encode RGBE. No vertical warp, horizon tilt, sun replacement, or original file modification."
    }
  ],
  "orientation": {
    "yawRadians": 2.784516014631969,
    "dayHotspotPixelTopLeft": [
      1220,
      455
    ],
    "measurementResolution": [
      2048,
      1024
    ],
    "worldSunDirection": [
      -0.5649809523790665,
      0.17247308399679595,
      -0.8068764209874255
    ],
    "sunElevationDegrees": 9.931640625,
    "method": "Brightest upper-hemisphere luminance pixel of each linear 2k daylight capture. Horizontal wrap rolls align Spring and Autumn azimuth to Today before the shared yaw rotation. Each photograph retains its own measured solar elevation. The same yaw is used for visible skies and their PMREM lighting; the directional sun and shared river sunDirection follow the active seasonal elevation.",
    "daylightSunElevationDegrees": {
      "today": 9.931640625,
      "spring": 47.900390625,
      "autumn": 6.064453125
    }
  },
  "loader": {
    "file": "../../vendor/three/loaders/HDRLoader.js",
    "upstream": "https://github.com/mrdoob/three.js/blob/r185/examples/jsm/loaders/HDRLoader.js",
    "license": "MIT",
    "licenseFile": "../../vendor/three/loaders/HDRLoader.LICENSE",
    "runtimeCompatibility": "All imported symbols and DataTextureLoader texData fields exist in bundled Three r169. The exact bundled loader parses the three daylight derivatives in CPU checks; all four use the same Radiance RGBE path."
  },
  "notes": "Night uses a distinct blue-hour photograph and lower radiance, not a dimmed daytime sun. This is artistic Shanghai presentation lighting, not a reconstruction of any recorded Shanghai sky or date.",
  "runtimeSeasonalGrades": {
    "today": "Existing Evening Road photographic day radiance, directional sun and atmospheric fog are preserved.",
    "spring": "Distinct Kloofendal partly-cloudy photograph: fresh blue sky, scattered ivory cloud forms, high photographed sun at 47.90 degrees, and a small cool white-balance adjustment.",
    "autumn": "Distinct Qwantani sunset photograph: deep cooler blue overhead, warmer amber horizon and cloud edges, low photographed sun at 6.06 degrees, and a small warm white-balance adjustment.",
    "visibleRadiance": {
      "todayGain": 0.64,
      "springGain": 3,
      "springRGBBalance": [
        0.93,
        1.02,
        1.08
      ],
      "autumnGain": 1.55,
      "autumnRGBBalance": [
        1.1,
        1.015,
        0.94
      ],
      "nightGain": 0.043
    },
    "filteredEnvironmentRadiance": {
      "todayGain": 1,
      "springGain": 4.6,
      "autumnGain": 2.4,
      "nightGain": 0.115
    },
    "reflectionMatching": "Each sky has its own PMREM filtered atlas. Visible HDR samples and matching PMREM receive the same RGB white balance, with separately tuned radiance exposure for image-based lighting. The four cached atlases blend in linear light only when season/night state changes sufficiently or reaches an endpoint. No per-frame PMREM rebuilds.",
    "night": "The separate blue-hour photograph and full-night lighting remain independent of seasonal daylight choices.",
    "limits": "These are artistic seasonal presentation skies photographed elsewhere, not measured Shanghai weather, a recorded Shanghai date, or a weather simulation. Transition crossfades can briefly blend two sun/cloud captures. Four HDR textures and four prefiltered atlases are cached, increasing texture memory versus the previous two-sky implementation."
  },
  "validation": {
    "cpuChecks": 7,
    "coverage": "Five state/cache/sun/disposal tests plus two actual-HDR parsing and default-camera display-difference tests. All pass. No additional GPU result claimed here.",
    "defaultCameraSkySamples": 528,
    "medianDisplayRGBDifferenceVsToday": {
      "spring": 67.43540971917106,
      "autumn": 27.635640458711283
    },
    "differenceMethod": "RMS RGB distance on 0–255 display values after the bundled Three ACES matrices and sRGB conversion, sampled in the default-camera upper sky. Excludes scene occlusion, bloom and FXAA; final GPU review remains with app integration."
  },
  "additionalRuntimeHDRBytes": 9735510,
  "updatedAt": "2026-10-06"
}
