@plasius/gpu-demo-viewer 0.1.5 → 0.1.7
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/CHANGELOG.md +42 -1
- package/NFR.md +4 -0
- package/README.md +30 -0
- package/docs/adrs/adr-0003-reviewed-model-library.md +13 -0
- package/docs/adrs/adr-0004-model-quality-controls.md +13 -0
- package/docs/adrs/index.md +2 -0
- package/docs/amber-fixed-qualification.json +54 -0
- package/docs/catalogue-production-rollout.md +80 -0
- package/docs/model-inspection-uhd.md +11 -0
- package/docs/model-library-review.md +38 -0
- package/docs/model-review-release.md +11 -0
- package/model-library/acquire.js +54 -0
- package/model-library/catalogue.json +965 -0
- package/model-library/controller.js +45 -0
- package/model-library/index.html +35 -0
- package/model-library/main.js +76 -0
- package/model-library/research-catalogue.json +2625 -0
- package/model-library/rollout.js +28 -0
- package/model-library/rollout.json +461 -0
- package/model-library/styles.css +9 -0
- package/model-library/vite.config.js +12 -0
- package/package.json +14 -6
- package/scripts/acquire-model-library.mjs +8 -0
- package/viewer-manifest.js +15 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Delivery metadata only: this does not grant runtime access or mark a render qualified. */
|
|
2
|
+
const statuses = new Set(['researched', 'awaiting-source', 'acquired', 'imported', 'held', 'qualified', 'production', 'excluded']);
|
|
3
|
+
|
|
4
|
+
export function selectBatch(entries, batch) {
|
|
5
|
+
if (!Number.isInteger(batch) || batch < 0 || batch > 7) throw new Error('Invalid catalogue batch.');
|
|
6
|
+
return entries.filter(entry => entry.batch === batch);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function validateRollout(assets, entries) {
|
|
10
|
+
const identities = new Set(assets.map(asset => asset.key));
|
|
11
|
+
if (identities.size !== assets.length || entries.length !== assets.length
|
|
12
|
+
|| new Set(entries.map(entry => entry.key)).size !== identities.size
|
|
13
|
+
|| entries.some(entry => !identities.has(entry.key))) {
|
|
14
|
+
throw new Error('Catalogue identity mismatch.');
|
|
15
|
+
}
|
|
16
|
+
const first = assets.filter(asset => asset.priority === 'First 12');
|
|
17
|
+
const remaining = assets.filter(asset => asset.priority !== 'First 12');
|
|
18
|
+
const expected = new Map([
|
|
19
|
+
...first.map(asset => [asset.key, 0]),
|
|
20
|
+
...remaining.map((asset, index) => [asset.key, 1 + Math.floor(index / 9)]),
|
|
21
|
+
]);
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (!statuses.has(entry.status)) throw new Error('Invalid catalogue status.');
|
|
24
|
+
if (entry.batch !== expected.get(entry.key)) throw new Error('Catalogue batch mismatch.');
|
|
25
|
+
}
|
|
26
|
+
return {total: assets.length, first: first.length, remaining: remaining.length,
|
|
27
|
+
batches: Math.ceil(remaining.length / 9)};
|
|
28
|
+
}
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"updated": "2026-10-18",
|
|
4
|
+
"story": "https://github.com/Plasius-LTD/plasius-ltd-site/issues/2308",
|
|
5
|
+
"flag": "gpu-demo.scene-fidelity.enabled",
|
|
6
|
+
"phase": "original-models",
|
|
7
|
+
"voxelPhase": "after-original-production-qualification",
|
|
8
|
+
"entries": [
|
|
9
|
+
{
|
|
10
|
+
"key": "large_castle_door",
|
|
11
|
+
"batch": 0,
|
|
12
|
+
"status": "production",
|
|
13
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"key": "sf-house",
|
|
17
|
+
"batch": 0,
|
|
18
|
+
"status": "production",
|
|
19
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"key": "fern_02",
|
|
23
|
+
"batch": 0,
|
|
24
|
+
"status": "production",
|
|
25
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"key": "quiver_tree_01",
|
|
29
|
+
"batch": 0,
|
|
30
|
+
"status": "production",
|
|
31
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"key": "rock_moss_set_01",
|
|
35
|
+
"batch": 0,
|
|
36
|
+
"status": "production",
|
|
37
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"key": "garden_gloves_01",
|
|
41
|
+
"batch": 0,
|
|
42
|
+
"status": "production",
|
|
43
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"key": "wooden_crate_02",
|
|
47
|
+
"batch": 0,
|
|
48
|
+
"status": "production",
|
|
49
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"key": "bronze_whale_statue",
|
|
53
|
+
"batch": 0,
|
|
54
|
+
"status": "production",
|
|
55
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"key": "sf-gem",
|
|
59
|
+
"batch": 0,
|
|
60
|
+
"status": "excluded",
|
|
61
|
+
"note": "User explicitly excluded Gem on 2026-10-18 because its source download is unavailable."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"key": "antique_ceramic_vase_01",
|
|
65
|
+
"batch": 0,
|
|
66
|
+
"status": "production",
|
|
67
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"key": "MosquitoInAmber",
|
|
71
|
+
"batch": 0,
|
|
72
|
+
"status": "qualified",
|
|
73
|
+
"note": "Original-material fixed256 and native UHD1 checks passed with renderer correction ad52d112; production deployment verification remains pending."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"key": "Fox",
|
|
77
|
+
"batch": 0,
|
|
78
|
+
"status": "production",
|
|
79
|
+
"note": "Fixed-sampling production release 1b17dba6dca47003e41ad01974b92c887098c3ea; animation/material limits remain documented."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"key": "sf-castle",
|
|
83
|
+
"batch": 1,
|
|
84
|
+
"status": "researched",
|
|
85
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"key": "large_iron_gate",
|
|
89
|
+
"batch": 1,
|
|
90
|
+
"status": "researched",
|
|
91
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"key": "modular_factory_facade",
|
|
95
|
+
"batch": 1,
|
|
96
|
+
"status": "researched",
|
|
97
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"key": "modular_fort_01",
|
|
101
|
+
"batch": 1,
|
|
102
|
+
"status": "researched",
|
|
103
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"key": "modular_urban_apartments_facade",
|
|
107
|
+
"batch": 1,
|
|
108
|
+
"status": "researched",
|
|
109
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"key": "modular_wooden_pier",
|
|
113
|
+
"batch": 1,
|
|
114
|
+
"status": "researched",
|
|
115
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"key": "sf-cottage",
|
|
119
|
+
"batch": 1,
|
|
120
|
+
"status": "researched",
|
|
121
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"key": "dandelion_01",
|
|
125
|
+
"batch": 1,
|
|
126
|
+
"status": "researched",
|
|
127
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"key": "DiffuseTransmissionPlant",
|
|
131
|
+
"batch": 1,
|
|
132
|
+
"status": "researched",
|
|
133
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"key": "fir_tree_01",
|
|
137
|
+
"batch": 2,
|
|
138
|
+
"status": "researched",
|
|
139
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"key": "grass_medium_01",
|
|
143
|
+
"batch": 2,
|
|
144
|
+
"status": "researched",
|
|
145
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"key": "island_tree_01",
|
|
149
|
+
"batch": 2,
|
|
150
|
+
"status": "researched",
|
|
151
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"key": "jacaranda_tree",
|
|
155
|
+
"batch": 2,
|
|
156
|
+
"status": "researched",
|
|
157
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"key": "pine_tree_01",
|
|
161
|
+
"batch": 2,
|
|
162
|
+
"status": "researched",
|
|
163
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"key": "searsia_lucida",
|
|
167
|
+
"batch": 2,
|
|
168
|
+
"status": "researched",
|
|
169
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"key": "boulder_01",
|
|
173
|
+
"batch": 2,
|
|
174
|
+
"status": "researched",
|
|
175
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"key": "coastal_cliff_01",
|
|
179
|
+
"batch": 2,
|
|
180
|
+
"status": "researched",
|
|
181
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"key": "dead_tree_trunk",
|
|
185
|
+
"batch": 2,
|
|
186
|
+
"status": "researched",
|
|
187
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"key": "food_pomegranate_01",
|
|
191
|
+
"batch": 3,
|
|
192
|
+
"status": "researched",
|
|
193
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"key": "lambis_shell",
|
|
197
|
+
"batch": 3,
|
|
198
|
+
"status": "researched",
|
|
199
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"key": "rock_face_01",
|
|
203
|
+
"batch": 3,
|
|
204
|
+
"status": "researched",
|
|
205
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"key": "tree_stump_01",
|
|
209
|
+
"batch": 3,
|
|
210
|
+
"status": "researched",
|
|
211
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"key": "ArmChair_01",
|
|
215
|
+
"batch": 3,
|
|
216
|
+
"status": "researched",
|
|
217
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"key": "fishermans_hat",
|
|
221
|
+
"batch": 3,
|
|
222
|
+
"status": "researched",
|
|
223
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"key": "rubber_boots",
|
|
227
|
+
"batch": 3,
|
|
228
|
+
"status": "researched",
|
|
229
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"key": "SheenChair",
|
|
233
|
+
"batch": 3,
|
|
234
|
+
"status": "researched",
|
|
235
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"key": "SheenCloth",
|
|
239
|
+
"batch": 3,
|
|
240
|
+
"status": "researched",
|
|
241
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"key": "SheenWoodLeatherSofa",
|
|
245
|
+
"batch": 4,
|
|
246
|
+
"status": "researched",
|
|
247
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"key": "SpecularSilkPouf",
|
|
251
|
+
"batch": 4,
|
|
252
|
+
"status": "researched",
|
|
253
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"key": "spinning_wheel_01",
|
|
257
|
+
"batch": 4,
|
|
258
|
+
"status": "researched",
|
|
259
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"key": "vintage_cabinet_01",
|
|
263
|
+
"batch": 4,
|
|
264
|
+
"status": "researched",
|
|
265
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"key": "wicker_basket_01",
|
|
269
|
+
"batch": 4,
|
|
270
|
+
"status": "researched",
|
|
271
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"key": "wine_barrel_01",
|
|
275
|
+
"batch": 4,
|
|
276
|
+
"status": "researched",
|
|
277
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"key": "bench_vice_01",
|
|
281
|
+
"batch": 4,
|
|
282
|
+
"status": "researched",
|
|
283
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"key": "brass_blowtorch",
|
|
287
|
+
"batch": 4,
|
|
288
|
+
"status": "researched",
|
|
289
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"key": "Camera_01",
|
|
293
|
+
"batch": 4,
|
|
294
|
+
"status": "researched",
|
|
295
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"key": "can_rusted",
|
|
299
|
+
"batch": 5,
|
|
300
|
+
"status": "researched",
|
|
301
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"key": "circuit_board",
|
|
305
|
+
"batch": 5,
|
|
306
|
+
"status": "researched",
|
|
307
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"key": "FlightHelmet",
|
|
311
|
+
"batch": 5,
|
|
312
|
+
"status": "researched",
|
|
313
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"key": "hand_plane_no4",
|
|
317
|
+
"batch": 5,
|
|
318
|
+
"status": "researched",
|
|
319
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"key": "metal_tool_chest",
|
|
323
|
+
"batch": 5,
|
|
324
|
+
"status": "researched",
|
|
325
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"key": "rusted_spade_01",
|
|
329
|
+
"batch": 5,
|
|
330
|
+
"status": "researched",
|
|
331
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"key": "vintage_hand_drill",
|
|
335
|
+
"batch": 5,
|
|
336
|
+
"status": "researched",
|
|
337
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"key": "WaterBottle",
|
|
341
|
+
"batch": 5,
|
|
342
|
+
"status": "researched",
|
|
343
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"key": "antique_estoc",
|
|
347
|
+
"batch": 5,
|
|
348
|
+
"status": "researched",
|
|
349
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"key": "chess_set",
|
|
353
|
+
"batch": 6,
|
|
354
|
+
"status": "researched",
|
|
355
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"key": "sf-crystal",
|
|
359
|
+
"batch": 6,
|
|
360
|
+
"status": "researched",
|
|
361
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"key": "gothic_statue",
|
|
365
|
+
"batch": 6,
|
|
366
|
+
"status": "researched",
|
|
367
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"key": "kite_shield",
|
|
371
|
+
"batch": 6,
|
|
372
|
+
"status": "researched",
|
|
373
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"key": "marble_bust_01",
|
|
377
|
+
"batch": 6,
|
|
378
|
+
"status": "researched",
|
|
379
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"key": "ABeautifulGame",
|
|
383
|
+
"batch": 6,
|
|
384
|
+
"status": "researched",
|
|
385
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"key": "AnisotropyBarnLamp",
|
|
389
|
+
"batch": 6,
|
|
390
|
+
"status": "researched",
|
|
391
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"key": "brass_diya_lantern",
|
|
395
|
+
"batch": 6,
|
|
396
|
+
"status": "researched",
|
|
397
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"key": "CommercialRefrigerator",
|
|
401
|
+
"batch": 6,
|
|
402
|
+
"status": "researched",
|
|
403
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
"key": "IridescenceLamp",
|
|
407
|
+
"batch": 7,
|
|
408
|
+
"status": "researched",
|
|
409
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"key": "IridescentDishWithOlives",
|
|
413
|
+
"batch": 7,
|
|
414
|
+
"status": "researched",
|
|
415
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"key": "magnifying_glass_01",
|
|
419
|
+
"batch": 7,
|
|
420
|
+
"status": "researched",
|
|
421
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"key": "StainedGlassLamp",
|
|
425
|
+
"batch": 7,
|
|
426
|
+
"status": "researched",
|
|
427
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"key": "wine_bottles_01",
|
|
431
|
+
"batch": 7,
|
|
432
|
+
"status": "researched",
|
|
433
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
"key": "BarramundiFish",
|
|
437
|
+
"batch": 7,
|
|
438
|
+
"status": "researched",
|
|
439
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"key": "MaterialsVariantsShoe",
|
|
443
|
+
"batch": 7,
|
|
444
|
+
"status": "researched",
|
|
445
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
"key": "ship_pinnace",
|
|
449
|
+
"batch": 7,
|
|
450
|
+
"status": "researched",
|
|
451
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
"key": "ToyCar",
|
|
455
|
+
"batch": 7,
|
|
456
|
+
"status": "researched",
|
|
457
|
+
"note": "Awaiting acquisition and Plasius visual qualification."
|
|
458
|
+
}
|
|
459
|
+
],
|
|
460
|
+
"productionTarget": 74
|
|
461
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
:root{color-scheme:dark;font-family:system-ui,sans-serif;background:#10151c;color:#f2eee5;font-size:16px}*{box-sizing:border-box}body{margin:0}header{display:flex;justify-content:space-between;gap:1rem;padding:1.4rem 4vw;border-bottom:1px solid #39444d}header>a{letter-spacing:.22em;font-family:Georgia,serif;text-decoration:none}header span,.muted,.footnote{color:#b8c4cc}a{color:#dfc88d}main{max-width:1560px;margin:auto;padding:2rem 4vw}h1,h2{font-family:Georgia,serif;font-weight:400}h1{font-size:clamp(2rem,4vw,3rem);margin:.3rem 0}.intro>p:last-child{max-width:720px;color:#c1cbd1;line-height:1.6}.eyebrow{text-transform:uppercase;letter-spacing:.18em;color:#dfc88d;font-size:.75rem}.workspace{display:grid;grid-template-columns:minmax(240px,300px) minmax(0,1fr);gap:2rem;margin-top:2rem}aside{line-height:1.6}label{display:block;margin-bottom:.4rem}select{width:100%;padding:.8rem;background:#222d37;color:#fff;border:1px solid #64747f;border-radius:.35rem;font-size:1rem}h2{font-size:1.8rem;margin:1rem 0}.stage{min-width:0}.canvas-wrap{position:relative;background:#202e3c;border:1px solid #596775;border-radius:.75rem;overflow:hidden}canvas{display:block;width:100%;height:auto;aspect-ratio:4/3;touch-action:none;cursor:grab}canvas:active{cursor:grabbing}canvas:focus-visible{outline:3px solid #edd7a1;outline-offset:-5px}a:focus-visible,summary:focus-visible,select:focus-visible{outline:3px solid #edd7a1;outline-offset:3px}#hint{position:absolute;bottom:1rem;left:1rem;right:1rem;text-align:center;background:#10151cef;color:#f4ecdb;padding:1rem;border:1px solid #9d916d;border-radius:.5rem;pointer-events:none;font-size:.9rem}#status{padding:1rem;background:#1c2630;border-radius:.4rem;line-height:1.5;min-height:4rem;margin-top:1rem}.metrics{color:#dfc88d;margin:1rem 0}details{border-top:1px solid #3a4651;padding:.8rem 0}summary{cursor:pointer;min-height:28px}details p{font-size:.88rem;color:#c7d0d7;overflow-wrap:anywhere}.footnote{font-size:.86rem;line-height:1.5;margin-top:2rem}@media(max-width:780px){header{flex-wrap:wrap}.workspace{display:flex;flex-direction:column}.stage{order:-1}main{padding:1.3rem 5vw}h1{font-size:2.2rem}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}
|
|
2
|
+
|
|
3
|
+
@media(min-width:781px){.intro{display:grid;grid-template-columns:auto 1fr;column-gap:2rem;align-items:end}.intro .eyebrow{grid-column:1/-1;margin:0}.intro>p:last-child{max-width:660px;margin:.3rem 0}.workspace{margin-top:1.4rem}.canvas-wrap{height:clamp(320px,calc(100dvh - 285px),760px)}canvas{width:100%;height:100%;aspect-ratio:auto}}
|
|
4
|
+
|
|
5
|
+
.quality{display:grid;grid-template-columns:1fr 1fr 1.5fr auto;gap:.8rem;align-items:center;margin:0 0 1rem;padding:1rem;border:1px solid #596775;border-radius:.6rem;min-width:0}
|
|
6
|
+
.quality legend{padding:0 .5rem;color:#dfc88d}.quality label{font-size:.9rem}.quality select{min-width:0;padding:.6rem}.quality>div{min-width:0}.quality .toggle{display:flex;align-items:center;gap:.5rem;margin-top:1.2rem;min-height:44px;cursor:pointer}.toggle input{width:1.2rem;height:1.2rem;accent-color:#dfc88d}.quality p{grid-column:1/-1;font-size:.8rem;line-height:1.5;color:#c1cbd1;margin:.3rem 0 0}input:focus-visible{outline:3px solid #edd7a1;outline-offset:3px}.refinement{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:.8rem;font-size:.85rem;color:#dfc88d}.refinement label{margin:0}progress{width:120px;max-width:30%;height:8px;accent-color:#dfc88d}.quality:disabled{opacity:.65}@media(max-width:1100px){.quality{grid-template-columns:1fr 1fr}.quality .toggle{margin-top:1rem}}@media(min-width:781px){.canvas-wrap{height:clamp(300px,calc(100dvh - 505px),760px)}}
|
|
7
|
+
|
|
8
|
+
/* Preserve the traced camera aspect when fixed-size frames fit the viewport. */
|
|
9
|
+
canvas{object-fit:contain}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isAbsolute } from 'node:path';
|
|
2
|
+
const source=process.env.PLASIUS_SHARED_INSPECTION_SOURCE;
|
|
3
|
+
const renderer=process.env.PLASIUS_RENDERER_SOURCE;
|
|
4
|
+
if(renderer && !isAbsolute(renderer))throw new Error('Renderer source override must be an absolute development path.');
|
|
5
|
+
if(source && !isAbsolute(source))throw new Error('Inspection source override must be an absolute development path.');
|
|
6
|
+
export default {
|
|
7
|
+
root: new URL('.', import.meta.url).pathname,
|
|
8
|
+
cacheDir: '../node_modules/.vite-model-library',
|
|
9
|
+
resolve: { alias: {...(source ? { '@plasius/gpu-shared/model-inspection':source } : {}),...(renderer ? {'@plasius/gpu-renderer':renderer} : {})} },
|
|
10
|
+
server: { host: '127.0.0.1', port: 5291, strictPort: true, watch: { usePolling: true },
|
|
11
|
+
fs:{allow:[new URL('..',import.meta.url).pathname,...(source?[source.replace(/\/src\/model-inspection\.js$/,'')]:[]),...(renderer?[renderer.replace(/\/(src|dist)\/index\.js$/,'')]:[])]} },
|
|
12
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plasius/gpu-demo-viewer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Root validation viewer for Plasius gpu-* demos.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
"index.js",
|
|
34
34
|
"main.js",
|
|
35
35
|
"styles.css",
|
|
36
|
-
"viewer-manifest.js"
|
|
36
|
+
"viewer-manifest.js",
|
|
37
|
+
"model-library/"
|
|
37
38
|
],
|
|
38
39
|
"engines": {
|
|
39
40
|
"node": ">=24"
|
|
@@ -45,11 +46,18 @@
|
|
|
45
46
|
"lint": "npm run typecheck",
|
|
46
47
|
"pack:check": "node scripts/verify-public-package.cjs",
|
|
47
48
|
"prepublishOnly": "npm run build && npm run pack:check",
|
|
48
|
-
"typecheck": "node --check index.js && node --check main.js && node --check viewer-manifest.js && node --check showcase/index.js && node --check showcase/main.js && node --check wavefront/main.js",
|
|
49
|
-
"test": "node --test"
|
|
49
|
+
"typecheck": "node --check index.js && node --check main.js && node --check viewer-manifest.js && node --check showcase/index.js && node --check showcase/main.js && node --check wavefront/main.js && node --check model-library/main.js && node --check model-library/controller.js && node --check model-library/acquire.js && node --check model-library/rollout.js",
|
|
50
|
+
"test": "node --test",
|
|
51
|
+
"models:download": "node scripts/acquire-model-library.mjs",
|
|
52
|
+
"models:dev": "vite --config model-library/vite.config.js",
|
|
53
|
+
"test:coverage": "c8 --reporter=lcov --reporter=text node --test"
|
|
50
54
|
},
|
|
51
55
|
"dependencies": {
|
|
52
|
-
"@plasius/gpu-renderer": "^0.2.
|
|
53
|
-
"@plasius/gpu-shared": "^1.1.
|
|
56
|
+
"@plasius/gpu-renderer": "^0.2.50",
|
|
57
|
+
"@plasius/gpu-shared": "^1.1.7"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"c8": "^11.0.0",
|
|
61
|
+
"vite": "^8.1.4"
|
|
54
62
|
}
|
|
55
63
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { acquireFixtures } from '../model-library/acquire.js';
|
|
4
|
+
export async function run(acquire=acquireFixtures) {
|
|
5
|
+
const {assets}=JSON.parse(await readFile(new URL('../model-library/catalogue.json',import.meta.url),'utf8'));
|
|
6
|
+
return acquire({assets,root:fileURLToPath(new URL('../model-library/assets/',import.meta.url))});
|
|
7
|
+
}
|
|
8
|
+
if(process.argv[1]===fileURLToPath(import.meta.url))console.log(await run());
|
package/viewer-manifest.js
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
export const demos = [
|
|
2
|
+
{
|
|
3
|
+
id: "model-library",
|
|
4
|
+
packageName: "@plasius/gpu-demo-viewer",
|
|
5
|
+
type: "browser",
|
|
6
|
+
mode: "Reviewed model inspection",
|
|
7
|
+
runtime: "Shared WebGPU model inspection",
|
|
8
|
+
launchLabel: "Open model studies",
|
|
9
|
+
launchPath: "./model-library/?review=first-twelve",
|
|
10
|
+
sourcePath: "./model-library/main.js",
|
|
11
|
+
docsPath: "./docs/model-library-review.md",
|
|
12
|
+
command: "npm run models:download && npm run models:dev",
|
|
13
|
+
summary: "Inspect eleven acquired models with original materials, source credits and explicit rendering findings.",
|
|
14
|
+
notes: ["Requires the released shared model-inspection entrypoint, or the documented local source override.", "Gem is excluded from this rollout by request. Fox is static; Amber requires renderer 0.2.50 or later for corrected fixed transmission."],
|
|
15
|
+
tags: ["browser", "3d", "experimental"]
|
|
16
|
+
},
|
|
2
17
|
{
|
|
3
18
|
id: "integration-showcase",
|
|
4
19
|
packageName: "@plasius/gpu-demo-viewer",
|