@plasius/gpu-demo-viewer 0.1.11 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +13 -0
- package/docs/adrs/adr-0006-composite-study-consumer.md +21 -0
- package/docs/adrs/index.md +1 -0
- package/docs/batch-five-qualification.json +291 -0
- package/docs/catalogue-production-rollout.md +28 -0
- package/docs/composite-model-studies.md +65 -0
- package/model-library/catalogue.json +847 -0
- package/model-library/controller.js +1 -1
- package/model-library/index.html +2 -2
- package/model-library/main.js +19 -11
- package/model-library/rollout.json +36 -36
- package/model-library/scenes.js +54 -0
- package/package.json +4 -4
|
@@ -20,7 +20,7 @@ export function createReviewController({ load, onState }) {
|
|
|
20
20
|
const id = ++generation;
|
|
21
21
|
abort?.abort(); active?.destroy(); active = undefined;
|
|
22
22
|
abort = new AbortController();
|
|
23
|
-
if (!asset.entry) { onState({kind:'missing', asset, message:'Download deferred. This model is not installed.'}); return; }
|
|
23
|
+
if (!asset.entry && !asset.models?.length) { onState({kind:'missing', asset, message:'Download deferred. This model is not installed.'}); return; }
|
|
24
24
|
onState({kind:'loading',asset});
|
|
25
25
|
try {
|
|
26
26
|
const runtime = await load(asset, abort.signal);
|
package/model-library/index.html
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
</script></head>
|
|
17
17
|
<body><header><a href="https://plasius.co.uk/" target="_blank" rel="noopener">PLASIUS</a><span>Renderer workshop · Local review</span></header>
|
|
18
18
|
<main><div class="intro"><p class="eyebrow">From source to scene</p><h1>Model studies</h1><p>Original assets. One renderer. Explore the surfaces, silhouettes and details that will shape our next improvements.</p></div>
|
|
19
|
-
<div class="workspace"><aside><label for="model">Choose a model</label><select id="model" disabled></select><p id="category" class="muted"></p><h2 id="name"></h2><p id="target"></p><p id="note"></p><div id="metrics" class="metrics"></div>
|
|
20
|
-
<details><summary>Source and licence</summary><p id="credits"></p><p><a id="source" target="_blank" rel="noopener">Original model</a> · <a id="licence" target="_blank" rel="noopener"></a></p><p>Original files retained. Framing is normalized for inspection. Powered by Poly Haven for its asset metadata.</p></details>
|
|
19
|
+
<div class="workspace"><aside><label for="model">Choose a model or study</label><select id="model" disabled></select><p id="category" class="muted"></p><h2 id="name"></h2><p id="target"></p><p id="note"></p><div id="metrics" class="metrics"></div>
|
|
20
|
+
<details><summary>Source and licence</summary><p id="credits"></p><p id="source-line"><a id="source" target="_blank" rel="noopener">Original model</a> · <a id="licence" target="_blank" rel="noopener"></a></p><ul id="composite-credits" hidden></ul><p>Original files retained. Framing is normalized for inspection. Powered by Poly Haven for its asset metadata.</p></details>
|
|
21
21
|
<details><summary>Camera help</summary><p id="help">Drag to orbit. Shift-drag or right-drag to truck. Alt-drag to pan. Scroll to move closer; Shift-scroll changes the lens. Touch: one finger orbits; two fingers move and pinch. Keyboard: arrows orbit, Shift-arrows truck, + / − move closer or further, Home resets. Keys 1–5 choose orbit, truck, pan, dolly or zoom. Press ? for a brief reminder.</p></details>
|
|
22
22
|
<details open><summary>Review focus</summary><p id="review"></p><p>This is an inspection pass, not a visual-quality approval. Source animations are retained on disk; this view displays static geometry.</p></details></aside>
|
|
23
23
|
<section class="stage" aria-label="Model inspection">
|
package/model-library/main.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createReviewController, fixtureRequest, reviewEnabled } from './controller.js';
|
|
2
|
+
import { compositeStudies, compositeRequest, renderCompositeCredits } from './scenes.js';
|
|
2
3
|
|
|
3
4
|
export async function mountLibrary({document:doc=globalThis.document,window:win=globalThis.window,
|
|
4
5
|
fetch:request=globalThis.fetch,importRuntime=()=>import('@plasius/gpu-shared/model-inspection')}={}) {
|
|
@@ -10,11 +11,12 @@ export async function mountLibrary({document:doc=globalThis.document,window:win=
|
|
|
10
11
|
const response=await request(new URL('./catalogue.json',win.location.href));
|
|
11
12
|
if (!response.ok) throw new Error('Model catalogue could not be loaded.');
|
|
12
13
|
const {assets}=await response.json();
|
|
13
|
-
|
|
14
|
+
const studies=compositeStudies(assets), selections=[...assets,...studies];
|
|
15
|
+
for(const asset of selections) {
|
|
14
16
|
const option=doc.createElement('option');option.value=asset.key;
|
|
15
|
-
option.textContent=asset.name+(asset.entry?'':' — deferred');el('model').append(option);
|
|
17
|
+
option.textContent=asset.name+(asset.models?' — composite study':asset.entry?'':' — deferred');el('model').append(option);
|
|
16
18
|
}
|
|
17
|
-
const {createModelInspection}=await importRuntime();
|
|
19
|
+
const {createModelInspection,createSceneInspection}=await importRuntime();
|
|
18
20
|
el('samples').value='64';el('bounces').value='6';el('resolution').value='800';el('denoise').checked=true;
|
|
19
21
|
const quality=()=>{
|
|
20
22
|
const [width,fixedHeight]=el('resolution').value.split('x').map(Number);
|
|
@@ -28,9 +30,11 @@ export async function mountLibrary({document:doc=globalThis.document,window:win=
|
|
|
28
30
|
};
|
|
29
31
|
const controller=createReviewController({
|
|
30
32
|
load:async(asset,signal)=>{
|
|
31
|
-
const
|
|
33
|
+
const base=new URL('./',win.location.href);
|
|
34
|
+
const request=asset.models?compositeRequest(asset,base):fixtureRequest(asset,base);
|
|
32
35
|
el('canvas').hidden=false;
|
|
33
|
-
|
|
36
|
+
const inspect=asset.models?createSceneInspection:createModelInspection;
|
|
37
|
+
return inspect({canvas:el('canvas'),...request,signal,enabled:true,
|
|
34
38
|
...quality(),quality:quality(),
|
|
35
39
|
onProgress:p=>{if(!signal.aborted)refinement(p);},
|
|
36
40
|
onHintChange:visible=>{el('hint').hidden=!visible;},
|
|
@@ -42,23 +46,27 @@ export async function mountLibrary({document:doc=globalThis.document,window:win=
|
|
|
42
46
|
if(state.kind==='loading')status.textContent=`Loading ${state.asset.name} and checking its files…`;
|
|
43
47
|
else if(state.kind==='ready') {
|
|
44
48
|
status.textContent=`${state.asset.review_status==='needs-fix'?'Rendered — visual defect recorded':'Ready'} · ${state.asset.name} · ${state.runtime.triangleCount.toLocaleString()} triangles · ${state.runtime.primitiveCount} mesh primitives`;
|
|
45
|
-
el('metrics').textContent=`${state.runtime.triangleCount.toLocaleString()} triangles · ${state.asset.inspection.materials} source materials`;
|
|
49
|
+
el('metrics').textContent=`${state.runtime.triangleCount.toLocaleString()} triangles · ${state.asset.inspection.materials} source materials${state.asset.models?` · ${state.asset.models.length} models + shared ground`:''}`;
|
|
46
50
|
} else {status.textContent=state.message;el('canvas').hidden=true;el('refinement').textContent='Refinement unavailable';}
|
|
47
51
|
},
|
|
48
52
|
});
|
|
49
53
|
const change=()=>{
|
|
50
|
-
const asset=
|
|
54
|
+
const asset=selections.find(a=>a.key===el('model').value);
|
|
51
55
|
el('category').textContent=asset.category;el('name').textContent=asset.name;
|
|
52
56
|
el('target').textContent=asset.renderer_target;el('review').textContent=asset.observed_issue??asset.preparation;
|
|
53
|
-
el('
|
|
54
|
-
el('
|
|
57
|
+
el('source-line').hidden=!!asset.models;el('composite-credits').hidden=!asset.models;
|
|
58
|
+
el('credits').textContent=asset.models?'Sources in this study':asset.authors;
|
|
59
|
+
renderCompositeCredits(doc,el('composite-credits'),asset.models??[]);
|
|
60
|
+
if(!asset.models){el('source').href=asset.source_url;el('licence').href=asset.licence_url;el('licence').textContent=asset.licence;}
|
|
55
61
|
el('metrics').textContent=asset.entry?`${(asset.files.reduce((n,f)=>n+f.bytes,0)/1048576).toFixed(1)} MiB on disk`:'';
|
|
56
62
|
const clips=asset.inspection?.animations??[];
|
|
57
|
-
el('note').textContent=
|
|
63
|
+
el('note').textContent=asset.models?`${asset.models.length} original models share one camera, ground and lighting. Geometry counts include the ground.`:
|
|
64
|
+
clips.length?`Static pose only. ${clips.length} source clips are present: ${clips.join(', ')}. Animation playback needs importer work.`:
|
|
58
65
|
asset.inspection?.extensions.length?`Material features to inspect: ${asset.inspection.extensions.join(', ')}.`:'Source materials under the same inspection lighting.';
|
|
59
66
|
return controller.select(asset);
|
|
60
67
|
};
|
|
61
|
-
|
|
68
|
+
const requested=new URL(win.location.href).searchParams.get('model');
|
|
69
|
+
el('model').value=selections.find(a=>a.key===requested&&(a.entry||a.models))?.key??assets.find(a=>a.entry).key;
|
|
62
70
|
el('model').addEventListener('change',change);
|
|
63
71
|
el('model').disabled=false;
|
|
64
72
|
const qualityChange=async()=>{
|
|
@@ -243,110 +243,110 @@
|
|
|
243
243
|
{
|
|
244
244
|
"key": "SheenWoodLeatherSofa",
|
|
245
245
|
"batch": 4,
|
|
246
|
-
"status": "
|
|
247
|
-
"note": "
|
|
246
|
+
"status": "production",
|
|
247
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
248
248
|
},
|
|
249
249
|
{
|
|
250
250
|
"key": "SpecularSilkPouf",
|
|
251
251
|
"batch": 4,
|
|
252
|
-
"status": "
|
|
253
|
-
"note": "
|
|
252
|
+
"status": "production",
|
|
253
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
254
254
|
},
|
|
255
255
|
{
|
|
256
256
|
"key": "spinning_wheel_01",
|
|
257
257
|
"batch": 4,
|
|
258
|
-
"status": "
|
|
259
|
-
"note": "
|
|
258
|
+
"status": "production",
|
|
259
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
260
260
|
},
|
|
261
261
|
{
|
|
262
262
|
"key": "vintage_cabinet_01",
|
|
263
263
|
"batch": 4,
|
|
264
|
-
"status": "
|
|
265
|
-
"note": "
|
|
264
|
+
"status": "production",
|
|
265
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
266
266
|
},
|
|
267
267
|
{
|
|
268
268
|
"key": "wicker_basket_01",
|
|
269
269
|
"batch": 4,
|
|
270
|
-
"status": "
|
|
271
|
-
"note": "
|
|
270
|
+
"status": "production",
|
|
271
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
272
272
|
},
|
|
273
273
|
{
|
|
274
274
|
"key": "wine_barrel_01",
|
|
275
275
|
"batch": 4,
|
|
276
|
-
"status": "
|
|
277
|
-
"note": "
|
|
276
|
+
"status": "production",
|
|
277
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
"key": "bench_vice_01",
|
|
281
281
|
"batch": 4,
|
|
282
|
-
"status": "
|
|
283
|
-
"note": "
|
|
282
|
+
"status": "production",
|
|
283
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
284
284
|
},
|
|
285
285
|
{
|
|
286
286
|
"key": "brass_blowtorch",
|
|
287
287
|
"batch": 4,
|
|
288
|
-
"status": "
|
|
289
|
-
"note": "
|
|
288
|
+
"status": "production",
|
|
289
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
290
290
|
},
|
|
291
291
|
{
|
|
292
292
|
"key": "Camera_01",
|
|
293
293
|
"batch": 4,
|
|
294
|
-
"status": "
|
|
295
|
-
"note": "
|
|
294
|
+
"status": "production",
|
|
295
|
+
"note": "Verified in the 40-model production release on 2026-10-21; site commit a23291758540e97d13b347c8521daac5be0d3c82. All 263 resources and nine additions passed live checks."
|
|
296
296
|
},
|
|
297
297
|
{
|
|
298
298
|
"key": "can_rusted",
|
|
299
299
|
"batch": 5,
|
|
300
|
-
"status": "
|
|
301
|
-
"note": "
|
|
300
|
+
"status": "qualified",
|
|
301
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
302
302
|
},
|
|
303
303
|
{
|
|
304
304
|
"key": "circuit_board",
|
|
305
305
|
"batch": 5,
|
|
306
|
-
"status": "
|
|
307
|
-
"note": "
|
|
306
|
+
"status": "qualified",
|
|
307
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
308
308
|
},
|
|
309
309
|
{
|
|
310
310
|
"key": "FlightHelmet",
|
|
311
311
|
"batch": 5,
|
|
312
|
-
"status": "
|
|
313
|
-
"note": "
|
|
312
|
+
"status": "qualified",
|
|
313
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
314
314
|
},
|
|
315
315
|
{
|
|
316
316
|
"key": "hand_plane_no4",
|
|
317
317
|
"batch": 5,
|
|
318
|
-
"status": "
|
|
319
|
-
"note": "
|
|
318
|
+
"status": "qualified",
|
|
319
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
320
320
|
},
|
|
321
321
|
{
|
|
322
322
|
"key": "metal_tool_chest",
|
|
323
323
|
"batch": 5,
|
|
324
|
-
"status": "
|
|
325
|
-
"note": "
|
|
324
|
+
"status": "qualified",
|
|
325
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
328
|
"key": "rusted_spade_01",
|
|
329
329
|
"batch": 5,
|
|
330
|
-
"status": "
|
|
331
|
-
"note": "
|
|
330
|
+
"status": "qualified",
|
|
331
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
332
332
|
},
|
|
333
333
|
{
|
|
334
334
|
"key": "vintage_hand_drill",
|
|
335
335
|
"batch": 5,
|
|
336
|
-
"status": "
|
|
337
|
-
"note": "
|
|
336
|
+
"status": "qualified",
|
|
337
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
338
338
|
},
|
|
339
339
|
{
|
|
340
340
|
"key": "WaterBottle",
|
|
341
341
|
"batch": 5,
|
|
342
|
-
"status": "
|
|
343
|
-
"note": "
|
|
342
|
+
"status": "qualified",
|
|
343
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
346
|
"key": "antique_estoc",
|
|
347
347
|
"batch": 5,
|
|
348
|
-
"status": "
|
|
349
|
-
"note": "
|
|
348
|
+
"status": "qualified",
|
|
349
|
+
"note": "Original-source fixed64, camera/refinement, denoising off/on and native UHD1 passed with registry renderer0.2.54/shared1.2.0. Site production verification pending; Flight Helmet quality transitions retain the recorded timing limitation."
|
|
350
350
|
},
|
|
351
351
|
{
|
|
352
352
|
"key": "chess_set",
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { fixtureRequest } from './controller.js';
|
|
2
|
+
|
|
3
|
+
const definitions = [
|
|
4
|
+
{ key: 'study-furnished-interior', name: 'Furnished interior',
|
|
5
|
+
renderer_target: 'Compare woven fabric, silk, leather, wicker and aged wood in one arrangement.',
|
|
6
|
+
preparation: 'Inspect relative scale, fabric response and contact shadows. Sizes are chosen scene units, not verified physical dimensions.',
|
|
7
|
+
placements: [
|
|
8
|
+
['SheenWoodLeatherSofa', [0, 0, -.8], 2.4, 0],
|
|
9
|
+
['vintage_cabinet_01', [-2.15, 0, -.8], 1.7, 0],
|
|
10
|
+
['SpecularSilkPouf', [.55, 0, .85], .7, 0],
|
|
11
|
+
['wicker_basket_01', [1.6, 0, -.3], .6, 0],
|
|
12
|
+
] },
|
|
13
|
+
{ key: 'study-workshop', name: 'Workshop still life',
|
|
14
|
+
renderer_target: 'Compare worked metal, rough timber and worn surfaces under shared light.',
|
|
15
|
+
preparation: 'Inspect object contact and the contrast between brass, painted metal and timber. These are static review arrangements.',
|
|
16
|
+
placements: [
|
|
17
|
+
['spinning_wheel_01', [-1.1, 0, -.65], 1.8, 0],
|
|
18
|
+
['wine_barrel_01', [1.15, 0, -.7], 1.25, 0],
|
|
19
|
+
['wooden_crate_02', [0, 0, .7], 1.2, 0],
|
|
20
|
+
['bench_vice_01', [-1.3, 0, 1.05], .55, .3],
|
|
21
|
+
// Crate lid height from the original accessor bounds and lid translation,
|
|
22
|
+
// uniformly scaled to its chosen 1.2-unit longest dimension.
|
|
23
|
+
['brass_blowtorch', [0, .47735, .7], .55, 0],
|
|
24
|
+
] },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
export function compositeStudies(assets) {
|
|
28
|
+
return definitions.flatMap(({ placements, ...definition }) => {
|
|
29
|
+
const models = placements.map(([key, anchor, size, yaw]) => ({
|
|
30
|
+
asset: assets.find(a => a.key === key), anchor: [...anchor], size, yaw,
|
|
31
|
+
}));
|
|
32
|
+
if (models.some(model => !model.asset?.entry)) return [];
|
|
33
|
+
return [{ ...definition, category: 'Composite study', models,
|
|
34
|
+
inspection: { materials: models.reduce((sum, model) => sum + model.asset.inspection.materials, 0) } }];
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function compositeRequest(study, base) {
|
|
39
|
+
return { models: study.models.map(({ asset, anchor, size, yaw }) => ({
|
|
40
|
+
...fixtureRequest(asset, base), anchor, size, yaw,
|
|
41
|
+
})) };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function renderCompositeCredits(doc, container, models) {
|
|
45
|
+
container.replaceChildren();
|
|
46
|
+
for (const { asset, size } of models) {
|
|
47
|
+
const item = doc.createElement('li'), source = doc.createElement('a'), licence = doc.createElement('a');
|
|
48
|
+
source.textContent = `${asset.name} — ${asset.authors}`; source.href = asset.source_url;
|
|
49
|
+
licence.textContent = asset.licence; licence.href = asset.licence_url;
|
|
50
|
+
for (const link of [source, licence]) { link.target = '_blank'; link.rel = 'noopener'; }
|
|
51
|
+
item.append(source, ' · ', licence, ` · longest dimension ${size} scene units`);
|
|
52
|
+
container.append(item);
|
|
53
|
+
}
|
|
54
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plasius/gpu-demo-viewer",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Root validation viewer for Plasius gpu-* demos.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"lint": "npm run typecheck",
|
|
48
48
|
"pack:check": "node scripts/verify-public-package.cjs",
|
|
49
49
|
"prepublishOnly": "npm run build && npm run pack:check",
|
|
50
|
-
"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
|
+
"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/scenes.js && node --check model-library/acquire.js && node --check model-library/rollout.js",
|
|
51
51
|
"test": "node --test",
|
|
52
52
|
"models:download": "node scripts/acquire-model-library.mjs",
|
|
53
53
|
"models:dev": "vite --config model-library/vite.config.js",
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@plasius/gpu-renderer": "^0.2.54",
|
|
58
|
-
"@plasius/gpu-shared": "^1.
|
|
58
|
+
"@plasius/gpu-shared": "^1.2.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"c8": "^11.0.0",
|
|
62
|
-
"vite": "^8.
|
|
62
|
+
"vite": "^8.3.5"
|
|
63
63
|
}
|
|
64
64
|
}
|