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