@certe/atmos-terrain 0.1.0

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.
Files changed (60) hide show
  1. package/LICENCE +674 -0
  2. package/README.md +155 -0
  3. package/dist/chunk-key.d.ts +10 -0
  4. package/dist/chunk-key.d.ts.map +1 -0
  5. package/dist/chunk-key.js +27 -0
  6. package/dist/chunk-key.js.map +1 -0
  7. package/dist/chunk.d.ts +36 -0
  8. package/dist/chunk.d.ts.map +1 -0
  9. package/dist/chunk.js +128 -0
  10. package/dist/chunk.js.map +1 -0
  11. package/dist/density-field.d.ts +34 -0
  12. package/dist/density-field.d.ts.map +1 -0
  13. package/dist/density-field.js +68 -0
  14. package/dist/density-field.js.map +1 -0
  15. package/dist/index.d.ts +15 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +22 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lod-chunk.d.ts +20 -0
  20. package/dist/lod-chunk.d.ts.map +1 -0
  21. package/dist/lod-chunk.js +256 -0
  22. package/dist/lod-chunk.js.map +1 -0
  23. package/dist/lod-extract.d.ts +21 -0
  24. package/dist/lod-extract.d.ts.map +1 -0
  25. package/dist/lod-extract.js +178 -0
  26. package/dist/lod-extract.js.map +1 -0
  27. package/dist/marching-cubes-tables.d.ts +28 -0
  28. package/dist/marching-cubes-tables.d.ts.map +1 -0
  29. package/dist/marching-cubes-tables.js +344 -0
  30. package/dist/marching-cubes-tables.js.map +1 -0
  31. package/dist/marching-cubes.d.ts +17 -0
  32. package/dist/marching-cubes.d.ts.map +1 -0
  33. package/dist/marching-cubes.js +200 -0
  34. package/dist/marching-cubes.js.map +1 -0
  35. package/dist/register-builtins.d.ts +2 -0
  36. package/dist/register-builtins.d.ts.map +1 -0
  37. package/dist/register-builtins.js +34 -0
  38. package/dist/register-builtins.js.map +1 -0
  39. package/dist/terrain-editor.d.ts +15 -0
  40. package/dist/terrain-editor.d.ts.map +1 -0
  41. package/dist/terrain-editor.js +85 -0
  42. package/dist/terrain-editor.js.map +1 -0
  43. package/dist/terrain-normals.d.ts +13 -0
  44. package/dist/terrain-normals.d.ts.map +1 -0
  45. package/dist/terrain-normals.js +96 -0
  46. package/dist/terrain-normals.js.map +1 -0
  47. package/dist/terrain-volume.d.ts +42 -0
  48. package/dist/terrain-volume.d.ts.map +1 -0
  49. package/dist/terrain-volume.js +146 -0
  50. package/dist/terrain-volume.js.map +1 -0
  51. package/dist/terrain-world.d.ts +67 -0
  52. package/dist/terrain-world.d.ts.map +1 -0
  53. package/dist/terrain-world.js +344 -0
  54. package/dist/terrain-world.js.map +1 -0
  55. package/dist/types.d.ts +65 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +23 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +29 -0
  60. package/src/index.ts +42 -0
