@yali-engine/render 0.0.0-stage → 0.4.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/dist/bvh.d.ts +66 -0
- package/dist/bvh.js +493 -0
- package/dist/bvh.js.map +1 -0
- package/dist/camera.d.ts +34 -0
- package/dist/camera.js +66 -0
- package/dist/camera.js.map +1 -0
- package/dist/cluster-build.d.ts +46 -0
- package/dist/cluster-build.js +179 -0
- package/dist/cluster-build.js.map +1 -0
- package/dist/cluster-pages.d.ts +70 -0
- package/dist/cluster-pages.js +203 -0
- package/dist/cluster-pages.js.map +1 -0
- package/dist/cluster-stream.d.ts +83 -0
- package/dist/cluster-stream.js +226 -0
- package/dist/cluster-stream.js.map +1 -0
- package/dist/culled-draws.d.ts +30 -0
- package/dist/culled-draws.js +103 -0
- package/dist/culled-draws.js.map +1 -0
- package/dist/debug-lines.d.ts +51 -0
- package/dist/debug-lines.js +158 -0
- package/dist/debug-lines.js.map +1 -0
- package/dist/device-profile.d.ts +100 -0
- package/dist/device-profile.js +131 -0
- package/dist/device-profile.js.map +1 -0
- package/dist/device.d.ts +39 -0
- package/dist/device.js +79 -0
- package/dist/device.js.map +1 -0
- package/dist/environment.d.ts +60 -0
- package/dist/environment.js +204 -0
- package/dist/environment.js.map +1 -0
- package/dist/extract.d.ts +74 -0
- package/dist/extract.js +194 -0
- package/dist/extract.js.map +1 -0
- package/dist/frame-graph.d.ts +112 -0
- package/dist/frame-graph.js +226 -0
- package/dist/frame-graph.js.map +1 -0
- package/dist/gpu-health.d.ts +74 -0
- package/dist/gpu-health.js +106 -0
- package/dist/gpu-health.js.map +1 -0
- package/dist/gpu-timer.d.ts +26 -0
- package/dist/gpu-timer.js +93 -0
- package/dist/gpu-timer.js.map +1 -0
- package/dist/headless.d.ts +28 -0
- package/dist/headless.js +91 -0
- package/dist/headless.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lights.d.ts +81 -0
- package/dist/lights.js +247 -0
- package/dist/lights.js.map +1 -0
- package/dist/matrix.d.ts +6 -0
- package/dist/matrix.js +59 -0
- package/dist/matrix.js.map +1 -0
- package/dist/meshes.d.ts +411 -0
- package/dist/meshes.js +545 -0
- package/dist/meshes.js.map +1 -0
- package/dist/meshlets-decoder.d.ts +20 -0
- package/dist/meshlets-decoder.js +47 -0
- package/dist/meshlets-decoder.js.map +1 -0
- package/dist/meshlets.d.ts +186 -0
- package/dist/meshlets.js +1040 -0
- package/dist/meshlets.js.map +1 -0
- package/dist/occlusion.d.ts +51 -0
- package/dist/occlusion.js +188 -0
- package/dist/occlusion.js.map +1 -0
- package/dist/pick-decoder.d.ts +19 -0
- package/dist/pick-decoder.js +45 -0
- package/dist/pick-decoder.js.map +1 -0
- package/dist/pick.d.ts +86 -0
- package/dist/pick.js +452 -0
- package/dist/pick.js.map +1 -0
- package/dist/pipeline-cache.d.ts +53 -0
- package/dist/pipeline-cache.js +96 -0
- package/dist/pipeline-cache.js.map +1 -0
- package/dist/post-options.d.ts +109 -0
- package/dist/post-options.js +23 -0
- package/dist/post-options.js.map +1 -0
- package/dist/post-shaders.gen.d.ts +40 -0
- package/dist/post-shaders.gen.js +43 -0
- package/dist/post-shaders.gen.js.map +1 -0
- package/dist/post.d.ts +101 -0
- package/dist/post.js +555 -0
- package/dist/post.js.map +1 -0
- package/dist/render-plugin.d.ts +239 -0
- package/dist/render-plugin.js +633 -0
- package/dist/render-plugin.js.map +1 -0
- package/dist/scene.d.ts +406 -0
- package/dist/scene.js +2005 -0
- package/dist/scene.js.map +1 -0
- package/dist/shaders.gen.d.ts +40 -0
- package/dist/shaders.gen.js +43 -0
- package/dist/shaders.gen.js.map +1 -0
- package/dist/shadows.d.ts +104 -0
- package/dist/shadows.js +227 -0
- package/dist/shadows.js.map +1 -0
- package/dist/staging-ring.d.ts +41 -0
- package/dist/staging-ring.js +125 -0
- package/dist/staging-ring.js.map +1 -0
- package/dist/textures.d.ts +165 -0
- package/dist/textures.js +361 -0
- package/dist/textures.js.map +1 -0
- package/dist/tonemap.d.ts +45 -0
- package/dist/tonemap.js +141 -0
- package/dist/tonemap.js.map +1 -0
- package/dist/viewport.d.ts +78 -0
- package/dist/viewport.js +130 -0
- package/dist/viewport.js.map +1 -0
- package/dist/webgl2/plugin.d.ts +40 -0
- package/dist/webgl2/plugin.js +190 -0
- package/dist/webgl2/plugin.js.map +1 -0
- package/dist/webgl2/program.d.ts +27 -0
- package/dist/webgl2/program.js +74 -0
- package/dist/webgl2/program.js.map +1 -0
- package/dist/webgl2/renderer.d.ts +128 -0
- package/dist/webgl2/renderer.js +976 -0
- package/dist/webgl2/renderer.js.map +1 -0
- package/dist/webgl2/shaders.glsl.gen.d.ts +27 -0
- package/dist/webgl2/shaders.glsl.gen.js +20 -0
- package/dist/webgl2/shaders.glsl.gen.js.map +1 -0
- package/dist/webgl2/textures.d.ts +11 -0
- package/dist/webgl2/textures.js +82 -0
- package/dist/webgl2/textures.js.map +1 -0
- package/dist/webgl2/webgl2.d.ts +1 -0
- package/dist/webgl2/webgl2.js +4 -0
- package/dist/webgl2/webgl2.js.map +1 -0
- package/dist/worker-mode.d.ts +85 -0
- package/dist/worker-mode.js +204 -0
- package/dist/worker-mode.js.map +1 -0
- package/package.json +47 -3
- package/README.md +0 -3
package/dist/meshes.js
ADDED
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { YaliError } from '@yali-engine/core';
|
|
2
|
+
import { packTextureSlot, TextureRef } from "./textures.js";
|
|
3
|
+
/** Floats per interleaved vertex in the geometry pool (position, normal, uv), for decode workers. */
|
|
4
|
+
export const MESH_VERTEX_FLOATS = 8;
|
|
5
|
+
const VERTEX_FLOATS = MESH_VERTEX_FLOATS;
|
|
6
|
+
/** Most LODs a mesh may have (LOD 0 included; `shaders/scene/instance.wesl` `MAX_LODS`). */
|
|
7
|
+
export const MAX_LODS = 8;
|
|
8
|
+
/** The mesh id of the unit cube every `MeshStore` starts with. */
|
|
9
|
+
export const CUBE_MESH = 0;
|
|
10
|
+
/** Bytes per vertex of the skin stream: 4 × u16 joints, 4 × unorm16 weights. */
|
|
11
|
+
export const SKIN_STREAM_BYTES = 16;
|
|
12
|
+
/**
|
|
13
|
+
* Packs 4 joints and 4 weights per vertex (glTF `JOINTS_0` / `WEIGHTS_0`, weights summing to 1)
|
|
14
|
+
* into the skin stream's layout: u16 joints, then the weights as unorm16 rounded so they sum to
|
|
15
|
+
* exactly 65535 (the largest absorbs the rounding).
|
|
16
|
+
*/
|
|
17
|
+
export function packSkin(joints, weights, count) {
|
|
18
|
+
const out = new Uint16Array(count * 8);
|
|
19
|
+
for (let v = 0; v < count; v++) {
|
|
20
|
+
let sum = 0;
|
|
21
|
+
let top = 0;
|
|
22
|
+
for (let c = 0; c < 4; c++) {
|
|
23
|
+
out[v * 8 + c] = joints[v * 4 + c];
|
|
24
|
+
const w = Math.round(Math.min(1, Math.max(0, weights[v * 4 + c])) * 65535);
|
|
25
|
+
out[v * 8 + 4 + c] = w;
|
|
26
|
+
sum += w;
|
|
27
|
+
if (w > out[v * 8 + 4 + top])
|
|
28
|
+
top = c;
|
|
29
|
+
}
|
|
30
|
+
if (sum > 0)
|
|
31
|
+
out[v * 8 + 4 + top] += 65535 - sum;
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/** The rigid draw classes: opaque, mask, blend (last), each single then double-sided. */
|
|
36
|
+
export const RIGID_CLASSES = 6;
|
|
37
|
+
/**
|
|
38
|
+
* Draw classes: the six rigid ones, then the same six skinned (ADR-0088: `+ SKINNED_CLASS`),
|
|
39
|
+
* which read the skinned pool and the palette.
|
|
40
|
+
*/
|
|
41
|
+
export const DRAW_CLASSES = 12;
|
|
42
|
+
/** What a skinned mesh's class adds to its rigid class. */
|
|
43
|
+
export const SKINNED_CLASS = RIGID_CLASSES;
|
|
44
|
+
/** A mesh state's draw class: alpha mode × 2 + double-sided, + `SKINNED_CLASS` when skinned. Class 0 is opaque single-sided rigid. */
|
|
45
|
+
export function drawClassOf(state, skinned = false) {
|
|
46
|
+
const alpha = state?.alpha === 'mask' ? 1 : state?.alpha === 'blend' ? 2 : 0;
|
|
47
|
+
return alpha * 2 + (state?.doubleSided ? 1 : 0) + (skinned ? SKINNED_CLASS : 0);
|
|
48
|
+
}
|
|
49
|
+
/** Whether a draw class blends (no depth writes, no shadow casting, drawn last). */
|
|
50
|
+
export const isBlendClass = (c) => c % RIGID_CLASSES >= 4;
|
|
51
|
+
/** Whether a draw class is skinned (reads the skinned pool and the palette). */
|
|
52
|
+
export const isSkinnedClass = (c) => c >= SKINNED_CLASS;
|
|
53
|
+
/**
|
|
54
|
+
* Every mesh the app has loaded, kept on the CPU too (ADR-0047): the GPU geometry pool is
|
|
55
|
+
* rebuilt from it after device loss (DESIGN.md §3). A mesh id is its index here, and what
|
|
56
|
+
* the `render.Mesh` component stores. Mesh 0 is a unit cube (`CUBE_MESH`).
|
|
57
|
+
*
|
|
58
|
+
* Geometry is append-only: vertex and index blocks are placed one after another, so a
|
|
59
|
+
* renderer uploads only what was added since it last looked (`vertexBlocks`,
|
|
60
|
+
* `indexBlocks`). LODs added later (`addLods`) are new index blocks over the same vertices.
|
|
61
|
+
*/
|
|
62
|
+
export class MeshStore {
|
|
63
|
+
entries = [];
|
|
64
|
+
vertexBlocks = [];
|
|
65
|
+
indexBlocks = [];
|
|
66
|
+
/** The skinned pool (ADR-0088): vertices in the same layout, and the skin stream beside them. */
|
|
67
|
+
skinnedVertexBlocks = [];
|
|
68
|
+
skinBlocks = [];
|
|
69
|
+
#vertexCount = 0;
|
|
70
|
+
#skinnedCount = 0;
|
|
71
|
+
#indexCount = 0;
|
|
72
|
+
/** Bumped on every change, so a renderer knows it has something to upload. */
|
|
73
|
+
version = 0;
|
|
74
|
+
/**
|
|
75
|
+
* Meshes whose vertices were rewritten (`updateVertices`), by id: the serial of the latest
|
|
76
|
+
* write, the pool and where in it. A renderer uploads those newer than the last it saw.
|
|
77
|
+
*/
|
|
78
|
+
vertexWrites = new Map();
|
|
79
|
+
/**
|
|
80
|
+
* Vertex ranges written into reserved room (`writeVertices`, streamed pages, ADR-0134): not motion,
|
|
81
|
+
* so they do not make the pool dynamic. The renderer uploads those newer than the last it saw and
|
|
82
|
+
* sets `rangesSeen`; older ones are dropped on the next write.
|
|
83
|
+
*/
|
|
84
|
+
rangeWrites = [];
|
|
85
|
+
rangesSeen = 0;
|
|
86
|
+
/**
|
|
87
|
+
* Meshes whose finest LOD's indices were rewritten (`updateIndices`, ADR-0117), by id: the serial
|
|
88
|
+
* of the latest write (shared with the vertex writes), where in the index pool, and the indices.
|
|
89
|
+
*/
|
|
90
|
+
indexWrites = new Map();
|
|
91
|
+
#writeSerial = 0;
|
|
92
|
+
/** Each mesh's vertex block (what `updateVertices` rewrites in place). */
|
|
93
|
+
#blocks = [];
|
|
94
|
+
/** Each mesh's finest LOD's indices and skin stream (picking, ADR-0094). */
|
|
95
|
+
#indices0 = [];
|
|
96
|
+
#skins = [];
|
|
97
|
+
#clusters = [];
|
|
98
|
+
#pages = [];
|
|
99
|
+
constructor() {
|
|
100
|
+
this.add(cube());
|
|
101
|
+
}
|
|
102
|
+
/** Interleaves (if needed) and stores a mesh; returns its id. Main thread, inside the upload budget. */
|
|
103
|
+
add(m) {
|
|
104
|
+
const own = 'vertices' in m ? m.vertices : interleave(m.positions, m.normals, m.uvs ?? null);
|
|
105
|
+
const reserve = m.vertexCapacity ?? 0;
|
|
106
|
+
let vertices = own;
|
|
107
|
+
if (reserve > own.length / VERTEX_FLOATS) {
|
|
108
|
+
if (m.skin)
|
|
109
|
+
throw new YaliError('BAD_CAPACITY', 'A skinned mesh asked for reserved vertices.', 'Reserve room only for rigid meshes (streamed cluster pages).');
|
|
110
|
+
vertices = new Float32Array(reserve * VERTEX_FLOATS);
|
|
111
|
+
vertices.set(own);
|
|
112
|
+
}
|
|
113
|
+
const count = vertices.length / VERTEX_FLOATS;
|
|
114
|
+
const skinned = !!m.skin;
|
|
115
|
+
if (m.skin && m.skin.length !== count * 8) {
|
|
116
|
+
throw new YaliError('BAD_SKIN', `A skin stream of ${m.skin.length / 8} vertices for ${count} vertices.`, 'Pack the skin with packSkin(joints, weights, vertexCount).');
|
|
117
|
+
}
|
|
118
|
+
let baseVertex;
|
|
119
|
+
if (m.skin) {
|
|
120
|
+
baseVertex = this.#skinnedCount;
|
|
121
|
+
this.skinnedVertexBlocks.push({ data: vertices, at: baseVertex });
|
|
122
|
+
this.skinBlocks.push({ data: m.skin, at: baseVertex });
|
|
123
|
+
this.#skinnedCount += count;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
baseVertex = this.#vertexCount;
|
|
127
|
+
this.vertexBlocks.push({ data: vertices, at: baseVertex });
|
|
128
|
+
this.#vertexCount += count;
|
|
129
|
+
}
|
|
130
|
+
const b = bounds(own);
|
|
131
|
+
// A skinned mesh's pose may reach past its bind pose: twice the bind radius for culling (an
|
|
132
|
+
// estimate until per-frame joint bounds exist, animation-design.md §6).
|
|
133
|
+
const center = b.center;
|
|
134
|
+
const radius = m.radius ?? (skinned ? b.radius * 2 : b.radius);
|
|
135
|
+
const entry = { baseVertex, skinned, lods: [], center, radius, drawClass: drawClassOf(m.state, skinned) };
|
|
136
|
+
this.entries.push(entry);
|
|
137
|
+
this.#blocks.push(vertices);
|
|
138
|
+
this.#indices0.push(m.indices);
|
|
139
|
+
this.#skins.push(m.skin ?? null);
|
|
140
|
+
this.#clusters.push(m.clusters ?? null);
|
|
141
|
+
this.#pages.push(m.pages ?? null);
|
|
142
|
+
entry.lods.push(this.#indices(m.indices, 0));
|
|
143
|
+
if (m.lods)
|
|
144
|
+
this.#addLods(entry, m.lods);
|
|
145
|
+
this.version++;
|
|
146
|
+
return this.entries.length - 1;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Rewrites mesh `id`'s vertices (the same count, `MESH_VERTEX_FLOATS` each): a morphed pose
|
|
150
|
+
* (ADR-0088). The stored copy changes too, so a pool rebuilt after device loss has it. Its
|
|
151
|
+
* bounds stay those it was added with.
|
|
152
|
+
*/
|
|
153
|
+
updateVertices(id, vertices) {
|
|
154
|
+
const entry = this.entries[id];
|
|
155
|
+
const block = this.#blocks[id];
|
|
156
|
+
if (!entry || !block)
|
|
157
|
+
throw new YaliError('UNKNOWN_MESH', `Mesh ${id} does not exist.`, 'Pass an id that MeshStore.add returned.');
|
|
158
|
+
if (vertices.length !== block.length) {
|
|
159
|
+
throw new YaliError('BAD_VERTICES', `Mesh ${id} has ${block.length / VERTEX_FLOATS} vertices; got ${vertices.length / VERTEX_FLOATS}.`, 'Rewrite all of its vertices, in the same layout.');
|
|
160
|
+
}
|
|
161
|
+
if (vertices !== block)
|
|
162
|
+
block.set(vertices);
|
|
163
|
+
this.vertexWrites.set(id, { serial: ++this.#writeSerial, skinned: entry.skinned, at: entry.baseVertex, data: block });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Writes `vertices` (`MESH_VERTEX_FLOATS` each) into mesh `id`'s block from its vertex `first`: room
|
|
167
|
+
* it reserved (`vertexCapacity`), for streamed cluster pages (ADR-0134). Not motion: the pool stays
|
|
168
|
+
* static. The stored copy changes too.
|
|
169
|
+
*/
|
|
170
|
+
writeVertices(id, first, vertices) {
|
|
171
|
+
const entry = this.entries[id];
|
|
172
|
+
const block = this.#blocks[id];
|
|
173
|
+
if (!entry || !block)
|
|
174
|
+
throw new YaliError('UNKNOWN_MESH', `Mesh ${id} does not exist.`, 'Pass an id that MeshStore.add returned.');
|
|
175
|
+
if (first < 0 || (first * VERTEX_FLOATS + vertices.length) > block.length) {
|
|
176
|
+
throw new YaliError('BAD_VERTICES', `Mesh ${id} has room for ${block.length / VERTEX_FLOATS} vertices; got ${vertices.length / VERTEX_FLOATS} from ${first}.`, 'Reserve the room with vertexCapacity when adding the mesh.');
|
|
177
|
+
}
|
|
178
|
+
block.set(vertices, first * VERTEX_FLOATS);
|
|
179
|
+
let k = 0;
|
|
180
|
+
while (k < this.rangeWrites.length && this.rangeWrites[k].serial <= this.rangesSeen)
|
|
181
|
+
k++;
|
|
182
|
+
if (k)
|
|
183
|
+
this.rangeWrites.splice(0, k);
|
|
184
|
+
this.rangeWrites.push({ serial: ++this.#writeSerial, at: entry.baseVertex + first, data: block.subarray(first * VERTEX_FLOATS, first * VERTEX_FLOATS + vertices.length) });
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Rewrites mesh `id`'s finest LOD's indices (the same count): a CPU cloth's triangles after a tear
|
|
188
|
+
* split them (ADR-0117). The stored copy changes too (a pool rebuilt after device loss has it, and
|
|
189
|
+
* picking sees it). Its coarser LODs stay as they were.
|
|
190
|
+
*/
|
|
191
|
+
updateIndices(id, indices) {
|
|
192
|
+
const entry = this.entries[id];
|
|
193
|
+
const stored = this.#indices0[id];
|
|
194
|
+
if (!entry || !stored)
|
|
195
|
+
throw new YaliError('UNKNOWN_MESH', `Mesh ${id} does not exist.`, 'Pass an id that MeshStore.add returned.');
|
|
196
|
+
if (indices.length !== stored.length) {
|
|
197
|
+
throw new YaliError('BAD_INDICES', `Mesh ${id} has ${stored.length} indices; got ${indices.length}.`, 'Rewrite all of its finest LOD\'s indices (collapse a triangle to drop it).');
|
|
198
|
+
}
|
|
199
|
+
if (indices !== stored)
|
|
200
|
+
stored.set(indices);
|
|
201
|
+
this.indexWrites.set(id, { serial: ++this.#writeSerial, at: entry.lods[0].firstIndex, data: stored });
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Mesh `id`'s CPU geometry: interleaved vertices (`MESH_VERTEX_FLOATS` each, position first),
|
|
205
|
+
* its finest LOD's indices, its skin stream (null when rigid) and its prebuilt clusters (or null). Null for an unknown id.
|
|
206
|
+
*/
|
|
207
|
+
geometry(id) {
|
|
208
|
+
const vertices = this.#blocks[id];
|
|
209
|
+
return vertices ? { vertices, indices: this.#indices0[id], skin: this.#skins[id], clusters: this.#clusters[id] ?? null, pages: this.#pages[id] ?? null } : null;
|
|
210
|
+
}
|
|
211
|
+
/** The serial of the latest `updateVertices` or `updateIndices` (0: none yet). */
|
|
212
|
+
get writeSerial() {
|
|
213
|
+
return this.#writeSerial;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Adds coarser LODs to mesh `id` (finest first, after the ones it has): for a model
|
|
217
|
+
* whose file carried none, simplified on a decode worker after LOD 0 was already drawn.
|
|
218
|
+
*/
|
|
219
|
+
addLods(id, lods) {
|
|
220
|
+
const entry = this.entries[id];
|
|
221
|
+
if (!entry)
|
|
222
|
+
throw new YaliError('UNKNOWN_MESH', `Mesh ${id} does not exist.`, 'Pass an id that MeshStore.add returned.');
|
|
223
|
+
this.#addLods(entry, lods);
|
|
224
|
+
this.version++;
|
|
225
|
+
}
|
|
226
|
+
#addLods(entry, lods) {
|
|
227
|
+
for (const l of lods) {
|
|
228
|
+
if (entry.lods.length >= MAX_LODS)
|
|
229
|
+
break;
|
|
230
|
+
entry.lods.push(this.#indices(l.indices, l.error));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
#indices(indices, error) {
|
|
234
|
+
const firstIndex = this.#indexCount;
|
|
235
|
+
this.indexBlocks.push({ data: indices, at: firstIndex });
|
|
236
|
+
this.#indexCount += indices.length;
|
|
237
|
+
return { firstIndex, count: indices.length, error };
|
|
238
|
+
}
|
|
239
|
+
get vertexCount() {
|
|
240
|
+
return this.#vertexCount;
|
|
241
|
+
}
|
|
242
|
+
/** Vertices in the skinned pool. */
|
|
243
|
+
get skinnedVertexCount() {
|
|
244
|
+
return this.#skinnedCount;
|
|
245
|
+
}
|
|
246
|
+
get indexCount() {
|
|
247
|
+
return this.#indexCount;
|
|
248
|
+
}
|
|
249
|
+
/** CPU bytes held (vertices + indices). */
|
|
250
|
+
get bytes() {
|
|
251
|
+
return (this.#vertexCount + this.#skinnedCount) * VERTEX_FLOATS * 4 + this.#skinnedCount * SKIN_STREAM_BYTES + this.#indexCount * 4;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/** Most materials in the uniform table (`shaders/scene/draw.wesl` `MAX_MATERIALS`). */
|
|
255
|
+
export const MAX_MATERIALS = 256;
|
|
256
|
+
/** Words per material: base colour (4 f32), texture slots (4 u32), parameters (8 f32). 64 bytes, so 256 fit compatibility mode's 16 KiB uniform binding. */
|
|
257
|
+
export const MATERIAL_WORDS = 16;
|
|
258
|
+
/** Most node-material shaders (the shader id has 6 bits; 0 is the standard material). */
|
|
259
|
+
export const MAX_SHADERS = 63;
|
|
260
|
+
const MAP_KEYS = ['baseColorMap', 'normalMap', 'ormMap', 'emissiveMap'];
|
|
261
|
+
/** The extension table's maps (`material_ext`'s second vec4, ADR-0093). */
|
|
262
|
+
const EXT_MAP_KEYS = ['clearcoatMap', 'clearcoatRoughnessMap', 'transmissionMap', 'sheenColorMap', 'thicknessMap'];
|
|
263
|
+
/** Where each of those maps' slots sits among a material's extension words. */
|
|
264
|
+
const EXT_MAP_AT = [4, 5, 6, 7, 13];
|
|
265
|
+
/**
|
|
266
|
+
* Words per material in the extension table: four parameters, four texture slots, the volume (ior,
|
|
267
|
+
* thickness, attenuation distance and colour), then dispersion, the thickness map's slot and the
|
|
268
|
+
* transmission layer (ADR-0125).
|
|
269
|
+
*/
|
|
270
|
+
export const MATERIAL_EXT_WORDS = 16;
|
|
271
|
+
function packTextureSource(src) {
|
|
272
|
+
if (!src)
|
|
273
|
+
return 0;
|
|
274
|
+
const failed = !(src instanceof TextureRef) && src.state === 'Failed';
|
|
275
|
+
return packTextureSlot(src instanceof TextureRef ? src : src.get(), failed);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* The app's materials (M2 increments 2–4): a material id is its index, stored in
|
|
279
|
+
* `render.Mesh.material`. Material 0 is white, so a `render.Mesh` that sets only `color`
|
|
280
|
+
* draws that colour. Texture slots are packed from the texture store (`sync`), so a texture
|
|
281
|
+
* that streams in mip by mip is sampled from its first resident level. Node materials
|
|
282
|
+
* (`registerShader`) become functions of the draw shader, chosen per material by a switch
|
|
283
|
+
* (ADR-0064): one pipeline and one bind group for every material.
|
|
284
|
+
*/
|
|
285
|
+
export class MaterialStore {
|
|
286
|
+
/** `MATERIAL_WORDS` per material (the uniform table's layout). */
|
|
287
|
+
data = new Float32Array(MAX_MATERIALS * MATERIAL_WORDS);
|
|
288
|
+
#words = new Uint32Array(this.data.buffer);
|
|
289
|
+
/**
|
|
290
|
+
* The standard material's glTF extensions (`material_ext`, ADR-0093), `MATERIAL_EXT_WORDS`
|
|
291
|
+
* per material: clearcoat, clearcoat roughness, transmission, the sheen packed RGBA8
|
|
292
|
+
* (colour, roughness); then four texture slots. All zero: no extension.
|
|
293
|
+
*/
|
|
294
|
+
ext = new Float32Array(MAX_MATERIALS * MATERIAL_EXT_WORDS);
|
|
295
|
+
#extWords = new Uint32Array(this.ext.buffer);
|
|
296
|
+
#extMaps = [];
|
|
297
|
+
#maps = [];
|
|
298
|
+
#shaderOf = [];
|
|
299
|
+
#shaders = [];
|
|
300
|
+
#count = 0;
|
|
301
|
+
#texturesVersion = -1;
|
|
302
|
+
/** Bumped on every change. */
|
|
303
|
+
version = 0;
|
|
304
|
+
/** Bumped when a shader is registered (the draw pipeline is rebuilt). */
|
|
305
|
+
shadersVersion = 0;
|
|
306
|
+
constructor() {
|
|
307
|
+
this.add({ baseColor: [1, 1, 1, 1] });
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Registers a node material's shader; returns its id for `MaterialData.shader`. The same
|
|
311
|
+
* shader (by hash) registered twice returns the first id.
|
|
312
|
+
*/
|
|
313
|
+
registerShader(s) {
|
|
314
|
+
const known = this.#shaders.findIndex((x) => x.hash === s.hash && x.entry === s.entry);
|
|
315
|
+
if (known >= 0)
|
|
316
|
+
return known + 1;
|
|
317
|
+
if (this.#shaders.some((x) => x.entry === s.entry)) {
|
|
318
|
+
throw new YaliError('SHADER_NAME', `Another material shader is already named "${s.name}".`, 'Give each node material a distinct name.');
|
|
319
|
+
}
|
|
320
|
+
if (this.#shaders.length >= MAX_SHADERS) {
|
|
321
|
+
throw new YaliError('TOO_MANY_SHADERS', `The draw shader holds ${MAX_SHADERS} node-material shaders.`, 'Share shaders between materials: parameters (uniforms) make variants without new shaders.');
|
|
322
|
+
}
|
|
323
|
+
this.#shaders.push(s);
|
|
324
|
+
this.shadersVersion++;
|
|
325
|
+
return this.#shaders.length;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* The draw shader's material block (between its `@yali:materials` markers): every
|
|
329
|
+
* registered shader's function and the switch that picks one per material.
|
|
330
|
+
*/
|
|
331
|
+
shaderBlock() {
|
|
332
|
+
if (this.#shaders.length === 0)
|
|
333
|
+
return '';
|
|
334
|
+
const cases = this.#shaders.map((s, i) => ` case ${i + 1}u: { return ${s.entry}(in, m.params); }`);
|
|
335
|
+
return [
|
|
336
|
+
...this.#shaders.map((s) => s.wgsl),
|
|
337
|
+
'fn material_surface(shader: u32, in: SurfaceInput, m: Material) -> Surface {',
|
|
338
|
+
' switch shader {',
|
|
339
|
+
...cases,
|
|
340
|
+
' default: { return standard_surface(in, m); }',
|
|
341
|
+
' }',
|
|
342
|
+
'}',
|
|
343
|
+
].join('\n');
|
|
344
|
+
}
|
|
345
|
+
/** Stores a material; returns its id. */
|
|
346
|
+
add(m) {
|
|
347
|
+
if (this.#count >= MAX_MATERIALS) {
|
|
348
|
+
throw new YaliError('TOO_MANY_MATERIALS', `The material table holds ${MAX_MATERIALS} materials and is full.`, 'Reuse materials with the same parameters.');
|
|
349
|
+
}
|
|
350
|
+
const shader = m.shader ?? 0;
|
|
351
|
+
if (shader < 0 || shader > this.#shaders.length) {
|
|
352
|
+
throw new YaliError('UNKNOWN_SHADER', `Material shader ${shader} is not registered.`, 'Pass the id `materials.registerShader(compiled)` returned.');
|
|
353
|
+
}
|
|
354
|
+
const at = this.#count * MATERIAL_WORDS;
|
|
355
|
+
this.data.set(m.baseColor, at);
|
|
356
|
+
const params = new Float32Array(8);
|
|
357
|
+
if (shader === 0) {
|
|
358
|
+
params[0] = m.metalness ?? 0;
|
|
359
|
+
params[1] = m.roughness ?? 1;
|
|
360
|
+
params[2] = m.normalScale ?? 1;
|
|
361
|
+
params[3] = m.occlusionStrength ?? 1;
|
|
362
|
+
params.set(m.emissive ?? [0, 0, 0], 4);
|
|
363
|
+
params[7] = m.alphaCutoff ?? 0.5;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
const s = this.#shaders[shader - 1];
|
|
367
|
+
for (const name of Object.keys(m.params ?? {})) {
|
|
368
|
+
if (!s.params.some((p) => p.name === name)) {
|
|
369
|
+
throw new YaliError('UNKNOWN_PARAM', `Material shader "${s.name}" has no uniform "${name}".`, `Its uniforms: ${s.params.map((p) => p.name).join(', ') || 'none'}.`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
for (const p of s.params) {
|
|
373
|
+
const v = m.params?.[p.name] ?? p.default;
|
|
374
|
+
const vals = typeof v === 'number' ? [v] : v;
|
|
375
|
+
if (vals.length !== p.lanes)
|
|
376
|
+
throw new YaliError('PARAM_SIZE', `Uniform "${p.name}" takes ${p.lanes} numbers, got ${vals.length}.`, 'Pass a number or an array of its size.');
|
|
377
|
+
params.set(vals, p.offset);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
this.data.set(params, at + 8);
|
|
381
|
+
this.#maps[this.#count] = MAP_KEYS.map((k) => m[k]);
|
|
382
|
+
const x = this.#count * MATERIAL_EXT_WORDS;
|
|
383
|
+
if (shader === 0) {
|
|
384
|
+
this.ext[x] = clamp01(m.clearcoat ?? 0);
|
|
385
|
+
this.ext[x + 1] = clamp01(m.clearcoatRoughness ?? 0);
|
|
386
|
+
this.ext[x + 2] = clamp01(m.transmission ?? 0);
|
|
387
|
+
const sc = m.sheenColor ?? [0, 0, 0];
|
|
388
|
+
this.#extWords[x + 3] = sc.some((v) => v > 0) ? rgba8(sc[0], sc[1], sc[2], m.sheenRoughness ?? 0) : 0;
|
|
389
|
+
this.ext[x + 8] = m.ior ?? 1.5;
|
|
390
|
+
this.ext[x + 9] = Math.max(0, m.thickness ?? 0);
|
|
391
|
+
const ad = m.attenuationDistance ?? Infinity;
|
|
392
|
+
this.ext[x + 10] = Number.isFinite(ad) && ad > 0 ? ad : 0;
|
|
393
|
+
const ac = m.attenuationColor ?? [1, 1, 1];
|
|
394
|
+
this.#extWords[x + 11] = rgba8(ac[0], ac[1], ac[2], 1);
|
|
395
|
+
this.ext[x + 12] = Math.max(0, m.dispersion ?? 0);
|
|
396
|
+
}
|
|
397
|
+
// Any material (node materials too) may draw in the second transparent layer.
|
|
398
|
+
this.#extWords[x + 14] = m.transmissionLayer === 1 ? 1 : 0;
|
|
399
|
+
if (m.transmissionLayer === 1)
|
|
400
|
+
this.layered++;
|
|
401
|
+
this.#extWords[x + 15] = m.blendMotion ? 1 : 0;
|
|
402
|
+
if (m.blendMotion)
|
|
403
|
+
this.blendMotion++;
|
|
404
|
+
this.#extMaps[this.#count] = shader === 0 ? EXT_MAP_KEYS.map((k) => m[k]) : [];
|
|
405
|
+
this.#shaderOf[this.#count] = shader;
|
|
406
|
+
this.#texturesVersion = -1;
|
|
407
|
+
this.version++;
|
|
408
|
+
return this.#count++;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Re-packs the texture slots (and each material's shader bits) when `texturesVersion`
|
|
412
|
+
* (the texture store's `version`) moved or a material was added. Returns true when the
|
|
413
|
+
* table changed.
|
|
414
|
+
*/
|
|
415
|
+
sync(texturesVersion) {
|
|
416
|
+
if (texturesVersion === this.#texturesVersion)
|
|
417
|
+
return false;
|
|
418
|
+
this.#texturesVersion = texturesVersion;
|
|
419
|
+
let changed = false;
|
|
420
|
+
for (let i = 0; i < this.#count; i++) {
|
|
421
|
+
for (let k = 0; k < 4; k++) {
|
|
422
|
+
const src = this.#maps[i][k];
|
|
423
|
+
let slot = 0;
|
|
424
|
+
if (src) {
|
|
425
|
+
const failed = !(src instanceof TextureRef) && src.state === 'Failed';
|
|
426
|
+
slot = packTextureSlot(src instanceof TextureRef ? src : src.get(), failed);
|
|
427
|
+
}
|
|
428
|
+
if (k === 0)
|
|
429
|
+
slot = (slot | (this.#shaderOf[i] << 26)) >>> 0;
|
|
430
|
+
const at = i * MATERIAL_WORDS + 4 + k;
|
|
431
|
+
if (this.#words[at] !== slot) {
|
|
432
|
+
this.#words[at] = slot;
|
|
433
|
+
changed = true;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
for (let k = 0; k < this.#extMaps[i].length; k++) {
|
|
437
|
+
const slot = packTextureSource(this.#extMaps[i][k]);
|
|
438
|
+
const at = i * MATERIAL_EXT_WORDS + EXT_MAP_AT[k];
|
|
439
|
+
if (this.#extWords[at] !== slot) {
|
|
440
|
+
this.#extWords[at] = slot;
|
|
441
|
+
changed = true;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (changed)
|
|
446
|
+
this.version++;
|
|
447
|
+
return changed;
|
|
448
|
+
}
|
|
449
|
+
get count() {
|
|
450
|
+
return this.#count;
|
|
451
|
+
}
|
|
452
|
+
/** Materials in the second transparent layer (ADR-0125): the scene adds its second copy and pass only while there are any. */
|
|
453
|
+
layered = 0;
|
|
454
|
+
/** Materials whose blended surfaces draw motion (ADR-0133): the motion pass draws the blended classes only while there are any. */
|
|
455
|
+
blendMotion = 0;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* The `render.Mesh` component: which mesh an entity draws, with which material, and a colour
|
|
459
|
+
* that tints it, packed RGBA8 (`rgba8`; zero is black). Packed because converting a float
|
|
460
|
+
* colour every frame cost 1.1 ms of the extract at 20k instances on a Galaxy F04 (ADR-0052).
|
|
461
|
+
*/
|
|
462
|
+
export function registerMeshComponent(world) {
|
|
463
|
+
// `skin`: the first palette row + 1 of a skinned mesh (written by `@yali-engine/animation`, 0 = none;
|
|
464
|
+
// ADR-0088), read by the skinned draw classes.
|
|
465
|
+
return world.registerComponent({ name: 'render.Mesh', fields: { mesh: 'u32', material: 'u32', color: 'u32', skin: 'u32' } });
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Packs a linear RGBA colour (components 0–1) for `render.Mesh.color`, red in the lowest byte
|
|
469
|
+
* (what the shader's `unpack4x8unorm` reads).
|
|
470
|
+
*
|
|
471
|
+
* @example
|
|
472
|
+
* world.insert(e, render.Mesh!, { mesh: CUBE_MESH, material: 0, color: rgba8(1, 0.5, 0.2) });
|
|
473
|
+
*/
|
|
474
|
+
export function rgba8(r, g, b, a = 1) {
|
|
475
|
+
const c = (v) => Math.round(Math.min(1, Math.max(0, v)) * 255);
|
|
476
|
+
return (c(r) | (c(g) << 8) | (c(b) << 16) | (c(a) << 24)) >>> 0;
|
|
477
|
+
}
|
|
478
|
+
/** The inverse of `rgba8`: [r, g, b, a], each 0–1. */
|
|
479
|
+
export function unpackRgba8(packed) {
|
|
480
|
+
return [packed & 255, (packed >>> 8) & 255, (packed >>> 16) & 255, packed >>> 24].map((v) => v / 255);
|
|
481
|
+
}
|
|
482
|
+
function clamp01(v) {
|
|
483
|
+
return Math.min(1, Math.max(0, v));
|
|
484
|
+
}
|
|
485
|
+
function interleave(positions, normals, uvs) {
|
|
486
|
+
const n = positions.length / 3;
|
|
487
|
+
const v = new Float32Array(n * VERTEX_FLOATS);
|
|
488
|
+
for (let i = 0; i < n; i++) {
|
|
489
|
+
const o = i * VERTEX_FLOATS;
|
|
490
|
+
v[o] = positions[i * 3];
|
|
491
|
+
v[o + 1] = positions[i * 3 + 1];
|
|
492
|
+
v[o + 2] = positions[i * 3 + 2];
|
|
493
|
+
v[o + 3] = normals[i * 3];
|
|
494
|
+
v[o + 4] = normals[i * 3 + 1];
|
|
495
|
+
v[o + 5] = normals[i * 3 + 2];
|
|
496
|
+
if (uvs) {
|
|
497
|
+
v[o + 6] = uvs[i * 2];
|
|
498
|
+
v[o + 7] = uvs[i * 2 + 1];
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return v;
|
|
502
|
+
}
|
|
503
|
+
/** A bounding sphere: the box's centre, and the farthest vertex from it. */
|
|
504
|
+
function bounds(v) {
|
|
505
|
+
let x0 = Infinity, y0 = Infinity, z0 = Infinity, x1 = -Infinity, y1 = -Infinity, z1 = -Infinity;
|
|
506
|
+
for (let o = 0; o < v.length; o += VERTEX_FLOATS) {
|
|
507
|
+
x0 = Math.min(x0, v[o]);
|
|
508
|
+
x1 = Math.max(x1, v[o]);
|
|
509
|
+
y0 = Math.min(y0, v[o + 1]);
|
|
510
|
+
y1 = Math.max(y1, v[o + 1]);
|
|
511
|
+
z0 = Math.min(z0, v[o + 2]);
|
|
512
|
+
z1 = Math.max(z1, v[o + 2]);
|
|
513
|
+
}
|
|
514
|
+
if (x0 > x1)
|
|
515
|
+
return { center: [0, 0, 0], radius: 0 };
|
|
516
|
+
const c = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2];
|
|
517
|
+
let r2 = 0;
|
|
518
|
+
for (let o = 0; o < v.length; o += VERTEX_FLOATS)
|
|
519
|
+
r2 = Math.max(r2, (v[o] - c[0]) ** 2 + (v[o + 1] - c[1]) ** 2 + (v[o + 2] - c[2]) ** 2);
|
|
520
|
+
return { center: c, radius: Math.sqrt(r2) };
|
|
521
|
+
}
|
|
522
|
+
/** A unit cube: 24 vertices (position, normal, uv), 36 indices, counter-clockwise outside. */
|
|
523
|
+
function cube() {
|
|
524
|
+
const faces = [
|
|
525
|
+
[[1, 0, 0], [0, 1, 0], [0, 0, 1]],
|
|
526
|
+
[[-1, 0, 0], [0, 1, 0], [0, 0, -1]],
|
|
527
|
+
[[0, 1, 0], [0, 0, 1], [1, 0, 0]],
|
|
528
|
+
[[0, -1, 0], [0, 0, -1], [1, 0, 0]],
|
|
529
|
+
[[0, 0, 1], [1, 0, 0], [0, 1, 0]],
|
|
530
|
+
[[0, 0, -1], [-1, 0, 0], [0, 1, 0]],
|
|
531
|
+
];
|
|
532
|
+
const v = [];
|
|
533
|
+
const idx = [];
|
|
534
|
+
faces.forEach(([n, u, w], f) => {
|
|
535
|
+
for (const [a, b] of [[-1, -1], [1, -1], [1, 1], [-1, 1]]) {
|
|
536
|
+
// UVs 0–1 across each face, v down as in glTF.
|
|
537
|
+
v.push(0.5 * (n[0] + a * u[0] + b * w[0]), 0.5 * (n[1] + a * u[1] + b * w[1]), 0.5 * (n[2] + a * u[2] + b * w[2]), ...n, (a + 1) / 2, (1 - b) / 2);
|
|
538
|
+
}
|
|
539
|
+
const o = f * 4;
|
|
540
|
+
// Counter-clockwise seen from outside: (u, w) is right-handed around n.
|
|
541
|
+
idx.push(o, o + 1, o + 2, o, o + 2, o + 3);
|
|
542
|
+
});
|
|
543
|
+
return { vertices: new Float32Array(v), indices: new Uint32Array(idx) };
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=meshes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshes.js","sourceRoot":"","sources":["../src/meshes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type PackedClusters } from './cluster-build.ts';
|
|
2
|
+
/** Words before the mesh's data in a `cluster-lod` request: the vertex float count, the index count, 1 for a hierarchy. */
|
|
3
|
+
export declare const CLUSTER_REQUEST_HEADER = 3;
|
|
4
|
+
/**
|
|
5
|
+
* Packs a mesh for the `cluster-lod` decoder: one buffer (the header, the interleaved vertices, 8
|
|
6
|
+
* floats each, the indices), so it transfers to the worker whole.
|
|
7
|
+
*/
|
|
8
|
+
export declare function clusterRequest(vertices: Float32Array, indices: Uint32Array, lod: boolean): Uint8Array;
|
|
9
|
+
/**
|
|
10
|
+
* The `cluster-lod` decoder, for `serveDecoders`: a `clusterRequest`'s mesh clustered (and, when
|
|
11
|
+
* asked, its hierarchy built), returned in the shaders' layout with offsets from 0.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // decode.worker.ts
|
|
15
|
+
* import { serveDecoders } from '@yali-engine/core/decode-worker';
|
|
16
|
+
* import { decodeClusterLod } from '@yali-engine/render/meshlets-decoder';
|
|
17
|
+
* serveDecoders({ gltf: decodeGltf, 'cluster-lod': decodeClusterLod });
|
|
18
|
+
*/
|
|
19
|
+
export declare function decodeClusterLod(bytes: Uint8Array): Promise<PackedClusters>;
|
|
20
|
+
export { buildClusterPages, type ClusterPageOptions, type ClusterPages, decodeClusterPage, type DecodedPage, PAGE_WORDS, type PageVertexDecoder, type PageVertexEncoder } from './cluster-pages.ts';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// The `cluster-lod` decoder (ADR-0113), `@yali-engine/render/meshlets-decoder`: a mesh's clusters and
|
|
2
|
+
// cluster LOD hierarchy built on a decode worker instead of the main thread. A decode worker
|
|
3
|
+
// registers it beside its others; `meshlets({ lod: true, pool })` sends it each big mesh.
|
|
4
|
+
import { MeshoptClusterizer } from 'meshoptimizer/clusterizer';
|
|
5
|
+
import { MeshoptSimplifier } from 'meshoptimizer/simplifier';
|
|
6
|
+
import { packClusters } from "./cluster-build.js";
|
|
7
|
+
/** Words before the mesh's data in a `cluster-lod` request: the vertex float count, the index count, 1 for a hierarchy. */
|
|
8
|
+
export const CLUSTER_REQUEST_HEADER = 3;
|
|
9
|
+
/**
|
|
10
|
+
* Packs a mesh for the `cluster-lod` decoder: one buffer (the header, the interleaved vertices, 8
|
|
11
|
+
* floats each, the indices), so it transfers to the worker whole.
|
|
12
|
+
*/
|
|
13
|
+
export function clusterRequest(vertices, indices, lod) {
|
|
14
|
+
const words = new Uint32Array(CLUSTER_REQUEST_HEADER + vertices.length + indices.length);
|
|
15
|
+
words[0] = vertices.length;
|
|
16
|
+
words[1] = indices.length;
|
|
17
|
+
words[2] = lod ? 1 : 0;
|
|
18
|
+
new Float32Array(words.buffer, CLUSTER_REQUEST_HEADER * 4, vertices.length).set(vertices);
|
|
19
|
+
words.set(indices, CLUSTER_REQUEST_HEADER + vertices.length);
|
|
20
|
+
return new Uint8Array(words.buffer);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The `cluster-lod` decoder, for `serveDecoders`: a `clusterRequest`'s mesh clustered (and, when
|
|
24
|
+
* asked, its hierarchy built), returned in the shaders' layout with offsets from 0.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // decode.worker.ts
|
|
28
|
+
* import { serveDecoders } from '@yali-engine/core/decode-worker';
|
|
29
|
+
* import { decodeClusterLod } from '@yali-engine/render/meshlets-decoder';
|
|
30
|
+
* serveDecoders({ gltf: decodeGltf, 'cluster-lod': decodeClusterLod });
|
|
31
|
+
*/
|
|
32
|
+
export async function decodeClusterLod(bytes) {
|
|
33
|
+
const head = new Uint32Array(bytes.buffer, bytes.byteOffset, CLUSTER_REQUEST_HEADER);
|
|
34
|
+
const nv = head[0];
|
|
35
|
+
const ni = head[1];
|
|
36
|
+
const lod = head[2] === 1;
|
|
37
|
+
const at = bytes.byteOffset + CLUSTER_REQUEST_HEADER * 4;
|
|
38
|
+
const vertices = new Float32Array(bytes.buffer, at, nv);
|
|
39
|
+
const indices = new Uint32Array(bytes.buffer, at + nv * 4, ni);
|
|
40
|
+
await MeshoptClusterizer.ready;
|
|
41
|
+
if (lod)
|
|
42
|
+
await MeshoptSimplifier.ready;
|
|
43
|
+
return packClusters(vertices, indices, lod);
|
|
44
|
+
}
|
|
45
|
+
// Streaming pages (ADR-0134): built by `yali convert --clusters --stream`, decoded by the streamer.
|
|
46
|
+
export { buildClusterPages, decodeClusterPage, PAGE_WORDS } from "./cluster-pages.js";
|
|
47
|
+
//# sourceMappingURL=meshlets-decoder.js.map
|