procedural-terrains 2.0.0 → 2.0.1
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/{FiniteTerrain-B34WMz5S.js → FiniteTerrain-B5_3y6xX.js} +3 -3
- package/dist/{FiniteTerrain-B34WMz5S.js.map → FiniteTerrain-B5_3y6xX.js.map} +1 -1
- package/dist/{InfiniteTerrain-SgoJz3qJ.js → InfiniteTerrain-jeCy6RED.js} +5 -5
- package/dist/{InfiniteTerrain-SgoJz3qJ.js.map → InfiniteTerrain-jeCy6RED.js.map} +1 -1
- package/dist/{MiniTerrain-Blt0H1S0.js → MiniTerrain-Bb5VYkZU.js} +8 -8
- package/dist/MiniTerrain-Bb5VYkZU.js.map +1 -0
- package/dist/{PlanetMaterial-B1_ZPlx5.js → PlanetMaterial-Cs-_x6vr.js} +4 -4
- package/dist/{PlanetMaterial-B1_ZPlx5.js.map → PlanetMaterial-Cs-_x6vr.js.map} +1 -1
- package/dist/{PlanetTerrain-DCvxS1Q8.js → PlanetTerrain-Bsfx7YA6.js} +5 -5
- package/dist/{PlanetTerrain-DCvxS1Q8.js.map → PlanetTerrain-Bsfx7YA6.js.map} +1 -1
- package/dist/{RevisionScope-J__6V9I_.js → RevisionScope-Dl4yjj-0.js} +2 -2
- package/dist/{RevisionScope-J__6V9I_.js.map → RevisionScope-Dl4yjj-0.js.map} +1 -1
- package/dist/{TerrainClouds-BuKvwnWw.js → TerrainClouds-DV6ny7P1.js} +31 -19
- package/dist/TerrainClouds-DV6ny7P1.js.map +1 -0
- package/dist/{TerrainHeightCache-Dsde6EDL.js → TerrainHeightCache-DIZxi9jz.js} +2 -2
- package/dist/{TerrainHeightCache-Dsde6EDL.js.map → TerrainHeightCache-DIZxi9jz.js.map} +1 -1
- package/dist/{TerrainParameters-A3fcNJTR.js → TerrainParameters-DMCjnnxz.js} +10 -8
- package/dist/TerrainParameters-DMCjnnxz.js.map +1 -0
- package/dist/{TerrainWater-Cil7waG3.js → TerrainWater-CX4XdwA0.js} +17 -11
- package/dist/TerrainWater-CX4XdwA0.js.map +1 -0
- package/dist/{WaterMaterial-BUsAp0SS.js → WaterMaterial-C9h1xm9E.js} +7 -5
- package/dist/WaterMaterial-C9h1xm9E.js.map +1 -0
- package/dist/{biomeGLSL-CIkhxIlH.js → biomeGLSL-DWGDDBqT.js} +6 -3
- package/dist/{biomeGLSL-CIkhxIlH.js.map → biomeGLSL-DWGDDBqT.js.map} +1 -1
- package/dist/clouds.js +1 -1
- package/dist/documents.js +6 -6
- package/dist/export.js +2 -2
- package/dist/index.js +1 -1
- package/dist/infinite.js +1 -1
- package/dist/mini.js +1 -1
- package/dist/planet.js +1 -1
- package/dist/{planetGLSL-2xas0f3o.js → planetGLSL-D9Zy2IAw.js} +2 -2
- package/dist/{planetGLSL-2xas0f3o.js.map → planetGLSL-D9Zy2IAw.js.map} +1 -1
- package/dist/real-world.js +1 -1
- package/dist/render.js +1 -1
- package/dist/viewer.js +1 -1
- package/dist/water.js +1 -1
- package/package.json +1 -1
- package/dist/MiniTerrain-Blt0H1S0.js.map +0 -1
- package/dist/TerrainClouds-BuKvwnWw.js.map +0 -1
- package/dist/TerrainParameters-A3fcNJTR.js.map +0 -1
- package/dist/TerrainWater-Cil7waG3.js.map +0 -1
- package/dist/WaterMaterial-BUsAp0SS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanetTerrain-DCvxS1Q8.js","sources":["../../../src/engine/terrain/PlanetWorld.js","../../../src/engine/terrain/PlanetHeightBaker.js","../../../src/runtime/worlds/PlanetTerrain.js"],"sourcesContent":["import * as THREE from 'three';\nimport { buildChunkGeometry, setChunkBounds } from './ChunkGeometry.js';\nimport { stepTemporalLod } from './LodMorph.js';\n\n// ============================================================================\n// PlanetWorld: a cube-sphere terrain. Six cube faces, each subdivided into a\n// faceGrid×faceGrid grid of chunks. Every chunk reuses one of the shared\n// unit-grid LOD geometries (with radial skirts) from ChunkGeometry.js.\n//\n// Visible leaf chunks are packed into four instanced LOD batches. Per-instance\n// cube-face origin/U/V attributes replace hundreds of mesh/material objects;\n// all four batches share the same shader program. Folded quadtree patches keep\n// their rare standalone meshes because they use variable topology.\n//\n// The chunk count is bounded (6 * faceGrid²) so they are all created once —\n// no streaming. LOD is chosen per frame by distance to the camera; chunks are\n// culled by the sphere horizon and the view frustum.\n// ============================================================================\n\n// Six cube faces: origin corner + two edge vectors spanning [-1,1]². For each\n// face U×V points outward, so front-facing winding is correct with FrontSide.\nconst FACES = [\n { o: [ 1, -1, -1], u: [0, 2, 0], v: [0, 0, 2] }, // +X\n { o: [-1, -1, 1], u: [0, 2, 0], v: [0, 0, -2] }, // -X\n { o: [-1, 1, -1], u: [0, 0, 2], v: [2, 0, 0] }, // +Y\n { o: [-1, -1, 1], u: [0, 0, -2], v: [2, 0, 0] }, // -Y\n { o: [-1, -1, 1], u: [2, 0, 0], v: [0, 2, 0] }, // +Z\n { o: [ 1, -1, -1], u: [-2, 0, 0], v: [0, 2, 0] }, // -Z\n];\n\nconst DEFAULT_LOD_DISTANCES = [1.4, 2.6, 4.2]; // × chunk world span\n\nexport class PlanetWorld {\n /**\n * @param {THREE.Scene} scene\n * @param {() => THREE.ShaderMaterial} makeMaterial — per-chunk material factory\n * @param {Object} opts\n * @param {number} opts.radius — planet base radius (world units)\n * @param {number} opts.maxHeight — terrain ceiling for bounds\n * @param {number} opts.skirtDepth — radial skirt depth\n * @param {number} [opts.faceGrid] — chunks per face side (default 8)\n * @param {number[]} [opts.lodSegments] — per-LOD quads per chunk side\n * @param {number[]} [opts.lodDistances] — LOD thresholds (× chunk span)\n */\n constructor(scene, makeMaterial, opts) {\n this.scene = scene;\n this.makeMaterial = makeMaterial;\n\n this.radius = opts.radius;\n this.maxHeight = opts.maxHeight;\n this.skirtDepth = opts.skirtDepth;\n this.faceGrid = opts.faceGrid || 8;\n this.lodSegments = opts.lodSegments ? [...opts.lodSegments] : [64, 32, 16, 8];\n this.wireframe = false;\n\n this.cullingEnabled = true;\n this.horizonCulling = true;\n this.cullingAggressiveness = 1.0;\n\n // --- Merge layer (per-face quadtree) ------------------------------------\n // Each cube face is a faceGrid² grid of cells = the leaves of a quadtree.\n // A full square block folds into ONE curved patch mesh (a unit grid mapped\n // across the block's face rectangle via uFaceOrigin/U/V — same shader path\n // as a chunk, just spanning N cells). Folding is 2×2 at a time so the cut\n // is smooth: fine patches near the camera, larger ones toward the limb.\n this.mergeEnabled = true;\n this.mergeQuadsPerChunk = 8;\n this.mergeDistance = 4;\n this.allowRootMerge = true;\n this._faceTrees = [];\n this._mergedPatches = []; // patch nodes folded this frame\n this._mergeGeo = new Map(); // \"res:aLod\" -> shared BufferGeometry\n // Folded patches draw as instanced batches (one InstancedMesh per patch\n // grid size) sharing ONE material, through the same instanced program as\n // the chunk batches. A material per patch (269 uniforms, 24 arrays) made\n // three.js re-upload every uniform for each of ~70 patch draws (~1 ms CPU\n // per frame in orbit) and kept a second, non-instanced program alive.\n this._patchBatches = new Map(); // \"res:aLod\" -> instanced batch\n this._patchMaterial = null;\n this._patchUploadKey = '';\n this._patchSerial = 0;\n this._instancesDirty = true;\n this._mergeDebug = false;\n this.mergedGroupCount = 0;\n this.savedDrawCalls = 0;\n\n // chunk world span ≈ arc length of one cell at the equator\n this.chunkSpan = (this.radius * 2) / this.faceGrid;\n\n this._baseLodThresholds = opts.lodDistances\n ? [...opts.lodDistances]\n : [...DEFAULT_LOD_DISTANCES];\n this.lodThresholds = this._baseLodThresholds.map(m => m * this.chunkSpan);\n\n // gradual LOD geometry rebuild queue (one level per frame)\n this._lodRebuildQueue = [];\n this._targetSegments = null;\n\n // triangle budget (scales LOD thresholds down under pressure)\n this.triangleBudget = 0;\n this._budgetScale = 1.0;\n this._budgetCheckAt = 0;\n\n this.group = new THREE.Group();\n this.group.name = 'planet-world';\n this.scene.add(this.group);\n\n // shared per-LOD geometries (unit grid + skirt ring)\n this.geometries = this.lodSegments.map((res, lod) => {\n const geo = buildChunkGeometry(res, lod, { morph: true });\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n return geo;\n });\n\n this.chunks = [];\n this.materials = [];\n this._buildChunks();\n this._buildInstancedBatches();\n\n // stats (mirror InfiniteWorld so the HUD keeps working)\n this.activeChunkCount = this.chunks.length;\n this.visibleChunkCount = this.chunks.length;\n this.culledChunkCount = 0;\n this.lodCounts = [0, 0, 0, 0];\n\n this._frustum = new THREE.Frustum();\n this._projView = new THREE.Matrix4();\n this._tmp = new THREE.Vector3();\n this._camDir = new THREE.Vector3();\n }\n\n _buildChunks() {\n const g = this.faceGrid;\n this._faceTrees = [];\n for (const face of FACES) {\n const o = new THREE.Vector3(...face.o);\n const U = new THREE.Vector3(...face.u);\n const V = new THREE.Vector3(...face.v);\n const cu = U.clone().multiplyScalar(1 / g); // per-chunk edge vectors\n const cv = V.clone().multiplyScalar(1 / g);\n const cells = Array.from({ length: g }, () => new Array(g).fill(null));\n for (let j = 0; j < g; j++) {\n for (let i = 0; i < g; i++) {\n const origin = o.clone()\n .addScaledVector(U, i / g)\n .addScaledVector(V, j / g);\n const centerDir = origin.clone()\n .addScaledVector(cu, 0.5)\n .addScaledVector(cv, 0.5)\n .normalize();\n\n const worldCenter = centerDir.clone().multiplyScalar(this.radius + this.maxHeight * 0.5);\n const boundRadius = this._patchBoundRadius(origin, cu, cv, worldCenter);\n\n const chunk = {\n origin, faceU: cu.clone(), faceV: cv.clone(), centerDir, worldCenter,\n boundRadius, lod: 3, merged: false, visible: true,\n morph: 0, fresh: true, forceLod3: false,\n };\n this.chunks.push(chunk);\n cells[j][i] = chunk;\n }\n }\n // quadtree over this face's cell grid (leaves are the chunks above)\n let size = 1;\n while (size < g) size *= 2;\n const root = this._buildFaceNode(o, U, V, cells, 0, 0, size, 0);\n if (root) this._faceTrees.push(root);\n }\n }\n\n _buildInstancedBatches() {\n const capacity = Math.max(1, this.chunks.length);\n this.batches = this.geometries.map((geometry, lod) => {\n const instancedGeometry = geometry.clone();\n const origins = new Float32Array(capacity * 3);\n const faceUs = new Float32Array(capacity * 3);\n const faceVs = new Float32Array(capacity * 3);\n instancedGeometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(origins, 3));\n instancedGeometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(faceUs, 3));\n instancedGeometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(faceVs, 3));\n const morphs = new Float32Array(capacity);\n instancedGeometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(morphs, 1));\n const material = this.makeMaterial();\n material.wireframe = this.wireframe;\n this.materials.push(material);\n const mesh = new THREE.InstancedMesh(instancedGeometry, material, capacity);\n mesh.name = `planet-lod-${lod}`;\n mesh.count = 0;\n mesh.frustumCulled = false;\n mesh.matrixAutoUpdate = false;\n mesh.updateMatrix();\n this.group.add(mesh);\n return { mesh, geometry: instancedGeometry, material, origins, faceUs, faceVs, morphs };\n });\n this._uploadInstancedBatches();\n }\n\n _uploadInstancedBatches() {\n if (!this.batches) return;\n this._instancesDirty = false;\n const counts = new Uint32Array(this.batches.length);\n for (const chunk of this.chunks) {\n if (chunk.merged || !chunk.visible) continue;\n const batch = this.batches[chunk.lod];\n const index = counts[chunk.lod]++;\n chunk.origin.toArray(batch.origins, index * 3);\n chunk.faceU.toArray(batch.faceUs, index * 3);\n chunk.faceV.toArray(batch.faceVs, index * 3);\n batch.morphs[index] = chunk.morph;\n }\n for (let lod = 0; lod < this.batches.length; lod++) {\n const batch = this.batches[lod];\n batch.mesh.count = counts[lod];\n batch.mesh.visible = counts[lod] > 0;\n for (const name of ['aFaceOrigin', 'aFaceU', 'aFaceV', 'aMorphK']) {\n const attribute = batch.geometry.getAttribute(name);\n attribute.needsUpdate = true;\n attribute.clearUpdateRanges?.();\n attribute.addUpdateRange?.(0, counts[lod] * attribute.itemSize);\n }\n }\n }\n\n // Conservative world-space bounding-sphere radius for a face rectangle\n // spanning [origin, origin+u, origin+v] projected to the displaced sphere.\n _patchBoundRadius(origin, u, v, worldCenter) {\n let br = 0;\n const cornerR = this.radius + this.maxHeight;\n for (let cy = 0; cy <= 1; cy++) {\n for (let cx = 0; cx <= 1; cx++) {\n const cw = origin.clone()\n .addScaledVector(u, cx)\n .addScaledVector(v, cy)\n .normalize()\n .multiplyScalar(cornerR);\n br = Math.max(br, cw.distanceTo(worldCenter));\n }\n }\n return br * 1.05;\n }\n\n // Build a quadtree node over face cells [x0,x0+size)×[z0,z0+size). Leaves wrap\n // the existing chunk; internal nodes own a lazily-built curved patch mesh.\n _buildFaceNode(O, U, V, cells, x0, z0, size, level) {\n const g = this.faceGrid;\n if (size === 1) {\n const chunk = (z0 < g && x0 < g) ? cells[z0][x0] : null;\n if (!chunk) return null;\n chunk.merged = false;\n return {\n leaf: true, chunk, children: null, chunks: [chunk], level, full: true,\n centerDir: chunk.centerDir, worldCenter: chunk.worldCenter,\n boundRadius: chunk.boundRadius, spanWorld: this.chunkSpan,\n mesh: null, material: null, merged: false,\n };\n }\n const half = size / 2;\n const offs = [[x0, z0], [x0 + half, z0], [x0, z0 + half], [x0 + half, z0 + half]];\n const children = [];\n const chunks = [];\n for (const [ox, oz] of offs) {\n const child = this._buildFaceNode(O, U, V, cells, ox, oz, half, level + 1);\n if (child) { children.push(child); for (const c of child.chunks) chunks.push(c); }\n }\n if (!children.length) return null;\n const full = (x0 + size <= g) && (z0 + size <= g);\n if (!full && children.length === 1) return children[0];\n\n const g_ = g;\n const faceOrigin = O.clone().addScaledVector(U, x0 / g_).addScaledVector(V, z0 / g_);\n const faceU = U.clone().multiplyScalar(size / g_);\n const faceV = V.clone().multiplyScalar(size / g_);\n const centerDir = faceOrigin.clone().addScaledVector(faceU, 0.5).addScaledVector(faceV, 0.5).normalize();\n const worldCenter = centerDir.clone().multiplyScalar(this.radius + this.maxHeight * 0.5);\n return {\n leaf: false, chunk: null, children, chunks, level, full, n: size,\n faceOrigin, faceU, faceV, centerDir, worldCenter,\n boundRadius: this._patchBoundRadius(faceOrigin, faceU, faceV, worldCenter),\n spanWorld: size * this.chunkSpan, merged: false, visible: false,\n patchKey: null, patchRes: 0, patchLod: 0, serial: null,\n };\n }\n\n setWireframe(on) {\n this.wireframe = on;\n for (const m of this.materials) m.wireframe = on;\n }\n\n /** Swap the compile-time octave count on every chunk material (the program\n * is shared and already cached, so this is instant once warmed). */\n setOctaves(oct) {\n for (const m of this.materials) {\n if (m.defines.OCTAVES !== oct) {\n m.defines.OCTAVES = oct;\n m.needsUpdate = true;\n }\n }\n }\n\n setLodDistances(distances) {\n this._baseLodThresholds = [...distances];\n this._recalcLodThresholds();\n }\n\n _recalcLodThresholds() {\n this.lodThresholds = this._baseLodThresholds.map(\n m => m * this.chunkSpan * this._budgetScale\n );\n }\n\n // --- temporal geomorph -----------------------------------------------------\n // LOD decisions are unchanged; each change is animated instead of popping.\n // chunk.lod is the rendered grid, chunk.morph (0..1) how far its odd vertices\n // have slid onto the next-coarser grid (uploaded as the aMorphK attribute).\n setMorphEnabled(enabled) {\n this.morphEnabled = !!enabled;\n }\n\n _stepChunkLod(chunk, target, step) {\n stepTemporalLod(chunk, target, step, this.lodSegments, this.morphEnabled !== false);\n }\n\n _publishMorph() {\n const u = this.materials[0]?.uniforms?.uLodGridSegments;\n if (u) u.value.set(this.lodSegments[0], this.lodSegments[1], this.lodSegments[2], this.lodSegments[3]);\n }\n\n /** Change per-LOD segment counts — rebuilt gradually (one level/frame). */\n setLodSegments(segments) {\n const same = segments.length === this.lodSegments.length\n && segments.every((s, i) => s === this.lodSegments[i])\n && !this._lodRebuildQueue.length;\n if (same) return;\n this._targetSegments = [...segments];\n this._lodRebuildQueue = [3, 2, 1, 0];\n }\n\n _processLodRebuild() {\n if (!this._lodRebuildQueue.length || !this._targetSegments) return;\n const lod = this._lodRebuildQueue.shift();\n const res = this._targetSegments[lod];\n if (res === this.lodSegments[lod]) return;\n\n const geo = buildChunkGeometry(res, lod, { morph: true });\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n const old = this.geometries[lod];\n this.geometries[lod] = geo;\n this.lodSegments[lod] = res;\n if (this.batches?.[lod]) {\n const batch = this.batches[lod];\n const instancedGeometry = geo.clone();\n instancedGeometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(batch.origins, 3));\n instancedGeometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(batch.faceUs, 3));\n instancedGeometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(batch.faceVs, 3));\n instancedGeometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(batch.morphs, 1));\n batch.geometry.dispose();\n batch.geometry = instancedGeometry;\n batch.mesh.geometry = instancedGeometry;\n this._instancesDirty = true;\n }\n old.dispose();\n }\n\n setTriangleBudget(n) {\n this.triangleBudget = n;\n if (!n) { this._budgetScale = 1.0; this._recalcLodThresholds(); }\n }\n\n notifyTriangles(triangles) {\n if (!this.triangleBudget) return;\n const now = performance.now();\n if (now - this._budgetCheckAt < 500) return;\n this._budgetCheckAt = now;\n if (triangles > this.triangleBudget && this._budgetScale > 0.35) {\n this._budgetScale = Math.max(0.35, this._budgetScale * 0.9);\n this._recalcLodThresholds();\n } else if (triangles < this.triangleBudget * 0.7 && this._budgetScale < 1.0) {\n this._budgetScale = Math.min(1.0, this._budgetScale * 1.05);\n this._recalcLodThresholds();\n }\n }\n\n /** Tune the merge layer (performance settings). */\n setMergeOptions({ enabled, quadsPerChunk, mergeDistance, macroEnabled } = {}) {\n if (enabled !== undefined) {\n this.mergeEnabled = !!enabled;\n if (!this.mergeEnabled) this._restoreMerge();\n }\n if (macroEnabled !== undefined) this.allowRootMerge = !!macroEnabled;\n if (mergeDistance !== undefined && Number.isFinite(+mergeDistance)) {\n this.mergeDistance = Math.max(0.5, +mergeDistance);\n }\n if (quadsPerChunk !== undefined) {\n const v = Math.max(2, Math.round(quadsPerChunk));\n if (v !== this.mergeQuadsPerChunk) { this.mergeQuadsPerChunk = v; this._disposePatchMeshes(); }\n }\n }\n\n /** Toggle the merge-debug surface tint (drives the shared uMergeDebug). */\n setMergeDebug(on) {\n this._mergeDebug = !!on;\n // shared uniform object → every chunk/patch material sees it at once\n const u = this.materials[0]?.uniforms?.uMergeDebug;\n if (u) u.value = this._mergeDebug ? 1.0 : 0.0;\n }\n\n update(cameraPos, camera, debug = {}) {\n this._processLodRebuild();\n this._publishMorph();\n const nowMs = performance.now();\n const dt = this._lastUpdateAt == null ? 0 : Math.min(0.1, Math.max(0, (nowMs - this._lastUpdateAt) / 1000));\n this._lastUpdateAt = nowMs;\n const morphStep = dt / Math.max(0.05, this.morphDuration ?? 0.4);\n for (const c of this.chunks) c.forceLod3 = false;\n\n const [t0, t1, t2] = this.lodThresholds;\n const counts = [0, 0, 0, 0];\n const freezeCulling = !!debug.freezeCulling;\n const freezeLod = !!debug.freezeLod;\n\n // camera direction from planet center + altitude drive the horizon test.\n const camLen = this._camDir.copy(cameraPos).length();\n this._camDir.multiplyScalar(camLen > 1e-3 ? 1 / camLen : 0);\n const base = this.radius / Math.max(camLen, 1);\n const margin = 0.08 + (1 - this.cullingAggressiveness) * 0.10;\n const horizonCos = base - margin;\n\n if (!freezeCulling && camera) {\n this._projView.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n this._frustum.setFromProjectionMatrix(this._projView);\n }\n\n // 1. Fold pass: decide which face blocks collapse into patches (distance\n // only). Skipped while LOD is frozen so the fold layout holds.\n if (this.mergeEnabled && !freezeLod) {\n this._mergedPatches.length = 0;\n this._hiddenByMerge = 0;\n for (const root of this._faceTrees) this._foldPass(root, cameraPos);\n this.mergedGroupCount = this._mergedPatches.length;\n this.savedDrawCalls = Math.max(0, this._hiddenByMerge - this._mergedPatches.length);\n }\n\n // 2. Per-chunk LOD + cull (folded chunks are hidden, skip them).\n let visible = 0, culled = 0;\n let morphing = 0;\n let dirty = this._instancesDirty;\n for (const c of this.chunks) {\n if (c.merged) {\n if (c.visible) { c.visible = false; dirty = true; }\n continue;\n }\n const d = this._tmp.copy(c.worldCenter).sub(cameraPos).length();\n const lod = c.forceLod3 ? 3 : (d < t0 ? 0 : d < t1 ? 1 : d < t2 ? 2 : 3);\n const prevLod = c.lod;\n const prevMorph = c.morph;\n if (!freezeLod) this._stepChunkLod(c, lod, morphStep);\n if (c.morph > 0 || c.lod !== lod) morphing++;\n counts[c.lod]++;\n\n let show = c.visible;\n if (!freezeCulling) {\n show = this._isVisible(c.centerDir, c.worldCenter, c.boundRadius, camLen, horizonCos, camera);\n }\n if (show !== c.visible || c.lod !== prevLod || c.morph !== prevMorph) dirty = true;\n c.visible = show;\n if (show) visible++; else culled++;\n }\n // instance data only changes with visibility / LOD / morph\n if (dirty) this._uploadInstancedBatches();\n\n // 3. Cull the folded patches (LOD is fixed for a patch).\n for (const p of this._mergedPatches) {\n let show = p.visible;\n if (!freezeCulling) {\n show = this._isVisible(p.centerDir, p.worldCenter, p.boundRadius, camLen, horizonCos, camera);\n }\n p.visible = show;\n if (show) visible++; else culled++;\n }\n this._uploadPatchBatches();\n\n this.lodCounts = counts;\n this.activeChunkCount = this.chunks.length;\n this.visibleChunkCount = visible;\n this.culledChunkCount = culled;\n this.morphingChunkCount = morphing;\n }\n\n // Horizon (back-of-planet) + frustum visibility test for one patch/chunk.\n _isVisible(centerDir, worldCenter, boundRadius, camLen, horizonCos, camera) {\n if (!this.cullingEnabled) return true;\n if (this.horizonCulling && camLen > this.radius && this._camDir.dot(centerDir) < horizonCos) {\n return false;\n }\n if (camera && !this._frustum.intersectsSphere(_sphere.set(worldCenter, boundRadius))) {\n return false;\n }\n return true;\n }\n\n // --- merge traversal -----------------------------------------------------\n _foldPass(node, camPos) {\n if (node.leaf) {\n if (node.chunk.merged) { node.chunk.merged = false; this._instancesDirty = true; }\n return;\n }\n const canFold = node.full && (this.allowRootMerge || node.level > 0);\n if (canFold) {\n const nearest = this._tmp.copy(node.worldCenter).sub(camPos).length() - node.boundRadius;\n const foldDist = node.spanWorld * this.mergeDistance * this._budgetScale;\n const want = node.merged ? nearest > foldDist * 0.85 : nearest > foldDist;\n // Temporal geomorph: a patch only folds once every chunk under it has\n // morphed down to the LOD3 grid (= patch density); until then they are\n // steered there, so the fold itself changes nothing on screen.\n const ready = node.merged || this.morphEnabled === false\n || node.chunks.every((c) => c.lod === 3 && c.morph === 0);\n if (want && !ready) {\n for (const c of node.chunks) c.forceLod3 = true;\n }\n if (want && ready) {\n if (!node.merged) this._foldPatch(node);\n this._mergedPatches.push(node);\n this._hiddenByMerge += node.chunks.length;\n return;\n }\n }\n if (node.merged) this._unfoldPatch(node);\n for (const child of node.children) this._foldPass(child, camPos);\n }\n\n _foldPatch(node) {\n node.merged = true;\n if (!node.patchKey) {\n const tier = Math.max(1, Math.round(Math.log2(node.n)));\n node.patchRes = Math.min(160, Math.max(8, node.n * this.mergeQuadsPerChunk));\n node.patchLod = 3 + Math.min(5, tier);\n node.patchKey = `${node.patchRes}:${node.patchLod}`;\n }\n node.visible = true;\n this._instancesDirty = true; // its chunks leave the chunk batches\n for (const c of node.chunks) { c.merged = true; c.visible = false; }\n this._forEachDescendantInternal(node, (d) => {\n d.merged = false;\n d.visible = false;\n });\n }\n\n _unfoldPatch(node) {\n node.merged = false;\n node.visible = false;\n this._instancesDirty = true;\n }\n\n _ensurePatchMaterial() {\n if (this._patchMaterial) return this._patchMaterial;\n const mat = this.makeMaterial();\n mat.wireframe = this.wireframe;\n // match the live octave count (makeMaterial captured the count at planet\n // creation; setOctaves only updates materials that already exist)\n const liveOct = this.materials[0]?.defines?.OCTAVES;\n if (liveOct !== undefined && mat.defines.OCTAVES !== liveOct) {\n mat.defines.OCTAVES = liveOct;\n mat.needsUpdate = true;\n }\n this.materials.push(mat); // so wireframe / octave / source updates reach it\n this._patchMaterial = mat;\n return mat;\n }\n\n // Upper bound of simultaneously folded patches sharing one grid size.\n _patchCapacity(key) {\n let n = 0;\n this._forEachInternal((node) => {\n if (!node.full) return;\n const tier = Math.max(1, Math.round(Math.log2(node.n)));\n const res = Math.min(160, Math.max(8, node.n * this.mergeQuadsPerChunk));\n if (`${res}:${3 + Math.min(5, tier)}` === key) n++;\n });\n return Math.max(1, n);\n }\n\n _ensurePatchBatch(node) {\n let batch = this._patchBatches.get(node.patchKey);\n if (batch) return batch;\n const capacity = this._patchCapacity(node.patchKey);\n const geometry = this._mergeGeometry(node.patchRes, node.patchLod).clone();\n const origins = new Float32Array(capacity * 3);\n const faceUs = new Float32Array(capacity * 3);\n const faceVs = new Float32Array(capacity * 3);\n geometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(origins, 3));\n geometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(faceUs, 3));\n geometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(faceVs, 3));\n // patches never geomorph: explicit zeros instead of whatever generic\n // attribute value the driver holds for the missing slots\n geometry.setAttribute('aMorph', new THREE.BufferAttribute(new Float32Array(geometry.attributes.position.count), 1));\n geometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(new Float32Array(capacity), 1));\n const mesh = new THREE.InstancedMesh(geometry, this._ensurePatchMaterial(), capacity);\n mesh.name = `planet-patch-${node.patchKey}`;\n mesh.count = 0;\n mesh.visible = false;\n mesh.frustumCulled = false;\n mesh.matrixAutoUpdate = false;\n mesh.updateMatrix();\n this.group.add(mesh);\n batch = { mesh, geometry, origins, faceUs, faceVs, capacity };\n this._patchBatches.set(node.patchKey, batch);\n return batch;\n }\n\n _uploadPatchBatches() {\n // Re-upload only when the set of visible patches changed.\n let key = '';\n for (const p of this._mergedPatches) {\n if (!p.visible) continue;\n if (p.serial == null) p.serial = ++this._patchSerial;\n key += `${p.serial},`;\n }\n if (key === this._patchUploadKey) return;\n this._patchUploadKey = key;\n const counts = new Map();\n for (const p of this._mergedPatches) {\n if (!p.visible) continue;\n const batch = this._ensurePatchBatch(p);\n const index = counts.get(batch) || 0;\n if (index >= batch.capacity) continue;\n counts.set(batch, index + 1);\n p.faceOrigin.toArray(batch.origins, index * 3);\n p.faceU.toArray(batch.faceUs, index * 3);\n p.faceV.toArray(batch.faceVs, index * 3);\n }\n for (const batch of this._patchBatches.values()) {\n const count = counts.get(batch) || 0;\n batch.mesh.count = count;\n batch.mesh.visible = count > 0;\n for (const name of ['aFaceOrigin', 'aFaceU', 'aFaceV']) {\n const attribute = batch.geometry.getAttribute(name);\n attribute.needsUpdate = true;\n attribute.clearUpdateRanges?.();\n attribute.addUpdateRange?.(0, count * attribute.itemSize);\n }\n }\n }\n\n _hidePatchBatches() {\n for (const batch of this._patchBatches.values()) {\n batch.mesh.count = 0;\n batch.mesh.visible = false;\n }\n this._patchUploadKey = '';\n }\n\n _disposePatchBatches() {\n for (const batch of this._patchBatches.values()) {\n this.group.remove(batch.mesh);\n batch.geometry.dispose();\n }\n this._patchBatches.clear();\n this._patchUploadKey = '';\n }\n\n _mergeGeometry(res, aLod) {\n const key = `${res}:${aLod}`;\n let geo = this._mergeGeo.get(key);\n if (!geo) {\n geo = buildChunkGeometry(res, aLod);\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n this._mergeGeo.set(key, geo);\n }\n return geo;\n }\n\n _forEachDescendantInternal(node, fn) {\n if (!node.children) return;\n for (const child of node.children) {\n if (child.leaf) continue;\n fn(child);\n this._forEachDescendantInternal(child, fn);\n }\n }\n\n _forEachInternal(fn) {\n const rec = (n) => {\n if (!n || n.leaf) return;\n fn(n);\n for (const c of n.children) rec(c);\n };\n for (const root of this._faceTrees) rec(root);\n }\n\n _restoreMerge() {\n for (const c of this.chunks) { c.merged = false; }\n this._forEachInternal((n) => { n.merged = false; n.visible = false; });\n this._mergedPatches.length = 0;\n this._hidePatchBatches();\n this._instancesDirty = true;\n this.mergedGroupCount = 0;\n this.savedDrawCalls = 0;\n }\n\n _disposePatchMeshes() {\n this._disposePatchBatches();\n this._forEachInternal((n) => {\n n.merged = false;\n n.visible = false;\n n.patchKey = null;\n });\n for (const c of this.chunks) c.merged = false;\n this._mergedPatches.length = 0;\n this._instancesDirty = true;\n }\n\n dispose() {\n this._disposePatchBatches();\n this._patchMaterial = null;\n for (const geo of this._mergeGeo.values()) geo.dispose();\n this._mergeGeo.clear();\n this._faceTrees = [];\n this._mergedPatches.length = 0;\n for (const batch of this.batches || []) {\n this.group.remove(batch.mesh);\n batch.geometry.dispose();\n }\n this.batches = [];\n this.chunks = [];\n for (const m of this.materials) m.dispose();\n this.materials = [];\n for (const geo of this.geometries) geo.dispose();\n this.geometries = [];\n this.scene.remove(this.group);\n }\n}\n\nconst _sphere = new THREE.Sphere();\n","import * as THREE from 'three';\nimport { COMMON_UNIFORMS_GLSL, NOISE_GLSL } from './terrainGLSL.js';\nimport { BIOME_GLSL } from './biomeGLSL.js';\nimport {\n PLANET_UNIFORMS_GLSL, PLANET_NOISE_GLSL, PLANET_CLIMATE_GLSL, buildPlanetHeightGLSL,\n} from './planetGLSL.js';\nimport { generateStackGLSL } from './noise/noiseStackCodegen.js';\nimport { defaultLegacyStack } from './noise/NoiseStack.js';\n\nconst DEFAULT_STACK_GLSL = generateStackGLSL(defaultLegacyStack());\n\n// ============================================================================\n// Planet height/normal cubemap baker.\n//\n// The planet height field is a pure (static) function of a unit sphere\n// direction, yet the terrain + water fragment shaders re-evaluate it ~46 noise\n// octaves deep FOR EVERY PIXEL, EVERY FRAME — the terrain fragment even does it\n// three times (centre + two neighbours) to build the analytic normal. When the\n// camera is close, the globe fills the screen and that per-pixel cost (not the\n// triangle count) is what halves the framerate.\n//\n// This baker evaluates the field once into a cubemap whenever it actually\n// changes (seed / shape / biome edits — tracked by the engine's terrain\n// generation counter). Restore the stable packed representation:\n// RGB = geometric surface normal (encoded * 0.5 + 0.5)\n// A = height / heightScale\n//\n// Resolution note: at 1024/face the equator is sampled ~4096× — finer than the\n// full-LOD mesh (~2k verts around) and finer than the analytic normal epsilon\n// (uPlanetEps), so this is a performance win with no visible quality loss.\n//\n// The bake is rendered with a CubeCamera at the origin looking at a unit box\n// (BackSide). A box gives EXACT ray directions per fragment (normalize of the\n// linearly-interpolated planar position) with only 12 triangles, and the\n// CubeCamera provides the six face orientations. The engine renders one face\n// per frame: first a 256px preview, then the requested full-resolution cube.\n// ============================================================================\n\nconst BAKE_VERTEX = /* glsl */ `\nvarying vec3 vDir;\nvoid main() {\n vDir = position; // origin-centred box → position is the ray\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst buildBakeFragment = (planetHeightGLSL) => /* glsl */ `\nprecision highp float;\n\n${COMMON_UNIFORMS_GLSL}\n${PLANET_UNIFORMS_GLSL}\n${NOISE_GLSL}\n${BIOME_GLSL}\n${PLANET_NOISE_GLSL}\n${planetHeightGLSL}\n\nvarying vec3 vDir;\n\nvoid main() {\n vec3 dir = normalize(vDir);\n\n vec3 ref = abs(dir.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n vec3 t1 = normalize(cross(ref, dir));\n vec3 t2 = cross(dir, t1);\n float eps = uPlanetEps;\n vec3 dA = normalize(dir + t1 * eps);\n vec3 dB = normalize(dir + t2 * eps);\n // Same single-copy sampling loop as the live planet fragment.\n vec3 samples = vec3(0.0);\n for (int sampleIndex = 0; sampleIndex < 3 + uLoopGuard; sampleIndex++) {\n vec3 sampleDir = sampleIndex == 1 ? dA : sampleIndex == 2 ? dB : dir;\n samples[sampleIndex] = heightAt3D(sampleDir);\n }\n float hC = samples.x;\n float hA = samples.y;\n float hB = samples.z;\n vec3 pC = dir * (uPlanetRadius + hC);\n vec3 pA = dA * (uPlanetRadius + hA);\n vec3 pB = dB * (uPlanetRadius + hB);\n vec3 nGeo = normalize(cross(pA - pC, pB - pC));\n if (dot(nGeo, dir) < 0.0) nGeo = -nGeo;\n float h01 = hC / max(uHeightScale, 1e-3);\n gl_FragColor = vec4(nGeo * 0.5 + 0.5, h01);\n}\n`;\n\n// Climate cube (temperature, moisture, continentalness, erosion), baked after\n// the height faces. It depends only on climate uniforms, never on the noise\n// stack, so its small program is prepared once with the first height program.\nconst CLIMATE_BAKE_FRAGMENT = /* glsl */ `\nprecision highp float;\n\n${COMMON_UNIFORMS_GLSL}\n${PLANET_UNIFORMS_GLSL}\n${NOISE_GLSL}\n${BIOME_GLSL}\n${PLANET_NOISE_GLSL}\n${PLANET_CLIMATE_GLSL}\n\nvarying vec3 vDir;\n\nvoid main() {\n Climate c = planetClimateAt(normalize(vDir));\n gl_FragColor = vec4(c.temp, c.moist, c.cont, c.erosion);\n}\n`;\n\nexport class PlanetHeightBaker {\n /**\n * @param {object} opts\n * @param {THREE.WebGLRenderer} opts.renderer\n * @param {object} opts.uniforms shared terrain uniforms (live objects)\n * @param {number} [opts.size] cube face resolution (default 1024)\n */\n constructor({ renderer, uniforms, size = 1024, previewSize = 256, climateSize = 512, requirePrepared = false }) {\n this.renderer = renderer;\n this.uniforms = uniforms;\n this.size = size;\n this._requirePrepared = requirePrepared;\n\n this.previewSize = Math.min(size, Math.max(16, previewSize));\n this.previewTarget = this._makeTarget(this.previewSize, 'PlanetHeightNormalPreviewRGBA16F');\n this.target = this._makeTarget(size, 'PlanetHeightNormalRGBA16F');\n this.previewCamera = new THREE.CubeCamera(0.05, 10, this.previewTarget);\n this.cubeCam = new THREE.CubeCamera(0.05, 10, this.target);\n\n this.bakeScene = new THREE.Scene();\n this.material = null; // built on first bake so OCTAVES matches the params\n this.mesh = new THREE.Mesh(new THREE.BoxGeometry(2, 2, 2));\n this.mesh.frustumCulled = false;\n this.bakeScene.add(this.mesh);\n\n // climate cube: slow fields only, so a coarser face is exact enough\n this.climateSize = Math.max(16, Math.min(size, climateSize));\n this.climateTarget = this._makeTarget(this.climateSize, 'PlanetClimateRGBA16F');\n this.climateCam = new THREE.CubeCamera(0.05, 10, this.climateTarget);\n this.climateScene = new THREE.Scene();\n this.climateMaterial = new THREE.ShaderMaterial({\n uniforms: this.uniforms,\n defines: { OCTAVES: 1, PLANET_MODE: 1 },\n vertexShader: BAKE_VERTEX,\n fragmentShader: CLIMATE_BAKE_FRAGMENT,\n side: THREE.BackSide,\n depthTest: false,\n depthWrite: false,\n });\n this.climateMesh = new THREE.Mesh(this.mesh.geometry, this.climateMaterial);\n this.climateMesh.frustumCulled = false;\n this.climateScene.add(this.climateMesh);\n this._climatePrepared = false;\n this._climateTexture = null;\n\n this._octaves = -1;\n this._stackSig = null;\n this._programSerial = 0;\n this._programPrepared = false;\n this._pendingProgram = null;\n this._phase = 'idle';\n this._face = 0;\n this._texture = null;\n }\n\n get texture() { return this._texture; }\n /** Climate cube of the last completed bake (null while re-baking). */\n get climateTexture() { return this._climateTexture; }\n get phase() { return this._phase; }\n get ready() { return !!this._texture; }\n get complete() { return this._phase === 'complete'; }\n\n _makeTarget(size, name) {\n const target = new THREE.WebGLCubeRenderTarget(size, {\n type: THREE.HalfFloatType,\n format: THREE.RGBAFormat,\n magFilter: THREE.LinearFilter,\n minFilter: THREE.LinearFilter,\n generateMipmaps: false,\n });\n target.texture.colorSpace = THREE.NoColorSpace;\n target.texture.name = name;\n return target;\n }\n\n _makeProgramMaterial(octaves, stackGLSL) {\n return new THREE.ShaderMaterial({\n uniforms: this.uniforms,\n defines: { OCTAVES: octaves, PLANET_MODE: 1 },\n vertexShader: BAKE_VERTEX,\n fragmentShader: buildBakeFragment(buildPlanetHeightGLSL(stackGLSL.body3d)),\n side: THREE.BackSide,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n _ensureMaterial(octaves, stackGLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n if (this.material && this._octaves === octaves && this._stackSig === programSig) return;\n const next = this._makeProgramMaterial(octaves, stackGLSL);\n if (this.material) this.material.dispose();\n this.material = next;\n this.mesh.material = this.material;\n this._octaves = octaves;\n this._stackSig = programSig;\n this._programPrepared = false;\n this._programSerial++;\n }\n\n prepareProgram(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n // Concurrent requests for the SAME program (entering planet mode runs the\n // mode warm-up and an octave rebuild together) share one preparation, so\n // neither supersedes the other; only a request for a different program\n // advances the serial and invalidates older handles.\n const pending = this._pendingProgram?.serial === this._programSerial\n ? this._pendingProgram : null;\n if (pending && pending.octaves === octaves && pending.stackSig === programSig) {\n pending.refs++;\n return this._preparedHandle(pending);\n }\n const current = this._programPrepared\n && this._octaves === octaves\n && this._stackSig === programSig;\n if (current) {\n if (pending) {\n this._programSerial++;\n this._pendingProgram = null;\n }\n return {\n serial: this._programSerial, current: true, octaves, stackSig: programSig,\n passes: this._climatePasses(),\n };\n }\n const serial = ++this._programSerial;\n this._pendingProgram = {\n serial,\n octaves,\n stackSig: programSig,\n material: this._makeProgramMaterial(octaves, stackGLSL),\n refs: 1,\n published: false,\n };\n return this._preparedHandle(this._pendingProgram);\n }\n\n _preparedHandle(shared) {\n const preview = this.previewSize < this.size;\n const cubeCamera = preview ? this.previewCamera : this.cubeCam;\n const renderTarget = preview ? this.previewTarget : this.target;\n if (cubeCamera.parent === null) cubeCamera.updateMatrixWorld();\n if (cubeCamera.coordinateSystem !== this.renderer.coordinateSystem) {\n cubeCamera.coordinateSystem = this.renderer.coordinateSystem;\n cubeCamera.updateCoordinateSystem();\n }\n const { serial, material, octaves, stackSig } = shared;\n return {\n serial, current: false, material, octaves, stackSig, shared,\n passes: [{\n scene: this.bakeScene, camera: cubeCamera.children[0], mesh: this.mesh,\n material, renderTarget, activeCubeFace: 0, activeMipmapLevel: 0, disableXr: true,\n }, ...this._climatePasses()],\n };\n }\n\n _climatePasses() {\n if (this._climatePrepared) return [];\n if (this.climateCam.parent === null) this.climateCam.updateMatrixWorld();\n if (this.climateCam.coordinateSystem !== this.renderer.coordinateSystem) {\n this.climateCam.coordinateSystem = this.renderer.coordinateSystem;\n this.climateCam.updateCoordinateSystem();\n }\n return [{\n scene: this.climateScene, camera: this.climateCam.children[0], mesh: this.climateMesh,\n material: this.climateMaterial, renderTarget: this.climateTarget,\n activeCubeFace: 0, activeMipmapLevel: 0, disableXr: true,\n }];\n }\n\n publishPrepared(handle) {\n if (!handle || handle.serial !== this._programSerial) return false;\n if (!handle.current && handle.material !== this.material) {\n const previous = this.material;\n this.material = handle.material;\n this.mesh.material = this.material;\n this._octaves = handle.octaves;\n this._stackSig = handle.stackSig;\n previous?.dispose();\n }\n handle.published = true;\n this._climatePrepared = true; // compiled with every prepared handle\n if (handle.shared) {\n handle.shared.published = true;\n if (this._pendingProgram === handle.shared) this._pendingProgram = null;\n }\n this._programPrepared = true;\n return true;\n }\n\n discardPrepared(handle) {\n const shared = handle?.shared;\n if (shared) {\n shared.refs = Math.max(0, shared.refs - 1);\n if (shared.refs > 0) return;\n if (this._pendingProgram === shared) this._pendingProgram = null;\n }\n if (handle?.material && !handle.published && !shared?.published\n && handle.material !== this.material) {\n handle.material.dispose();\n }\n }\n /** Start a progressive bake. One call to step() renders exactly one face. */\n begin(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n if (this._requirePrepared && (!this._programPrepared\n || !this.material || this._octaves !== octaves || this._stackSig !== programSig)) {\n return false;\n }\n this._ensureMaterial(octaves, stackGLSL);\n this._texture = null;\n this._climateTexture = null;\n this._phase = this.previewSize < this.size ? 'preview' : 'full';\n this._face = 0;\n }\n\n step() {\n if (this._phase === 'idle' || this._phase === 'complete') {\n return { updated: false, ready: this.ready, complete: this.complete, texture: this.texture };\n }\n if (this._phase === 'climate') {\n this._renderFace(this.climateCam, this.climateTarget, this._face, this.climateScene);\n this._face += 1;\n if (this._face >= 6) {\n this._climateTexture = this.climateTarget.texture;\n this._phase = 'complete';\n }\n return {\n updated: true, ready: this.ready, complete: this.complete, texture: this.texture,\n phase: this._phase, face: this._face,\n };\n }\n const preview = this._phase === 'preview';\n const cubeCamera = preview ? this.previewCamera : this.cubeCam;\n const target = preview ? this.previewTarget : this.target;\n this._renderFace(cubeCamera, target, this._face);\n this._face += 1;\n\n if (this._face >= 6) {\n target.texture.needsPMREMUpdate = true;\n this._texture = target.texture;\n if (preview) {\n this._phase = 'full';\n this._face = 0;\n } else if (this._climatePrepared || !this._requirePrepared) {\n this._phase = 'climate';\n this._face = 0;\n } else {\n this._phase = 'complete';\n }\n }\n return {\n updated: true,\n ready: this.ready,\n complete: this.complete,\n texture: this.texture,\n phase: this._phase,\n face: this._face,\n };\n }\n\n _renderFace(cubeCamera, target, face, scene = this.bakeScene) {\n const r = this.renderer;\n if (cubeCamera.parent === null) cubeCamera.updateMatrixWorld();\n if (cubeCamera.coordinateSystem !== r.coordinateSystem) {\n cubeCamera.coordinateSystem = r.coordinateSystem;\n cubeCamera.updateCoordinateSystem();\n }\n const previousTarget = r.getRenderTarget();\n const previousFace = r.getActiveCubeFace?.() ?? 0;\n const previousMip = r.getActiveMipmapLevel?.() ?? 0;\n const previousXr = r.xr?.enabled;\n try {\n if (r.xr) r.xr.enabled = false;\n r.setRenderTarget(target, face, 0);\n r.render(scene, cubeCamera.children[face]);\n } finally {\n r.setRenderTarget(previousTarget, previousFace, previousMip);\n if (r.xr && previousXr !== undefined) r.xr.enabled = previousXr;\n }\n }\n\n /** Compatibility helper for tools that explicitly request a blocking bake. */\n bake(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n this.begin(octaves, stackGLSL);\n while (!this.complete) this.step();\n }\n\n dispose() {\n this.previewTarget.dispose();\n this.target.dispose();\n this.climateTarget.dispose();\n this.climateMaterial.dispose();\n this._climateTexture = null;\n this.mesh.geometry.dispose();\n if (this.material) this.material.dispose();\n this.material = null;\n }\n}\n","import * as THREE from 'three';\nimport { FiniteTerrain } from '../FiniteTerrain.js';\nimport { PlanetWorld } from '../../engine/terrain/PlanetWorld.js';\nimport { PlanetHeightSampler } from '../../engine/terrain/PlanetHeightSampler.js';\nimport { PlanetHeightBaker } from '../../engine/terrain/PlanetHeightBaker.js';\nimport { createPlanetMaterial } from '../../engine/terrain/PlanetMaterial.js';\nimport { compileMaterial } from '../resources/CompileMaterial.js';\nimport { withRendererState } from '../resources/RendererState.js';\n\nexport const planetAdapter = {\n mode: 'planet',\n layoutDefaults: { radius: 16000, faceGrid: 8, triangleBudget: 1000000, bakeResolution: 256 },\n validateLayout(l) {\n for (const [key, min, max] of [\n ['radius', 10, 1e8],\n ['faceGrid', 1, 32],\n ['triangleBudget', 0, 2e7],\n ['bakeResolution', 16, 2048],\n ])\n if (!Number.isFinite(l[key]) || l[key] < min || l[key] > max)\n throw new RangeError(`Invalid layout.${key}`);\n if (!Number.isInteger(l.faceGrid) || !Number.isInteger(l.bakeResolution))\n throw new TypeError('Planet grid and bake resolution must be integers');\n },\n createMaterial: (t, oct, program) => createPlanetMaterial(t._uniforms, oct, program),\n createRuntime(t) {\n return {\n world: null,\n baker: null,\n key: '',\n sampler: new PlanetHeightSampler(\n t._uniforms,\n () => ({ octaves: t.configuration.source.octaves, radius: t.configuration.layout.radius }),\n t._stack,\n ),\n get group() {\n return this.world.group;\n },\n update(camera) {\n this.world.update(camera.position, camera);\n },\n diagnostics() {\n return {\n chunks: this.world.chunks.length,\n visible: this.world.visibleChunkCount,\n culled: this.world.culledChunkCount,\n lodCounts: [...this.world.lodCounts],\n bakeReady: this.baker.ready,\n };\n },\n dispose() {\n if (this.world) {\n this.world.materials = [];\n this.world.dispose();\n }\n this.baker?.dispose();\n },\n };\n },\n apply(t, c) {\n const r = t._runtime,\n l = c.layout,\n u = t._uniforms,\n key = JSON.stringify([l.radius, l.faceGrid, l.bakeResolution, c.quality.lodSegments]);\n u.uPlanetRadius.value = l.radius;\n u.uPlanetEps.value = 2 / (l.faceGrid * 64);\n u.uSkirtDepth.value = Math.max(24, c.heightScale * 0.08) * 3;\n u.uFogDensity.value = 0;\n if (r.key !== key) {\n r.dispose();\n r.key = key;\n r.world = new PlanetWorld(t.object, () => t._material, {\n radius: l.radius,\n faceGrid: l.faceGrid,\n maxHeight: c.heightScale * 1.35 + 2,\n skirtDepth: u.uSkirtDepth.value,\n lodSegments: c.quality.lodSegments,\n });\n r.baseLodDistances = [...r.world._baseLodThresholds];\n r.baker = new PlanetHeightBaker({\n renderer: t._renderer,\n uniforms: u,\n size: l.bakeResolution,\n previewSize: l.bakeResolution,\n climateSize: Math.min(128, l.bakeResolution),\n requirePrepared: true,\n });\n }\n r.world.setTriangleBudget(l.triangleBudget);\n r.world.setLodDistances(r.baseLodDistances.map((d) => d * c.quality.lodDistanceScale));\n r.world.setMorphEnabled(c.quality.morphEnabled);\n r.world.setMergeOptions({ enabled: c.quality.mergeEnabled });\n r.world.cullingEnabled = c.quality.cullingEnabled;\n r.world.maxHeight = c.heightScale * 1.35 + 2;\n r.world.skirtDepth = u.uSkirtDepth.value;\n },\n async prepare(t, camera, signal, check = () => t._assertAlive()) {\n const b = t._runtime.baker,\n h = b.prepareProgram(t.configuration.source.octaves, t._stackGLSL);\n try {\n for (const pass of h.passes)\n await compileMaterial(t._renderer, pass.material, pass.camera ?? camera, {\n geometry: pass.mesh?.geometry.clone() ?? new THREE.BoxGeometry(2, 2, 2),\n });\n signal?.throwIfAborted();\n check();\n b.publishPrepared(h);\n } catch (e) {\n b.discardPrepared(h);\n throw e;\n }\n b.begin(t.configuration.source.octaves, t._stackGLSL);\n withRendererState(t._renderer, () => {\n while (!b.complete) b.step();\n });\n t._uniforms.uPlanetHeightTex.value = b.texture;\n t._uniforms.uUsePlanetHeightTex.value = 1;\n t._uniforms.uPlanetClimateTex.value = b.climateTexture;\n t._uniforms.uUsePlanetClimateTex.value = 1;\n },\n async sourceChanged(t, source, { signal, check, sourceChanged }) {\n t._runtime.sampler.setStack(t._stack);\n t._runtime.world.materials = t._runtime.world.materials.map(() => t._material);\n for (const b of t._runtime.world.batches) b.material = t._material;\n // Folded patches keep a material reference for future batch allocations.\n if (t._runtime.world._patchMaterial) t._runtime.world._patchMaterial = t._material;\n if (sourceChanged)\n await this.prepare(t, t._viewCamera ?? new THREE.PerspectiveCamera(), signal, check);\n },\n sample: (t, x, y, z) => t._runtime.sampler.heightAt3D(x, y, z),\n createProbe(t, material) {\n const geometry = t._runtime.world.batches[0].geometry.clone();\n return { geometry, mesh: new THREE.InstancedMesh(geometry, material, 1) };\n },\n};\n\nexport async function createPlanetTerrain(options) {\n return new FiniteTerrain({ ...options, _world: planetAdapter });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanetTerrain-Bsfx7YA6.js","sources":["../../../src/engine/terrain/PlanetWorld.js","../../../src/engine/terrain/PlanetHeightBaker.js","../../../src/runtime/worlds/PlanetTerrain.js"],"sourcesContent":["import * as THREE from 'three';\nimport { buildChunkGeometry, setChunkBounds } from './ChunkGeometry.js';\nimport { stepTemporalLod } from './LodMorph.js';\n\n// ============================================================================\n// PlanetWorld: a cube-sphere terrain. Six cube faces, each subdivided into a\n// faceGrid×faceGrid grid of chunks. Every chunk reuses one of the shared\n// unit-grid LOD geometries (with radial skirts) from ChunkGeometry.js.\n//\n// Visible leaf chunks are packed into four instanced LOD batches. Per-instance\n// cube-face origin/U/V attributes replace hundreds of mesh/material objects;\n// all four batches share the same shader program. Folded quadtree patches keep\n// their rare standalone meshes because they use variable topology.\n//\n// The chunk count is bounded (6 * faceGrid²) so they are all created once —\n// no streaming. LOD is chosen per frame by distance to the camera; chunks are\n// culled by the sphere horizon and the view frustum.\n// ============================================================================\n\n// Six cube faces: origin corner + two edge vectors spanning [-1,1]². For each\n// face U×V points outward, so front-facing winding is correct with FrontSide.\nconst FACES = [\n { o: [ 1, -1, -1], u: [0, 2, 0], v: [0, 0, 2] }, // +X\n { o: [-1, -1, 1], u: [0, 2, 0], v: [0, 0, -2] }, // -X\n { o: [-1, 1, -1], u: [0, 0, 2], v: [2, 0, 0] }, // +Y\n { o: [-1, -1, 1], u: [0, 0, -2], v: [2, 0, 0] }, // -Y\n { o: [-1, -1, 1], u: [2, 0, 0], v: [0, 2, 0] }, // +Z\n { o: [ 1, -1, -1], u: [-2, 0, 0], v: [0, 2, 0] }, // -Z\n];\n\nconst DEFAULT_LOD_DISTANCES = [1.4, 2.6, 4.2]; // × chunk world span\n\nexport class PlanetWorld {\n /**\n * @param {THREE.Scene} scene\n * @param {() => THREE.ShaderMaterial} makeMaterial — per-chunk material factory\n * @param {Object} opts\n * @param {number} opts.radius — planet base radius (world units)\n * @param {number} opts.maxHeight — terrain ceiling for bounds\n * @param {number} opts.skirtDepth — radial skirt depth\n * @param {number} [opts.faceGrid] — chunks per face side (default 8)\n * @param {number[]} [opts.lodSegments] — per-LOD quads per chunk side\n * @param {number[]} [opts.lodDistances] — LOD thresholds (× chunk span)\n */\n constructor(scene, makeMaterial, opts) {\n this.scene = scene;\n this.makeMaterial = makeMaterial;\n\n this.radius = opts.radius;\n this.maxHeight = opts.maxHeight;\n this.skirtDepth = opts.skirtDepth;\n this.faceGrid = opts.faceGrid || 8;\n this.lodSegments = opts.lodSegments ? [...opts.lodSegments] : [64, 32, 16, 8];\n this.wireframe = false;\n\n this.cullingEnabled = true;\n this.horizonCulling = true;\n this.cullingAggressiveness = 1.0;\n\n // --- Merge layer (per-face quadtree) ------------------------------------\n // Each cube face is a faceGrid² grid of cells = the leaves of a quadtree.\n // A full square block folds into ONE curved patch mesh (a unit grid mapped\n // across the block's face rectangle via uFaceOrigin/U/V — same shader path\n // as a chunk, just spanning N cells). Folding is 2×2 at a time so the cut\n // is smooth: fine patches near the camera, larger ones toward the limb.\n this.mergeEnabled = true;\n this.mergeQuadsPerChunk = 8;\n this.mergeDistance = 4;\n this.allowRootMerge = true;\n this._faceTrees = [];\n this._mergedPatches = []; // patch nodes folded this frame\n this._mergeGeo = new Map(); // \"res:aLod\" -> shared BufferGeometry\n // Folded patches draw as instanced batches (one InstancedMesh per patch\n // grid size) sharing ONE material, through the same instanced program as\n // the chunk batches. A material per patch (269 uniforms, 24 arrays) made\n // three.js re-upload every uniform for each of ~70 patch draws (~1 ms CPU\n // per frame in orbit) and kept a second, non-instanced program alive.\n this._patchBatches = new Map(); // \"res:aLod\" -> instanced batch\n this._patchMaterial = null;\n this._patchUploadKey = '';\n this._patchSerial = 0;\n this._instancesDirty = true;\n this._mergeDebug = false;\n this.mergedGroupCount = 0;\n this.savedDrawCalls = 0;\n\n // chunk world span ≈ arc length of one cell at the equator\n this.chunkSpan = (this.radius * 2) / this.faceGrid;\n\n this._baseLodThresholds = opts.lodDistances\n ? [...opts.lodDistances]\n : [...DEFAULT_LOD_DISTANCES];\n this.lodThresholds = this._baseLodThresholds.map(m => m * this.chunkSpan);\n\n // gradual LOD geometry rebuild queue (one level per frame)\n this._lodRebuildQueue = [];\n this._targetSegments = null;\n\n // triangle budget (scales LOD thresholds down under pressure)\n this.triangleBudget = 0;\n this._budgetScale = 1.0;\n this._budgetCheckAt = 0;\n\n this.group = new THREE.Group();\n this.group.name = 'planet-world';\n this.scene.add(this.group);\n\n // shared per-LOD geometries (unit grid + skirt ring)\n this.geometries = this.lodSegments.map((res, lod) => {\n const geo = buildChunkGeometry(res, lod, { morph: true });\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n return geo;\n });\n\n this.chunks = [];\n this.materials = [];\n this._buildChunks();\n this._buildInstancedBatches();\n\n // stats (mirror InfiniteWorld so the HUD keeps working)\n this.activeChunkCount = this.chunks.length;\n this.visibleChunkCount = this.chunks.length;\n this.culledChunkCount = 0;\n this.lodCounts = [0, 0, 0, 0];\n\n this._frustum = new THREE.Frustum();\n this._projView = new THREE.Matrix4();\n this._tmp = new THREE.Vector3();\n this._camDir = new THREE.Vector3();\n }\n\n _buildChunks() {\n const g = this.faceGrid;\n this._faceTrees = [];\n for (const face of FACES) {\n const o = new THREE.Vector3(...face.o);\n const U = new THREE.Vector3(...face.u);\n const V = new THREE.Vector3(...face.v);\n const cu = U.clone().multiplyScalar(1 / g); // per-chunk edge vectors\n const cv = V.clone().multiplyScalar(1 / g);\n const cells = Array.from({ length: g }, () => new Array(g).fill(null));\n for (let j = 0; j < g; j++) {\n for (let i = 0; i < g; i++) {\n const origin = o.clone()\n .addScaledVector(U, i / g)\n .addScaledVector(V, j / g);\n const centerDir = origin.clone()\n .addScaledVector(cu, 0.5)\n .addScaledVector(cv, 0.5)\n .normalize();\n\n const worldCenter = centerDir.clone().multiplyScalar(this.radius + this.maxHeight * 0.5);\n const boundRadius = this._patchBoundRadius(origin, cu, cv, worldCenter);\n\n const chunk = {\n origin, faceU: cu.clone(), faceV: cv.clone(), centerDir, worldCenter,\n boundRadius, lod: 3, merged: false, visible: true,\n morph: 0, fresh: true, forceLod3: false,\n };\n this.chunks.push(chunk);\n cells[j][i] = chunk;\n }\n }\n // quadtree over this face's cell grid (leaves are the chunks above)\n let size = 1;\n while (size < g) size *= 2;\n const root = this._buildFaceNode(o, U, V, cells, 0, 0, size, 0);\n if (root) this._faceTrees.push(root);\n }\n }\n\n _buildInstancedBatches() {\n const capacity = Math.max(1, this.chunks.length);\n this.batches = this.geometries.map((geometry, lod) => {\n const instancedGeometry = geometry.clone();\n const origins = new Float32Array(capacity * 3);\n const faceUs = new Float32Array(capacity * 3);\n const faceVs = new Float32Array(capacity * 3);\n instancedGeometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(origins, 3));\n instancedGeometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(faceUs, 3));\n instancedGeometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(faceVs, 3));\n const morphs = new Float32Array(capacity);\n instancedGeometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(morphs, 1));\n const material = this.makeMaterial();\n material.wireframe = this.wireframe;\n this.materials.push(material);\n const mesh = new THREE.InstancedMesh(instancedGeometry, material, capacity);\n mesh.name = `planet-lod-${lod}`;\n mesh.count = 0;\n mesh.frustumCulled = false;\n mesh.matrixAutoUpdate = false;\n mesh.updateMatrix();\n this.group.add(mesh);\n return { mesh, geometry: instancedGeometry, material, origins, faceUs, faceVs, morphs };\n });\n this._uploadInstancedBatches();\n }\n\n _uploadInstancedBatches() {\n if (!this.batches) return;\n this._instancesDirty = false;\n const counts = new Uint32Array(this.batches.length);\n for (const chunk of this.chunks) {\n if (chunk.merged || !chunk.visible) continue;\n const batch = this.batches[chunk.lod];\n const index = counts[chunk.lod]++;\n chunk.origin.toArray(batch.origins, index * 3);\n chunk.faceU.toArray(batch.faceUs, index * 3);\n chunk.faceV.toArray(batch.faceVs, index * 3);\n batch.morphs[index] = chunk.morph;\n }\n for (let lod = 0; lod < this.batches.length; lod++) {\n const batch = this.batches[lod];\n batch.mesh.count = counts[lod];\n batch.mesh.visible = counts[lod] > 0;\n for (const name of ['aFaceOrigin', 'aFaceU', 'aFaceV', 'aMorphK']) {\n const attribute = batch.geometry.getAttribute(name);\n attribute.needsUpdate = true;\n attribute.clearUpdateRanges?.();\n attribute.addUpdateRange?.(0, counts[lod] * attribute.itemSize);\n }\n }\n }\n\n // Conservative world-space bounding-sphere radius for a face rectangle\n // spanning [origin, origin+u, origin+v] projected to the displaced sphere.\n _patchBoundRadius(origin, u, v, worldCenter) {\n let br = 0;\n const cornerR = this.radius + this.maxHeight;\n for (let cy = 0; cy <= 1; cy++) {\n for (let cx = 0; cx <= 1; cx++) {\n const cw = origin.clone()\n .addScaledVector(u, cx)\n .addScaledVector(v, cy)\n .normalize()\n .multiplyScalar(cornerR);\n br = Math.max(br, cw.distanceTo(worldCenter));\n }\n }\n return br * 1.05;\n }\n\n // Build a quadtree node over face cells [x0,x0+size)×[z0,z0+size). Leaves wrap\n // the existing chunk; internal nodes own a lazily-built curved patch mesh.\n _buildFaceNode(O, U, V, cells, x0, z0, size, level) {\n const g = this.faceGrid;\n if (size === 1) {\n const chunk = (z0 < g && x0 < g) ? cells[z0][x0] : null;\n if (!chunk) return null;\n chunk.merged = false;\n return {\n leaf: true, chunk, children: null, chunks: [chunk], level, full: true,\n centerDir: chunk.centerDir, worldCenter: chunk.worldCenter,\n boundRadius: chunk.boundRadius, spanWorld: this.chunkSpan,\n mesh: null, material: null, merged: false,\n };\n }\n const half = size / 2;\n const offs = [[x0, z0], [x0 + half, z0], [x0, z0 + half], [x0 + half, z0 + half]];\n const children = [];\n const chunks = [];\n for (const [ox, oz] of offs) {\n const child = this._buildFaceNode(O, U, V, cells, ox, oz, half, level + 1);\n if (child) { children.push(child); for (const c of child.chunks) chunks.push(c); }\n }\n if (!children.length) return null;\n const full = (x0 + size <= g) && (z0 + size <= g);\n if (!full && children.length === 1) return children[0];\n\n const g_ = g;\n const faceOrigin = O.clone().addScaledVector(U, x0 / g_).addScaledVector(V, z0 / g_);\n const faceU = U.clone().multiplyScalar(size / g_);\n const faceV = V.clone().multiplyScalar(size / g_);\n const centerDir = faceOrigin.clone().addScaledVector(faceU, 0.5).addScaledVector(faceV, 0.5).normalize();\n const worldCenter = centerDir.clone().multiplyScalar(this.radius + this.maxHeight * 0.5);\n return {\n leaf: false, chunk: null, children, chunks, level, full, n: size,\n faceOrigin, faceU, faceV, centerDir, worldCenter,\n boundRadius: this._patchBoundRadius(faceOrigin, faceU, faceV, worldCenter),\n spanWorld: size * this.chunkSpan, merged: false, visible: false,\n patchKey: null, patchRes: 0, patchLod: 0, serial: null,\n };\n }\n\n setWireframe(on) {\n this.wireframe = on;\n for (const m of this.materials) m.wireframe = on;\n }\n\n /** Swap the compile-time octave count on every chunk material (the program\n * is shared and already cached, so this is instant once warmed). */\n setOctaves(oct) {\n for (const m of this.materials) {\n if (m.defines.OCTAVES !== oct) {\n m.defines.OCTAVES = oct;\n m.needsUpdate = true;\n }\n }\n }\n\n setLodDistances(distances) {\n this._baseLodThresholds = [...distances];\n this._recalcLodThresholds();\n }\n\n _recalcLodThresholds() {\n this.lodThresholds = this._baseLodThresholds.map(\n m => m * this.chunkSpan * this._budgetScale\n );\n }\n\n // --- temporal geomorph -----------------------------------------------------\n // LOD decisions are unchanged; each change is animated instead of popping.\n // chunk.lod is the rendered grid, chunk.morph (0..1) how far its odd vertices\n // have slid onto the next-coarser grid (uploaded as the aMorphK attribute).\n setMorphEnabled(enabled) {\n this.morphEnabled = !!enabled;\n }\n\n _stepChunkLod(chunk, target, step) {\n stepTemporalLod(chunk, target, step, this.lodSegments, this.morphEnabled !== false);\n }\n\n _publishMorph() {\n const u = this.materials[0]?.uniforms?.uLodGridSegments;\n if (u) u.value.set(this.lodSegments[0], this.lodSegments[1], this.lodSegments[2], this.lodSegments[3]);\n }\n\n /** Change per-LOD segment counts — rebuilt gradually (one level/frame). */\n setLodSegments(segments) {\n const same = segments.length === this.lodSegments.length\n && segments.every((s, i) => s === this.lodSegments[i])\n && !this._lodRebuildQueue.length;\n if (same) return;\n this._targetSegments = [...segments];\n this._lodRebuildQueue = [3, 2, 1, 0];\n }\n\n _processLodRebuild() {\n if (!this._lodRebuildQueue.length || !this._targetSegments) return;\n const lod = this._lodRebuildQueue.shift();\n const res = this._targetSegments[lod];\n if (res === this.lodSegments[lod]) return;\n\n const geo = buildChunkGeometry(res, lod, { morph: true });\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n const old = this.geometries[lod];\n this.geometries[lod] = geo;\n this.lodSegments[lod] = res;\n if (this.batches?.[lod]) {\n const batch = this.batches[lod];\n const instancedGeometry = geo.clone();\n instancedGeometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(batch.origins, 3));\n instancedGeometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(batch.faceUs, 3));\n instancedGeometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(batch.faceVs, 3));\n instancedGeometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(batch.morphs, 1));\n batch.geometry.dispose();\n batch.geometry = instancedGeometry;\n batch.mesh.geometry = instancedGeometry;\n this._instancesDirty = true;\n }\n old.dispose();\n }\n\n setTriangleBudget(n) {\n this.triangleBudget = n;\n if (!n) { this._budgetScale = 1.0; this._recalcLodThresholds(); }\n }\n\n notifyTriangles(triangles) {\n if (!this.triangleBudget) return;\n const now = performance.now();\n if (now - this._budgetCheckAt < 500) return;\n this._budgetCheckAt = now;\n if (triangles > this.triangleBudget && this._budgetScale > 0.35) {\n this._budgetScale = Math.max(0.35, this._budgetScale * 0.9);\n this._recalcLodThresholds();\n } else if (triangles < this.triangleBudget * 0.7 && this._budgetScale < 1.0) {\n this._budgetScale = Math.min(1.0, this._budgetScale * 1.05);\n this._recalcLodThresholds();\n }\n }\n\n /** Tune the merge layer (performance settings). */\n setMergeOptions({ enabled, quadsPerChunk, mergeDistance, macroEnabled } = {}) {\n if (enabled !== undefined) {\n this.mergeEnabled = !!enabled;\n if (!this.mergeEnabled) this._restoreMerge();\n }\n if (macroEnabled !== undefined) this.allowRootMerge = !!macroEnabled;\n if (mergeDistance !== undefined && Number.isFinite(+mergeDistance)) {\n this.mergeDistance = Math.max(0.5, +mergeDistance);\n }\n if (quadsPerChunk !== undefined) {\n const v = Math.max(2, Math.round(quadsPerChunk));\n if (v !== this.mergeQuadsPerChunk) { this.mergeQuadsPerChunk = v; this._disposePatchMeshes(); }\n }\n }\n\n /** Toggle the merge-debug surface tint (drives the shared uMergeDebug). */\n setMergeDebug(on) {\n this._mergeDebug = !!on;\n // shared uniform object → every chunk/patch material sees it at once\n const u = this.materials[0]?.uniforms?.uMergeDebug;\n if (u) u.value = this._mergeDebug ? 1.0 : 0.0;\n }\n\n update(cameraPos, camera, debug = {}) {\n this._processLodRebuild();\n this._publishMorph();\n const nowMs = performance.now();\n const dt = this._lastUpdateAt == null ? 0 : Math.min(0.1, Math.max(0, (nowMs - this._lastUpdateAt) / 1000));\n this._lastUpdateAt = nowMs;\n const morphStep = dt / Math.max(0.05, this.morphDuration ?? 0.4);\n for (const c of this.chunks) c.forceLod3 = false;\n\n const [t0, t1, t2] = this.lodThresholds;\n const counts = [0, 0, 0, 0];\n const freezeCulling = !!debug.freezeCulling;\n const freezeLod = !!debug.freezeLod;\n\n // camera direction from planet center + altitude drive the horizon test.\n const camLen = this._camDir.copy(cameraPos).length();\n this._camDir.multiplyScalar(camLen > 1e-3 ? 1 / camLen : 0);\n const base = this.radius / Math.max(camLen, 1);\n const margin = 0.08 + (1 - this.cullingAggressiveness) * 0.10;\n const horizonCos = base - margin;\n\n if (!freezeCulling && camera) {\n this._projView.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n this._frustum.setFromProjectionMatrix(this._projView);\n }\n\n // 1. Fold pass: decide which face blocks collapse into patches (distance\n // only). Skipped while LOD is frozen so the fold layout holds.\n if (this.mergeEnabled && !freezeLod) {\n this._mergedPatches.length = 0;\n this._hiddenByMerge = 0;\n for (const root of this._faceTrees) this._foldPass(root, cameraPos);\n this.mergedGroupCount = this._mergedPatches.length;\n this.savedDrawCalls = Math.max(0, this._hiddenByMerge - this._mergedPatches.length);\n }\n\n // 2. Per-chunk LOD + cull (folded chunks are hidden, skip them).\n let visible = 0, culled = 0;\n let morphing = 0;\n let dirty = this._instancesDirty;\n for (const c of this.chunks) {\n if (c.merged) {\n if (c.visible) { c.visible = false; dirty = true; }\n continue;\n }\n const d = this._tmp.copy(c.worldCenter).sub(cameraPos).length();\n const lod = c.forceLod3 ? 3 : (d < t0 ? 0 : d < t1 ? 1 : d < t2 ? 2 : 3);\n const prevLod = c.lod;\n const prevMorph = c.morph;\n if (!freezeLod) this._stepChunkLod(c, lod, morphStep);\n if (c.morph > 0 || c.lod !== lod) morphing++;\n counts[c.lod]++;\n\n let show = c.visible;\n if (!freezeCulling) {\n show = this._isVisible(c.centerDir, c.worldCenter, c.boundRadius, camLen, horizonCos, camera);\n }\n if (show !== c.visible || c.lod !== prevLod || c.morph !== prevMorph) dirty = true;\n c.visible = show;\n if (show) visible++; else culled++;\n }\n // instance data only changes with visibility / LOD / morph\n if (dirty) this._uploadInstancedBatches();\n\n // 3. Cull the folded patches (LOD is fixed for a patch).\n for (const p of this._mergedPatches) {\n let show = p.visible;\n if (!freezeCulling) {\n show = this._isVisible(p.centerDir, p.worldCenter, p.boundRadius, camLen, horizonCos, camera);\n }\n p.visible = show;\n if (show) visible++; else culled++;\n }\n this._uploadPatchBatches();\n\n this.lodCounts = counts;\n this.activeChunkCount = this.chunks.length;\n this.visibleChunkCount = visible;\n this.culledChunkCount = culled;\n this.morphingChunkCount = morphing;\n }\n\n // Horizon (back-of-planet) + frustum visibility test for one patch/chunk.\n _isVisible(centerDir, worldCenter, boundRadius, camLen, horizonCos, camera) {\n if (!this.cullingEnabled) return true;\n if (this.horizonCulling && camLen > this.radius && this._camDir.dot(centerDir) < horizonCos) {\n return false;\n }\n if (camera && !this._frustum.intersectsSphere(_sphere.set(worldCenter, boundRadius))) {\n return false;\n }\n return true;\n }\n\n // --- merge traversal -----------------------------------------------------\n _foldPass(node, camPos) {\n if (node.leaf) {\n if (node.chunk.merged) { node.chunk.merged = false; this._instancesDirty = true; }\n return;\n }\n const canFold = node.full && (this.allowRootMerge || node.level > 0);\n if (canFold) {\n const nearest = this._tmp.copy(node.worldCenter).sub(camPos).length() - node.boundRadius;\n const foldDist = node.spanWorld * this.mergeDistance * this._budgetScale;\n const want = node.merged ? nearest > foldDist * 0.85 : nearest > foldDist;\n // Temporal geomorph: a patch only folds once every chunk under it has\n // morphed down to the LOD3 grid (= patch density); until then they are\n // steered there, so the fold itself changes nothing on screen.\n const ready = node.merged || this.morphEnabled === false\n || node.chunks.every((c) => c.lod === 3 && c.morph === 0);\n if (want && !ready) {\n for (const c of node.chunks) c.forceLod3 = true;\n }\n if (want && ready) {\n if (!node.merged) this._foldPatch(node);\n this._mergedPatches.push(node);\n this._hiddenByMerge += node.chunks.length;\n return;\n }\n }\n if (node.merged) this._unfoldPatch(node);\n for (const child of node.children) this._foldPass(child, camPos);\n }\n\n _foldPatch(node) {\n node.merged = true;\n if (!node.patchKey) {\n const tier = Math.max(1, Math.round(Math.log2(node.n)));\n node.patchRes = Math.min(160, Math.max(8, node.n * this.mergeQuadsPerChunk));\n node.patchLod = 3 + Math.min(5, tier);\n node.patchKey = `${node.patchRes}:${node.patchLod}`;\n }\n node.visible = true;\n this._instancesDirty = true; // its chunks leave the chunk batches\n for (const c of node.chunks) { c.merged = true; c.visible = false; }\n this._forEachDescendantInternal(node, (d) => {\n d.merged = false;\n d.visible = false;\n });\n }\n\n _unfoldPatch(node) {\n node.merged = false;\n node.visible = false;\n this._instancesDirty = true;\n }\n\n _ensurePatchMaterial() {\n if (this._patchMaterial) return this._patchMaterial;\n const mat = this.makeMaterial();\n mat.wireframe = this.wireframe;\n // match the live octave count (makeMaterial captured the count at planet\n // creation; setOctaves only updates materials that already exist)\n const liveOct = this.materials[0]?.defines?.OCTAVES;\n if (liveOct !== undefined && mat.defines.OCTAVES !== liveOct) {\n mat.defines.OCTAVES = liveOct;\n mat.needsUpdate = true;\n }\n this.materials.push(mat); // so wireframe / octave / source updates reach it\n this._patchMaterial = mat;\n return mat;\n }\n\n // Upper bound of simultaneously folded patches sharing one grid size.\n _patchCapacity(key) {\n let n = 0;\n this._forEachInternal((node) => {\n if (!node.full) return;\n const tier = Math.max(1, Math.round(Math.log2(node.n)));\n const res = Math.min(160, Math.max(8, node.n * this.mergeQuadsPerChunk));\n if (`${res}:${3 + Math.min(5, tier)}` === key) n++;\n });\n return Math.max(1, n);\n }\n\n _ensurePatchBatch(node) {\n let batch = this._patchBatches.get(node.patchKey);\n if (batch) return batch;\n const capacity = this._patchCapacity(node.patchKey);\n const geometry = this._mergeGeometry(node.patchRes, node.patchLod).clone();\n const origins = new Float32Array(capacity * 3);\n const faceUs = new Float32Array(capacity * 3);\n const faceVs = new Float32Array(capacity * 3);\n geometry.setAttribute('aFaceOrigin', new THREE.InstancedBufferAttribute(origins, 3));\n geometry.setAttribute('aFaceU', new THREE.InstancedBufferAttribute(faceUs, 3));\n geometry.setAttribute('aFaceV', new THREE.InstancedBufferAttribute(faceVs, 3));\n // patches never geomorph: explicit zeros instead of whatever generic\n // attribute value the driver holds for the missing slots\n geometry.setAttribute('aMorph', new THREE.BufferAttribute(new Float32Array(geometry.attributes.position.count), 1));\n geometry.setAttribute('aMorphK', new THREE.InstancedBufferAttribute(new Float32Array(capacity), 1));\n const mesh = new THREE.InstancedMesh(geometry, this._ensurePatchMaterial(), capacity);\n mesh.name = `planet-patch-${node.patchKey}`;\n mesh.count = 0;\n mesh.visible = false;\n mesh.frustumCulled = false;\n mesh.matrixAutoUpdate = false;\n mesh.updateMatrix();\n this.group.add(mesh);\n batch = { mesh, geometry, origins, faceUs, faceVs, capacity };\n this._patchBatches.set(node.patchKey, batch);\n return batch;\n }\n\n _uploadPatchBatches() {\n // Re-upload only when the set of visible patches changed.\n let key = '';\n for (const p of this._mergedPatches) {\n if (!p.visible) continue;\n if (p.serial == null) p.serial = ++this._patchSerial;\n key += `${p.serial},`;\n }\n if (key === this._patchUploadKey) return;\n this._patchUploadKey = key;\n const counts = new Map();\n for (const p of this._mergedPatches) {\n if (!p.visible) continue;\n const batch = this._ensurePatchBatch(p);\n const index = counts.get(batch) || 0;\n if (index >= batch.capacity) continue;\n counts.set(batch, index + 1);\n p.faceOrigin.toArray(batch.origins, index * 3);\n p.faceU.toArray(batch.faceUs, index * 3);\n p.faceV.toArray(batch.faceVs, index * 3);\n }\n for (const batch of this._patchBatches.values()) {\n const count = counts.get(batch) || 0;\n batch.mesh.count = count;\n batch.mesh.visible = count > 0;\n for (const name of ['aFaceOrigin', 'aFaceU', 'aFaceV']) {\n const attribute = batch.geometry.getAttribute(name);\n attribute.needsUpdate = true;\n attribute.clearUpdateRanges?.();\n attribute.addUpdateRange?.(0, count * attribute.itemSize);\n }\n }\n }\n\n _hidePatchBatches() {\n for (const batch of this._patchBatches.values()) {\n batch.mesh.count = 0;\n batch.mesh.visible = false;\n }\n this._patchUploadKey = '';\n }\n\n _disposePatchBatches() {\n for (const batch of this._patchBatches.values()) {\n this.group.remove(batch.mesh);\n batch.geometry.dispose();\n }\n this._patchBatches.clear();\n this._patchUploadKey = '';\n }\n\n _mergeGeometry(res, aLod) {\n const key = `${res}:${aLod}`;\n let geo = this._mergeGeo.get(key);\n if (!geo) {\n geo = buildChunkGeometry(res, aLod);\n setChunkBounds(geo, 1, this.maxHeight, this.skirtDepth);\n this._mergeGeo.set(key, geo);\n }\n return geo;\n }\n\n _forEachDescendantInternal(node, fn) {\n if (!node.children) return;\n for (const child of node.children) {\n if (child.leaf) continue;\n fn(child);\n this._forEachDescendantInternal(child, fn);\n }\n }\n\n _forEachInternal(fn) {\n const rec = (n) => {\n if (!n || n.leaf) return;\n fn(n);\n for (const c of n.children) rec(c);\n };\n for (const root of this._faceTrees) rec(root);\n }\n\n _restoreMerge() {\n for (const c of this.chunks) { c.merged = false; }\n this._forEachInternal((n) => { n.merged = false; n.visible = false; });\n this._mergedPatches.length = 0;\n this._hidePatchBatches();\n this._instancesDirty = true;\n this.mergedGroupCount = 0;\n this.savedDrawCalls = 0;\n }\n\n _disposePatchMeshes() {\n this._disposePatchBatches();\n this._forEachInternal((n) => {\n n.merged = false;\n n.visible = false;\n n.patchKey = null;\n });\n for (const c of this.chunks) c.merged = false;\n this._mergedPatches.length = 0;\n this._instancesDirty = true;\n }\n\n dispose() {\n this._disposePatchBatches();\n this._patchMaterial = null;\n for (const geo of this._mergeGeo.values()) geo.dispose();\n this._mergeGeo.clear();\n this._faceTrees = [];\n this._mergedPatches.length = 0;\n for (const batch of this.batches || []) {\n this.group.remove(batch.mesh);\n batch.geometry.dispose();\n }\n this.batches = [];\n this.chunks = [];\n for (const m of this.materials) m.dispose();\n this.materials = [];\n for (const geo of this.geometries) geo.dispose();\n this.geometries = [];\n this.scene.remove(this.group);\n }\n}\n\nconst _sphere = new THREE.Sphere();\n","import * as THREE from 'three';\nimport { COMMON_UNIFORMS_GLSL, NOISE_GLSL } from './terrainGLSL.js';\nimport { BIOME_GLSL } from './biomeGLSL.js';\nimport {\n PLANET_UNIFORMS_GLSL, PLANET_NOISE_GLSL, PLANET_CLIMATE_GLSL, buildPlanetHeightGLSL,\n} from './planetGLSL.js';\nimport { generateStackGLSL } from './noise/noiseStackCodegen.js';\nimport { defaultLegacyStack } from './noise/NoiseStack.js';\n\nconst DEFAULT_STACK_GLSL = generateStackGLSL(defaultLegacyStack());\n\n// ============================================================================\n// Planet height/normal cubemap baker.\n//\n// The planet height field is a pure (static) function of a unit sphere\n// direction, yet the terrain + water fragment shaders re-evaluate it ~46 noise\n// octaves deep FOR EVERY PIXEL, EVERY FRAME — the terrain fragment even does it\n// three times (centre + two neighbours) to build the analytic normal. When the\n// camera is close, the globe fills the screen and that per-pixel cost (not the\n// triangle count) is what halves the framerate.\n//\n// This baker evaluates the field once into a cubemap whenever it actually\n// changes (seed / shape / biome edits — tracked by the engine's terrain\n// generation counter). Restore the stable packed representation:\n// RGB = geometric surface normal (encoded * 0.5 + 0.5)\n// A = height / heightScale\n//\n// Resolution note: at 1024/face the equator is sampled ~4096× — finer than the\n// full-LOD mesh (~2k verts around) and finer than the analytic normal epsilon\n// (uPlanetEps), so this is a performance win with no visible quality loss.\n//\n// The bake is rendered with a CubeCamera at the origin looking at a unit box\n// (BackSide). A box gives EXACT ray directions per fragment (normalize of the\n// linearly-interpolated planar position) with only 12 triangles, and the\n// CubeCamera provides the six face orientations. The engine renders one face\n// per frame: first a 256px preview, then the requested full-resolution cube.\n// ============================================================================\n\nconst BAKE_VERTEX = /* glsl */ `\nvarying vec3 vDir;\nvoid main() {\n vDir = position; // origin-centred box → position is the ray\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst buildBakeFragment = (planetHeightGLSL) => /* glsl */ `\nprecision highp float;\n\n${COMMON_UNIFORMS_GLSL}\n${PLANET_UNIFORMS_GLSL}\n${NOISE_GLSL}\n${BIOME_GLSL}\n${PLANET_NOISE_GLSL}\n${planetHeightGLSL}\n\nvarying vec3 vDir;\n\nvoid main() {\n vec3 dir = normalize(vDir);\n\n vec3 ref = abs(dir.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n vec3 t1 = normalize(cross(ref, dir));\n vec3 t2 = cross(dir, t1);\n float eps = uPlanetEps;\n vec3 dA = normalize(dir + t1 * eps);\n vec3 dB = normalize(dir + t2 * eps);\n // Same single-copy sampling loop as the live planet fragment.\n vec3 samples = vec3(0.0);\n for (int sampleIndex = 0; sampleIndex < 3 + uLoopGuard; sampleIndex++) {\n vec3 sampleDir = sampleIndex == 1 ? dA : sampleIndex == 2 ? dB : dir;\n samples[sampleIndex] = heightAt3D(sampleDir);\n }\n float hC = samples.x;\n float hA = samples.y;\n float hB = samples.z;\n vec3 pC = dir * (uPlanetRadius + hC);\n vec3 pA = dA * (uPlanetRadius + hA);\n vec3 pB = dB * (uPlanetRadius + hB);\n vec3 nGeo = normalize(cross(pA - pC, pB - pC));\n if (dot(nGeo, dir) < 0.0) nGeo = -nGeo;\n float h01 = hC / max(uHeightScale, 1e-3);\n gl_FragColor = vec4(nGeo * 0.5 + 0.5, h01);\n}\n`;\n\n// Climate cube (temperature, moisture, continentalness, erosion), baked after\n// the height faces. It depends only on climate uniforms, never on the noise\n// stack, so its small program is prepared once with the first height program.\nconst CLIMATE_BAKE_FRAGMENT = /* glsl */ `\nprecision highp float;\n\n${COMMON_UNIFORMS_GLSL}\n${PLANET_UNIFORMS_GLSL}\n${NOISE_GLSL}\n${BIOME_GLSL}\n${PLANET_NOISE_GLSL}\n${PLANET_CLIMATE_GLSL}\n\nvarying vec3 vDir;\n\nvoid main() {\n Climate c = planetClimateAt(normalize(vDir));\n gl_FragColor = vec4(c.temp, c.moist, c.cont, c.erosion);\n}\n`;\n\nexport class PlanetHeightBaker {\n /**\n * @param {object} opts\n * @param {THREE.WebGLRenderer} opts.renderer\n * @param {object} opts.uniforms shared terrain uniforms (live objects)\n * @param {number} [opts.size] cube face resolution (default 1024)\n */\n constructor({ renderer, uniforms, size = 1024, previewSize = 256, climateSize = 512, requirePrepared = false }) {\n this.renderer = renderer;\n this.uniforms = uniforms;\n this.size = size;\n this._requirePrepared = requirePrepared;\n\n this.previewSize = Math.min(size, Math.max(16, previewSize));\n this.previewTarget = this._makeTarget(this.previewSize, 'PlanetHeightNormalPreviewRGBA16F');\n this.target = this._makeTarget(size, 'PlanetHeightNormalRGBA16F');\n this.previewCamera = new THREE.CubeCamera(0.05, 10, this.previewTarget);\n this.cubeCam = new THREE.CubeCamera(0.05, 10, this.target);\n\n this.bakeScene = new THREE.Scene();\n this.material = null; // built on first bake so OCTAVES matches the params\n this.mesh = new THREE.Mesh(new THREE.BoxGeometry(2, 2, 2));\n this.mesh.frustumCulled = false;\n this.bakeScene.add(this.mesh);\n\n // climate cube: slow fields only, so a coarser face is exact enough\n this.climateSize = Math.max(16, Math.min(size, climateSize));\n this.climateTarget = this._makeTarget(this.climateSize, 'PlanetClimateRGBA16F');\n this.climateCam = new THREE.CubeCamera(0.05, 10, this.climateTarget);\n this.climateScene = new THREE.Scene();\n this.climateMaterial = new THREE.ShaderMaterial({\n uniforms: this.uniforms,\n defines: { OCTAVES: 1, PLANET_MODE: 1 },\n vertexShader: BAKE_VERTEX,\n fragmentShader: CLIMATE_BAKE_FRAGMENT,\n side: THREE.BackSide,\n depthTest: false,\n depthWrite: false,\n });\n this.climateMesh = new THREE.Mesh(this.mesh.geometry, this.climateMaterial);\n this.climateMesh.frustumCulled = false;\n this.climateScene.add(this.climateMesh);\n this._climatePrepared = false;\n this._climateTexture = null;\n\n this._octaves = -1;\n this._stackSig = null;\n this._programSerial = 0;\n this._programPrepared = false;\n this._pendingProgram = null;\n this._phase = 'idle';\n this._face = 0;\n this._texture = null;\n }\n\n get texture() { return this._texture; }\n /** Climate cube of the last completed bake (null while re-baking). */\n get climateTexture() { return this._climateTexture; }\n get phase() { return this._phase; }\n get ready() { return !!this._texture; }\n get complete() { return this._phase === 'complete'; }\n\n _makeTarget(size, name) {\n const target = new THREE.WebGLCubeRenderTarget(size, {\n type: THREE.HalfFloatType,\n format: THREE.RGBAFormat,\n magFilter: THREE.LinearFilter,\n minFilter: THREE.LinearFilter,\n generateMipmaps: false,\n });\n target.texture.colorSpace = THREE.NoColorSpace;\n target.texture.name = name;\n return target;\n }\n\n _makeProgramMaterial(octaves, stackGLSL) {\n return new THREE.ShaderMaterial({\n uniforms: this.uniforms,\n defines: { OCTAVES: octaves, PLANET_MODE: 1 },\n vertexShader: BAKE_VERTEX,\n fragmentShader: buildBakeFragment(buildPlanetHeightGLSL(stackGLSL.body3d)),\n side: THREE.BackSide,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n _ensureMaterial(octaves, stackGLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n if (this.material && this._octaves === octaves && this._stackSig === programSig) return;\n const next = this._makeProgramMaterial(octaves, stackGLSL);\n if (this.material) this.material.dispose();\n this.material = next;\n this.mesh.material = this.material;\n this._octaves = octaves;\n this._stackSig = programSig;\n this._programPrepared = false;\n this._programSerial++;\n }\n\n prepareProgram(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n // Concurrent requests for the SAME program (entering planet mode runs the\n // mode warm-up and an octave rebuild together) share one preparation, so\n // neither supersedes the other; only a request for a different program\n // advances the serial and invalidates older handles.\n const pending = this._pendingProgram?.serial === this._programSerial\n ? this._pendingProgram : null;\n if (pending && pending.octaves === octaves && pending.stackSig === programSig) {\n pending.refs++;\n return this._preparedHandle(pending);\n }\n const current = this._programPrepared\n && this._octaves === octaves\n && this._stackSig === programSig;\n if (current) {\n if (pending) {\n this._programSerial++;\n this._pendingProgram = null;\n }\n return {\n serial: this._programSerial, current: true, octaves, stackSig: programSig,\n passes: this._climatePasses(),\n };\n }\n const serial = ++this._programSerial;\n this._pendingProgram = {\n serial,\n octaves,\n stackSig: programSig,\n material: this._makeProgramMaterial(octaves, stackGLSL),\n refs: 1,\n published: false,\n };\n return this._preparedHandle(this._pendingProgram);\n }\n\n _preparedHandle(shared) {\n const preview = this.previewSize < this.size;\n const cubeCamera = preview ? this.previewCamera : this.cubeCam;\n const renderTarget = preview ? this.previewTarget : this.target;\n if (cubeCamera.parent === null) cubeCamera.updateMatrixWorld();\n if (cubeCamera.coordinateSystem !== this.renderer.coordinateSystem) {\n cubeCamera.coordinateSystem = this.renderer.coordinateSystem;\n cubeCamera.updateCoordinateSystem();\n }\n const { serial, material, octaves, stackSig } = shared;\n return {\n serial, current: false, material, octaves, stackSig, shared,\n passes: [{\n scene: this.bakeScene, camera: cubeCamera.children[0], mesh: this.mesh,\n material, renderTarget, activeCubeFace: 0, activeMipmapLevel: 0, disableXr: true,\n }, ...this._climatePasses()],\n };\n }\n\n _climatePasses() {\n if (this._climatePrepared) return [];\n if (this.climateCam.parent === null) this.climateCam.updateMatrixWorld();\n if (this.climateCam.coordinateSystem !== this.renderer.coordinateSystem) {\n this.climateCam.coordinateSystem = this.renderer.coordinateSystem;\n this.climateCam.updateCoordinateSystem();\n }\n return [{\n scene: this.climateScene, camera: this.climateCam.children[0], mesh: this.climateMesh,\n material: this.climateMaterial, renderTarget: this.climateTarget,\n activeCubeFace: 0, activeMipmapLevel: 0, disableXr: true,\n }];\n }\n\n publishPrepared(handle) {\n if (!handle || handle.serial !== this._programSerial) return false;\n if (!handle.current && handle.material !== this.material) {\n const previous = this.material;\n this.material = handle.material;\n this.mesh.material = this.material;\n this._octaves = handle.octaves;\n this._stackSig = handle.stackSig;\n previous?.dispose();\n }\n handle.published = true;\n this._climatePrepared = true; // compiled with every prepared handle\n if (handle.shared) {\n handle.shared.published = true;\n if (this._pendingProgram === handle.shared) this._pendingProgram = null;\n }\n this._programPrepared = true;\n return true;\n }\n\n discardPrepared(handle) {\n const shared = handle?.shared;\n if (shared) {\n shared.refs = Math.max(0, shared.refs - 1);\n if (shared.refs > 0) return;\n if (this._pendingProgram === shared) this._pendingProgram = null;\n }\n if (handle?.material && !handle.published && !shared?.published\n && handle.material !== this.material) {\n handle.material.dispose();\n }\n }\n /** Start a progressive bake. One call to step() renders exactly one face. */\n begin(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n const programSig = stackGLSL.heightSig || stackGLSL.sig;\n if (this._requirePrepared && (!this._programPrepared\n || !this.material || this._octaves !== octaves || this._stackSig !== programSig)) {\n return false;\n }\n this._ensureMaterial(octaves, stackGLSL);\n this._texture = null;\n this._climateTexture = null;\n this._phase = this.previewSize < this.size ? 'preview' : 'full';\n this._face = 0;\n }\n\n step() {\n if (this._phase === 'idle' || this._phase === 'complete') {\n return { updated: false, ready: this.ready, complete: this.complete, texture: this.texture };\n }\n if (this._phase === 'climate') {\n this._renderFace(this.climateCam, this.climateTarget, this._face, this.climateScene);\n this._face += 1;\n if (this._face >= 6) {\n this._climateTexture = this.climateTarget.texture;\n this._phase = 'complete';\n }\n return {\n updated: true, ready: this.ready, complete: this.complete, texture: this.texture,\n phase: this._phase, face: this._face,\n };\n }\n const preview = this._phase === 'preview';\n const cubeCamera = preview ? this.previewCamera : this.cubeCam;\n const target = preview ? this.previewTarget : this.target;\n this._renderFace(cubeCamera, target, this._face);\n this._face += 1;\n\n if (this._face >= 6) {\n target.texture.needsPMREMUpdate = true;\n this._texture = target.texture;\n if (preview) {\n this._phase = 'full';\n this._face = 0;\n } else if (this._climatePrepared || !this._requirePrepared) {\n this._phase = 'climate';\n this._face = 0;\n } else {\n this._phase = 'complete';\n }\n }\n return {\n updated: true,\n ready: this.ready,\n complete: this.complete,\n texture: this.texture,\n phase: this._phase,\n face: this._face,\n };\n }\n\n _renderFace(cubeCamera, target, face, scene = this.bakeScene) {\n const r = this.renderer;\n if (cubeCamera.parent === null) cubeCamera.updateMatrixWorld();\n if (cubeCamera.coordinateSystem !== r.coordinateSystem) {\n cubeCamera.coordinateSystem = r.coordinateSystem;\n cubeCamera.updateCoordinateSystem();\n }\n const previousTarget = r.getRenderTarget();\n const previousFace = r.getActiveCubeFace?.() ?? 0;\n const previousMip = r.getActiveMipmapLevel?.() ?? 0;\n const previousXr = r.xr?.enabled;\n try {\n if (r.xr) r.xr.enabled = false;\n r.setRenderTarget(target, face, 0);\n r.render(scene, cubeCamera.children[face]);\n } finally {\n r.setRenderTarget(previousTarget, previousFace, previousMip);\n if (r.xr && previousXr !== undefined) r.xr.enabled = previousXr;\n }\n }\n\n /** Compatibility helper for tools that explicitly request a blocking bake. */\n bake(octaves, stackGLSL = DEFAULT_STACK_GLSL) {\n this.begin(octaves, stackGLSL);\n while (!this.complete) this.step();\n }\n\n dispose() {\n this.previewTarget.dispose();\n this.target.dispose();\n this.climateTarget.dispose();\n this.climateMaterial.dispose();\n this._climateTexture = null;\n this.mesh.geometry.dispose();\n if (this.material) this.material.dispose();\n this.material = null;\n }\n}\n","import * as THREE from 'three';\nimport { FiniteTerrain } from '../FiniteTerrain.js';\nimport { PlanetWorld } from '../../engine/terrain/PlanetWorld.js';\nimport { PlanetHeightSampler } from '../../engine/terrain/PlanetHeightSampler.js';\nimport { PlanetHeightBaker } from '../../engine/terrain/PlanetHeightBaker.js';\nimport { createPlanetMaterial } from '../../engine/terrain/PlanetMaterial.js';\nimport { compileMaterial } from '../resources/CompileMaterial.js';\nimport { withRendererState } from '../resources/RendererState.js';\n\nexport const planetAdapter = {\n mode: 'planet',\n layoutDefaults: { radius: 16000, faceGrid: 8, triangleBudget: 1000000, bakeResolution: 256 },\n validateLayout(l) {\n for (const [key, min, max] of [\n ['radius', 10, 1e8],\n ['faceGrid', 1, 32],\n ['triangleBudget', 0, 2e7],\n ['bakeResolution', 16, 2048],\n ])\n if (!Number.isFinite(l[key]) || l[key] < min || l[key] > max)\n throw new RangeError(`Invalid layout.${key}`);\n if (!Number.isInteger(l.faceGrid) || !Number.isInteger(l.bakeResolution))\n throw new TypeError('Planet grid and bake resolution must be integers');\n },\n createMaterial: (t, oct, program) => createPlanetMaterial(t._uniforms, oct, program),\n createRuntime(t) {\n return {\n world: null,\n baker: null,\n key: '',\n sampler: new PlanetHeightSampler(\n t._uniforms,\n () => ({ octaves: t.configuration.source.octaves, radius: t.configuration.layout.radius }),\n t._stack,\n ),\n get group() {\n return this.world.group;\n },\n update(camera) {\n this.world.update(camera.position, camera);\n },\n diagnostics() {\n return {\n chunks: this.world.chunks.length,\n visible: this.world.visibleChunkCount,\n culled: this.world.culledChunkCount,\n lodCounts: [...this.world.lodCounts],\n bakeReady: this.baker.ready,\n };\n },\n dispose() {\n if (this.world) {\n this.world.materials = [];\n this.world.dispose();\n }\n this.baker?.dispose();\n },\n };\n },\n apply(t, c) {\n const r = t._runtime,\n l = c.layout,\n u = t._uniforms,\n key = JSON.stringify([l.radius, l.faceGrid, l.bakeResolution, c.quality.lodSegments]);\n u.uPlanetRadius.value = l.radius;\n u.uPlanetEps.value = 2 / (l.faceGrid * 64);\n u.uSkirtDepth.value = Math.max(24, c.heightScale * 0.08) * 3;\n u.uFogDensity.value = 0;\n if (r.key !== key) {\n r.dispose();\n r.key = key;\n r.world = new PlanetWorld(t.object, () => t._material, {\n radius: l.radius,\n faceGrid: l.faceGrid,\n maxHeight: c.heightScale * 1.35 + 2,\n skirtDepth: u.uSkirtDepth.value,\n lodSegments: c.quality.lodSegments,\n });\n r.baseLodDistances = [...r.world._baseLodThresholds];\n r.baker = new PlanetHeightBaker({\n renderer: t._renderer,\n uniforms: u,\n size: l.bakeResolution,\n previewSize: l.bakeResolution,\n climateSize: Math.min(128, l.bakeResolution),\n requirePrepared: true,\n });\n }\n r.world.setTriangleBudget(l.triangleBudget);\n r.world.setLodDistances(r.baseLodDistances.map((d) => d * c.quality.lodDistanceScale));\n r.world.setMorphEnabled(c.quality.morphEnabled);\n r.world.setMergeOptions({ enabled: c.quality.mergeEnabled });\n r.world.cullingEnabled = c.quality.cullingEnabled;\n r.world.maxHeight = c.heightScale * 1.35 + 2;\n r.world.skirtDepth = u.uSkirtDepth.value;\n },\n async prepare(t, camera, signal, check = () => t._assertAlive()) {\n const b = t._runtime.baker,\n h = b.prepareProgram(t.configuration.source.octaves, t._stackGLSL);\n try {\n for (const pass of h.passes)\n await compileMaterial(t._renderer, pass.material, pass.camera ?? camera, {\n geometry: pass.mesh?.geometry.clone() ?? new THREE.BoxGeometry(2, 2, 2),\n });\n signal?.throwIfAborted();\n check();\n b.publishPrepared(h);\n } catch (e) {\n b.discardPrepared(h);\n throw e;\n }\n b.begin(t.configuration.source.octaves, t._stackGLSL);\n withRendererState(t._renderer, () => {\n while (!b.complete) b.step();\n });\n t._uniforms.uPlanetHeightTex.value = b.texture;\n t._uniforms.uUsePlanetHeightTex.value = 1;\n t._uniforms.uPlanetClimateTex.value = b.climateTexture;\n t._uniforms.uUsePlanetClimateTex.value = 1;\n },\n async sourceChanged(t, source, { signal, check, sourceChanged }) {\n t._runtime.sampler.setStack(t._stack);\n t._runtime.world.materials = t._runtime.world.materials.map(() => t._material);\n for (const b of t._runtime.world.batches) b.material = t._material;\n // Folded patches keep a material reference for future batch allocations.\n if (t._runtime.world._patchMaterial) t._runtime.world._patchMaterial = t._material;\n if (sourceChanged)\n await this.prepare(t, t._viewCamera ?? new THREE.PerspectiveCamera(), signal, check);\n },\n sample: (t, x, y, z) => t._runtime.sampler.heightAt3D(x, y, z),\n createProbe(t, material) {\n const geometry = t._runtime.world.batches[0].geometry.clone();\n return { geometry, mesh: new THREE.InstancedMesh(geometry, material, 1) };\n },\n};\n\nexport async function createPlanetTerrain(options) {\n return new FiniteTerrain({ ...options, _world: planetAdapter });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as THREE from "three";
|
|
2
|
-
import { n as normalizeConfiguration, c as configurationParameters, b as createTerrainUniforms, d as applyTerrainShapeUniforms, e as applyTerrainShadingUniforms } from "./TerrainParameters-
|
|
2
|
+
import { n as normalizeConfiguration, c as configurationParameters, b as createTerrainUniforms, d as applyTerrainShapeUniforms, e as applyTerrainShadingUniforms } from "./TerrainParameters-DMCjnnxz.js";
|
|
3
3
|
import { b as TerrainSource } from "./TerrainSources-Bye63rDk.js";
|
|
4
4
|
const WATER_QUALITY_DEFAULTS = { waterQuality: 2, waterDetail: 1, waterReflection: 1, waterWaves: 2 };
|
|
5
5
|
const CLOUD_QUALITY_DEFAULTS = {
|
|
@@ -207,4 +207,4 @@ export {
|
|
|
207
207
|
resolveEffectHost as r,
|
|
208
208
|
validateParameters as v
|
|
209
209
|
};
|
|
210
|
-
//# sourceMappingURL=RevisionScope-
|
|
210
|
+
//# sourceMappingURL=RevisionScope-Dl4yjj-0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevisionScope-J__6V9I_.js","sources":["../../../src/runtime/effects/EffectQuality.js","../../../src/runtime/effects/EffectHost.js","../../../src/runtime/resources/ParameterValidation.js","../../../src/runtime/resources/RevisionScope.js"],"sourcesContent":["export const WATER_QUALITY_DEFAULTS={waterQuality:2,waterDetail:1,waterReflection:1,waterWaves:2};\nexport const CLOUD_QUALITY_DEFAULTS={cloudSteps:12,cloudLightSteps:2,cloudOctaves:3,cloudDetailOctaves:0,\n cloudRealisticSteps:24,cloudRenderScale:.5,cloudMaxDistance:6,cloudUseErosion:true,\n cloudSelfShadow:true,cloudLightMode:0,cloudStepLOD:false,cloudFallback:'none'};\nconst limits={waterQuality:[0,2,true],waterDetail:[0,2],waterReflection:[0,2],waterWaves:[0,4],\n cloudSteps:[8,128,true],cloudLightSteps:[1,12,true],cloudOctaves:[1,6,true],cloudDetailOctaves:[0,5,true],\n cloudRealisticSteps:[8,128,true],cloudRenderScale:[.25,1],cloudMaxDistance:[1,20],cloudLightMode:[0,1,true]};\nexport function effectQuality(patch={},base){\n if(!patch||typeof patch!=='object'||Array.isArray(patch))throw new TypeError('quality must be an object');\n for(const [key,value]of Object.entries(patch)){\n if(!(key in base))throw new TypeError('Unknown quality option '+key);\n if(typeof base[key]==='boolean'){if(typeof value!=='boolean')throw new TypeError(key+' must be boolean');}\n else if(key==='cloudFallback'){if(!['none','lite','off'].includes(value))throw new TypeError('Invalid cloudFallback');}\n else{const [min,max,integer]=limits[key];if(!Number.isFinite(value)||value<min||value>max||(integer&&!Number.isInteger(value)))throw new RangeError('Invalid '+key);}\n }\n return {...base,...patch};\n}\n","import * as THREE from 'three';\nimport { createTerrainUniforms } from '../../engine/terrain/TerrainMaterial.js';\nimport { normalizeConfiguration, configurationParameters } from '../FiniteTerrainConfiguration.js';\nimport { applyTerrainShapeUniforms, applyTerrainShadingUniforms } from '../TerrainParameters.js';\nimport { TerrainSource } from '../TerrainSources.js';\n\n/** A lightweight effect domain: no terrain mesh, controls, DOM or render loop. */\nclass EffectHost {\n constructor(renderer, world = {}) {\n if (!renderer?.isWebGLRenderer) throw new TypeError('A caller-owned THREE.WebGLRenderer is required');\n const allowed = ['mode','size','heightScale','seaLevel','sunAzimuth','sunElevation'];\n if (!world || typeof world !== 'object' || Array.isArray(world)) throw new TypeError('world must be an object');\n for (const key of Object.keys(world)) if (!allowed.includes(key)) throw new TypeError('Unknown effect world option '+key);\n this.mode = world.mode ?? 'finite';\n if (!['finite','infinite'].includes(this.mode)) throw new TypeError('Standalone effects support finite or infinite worlds; attach to a planet terrain for spherical effects');\n const size = world.size ?? 10000;\n if (!Number.isFinite(size) || size < (this.mode==='infinite'?6:1) || size > 100000) throw new RangeError('world.size must be 1..100000 world units (at least 6 for infinite coverage)');\n this.world = Object.freeze({mode:this.mode,size,heightScale:world.heightScale??1000,seaLevel:world.seaLevel??0,\n sunAzimuth:world.sunAzimuth??128,sunElevation:world.sunElevation??46});\n const bed = Math.max(-60000, Math.min(60000, this.world.seaLevel-this.world.heightScale));\n this.configuration = normalizeConfiguration({\n layout:{chunkCount:1,chunkSize:this.mode==='infinite'?size/6:size},\n heightScale:this.world.heightScale,seaLevel:this.world.seaLevel,\n lighting:{sunAzimuth:this.world.sunAzimuth,sunElevation:this.world.sunElevation},\n source:{kind:'heightmap',data:[bed,bed,bed,bed],width:2,height:2,octaves:3,strength:0},\n });\n this.configuration = Object.freeze({...this.configuration,layout:Object.freeze({...this.configuration.layout,viewRadius:2})});\n this._renderer=renderer;\n this._params=configurationParameters(this.configuration);\n this._uniforms=createTerrainUniforms();\n this._textures=new Set(Object.values(this._uniforms).map(u=>u.value).filter(v=>v?.isTexture));\n this._source=new TerrainSource(this.configuration,'finite');\n this._stackGLSL=this._source.program;\n applyTerrainShapeUniforms(this._uniforms,this._params,size);\n applyTerrainShadingUniforms(this._uniforms,this._params,{size,skirtDepth:0,wallThickness:0});\n this._source.install(this._uniforms);\n const az=THREE.MathUtils.degToRad(this.world.sunAzimuth), el=THREE.MathUtils.degToRad(this.world.sunElevation);\n this._uniforms.uSunDir.value.set(Math.cos(el)*Math.sin(az),Math.sin(el),Math.cos(el)*Math.cos(az));\n this.object=new THREE.Group();this.object.name='standalone-effect-domain';\n this._layers=new Set();this._revision=0;this._disposed=false;\n }\n _assertAlive(){if(this._disposed)throw new Error('Effect disposed');}\n addLayer(layer){this._assertAlive();this._layers.add(layer);return()=>this._layers.delete(layer);}\n sampleHeight(){return this._source.minHeight;}\n frame(dt,camera){\n this._assertAlive();\n if(!Number.isFinite(dt)||dt<0)throw new RangeError('deltaSeconds must be nonnegative');\n if(!camera?.isCamera)throw new TypeError('A THREE.Camera is required');\n camera.updateWorldMatrix(true,false);\n let view=camera;\n if(camera.parent){\n if(this._worldCamera?.type!==camera.type)this._worldCamera=camera.clone(false);\n view=this._worldCamera;view.projectionMatrix.copy(camera.projectionMatrix);view.projectionMatrixInverse.copy(camera.projectionMatrixInverse);\n camera.matrixWorld.decompose(view.position,view.quaternion,view.scale);view.updateMatrixWorld(true);\n }\n this._viewCamera=view;this._uniforms.uTime.value+=Math.min(dt,.1);return view;\n }\n dispose(){if(this._disposed)return;this._disposed=true;this._layers.clear();this._source.dispose();for(const t of this._textures)t.dispose();this._textures.clear();this.object.removeFromParent();}\n}\n\nexport function resolveEffectHost({terrain,renderer,world}) {\n if(terrain){\n if(renderer || world)throw new TypeError('Pass terrain, or renderer and world; do not mix effect hosts');\n terrain._assertAlive();return {terrain,ownsHost:false};\n }\n return {terrain:new EffectHost(renderer,world),ownsHost:true};\n}\n","export function validateParameters(patch, defaults, extra = {}) {\n if (!patch || typeof patch !== 'object' || Array.isArray(patch))\n throw new TypeError('Parameters must be an object');\n for (const [key, value] of Object.entries(patch)) {\n if (!(key in defaults) && !(key in extra)) throw new TypeError(`Unknown parameter ${key}`);\n const sample = key in defaults ? defaults[key] : extra[key];\n if (typeof sample === 'number' && !Number.isFinite(value))\n throw new TypeError(`${key} must be finite`);\n if (typeof sample === 'boolean' && typeof value !== 'boolean')\n throw new TypeError(`${key} must be boolean`);\n if (typeof sample === 'string' && typeof value !== 'string')\n throw new TypeError(`${key} must be a string`);\n if (\n Array.isArray(sample) &&\n (!Array.isArray(value) ||\n value.length !== sample.length ||\n value.some((v) => !Number.isFinite(v)))\n )\n throw new TypeError(`Invalid ${key}`);\n }\n}\n","export class RevisionScope {\n constructor() {\n this.revision = 0;\n this.disposed = false;\n this.pending = new Set();\n }\n cancel(code = 'TERRAIN_SUPERSEDED') {\n for (const reject of this.pending) reject(Object.assign(new Error(code), { code }));\n this.pending.clear();\n }\n run(task, { signal } = {}) {\n if (this.disposed)\n return Promise.reject(Object.assign(new Error('Disposed'), { code: 'TERRAIN_DISPOSED' }));\n signal?.throwIfAborted();\n this.cancel();\n const revision = ++this.revision;\n const check = () => {\n signal?.throwIfAborted();\n if (this.disposed || revision !== this.revision)\n throw Object.assign(new Error('Operation retired'), {\n code: this.disposed ? 'TERRAIN_DISPOSED' : 'TERRAIN_SUPERSEDED',\n });\n };\n let reject;\n const cancelled = new Promise((_, r) => {\n reject = r;\n });\n this.pending.add(reject);\n const abort = () =>\n reject(Object.assign(new Error('Operation cancelled'), { code: 'TERRAIN_CANCELLED' }));\n signal?.addEventListener('abort', abort, { once: true });\n return Promise.race([\n Promise.resolve().then(() => {\n check();\n return task(check);\n }),\n cancelled,\n ]).finally(() => {\n this.pending.delete(reject);\n signal?.removeEventListener('abort', abort);\n });\n }\n dispose() {\n this.disposed = true;\n ++this.revision;\n this.cancel('TERRAIN_DISPOSED');\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RevisionScope-Dl4yjj-0.js","sources":["../../../src/runtime/effects/EffectQuality.js","../../../src/runtime/effects/EffectHost.js","../../../src/runtime/resources/ParameterValidation.js","../../../src/runtime/resources/RevisionScope.js"],"sourcesContent":["export const WATER_QUALITY_DEFAULTS={waterQuality:2,waterDetail:1,waterReflection:1,waterWaves:2};\nexport const CLOUD_QUALITY_DEFAULTS={cloudSteps:12,cloudLightSteps:2,cloudOctaves:3,cloudDetailOctaves:0,\n cloudRealisticSteps:24,cloudRenderScale:.5,cloudMaxDistance:6,cloudUseErosion:true,\n cloudSelfShadow:true,cloudLightMode:0,cloudStepLOD:false,cloudFallback:'none'};\nconst limits={waterQuality:[0,2,true],waterDetail:[0,2],waterReflection:[0,2],waterWaves:[0,4],\n cloudSteps:[8,128,true],cloudLightSteps:[1,12,true],cloudOctaves:[1,6,true],cloudDetailOctaves:[0,5,true],\n cloudRealisticSteps:[8,128,true],cloudRenderScale:[.25,1],cloudMaxDistance:[1,20],cloudLightMode:[0,1,true]};\nexport function effectQuality(patch={},base){\n if(!patch||typeof patch!=='object'||Array.isArray(patch))throw new TypeError('quality must be an object');\n for(const [key,value]of Object.entries(patch)){\n if(!(key in base))throw new TypeError('Unknown quality option '+key);\n if(typeof base[key]==='boolean'){if(typeof value!=='boolean')throw new TypeError(key+' must be boolean');}\n else if(key==='cloudFallback'){if(!['none','lite','off'].includes(value))throw new TypeError('Invalid cloudFallback');}\n else{const [min,max,integer]=limits[key];if(!Number.isFinite(value)||value<min||value>max||(integer&&!Number.isInteger(value)))throw new RangeError('Invalid '+key);}\n }\n return {...base,...patch};\n}\n","import * as THREE from 'three';\nimport { createTerrainUniforms } from '../../engine/terrain/TerrainMaterial.js';\nimport { normalizeConfiguration, configurationParameters } from '../FiniteTerrainConfiguration.js';\nimport { applyTerrainShapeUniforms, applyTerrainShadingUniforms } from '../TerrainParameters.js';\nimport { TerrainSource } from '../TerrainSources.js';\n\n/** A lightweight effect domain: no terrain mesh, controls, DOM or render loop. */\nclass EffectHost {\n constructor(renderer, world = {}) {\n if (!renderer?.isWebGLRenderer) throw new TypeError('A caller-owned THREE.WebGLRenderer is required');\n const allowed = ['mode','size','heightScale','seaLevel','sunAzimuth','sunElevation'];\n if (!world || typeof world !== 'object' || Array.isArray(world)) throw new TypeError('world must be an object');\n for (const key of Object.keys(world)) if (!allowed.includes(key)) throw new TypeError('Unknown effect world option '+key);\n this.mode = world.mode ?? 'finite';\n if (!['finite','infinite'].includes(this.mode)) throw new TypeError('Standalone effects support finite or infinite worlds; attach to a planet terrain for spherical effects');\n const size = world.size ?? 10000;\n if (!Number.isFinite(size) || size < (this.mode==='infinite'?6:1) || size > 100000) throw new RangeError('world.size must be 1..100000 world units (at least 6 for infinite coverage)');\n this.world = Object.freeze({mode:this.mode,size,heightScale:world.heightScale??1000,seaLevel:world.seaLevel??0,\n sunAzimuth:world.sunAzimuth??128,sunElevation:world.sunElevation??46});\n const bed = Math.max(-60000, Math.min(60000, this.world.seaLevel-this.world.heightScale));\n this.configuration = normalizeConfiguration({\n layout:{chunkCount:1,chunkSize:this.mode==='infinite'?size/6:size},\n heightScale:this.world.heightScale,seaLevel:this.world.seaLevel,\n lighting:{sunAzimuth:this.world.sunAzimuth,sunElevation:this.world.sunElevation},\n source:{kind:'heightmap',data:[bed,bed,bed,bed],width:2,height:2,octaves:3,strength:0},\n });\n this.configuration = Object.freeze({...this.configuration,layout:Object.freeze({...this.configuration.layout,viewRadius:2})});\n this._renderer=renderer;\n this._params=configurationParameters(this.configuration);\n this._uniforms=createTerrainUniforms();\n this._textures=new Set(Object.values(this._uniforms).map(u=>u.value).filter(v=>v?.isTexture));\n this._source=new TerrainSource(this.configuration,'finite');\n this._stackGLSL=this._source.program;\n applyTerrainShapeUniforms(this._uniforms,this._params,size);\n applyTerrainShadingUniforms(this._uniforms,this._params,{size,skirtDepth:0,wallThickness:0});\n this._source.install(this._uniforms);\n const az=THREE.MathUtils.degToRad(this.world.sunAzimuth), el=THREE.MathUtils.degToRad(this.world.sunElevation);\n this._uniforms.uSunDir.value.set(Math.cos(el)*Math.sin(az),Math.sin(el),Math.cos(el)*Math.cos(az));\n this.object=new THREE.Group();this.object.name='standalone-effect-domain';\n this._layers=new Set();this._revision=0;this._disposed=false;\n }\n _assertAlive(){if(this._disposed)throw new Error('Effect disposed');}\n addLayer(layer){this._assertAlive();this._layers.add(layer);return()=>this._layers.delete(layer);}\n sampleHeight(){return this._source.minHeight;}\n frame(dt,camera){\n this._assertAlive();\n if(!Number.isFinite(dt)||dt<0)throw new RangeError('deltaSeconds must be nonnegative');\n if(!camera?.isCamera)throw new TypeError('A THREE.Camera is required');\n camera.updateWorldMatrix(true,false);\n let view=camera;\n if(camera.parent){\n if(this._worldCamera?.type!==camera.type)this._worldCamera=camera.clone(false);\n view=this._worldCamera;view.projectionMatrix.copy(camera.projectionMatrix);view.projectionMatrixInverse.copy(camera.projectionMatrixInverse);\n camera.matrixWorld.decompose(view.position,view.quaternion,view.scale);view.updateMatrixWorld(true);\n }\n this._viewCamera=view;this._uniforms.uTime.value+=Math.min(dt,.1);return view;\n }\n dispose(){if(this._disposed)return;this._disposed=true;this._layers.clear();this._source.dispose();for(const t of this._textures)t.dispose();this._textures.clear();this.object.removeFromParent();}\n}\n\nexport function resolveEffectHost({terrain,renderer,world}) {\n if(terrain){\n if(renderer || world)throw new TypeError('Pass terrain, or renderer and world; do not mix effect hosts');\n terrain._assertAlive();return {terrain,ownsHost:false};\n }\n return {terrain:new EffectHost(renderer,world),ownsHost:true};\n}\n","export function validateParameters(patch, defaults, extra = {}) {\n if (!patch || typeof patch !== 'object' || Array.isArray(patch))\n throw new TypeError('Parameters must be an object');\n for (const [key, value] of Object.entries(patch)) {\n if (!(key in defaults) && !(key in extra)) throw new TypeError(`Unknown parameter ${key}`);\n const sample = key in defaults ? defaults[key] : extra[key];\n if (typeof sample === 'number' && !Number.isFinite(value))\n throw new TypeError(`${key} must be finite`);\n if (typeof sample === 'boolean' && typeof value !== 'boolean')\n throw new TypeError(`${key} must be boolean`);\n if (typeof sample === 'string' && typeof value !== 'string')\n throw new TypeError(`${key} must be a string`);\n if (\n Array.isArray(sample) &&\n (!Array.isArray(value) ||\n value.length !== sample.length ||\n value.some((v) => !Number.isFinite(v)))\n )\n throw new TypeError(`Invalid ${key}`);\n }\n}\n","export class RevisionScope {\n constructor() {\n this.revision = 0;\n this.disposed = false;\n this.pending = new Set();\n }\n cancel(code = 'TERRAIN_SUPERSEDED') {\n for (const reject of this.pending) reject(Object.assign(new Error(code), { code }));\n this.pending.clear();\n }\n run(task, { signal } = {}) {\n if (this.disposed)\n return Promise.reject(Object.assign(new Error('Disposed'), { code: 'TERRAIN_DISPOSED' }));\n signal?.throwIfAborted();\n this.cancel();\n const revision = ++this.revision;\n const check = () => {\n signal?.throwIfAborted();\n if (this.disposed || revision !== this.revision)\n throw Object.assign(new Error('Operation retired'), {\n code: this.disposed ? 'TERRAIN_DISPOSED' : 'TERRAIN_SUPERSEDED',\n });\n };\n let reject;\n const cancelled = new Promise((_, r) => {\n reject = r;\n });\n this.pending.add(reject);\n const abort = () =>\n reject(Object.assign(new Error('Operation cancelled'), { code: 'TERRAIN_CANCELLED' }));\n signal?.addEventListener('abort', abort, { once: true });\n return Promise.race([\n Promise.resolve().then(() => {\n check();\n return task(check);\n }),\n cancelled,\n ]).finally(() => {\n this.pending.delete(reject);\n signal?.removeEventListener('abort', abort);\n });\n }\n dispose() {\n this.disposed = true;\n ++this.revision;\n this.cancel('TERRAIN_DISPOSED');\n }\n}\n"],"names":[],"mappings":";;;AAAY,MAAC,yBAAuB,EAAC,cAAa,GAAE,aAAY,GAAE,iBAAgB,GAAE,YAAW,EAAC;AACpF,MAAC,yBAAuB;AAAA,EAAC,YAAW;AAAA,EAAG,iBAAgB;AAAA,EAAE,cAAa;AAAA,EAAE,oBAAmB;AAAA,EACrG,qBAAoB;AAAA,EAAG,kBAAiB;AAAA,EAAG,kBAAiB;AAAA,EAAE,iBAAgB;AAAA,EAC9E,iBAAgB;AAAA,EAAK,gBAAe;AAAA,EAAE,cAAa;AAAA,EAAM,eAAc;AAAM;AAC/E,MAAM,SAAO;AAAA,EAAC,cAAa,CAAC,GAAE,GAAE,IAAI;AAAA,EAAE,aAAY,CAAC,GAAE,CAAC;AAAA,EAAE,iBAAgB,CAAC,GAAE,CAAC;AAAA,EAAE,YAAW,CAAC,GAAE,CAAC;AAAA,EAC3F,YAAW,CAAC,GAAE,KAAI,IAAI;AAAA,EAAE,iBAAgB,CAAC,GAAE,IAAG,IAAI;AAAA,EAAE,cAAa,CAAC,GAAE,GAAE,IAAI;AAAA,EAAE,oBAAmB,CAAC,GAAE,GAAE,IAAI;AAAA,EACxG,qBAAoB,CAAC,GAAE,KAAI,IAAI;AAAA,EAAE,kBAAiB,CAAC,MAAI,CAAC;AAAA,EAAE,kBAAiB,CAAC,GAAE,EAAE;AAAA,EAAE,gBAAe,CAAC,GAAE,GAAE,IAAI;AAAC;AACtG,SAAS,cAAc,QAAM,CAAA,GAAG,MAAK;AAC1C,MAAG,CAAC,SAAO,OAAO,UAAQ,YAAU,MAAM,QAAQ,KAAK,EAAE,OAAM,IAAI,UAAU,2BAA2B;AACxG,aAAU,CAAC,KAAI,KAAK,KAAI,OAAO,QAAQ,KAAK,GAAE;AAC5C,QAAG,EAAE,OAAO,MAAM,OAAM,IAAI,UAAU,4BAA0B,GAAG;AACnE,QAAG,OAAO,KAAK,GAAG,MAAI,WAAU;AAAC,UAAG,OAAO,UAAQ,UAAU,OAAM,IAAI,UAAU,MAAI,kBAAkB;AAAA,IAAE,WACjG,QAAM,iBAAgB;AAAC,UAAG,CAAC,CAAC,QAAO,QAAO,KAAK,EAAE,SAAS,KAAK,EAAE,OAAM,IAAI,UAAU,uBAAuB;AAAA,IAAE,OAClH;AAAC,YAAM,CAAC,KAAI,KAAI,OAAO,IAAE,OAAO,GAAG;AAAE,UAAG,CAAC,OAAO,SAAS,KAAK,KAAG,QAAM,OAAK,QAAM,OAAM,WAAS,CAAC,OAAO,UAAU,KAAK,EAAG,OAAM,IAAI,WAAW,aAAW,GAAG;AAAA,IAAE;AAAA,EACtK;AACA,SAAO,EAAC,GAAG,MAAK,GAAG,MAAK;AAC1B;ACTA,MAAM,WAAW;AAAA,EACf,YAAY,UAAU,QAAQ,IAAI;AAChC,QAAI,CAAC,UAAU,gBAAiB,OAAM,IAAI,UAAU,gDAAgD;AACpG,UAAM,UAAU,CAAC,QAAO,QAAO,eAAc,YAAW,cAAa,cAAc;AACnF,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,yBAAyB;AAC9G,eAAW,OAAO,OAAO,KAAK,KAAK,EAAG,KAAI,CAAC,QAAQ,SAAS,GAAG,EAAG,OAAM,IAAI,UAAU,iCAA+B,GAAG;AACxH,SAAK,OAAO,MAAM,QAAQ;AAC1B,QAAI,CAAC,CAAC,UAAS,UAAU,EAAE,SAAS,KAAK,IAAI,EAAG,OAAM,IAAI,UAAU,wGAAwG;AAC5K,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,KAAK,SAAO,aAAW,IAAE,MAAM,OAAO,IAAQ,OAAM,IAAI,WAAW,6EAA6E;AACtL,SAAK,QAAQ,OAAO,OAAO;AAAA,MAAC,MAAK,KAAK;AAAA,MAAK;AAAA,MAAK,aAAY,MAAM,eAAa;AAAA,MAAK,UAAS,MAAM,YAAU;AAAA,MAC3G,YAAW,MAAM,cAAY;AAAA,MAAI,cAAa,MAAM,gBAAc;AAAA,IAAE,CAAC;AACvE,UAAM,MAAM,KAAK,IAAI,MAAQ,KAAK,IAAI,KAAO,KAAK,MAAM,WAAS,KAAK,MAAM,WAAW,CAAC;AACxF,SAAK,gBAAgB,uBAAuB;AAAA,MAC1C,QAAO,EAAC,YAAW,GAAE,WAAU,KAAK,SAAO,aAAW,OAAK,IAAE,KAAI;AAAA,MACjE,aAAY,KAAK,MAAM;AAAA,MAAY,UAAS,KAAK,MAAM;AAAA,MACvD,UAAS,EAAC,YAAW,KAAK,MAAM,YAAW,cAAa,KAAK,MAAM,aAAY;AAAA,MAC/E,QAAO,EAAC,MAAK,aAAY,MAAK,CAAC,KAAI,KAAI,KAAI,GAAG,GAAE,OAAM,GAAE,QAAO,GAAE,SAAQ,GAAE,UAAS,EAAC;AAAA,IAC3F,CAAK;AACD,SAAK,gBAAgB,OAAO,OAAO,EAAC,GAAG,KAAK,eAAc,QAAO,OAAO,OAAO,EAAC,GAAG,KAAK,cAAc,QAAO,YAAW,EAAC,CAAC,EAAC,CAAC;AAC5H,SAAK,YAAU;AACf,SAAK,UAAQ,wBAAwB,KAAK,aAAa;AACvD,SAAK,YAAU,sBAAqB;AACpC,SAAK,YAAU,IAAI,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,IAAI,OAAG,EAAE,KAAK,EAAE,OAAO,OAAG,GAAG,SAAS,CAAC;AAC5F,SAAK,UAAQ,IAAI,cAAc,KAAK,eAAc,QAAQ;AAC1D,SAAK,aAAW,KAAK,QAAQ;AAC7B,8BAA0B,KAAK,WAAU,KAAK,SAAQ,IAAI;AAC1D,gCAA4B,KAAK,WAAU,KAAK,SAAQ,EAAC,MAAK,YAAW,GAAE,eAAc,EAAC,CAAC;AAC3F,SAAK,QAAQ,QAAQ,KAAK,SAAS;AACnC,UAAM,KAAG,MAAM,UAAU,SAAS,KAAK,MAAM,UAAU,GAAG,KAAG,MAAM,UAAU,SAAS,KAAK,MAAM,YAAY;AAC7G,SAAK,UAAU,QAAQ,MAAM,IAAI,KAAK,IAAI,EAAE,IAAE,KAAK,IAAI,EAAE,GAAE,KAAK,IAAI,EAAE,GAAE,KAAK,IAAI,EAAE,IAAE,KAAK,IAAI,EAAE,CAAC;AACjG,SAAK,SAAO,IAAI,MAAM,MAAK;AAAG,SAAK,OAAO,OAAK;AAC/C,SAAK,UAAQ,oBAAI;AAAM,SAAK,YAAU;AAAE,SAAK,YAAU;AAAA,EACzD;AAAA,EACA,eAAc;AAAC,QAAG,KAAK,UAAU,OAAM,IAAI,MAAM,iBAAiB;AAAA,EAAE;AAAA,EACpE,SAAS,OAAM;AAAC,SAAK,aAAY;AAAG,SAAK,QAAQ,IAAI,KAAK;AAAE,WAAM,MAAI,KAAK,QAAQ,OAAO,KAAK;AAAA,EAAE;AAAA,EACjG,eAAc;AAAC,WAAO,KAAK,QAAQ;AAAA,EAAU;AAAA,EAC7C,MAAM,IAAG,QAAO;AACd,SAAK,aAAY;AACjB,QAAG,CAAC,OAAO,SAAS,EAAE,KAAG,KAAG,EAAE,OAAM,IAAI,WAAW,kCAAkC;AACrF,QAAG,CAAC,QAAQ,SAAS,OAAM,IAAI,UAAU,4BAA4B;AACrE,WAAO,kBAAkB,MAAK,KAAK;AACnC,QAAI,OAAK;AACT,QAAG,OAAO,QAAO;AACf,UAAG,KAAK,cAAc,SAAO,OAAO,KAAK,MAAK,eAAa,OAAO,MAAM,KAAK;AAC7E,aAAK,KAAK;AAAa,WAAK,iBAAiB,KAAK,OAAO,gBAAgB;AAAE,WAAK,wBAAwB,KAAK,OAAO,uBAAuB;AAC3I,aAAO,YAAY,UAAU,KAAK,UAAS,KAAK,YAAW,KAAK,KAAK;AAAE,WAAK,kBAAkB,IAAI;AAAA,IACpG;AACA,SAAK,cAAY;AAAK,SAAK,UAAU,MAAM,SAAO,KAAK,IAAI,IAAG,GAAE;AAAE,WAAO;AAAA,EAC3E;AAAA,EACA,UAAS;AAAC,QAAG,KAAK,UAAU;AAAO,SAAK,YAAU;AAAK,SAAK,QAAQ,MAAK;AAAG,SAAK,QAAQ;AAAU,eAAU,KAAK,KAAK,UAAU,GAAE,QAAO;AAAG,SAAK,UAAU,MAAK;AAAG,SAAK,OAAO,iBAAgB;AAAA,EAAG;AACrM;AAEO,SAAS,kBAAkB,EAAC,SAAQ,UAAS,MAAK,GAAG;AAC1D,MAAG,SAAQ;AACT,QAAG,YAAY,MAAM,OAAM,IAAI,UAAU,8DAA8D;AACvG,YAAQ,aAAY;AAAG,WAAO,EAAC,SAAQ,UAAS,MAAK;AAAA,EACvD;AACA,SAAO,EAAC,SAAQ,IAAI,WAAW,UAAS,KAAK,GAAE,UAAS,KAAI;AAC9D;AClEO,SAAS,mBAAmB,OAAO,UAAU,QAAQ,CAAA,GAAI;AAC9D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK;AAC5D,UAAM,IAAI,UAAU,8BAA8B;AACpD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,EAAE,OAAO,aAAa,EAAE,OAAO,OAAQ,OAAM,IAAI,UAAU,qBAAqB,GAAG,EAAE;AACzF,UAAM,SAAS,OAAO,WAAW,SAAS,GAAG,IAAI,MAAM,GAAG;AAC1D,QAAI,OAAO,WAAW,YAAY,CAAC,OAAO,SAAS,KAAK;AACtD,YAAM,IAAI,UAAU,GAAG,GAAG,iBAAiB;AAC7C,QAAI,OAAO,WAAW,aAAa,OAAO,UAAU;AAClD,YAAM,IAAI,UAAU,GAAG,GAAG,kBAAkB;AAC9C,QAAI,OAAO,WAAW,YAAY,OAAO,UAAU;AACjD,YAAM,IAAI,UAAU,GAAG,GAAG,mBAAmB;AAC/C,QACE,MAAM,QAAQ,MAAM,MACnB,CAAC,MAAM,QAAQ,KAAK,KACnB,MAAM,WAAW,OAAO,UACxB,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;AAEvC,YAAM,IAAI,UAAU,WAAW,GAAG,EAAE;AAAA,EACxC;AACF;ACpBO,MAAM,cAAc;AAAA,EACzB,cAAc;AACZ,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,UAAU,oBAAI,IAAG;AAAA,EACxB;AAAA,EACA,OAAO,OAAO,sBAAsB;AAClC,eAAW,UAAU,KAAK,QAAS,QAAO,OAAO,OAAO,IAAI,MAAM,IAAI,GAAG,EAAE,KAAI,CAAE,CAAC;AAClF,SAAK,QAAQ,MAAK;AAAA,EACpB;AAAA,EACA,IAAI,MAAM,EAAE,OAAM,IAAK,CAAA,GAAI;AACzB,QAAI,KAAK;AACP,aAAO,QAAQ,OAAO,OAAO,OAAO,IAAI,MAAM,UAAU,GAAG,EAAE,MAAM,mBAAkB,CAAE,CAAC;AAC1F,YAAQ,eAAc;AACtB,SAAK,OAAM;AACX,UAAM,WAAW,EAAE,KAAK;AACxB,UAAM,QAAQ,MAAM;AAClB,cAAQ,eAAc;AACtB,UAAI,KAAK,YAAY,aAAa,KAAK;AACrC,cAAM,OAAO,OAAO,IAAI,MAAM,mBAAmB,GAAG;AAAA,UAClD,MAAM,KAAK,WAAW,qBAAqB;AAAA,QACrD,CAAS;AAAA,IACL;AACA,QAAI;AACJ,UAAM,YAAY,IAAI,QAAQ,CAAC,GAAG,MAAM;AACtC,eAAS;AAAA,IACX,CAAC;AACD,SAAK,QAAQ,IAAI,MAAM;AACvB,UAAM,QAAQ,MACZ,OAAO,OAAO,OAAO,IAAI,MAAM,qBAAqB,GAAG,EAAE,MAAM,oBAAmB,CAAE,CAAC;AACvF,YAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,MAAM;AACvD,WAAO,QAAQ,KAAK;AAAA,MAClB,QAAQ,UAAU,KAAK,MAAM;AAC3B,cAAK;AACL,eAAO,KAAK,KAAK;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACN,CAAK,EAAE,QAAQ,MAAM;AACf,WAAK,QAAQ,OAAO,MAAM;AAC1B,cAAQ,oBAAoB,SAAS,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EACA,UAAU;AACR,SAAK,WAAW;AAChB,MAAE,KAAK;AACP,SAAK,OAAO,kBAAkB;AAAA,EAChC;AACF;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { v as validateParameters, e as effectQuality, r as resolveEffectHost, R as RevisionScope, C as CLOUD_QUALITY_DEFAULTS } from "./RevisionScope-
|
|
1
|
+
import { v as validateParameters, e as effectQuality, r as resolveEffectHost, R as RevisionScope, C as CLOUD_QUALITY_DEFAULTS } from "./RevisionScope-Dl4yjj-0.js";
|
|
2
2
|
import * as THREE from "three";
|
|
3
|
-
import { C as CLOUD_NOISE_GLSL, i as CLOUD_FIELD_GLSL, j as CLOUD_SLAB_GLSL, r as renderTerrainCloudShadow, k as CLOUD_VOLUME_GLSL, W as WEATHER_CUBE_FRAGMENT, l as WEATHER_FLAT_FRAGMENT, N as NOISE_VOLUME_FRAGMENT, R as REALISTIC_CLOUD_FRAGMENT, o as REALISTIC_CLOUD_VERTEX, p as REALISTIC_MAX_STEPS } from "./TerrainParameters-
|
|
3
|
+
import { C as CLOUD_NOISE_GLSL, i as CLOUD_FIELD_GLSL, j as CLOUD_SLAB_GLSL, r as renderTerrainCloudShadow, k as CLOUD_VOLUME_GLSL, W as WEATHER_CUBE_FRAGMENT, l as WEATHER_FLAT_FRAGMENT, N as NOISE_VOLUME_FRAGMENT, R as REALISTIC_CLOUD_FRAGMENT, o as REALISTIC_CLOUD_VERTEX, p as REALISTIC_MAX_STEPS } from "./TerrainParameters-DMCjnnxz.js";
|
|
4
4
|
import { r as resolveCloudQuality, f as cloudNoiseOffset, g as resolveCloudNoiseType, C as CLOUD_DEFAULT_PARAMS } from "./ProgramHealthGate-DS47bUo1.js";
|
|
5
5
|
import { c as compileMaterial } from "./CompileMaterial-DZiWxNZC.js";
|
|
6
6
|
import { w as withRendererState } from "./RendererState-BwgUc9ze.js";
|
|
@@ -345,7 +345,7 @@ function cloudCoverageAt(x, y, z, f) {
|
|
|
345
345
|
let base = fbmBase(px, py, pz, f.octaves);
|
|
346
346
|
if (f.noiseType === 2) {
|
|
347
347
|
const fibers = vnoise(px * 0.65 + 19.7, py * 2.4 + 19.7, pz * 1.6 + 19.7);
|
|
348
|
-
base
|
|
348
|
+
base += 0.04 - 0.08 * smoothstep(0.25, 0.75, fibers);
|
|
349
349
|
} else if (f.noiseType === 1) {
|
|
350
350
|
const billows = 0.67 - Math.abs(vnoise(px * 1.5 + 13.7, py * 1.5 + 13.7, pz * 1.5 + 13.7) - 0.5) * 1.4;
|
|
351
351
|
base = base * 0.35 + billows * 0.65;
|
|
@@ -1331,13 +1331,16 @@ class CloudSlabLayer {
|
|
|
1331
1331
|
useErosion,
|
|
1332
1332
|
lightMode
|
|
1333
1333
|
);
|
|
1334
|
-
const
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1334
|
+
const copyLiveUniforms = () => {
|
|
1335
|
+
const a = previous.uniforms, b = next.uniforms;
|
|
1336
|
+
for (const k in b) {
|
|
1337
|
+
if (!(k in a)) continue;
|
|
1338
|
+
const av = a[k].value, bv = b[k].value;
|
|
1339
|
+
if (av && av.copy && bv && bv.copy) bv.copy(av);
|
|
1340
|
+
else b[k].value = a[k].value;
|
|
1341
|
+
}
|
|
1342
|
+
};
|
|
1343
|
+
copyLiveUniforms();
|
|
1341
1344
|
if (!this._ready) {
|
|
1342
1345
|
this.mesh.material = next;
|
|
1343
1346
|
this.material = next;
|
|
@@ -1352,6 +1355,7 @@ class CloudSlabLayer {
|
|
|
1352
1355
|
next.dispose();
|
|
1353
1356
|
return;
|
|
1354
1357
|
}
|
|
1358
|
+
copyLiveUniforms();
|
|
1355
1359
|
this.mesh.material = next;
|
|
1356
1360
|
this.material = next;
|
|
1357
1361
|
this._applyOccupancyUniforms();
|
|
@@ -2119,19 +2123,23 @@ class PlanetCloudLayer {
|
|
|
2119
2123
|
const previous = this.material;
|
|
2120
2124
|
const pendingPrevious = this._pendingCompile?.material === previous ? this._pendingCompile.promise : null;
|
|
2121
2125
|
const next = createCloudMaterial(steps, lightSteps, octaves, detailOctaves, useErosion, lightMode);
|
|
2122
|
-
const
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2126
|
+
const copyLiveUniforms = () => {
|
|
2127
|
+
const a = previous.uniforms, b = next.uniforms;
|
|
2128
|
+
for (const k in b) {
|
|
2129
|
+
if (!(k in a)) continue;
|
|
2130
|
+
const av = a[k].value, bv = b[k].value;
|
|
2131
|
+
if (av && av.copy && bv && bv.copy) bv.copy(av);
|
|
2132
|
+
else b[k].value = a[k].value;
|
|
2133
|
+
}
|
|
2134
|
+
};
|
|
2135
|
+
copyLiveUniforms();
|
|
2129
2136
|
const { token, promise } = this._compileMaterial(next);
|
|
2130
2137
|
promise.then(() => {
|
|
2131
2138
|
if (token !== this._compileToken || this.material !== previous) {
|
|
2132
2139
|
next.dispose();
|
|
2133
2140
|
return;
|
|
2134
2141
|
}
|
|
2142
|
+
copyLiveUniforms();
|
|
2135
2143
|
this.mesh.material = next;
|
|
2136
2144
|
this.material = next;
|
|
2137
2145
|
this._applyOccupancyUniforms();
|
|
@@ -2770,7 +2778,11 @@ class RealisticCloudSlabLayer extends CloudSlabLayer {
|
|
|
2770
2778
|
this._baseSteps = applySharedParams(u, params, config, q);
|
|
2771
2779
|
const systemScale = param(params, "cloudSystemScale");
|
|
2772
2780
|
const weatherFrequency = Math.max(1, systemScale / CLOUD_DEFAULT_PARAMS.cloudSystemScale);
|
|
2773
|
-
|
|
2781
|
+
const minimumWeatherFrequency = 2 * systemScale / CLOUD_DEFAULT_PARAMS.cloudSystemScale;
|
|
2782
|
+
this._weatherScale = Math.max(
|
|
2783
|
+
systemScale * weatherFrequency * weatherFrequency / 34,
|
|
2784
|
+
minimumWeatherFrequency
|
|
2785
|
+
) / board;
|
|
2774
2786
|
this._seed.copy(seedOffset(params.seed ?? 0)).add(u.uCloudVariationOffset.value);
|
|
2775
2787
|
this._windowHalf = radius * 1.3 + u.uCloudShear.value;
|
|
2776
2788
|
const wa = param(params, "cloudWindDir") * Math.PI / 180;
|
|
@@ -3136,4 +3148,4 @@ export {
|
|
|
3136
3148
|
TerrainClouds as T,
|
|
3137
3149
|
createClouds as c
|
|
3138
3150
|
};
|
|
3139
|
-
//# sourceMappingURL=TerrainClouds-
|
|
3151
|
+
//# sourceMappingURL=TerrainClouds-DV6ny7P1.js.map
|