@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.
- package/LICENCE +674 -0
- package/README.md +155 -0
- package/dist/chunk-key.d.ts +10 -0
- package/dist/chunk-key.d.ts.map +1 -0
- package/dist/chunk-key.js +27 -0
- package/dist/chunk-key.js.map +1 -0
- package/dist/chunk.d.ts +36 -0
- package/dist/chunk.d.ts.map +1 -0
- package/dist/chunk.js +128 -0
- package/dist/chunk.js.map +1 -0
- package/dist/density-field.d.ts +34 -0
- package/dist/density-field.d.ts.map +1 -0
- package/dist/density-field.js +68 -0
- package/dist/density-field.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/lod-chunk.d.ts +20 -0
- package/dist/lod-chunk.d.ts.map +1 -0
- package/dist/lod-chunk.js +256 -0
- package/dist/lod-chunk.js.map +1 -0
- package/dist/lod-extract.d.ts +21 -0
- package/dist/lod-extract.d.ts.map +1 -0
- package/dist/lod-extract.js +178 -0
- package/dist/lod-extract.js.map +1 -0
- package/dist/marching-cubes-tables.d.ts +28 -0
- package/dist/marching-cubes-tables.d.ts.map +1 -0
- package/dist/marching-cubes-tables.js +344 -0
- package/dist/marching-cubes-tables.js.map +1 -0
- package/dist/marching-cubes.d.ts +17 -0
- package/dist/marching-cubes.d.ts.map +1 -0
- package/dist/marching-cubes.js +200 -0
- package/dist/marching-cubes.js.map +1 -0
- package/dist/register-builtins.d.ts +2 -0
- package/dist/register-builtins.d.ts.map +1 -0
- package/dist/register-builtins.js +34 -0
- package/dist/register-builtins.js.map +1 -0
- package/dist/terrain-editor.d.ts +15 -0
- package/dist/terrain-editor.d.ts.map +1 -0
- package/dist/terrain-editor.js +85 -0
- package/dist/terrain-editor.js.map +1 -0
- package/dist/terrain-normals.d.ts +13 -0
- package/dist/terrain-normals.d.ts.map +1 -0
- package/dist/terrain-normals.js +96 -0
- package/dist/terrain-normals.js.map +1 -0
- package/dist/terrain-volume.d.ts +42 -0
- package/dist/terrain-volume.d.ts.map +1 -0
- package/dist/terrain-volume.js +146 -0
- package/dist/terrain-volume.js.map +1 -0
- package/dist/terrain-world.d.ts +67 -0
- package/dist/terrain-world.d.ts.map +1 -0
- package/dist/terrain-world.js +344 -0
- package/dist/terrain-world.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -0
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGjG,mDAAmD;AACnD,MAAM,MAAM,GAAG,CAAC,CAAC;AAEjB,oEAAoE;AACpE,IAAI,UAAU,GAAsB,IAAI,CAAC;AACzC,IAAI,UAAU,GAAsB,IAAI,CAAC;AACzC,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC,SAAS,YAAY,CAAC,IAAuB,EAAE,MAAc;IAC3D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAClC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAyB,EACzB,IAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,QAAgB,EAChB,WAAyB,EACzB,UAAuB;IAEvB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IAErB,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,aAAa,GAAG,CAAC,CAAC;IAE9B,yCAAyC;IACzC,MAAM,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,aAAa,CAAC;IACvC,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5C,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5C,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAExB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,oCAAoC;IACpC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,aAAa,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAErC,qDAAqD;IACrD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;YAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;gBAC1C,+BAA+B;gBAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;gBACzB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;gBACzB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;gBAEzB,+CAA+C;gBAC/C,SAAS,GAAG,CAAC,CAAC;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAE,CAAC;oBAC9B,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACjC,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACjC,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACjC,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAE,CAAC;oBACjD,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACrB,IAAI,CAAC,GAAG,QAAQ;wBAAE,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1C,CAAC;gBAED,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAE,CAAC;gBACxC,IAAI,QAAQ,KAAK,CAAC;oBAAE,SAAS;gBAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAClB,SAAS;oBACX,CAAC;oBAED,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;oBAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBAEjB,0CAA0C;oBAC1C,MAAM,MAAM,GAAG,gBAAgB,CAC7B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CACvD,CAAC;oBACF,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;wBAChB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;wBACtB,SAAS;oBACX,CAAC;oBAED,wDAAwD;oBACxD,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,CAAE,CAAC;oBAC9B,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,CAAE,CAAC;oBAC9B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;oBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC;oBAElE,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAE,CAAC;oBAChC,0DAA0D;oBAC1D,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;oBAC/E,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;oBAC/E,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;oBAE/E,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC;oBAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBACpB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACxB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACxB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACvB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACvB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACvB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACvB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAEvB,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;oBACzB,gBAAgB,CACd,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAClE,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;gBAED,iBAAiB;gBACjB,MAAM,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC;gBAC/B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;oBAClC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,CAAE,CAAC;oBACpC,IAAI,EAAE,KAAK,CAAC,CAAC;wBAAE,MAAM;oBACrB,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAE,CAAC;oBACxC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAE,CAAC;oBACxC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAE,CAAC;oBACxC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAE,CAAC;oBACxC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAE,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,QAAQ;KACrB,CAAC;AACJ,CAAC;AAED,sFAAsF;AAEtF,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CACpB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IAE1C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IACnC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IACnC,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAE,IAAI,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,gBAAgB,CACvB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAC1C,EAAU,EAAE,IAAY,EACxB,KAAiB,EAAE,KAAiB,EAAE,KAAiB;IAEvD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAE,CAAC;IAC9D,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAE,CAAC;IAC5D,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAE,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CACvB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAC1C,EAAU,EAAE,IAAY,EACxB,KAAiB,EAAE,KAAiB,EAAE,KAAiB,EACvD,WAAmB;IAEnB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;IACvD,CAAC;SAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|