@@ -0,0 +1,256 @@
1
+ import { createMesh, computeBoundingSphere, VERTEX_STRIDE_FLOATS, TERRAIN_VERTEX_STRIDE_FLOATS, } from '@certe/atmos-renderer';
2
+ import { extractSurfaceLOD } from './lod-extract.js';
3
+ import { computeTriplanarUVs } from './marching-cubes.js';
4
+ import { computeGradientNormals, computeTriangleNormals } from './terrain-normals.js';
5
+ /** Max triangles per chunk at a given effective resolution. */
6
+ function maxTriangles(effectiveSize) {
7
+ return effectiveSize * effectiveSize * effectiveSize * 5;
8
+ }
9
+ const _profiles = new Map();
10
+ let _logTimer = 0;
11
+ const LOG_INTERVAL_MS = 3000;
12
+ function getProfile(lod) {
13
+ let p = _profiles.get(lod);
14
+ if (!p) {
15
+ const s = () => ({ totalMs: 0, count: 0 });
16
+ p = { density: s(), marchingCubes: s(), normals: s(), uvs: s(), gpuUpload: s(), total: s() };
17
+ _profiles.set(lod, p);
18
+ }
19
+ return p;
20
+ }
21
+ function addSample(stats, ms) {
22
+ stats.totalMs += ms;
23
+ stats.count++;
24
+ }
25
+ function avg(stats) {
26
+ return stats.count > 0 ? (stats.totalMs / stats.count).toFixed(2) : '-.--';
27
+ }
28
+ function maybeLog() {
29
+ const now = performance.now();
30
+ if (now - _logTimer < LOG_INTERVAL_MS)
31
+ return;
32
+ _logTimer = now;
33
+ for (const [lod, p] of _profiles) {
34
+ if (p.total.count === 0)
35
+ continue;
36
+ console.log(`[Terrain LOD${lod}] n=${p.total.count} ` +
37
+ `total=${avg(p.total)}ms ` +
38
+ `density=${avg(p.density)}ms ` +
39
+ `MC=${avg(p.marchingCubes)}ms ` +
40
+ `normals=${avg(p.normals)}ms ` +
41
+ `uvs=${avg(p.uvs)}ms ` +
42
+ `gpu=${avg(p.gpuUpload)}ms`);
43
+ }
44
+ }
45
+ // --- Pooled scratch buffers (reused across all buildLODMesh calls) ---
46
+ let _poolVerts = null;
47
+ let _poolIdx = null;
48
+ let _poolDensity = null;
49
+ function getScratchVerts(minFloats) {
50
+ if (!_poolVerts || _poolVerts.length < minFloats) {
51
+ _poolVerts = new Float32Array(minFloats);
52
+ }
53
+ return _poolVerts;
54
+ }
55
+ function getScratchIdx(minLen) {
56
+ if (!_poolIdx || _poolIdx.length < minLen) {
57
+ _poolIdx = new Uint32Array(minLen);
58
+ }
59
+ return _poolIdx;
60
+ }
61
+ function getScratchDensity(minLen) {
62
+ if (!_poolDensity || _poolDensity.length < minLen) {
63
+ _poolDensity = new Float32Array(minLen);
64
+ }
65
+ return _poolDensity;
66
+ }
67
+ let _poolSplatVerts = null;
68
+ function getScratchSplatVerts(minFloats) {
69
+ if (!_poolSplatVerts || _poolSplatVerts.length < minFloats) {
70
+ _poolSplatVerts = new Float32Array(minFloats);
71
+ }
72
+ return _poolSplatVerts;
73
+ }
74
+ /**
75
+ * Build a mesh at the given LOD level with grid overlap
76
+ * to hide cracks at LOD transitions.
77
+ *
78
+ * When `skirtFaces` is non-zero and `densityFn` is provided, the MC grid
79
+ * is extended by 1 cell (step voxels) past each boundary. The resulting
80
+ * mesh naturally overlaps with neighbors and the depth buffer hides seams.
81
+ * No extra skirt geometry — just real terrain surface past the boundary.
82
+ */
83
+ export function buildLODMesh(chunk, device, config, lodLevel, skirtFaces, densityFn) {
84
+ const tStart = performance.now();
85
+ const prof = getProfile(lodLevel);
86
+ const s = config.chunkSize;
87
+ const step = 1 << lodLevel;
88
+ const voxelSize = config.voxelSize;
89
+ const useOverlap = skirtFaces !== 0 && densityFn != null;
90
+ const ext = useOverlap ? step : 0;
91
+ const gridSize = s + 2 * ext;
92
+ const effectiveSize = gridSize / step;
93
+ // Build density grid — extended or original
94
+ const tDensity = performance.now();
95
+ let densityGrid;
96
+ if (useOverlap) {
97
+ const gs1 = gridSize + 1;
98
+ const gridLen = gs1 * gs1 * gs1;
99
+ densityGrid = getScratchDensity(gridLen);
100
+ const originX = (chunk.cx * s - ext) * voxelSize;
101
+ const originY = (chunk.cy * s - ext) * voxelSize;
102
+ const originZ = (chunk.cz * s - ext) * voxelSize;
103
+ // Only sample at positions extractSurfaceLOD actually reads (step intervals)
104
+ for (let z = 0; z <= gridSize; z += step) {
105
+ for (let y = 0; y <= gridSize; y += step) {
106
+ for (let x = 0; x <= gridSize; x += step) {
107
+ densityGrid[z * gs1 * gs1 + y * gs1 + x] = densityFn(originX + x * voxelSize, originY + y * voxelSize, originZ + z * voxelSize);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ else {
113
+ densityGrid = chunk.densityGrid;
114
+ }
115
+ addSample(prof.density, performance.now() - tDensity);
116
+ // Reuse pooled scratch buffers
117
+ const maxVerts = maxTriangles(effectiveSize) * 3;
118
+ const scratchVerts = getScratchVerts(maxVerts * VERTEX_STRIDE_FLOATS);
119
+ const scratchIdx = getScratchIdx(maxVerts);
120
+ // 1. Extract surface via marching cubes
121
+ const tMC = performance.now();
122
+ const meshData = extractSurfaceLOD(densityGrid, gridSize, step, voxelSize, config.isoLevel, scratchVerts, scratchIdx);
123
+ addSample(prof.marchingCubes, performance.now() - tMC);
124
+ if (meshData.vertexCount === 0 || meshData.indexCount === 0) {
125
+ return null;
126
+ }
127
+ // 2. Offset vertices back to chunk-local space
128
+ if (useOverlap) {
129
+ const offset = ext * voxelSize;
130
+ for (let vi = 0; vi < meshData.vertexCount; vi++) {
131
+ const o = vi * VERTEX_STRIDE_FLOATS;
132
+ scratchVerts[o] = scratchVerts[o] - offset;
133
+ scratchVerts[o + 1] = scratchVerts[o + 1] - offset;
134
+ scratchVerts[o + 2] = scratchVerts[o + 2] - offset;
135
+ }
136
+ }
137
+ // 3. Compute normals
138
+ const tNormals = performance.now();
139
+ if (lodLevel <= 1 && config.smoothNormals && densityFn) {
140
+ const originX = chunk.cx * s * voxelSize;
141
+ const originY = chunk.cy * s * voxelSize;
142
+ const originZ = chunk.cz * s * voxelSize;
143
+ const worldDensity = (x, y, z) => densityFn(x + originX, y + originY, z + originZ);
144
+ computeGradientNormals(scratchVerts, meshData.vertexCount, worldDensity, config.normalEpsilon);
145
+ }
146
+ else {
147
+ computeTriangleNormals(scratchVerts, scratchIdx, meshData.vertexCount, meshData.indexCount);
148
+ }
149
+ addSample(prof.normals, performance.now() - tNormals);
150
+ // 4. Compute triplanar UVs
151
+ const tUV = performance.now();
152
+ computeTriplanarUVs(scratchVerts, meshData.vertexCount);
153
+ addSample(prof.uvs, performance.now() - tUV);
154
+ // Trim and create GPU mesh
155
+ const tGPU = performance.now();
156
+ const trimmedVerts = scratchVerts.subarray(0, meshData.vertexCount * VERTEX_STRIDE_FLOATS);
157
+ const trimmedIdx = scratchIdx.subarray(0, meshData.indexCount);
158
+ const gpuMesh = createMesh(device, trimmedVerts, trimmedIdx, VERTEX_STRIDE_FLOATS);
159
+ gpuMesh.bounds = computeBoundingSphere(trimmedVerts, VERTEX_STRIDE_FLOATS);
160
+ addSample(prof.gpuUpload, performance.now() - tGPU);
161
+ addSample(prof.total, performance.now() - tStart);
162
+ maybeLog();
163
+ return gpuMesh;
164
+ }
165
+ /**
166
+ * Build a terrain mesh with splat weights (10-float stride).
167
+ * Runs the normal 8-float mesh build, then repacks into 10-float stride
168
+ * adding splat weights computed from surface normal + world height.
169
+ */
170
+ export function buildLODSplatMesh(chunk, device, config, lodLevel, skirtFaces, densityFn, weightFn) {
171
+ const s = config.chunkSize;
172
+ const step = 1 << lodLevel;
173
+ const voxelSize = config.voxelSize;
174
+ const useOverlap = skirtFaces !== 0;
175
+ const ext = useOverlap ? step : 0;
176
+ const gridSize = s + 2 * ext;
177
+ const effectiveSize = gridSize / step;
178
+ // Build density grid
179
+ let densityGrid;
180
+ if (useOverlap) {
181
+ const gs1 = gridSize + 1;
182
+ const gridLen = gs1 * gs1 * gs1;
183
+ densityGrid = getScratchDensity(gridLen);
184
+ const originX = (chunk.cx * s - ext) * voxelSize;
185
+ const originY = (chunk.cy * s - ext) * voxelSize;
186
+ const originZ = (chunk.cz * s - ext) * voxelSize;
187
+ for (let z = 0; z <= gridSize; z += step) {
188
+ for (let y = 0; y <= gridSize; y += step) {
189
+ for (let x = 0; x <= gridSize; x += step) {
190
+ densityGrid[z * gs1 * gs1 + y * gs1 + x] = densityFn(originX + x * voxelSize, originY + y * voxelSize, originZ + z * voxelSize);
191
+ }
192
+ }
193
+ }
194
+ }
195
+ else {
196
+ densityGrid = chunk.densityGrid;
197
+ }
198
+ const maxVerts = maxTriangles(effectiveSize) * 3;
199
+ const scratchVerts = getScratchVerts(maxVerts * VERTEX_STRIDE_FLOATS);
200
+ const scratchIdx = getScratchIdx(maxVerts);
201
+ const meshData = extractSurfaceLOD(densityGrid, gridSize, step, voxelSize, config.isoLevel, scratchVerts, scratchIdx);
202
+ if (meshData.vertexCount === 0 || meshData.indexCount === 0)
203
+ return null;
204
+ // Offset vertices back to chunk-local space
205
+ if (useOverlap) {
206
+ const offset = ext * voxelSize;
207
+ for (let vi = 0; vi < meshData.vertexCount; vi++) {
208
+ const o = vi * VERTEX_STRIDE_FLOATS;
209
+ scratchVerts[o] = scratchVerts[o] - offset;
210
+ scratchVerts[o + 1] = scratchVerts[o + 1] - offset;
211
+ scratchVerts[o + 2] = scratchVerts[o + 2] - offset;
212
+ }
213
+ }
214
+ // Compute normals
215
+ if (lodLevel <= 1 && config.smoothNormals) {
216
+ const originX = chunk.cx * s * voxelSize;
217
+ const originY = chunk.cy * s * voxelSize;
218
+ const originZ = chunk.cz * s * voxelSize;
219
+ const worldDensity = (x, y, z) => densityFn(x + originX, y + originY, z + originZ);
220
+ computeGradientNormals(scratchVerts, meshData.vertexCount, worldDensity, config.normalEpsilon);
221
+ }
222
+ else {
223
+ computeTriangleNormals(scratchVerts, scratchIdx, meshData.vertexCount, meshData.indexCount);
224
+ }
225
+ computeTriplanarUVs(scratchVerts, meshData.vertexCount);
226
+ // Repack 8-float → 10-float stride with splat weights
227
+ const chunkOriginY = chunk.cy * s * voxelSize;
228
+ const splatVerts = getScratchSplatVerts(meshData.vertexCount * TERRAIN_VERTEX_STRIDE_FLOATS);
229
+ for (let vi = 0; vi < meshData.vertexCount; vi++) {
230
+ const src = vi * VERTEX_STRIDE_FLOATS;
231
+ const dst = vi * TERRAIN_VERTEX_STRIDE_FLOATS;
232
+ // Copy pos(3) + normal(3) + uv(2)
233
+ splatVerts[dst] = scratchVerts[src];
234
+ splatVerts[dst + 1] = scratchVerts[src + 1];
235
+ splatVerts[dst + 2] = scratchVerts[src + 2];
236
+ splatVerts[dst + 3] = scratchVerts[src + 3];
237
+ splatVerts[dst + 4] = scratchVerts[src + 4];
238
+ splatVerts[dst + 5] = scratchVerts[src + 5];
239
+ splatVerts[dst + 6] = scratchVerts[src + 6];
240
+ splatVerts[dst + 7] = scratchVerts[src + 7];
241
+ // Compute splat weights from normal + world Y
242
+ const nx = scratchVerts[src + 3];
243
+ const ny = scratchVerts[src + 4];
244
+ const nz = scratchVerts[src + 5];
245
+ const worldY = scratchVerts[src + 1] + chunkOriginY;
246
+ const [w0, w1] = weightFn(nx, ny, nz, worldY);
247
+ splatVerts[dst + 8] = w0;
248
+ splatVerts[dst + 9] = w1;
249
+ }
250
+ const trimmedSplat = splatVerts.subarray(0, meshData.vertexCount * TERRAIN_VERTEX_STRIDE_FLOATS);
251
+ const trimmedIdx = scratchIdx.subarray(0, meshData.indexCount);
252
+ const gpuMesh = createMesh(device, trimmedSplat, trimmedIdx, TERRAIN_VERTEX_STRIDE_FLOATS);
253
+ gpuMesh.bounds = computeBoundingSphere(trimmedSplat, TERRAIN_VERTEX_STRIDE_FLOATS);
254
+ return gpuMesh;
255
+ }
256
+ //# sourceMappingURL=lod-chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod-chunk.js","sourceRoot":"","sources":["../src/lod-chunk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MeshData } from './types.js';
2
+ /**
3
+ * Extract an isosurface at reduced resolution by stepping through
4
+ * the full-resolution density grid with a given stride.
5
+ *
6
+ * step=1 is identical to the regular extractSurface.
7
+ * step=2 produces half-resolution (LOD 1).
8
+ * step=4 produces quarter-resolution (LOD 2).
9
+ *
10
+ * Positions are still in chunk-local space (0 → size*voxelSize).
11
+ *
12
+ * @param densityGrid Full-resolution (size+1)^3 density grid.
13
+ * @param size Original grid size (e.g. 16).
14
+ * @param step Sampling stride: 1, 2, or 4.
15
+ * @param voxelSize World-space size of each voxel.
16
+ * @param isoLevel Density threshold.
17
+ * @param outVertices Pre-allocated vertex buffer.
18
+ * @param outIndices Pre-allocated index buffer.
19
+ */
20
+ export declare function extractSurfaceLOD(densityGrid: Float32Array, size: number, step: number, voxelSize: number, isoLevel: number, outVertices: Float32Array, outIndices: Uint32Array): MeshData;
21
+ //# sourceMappingURL=lod-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod-extract.d.ts","sourceRoot":"","sources":["../src/lod-extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiB3C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,WAAW,GACtB,QAAQ,CA4HV"}
@@ -0,0 +1,178 @@
1
+ import { EDGE_TABLE, TRI_TABLE, CORNER_OFFSETS, EDGE_CORNERS } from './marching-cubes-tables.js';
2
+ /** Stride in floats: pos(3) + normal(3) + uv(2) */
3
+ const STRIDE = 8;
4
+ // --- Pooled edge caches (reused across calls, grown as needed) ---
5
+ let _poolXEdge = null;
6
+ let _poolYEdge = null;
7
+ let _poolZEdge = null;
8
+ function getEdgeCache(pool, minLen) {
9
+ if (!pool || pool.length < minLen) {
10
+ return new Int32Array(minLen);
11
+ }
12
+ return pool;
13
+ }
14
+ /**
15
+ * Extract an isosurface at reduced resolution by stepping through
16
+ * the full-resolution density grid with a given stride.
17
+ *
18
+ * step=1 is identical to the regular extractSurface.
19
+ * step=2 produces half-resolution (LOD 1).
20
+ * step=4 produces quarter-resolution (LOD 2).
21
+ *
22
+ * Positions are still in chunk-local space (0 → size*voxelSize).
23
+ *
24
+ * @param densityGrid Full-resolution (size+1)^3 density grid.
25
+ * @param size Original grid size (e.g. 16).
26
+ * @param step Sampling stride: 1, 2, or 4.
27
+ * @param voxelSize World-space size of each voxel.
28
+ * @param isoLevel Density threshold.
29
+ * @param outVertices Pre-allocated vertex buffer.
30
+ * @param outIndices Pre-allocated index buffer.
31
+ */
32
+ export function extractSurfaceLOD(densityGrid, size, step, voxelSize, isoLevel, outVertices, outIndices) {
33
+ const s1 = size + 1;
34
+ const s1s1 = s1 * s1;
35
+ // Effective grid dimensions at this LOD
36
+ const effectiveSize = size / step;
37
+ const es1 = effectiveSize + 1;
38
+ // Reuse pooled edge caches, fill with -1
39
+ const xLen = effectiveSize * es1 * es1;
40
+ const yLen = es1 * effectiveSize * es1;
41
+ const zLen = es1 * es1 * effectiveSize;
42
+ _poolXEdge = getEdgeCache(_poolXEdge, xLen);
43
+ _poolYEdge = getEdgeCache(_poolYEdge, yLen);
44
+ _poolZEdge = getEdgeCache(_poolZEdge, zLen);
45
+ const xEdge = _poolXEdge;
46
+ const yEdge = _poolYEdge;
47
+ const zEdge = _poolZEdge;
48
+ xEdge.fill(-1, 0, xLen);
49
+ yEdge.fill(-1, 0, yLen);
50
+ zEdge.fill(-1, 0, zLen);
51
+ let vertCount = 0;
52
+ let idxCount = 0;
53
+ // Scratch — tiny, no pooling needed
54
+ let cubeIndex = 0;
55
+ const cornerDensity = new Float32Array(8);
56
+ const edgeVerts = new Int32Array(12);
57
+ // Iterate in effective-grid coordinates (ex, ey, ez)
58
+ for (let ez = 0; ez < effectiveSize; ez++) {
59
+ for (let ey = 0; ey < effectiveSize; ey++) {
60
+ for (let ex = 0; ex < effectiveSize; ex++) {
61
+ // Map to full-grid coordinates
62
+ const gxBase = ex * step;
63
+ const gyBase = ey * step;
64
+ const gzBase = ez * step;
65
+ // Gather 8 corner densities from the full grid
66
+ cubeIndex = 0;
67
+ for (let c = 0; c < 8; c++) {
68
+ const co = CORNER_OFFSETS[c];
69
+ const gx = gxBase + co[0] * step;
70
+ const gy = gyBase + co[1] * step;
71
+ const gz = gzBase + co[2] * step;
72
+ const d = densityGrid[gz * s1s1 + gy * s1 + gx];
73
+ cornerDensity[c] = d;
74
+ if (d < isoLevel)
75
+ cubeIndex |= (1 << c);
76
+ }
77
+ const edgeBits = EDGE_TABLE[cubeIndex];
78
+ if (edgeBits === 0)
79
+ continue;
80
+ for (let e = 0; e < 12; e++) {
81
+ if ((edgeBits & (1 << e)) === 0) {
82
+ edgeVerts[e] = -1;
83
+ continue;
84
+ }
85
+ const ec = EDGE_CORNERS[e];
86
+ const c0 = ec[0];
87
+ const c1 = ec[1];
88
+ // Check cache using effective-grid coords
89
+ const cached = getCachedEdgeLOD(e, ex, ey, ez, es1, effectiveSize, xEdge, yEdge, zEdge);
90
+ if (cached >= 0) {
91
+ edgeVerts[e] = cached;
92
+ continue;
93
+ }
94
+ // Interpolate in full-grid space, then convert to world
95
+ const d0 = cornerDensity[c0];
96
+ const d1 = cornerDensity[c1];
97
+ const denom = d0 - d1;
98
+ const t = Math.abs(denom) < 1e-10 ? 0.5 : (d0 - isoLevel) / denom;
99
+ const co0 = CORNER_OFFSETS[c0];
100
+ const co1 = CORNER_OFFSETS[c1];
101
+ // Position in full-grid units, then multiply by voxelSize
102
+ const px = (gxBase + co0[0] * step + t * (co1[0] - co0[0]) * step) * voxelSize;
103
+ const py = (gyBase + co0[1] * step + t * (co1[1] - co0[1]) * step) * voxelSize;
104
+ const pz = (gzBase + co0[2] * step + t * (co1[2] - co0[2]) * step) * voxelSize;
105
+ const o = vertCount * STRIDE;
106
+ outVertices[o] = px;
107
+ outVertices[o + 1] = py;
108
+ outVertices[o + 2] = pz;
109
+ outVertices[o + 3] = 0;
110
+ outVertices[o + 4] = 1;
111
+ outVertices[o + 5] = 0;
112
+ outVertices[o + 6] = 0;
113
+ outVertices[o + 7] = 0;
114
+ edgeVerts[e] = vertCount;
115
+ setCachedEdgeLOD(e, ex, ey, ez, es1, effectiveSize, xEdge, yEdge, zEdge, vertCount);
116
+ vertCount++;
117
+ }
118
+ // Emit triangles
119
+ const triBase = cubeIndex * 16;
120
+ for (let ti = 0; ti < 15; ti += 3) {
121
+ const e0 = TRI_TABLE[triBase + ti];
122
+ if (e0 === -1)
123
+ break;
124
+ const e1 = TRI_TABLE[triBase + ti + 1];
125
+ const e2 = TRI_TABLE[triBase + ti + 2];
126
+ outIndices[idxCount++] = edgeVerts[e0];
127
+ outIndices[idxCount++] = edgeVerts[e1];
128
+ outIndices[idxCount++] = edgeVerts[e2];
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return {
134
+ vertices: outVertices,
135
+ indices: outIndices,
136
+ vertexCount: vertCount,
137
+ indexCount: idxCount,
138
+ };
139
+ }
140
+ // --- Edge cache helpers (same logic as marching-cubes.ts but for effective grid) ---
141
+ function edgeDirection(e) {
142
+ if (e === 0 || e === 2 || e === 4 || e === 6)
143
+ return 0;
144
+ if (e === 1 || e === 3 || e === 5 || e === 7)
145
+ return 2;
146
+ return 1;
147
+ }
148
+ function edgeOriginLOD(e, x, y, z) {
149
+ const ec = EDGE_CORNERS[e];
150
+ const co0 = CORNER_OFFSETS[ec[0]];
151
+ const co1 = CORNER_OFFSETS[ec[1]];
152
+ const dir = edgeDirection(e);
153
+ const co = co0[dir] <= co1[dir] ? co0 : co1;
154
+ return [x + co[0], y + co[1], z + co[2]];
155
+ }
156
+ function getCachedEdgeLOD(e, x, y, z, s1, size, xEdge, yEdge, zEdge) {
157
+ const [ox, oy, oz] = edgeOriginLOD(e, x, y, z);
158
+ const dir = edgeDirection(e);
159
+ if (dir === 0)
160
+ return xEdge[oz * s1 * size + oy * size + ox];
161
+ if (dir === 1)
162
+ return yEdge[oz * size * s1 + oy * s1 + ox];
163
+ return zEdge[oz * s1 * s1 + oy * s1 + ox];
164
+ }
165
+ function setCachedEdgeLOD(e, x, y, z, s1, size, xEdge, yEdge, zEdge, vertexIndex) {
166
+ const [ox, oy, oz] = edgeOriginLOD(e, x, y, z);
167
+ const dir = edgeDirection(e);
168
+ if (dir === 0) {
169
+ xEdge[oz * s1 * size + oy * size + ox] = vertexIndex;
170
+ }
171
+ else if (dir === 1) {
172
+ yEdge[oz * size * s1 + oy * s1 + ox] = vertexIndex;
173
+ }
174
+ else {
175
+ zEdge[oz * s1 * s1 + oy * s1 + ox] = vertexIndex;
176
+ }
177
+ }
178
+ //# sourceMappingURL=lod-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod-extract.js","sourceRoot":"","sources":["../src/lod-extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Marching cubes lookup tables.
3
+ * Based on the Paul Bourke / Cory Gene Bloyd tables.
4
+ *
5
+ * Corner numbering (unit cube):
6
+ * 4----5 Y
7
+ * /| /| |
8
+ * 7----6 | +--X
9
+ * | 0--|-1 /
10
+ * |/ |/ Z
11
+ * 3----2
12
+ */
13
+ /** Unit offsets for the 8 corners of a cube: [x,y,z] */
14
+ export declare const CORNER_OFFSETS: ReadonlyArray<readonly [number, number, number]>;
15
+ /** Which two corners each of the 12 edges connects: [cornerA, cornerB] */
16
+ export declare const EDGE_CORNERS: ReadonlyArray<readonly [number, number]>;
17
+ /**
18
+ * Edge table: for each of the 256 cube configurations, a 12-bit mask
19
+ * indicating which edges are intersected by the isosurface.
20
+ */
21
+ export declare const EDGE_TABLE: Uint16Array<ArrayBuffer>;
22
+ /**
23
+ * Triangle table: for each of the 256 cube configurations, up to 5 triangles
24
+ * (15 edge indices). Each row is 16 entries, terminated by -1.
25
+ * Access: TRI_TABLE[cubeIndex * 16 + i]
26
+ */
27
+ export declare const TRI_TABLE: Int8Array<ArrayBuffer>;
28
+ //# sourceMappingURL=marching-cubes-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marching-cubes-tables.d.ts","sourceRoot":"","sources":["../src/marching-cubes-tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AAExD,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAS3E,CAAC;AAEF,0EAA0E;AAE1E,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAajE,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,UAAU,0BAiCrB,CAAC;AAEH;;;;GAIG;AAEH,eAAO,MAAM,SAAS,wBAiQpB,CAAC"}