@skenora/scene-plan 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +114 -0
  2. package/dist/check/check-scene-input.d.ts +38 -0
  3. package/dist/check/check-scene-input.d.ts.map +1 -0
  4. package/dist/check/check-scene-input.js +209 -0
  5. package/dist/check/check-scene-input.js.map +1 -0
  6. package/dist/compilation/compile.d.ts +4 -0
  7. package/dist/compilation/compile.d.ts.map +1 -0
  8. package/dist/compilation/compile.js +498 -0
  9. package/dist/compilation/compile.js.map +1 -0
  10. package/dist/description/example-recipes.d.ts +66 -0
  11. package/dist/description/example-recipes.d.ts.map +1 -0
  12. package/dist/description/example-recipes.js +1097 -0
  13. package/dist/description/example-recipes.js.map +1 -0
  14. package/dist/description/examples.d.ts +18 -0
  15. package/dist/description/examples.d.ts.map +1 -0
  16. package/dist/description/examples.js +58 -0
  17. package/dist/description/examples.js.map +1 -0
  18. package/dist/description/information.d.ts +415 -0
  19. package/dist/description/information.d.ts.map +1 -0
  20. package/dist/description/information.js +980 -0
  21. package/dist/description/information.js.map +1 -0
  22. package/dist/description/recipes.d.ts +20 -0
  23. package/dist/description/recipes.d.ts.map +1 -0
  24. package/dist/description/recipes.js +163 -0
  25. package/dist/description/recipes.js.map +1 -0
  26. package/dist/description/scene-fields.d.ts +11 -0
  27. package/dist/description/scene-fields.d.ts.map +1 -0
  28. package/dist/description/scene-fields.js +471 -0
  29. package/dist/description/scene-fields.js.map +1 -0
  30. package/dist/diagnostics/diagnostics.d.ts +79 -0
  31. package/dist/diagnostics/diagnostics.d.ts.map +1 -0
  32. package/dist/diagnostics/diagnostics.js +91 -0
  33. package/dist/diagnostics/diagnostics.js.map +1 -0
  34. package/dist/generated/example-gallery.d.ts +2897 -0
  35. package/dist/generated/example-gallery.d.ts.map +1 -0
  36. package/dist/generated/example-gallery.js +3290 -0
  37. package/dist/generated/example-gallery.js.map +1 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/model/json.d.ts +14 -0
  43. package/dist/model/json.d.ts.map +1 -0
  44. package/dist/model/json.js +60 -0
  45. package/dist/model/json.js.map +1 -0
  46. package/dist/model/types.d.ts +329 -0
  47. package/dist/model/types.d.ts.map +1 -0
  48. package/dist/model/types.js +5 -0
  49. package/dist/model/types.js.map +1 -0
  50. package/dist/normalization/normalize.d.ts +7 -0
  51. package/dist/normalization/normalize.d.ts.map +1 -0
  52. package/dist/normalization/normalize.js +145 -0
  53. package/dist/normalization/normalize.js.map +1 -0
  54. package/dist/parsing/parse.d.ts +5 -0
  55. package/dist/parsing/parse.d.ts.map +1 -0
  56. package/dist/parsing/parse.js +330 -0
  57. package/dist/parsing/parse.js.map +1 -0
  58. package/dist/patch/patch.d.ts +6 -0
  59. package/dist/patch/patch.d.ts.map +1 -0
  60. package/dist/patch/patch.js +319 -0
  61. package/dist/patch/patch.js.map +1 -0
  62. package/dist/validation/validate.d.ts +16 -0
  63. package/dist/validation/validate.d.ts.map +1 -0
  64. package/dist/validation/validate.js +704 -0
  65. package/dist/validation/validate.js.map +1 -0
  66. package/package.json +31 -0
@@ -0,0 +1,2897 @@
1
+ export declare const GENERATED_SKENORA_EXAMPLES: readonly [{
2
+ readonly manifest: {
3
+ readonly schema: "skenora.example-manifest";
4
+ readonly schemaVersion: 1;
5
+ readonly id: "clipping-section";
6
+ readonly title: "Clipping Section";
7
+ readonly description: "A public Recipe expanding to a bounded signed-plane cut, emissive cut edge, and an explicit fitted companion cap.";
8
+ readonly tags: readonly ["cap", "clip", "cutaway", "recipe"];
9
+ readonly mode: "recipe";
10
+ readonly tier: "bounded-effects";
11
+ readonly requiredCapabilities: readonly [{
12
+ readonly id: "skenora.entity.primitive";
13
+ readonly version: "1";
14
+ readonly reason: "Creates the clipped sphere.";
15
+ }, {
16
+ readonly id: "skenora.entity.shape";
17
+ readonly version: "1";
18
+ readonly reason: "Creates the explicit bounded polygon cap and visible outline.";
19
+ }, {
20
+ readonly id: "skenora.material.pbr";
21
+ readonly version: "1";
22
+ readonly reason: "Owns the body and cap surfaces.";
23
+ }, {
24
+ readonly id: "skenora.material.effect.clip";
25
+ readonly version: "1";
26
+ readonly reason: "Evaluates the signed plane and surviving cut-edge emission.";
27
+ }];
28
+ readonly optionalCapabilities: readonly [{
29
+ readonly id: "skenora.scene.post-process";
30
+ readonly version: "1";
31
+ readonly reason: "Glow consumes the explicit edge emission but is not part of clip semantics.";
32
+ }];
33
+ readonly assets: readonly [];
34
+ readonly controls: {
35
+ readonly type: "object";
36
+ readonly description: "Bounded clipping-section recipe options.";
37
+ readonly additionalProperties: false;
38
+ readonly properties: {
39
+ readonly radius: {
40
+ readonly type: "number";
41
+ readonly description: "Sphere radius";
42
+ readonly minimum: 0.1;
43
+ readonly maximum: 1000;
44
+ readonly default: 1;
45
+ readonly unit: "meters";
46
+ readonly update: "rebuild";
47
+ };
48
+ readonly offset: {
49
+ readonly type: "number";
50
+ readonly description: "Clip-plane offset inside the radius";
51
+ readonly minimum: -1000;
52
+ readonly maximum: 1000;
53
+ readonly default: 0;
54
+ readonly unit: "meters";
55
+ readonly update: "parameter";
56
+ };
57
+ readonly side: {
58
+ readonly type: "string";
59
+ readonly description: "Retained half-space";
60
+ readonly enum: readonly ["positive", "negative"];
61
+ readonly default: "positive";
62
+ readonly update: "parameter";
63
+ };
64
+ readonly edgeWidth: {
65
+ readonly type: "number";
66
+ readonly description: "Cut-edge band width";
67
+ readonly minimum: 0;
68
+ readonly maximum: 100;
69
+ readonly default: 0.035;
70
+ readonly unit: "meters";
71
+ readonly update: "parameter";
72
+ };
73
+ readonly edgeIntensity: {
74
+ readonly type: "number";
75
+ readonly description: "Cut-edge emission";
76
+ readonly minimum: 0;
77
+ readonly maximum: 64;
78
+ readonly default: 4;
79
+ readonly update: "parameter";
80
+ };
81
+ readonly cap: {
82
+ readonly type: "boolean";
83
+ readonly description: "Generate the fitted companion plane";
84
+ readonly default: true;
85
+ readonly update: "rebuild";
86
+ };
87
+ };
88
+ };
89
+ readonly evidence: readonly [{
90
+ readonly kind: "parse";
91
+ readonly required: true;
92
+ readonly status: "passed";
93
+ readonly note: "Manifest, Recipe options and expanded Blueprint parse.";
94
+ }, {
95
+ readonly kind: "compile";
96
+ readonly required: true;
97
+ readonly status: "passed";
98
+ readonly note: "Expanded ordinary Blueprint compilation.";
99
+ }, {
100
+ readonly kind: "capability";
101
+ readonly required: true;
102
+ readonly status: "passed";
103
+ readonly note: "Clip allow, deny, unknown, version and normal cases.";
104
+ }, {
105
+ readonly kind: "preparation";
106
+ readonly required: true;
107
+ readonly status: "passed";
108
+ readonly note: "Cutout variant preparation and parameter reuse.";
109
+ }, {
110
+ readonly kind: "runtime";
111
+ readonly required: true;
112
+ readonly status: "passed";
113
+ readonly note: "Offset update, replacement, reset and disposal.";
114
+ }, {
115
+ readonly kind: "pixels";
116
+ readonly required: true;
117
+ readonly status: "passed";
118
+ readonly note: "Kept/discarded regions, cut edge and companion cap.";
119
+ }, {
120
+ readonly kind: "visual";
121
+ readonly required: true;
122
+ readonly status: "passed";
123
+ readonly note: "Human composition and cap-fit review.";
124
+ }, {
125
+ readonly kind: "performance";
126
+ readonly required: true;
127
+ readonly status: "passed";
128
+ readonly note: "Offset changes retain material/program identity.";
129
+ }, {
130
+ readonly kind: "package-consumption";
131
+ readonly required: true;
132
+ readonly status: "passed";
133
+ readonly note: "Recipe and Example through development tarballs.";
134
+ }, {
135
+ readonly kind: "cross-device";
136
+ readonly required: true;
137
+ readonly status: "passed";
138
+ readonly note: "WebGL backend/degradation matrix.";
139
+ }];
140
+ readonly fallback: {
141
+ readonly strategy: "substitute-example";
142
+ readonly description: "Use Shared PBR when clip is unavailable; never present an uncut scene as clip support.";
143
+ readonly exampleId: "shared-pbr";
144
+ };
145
+ readonly files: readonly [{
146
+ readonly path: "README.md";
147
+ readonly role: "readme";
148
+ readonly mediaType: "text/markdown";
149
+ readonly bytes: 488;
150
+ readonly sha256: "d45913b70865f468cae3e9158849f43e953edd25cbc3a333ad5836b5194c2ea3";
151
+ }, {
152
+ readonly path: "blueprint.json";
153
+ readonly role: "blueprint";
154
+ readonly mediaType: "application/json";
155
+ readonly bytes: 8622;
156
+ readonly sha256: "9db8258e7544d22eb044d185bf58bba9f191ef2fb32219f114788f2253f12b49";
157
+ }, {
158
+ readonly path: "recipe.json";
159
+ readonly role: "source";
160
+ readonly mediaType: "application/json";
161
+ readonly bytes: 373;
162
+ readonly sha256: "92115122c1ddeb69687d9d79c9b95896b7a3293047569c200c7c8b4d199896a4";
163
+ }];
164
+ readonly license: {
165
+ readonly spdx: "MIT";
166
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Clipping example.";
167
+ readonly source: "https://vgpu.sh/examples/clipping";
168
+ };
169
+ readonly aggregateSha256: "5ac142e8aa41162242ea1f04455db93bdf5feed17c0c87587c09312ca072f1ab";
170
+ };
171
+ readonly blueprint: {
172
+ readonly schema: "skenora.scene.blueprint";
173
+ readonly version: 1;
174
+ readonly scene: {
175
+ readonly id: "clipping-section";
176
+ readonly name: "Clipping Section";
177
+ };
178
+ readonly entities: readonly [{
179
+ readonly id: "clipping-section-body";
180
+ readonly kind: "primitive";
181
+ readonly primitive: "sphere";
182
+ readonly diameter: 2;
183
+ }, {
184
+ readonly id: "clipping-section-cap";
185
+ readonly kind: "shape";
186
+ readonly shape: "polygon";
187
+ readonly points: readonly [{
188
+ readonly x: 0.995;
189
+ readonly y: 0;
190
+ readonly z: 0;
191
+ }, {
192
+ readonly x: 0.9864876370669413;
193
+ readonly y: 0;
194
+ readonly z: 0.1298735612589513;
195
+ }, {
196
+ readonly x: 0.961096197157623;
197
+ readonly y: 0;
198
+ readonly z: 0.25752494987700814;
199
+ }, {
200
+ readonly x: 0.9192601348487303;
201
+ readonly y: 0;
202
+ readonly z: 0.3807700152032643;
203
+ }, {
204
+ readonly x: 0.8616952767655165;
205
+ readonly y: 0;
206
+ readonly z: 0.49749999999999994;
207
+ }, {
208
+ readonly x: 0.789386573589779;
209
+ readonly y: 0;
210
+ readonly z: 0.6057176218636771;
211
+ }, {
212
+ readonly x: 0.7035712472806148;
213
+ readonly y: 0;
214
+ readonly z: 0.7035712472806147;
215
+ }, {
216
+ readonly x: 0.6057176218636771;
217
+ readonly y: 0;
218
+ readonly z: 0.789386573589779;
219
+ }, {
220
+ readonly x: 0.4975000000000001;
221
+ readonly y: 0;
222
+ readonly z: 0.8616952767655164;
223
+ }, {
224
+ readonly x: 0.38077001520326437;
225
+ readonly y: 0;
226
+ readonly z: 0.9192601348487303;
227
+ }, {
228
+ readonly x: 0.25752494987700814;
229
+ readonly y: 0;
230
+ readonly z: 0.961096197157623;
231
+ }, {
232
+ readonly x: 0.12987356125895144;
233
+ readonly y: 0;
234
+ readonly z: 0.9864876370669413;
235
+ }, {
236
+ readonly x: 6.092617825758082e-17;
237
+ readonly y: 0;
238
+ readonly z: 0.995;
239
+ }, {
240
+ readonly x: -0.1298735612589511;
241
+ readonly y: 0;
242
+ readonly z: 0.9864876370669414;
243
+ }, {
244
+ readonly x: -0.25752494987700825;
245
+ readonly y: 0;
246
+ readonly z: 0.961096197157623;
247
+ }, {
248
+ readonly x: -0.38077001520326426;
249
+ readonly y: 0;
250
+ readonly z: 0.9192601348487303;
251
+ }, {
252
+ readonly x: -0.4974999999999998;
253
+ readonly y: 0;
254
+ readonly z: 0.8616952767655165;
255
+ }, {
256
+ readonly x: -0.6057176218636771;
257
+ readonly y: 0;
258
+ readonly z: 0.789386573589779;
259
+ }, {
260
+ readonly x: -0.7035712472806147;
261
+ readonly y: 0;
262
+ readonly z: 0.7035712472806148;
263
+ }, {
264
+ readonly x: -0.7893865735897789;
265
+ readonly y: 0;
266
+ readonly z: 0.6057176218636773;
267
+ }, {
268
+ readonly x: -0.8616952767655165;
269
+ readonly y: 0;
270
+ readonly z: 0.49749999999999994;
271
+ }, {
272
+ readonly x: -0.9192601348487303;
273
+ readonly y: 0;
274
+ readonly z: 0.3807700152032644;
275
+ }, {
276
+ readonly x: -0.9610961971576228;
277
+ readonly y: 0;
278
+ readonly z: 0.2575249498770084;
279
+ }, {
280
+ readonly x: -0.9864876370669413;
281
+ readonly y: 0;
282
+ readonly z: 0.1298735612589513;
283
+ }, {
284
+ readonly x: -0.995;
285
+ readonly y: 0;
286
+ readonly z: 1.2185235651516163e-16;
287
+ }, {
288
+ readonly x: -0.9864876370669413;
289
+ readonly y: 0;
290
+ readonly z: -0.1298735612589515;
291
+ }, {
292
+ readonly x: -0.9610961971576231;
293
+ readonly y: 0;
294
+ readonly z: -0.25752494987700775;
295
+ }, {
296
+ readonly x: -0.9192601348487304;
297
+ readonly y: 0;
298
+ readonly z: -0.38077001520326414;
299
+ }, {
300
+ readonly x: -0.8616952767655164;
301
+ readonly y: 0;
302
+ readonly z: -0.4975000000000001;
303
+ }, {
304
+ readonly x: -0.7893865735897793;
305
+ readonly y: 0;
306
+ readonly z: -0.6057176218636767;
307
+ }, {
308
+ readonly x: -0.7035712472806149;
309
+ readonly y: 0;
310
+ readonly z: -0.7035712472806147;
311
+ }, {
312
+ readonly x: -0.6057176218636773;
313
+ readonly y: 0;
314
+ readonly z: -0.7893865735897788;
315
+ }, {
316
+ readonly x: -0.49750000000000044;
317
+ readonly y: 0;
318
+ readonly z: -0.8616952767655163;
319
+ }, {
320
+ readonly x: -0.38077001520326487;
321
+ readonly y: 0;
322
+ readonly z: -0.91926013484873;
323
+ }, {
324
+ readonly x: -0.257524949877008;
325
+ readonly y: 0;
326
+ readonly z: -0.961096197157623;
327
+ }, {
328
+ readonly x: -0.12987356125895136;
329
+ readonly y: 0;
330
+ readonly z: -0.9864876370669413;
331
+ }, {
332
+ readonly x: -1.8277853477274246e-16;
333
+ readonly y: 0;
334
+ readonly z: -0.995;
335
+ }, {
336
+ readonly x: 0.129873561258951;
337
+ readonly y: 0;
338
+ readonly z: -0.9864876370669414;
339
+ }, {
340
+ readonly x: 0.2575249498770077;
341
+ readonly y: 0;
342
+ readonly z: -0.9610961971576231;
343
+ }, {
344
+ readonly x: 0.38077001520326453;
345
+ readonly y: 0;
346
+ readonly z: -0.9192601348487301;
347
+ }, {
348
+ readonly x: 0.4975000000000001;
349
+ readonly y: 0;
350
+ readonly z: -0.8616952767655164;
351
+ }, {
352
+ readonly x: 0.605717621863677;
353
+ readonly y: 0;
354
+ readonly z: -0.789386573589779;
355
+ }, {
356
+ readonly x: 0.7035712472806146;
357
+ readonly y: 0;
358
+ readonly z: -0.7035712472806149;
359
+ }, {
360
+ readonly x: 0.7893865735897788;
361
+ readonly y: 0;
362
+ readonly z: -0.6057176218636773;
363
+ }, {
364
+ readonly x: 0.8616952767655162;
365
+ readonly y: 0;
366
+ readonly z: -0.49750000000000044;
367
+ }, {
368
+ readonly x: 0.91926013484873;
369
+ readonly y: 0;
370
+ readonly z: -0.3807700152032649;
371
+ }, {
372
+ readonly x: 0.961096197157623;
373
+ readonly y: 0;
374
+ readonly z: -0.2575249498770081;
375
+ }, {
376
+ readonly x: 0.9864876370669413;
377
+ readonly y: 0;
378
+ readonly z: -0.12987356125895141;
379
+ }];
380
+ readonly closed: true;
381
+ readonly strokeColor: {
382
+ readonly r: 0.05;
383
+ readonly g: 1.35;
384
+ readonly b: 0.75;
385
+ };
386
+ readonly transform: {
387
+ readonly position: {
388
+ readonly x: 0;
389
+ readonly y: 0;
390
+ readonly z: 0.001;
391
+ };
392
+ readonly rotationRadians: {
393
+ readonly x: 1.5707963267948966;
394
+ readonly y: 0;
395
+ readonly z: 0;
396
+ };
397
+ };
398
+ }];
399
+ readonly materials: readonly [{
400
+ readonly id: "clipping-section-surface";
401
+ readonly creation: {
402
+ readonly version: 1;
403
+ readonly family: "pbr";
404
+ };
405
+ readonly baseColor: {
406
+ readonly r: 0.025;
407
+ readonly g: 0.18;
408
+ readonly b: 0.42;
409
+ };
410
+ readonly metallic: 0.15;
411
+ readonly roughness: 0.27;
412
+ readonly effects: {
413
+ readonly version: 2;
414
+ readonly clip: {
415
+ readonly planeNormal: {
416
+ readonly x: 0;
417
+ readonly y: 0;
418
+ readonly z: 1;
419
+ };
420
+ readonly offset: 0;
421
+ readonly side: "positive";
422
+ readonly space: "local";
423
+ readonly edgeWidth: 0.045;
424
+ readonly edgeColor: {
425
+ readonly r: 0.05;
426
+ readonly g: 1.35;
427
+ readonly b: 0.75;
428
+ };
429
+ readonly edgeIntensity: 5;
430
+ };
431
+ };
432
+ readonly animations: readonly [{
433
+ readonly version: 1;
434
+ readonly id: "clip-sweep";
435
+ readonly property: "clipOffset";
436
+ readonly from: 0;
437
+ readonly to: 0.35;
438
+ readonly durationMs: 900;
439
+ readonly easing: "easeInOut";
440
+ readonly loop: "ping-pong";
441
+ readonly autoStart: false;
442
+ }];
443
+ }, {
444
+ readonly id: "clipping-section-cap-surface";
445
+ readonly creation: {
446
+ readonly version: 1;
447
+ readonly family: "pbr";
448
+ };
449
+ readonly baseColor: {
450
+ readonly r: 0.018;
451
+ readonly g: 0.095;
452
+ readonly b: 0.14;
453
+ };
454
+ readonly emissiveColor: {
455
+ readonly r: 0.05;
456
+ readonly g: 1.35;
457
+ readonly b: 0.75;
458
+ };
459
+ readonly emissiveIntensity: 0.45;
460
+ readonly metallic: 0.25;
461
+ readonly roughness: 0.32;
462
+ readonly doubleSided: true;
463
+ }];
464
+ readonly materialBindings: readonly [{
465
+ readonly id: "clipping-section-body-surface";
466
+ readonly materialId: "clipping-section-surface";
467
+ readonly entityId: "clipping-section-body";
468
+ }, {
469
+ readonly id: "clipping-section-cap-binding";
470
+ readonly materialId: "clipping-section-cap-surface";
471
+ readonly entityId: "clipping-section-cap";
472
+ readonly target: {
473
+ readonly nodeId: "clipping-section-cap-fill";
474
+ readonly slot: 0;
475
+ };
476
+ }];
477
+ readonly camera: {
478
+ readonly mode: "orbit";
479
+ readonly position: {
480
+ readonly x: 2.7;
481
+ readonly y: 1.8;
482
+ readonly z: -4.2;
483
+ };
484
+ readonly target: {
485
+ readonly x: 0;
486
+ readonly y: 0;
487
+ readonly z: 0;
488
+ };
489
+ };
490
+ readonly environment: {
491
+ readonly enabled: false;
492
+ readonly background: {
493
+ readonly mode: "color";
494
+ readonly color: "#050c13";
495
+ };
496
+ };
497
+ readonly lights: readonly [{
498
+ readonly id: "clipping-section-fill";
499
+ readonly type: "hemispheric";
500
+ readonly enabled: true;
501
+ readonly intensity: 1.1;
502
+ readonly color: {
503
+ readonly r: 0.75;
504
+ readonly g: 0.88;
505
+ readonly b: 1;
506
+ };
507
+ readonly rotation: {
508
+ readonly x: -1.5707963267948966;
509
+ readonly y: 0;
510
+ readonly z: 0;
511
+ };
512
+ }];
513
+ readonly postProcess: {
514
+ readonly enabled: true;
515
+ readonly antialiasing: "fxaa";
516
+ readonly toneMappingEnabled: true;
517
+ readonly toneMappingType: "aces";
518
+ readonly exposure: 1;
519
+ readonly glow: true;
520
+ readonly depthOfField: false;
521
+ readonly ssao: {
522
+ readonly enabled: false;
523
+ };
524
+ };
525
+ };
526
+ }, {
527
+ readonly manifest: {
528
+ readonly schema: "skenora.example-manifest";
529
+ readonly schemaVersion: 1;
530
+ readonly id: "fft-ocean";
531
+ readonly title: "FFT Ocean";
532
+ readonly description: "A staged WebGPU frequency-space ocean with bit reversal, horizontal and vertical butterfly passes, and GPU-resident presentation.";
533
+ readonly tags: readonly ["compute", "fft", "ocean", "simulation", "webgpu"];
534
+ readonly mode: "renderer-lab";
535
+ readonly tier: "advanced-simulation";
536
+ readonly requiredCapabilities: readonly [{
537
+ readonly id: "skenora.simulation.program";
538
+ readonly version: "1";
539
+ readonly reason: "Owns bounded spectral generation, staged inverse FFT and compute-to-render storage.";
540
+ }];
541
+ readonly optionalCapabilities: readonly [];
542
+ readonly assets: readonly [];
543
+ readonly controls: {
544
+ readonly type: "object";
545
+ readonly description: "Bounded trusted ocean spectrum parameters.";
546
+ readonly additionalProperties: false;
547
+ readonly properties: {
548
+ readonly windSpeed: {
549
+ readonly type: "number";
550
+ readonly description: "Spectrum wind speed";
551
+ readonly minimum: 0.1;
552
+ readonly maximum: 40;
553
+ readonly default: 14;
554
+ readonly update: "parameter";
555
+ };
556
+ readonly amplitude: {
557
+ readonly type: "number";
558
+ readonly description: "Spectrum amplitude";
559
+ readonly minimum: 0.01;
560
+ readonly maximum: 4;
561
+ readonly default: 1.15;
562
+ readonly update: "parameter";
563
+ };
564
+ };
565
+ };
566
+ readonly evidence: readonly [{
567
+ readonly kind: "parse";
568
+ readonly required: true;
569
+ readonly status: "passed";
570
+ readonly note: "Power-of-two grid and trusted kernel fields parse.";
571
+ }, {
572
+ readonly kind: "compile";
573
+ readonly required: true;
574
+ readonly status: "passed";
575
+ readonly note: "Frequency, bit-reversal and butterfly passes are ordered deterministically.";
576
+ }, {
577
+ readonly kind: "capability";
578
+ readonly required: true;
579
+ readonly status: "passed";
580
+ readonly note: "Non-square/non-power-of-two and pass budgets reject.";
581
+ }, {
582
+ readonly kind: "preparation";
583
+ readonly required: true;
584
+ readonly status: "passed";
585
+ readonly note: "Physical WebGPU FFT and presentation pipeline preparation.";
586
+ }, {
587
+ readonly kind: "runtime";
588
+ readonly required: true;
589
+ readonly status: "passed";
590
+ readonly note: "Stable ping-pong, fixed step, reset, resize and disposal.";
591
+ }, {
592
+ readonly kind: "pixels";
593
+ readonly required: true;
594
+ readonly status: "passed";
595
+ readonly note: "IFFT output creates non-background water and foam pixels.";
596
+ }, {
597
+ readonly kind: "visual";
598
+ readonly required: true;
599
+ readonly status: "passed";
600
+ readonly note: "Human review of animated ocean field.";
601
+ }, {
602
+ readonly kind: "performance";
603
+ readonly required: true;
604
+ readonly status: "passed";
605
+ readonly note: "17 bounded passes and two persistent 256 KiB buffers.";
606
+ }, {
607
+ readonly kind: "package-consumption";
608
+ readonly required: true;
609
+ readonly status: "passed";
610
+ readonly note: "Advanced program and optional renderer subpath from tarballs.";
611
+ }, {
612
+ readonly kind: "cross-device";
613
+ readonly required: true;
614
+ readonly status: "passed";
615
+ readonly note: "Physical WebGPU plus explicit unsupported degradation.";
616
+ }];
617
+ readonly fallback: {
618
+ readonly strategy: "substitute-example";
619
+ readonly description: "Use Procedural Earth as a non-equivalent generated-surface demonstration when WebGPU is unavailable.";
620
+ readonly exampleId: "procedural-earth";
621
+ };
622
+ readonly files: readonly [{
623
+ readonly path: "README.md";
624
+ readonly role: "readme";
625
+ readonly mediaType: "text/markdown";
626
+ readonly bytes: 551;
627
+ readonly sha256: "837f499419bc50251553de93b4d30ba41d0f3bda961371539da4e1f288b21713";
628
+ }, {
629
+ readonly path: "simulation.json";
630
+ readonly role: "source";
631
+ readonly mediaType: "application/json";
632
+ readonly bytes: 693;
633
+ readonly sha256: "0384db8572711eb291b4a910f1dec2f6b15dd936159d2113de2086fe2ec92234";
634
+ }];
635
+ readonly license: {
636
+ readonly spdx: "MIT";
637
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU FFT Ocean Surface example.";
638
+ readonly source: "https://vgpu.sh/examples/fft-ocean-surface";
639
+ };
640
+ readonly aggregateSha256: "ed061d59025140483f0b59a515a48a09527a21f6d067e8c10cff60dfbd92a140";
641
+ };
642
+ readonly simulation: {
643
+ readonly schema: "skenora.simulation-program";
644
+ readonly version: 1;
645
+ readonly kernel: "fft-ocean";
646
+ readonly grid: {
647
+ readonly width: 128;
648
+ readonly height: 128;
649
+ };
650
+ readonly fixedStep: {
651
+ readonly milliseconds: 33.3333;
652
+ readonly maxSubsteps: 2;
653
+ };
654
+ readonly dispatch: {
655
+ readonly workgroupSize: 8;
656
+ };
657
+ readonly resources: readonly [{
658
+ readonly id: "ocean-spectrum-a";
659
+ readonly kind: "storage-buffer";
660
+ readonly format: "vec4f";
661
+ readonly elements: "grid";
662
+ readonly pingPong: true;
663
+ }, {
664
+ readonly id: "ocean-spectrum-b";
665
+ readonly kind: "storage-buffer";
666
+ readonly format: "vec4f";
667
+ readonly elements: "grid";
668
+ readonly pingPong: true;
669
+ }];
670
+ readonly parameters: {
671
+ readonly kind: "fft-ocean";
672
+ readonly windSpeed: 14;
673
+ readonly amplitude: 1.15;
674
+ readonly choppiness: 1.35;
675
+ };
676
+ };
677
+ }, {
678
+ readonly manifest: {
679
+ readonly schema: "skenora.example-manifest";
680
+ readonly schemaVersion: 1;
681
+ readonly id: "glass-transmission";
682
+ readonly title: "Glass Transmission";
683
+ readonly description: "A bounded scene capture and Gaussian blur RenderGraph feeding refraction, tint and dispersion on an owned glass surface.";
684
+ readonly tags: readonly ["blur", "glass", "refraction", "render-graph", "transmission"];
685
+ readonly mode: "recipe";
686
+ readonly tier: "render-graph";
687
+ readonly requiredCapabilities: readonly [{
688
+ readonly id: "skenora.entity.primitive";
689
+ readonly version: "1";
690
+ readonly reason: "Creates one glass surface and explicit captured backdrop geometry.";
691
+ }, {
692
+ readonly id: "skenora.material.pbr";
693
+ readonly version: "1";
694
+ readonly reason: "Owns glass and backdrop surfaces.";
695
+ }, {
696
+ readonly id: "skenora.render.graph";
697
+ readonly version: "1";
698
+ readonly reason: "Validates and owns scene capture, blur and transmission passes.";
699
+ }];
700
+ readonly optionalCapabilities: readonly [{
701
+ readonly id: "skenora.scene.post-process";
702
+ readonly version: "1";
703
+ readonly reason: "Glow presents backdrop emission independently of glass graph semantics.";
704
+ }];
705
+ readonly assets: readonly [];
706
+ readonly controls: {
707
+ readonly type: "object";
708
+ readonly description: "Bounded glass transmission Recipe options.";
709
+ readonly additionalProperties: false;
710
+ readonly properties: {
711
+ readonly radius: {
712
+ readonly type: "number";
713
+ readonly description: "Glass sphere radius";
714
+ readonly minimum: 0.1;
715
+ readonly maximum: 1000;
716
+ readonly default: 1;
717
+ readonly update: "rebuild";
718
+ };
719
+ readonly indexOfRefraction: {
720
+ readonly type: "number";
721
+ readonly description: "Index of refraction";
722
+ readonly minimum: 1;
723
+ readonly maximum: 3;
724
+ readonly default: 1.46;
725
+ readonly update: "parameter";
726
+ };
727
+ readonly intensity: {
728
+ readonly type: "number";
729
+ readonly description: "Transmission intensity";
730
+ readonly minimum: 0;
731
+ readonly maximum: 1;
732
+ readonly default: 0.92;
733
+ readonly update: "parameter";
734
+ };
735
+ readonly dispersion: {
736
+ readonly type: "number";
737
+ readonly description: "Chromatic dispersion";
738
+ readonly minimum: 0;
739
+ readonly maximum: 1;
740
+ readonly default: 0.22;
741
+ readonly update: "parameter";
742
+ };
743
+ readonly blurRadius: {
744
+ readonly type: "number";
745
+ readonly description: "Two-pass blur radius";
746
+ readonly minimum: 1;
747
+ readonly maximum: 24;
748
+ readonly default: 7;
749
+ readonly update: "rebuild";
750
+ };
751
+ };
752
+ };
753
+ readonly evidence: readonly [{
754
+ readonly kind: "parse";
755
+ readonly required: true;
756
+ readonly status: "passed";
757
+ readonly note: "Recipe, Blueprint and graph parse.";
758
+ }, {
759
+ readonly kind: "compile";
760
+ readonly required: true;
761
+ readonly status: "passed";
762
+ readonly note: "Stable target/pass IR and topology signature.";
763
+ }, {
764
+ readonly kind: "capability";
765
+ readonly required: true;
766
+ readonly status: "passed";
767
+ readonly note: "Cycle, missing target, alias, format and memory budget cases.";
768
+ }, {
769
+ readonly kind: "preparation";
770
+ readonly required: true;
771
+ readonly status: "passed";
772
+ readonly note: "Capture and both blur shaders prepare before visible activation.";
773
+ }, {
774
+ readonly kind: "runtime";
775
+ readonly required: true;
776
+ readonly status: "passed";
777
+ readonly note: "Resize replacement, last usable target and disposal.";
778
+ }, {
779
+ readonly kind: "pixels";
780
+ readonly required: true;
781
+ readonly status: "passed";
782
+ readonly note: "Captured backdrop is refracted inside the glass silhouette.";
783
+ }, {
784
+ readonly kind: "visual";
785
+ readonly required: true;
786
+ readonly status: "passed";
787
+ readonly note: "Human glass, tint and dispersion composition review.";
788
+ }, {
789
+ readonly kind: "performance";
790
+ readonly required: true;
791
+ readonly status: "passed";
792
+ readonly note: "Bounded half-resolution target and two blur passes.";
793
+ }, {
794
+ readonly kind: "package-consumption";
795
+ readonly required: true;
796
+ readonly status: "passed";
797
+ readonly note: "Graph compiler and Recipe through development tarballs.";
798
+ }, {
799
+ readonly kind: "cross-device";
800
+ readonly required: true;
801
+ readonly status: "passed";
802
+ readonly note: "WebGL target/format support and explicit fallback.";
803
+ }];
804
+ readonly fallback: {
805
+ readonly strategy: "substitute-example";
806
+ readonly description: "Use Shared PBR when RenderGraph is unavailable; do not present alpha alone as transmission.";
807
+ readonly exampleId: "shared-pbr";
808
+ };
809
+ readonly files: readonly [{
810
+ readonly path: "README.md";
811
+ readonly role: "readme";
812
+ readonly mediaType: "text/markdown";
813
+ readonly bytes: 484;
814
+ readonly sha256: "283941b1a6e77a233145ed1f7c7f9e439d5822053ade311172a255e021d4abc9";
815
+ }, {
816
+ readonly path: "blueprint.json";
817
+ readonly role: "blueprint";
818
+ readonly mediaType: "application/json";
819
+ readonly bytes: 6815;
820
+ readonly sha256: "42c30cc3bd44bb5915a7cf7fe7a66f23d4bb32e6b24481e27be647cde1b6ccd7";
821
+ }, {
822
+ readonly path: "recipe.json";
823
+ readonly role: "source";
824
+ readonly mediaType: "application/json";
825
+ readonly bytes: 203;
826
+ readonly sha256: "4d96b1c3be17bff7750efe04df92367271d9dadcbb87ccf0ea6b70061f746520";
827
+ }];
828
+ readonly license: {
829
+ readonly spdx: "MIT";
830
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Transmission example.";
831
+ readonly source: "https://vgpu.sh/examples/transmission";
832
+ };
833
+ readonly aggregateSha256: "1c5f9da6b4924e33e944c24d060b0953aad7e1be284297431501c814254b2cd9";
834
+ };
835
+ readonly blueprint: {
836
+ readonly schema: "skenora.scene.blueprint";
837
+ readonly version: 1;
838
+ readonly scene: {
839
+ readonly id: "glass-transmission";
840
+ readonly name: "Glass Transmission";
841
+ };
842
+ readonly entities: readonly [{
843
+ readonly id: "glass-transmission-glass";
844
+ readonly kind: "primitive";
845
+ readonly primitive: "sphere";
846
+ readonly diameter: 2;
847
+ }, {
848
+ readonly id: "glass-transmission-backdrop-panel";
849
+ readonly kind: "primitive";
850
+ readonly primitive: "plane";
851
+ readonly size: 4.8;
852
+ readonly transform: {
853
+ readonly position: {
854
+ readonly x: 0;
855
+ readonly y: 0;
856
+ readonly z: 2.75;
857
+ };
858
+ };
859
+ }, {
860
+ readonly id: "glass-transmission-backdrop-a";
861
+ readonly kind: "primitive";
862
+ readonly primitive: "torus";
863
+ readonly diameter: 1.7;
864
+ readonly transform: {
865
+ readonly position: {
866
+ readonly x: -0.65;
867
+ readonly y: 0.25;
868
+ readonly z: 1.6;
869
+ };
870
+ readonly rotationRadians: {
871
+ readonly x: 0.3;
872
+ readonly y: 0.6;
873
+ readonly z: 0;
874
+ };
875
+ };
876
+ }, {
877
+ readonly id: "glass-transmission-backdrop-b";
878
+ readonly kind: "primitive";
879
+ readonly primitive: "box";
880
+ readonly size: 0.85;
881
+ readonly transform: {
882
+ readonly position: {
883
+ readonly x: 0.75;
884
+ readonly y: -0.38;
885
+ readonly z: 1.85;
886
+ };
887
+ readonly rotationRadians: {
888
+ readonly x: 0.2;
889
+ readonly y: 0.55;
890
+ readonly z: 0.4;
891
+ };
892
+ };
893
+ }, {
894
+ readonly id: "glass-transmission-backdrop-c";
895
+ readonly kind: "primitive";
896
+ readonly primitive: "cylinder";
897
+ readonly diameter: 0.7;
898
+ readonly height: 1.55;
899
+ readonly transform: {
900
+ readonly position: {
901
+ readonly x: 0.05;
902
+ readonly y: 0.65;
903
+ readonly z: 2.1;
904
+ };
905
+ readonly rotationRadians: {
906
+ readonly x: 0.5;
907
+ readonly y: 0;
908
+ readonly z: 0.7;
909
+ };
910
+ };
911
+ }];
912
+ readonly materials: readonly [{
913
+ readonly id: "glass-transmission-glass-material";
914
+ readonly creation: {
915
+ readonly version: 1;
916
+ readonly family: "pbr";
917
+ };
918
+ readonly baseColor: {
919
+ readonly r: 0.72;
920
+ readonly g: 0.9;
921
+ readonly b: 1;
922
+ };
923
+ readonly metallic: 0;
924
+ readonly roughness: 0.08;
925
+ readonly alpha: 1;
926
+ readonly transparencyMode: 0;
927
+ readonly indexOfRefraction: 1.46;
928
+ readonly doubleSided: true;
929
+ readonly renderGraph: {
930
+ readonly schema: "skenora.render.graph";
931
+ readonly version: 1;
932
+ readonly targets: readonly [{
933
+ readonly id: "scene";
934
+ readonly size: "half";
935
+ readonly format: "rgba8unorm";
936
+ readonly samples: 1;
937
+ readonly depth: true;
938
+ }, {
939
+ readonly id: "blur-x";
940
+ readonly size: "half";
941
+ readonly format: "rgba8unorm";
942
+ readonly samples: 1;
943
+ readonly depth: false;
944
+ }, {
945
+ readonly id: "blur-y";
946
+ readonly size: "half";
947
+ readonly format: "rgba8unorm";
948
+ readonly samples: 1;
949
+ readonly depth: false;
950
+ }];
951
+ readonly passes: readonly [{
952
+ readonly id: "capture";
953
+ readonly type: "scene.capture";
954
+ readonly output: "scene";
955
+ readonly clearColor: "#040712";
956
+ }, {
957
+ readonly id: "blur-horizontal";
958
+ readonly type: "blur.gaussian";
959
+ readonly input: "scene";
960
+ readonly output: "blur-x";
961
+ readonly radius: 7;
962
+ readonly direction: "horizontal";
963
+ }, {
964
+ readonly id: "blur-vertical";
965
+ readonly type: "blur.gaussian";
966
+ readonly input: "blur-x";
967
+ readonly output: "blur-y";
968
+ readonly radius: 7;
969
+ readonly direction: "vertical";
970
+ }, {
971
+ readonly id: "transmission";
972
+ readonly type: "glass.transmission";
973
+ readonly input: "blur-y";
974
+ readonly output: "surface";
975
+ readonly indexOfRefraction: 1.46;
976
+ readonly intensity: 0.92;
977
+ readonly dispersion: 0.22;
978
+ readonly tint: {
979
+ readonly r: 0.72;
980
+ readonly g: 0.9;
981
+ readonly b: 1;
982
+ };
983
+ }];
984
+ };
985
+ }, {
986
+ readonly id: "glass-transmission-backdrop";
987
+ readonly creation: {
988
+ readonly version: 1;
989
+ readonly family: "pbr";
990
+ };
991
+ readonly baseColor: {
992
+ readonly r: 0.015;
993
+ readonly g: 0.055;
994
+ readonly b: 0.16;
995
+ };
996
+ readonly emissiveColor: {
997
+ readonly r: 0.01;
998
+ readonly g: 0.04;
999
+ readonly b: 0.18;
1000
+ };
1001
+ readonly emissiveIntensity: 1.1;
1002
+ readonly metallic: 0.1;
1003
+ readonly roughness: 0.65;
1004
+ }, {
1005
+ readonly id: "glass-transmission-cyan";
1006
+ readonly creation: {
1007
+ readonly version: 1;
1008
+ readonly family: "pbr";
1009
+ };
1010
+ readonly baseColor: {
1011
+ readonly r: 0.01;
1012
+ readonly g: 0.55;
1013
+ readonly b: 0.9;
1014
+ };
1015
+ readonly emissiveColor: {
1016
+ readonly r: 0;
1017
+ readonly g: 0.22;
1018
+ readonly b: 0.8;
1019
+ };
1020
+ readonly emissiveIntensity: 2.2;
1021
+ readonly metallic: 0.35;
1022
+ readonly roughness: 0.22;
1023
+ }, {
1024
+ readonly id: "glass-transmission-magenta";
1025
+ readonly creation: {
1026
+ readonly version: 1;
1027
+ readonly family: "pbr";
1028
+ };
1029
+ readonly baseColor: {
1030
+ readonly r: 0.75;
1031
+ readonly g: 0.015;
1032
+ readonly b: 0.42;
1033
+ };
1034
+ readonly emissiveColor: {
1035
+ readonly r: 0.6;
1036
+ readonly g: 0.005;
1037
+ readonly b: 0.2;
1038
+ };
1039
+ readonly emissiveIntensity: 1.8;
1040
+ readonly metallic: 0.25;
1041
+ readonly roughness: 0.28;
1042
+ }];
1043
+ readonly materialBindings: readonly [{
1044
+ readonly id: "glass-transmission-glass-binding";
1045
+ readonly materialId: "glass-transmission-glass-material";
1046
+ readonly entityId: "glass-transmission-glass";
1047
+ }, {
1048
+ readonly id: "glass-transmission-backdrop-binding";
1049
+ readonly materialId: "glass-transmission-backdrop";
1050
+ readonly entityId: "glass-transmission-backdrop-panel";
1051
+ }, {
1052
+ readonly id: "glass-transmission-a-binding";
1053
+ readonly materialId: "glass-transmission-cyan";
1054
+ readonly entityId: "glass-transmission-backdrop-a";
1055
+ }, {
1056
+ readonly id: "glass-transmission-b-binding";
1057
+ readonly materialId: "glass-transmission-magenta";
1058
+ readonly entityId: "glass-transmission-backdrop-b";
1059
+ }, {
1060
+ readonly id: "glass-transmission-c-binding";
1061
+ readonly materialId: "glass-transmission-cyan";
1062
+ readonly entityId: "glass-transmission-backdrop-c";
1063
+ }];
1064
+ readonly camera: {
1065
+ readonly mode: "orbit";
1066
+ readonly position: {
1067
+ readonly x: 2.55;
1068
+ readonly y: 1.45;
1069
+ readonly z: -5.2;
1070
+ };
1071
+ readonly target: {
1072
+ readonly x: 0;
1073
+ readonly y: 0;
1074
+ readonly z: 0.6;
1075
+ };
1076
+ };
1077
+ readonly environment: {
1078
+ readonly enabled: false;
1079
+ readonly background: {
1080
+ readonly mode: "color";
1081
+ readonly color: "#030611";
1082
+ };
1083
+ };
1084
+ readonly lights: readonly [{
1085
+ readonly id: "glass-transmission-key";
1086
+ readonly type: "directional";
1087
+ readonly enabled: true;
1088
+ readonly intensity: 2.8;
1089
+ readonly color: {
1090
+ readonly r: 0.55;
1091
+ readonly g: 0.75;
1092
+ readonly b: 1;
1093
+ };
1094
+ readonly rotation: {
1095
+ readonly x: -0.6;
1096
+ readonly y: -0.8;
1097
+ readonly z: 0;
1098
+ };
1099
+ }, {
1100
+ readonly id: "glass-transmission-fill";
1101
+ readonly type: "hemispheric";
1102
+ readonly enabled: true;
1103
+ readonly intensity: 0.55;
1104
+ readonly color: {
1105
+ readonly r: 0.42;
1106
+ readonly g: 0.22;
1107
+ readonly b: 0.65;
1108
+ };
1109
+ readonly rotation: {
1110
+ readonly x: -1.5707963267948966;
1111
+ readonly y: 0;
1112
+ readonly z: 0;
1113
+ };
1114
+ }];
1115
+ readonly postProcess: {
1116
+ readonly enabled: true;
1117
+ readonly antialiasing: "fxaa";
1118
+ readonly toneMappingEnabled: true;
1119
+ readonly toneMappingType: "aces";
1120
+ readonly exposure: 1;
1121
+ readonly glow: true;
1122
+ readonly bloom: false;
1123
+ readonly depthOfField: false;
1124
+ readonly ssao: {
1125
+ readonly enabled: false;
1126
+ };
1127
+ };
1128
+ };
1129
+ }, {
1130
+ readonly manifest: {
1131
+ readonly schema: "skenora.example-manifest";
1132
+ readonly schemaVersion: 1;
1133
+ readonly id: "gradient-rim";
1134
+ readonly title: "Gradient Rim";
1135
+ readonly description: "A persistent Blueprint combining bounded local gradient albedo with view-dependent rim emission.";
1136
+ readonly tags: readonly ["blueprint", "gradient", "pbr", "rim"];
1137
+ readonly mode: "blueprint";
1138
+ readonly tier: "foundation";
1139
+ readonly requiredCapabilities: readonly [{
1140
+ readonly id: "skenora.entity.primitive";
1141
+ readonly version: "1";
1142
+ readonly reason: "Creates the sphere.";
1143
+ }, {
1144
+ readonly id: "skenora.material.pbr";
1145
+ readonly version: "1";
1146
+ readonly reason: "Owns the bounded material.";
1147
+ }, {
1148
+ readonly id: "skenora.material.effect.gradient";
1149
+ readonly version: "1";
1150
+ readonly reason: "Mixes the local-space albedo ramp.";
1151
+ }, {
1152
+ readonly id: "skenora.material.effect.rim";
1153
+ readonly version: "1";
1154
+ readonly reason: "Adds view-dependent edge emission.";
1155
+ }];
1156
+ readonly optionalCapabilities: readonly [];
1157
+ readonly assets: readonly [];
1158
+ readonly controls: {
1159
+ readonly type: "object";
1160
+ readonly description: "This baseline has no example-specific controls.";
1161
+ readonly properties: {};
1162
+ readonly additionalProperties: false;
1163
+ };
1164
+ readonly evidence: readonly [{
1165
+ readonly kind: "parse";
1166
+ readonly required: true;
1167
+ readonly status: "passed";
1168
+ readonly note: "Pure manifest and Blueprint parse.";
1169
+ }, {
1170
+ readonly kind: "compile";
1171
+ readonly required: true;
1172
+ readonly status: "passed";
1173
+ readonly note: "Pure Scene Plan compilation.";
1174
+ }, {
1175
+ readonly kind: "capability";
1176
+ readonly required: true;
1177
+ readonly status: "passed";
1178
+ readonly note: "Effect allow, deny and unknown cases.";
1179
+ }, {
1180
+ readonly kind: "preparation";
1181
+ readonly required: true;
1182
+ readonly status: "passed";
1183
+ readonly note: "Runtime surface-program preparation.";
1184
+ }, {
1185
+ readonly kind: "runtime";
1186
+ readonly required: true;
1187
+ readonly status: "passed";
1188
+ readonly note: "Public Renderer load and disposal.";
1189
+ }, {
1190
+ readonly kind: "pixels";
1191
+ readonly required: true;
1192
+ readonly status: "passed";
1193
+ readonly note: "Gradient and rim pixel evidence.";
1194
+ }, {
1195
+ readonly kind: "visual";
1196
+ readonly required: true;
1197
+ readonly status: "passed";
1198
+ readonly note: "Human composition review.";
1199
+ }, {
1200
+ readonly kind: "performance";
1201
+ readonly required: true;
1202
+ readonly status: "passed";
1203
+ readonly note: "Stable program identity evidence.";
1204
+ }, {
1205
+ readonly kind: "package-consumption";
1206
+ readonly required: true;
1207
+ readonly status: "passed";
1208
+ readonly note: "Development tarball consumer.";
1209
+ }, {
1210
+ readonly kind: "cross-device";
1211
+ readonly required: true;
1212
+ readonly status: "passed";
1213
+ readonly note: "Claimed backend matrix.";
1214
+ }];
1215
+ readonly fallback: {
1216
+ readonly strategy: "substitute-example";
1217
+ readonly description: "Use the Shared PBR baseline when bounded effects are unavailable.";
1218
+ readonly exampleId: "shared-pbr";
1219
+ };
1220
+ readonly files: readonly [{
1221
+ readonly path: "README.md";
1222
+ readonly role: "readme";
1223
+ readonly mediaType: "text/markdown";
1224
+ readonly bytes: 332;
1225
+ readonly sha256: "c4ac454c35064cb02ad411eaf8f4829ced6205c6e7a5abd559df3eb09350496b";
1226
+ }, {
1227
+ readonly path: "blueprint.json";
1228
+ readonly role: "blueprint";
1229
+ readonly mediaType: "application/json";
1230
+ readonly bytes: 1625;
1231
+ readonly sha256: "2222950c5fd6c66fe5885b80977fdc1daf156e369c6b01e7251baecb5b941770";
1232
+ }];
1233
+ readonly license: {
1234
+ readonly spdx: "MIT";
1235
+ readonly attribution: "Skenora contributors; gallery presentation informed by the MIT-licensed vGPU examples.";
1236
+ readonly source: "https://vgpu.sh/examples/gradient";
1237
+ };
1238
+ readonly aggregateSha256: "b577972a904e2e98128735023a14bcc64bf738d07da3959af9d319578fae21da";
1239
+ };
1240
+ readonly blueprint: {
1241
+ readonly schema: "skenora.scene.blueprint";
1242
+ readonly version: 1;
1243
+ readonly scene: {
1244
+ readonly id: "gradient-rim";
1245
+ readonly name: "Gradient Rim";
1246
+ };
1247
+ readonly entities: readonly [{
1248
+ readonly id: "sphere";
1249
+ readonly kind: "primitive";
1250
+ readonly primitive: "sphere";
1251
+ readonly transform: {
1252
+ readonly position: {
1253
+ readonly x: 0;
1254
+ readonly y: 0.65;
1255
+ readonly z: 0;
1256
+ };
1257
+ };
1258
+ }];
1259
+ readonly materials: readonly [{
1260
+ readonly id: "surface";
1261
+ readonly creation: {
1262
+ readonly version: 1;
1263
+ readonly family: "pbr";
1264
+ };
1265
+ readonly roughness: 0.3;
1266
+ readonly effects: {
1267
+ readonly version: 1;
1268
+ readonly gradient: {
1269
+ readonly axis: "y";
1270
+ readonly space: "local";
1271
+ readonly start: -0.5;
1272
+ readonly end: 0.5;
1273
+ readonly colorStart: {
1274
+ readonly r: 0.03;
1275
+ readonly g: 0.08;
1276
+ readonly b: 0.55;
1277
+ };
1278
+ readonly colorEnd: {
1279
+ readonly r: 0.75;
1280
+ readonly g: 0.08;
1281
+ readonly b: 0.25;
1282
+ };
1283
+ readonly strength: 0.95;
1284
+ };
1285
+ readonly rim: {
1286
+ readonly color: {
1287
+ readonly r: 0.08;
1288
+ readonly g: 0.45;
1289
+ readonly b: 1.2;
1290
+ };
1291
+ readonly intensity: 1.8;
1292
+ readonly power: 3;
1293
+ };
1294
+ };
1295
+ }];
1296
+ readonly materialBindings: readonly [{
1297
+ readonly id: "sphere-surface";
1298
+ readonly materialId: "surface";
1299
+ readonly entityId: "sphere";
1300
+ }];
1301
+ readonly camera: {
1302
+ readonly mode: "orbit";
1303
+ readonly position: {
1304
+ readonly x: 2.8;
1305
+ readonly y: 1.9;
1306
+ readonly z: -4.2;
1307
+ };
1308
+ readonly target: {
1309
+ readonly x: 0;
1310
+ readonly y: 0.55;
1311
+ readonly z: 0;
1312
+ };
1313
+ };
1314
+ readonly environment: {
1315
+ readonly enabled: false;
1316
+ readonly background: {
1317
+ readonly mode: "color";
1318
+ readonly color: "#050914";
1319
+ };
1320
+ };
1321
+ readonly lights: readonly [{
1322
+ readonly id: "fill";
1323
+ readonly type: "hemispheric";
1324
+ readonly enabled: true;
1325
+ readonly intensity: 0.75;
1326
+ readonly color: {
1327
+ readonly r: 0.8;
1328
+ readonly g: 0.9;
1329
+ readonly b: 1;
1330
+ };
1331
+ readonly rotation: {
1332
+ readonly x: -1.5707963267948966;
1333
+ readonly y: 0;
1334
+ readonly z: 0;
1335
+ };
1336
+ }];
1337
+ readonly postProcess: {
1338
+ readonly enabled: true;
1339
+ readonly antialiasing: "fxaa";
1340
+ readonly toneMappingEnabled: true;
1341
+ readonly toneMappingType: "aces";
1342
+ readonly exposure: 1;
1343
+ };
1344
+ };
1345
+ }, {
1346
+ readonly manifest: {
1347
+ readonly schema: "skenora.example-manifest";
1348
+ readonly schemaVersion: 1;
1349
+ readonly id: "interactive-fluid";
1350
+ readonly title: "Interactive Fluid";
1351
+ readonly description: "Fixed-step WebGPU fluid advection and pressure projection over stable GPU-resident ping-pong storage.";
1352
+ readonly tags: readonly ["compute", "fluid", "ping-pong", "simulation", "webgpu"];
1353
+ readonly mode: "renderer-lab";
1354
+ readonly tier: "compute";
1355
+ readonly requiredCapabilities: readonly [{
1356
+ readonly id: "skenora.simulation.program";
1357
+ readonly version: "1";
1358
+ readonly reason: "Validates fixed-step scheduling, storage budgets and trusted fluid passes.";
1359
+ }];
1360
+ readonly optionalCapabilities: readonly [];
1361
+ readonly assets: readonly [];
1362
+ readonly controls: {
1363
+ readonly type: "object";
1364
+ readonly description: "Pointer injection is translated to bounded simulation parameters.";
1365
+ readonly additionalProperties: false;
1366
+ readonly properties: {
1367
+ readonly injectionStrength: {
1368
+ readonly type: "number";
1369
+ readonly description: "Pointer density and velocity injection strength";
1370
+ readonly minimum: 0;
1371
+ readonly maximum: 20;
1372
+ readonly default: 7.5;
1373
+ readonly update: "parameter";
1374
+ };
1375
+ readonly pressureIterations: {
1376
+ readonly type: "number";
1377
+ readonly description: "Bounded pressure projection iteration count";
1378
+ readonly minimum: 2;
1379
+ readonly maximum: 24;
1380
+ readonly default: 12;
1381
+ readonly update: "rebuild";
1382
+ };
1383
+ };
1384
+ };
1385
+ readonly evidence: readonly [{
1386
+ readonly kind: "parse";
1387
+ readonly required: true;
1388
+ readonly status: "passed";
1389
+ readonly note: "SimulationProgram rejects unknown fields and raw shader source.";
1390
+ }, {
1391
+ readonly kind: "compile";
1392
+ readonly required: true;
1393
+ readonly status: "passed";
1394
+ readonly note: "Stable inject, advect and pressure pass IR.";
1395
+ }, {
1396
+ readonly kind: "capability";
1397
+ readonly required: true;
1398
+ readonly status: "passed";
1399
+ readonly note: "Grid, byte, dispatch, step and iteration budgets.";
1400
+ }, {
1401
+ readonly kind: "preparation";
1402
+ readonly required: true;
1403
+ readonly status: "passed";
1404
+ readonly note: "Physical WebGPU shader compilation and pipelines.";
1405
+ }, {
1406
+ readonly kind: "runtime";
1407
+ readonly required: true;
1408
+ readonly status: "passed";
1409
+ readonly note: "Fixed-step, pointer, reset, resize, pause and disposal.";
1410
+ }, {
1411
+ readonly kind: "pixels";
1412
+ readonly required: true;
1413
+ readonly status: "passed";
1414
+ readonly note: "GPU-resident density produces non-background pixels.";
1415
+ }, {
1416
+ readonly kind: "visual";
1417
+ readonly required: true;
1418
+ readonly status: "passed";
1419
+ readonly note: "Human review of continuous cyan/magenta flow.";
1420
+ }, {
1421
+ readonly kind: "performance";
1422
+ readonly required: true;
1423
+ readonly status: "passed";
1424
+ readonly note: "Stable resources and zero steady-state readback.";
1425
+ }, {
1426
+ readonly kind: "package-consumption";
1427
+ readonly required: true;
1428
+ readonly status: "passed";
1429
+ readonly note: "Optional simulation subpath consumed from development tarball.";
1430
+ }, {
1431
+ readonly kind: "cross-device";
1432
+ readonly required: true;
1433
+ readonly status: "passed";
1434
+ readonly note: "WebGPU support and explicit unsupported outcome.";
1435
+ }];
1436
+ readonly fallback: {
1437
+ readonly strategy: "substitute-example";
1438
+ readonly description: "Use Gradient Rim on browsers without WebGPU; no WebGL compute equivalence is claimed.";
1439
+ readonly exampleId: "gradient-rim";
1440
+ };
1441
+ readonly files: readonly [{
1442
+ readonly path: "README.md";
1443
+ readonly role: "readme";
1444
+ readonly mediaType: "text/markdown";
1445
+ readonly bytes: 610;
1446
+ readonly sha256: "a00c50e5982bea6f480ac59889f3919334ea482a251dd5f1fe1899a00118809f";
1447
+ }, {
1448
+ readonly path: "simulation.json";
1449
+ readonly role: "source";
1450
+ readonly mediaType: "application/json";
1451
+ readonly bytes: 726;
1452
+ readonly sha256: "9ae643192d7f739330770c937b3a90a8a3b40c31b5870d5d829bdea34bb3362b";
1453
+ }];
1454
+ readonly license: {
1455
+ readonly spdx: "MIT";
1456
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Interactive Fluid example.";
1457
+ readonly source: "https://vgpu.sh/examples/fluid";
1458
+ };
1459
+ readonly aggregateSha256: "2abaaf374e5adcc5b1d82320a9ea10a7ab2bdbcc886937bbc8c3530247fee4c2";
1460
+ };
1461
+ readonly simulation: {
1462
+ readonly schema: "skenora.simulation-program";
1463
+ readonly version: 1;
1464
+ readonly kernel: "fluid-2d";
1465
+ readonly grid: {
1466
+ readonly width: 128;
1467
+ readonly height: 128;
1468
+ };
1469
+ readonly fixedStep: {
1470
+ readonly milliseconds: 16.6667;
1471
+ readonly maxSubsteps: 4;
1472
+ };
1473
+ readonly dispatch: {
1474
+ readonly workgroupSize: 8;
1475
+ };
1476
+ readonly resources: readonly [{
1477
+ readonly id: "fluid-state-a";
1478
+ readonly kind: "storage-buffer";
1479
+ readonly format: "vec4f";
1480
+ readonly elements: "grid";
1481
+ readonly pingPong: true;
1482
+ }, {
1483
+ readonly id: "fluid-state-b";
1484
+ readonly kind: "storage-buffer";
1485
+ readonly format: "vec4f";
1486
+ readonly elements: "grid";
1487
+ readonly pingPong: true;
1488
+ }];
1489
+ readonly parameters: {
1490
+ readonly kind: "fluid-2d";
1491
+ readonly pressureIterations: 12;
1492
+ readonly viscosity: 0.08;
1493
+ readonly dissipation: 0.994;
1494
+ readonly injectionStrength: 7.5;
1495
+ };
1496
+ };
1497
+ }, {
1498
+ readonly manifest: {
1499
+ readonly schema: "skenora.example-manifest";
1500
+ readonly schemaVersion: 1;
1501
+ readonly id: "lava-surface";
1502
+ readonly title: "Lava Surface";
1503
+ readonly description: "A bounded MaterialProgram V2 surface driving color, HDR emission, roughness and metallic from trusted 3D noise.";
1504
+ readonly tags: readonly ["lava", "material-program-v2", "noise", "recipe", "wgsl-reflection"];
1505
+ readonly mode: "recipe";
1506
+ readonly tier: "materials";
1507
+ readonly requiredCapabilities: readonly [{
1508
+ readonly id: "skenora.entity.primitive";
1509
+ readonly version: "1";
1510
+ readonly reason: "Creates the lava sphere.";
1511
+ }, {
1512
+ readonly id: "skenora.material.pbr";
1513
+ readonly version: "1";
1514
+ readonly reason: "Owns the visible PBR surface.";
1515
+ }, {
1516
+ readonly id: "skenora.material.program.v2";
1517
+ readonly version: "1";
1518
+ readonly reason: "Compiles bounded noise and scalar PBR output channels.";
1519
+ }];
1520
+ readonly optionalCapabilities: readonly [{
1521
+ readonly id: "skenora.scene.post-process";
1522
+ readonly version: "1";
1523
+ readonly reason: "Glow presents explicit HDR emission.";
1524
+ }];
1525
+ readonly assets: readonly [];
1526
+ readonly controls: {
1527
+ readonly type: "object";
1528
+ readonly description: "Bounded lava recipe options.";
1529
+ readonly additionalProperties: false;
1530
+ readonly properties: {
1531
+ readonly radius: {
1532
+ readonly type: "number";
1533
+ readonly description: "Sphere radius";
1534
+ readonly minimum: 0.1;
1535
+ readonly maximum: 1000;
1536
+ readonly default: 1;
1537
+ readonly update: "rebuild";
1538
+ };
1539
+ readonly scale: {
1540
+ readonly type: "number";
1541
+ readonly description: "Noise frequency";
1542
+ readonly minimum: 0.1;
1543
+ readonly maximum: 64;
1544
+ readonly default: 4.8;
1545
+ readonly update: "parameter";
1546
+ };
1547
+ readonly emission: {
1548
+ readonly type: "number";
1549
+ readonly description: "HDR fissure emission";
1550
+ readonly minimum: 0;
1551
+ readonly maximum: 32;
1552
+ readonly default: 5.5;
1553
+ readonly update: "parameter";
1554
+ };
1555
+ readonly seed: {
1556
+ readonly type: "integer";
1557
+ readonly description: "Trusted noise seed";
1558
+ readonly minimum: -1000000000;
1559
+ readonly maximum: 1000000000;
1560
+ readonly default: 1337;
1561
+ readonly update: "rebuild";
1562
+ };
1563
+ };
1564
+ };
1565
+ readonly evidence: readonly [{
1566
+ readonly kind: "parse";
1567
+ readonly required: true;
1568
+ readonly status: "passed";
1569
+ readonly note: "V2 program, Recipe and Blueprint parsing.";
1570
+ }, {
1571
+ readonly kind: "compile";
1572
+ readonly required: true;
1573
+ readonly status: "passed";
1574
+ readonly note: "Trusted GLSL artifact and inspectable WGSL reflection.";
1575
+ }, {
1576
+ readonly kind: "capability";
1577
+ readonly required: true;
1578
+ readonly status: "passed";
1579
+ readonly note: "V1 rejection, V2 output typing, cycle and octave budgets.";
1580
+ }, {
1581
+ readonly kind: "preparation";
1582
+ readonly required: true;
1583
+ readonly status: "passed";
1584
+ readonly note: "All visible target variants prepare before activation.";
1585
+ }, {
1586
+ readonly kind: "runtime";
1587
+ readonly required: true;
1588
+ readonly status: "passed";
1589
+ readonly note: "Uniform reuse, structural replacement and disposal.";
1590
+ }, {
1591
+ readonly kind: "pixels";
1592
+ readonly required: true;
1593
+ readonly status: "passed";
1594
+ readonly note: "Dark crust and HDR fissure framebuffer regions.";
1595
+ }, {
1596
+ readonly kind: "visual";
1597
+ readonly required: true;
1598
+ readonly status: "passed";
1599
+ readonly note: "Human surface composition review.";
1600
+ }, {
1601
+ readonly kind: "performance";
1602
+ readonly required: true;
1603
+ readonly status: "passed";
1604
+ readonly note: "Parameter values retain prepared shader identity.";
1605
+ }, {
1606
+ readonly kind: "package-consumption";
1607
+ readonly required: true;
1608
+ readonly status: "passed";
1609
+ readonly note: "V2 compiler, Recipe and Example through development tarballs.";
1610
+ }, {
1611
+ readonly kind: "cross-device";
1612
+ readonly required: true;
1613
+ readonly status: "passed";
1614
+ readonly note: "WebGL runtime and generated WGSL reflection matrix.";
1615
+ }];
1616
+ readonly fallback: {
1617
+ readonly strategy: "substitute-example";
1618
+ readonly description: "Use Gradient Rim when MaterialProgram V2 is unavailable; never downgrade V2 channels silently.";
1619
+ readonly exampleId: "gradient-rim";
1620
+ };
1621
+ readonly files: readonly [{
1622
+ readonly path: "README.md";
1623
+ readonly role: "readme";
1624
+ readonly mediaType: "text/markdown";
1625
+ readonly bytes: 454;
1626
+ readonly sha256: "5609a6ac30cfbb95e0e651278bdff4e8cd06412bb81a6101d36eea9f0751deb7";
1627
+ }, {
1628
+ readonly path: "blueprint.json";
1629
+ readonly role: "blueprint";
1630
+ readonly mediaType: "application/json";
1631
+ readonly bytes: 5878;
1632
+ readonly sha256: "bf7e62aa155ea607a696a1dbbca14960f833da87e5b72954cbe4251ef7b9d503";
1633
+ }, {
1634
+ readonly path: "recipe.json";
1635
+ readonly role: "source";
1636
+ readonly mediaType: "application/json";
1637
+ readonly bytes: 149;
1638
+ readonly sha256: "db197fd793b11556ff104153ac0a3f9ba9790e688ededa1f1da006cac2299bef";
1639
+ }];
1640
+ readonly license: {
1641
+ readonly spdx: "MIT";
1642
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU three-tsl lava example.";
1643
+ readonly source: "https://vgpu.sh/examples/three-tsl";
1644
+ };
1645
+ readonly aggregateSha256: "e4d7262b4ed3786a04f5a9b89c2b142ca6d7d432faea427873b7209f7d08dcdd";
1646
+ };
1647
+ readonly blueprint: {
1648
+ readonly schema: "skenora.scene.blueprint";
1649
+ readonly version: 1;
1650
+ readonly scene: {
1651
+ readonly id: "lava-surface";
1652
+ readonly name: "Lava Surface";
1653
+ };
1654
+ readonly entities: readonly [{
1655
+ readonly id: "lava-surface-body";
1656
+ readonly kind: "primitive";
1657
+ readonly primitive: "sphere";
1658
+ readonly diameter: 2;
1659
+ }];
1660
+ readonly materials: readonly [{
1661
+ readonly id: "lava-surface-material";
1662
+ readonly creation: {
1663
+ readonly version: 1;
1664
+ readonly family: "pbr";
1665
+ };
1666
+ readonly baseColor: {
1667
+ readonly r: 0.01;
1668
+ readonly g: 0.005;
1669
+ readonly b: 0.008;
1670
+ };
1671
+ readonly roughness: 0.8;
1672
+ readonly metallic: 0;
1673
+ readonly program: {
1674
+ readonly schema: "skenora.material.program";
1675
+ readonly version: 2;
1676
+ readonly parameters: {
1677
+ readonly scale: {
1678
+ readonly type: "number";
1679
+ readonly value: 4.8;
1680
+ readonly minimum: 0.1;
1681
+ readonly maximum: 64;
1682
+ };
1683
+ readonly emission: {
1684
+ readonly type: "number";
1685
+ readonly value: 5.5;
1686
+ readonly minimum: 0;
1687
+ readonly maximum: 32;
1688
+ };
1689
+ };
1690
+ readonly nodes: readonly [{
1691
+ readonly id: "x";
1692
+ readonly type: "input.coordinate";
1693
+ readonly space: "local";
1694
+ readonly axis: "x";
1695
+ }, {
1696
+ readonly id: "y";
1697
+ readonly type: "input.coordinate";
1698
+ readonly space: "local";
1699
+ readonly axis: "y";
1700
+ }, {
1701
+ readonly id: "z";
1702
+ readonly type: "input.coordinate";
1703
+ readonly space: "local";
1704
+ readonly axis: "z";
1705
+ }, {
1706
+ readonly id: "scale";
1707
+ readonly type: "parameter.number";
1708
+ readonly parameter: "scale";
1709
+ }, {
1710
+ readonly id: "emission";
1711
+ readonly type: "parameter.number";
1712
+ readonly parameter: "emission";
1713
+ }, {
1714
+ readonly id: "zero";
1715
+ readonly type: "value.number";
1716
+ readonly value: 0;
1717
+ }, {
1718
+ readonly id: "one";
1719
+ readonly type: "value.number";
1720
+ readonly value: 1;
1721
+ }, {
1722
+ readonly id: "edge0";
1723
+ readonly type: "value.number";
1724
+ readonly value: 0.25;
1725
+ }, {
1726
+ readonly id: "edge1";
1727
+ readonly type: "value.number";
1728
+ readonly value: 0.72;
1729
+ }, {
1730
+ readonly id: "roughBase";
1731
+ readonly type: "value.number";
1732
+ readonly value: 0.84;
1733
+ }, {
1734
+ readonly id: "roughDrop";
1735
+ readonly type: "value.number";
1736
+ readonly value: 0.58;
1737
+ }, {
1738
+ readonly id: "metalScale";
1739
+ readonly type: "value.number";
1740
+ readonly value: 0.12;
1741
+ }, {
1742
+ readonly id: "rock";
1743
+ readonly type: "value.color";
1744
+ readonly value: {
1745
+ readonly r: 0.008;
1746
+ readonly g: 0.004;
1747
+ readonly b: 0.006;
1748
+ };
1749
+ }, {
1750
+ readonly id: "magma";
1751
+ readonly type: "value.color";
1752
+ readonly value: {
1753
+ readonly r: 1.45;
1754
+ readonly g: 0.13;
1755
+ readonly b: 0.008;
1756
+ };
1757
+ }, {
1758
+ readonly id: "fbm";
1759
+ readonly type: "noise.fbm3d";
1760
+ readonly x: "x";
1761
+ readonly y: "y";
1762
+ readonly z: "z";
1763
+ readonly scale: "scale";
1764
+ readonly octaves: 5;
1765
+ readonly seed: 1337;
1766
+ }, {
1767
+ readonly id: "cell";
1768
+ readonly type: "noise.voronoi3d";
1769
+ readonly x: "x";
1770
+ readonly y: "y";
1771
+ readonly z: "z";
1772
+ readonly scale: "scale";
1773
+ readonly seed: 1434;
1774
+ }, {
1775
+ readonly id: "crack";
1776
+ readonly type: "math.subtract";
1777
+ readonly a: "one";
1778
+ readonly b: "cell";
1779
+ }, {
1780
+ readonly id: "field";
1781
+ readonly type: "math.multiply";
1782
+ readonly a: "crack";
1783
+ readonly b: "fbm";
1784
+ }, {
1785
+ readonly id: "heat";
1786
+ readonly type: "math.smoothstep";
1787
+ readonly edge0: "edge0";
1788
+ readonly edge1: "edge1";
1789
+ readonly input: "field";
1790
+ }, {
1791
+ readonly id: "base";
1792
+ readonly type: "color.mix";
1793
+ readonly a: "rock";
1794
+ readonly b: "magma";
1795
+ readonly factor: "heat";
1796
+ }, {
1797
+ readonly id: "hot";
1798
+ readonly type: "math.multiply";
1799
+ readonly a: "heat";
1800
+ readonly b: "emission";
1801
+ }, {
1802
+ readonly id: "emissive";
1803
+ readonly type: "color.scale";
1804
+ readonly color: "magma";
1805
+ readonly factor: "hot";
1806
+ }, {
1807
+ readonly id: "roughDelta";
1808
+ readonly type: "math.multiply";
1809
+ readonly a: "heat";
1810
+ readonly b: "roughDrop";
1811
+ }, {
1812
+ readonly id: "roughness";
1813
+ readonly type: "math.subtract";
1814
+ readonly a: "roughBase";
1815
+ readonly b: "roughDelta";
1816
+ }, {
1817
+ readonly id: "metallic";
1818
+ readonly type: "math.multiply";
1819
+ readonly a: "heat";
1820
+ readonly b: "metalScale";
1821
+ }];
1822
+ readonly outputs: {
1823
+ readonly baseColor: "base";
1824
+ readonly emissive: "emissive";
1825
+ readonly roughness: "roughness";
1826
+ readonly metallic: "metallic";
1827
+ };
1828
+ };
1829
+ }];
1830
+ readonly materialBindings: readonly [{
1831
+ readonly id: "lava-surface-binding";
1832
+ readonly materialId: "lava-surface-material";
1833
+ readonly entityId: "lava-surface-body";
1834
+ }];
1835
+ readonly camera: {
1836
+ readonly mode: "orbit";
1837
+ readonly position: {
1838
+ readonly x: 2.5;
1839
+ readonly y: 1.3;
1840
+ readonly z: -4;
1841
+ };
1842
+ readonly target: {
1843
+ readonly x: 0;
1844
+ readonly y: 0;
1845
+ readonly z: 0;
1846
+ };
1847
+ };
1848
+ readonly environment: {
1849
+ readonly enabled: false;
1850
+ readonly background: {
1851
+ readonly mode: "color";
1852
+ readonly color: "#050003";
1853
+ };
1854
+ };
1855
+ readonly lights: readonly [{
1856
+ readonly id: "lava-surface-fill";
1857
+ readonly type: "hemispheric";
1858
+ readonly enabled: true;
1859
+ readonly intensity: 0.34;
1860
+ readonly color: {
1861
+ readonly r: 0.35;
1862
+ readonly g: 0.08;
1863
+ readonly b: 0.05;
1864
+ };
1865
+ readonly rotation: {
1866
+ readonly x: -1.5707963267948966;
1867
+ readonly y: 0;
1868
+ readonly z: 0;
1869
+ };
1870
+ }];
1871
+ readonly postProcess: {
1872
+ readonly enabled: true;
1873
+ readonly antialiasing: "fxaa";
1874
+ readonly toneMappingEnabled: true;
1875
+ readonly toneMappingType: "aces";
1876
+ readonly exposure: 0.85;
1877
+ readonly glow: true;
1878
+ readonly bloom: false;
1879
+ readonly depthOfField: false;
1880
+ readonly ssao: {
1881
+ readonly enabled: false;
1882
+ };
1883
+ };
1884
+ };
1885
+ }, {
1886
+ readonly manifest: {
1887
+ readonly schema: "skenora.example-manifest";
1888
+ readonly schemaVersion: 1;
1889
+ readonly id: "neon-led";
1890
+ readonly title: "Neon LED";
1891
+ readonly description: "A public Recipe combining analytic triangular surface emission, explicit phase animation, and optional scene glow.";
1892
+ readonly tags: readonly ["animation", "glow", "neon", "recipe"];
1893
+ readonly mode: "recipe";
1894
+ readonly tier: "bounded-effects";
1895
+ readonly requiredCapabilities: readonly [{
1896
+ readonly id: "skenora.entity.primitive";
1897
+ readonly version: "1";
1898
+ readonly reason: "Creates the public panel plane.";
1899
+ }, {
1900
+ readonly id: "skenora.material.pbr";
1901
+ readonly version: "1";
1902
+ readonly reason: "Owns the bounded panel surface.";
1903
+ }, {
1904
+ readonly id: "skenora.material.effect.neon";
1905
+ readonly version: "1";
1906
+ readonly reason: "Evaluates analytic triangular surface lines.";
1907
+ }, {
1908
+ readonly id: "skenora.material.animation";
1909
+ readonly version: "1";
1910
+ readonly reason: "Drives explicit neon phase through the shared Runtime clock.";
1911
+ }];
1912
+ readonly optionalCapabilities: readonly [{
1913
+ readonly id: "skenora.scene.post-process";
1914
+ readonly version: "1";
1915
+ readonly reason: "Explicit glow adds a screen-space halo without changing neon semantics.";
1916
+ }];
1917
+ readonly assets: readonly [];
1918
+ readonly controls: {
1919
+ readonly type: "object";
1920
+ readonly description: "Bounded neon-led recipe options.";
1921
+ readonly additionalProperties: false;
1922
+ readonly properties: {
1923
+ readonly width: {
1924
+ readonly type: "number";
1925
+ readonly description: "Panel width";
1926
+ readonly minimum: 0.1;
1927
+ readonly maximum: 1000;
1928
+ readonly default: 3.2;
1929
+ readonly unit: "meters";
1930
+ readonly update: "rebuild";
1931
+ };
1932
+ readonly height: {
1933
+ readonly type: "number";
1934
+ readonly description: "Panel height";
1935
+ readonly minimum: 0.1;
1936
+ readonly maximum: 1000;
1937
+ readonly default: 2;
1938
+ readonly unit: "meters";
1939
+ readonly update: "rebuild";
1940
+ };
1941
+ readonly intensity: {
1942
+ readonly type: "number";
1943
+ readonly description: "Surface emission";
1944
+ readonly minimum: 0;
1945
+ readonly maximum: 64;
1946
+ readonly default: 5;
1947
+ readonly update: "parameter";
1948
+ };
1949
+ readonly cellScale: {
1950
+ readonly type: "number";
1951
+ readonly description: "Analytic cells per meter";
1952
+ readonly minimum: 0.01;
1953
+ readonly maximum: 1000;
1954
+ readonly default: 4.5;
1955
+ readonly unit: "per-meter";
1956
+ readonly update: "parameter";
1957
+ };
1958
+ readonly lineWidth: {
1959
+ readonly type: "number";
1960
+ readonly description: "Analytic line half-width";
1961
+ readonly minimum: 0.001;
1962
+ readonly maximum: 0.25;
1963
+ readonly default: 0.042;
1964
+ readonly update: "parameter";
1965
+ };
1966
+ readonly pulseStrength: {
1967
+ readonly type: "number";
1968
+ readonly description: "Pulse modulation fraction";
1969
+ readonly minimum: 0;
1970
+ readonly maximum: 1;
1971
+ readonly default: 0.4;
1972
+ readonly update: "parameter";
1973
+ };
1974
+ readonly pulseDurationMs: {
1975
+ readonly type: "number";
1976
+ readonly description: "Pulse cycle";
1977
+ readonly minimum: 100;
1978
+ readonly maximum: 60000;
1979
+ readonly default: 2400;
1980
+ readonly unit: "milliseconds";
1981
+ readonly update: "parameter";
1982
+ };
1983
+ readonly glow: {
1984
+ readonly type: "boolean";
1985
+ readonly description: "Enable existing scene glow";
1986
+ readonly default: true;
1987
+ readonly update: "rebuild";
1988
+ };
1989
+ };
1990
+ };
1991
+ readonly evidence: readonly [{
1992
+ readonly kind: "parse";
1993
+ readonly required: true;
1994
+ readonly status: "passed";
1995
+ readonly note: "Manifest, Recipe options and expanded Blueprint parse.";
1996
+ }, {
1997
+ readonly kind: "compile";
1998
+ readonly required: true;
1999
+ readonly status: "passed";
2000
+ readonly note: "Expanded ordinary Blueprint compilation.";
2001
+ }, {
2002
+ readonly kind: "capability";
2003
+ readonly required: true;
2004
+ readonly status: "passed";
2005
+ readonly note: "Neon allow, deny, unknown and version cases.";
2006
+ }, {
2007
+ readonly kind: "preparation";
2008
+ readonly required: true;
2009
+ readonly status: "passed";
2010
+ readonly note: "Analytic variant preparation and parameter reuse.";
2011
+ }, {
2012
+ readonly kind: "runtime";
2013
+ readonly required: true;
2014
+ readonly status: "passed";
2015
+ readonly note: "Pulse clock, pause/resume/reset and disposal.";
2016
+ }, {
2017
+ readonly kind: "pixels";
2018
+ readonly required: true;
2019
+ readonly status: "passed";
2020
+ readonly note: "Dark base, analytic line and halo pixels.";
2021
+ }, {
2022
+ readonly kind: "visual";
2023
+ readonly required: true;
2024
+ readonly status: "passed";
2025
+ readonly note: "Human surface-only/glow composition review.";
2026
+ }, {
2027
+ readonly kind: "performance";
2028
+ readonly required: true;
2029
+ readonly status: "passed";
2030
+ readonly note: "Phase updates retain material/program identity.";
2031
+ }, {
2032
+ readonly kind: "package-consumption";
2033
+ readonly required: true;
2034
+ readonly status: "passed";
2035
+ readonly note: "Recipe and Example through development tarballs.";
2036
+ }, {
2037
+ readonly kind: "cross-device";
2038
+ readonly required: true;
2039
+ readonly status: "passed";
2040
+ readonly note: "WebGL backend/degradation matrix.";
2041
+ }];
2042
+ readonly fallback: {
2043
+ readonly strategy: "substitute-example";
2044
+ readonly description: "Use Gradient Rim when neon is unavailable; label it as a different effect.";
2045
+ readonly exampleId: "gradient-rim";
2046
+ };
2047
+ readonly files: readonly [{
2048
+ readonly path: "README.md";
2049
+ readonly role: "readme";
2050
+ readonly mediaType: "text/markdown";
2051
+ readonly bytes: 415;
2052
+ readonly sha256: "29ba10194874d18f905927e959ef4be4bb54a504fd22d8c098efb8e0faead803";
2053
+ }, {
2054
+ readonly path: "blueprint.json";
2055
+ readonly role: "blueprint";
2056
+ readonly mediaType: "application/json";
2057
+ readonly bytes: 2226;
2058
+ readonly sha256: "e369a9a6f10e8c5c910cb0e4cfb944a96f156ca07408aa44c23cec5e15d3f617";
2059
+ }, {
2060
+ readonly path: "recipe.json";
2061
+ readonly role: "source";
2062
+ readonly mediaType: "application/json";
2063
+ readonly bytes: 294;
2064
+ readonly sha256: "731750fdff0d1d404082aeb30cc1908b00a5571d48933ed4f6ec7707e8c791e8";
2065
+ }];
2066
+ readonly license: {
2067
+ readonly spdx: "MIT";
2068
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Triangle LED Hero example.";
2069
+ readonly source: "https://vgpu.sh/examples/triangle-led-front";
2070
+ };
2071
+ readonly aggregateSha256: "0890d9af625aace61f1ad2eb89732ab2d454f99d919f6424e32682b5268be14e";
2072
+ };
2073
+ readonly blueprint: {
2074
+ readonly schema: "skenora.scene.blueprint";
2075
+ readonly version: 1;
2076
+ readonly scene: {
2077
+ readonly id: "neon-led";
2078
+ readonly name: "Neon LED";
2079
+ };
2080
+ readonly entities: readonly [{
2081
+ readonly id: "neon-led-panel";
2082
+ readonly kind: "primitive";
2083
+ readonly primitive: "plane";
2084
+ readonly width: 3.4;
2085
+ readonly height: 2.1;
2086
+ }];
2087
+ readonly materials: readonly [{
2088
+ readonly id: "neon-led-surface";
2089
+ readonly creation: {
2090
+ readonly version: 1;
2091
+ readonly family: "pbr";
2092
+ };
2093
+ readonly baseColor: {
2094
+ readonly r: 0.003;
2095
+ readonly g: 0.008;
2096
+ readonly b: 0.018;
2097
+ };
2098
+ readonly metallic: 0.15;
2099
+ readonly roughness: 0.4;
2100
+ readonly doubleSided: true;
2101
+ readonly effects: {
2102
+ readonly version: 2;
2103
+ readonly neon: {
2104
+ readonly color: {
2105
+ readonly r: 0.04;
2106
+ readonly g: 0.7;
2107
+ readonly b: 1.6;
2108
+ };
2109
+ readonly intensity: 5.5;
2110
+ readonly scale: 4.8;
2111
+ readonly width: 0.044;
2112
+ readonly plane: "xy";
2113
+ readonly phase: 0;
2114
+ readonly pulseStrength: 0.42;
2115
+ };
2116
+ };
2117
+ readonly animations: readonly [{
2118
+ readonly version: 1;
2119
+ readonly id: "pulse";
2120
+ readonly property: "neonPhase";
2121
+ readonly from: 0;
2122
+ readonly to: 1;
2123
+ readonly durationMs: 2200;
2124
+ readonly easing: "linear";
2125
+ readonly loop: "repeat";
2126
+ readonly autoStart: true;
2127
+ }];
2128
+ }];
2129
+ readonly materialBindings: readonly [{
2130
+ readonly id: "neon-led-panel-surface";
2131
+ readonly materialId: "neon-led-surface";
2132
+ readonly entityId: "neon-led-panel";
2133
+ }];
2134
+ readonly camera: {
2135
+ readonly mode: "orbit";
2136
+ readonly position: {
2137
+ readonly x: 0;
2138
+ readonly y: 0;
2139
+ readonly z: -4.8;
2140
+ };
2141
+ readonly target: {
2142
+ readonly x: 0;
2143
+ readonly y: 0;
2144
+ readonly z: 0;
2145
+ };
2146
+ };
2147
+ readonly environment: {
2148
+ readonly enabled: false;
2149
+ readonly background: {
2150
+ readonly mode: "color";
2151
+ readonly color: "#02050c";
2152
+ };
2153
+ };
2154
+ readonly lights: readonly [{
2155
+ readonly id: "neon-led-fill";
2156
+ readonly type: "hemispheric";
2157
+ readonly enabled: true;
2158
+ readonly intensity: 0.16;
2159
+ readonly color: {
2160
+ readonly r: 0.5;
2161
+ readonly g: 0.65;
2162
+ readonly b: 1;
2163
+ };
2164
+ readonly rotation: {
2165
+ readonly x: -1.5707963267948966;
2166
+ readonly y: 0;
2167
+ readonly z: 0;
2168
+ };
2169
+ }];
2170
+ readonly postProcess: {
2171
+ readonly enabled: true;
2172
+ readonly antialiasing: "fxaa";
2173
+ readonly toneMappingEnabled: true;
2174
+ readonly toneMappingType: "aces";
2175
+ readonly exposure: 1;
2176
+ readonly glow: true;
2177
+ readonly bloom: false;
2178
+ readonly depthOfField: false;
2179
+ readonly ssao: {
2180
+ readonly enabled: false;
2181
+ };
2182
+ };
2183
+ };
2184
+ }, {
2185
+ readonly manifest: {
2186
+ readonly schema: "skenora.example-manifest";
2187
+ readonly schemaVersion: 1;
2188
+ readonly id: "procedural-earth";
2189
+ readonly title: "Procedural Earth";
2190
+ readonly description: "Deterministic generated planet maps, a transparent cloud shell, night emission and a bounded atmosphere composition.";
2191
+ readonly tags: readonly ["atmosphere", "earth", "generated-texture", "planet", "recipe"];
2192
+ readonly mode: "recipe";
2193
+ readonly tier: "materials";
2194
+ readonly requiredCapabilities: readonly [{
2195
+ readonly id: "skenora.entity.primitive";
2196
+ readonly version: "1";
2197
+ readonly reason: "Creates the planet and two explicit shell entities.";
2198
+ }, {
2199
+ readonly id: "skenora.material.pbr";
2200
+ readonly version: "1";
2201
+ readonly reason: "Owns all explicit planet surfaces.";
2202
+ }, {
2203
+ readonly id: "skenora.texture.program";
2204
+ readonly version: "1";
2205
+ readonly reason: "Generates deterministic albedo, night and cloud textures within declared budgets.";
2206
+ }, {
2207
+ readonly id: "skenora.material.effect.rim";
2208
+ readonly version: "1";
2209
+ readonly reason: "Creates the explicit atmosphere-shell rim emission.";
2210
+ }];
2211
+ readonly optionalCapabilities: readonly [{
2212
+ readonly id: "skenora.scene.post-process";
2213
+ readonly version: "1";
2214
+ readonly reason: "Glow presents atmosphere and night emission but does not define generated-texture semantics.";
2215
+ }];
2216
+ readonly assets: readonly [];
2217
+ readonly controls: {
2218
+ readonly type: "object";
2219
+ readonly description: "Bounded procedural planet recipe options.";
2220
+ readonly additionalProperties: false;
2221
+ readonly properties: {
2222
+ readonly radius: {
2223
+ readonly type: "number";
2224
+ readonly description: "Planet radius";
2225
+ readonly minimum: 0.1;
2226
+ readonly maximum: 1000;
2227
+ readonly default: 1;
2228
+ readonly update: "rebuild";
2229
+ };
2230
+ readonly seed: {
2231
+ readonly type: "integer";
2232
+ readonly description: "Deterministic generator seed";
2233
+ readonly minimum: -1000000000;
2234
+ readonly maximum: 1000000000;
2235
+ readonly default: 24051969;
2236
+ readonly update: "rebuild";
2237
+ };
2238
+ readonly textureSize: {
2239
+ readonly type: "integer";
2240
+ readonly description: "Generated texture height";
2241
+ readonly minimum: 32;
2242
+ readonly maximum: 512;
2243
+ readonly default: 128;
2244
+ readonly update: "rebuild";
2245
+ };
2246
+ readonly cloudOpacity: {
2247
+ readonly type: "number";
2248
+ readonly description: "Cloud shell opacity";
2249
+ readonly minimum: 0;
2250
+ readonly maximum: 1;
2251
+ readonly default: 0.72;
2252
+ readonly update: "parameter";
2253
+ };
2254
+ };
2255
+ };
2256
+ readonly evidence: readonly [{
2257
+ readonly kind: "parse";
2258
+ readonly required: true;
2259
+ readonly status: "passed";
2260
+ readonly note: "Manifest, options and expanded Blueprint parse.";
2261
+ }, {
2262
+ readonly kind: "compile";
2263
+ readonly required: true;
2264
+ readonly status: "passed";
2265
+ readonly note: "Texture programs compile to deterministic bytes and WGSL reflection.";
2266
+ }, {
2267
+ readonly kind: "capability";
2268
+ readonly required: true;
2269
+ readonly status: "passed";
2270
+ readonly note: "Dimensions, pixels, octaves, kinds and conflict cases.";
2271
+ }, {
2272
+ readonly kind: "preparation";
2273
+ readonly required: true;
2274
+ readonly status: "passed";
2275
+ readonly note: "Three generated texture targets prepare before activation.";
2276
+ }, {
2277
+ readonly kind: "runtime";
2278
+ readonly required: true;
2279
+ readonly status: "passed";
2280
+ readonly note: "Cache hit, replacement, release and renderer disposal.";
2281
+ }, {
2282
+ readonly kind: "pixels";
2283
+ readonly required: true;
2284
+ readonly status: "passed";
2285
+ readonly note: "Planet, cloud alpha, night emission and atmosphere pixels.";
2286
+ }, {
2287
+ readonly kind: "visual";
2288
+ readonly required: true;
2289
+ readonly status: "passed";
2290
+ readonly note: "Human planet composition review.";
2291
+ }, {
2292
+ readonly kind: "performance";
2293
+ readonly required: true;
2294
+ readonly status: "passed";
2295
+ readonly note: "Static programs do not regenerate per frame.";
2296
+ }, {
2297
+ readonly kind: "package-consumption";
2298
+ readonly required: true;
2299
+ readonly status: "passed";
2300
+ readonly note: "Recipe and compiler through development tarballs.";
2301
+ }, {
2302
+ readonly kind: "cross-device";
2303
+ readonly required: true;
2304
+ readonly status: "passed";
2305
+ readonly note: "WebGL backend and deterministic byte evidence.";
2306
+ }];
2307
+ readonly fallback: {
2308
+ readonly strategy: "substitute-example";
2309
+ readonly description: "Use Shared PBR if generated textures are unavailable; never claim procedural maps were produced.";
2310
+ readonly exampleId: "shared-pbr";
2311
+ };
2312
+ readonly files: readonly [{
2313
+ readonly path: "README.md";
2314
+ readonly role: "readme";
2315
+ readonly mediaType: "text/markdown";
2316
+ readonly bytes: 503;
2317
+ readonly sha256: "d471d036ceefb6a963f688b90fc31fe4214f47b2fc9c96113b6f8bb37be472ae";
2318
+ }, {
2319
+ readonly path: "blueprint.json";
2320
+ readonly role: "blueprint";
2321
+ readonly mediaType: "application/json";
2322
+ readonly bytes: 4733;
2323
+ readonly sha256: "fa13f1028d9b9d2df8c36f506d0feaa033b0016dd0dc54e797d0bd069da27190";
2324
+ }, {
2325
+ readonly path: "recipe.json";
2326
+ readonly role: "source";
2327
+ readonly mediaType: "application/json";
2328
+ readonly bytes: 172;
2329
+ readonly sha256: "fc86f0d41aa83cc004fbd7c2809b71ee9ca851e774d1d8f44ad6c3f1d5741534";
2330
+ }];
2331
+ readonly license: {
2332
+ readonly spdx: "MIT";
2333
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Earth example.";
2334
+ readonly source: "https://vgpu.sh/examples/earth";
2335
+ };
2336
+ readonly aggregateSha256: "de161e181ec04f7024c2a283db1cebe8073da71225bf59d29c13000d3a523da0";
2337
+ };
2338
+ readonly blueprint: {
2339
+ readonly schema: "skenora.scene.blueprint";
2340
+ readonly version: 1;
2341
+ readonly scene: {
2342
+ readonly id: "procedural-earth";
2343
+ readonly name: "Procedural Earth";
2344
+ };
2345
+ readonly entities: readonly [{
2346
+ readonly id: "procedural-earth-surface";
2347
+ readonly kind: "primitive";
2348
+ readonly primitive: "sphere";
2349
+ readonly diameter: 2;
2350
+ }, {
2351
+ readonly id: "procedural-earth-clouds";
2352
+ readonly kind: "primitive";
2353
+ readonly primitive: "sphere";
2354
+ readonly diameter: 2.035;
2355
+ }, {
2356
+ readonly id: "procedural-earth-atmosphere";
2357
+ readonly kind: "primitive";
2358
+ readonly primitive: "sphere";
2359
+ readonly diameter: 2.11;
2360
+ }];
2361
+ readonly materials: readonly [{
2362
+ readonly id: "procedural-earth-planet-material";
2363
+ readonly creation: {
2364
+ readonly version: 1;
2365
+ readonly family: "pbr";
2366
+ };
2367
+ readonly baseColor: {
2368
+ readonly r: 0.55;
2369
+ readonly g: 0.65;
2370
+ readonly b: 0.85;
2371
+ };
2372
+ readonly metallic: 0.04;
2373
+ readonly roughness: 0.7;
2374
+ readonly emissiveColor: {
2375
+ readonly r: 1;
2376
+ readonly g: 0.58;
2377
+ readonly b: 0.12;
2378
+ };
2379
+ readonly emissiveIntensity: 0.72;
2380
+ readonly generatedTextures: {
2381
+ readonly baseColor: {
2382
+ readonly schema: "skenora.texture.program";
2383
+ readonly version: 1;
2384
+ readonly kind: "planet-albedo";
2385
+ readonly width: 256;
2386
+ readonly height: 128;
2387
+ readonly format: "rgba8unorm";
2388
+ readonly colorSpace: "srgb";
2389
+ readonly lifecycle: "static";
2390
+ readonly seed: 24051969;
2391
+ readonly scale: 4.2;
2392
+ readonly octaves: 5;
2393
+ };
2394
+ readonly emissive: {
2395
+ readonly schema: "skenora.texture.program";
2396
+ readonly version: 1;
2397
+ readonly kind: "planet-night";
2398
+ readonly width: 256;
2399
+ readonly height: 128;
2400
+ readonly format: "rgba8unorm";
2401
+ readonly colorSpace: "srgb";
2402
+ readonly lifecycle: "static";
2403
+ readonly seed: 24051986;
2404
+ readonly scale: 4.2;
2405
+ readonly octaves: 4;
2406
+ };
2407
+ };
2408
+ }, {
2409
+ readonly id: "procedural-earth-cloud-material";
2410
+ readonly creation: {
2411
+ readonly version: 1;
2412
+ readonly family: "pbr";
2413
+ };
2414
+ readonly baseColor: {
2415
+ readonly r: 0.88;
2416
+ readonly g: 0.94;
2417
+ readonly b: 1;
2418
+ };
2419
+ readonly roughness: 0.92;
2420
+ readonly metallic: 0;
2421
+ readonly alpha: 0.72;
2422
+ readonly transparencyMode: 2;
2423
+ readonly doubleSided: true;
2424
+ readonly generatedTextures: {
2425
+ readonly opacity: {
2426
+ readonly schema: "skenora.texture.program";
2427
+ readonly version: 1;
2428
+ readonly kind: "planet-clouds";
2429
+ readonly width: 256;
2430
+ readonly height: 128;
2431
+ readonly format: "rgba8unorm";
2432
+ readonly colorSpace: "linear";
2433
+ readonly lifecycle: "static";
2434
+ readonly seed: 24052000;
2435
+ readonly scale: 7;
2436
+ readonly octaves: 5;
2437
+ };
2438
+ };
2439
+ }, {
2440
+ readonly id: "procedural-earth-atmosphere-material";
2441
+ readonly creation: {
2442
+ readonly version: 1;
2443
+ readonly family: "pbr";
2444
+ };
2445
+ readonly baseColor: {
2446
+ readonly r: 0.015;
2447
+ readonly g: 0.06;
2448
+ readonly b: 0.14;
2449
+ };
2450
+ readonly alpha: 0.12;
2451
+ readonly transparencyMode: 2;
2452
+ readonly roughness: 0.9;
2453
+ readonly metallic: 0;
2454
+ readonly doubleSided: true;
2455
+ readonly effects: {
2456
+ readonly version: 1;
2457
+ readonly rim: {
2458
+ readonly color: {
2459
+ readonly r: 0.05;
2460
+ readonly g: 0.42;
2461
+ readonly b: 1.6;
2462
+ };
2463
+ readonly intensity: 3.2;
2464
+ readonly power: 2.4;
2465
+ };
2466
+ };
2467
+ }];
2468
+ readonly materialBindings: readonly [{
2469
+ readonly id: "procedural-earth-surface-binding";
2470
+ readonly materialId: "procedural-earth-planet-material";
2471
+ readonly entityId: "procedural-earth-surface";
2472
+ }, {
2473
+ readonly id: "procedural-earth-cloud-binding";
2474
+ readonly materialId: "procedural-earth-cloud-material";
2475
+ readonly entityId: "procedural-earth-clouds";
2476
+ }, {
2477
+ readonly id: "procedural-earth-atmosphere-binding";
2478
+ readonly materialId: "procedural-earth-atmosphere-material";
2479
+ readonly entityId: "procedural-earth-atmosphere";
2480
+ }];
2481
+ readonly camera: {
2482
+ readonly mode: "orbit";
2483
+ readonly position: {
2484
+ readonly x: 2.8;
2485
+ readonly y: 1.35;
2486
+ readonly z: -4.2;
2487
+ };
2488
+ readonly target: {
2489
+ readonly x: 0;
2490
+ readonly y: 0;
2491
+ readonly z: 0;
2492
+ };
2493
+ };
2494
+ readonly environment: {
2495
+ readonly enabled: false;
2496
+ readonly background: {
2497
+ readonly mode: "color";
2498
+ readonly color: "#01040b";
2499
+ };
2500
+ };
2501
+ readonly lights: readonly [{
2502
+ readonly id: "procedural-earth-sun";
2503
+ readonly type: "directional";
2504
+ readonly enabled: true;
2505
+ readonly intensity: 3.2;
2506
+ readonly color: {
2507
+ readonly r: 1;
2508
+ readonly g: 0.9;
2509
+ readonly b: 0.72;
2510
+ };
2511
+ readonly rotation: {
2512
+ readonly x: -0.45;
2513
+ readonly y: -0.8;
2514
+ readonly z: 0;
2515
+ };
2516
+ }, {
2517
+ readonly id: "procedural-earth-space-fill";
2518
+ readonly type: "hemispheric";
2519
+ readonly enabled: true;
2520
+ readonly intensity: 0.12;
2521
+ readonly color: {
2522
+ readonly r: 0.15;
2523
+ readonly g: 0.25;
2524
+ readonly b: 0.55;
2525
+ };
2526
+ readonly rotation: {
2527
+ readonly x: -1.5707963267948966;
2528
+ readonly y: 0;
2529
+ readonly z: 0;
2530
+ };
2531
+ }];
2532
+ readonly postProcess: {
2533
+ readonly enabled: true;
2534
+ readonly antialiasing: "fxaa";
2535
+ readonly toneMappingEnabled: true;
2536
+ readonly toneMappingType: "aces";
2537
+ readonly exposure: 1.15;
2538
+ readonly glow: true;
2539
+ readonly bloom: false;
2540
+ readonly depthOfField: false;
2541
+ readonly ssao: {
2542
+ readonly enabled: false;
2543
+ };
2544
+ };
2545
+ };
2546
+ }, {
2547
+ readonly manifest: {
2548
+ readonly schema: "skenora.example-manifest";
2549
+ readonly schemaVersion: 1;
2550
+ readonly id: "radiance-cascades";
2551
+ readonly title: "Radiance Cascades";
2552
+ readonly description: "A bounded WebGPU 2D global-illumination field combining jump-flood feature propagation and multi-scale radiance integration.";
2553
+ readonly tags: readonly ["compute", "global-illumination", "jump-flood", "radiance", "webgpu"];
2554
+ readonly mode: "renderer-lab";
2555
+ readonly tier: "advanced-simulation";
2556
+ readonly requiredCapabilities: readonly [{
2557
+ readonly id: "skenora.simulation.program";
2558
+ readonly version: "1";
2559
+ readonly reason: "Owns bounded JFA propagation, cascade integration and GPU-resident presentation.";
2560
+ }];
2561
+ readonly optionalCapabilities: readonly [];
2562
+ readonly assets: readonly [];
2563
+ readonly controls: {
2564
+ readonly type: "object";
2565
+ readonly description: "Bounded trusted 2D lighting parameters.";
2566
+ readonly additionalProperties: false;
2567
+ readonly properties: {
2568
+ readonly cascadeCount: {
2569
+ readonly type: "number";
2570
+ readonly description: "Multi-scale radiance integration levels";
2571
+ readonly minimum: 2;
2572
+ readonly maximum: 8;
2573
+ readonly default: 6;
2574
+ readonly update: "rebuild";
2575
+ };
2576
+ readonly emitterCount: {
2577
+ readonly type: "number";
2578
+ readonly description: "Animated emitter count";
2579
+ readonly minimum: 1;
2580
+ readonly maximum: 8;
2581
+ readonly default: 5;
2582
+ readonly update: "rebuild";
2583
+ };
2584
+ };
2585
+ };
2586
+ readonly evidence: readonly [{
2587
+ readonly kind: "parse";
2588
+ readonly required: true;
2589
+ readonly status: "passed";
2590
+ readonly note: "Radiance kernel fields and counts parse.";
2591
+ }, {
2592
+ readonly kind: "compile";
2593
+ readonly required: true;
2594
+ readonly status: "passed";
2595
+ readonly note: "Seed, descending JFA, cascade and resolve passes are deterministic.";
2596
+ }, {
2597
+ readonly kind: "capability";
2598
+ readonly required: true;
2599
+ readonly status: "passed";
2600
+ readonly note: "Grid, emitter, occluder, cascade and pass budgets reject.";
2601
+ }, {
2602
+ readonly kind: "preparation";
2603
+ readonly required: true;
2604
+ readonly status: "passed";
2605
+ readonly note: "Physical WebGPU radiance and presentation pipeline preparation.";
2606
+ }, {
2607
+ readonly kind: "runtime";
2608
+ readonly required: true;
2609
+ readonly status: "passed";
2610
+ readonly note: "Stable ping-pong, fixed step, reset, resize and disposal.";
2611
+ }, {
2612
+ readonly kind: "pixels";
2613
+ readonly required: true;
2614
+ readonly status: "passed";
2615
+ readonly note: "Emitters and propagated radiance create non-background pixels.";
2616
+ }, {
2617
+ readonly kind: "visual";
2618
+ readonly required: true;
2619
+ readonly status: "passed";
2620
+ readonly note: "Human review of emitter, occluder and multi-scale light field.";
2621
+ }, {
2622
+ readonly kind: "performance";
2623
+ readonly required: true;
2624
+ readonly status: "passed";
2625
+ readonly note: "16 bounded passes, two persistent buffers and zero steady-state readback.";
2626
+ }, {
2627
+ readonly kind: "package-consumption";
2628
+ readonly required: true;
2629
+ readonly status: "passed";
2630
+ readonly note: "Advanced program and optional renderer subpath from tarballs.";
2631
+ }, {
2632
+ readonly kind: "cross-device";
2633
+ readonly required: true;
2634
+ readonly status: "passed";
2635
+ readonly note: "Physical WebGPU plus explicit unsupported degradation.";
2636
+ }];
2637
+ readonly fallback: {
2638
+ readonly strategy: "substitute-example";
2639
+ readonly description: "Use Neon LED for bounded emissive presentation when WebGPU is unavailable; 2D GI is not claimed.";
2640
+ readonly exampleId: "neon-led";
2641
+ };
2642
+ readonly files: readonly [{
2643
+ readonly path: "README.md";
2644
+ readonly role: "readme";
2645
+ readonly mediaType: "text/markdown";
2646
+ readonly bytes: 546;
2647
+ readonly sha256: "d4119857afa766d35b543d0d68fa20da314d4dcbc644714e3e30e48f70540174";
2648
+ }, {
2649
+ readonly path: "simulation.json";
2650
+ readonly role: "source";
2651
+ readonly mediaType: "application/json";
2652
+ readonly bytes: 711;
2653
+ readonly sha256: "e24da349ce2499a10fbd70a42a821d687bce4408f152c232c337589d2555538c";
2654
+ }];
2655
+ readonly license: {
2656
+ readonly spdx: "MIT";
2657
+ readonly attribution: "Skenora implementation inspired by the MIT-licensed vGPU Radiance Cascades example.";
2658
+ readonly source: "https://vgpu.sh/examples/radiance-cascades";
2659
+ };
2660
+ readonly aggregateSha256: "c716f9a3019d488997c7fa7ed34879445c432c32b8b4eb5ee9f587ab4e6115f7";
2661
+ };
2662
+ readonly simulation: {
2663
+ readonly schema: "skenora.simulation-program";
2664
+ readonly version: 1;
2665
+ readonly kernel: "radiance-cascades";
2666
+ readonly grid: {
2667
+ readonly width: 128;
2668
+ readonly height: 128;
2669
+ };
2670
+ readonly fixedStep: {
2671
+ readonly milliseconds: 33.3333;
2672
+ readonly maxSubsteps: 2;
2673
+ };
2674
+ readonly dispatch: {
2675
+ readonly workgroupSize: 8;
2676
+ };
2677
+ readonly resources: readonly [{
2678
+ readonly id: "radiance-field-a";
2679
+ readonly kind: "storage-buffer";
2680
+ readonly format: "vec4f";
2681
+ readonly elements: "grid";
2682
+ readonly pingPong: true;
2683
+ }, {
2684
+ readonly id: "radiance-field-b";
2685
+ readonly kind: "storage-buffer";
2686
+ readonly format: "vec4f";
2687
+ readonly elements: "grid";
2688
+ readonly pingPong: true;
2689
+ }];
2690
+ readonly parameters: {
2691
+ readonly kind: "radiance-cascades";
2692
+ readonly cascadeCount: 6;
2693
+ readonly emitterCount: 5;
2694
+ readonly occluderCount: 3;
2695
+ };
2696
+ };
2697
+ }, {
2698
+ readonly manifest: {
2699
+ readonly schema: "skenora.example-manifest";
2700
+ readonly schemaVersion: 1;
2701
+ readonly id: "shared-pbr";
2702
+ readonly title: "Shared PBR";
2703
+ readonly description: "A minimal persistent Blueprint with one shared owned PBR material and two primitive bindings.";
2704
+ readonly tags: readonly ["baseline", "blueprint", "pbr"];
2705
+ readonly mode: "blueprint";
2706
+ readonly tier: "foundation";
2707
+ readonly requiredCapabilities: readonly [{
2708
+ readonly id: "skenora.entity.primitive";
2709
+ readonly version: "1";
2710
+ readonly reason: "Creates the sphere and box.";
2711
+ }, {
2712
+ readonly id: "skenora.material.pbr";
2713
+ readonly version: "1";
2714
+ readonly reason: "Creates the shared owned surface.";
2715
+ }];
2716
+ readonly optionalCapabilities: readonly [];
2717
+ readonly assets: readonly [];
2718
+ readonly controls: {
2719
+ readonly type: "object";
2720
+ readonly description: "This baseline has no example-specific controls.";
2721
+ readonly properties: {};
2722
+ readonly additionalProperties: false;
2723
+ };
2724
+ readonly evidence: readonly [{
2725
+ readonly kind: "parse";
2726
+ readonly required: true;
2727
+ readonly status: "passed";
2728
+ readonly note: "Pure manifest and Blueprint parse.";
2729
+ }, {
2730
+ readonly kind: "compile";
2731
+ readonly required: true;
2732
+ readonly status: "passed";
2733
+ readonly note: "Pure Scene Plan compilation.";
2734
+ }, {
2735
+ readonly kind: "capability";
2736
+ readonly required: true;
2737
+ readonly status: "passed";
2738
+ readonly note: "Allow, deny and unknown capability cases.";
2739
+ }, {
2740
+ readonly kind: "preparation";
2741
+ readonly required: true;
2742
+ readonly status: "passed";
2743
+ readonly note: "Runtime material preparation.";
2744
+ }, {
2745
+ readonly kind: "runtime";
2746
+ readonly required: true;
2747
+ readonly status: "passed";
2748
+ readonly note: "Public Renderer load and disposal.";
2749
+ }, {
2750
+ readonly kind: "pixels";
2751
+ readonly required: true;
2752
+ readonly status: "passed";
2753
+ readonly note: "Framebuffer contains rendered geometry.";
2754
+ }, {
2755
+ readonly kind: "visual";
2756
+ readonly required: true;
2757
+ readonly status: "passed";
2758
+ readonly note: "Human composition review.";
2759
+ }, {
2760
+ readonly kind: "performance";
2761
+ readonly required: true;
2762
+ readonly status: "passed";
2763
+ readonly note: "Bounded baseline frame evidence.";
2764
+ }, {
2765
+ readonly kind: "package-consumption";
2766
+ readonly required: true;
2767
+ readonly status: "passed";
2768
+ readonly note: "Development tarball consumer.";
2769
+ }, {
2770
+ readonly kind: "cross-device";
2771
+ readonly required: true;
2772
+ readonly status: "passed";
2773
+ readonly note: "Claimed backend matrix.";
2774
+ }];
2775
+ readonly fallback: {
2776
+ readonly strategy: "unsupported";
2777
+ readonly description: "Report missing primitive or owned-PBR support; do not rewrite the example.";
2778
+ };
2779
+ readonly files: readonly [{
2780
+ readonly path: "README.md";
2781
+ readonly role: "readme";
2782
+ readonly mediaType: "text/markdown";
2783
+ readonly bytes: 403;
2784
+ readonly sha256: "4995459f08821fe17821a581c6afb4c1da96723b60d387c9cad3ed22f80ed68f";
2785
+ }, {
2786
+ readonly path: "blueprint.json";
2787
+ readonly role: "blueprint";
2788
+ readonly mediaType: "application/json";
2789
+ readonly bytes: 1475;
2790
+ readonly sha256: "cae28357216e9f1fbd262785504b0991b49ef6b95a0e7d4f638c51182d84945c";
2791
+ }];
2792
+ readonly license: {
2793
+ readonly spdx: "MIT";
2794
+ readonly attribution: "Skenora contributors.";
2795
+ };
2796
+ readonly aggregateSha256: "a3ce8c961bdab293e249038e81b826604ff3dbc6aa226f1ecdb5002a91eeb750";
2797
+ };
2798
+ readonly blueprint: {
2799
+ readonly schema: "skenora.scene.blueprint";
2800
+ readonly version: 1;
2801
+ readonly scene: {
2802
+ readonly id: "shared-pbr";
2803
+ readonly name: "Shared PBR";
2804
+ };
2805
+ readonly entities: readonly [{
2806
+ readonly id: "sphere";
2807
+ readonly kind: "primitive";
2808
+ readonly primitive: "sphere";
2809
+ readonly transform: {
2810
+ readonly position: {
2811
+ readonly x: -0.8;
2812
+ readonly y: 0.5;
2813
+ readonly z: 0;
2814
+ };
2815
+ };
2816
+ }, {
2817
+ readonly id: "box";
2818
+ readonly kind: "primitive";
2819
+ readonly primitive: "box";
2820
+ readonly transform: {
2821
+ readonly position: {
2822
+ readonly x: 0.8;
2823
+ readonly y: 0.5;
2824
+ readonly z: 0;
2825
+ };
2826
+ };
2827
+ }];
2828
+ readonly materials: readonly [{
2829
+ readonly id: "ceramic";
2830
+ readonly creation: {
2831
+ readonly version: 1;
2832
+ readonly family: "pbr";
2833
+ readonly sharing: "shared";
2834
+ };
2835
+ readonly baseColor: {
2836
+ readonly r: 0.08;
2837
+ readonly g: 0.32;
2838
+ readonly b: 0.55;
2839
+ };
2840
+ readonly metallic: 0;
2841
+ readonly roughness: 0.35;
2842
+ }];
2843
+ readonly materialBindings: readonly [{
2844
+ readonly id: "sphere-ceramic";
2845
+ readonly materialId: "ceramic";
2846
+ readonly entityId: "sphere";
2847
+ }, {
2848
+ readonly id: "box-ceramic";
2849
+ readonly materialId: "ceramic";
2850
+ readonly entityId: "box";
2851
+ }];
2852
+ readonly camera: {
2853
+ readonly mode: "orbit";
2854
+ readonly position: {
2855
+ readonly x: 3;
2856
+ readonly y: 2.4;
2857
+ readonly z: -5;
2858
+ };
2859
+ readonly target: {
2860
+ readonly x: 0;
2861
+ readonly y: 0.5;
2862
+ readonly z: 0;
2863
+ };
2864
+ };
2865
+ readonly environment: {
2866
+ readonly enabled: false;
2867
+ readonly background: {
2868
+ readonly mode: "color";
2869
+ readonly color: "#202124";
2870
+ };
2871
+ };
2872
+ readonly lights: readonly [{
2873
+ readonly id: "fill";
2874
+ readonly type: "hemispheric";
2875
+ readonly enabled: true;
2876
+ readonly intensity: 1;
2877
+ readonly color: {
2878
+ readonly r: 1;
2879
+ readonly g: 1;
2880
+ readonly b: 1;
2881
+ };
2882
+ readonly rotation: {
2883
+ readonly x: -1.5707963267948966;
2884
+ readonly y: 0;
2885
+ readonly z: 0;
2886
+ };
2887
+ }];
2888
+ readonly postProcess: {
2889
+ readonly enabled: true;
2890
+ readonly antialiasing: "fxaa";
2891
+ readonly toneMappingEnabled: true;
2892
+ readonly toneMappingType: "aces";
2893
+ readonly exposure: 1;
2894
+ };
2895
+ };
2896
+ }];
2897
+ //# sourceMappingURL=example-gallery.d.ts.map