@deepblend/dsh-blender-contracts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/asset-content.js +134 -0
- package/lib/bitmap-font.js +149 -0
- package/lib/canonical.js +98 -0
- package/lib/config-surface.js +88 -0
- package/lib/contact-sheet.js +233 -0
- package/lib/deployment-paths.js +153 -0
- package/lib/index.js +829 -0
- package/lib/json-schema.js +337 -0
- package/lib/png.js +452 -0
- package/lib/projections.js +209 -0
- package/lib/redact.js +53 -0
- package/lib/render-job.js +459 -0
- package/lib/scene-patch.js +947 -0
- package/lib/scene-spec.js +901 -0
- package/lib/schemas/job-result.schema.json +295 -0
- package/lib/schemas/scene-patch.schema.json +1307 -0
- package/lib/schemas/scene-spec.schema.json +791 -0
- package/lib/ui-api.js +695 -0
- package/lib/visual-composition.js +574 -0
- package/lib/visual-issue.js +738 -0
- package/lib/visual-loop.js +401 -0
- package/package.json +19 -0
|
@@ -0,0 +1,791 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://deepblend.local/schemas/scene-spec.schema.json",
|
|
4
|
+
"title": "DeepBlend SceneSpec v1",
|
|
5
|
+
"description": "The structural source of truth for one DeepBlend scene (SPEC §8.1: 'SceneSpec 场景结构事实来源'). A .blend file is a compile artifact of this document, never the authority. Scenes are compiled from a SceneSpec and modified only through ScenePatch operations, so that every revision is diffable, replayable and auditable.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schemaVersion",
|
|
10
|
+
"project",
|
|
11
|
+
"entities",
|
|
12
|
+
"cameras",
|
|
13
|
+
"renderProfiles"
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"schemaVersion": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"const": "deepblend.scene/v1"
|
|
19
|
+
},
|
|
20
|
+
"project": {
|
|
21
|
+
"$ref": "#/$defs/project"
|
|
22
|
+
},
|
|
23
|
+
"assets": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"items": {
|
|
26
|
+
"$ref": "#/$defs/asset"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"materials": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": {
|
|
32
|
+
"$ref": "#/$defs/material"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"entities": {
|
|
36
|
+
"type": "array",
|
|
37
|
+
"items": {
|
|
38
|
+
"$ref": "#/$defs/entity"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"lights": {
|
|
42
|
+
"type": "array",
|
|
43
|
+
"items": {
|
|
44
|
+
"$ref": "#/$defs/light"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"cameras": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": {
|
|
50
|
+
"$ref": "#/$defs/camera"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"shots": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"items": {
|
|
56
|
+
"$ref": "#/$defs/shot"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"animationTracks": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"items": {
|
|
62
|
+
"$ref": "#/$defs/animationTrack"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"renderProfiles": {
|
|
66
|
+
"$ref": "#/$defs/renderProfiles"
|
|
67
|
+
},
|
|
68
|
+
"world": {
|
|
69
|
+
"$ref": "#/$defs/world"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"$defs": {
|
|
73
|
+
"id": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 1,
|
|
76
|
+
"maxLength": 64,
|
|
77
|
+
"pattern": "^[a-zA-Z][a-zA-Z0-9._-]*$"
|
|
78
|
+
},
|
|
79
|
+
"world": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"additionalProperties": false,
|
|
82
|
+
"description": "The scene's environment illumination: what fills every gap the geometry does not cover. This is the BACKGROUND a viewer sees behind the product, and `color`/`strength` are exactly Blender's World Background node. Omitting the whole block is legal and means the values below, which used to be a constant buried in the compiler (`deepblend_scene.py`) and were therefore unreachable from a SceneSpec: a brief asking for a black background could be honoured only by accident, with a backdrop plane, and any camera that saw past that plane found the hidden grey. An explicit black background is `{\"color\": [0, 0, 0, 1], \"strength\": 0}`.",
|
|
83
|
+
"properties": {
|
|
84
|
+
"color": {
|
|
85
|
+
"$ref": "#/$defs/unitColor",
|
|
86
|
+
"default": [0.02, 0.021, 0.026, 1]
|
|
87
|
+
},
|
|
88
|
+
"strength": {
|
|
89
|
+
"type": "number",
|
|
90
|
+
"minimum": 0,
|
|
91
|
+
"maximum": 1000,
|
|
92
|
+
"default": 0.6
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"vec3": {
|
|
97
|
+
"type": "array",
|
|
98
|
+
"minItems": 3,
|
|
99
|
+
"maxItems": 3,
|
|
100
|
+
"items": {
|
|
101
|
+
"type": "number"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"unitColor": {
|
|
105
|
+
"type": "array",
|
|
106
|
+
"minItems": 3,
|
|
107
|
+
"maxItems": 4,
|
|
108
|
+
"items": {
|
|
109
|
+
"type": "number",
|
|
110
|
+
"minimum": 0,
|
|
111
|
+
"maximum": 1
|
|
112
|
+
},
|
|
113
|
+
"description": "Linear RGB (3) or RGBA (4). Values are scene-linear, not sRGB display values."
|
|
114
|
+
},
|
|
115
|
+
"positiveNumber": {
|
|
116
|
+
"type": "number",
|
|
117
|
+
"exclusiveMinimum": 0
|
|
118
|
+
},
|
|
119
|
+
"nonNegativeNumber": {
|
|
120
|
+
"type": "number",
|
|
121
|
+
"minimum": 0
|
|
122
|
+
},
|
|
123
|
+
"project": {
|
|
124
|
+
"type": "object",
|
|
125
|
+
"additionalProperties": false,
|
|
126
|
+
"required": [
|
|
127
|
+
"id",
|
|
128
|
+
"title",
|
|
129
|
+
"fps",
|
|
130
|
+
"frameStart",
|
|
131
|
+
"frameEnd",
|
|
132
|
+
"aspectRatio"
|
|
133
|
+
],
|
|
134
|
+
"properties": {
|
|
135
|
+
"id": {
|
|
136
|
+
"$ref": "#/$defs/id"
|
|
137
|
+
},
|
|
138
|
+
"title": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"minLength": 1,
|
|
141
|
+
"maxLength": 200
|
|
142
|
+
},
|
|
143
|
+
"goal": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"maxLength": 2000,
|
|
146
|
+
"description": "The operator's natural-language brief. Retained verbatim for audit; it never affects compilation."
|
|
147
|
+
},
|
|
148
|
+
"units": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"enum": [
|
|
151
|
+
"metric",
|
|
152
|
+
"imperial"
|
|
153
|
+
],
|
|
154
|
+
"default": "metric"
|
|
155
|
+
},
|
|
156
|
+
"fps": {
|
|
157
|
+
"type": "number",
|
|
158
|
+
"exclusiveMinimum": 0,
|
|
159
|
+
"maximum": 240
|
|
160
|
+
},
|
|
161
|
+
"frameStart": {
|
|
162
|
+
"type": "integer",
|
|
163
|
+
"minimum": 0
|
|
164
|
+
},
|
|
165
|
+
"frameEnd": {
|
|
166
|
+
"type": "integer",
|
|
167
|
+
"minimum": 1
|
|
168
|
+
},
|
|
169
|
+
"aspectRatio": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"pattern": "^[0-9]+:[0-9]+$",
|
|
172
|
+
"description": "Informational for M1. Resolution is owned by the render profiles."
|
|
173
|
+
},
|
|
174
|
+
"activeCamera": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"description": "Camera id the animation is seen through. The active-camera view of a view plan renders this one; when absent the first declared camera is used."
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"license": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"additionalProperties": false,
|
|
183
|
+
"properties": {
|
|
184
|
+
"source": {
|
|
185
|
+
"type": "string",
|
|
186
|
+
"maxLength": 200
|
|
187
|
+
},
|
|
188
|
+
"commercialUse": {
|
|
189
|
+
"type": "boolean"
|
|
190
|
+
},
|
|
191
|
+
"attribution": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"maxLength": 500
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"asset": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"additionalProperties": false,
|
|
200
|
+
"required": [
|
|
201
|
+
"id",
|
|
202
|
+
"type",
|
|
203
|
+
"path"
|
|
204
|
+
],
|
|
205
|
+
"properties": {
|
|
206
|
+
"id": {
|
|
207
|
+
"$ref": "#/$defs/id"
|
|
208
|
+
},
|
|
209
|
+
"type": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"enum": [
|
|
212
|
+
"glb",
|
|
213
|
+
"gltf",
|
|
214
|
+
"fbx",
|
|
215
|
+
"obj",
|
|
216
|
+
"usd",
|
|
217
|
+
"blend"
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
"path": {
|
|
221
|
+
"type": "string",
|
|
222
|
+
"minLength": 1,
|
|
223
|
+
"description": "Project-relative POSIX path. Absolute paths and any '..' segment are rejected by the path guard (SPEC §15.2)."
|
|
224
|
+
},
|
|
225
|
+
"sha256": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
228
|
+
},
|
|
229
|
+
"license": {
|
|
230
|
+
"$ref": "#/$defs/license"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
"proceduralTexture": {
|
|
235
|
+
"type": "object",
|
|
236
|
+
"additionalProperties": false,
|
|
237
|
+
"required": [
|
|
238
|
+
"type",
|
|
239
|
+
"scale"
|
|
240
|
+
],
|
|
241
|
+
"description": "A procedural surface texture. A material with only scalar parameters renders as one flat colour, which is what makes paper, wood and glazed ceramic all read as plastic; this block adds the surface relief and variation that distinguishes them. It is built as a real node graph (texture coordinate -> mapping -> pattern -> bump / roughness / base colour), not a baked image, so it needs no asset ingest and stays resolution-independent.",
|
|
242
|
+
"properties": {
|
|
243
|
+
"type": {
|
|
244
|
+
"type": "string",
|
|
245
|
+
"enum": [
|
|
246
|
+
"noise",
|
|
247
|
+
"wave",
|
|
248
|
+
"voronoi"
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
"scale": {
|
|
252
|
+
"type": "number",
|
|
253
|
+
"exclusiveMinimum": 0,
|
|
254
|
+
"description": "Pattern density in object space. Larger is finer."
|
|
255
|
+
},
|
|
256
|
+
"detail": {
|
|
257
|
+
"type": "number",
|
|
258
|
+
"minimum": 0,
|
|
259
|
+
"maximum": 16
|
|
260
|
+
},
|
|
261
|
+
"distortion": {
|
|
262
|
+
"type": "number",
|
|
263
|
+
"minimum": 0
|
|
264
|
+
},
|
|
265
|
+
"stretch": {
|
|
266
|
+
"type": "array",
|
|
267
|
+
"minItems": 3,
|
|
268
|
+
"maxItems": 3,
|
|
269
|
+
"items": {
|
|
270
|
+
"type": "number",
|
|
271
|
+
"exclusiveMinimum": 0
|
|
272
|
+
},
|
|
273
|
+
"description": "Per-axis multiplier on the mapping, so a grain can run along one direction (wood) instead of being isotropic."
|
|
274
|
+
},
|
|
275
|
+
"bump": {
|
|
276
|
+
"type": "number",
|
|
277
|
+
"minimum": 0,
|
|
278
|
+
"maximum": 1,
|
|
279
|
+
"description": "Strength of the normal perturbation. 0 leaves the surface smooth."
|
|
280
|
+
},
|
|
281
|
+
"roughnessVariation": {
|
|
282
|
+
"type": "number",
|
|
283
|
+
"minimum": 0,
|
|
284
|
+
"maximum": 1,
|
|
285
|
+
"description": "How far the pattern swings roughness around its authored value, which is what breaks a highlight up instead of letting it read as plastic."
|
|
286
|
+
},
|
|
287
|
+
"colorVariation": {
|
|
288
|
+
"type": "number",
|
|
289
|
+
"minimum": 0,
|
|
290
|
+
"maximum": 1,
|
|
291
|
+
"description": "How strongly the pattern darkens the base colour."
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
"material": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"additionalProperties": false,
|
|
298
|
+
"required": [
|
|
299
|
+
"id",
|
|
300
|
+
"shader"
|
|
301
|
+
],
|
|
302
|
+
"properties": {
|
|
303
|
+
"id": {
|
|
304
|
+
"$ref": "#/$defs/id"
|
|
305
|
+
},
|
|
306
|
+
"shader": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"enum": [
|
|
309
|
+
"principled",
|
|
310
|
+
"emission",
|
|
311
|
+
"glass"
|
|
312
|
+
]
|
|
313
|
+
},
|
|
314
|
+
"parameters": {
|
|
315
|
+
"type": "object",
|
|
316
|
+
"additionalProperties": false,
|
|
317
|
+
"properties": {
|
|
318
|
+
"baseColor": {
|
|
319
|
+
"$ref": "#/$defs/unitColor"
|
|
320
|
+
},
|
|
321
|
+
"metallic": {
|
|
322
|
+
"type": "number",
|
|
323
|
+
"minimum": 0,
|
|
324
|
+
"maximum": 1
|
|
325
|
+
},
|
|
326
|
+
"roughness": {
|
|
327
|
+
"type": "number",
|
|
328
|
+
"minimum": 0,
|
|
329
|
+
"maximum": 1
|
|
330
|
+
},
|
|
331
|
+
"ior": {
|
|
332
|
+
"type": "number",
|
|
333
|
+
"exclusiveMinimum": 0,
|
|
334
|
+
"maximum": 5
|
|
335
|
+
},
|
|
336
|
+
"alpha": {
|
|
337
|
+
"type": "number",
|
|
338
|
+
"minimum": 0,
|
|
339
|
+
"maximum": 1
|
|
340
|
+
},
|
|
341
|
+
"emissionColor": {
|
|
342
|
+
"$ref": "#/$defs/unitColor"
|
|
343
|
+
},
|
|
344
|
+
"emissionStrength": {
|
|
345
|
+
"$ref": "#/$defs/nonNegativeNumber"
|
|
346
|
+
},
|
|
347
|
+
"coatWeight": {
|
|
348
|
+
"type": "number",
|
|
349
|
+
"minimum": 0,
|
|
350
|
+
"maximum": 1
|
|
351
|
+
},
|
|
352
|
+
"transmissionWeight": {
|
|
353
|
+
"type": "number",
|
|
354
|
+
"minimum": 0,
|
|
355
|
+
"maximum": 1
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
"texture": {
|
|
360
|
+
"$ref": "#/$defs/proceduralTexture"
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"transform": {
|
|
365
|
+
"type": "object",
|
|
366
|
+
"additionalProperties": false,
|
|
367
|
+
"properties": {
|
|
368
|
+
"location": {
|
|
369
|
+
"$ref": "#/$defs/vec3"
|
|
370
|
+
},
|
|
371
|
+
"rotationEuler": {
|
|
372
|
+
"$ref": "#/$defs/vec3",
|
|
373
|
+
"description": "Radians, XYZ Euler order, matching bpy's rotation_euler."
|
|
374
|
+
},
|
|
375
|
+
"scale": {
|
|
376
|
+
"$ref": "#/$defs/vec3"
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"generator": {
|
|
381
|
+
"type": "object",
|
|
382
|
+
"additionalProperties": false,
|
|
383
|
+
"required": [
|
|
384
|
+
"shape"
|
|
385
|
+
],
|
|
386
|
+
"description": "Procedural proxy geometry. M1 has no asset-ingest action yet, so fixtures build their hero objects from generators; asset-instance entities take over as the primary path once blender_asset_ingest lands (SPEC §11).",
|
|
387
|
+
"properties": {
|
|
388
|
+
"shape": {
|
|
389
|
+
"type": "string",
|
|
390
|
+
"enum": [
|
|
391
|
+
"cube",
|
|
392
|
+
"uv_sphere",
|
|
393
|
+
"cylinder",
|
|
394
|
+
"cone",
|
|
395
|
+
"plane",
|
|
396
|
+
"torus",
|
|
397
|
+
"rounded_box"
|
|
398
|
+
]
|
|
399
|
+
},
|
|
400
|
+
"size": {
|
|
401
|
+
"$ref": "#/$defs/positiveNumber"
|
|
402
|
+
},
|
|
403
|
+
"radius": {
|
|
404
|
+
"$ref": "#/$defs/positiveNumber"
|
|
405
|
+
},
|
|
406
|
+
"depth": {
|
|
407
|
+
"$ref": "#/$defs/positiveNumber"
|
|
408
|
+
},
|
|
409
|
+
"segments": {
|
|
410
|
+
"type": "integer",
|
|
411
|
+
"minimum": 3,
|
|
412
|
+
"maximum": 512
|
|
413
|
+
},
|
|
414
|
+
"ringCount": {
|
|
415
|
+
"type": "integer",
|
|
416
|
+
"minimum": 3,
|
|
417
|
+
"maximum": 512
|
|
418
|
+
},
|
|
419
|
+
"majorRadius": {
|
|
420
|
+
"$ref": "#/$defs/positiveNumber"
|
|
421
|
+
},
|
|
422
|
+
"minorRadius": {
|
|
423
|
+
"$ref": "#/$defs/positiveNumber"
|
|
424
|
+
},
|
|
425
|
+
"bevel": {
|
|
426
|
+
"type": "object",
|
|
427
|
+
"additionalProperties": false,
|
|
428
|
+
"properties": {
|
|
429
|
+
"width": {
|
|
430
|
+
"$ref": "#/$defs/positiveNumber"
|
|
431
|
+
},
|
|
432
|
+
"segments": {
|
|
433
|
+
"type": "integer",
|
|
434
|
+
"minimum": 1,
|
|
435
|
+
"maximum": 16
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
"entity": {
|
|
442
|
+
"type": "object",
|
|
443
|
+
"additionalProperties": false,
|
|
444
|
+
"required": [
|
|
445
|
+
"id",
|
|
446
|
+
"type"
|
|
447
|
+
],
|
|
448
|
+
"properties": {
|
|
449
|
+
"id": {
|
|
450
|
+
"$ref": "#/$defs/id"
|
|
451
|
+
},
|
|
452
|
+
"type": {
|
|
453
|
+
"type": "string",
|
|
454
|
+
"enum": [
|
|
455
|
+
"asset-instance",
|
|
456
|
+
"generator",
|
|
457
|
+
"empty"
|
|
458
|
+
]
|
|
459
|
+
},
|
|
460
|
+
"assetId": {
|
|
461
|
+
"type": "string",
|
|
462
|
+
"description": "Required when type is asset-instance."
|
|
463
|
+
},
|
|
464
|
+
"generator": {
|
|
465
|
+
"$ref": "#/$defs/generator"
|
|
466
|
+
},
|
|
467
|
+
"materialId": {
|
|
468
|
+
"type": "string",
|
|
469
|
+
"description": "Material applied to this entity's generated mesh."
|
|
470
|
+
},
|
|
471
|
+
"transform": {
|
|
472
|
+
"$ref": "#/$defs/transform"
|
|
473
|
+
},
|
|
474
|
+
"tags": {
|
|
475
|
+
"type": "array",
|
|
476
|
+
"items": {
|
|
477
|
+
"type": "string",
|
|
478
|
+
"maxLength": 64
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
"locked": {
|
|
482
|
+
"type": "boolean",
|
|
483
|
+
"description": "A locked entity may still be patched explicitly, but the orchestrator must not propose changes to it autonomously (SPEC §12)."
|
|
484
|
+
},
|
|
485
|
+
"visible": {
|
|
486
|
+
"type": "boolean"
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
"light": {
|
|
491
|
+
"type": "object",
|
|
492
|
+
"additionalProperties": false,
|
|
493
|
+
"required": [
|
|
494
|
+
"id",
|
|
495
|
+
"type"
|
|
496
|
+
],
|
|
497
|
+
"properties": {
|
|
498
|
+
"id": {
|
|
499
|
+
"$ref": "#/$defs/id"
|
|
500
|
+
},
|
|
501
|
+
"type": {
|
|
502
|
+
"type": "string",
|
|
503
|
+
"enum": [
|
|
504
|
+
"area",
|
|
505
|
+
"point",
|
|
506
|
+
"spot",
|
|
507
|
+
"sun"
|
|
508
|
+
]
|
|
509
|
+
},
|
|
510
|
+
"transform": {
|
|
511
|
+
"$ref": "#/$defs/transform"
|
|
512
|
+
},
|
|
513
|
+
"energy": {
|
|
514
|
+
"$ref": "#/$defs/nonNegativeNumber"
|
|
515
|
+
},
|
|
516
|
+
"color": {
|
|
517
|
+
"$ref": "#/$defs/unitColor"
|
|
518
|
+
},
|
|
519
|
+
"size": {
|
|
520
|
+
"$ref": "#/$defs/positiveNumber",
|
|
521
|
+
"description": "area: light radius; point/spot: shadow soft size."
|
|
522
|
+
},
|
|
523
|
+
"spotSize": {
|
|
524
|
+
"type": "number",
|
|
525
|
+
"exclusiveMinimum": 0,
|
|
526
|
+
"maximum": 3.14159265358979
|
|
527
|
+
},
|
|
528
|
+
"spotBlend": {
|
|
529
|
+
"type": "number",
|
|
530
|
+
"minimum": 0,
|
|
531
|
+
"maximum": 1
|
|
532
|
+
},
|
|
533
|
+
"angle": {
|
|
534
|
+
"type": "number",
|
|
535
|
+
"exclusiveMinimum": 0,
|
|
536
|
+
"maximum": 3.14159265358979
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"camera": {
|
|
541
|
+
"type": "object",
|
|
542
|
+
"additionalProperties": false,
|
|
543
|
+
"required": [
|
|
544
|
+
"id"
|
|
545
|
+
],
|
|
546
|
+
"properties": {
|
|
547
|
+
"id": {
|
|
548
|
+
"$ref": "#/$defs/id"
|
|
549
|
+
},
|
|
550
|
+
"role": {
|
|
551
|
+
"type": "string",
|
|
552
|
+
"enum": [
|
|
553
|
+
"active-camera",
|
|
554
|
+
"three-quarter",
|
|
555
|
+
"top",
|
|
556
|
+
"detail"
|
|
557
|
+
],
|
|
558
|
+
"description": "What this camera is FOR. A view plan assigns roles to cameras by name (active camera, 45-degree, top-down, subject close-up) and falls back to declaration order, so a role is what makes a multi-view plan reproducible rather than positional."
|
|
559
|
+
},
|
|
560
|
+
"lens": {
|
|
561
|
+
"$ref": "#/$defs/positiveNumber"
|
|
562
|
+
},
|
|
563
|
+
"sensorWidth": {
|
|
564
|
+
"$ref": "#/$defs/positiveNumber"
|
|
565
|
+
},
|
|
566
|
+
"clipping": {
|
|
567
|
+
"type": "array",
|
|
568
|
+
"minItems": 2,
|
|
569
|
+
"maxItems": 2,
|
|
570
|
+
"items": {
|
|
571
|
+
"$ref": "#/$defs/positiveNumber"
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
"transform": {
|
|
575
|
+
"$ref": "#/$defs/transform",
|
|
576
|
+
"description": "Camera position. When `targetEntityId` or `targetPoint` is present the rotation is DERIVED by aiming -Z at the target, so a hand-written rotationEuler is ignored (and is reported as a validation notice)."
|
|
577
|
+
},
|
|
578
|
+
"targetEntityId": {
|
|
579
|
+
"type": "string"
|
|
580
|
+
},
|
|
581
|
+
"targetPoint": {
|
|
582
|
+
"$ref": "#/$defs/vec3"
|
|
583
|
+
},
|
|
584
|
+
"fStop": {
|
|
585
|
+
"$ref": "#/$defs/positiveNumber"
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
},
|
|
589
|
+
"shot": {
|
|
590
|
+
"type": "object",
|
|
591
|
+
"additionalProperties": false,
|
|
592
|
+
"required": [
|
|
593
|
+
"id",
|
|
594
|
+
"cameraId"
|
|
595
|
+
],
|
|
596
|
+
"properties": {
|
|
597
|
+
"id": {
|
|
598
|
+
"$ref": "#/$defs/id"
|
|
599
|
+
},
|
|
600
|
+
"cameraId": {
|
|
601
|
+
"type": "string"
|
|
602
|
+
},
|
|
603
|
+
"frameRange": {
|
|
604
|
+
"type": "array",
|
|
605
|
+
"minItems": 2,
|
|
606
|
+
"maxItems": 2,
|
|
607
|
+
"items": {
|
|
608
|
+
"type": "integer",
|
|
609
|
+
"minimum": 0
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
"description": {
|
|
613
|
+
"type": "string",
|
|
614
|
+
"maxLength": 1000
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
"animationKeyframe": {
|
|
619
|
+
"type": "object",
|
|
620
|
+
"additionalProperties": false,
|
|
621
|
+
"required": [
|
|
622
|
+
"frame",
|
|
623
|
+
"value"
|
|
624
|
+
],
|
|
625
|
+
"properties": {
|
|
626
|
+
"frame": {
|
|
627
|
+
"type": "integer",
|
|
628
|
+
"minimum": 0
|
|
629
|
+
},
|
|
630
|
+
"value": {
|
|
631
|
+
"type": "number"
|
|
632
|
+
},
|
|
633
|
+
"interpolation": {
|
|
634
|
+
"type": "string",
|
|
635
|
+
"enum": [
|
|
636
|
+
"constant",
|
|
637
|
+
"linear",
|
|
638
|
+
"bezier",
|
|
639
|
+
"ease_in",
|
|
640
|
+
"ease_out",
|
|
641
|
+
"ease_in_out"
|
|
642
|
+
]
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
"animationTrack": {
|
|
647
|
+
"type": "object",
|
|
648
|
+
"additionalProperties": false,
|
|
649
|
+
"required": [
|
|
650
|
+
"id",
|
|
651
|
+
"targetEntityId",
|
|
652
|
+
"property",
|
|
653
|
+
"keyframes"
|
|
654
|
+
],
|
|
655
|
+
"properties": {
|
|
656
|
+
"id": {
|
|
657
|
+
"$ref": "#/$defs/id"
|
|
658
|
+
},
|
|
659
|
+
"targetKind": {
|
|
660
|
+
"type": "string",
|
|
661
|
+
"enum": ["entity", "camera", "material"],
|
|
662
|
+
"default": "entity",
|
|
663
|
+
"description": "What `targetEntityId` names: an entity (default), a camera, or a material. Only entity tracks existed before, which is why \"the camera orbits the product\" and \"the dial lights up\" both had to be faked with entity transforms."
|
|
664
|
+
},
|
|
665
|
+
"targetEntityId": {
|
|
666
|
+
"type": "string",
|
|
667
|
+
"description": "The id of the target named by `targetKind`. The field name says Entity because every track written before target kinds existed used it and revisions are immutable; renaming it would make r0001-r0023 unreadable. Resolution is against the collection `targetKind` names, which matters because ids are unique per collection, not globally."
|
|
668
|
+
},
|
|
669
|
+
"property": {
|
|
670
|
+
"type": "string",
|
|
671
|
+
"enum": [
|
|
672
|
+
"location.x",
|
|
673
|
+
"location.y",
|
|
674
|
+
"location.z",
|
|
675
|
+
"rotationEuler.x",
|
|
676
|
+
"rotationEuler.y",
|
|
677
|
+
"rotationEuler.z",
|
|
678
|
+
"scale.x",
|
|
679
|
+
"scale.y",
|
|
680
|
+
"scale.z",
|
|
681
|
+
"emissionStrength",
|
|
682
|
+
"roughness",
|
|
683
|
+
"metallic",
|
|
684
|
+
"ior",
|
|
685
|
+
"alpha",
|
|
686
|
+
"coatWeight",
|
|
687
|
+
"transmissionWeight",
|
|
688
|
+
"baseColor.r",
|
|
689
|
+
"baseColor.g",
|
|
690
|
+
"baseColor.b",
|
|
691
|
+
"emissionColor.r",
|
|
692
|
+
"emissionColor.g",
|
|
693
|
+
"emissionColor.b"
|
|
694
|
+
],
|
|
695
|
+
"description": "The channel to animate. Transform channels apply to entities and cameras; material parameters apply to materials and use the same names `material.parameter.update` takes."
|
|
696
|
+
},
|
|
697
|
+
"keyframes": {
|
|
698
|
+
"type": "array",
|
|
699
|
+
"minItems": 2,
|
|
700
|
+
"items": {
|
|
701
|
+
"$ref": "#/$defs/animationKeyframe"
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
},
|
|
706
|
+
"renderProfile": {
|
|
707
|
+
"type": "object",
|
|
708
|
+
"additionalProperties": false,
|
|
709
|
+
"required": [
|
|
710
|
+
"engine",
|
|
711
|
+
"resolution"
|
|
712
|
+
],
|
|
713
|
+
"properties": {
|
|
714
|
+
"engine": {
|
|
715
|
+
"type": "string",
|
|
716
|
+
"enum": [
|
|
717
|
+
"eevee",
|
|
718
|
+
"cycles",
|
|
719
|
+
"workbench"
|
|
720
|
+
]
|
|
721
|
+
},
|
|
722
|
+
"resolution": {
|
|
723
|
+
"type": "array",
|
|
724
|
+
"minItems": 2,
|
|
725
|
+
"maxItems": 2,
|
|
726
|
+
"items": {
|
|
727
|
+
"type": "integer",
|
|
728
|
+
"minimum": 16,
|
|
729
|
+
"maximum": 16384
|
|
730
|
+
}
|
|
731
|
+
},
|
|
732
|
+
"samples": {
|
|
733
|
+
"type": "integer",
|
|
734
|
+
"minimum": 1,
|
|
735
|
+
"maximum": 8192
|
|
736
|
+
},
|
|
737
|
+
"filmTransparent": {
|
|
738
|
+
"type": "boolean"
|
|
739
|
+
},
|
|
740
|
+
"raytracing": {
|
|
741
|
+
"type": "boolean",
|
|
742
|
+
"description": "EEVEE only: enable the raytracing pipeline (screen-space GI, ambient occlusion and reflections). EEVEE defaults this OFF, which renders every surface lit only by direct light - objects lose their contact shadow and appear to float. Ignored by engines that have no such switch."
|
|
743
|
+
},
|
|
744
|
+
"colorManagement": {
|
|
745
|
+
"type": "object",
|
|
746
|
+
"additionalProperties": false,
|
|
747
|
+
"properties": {
|
|
748
|
+
"viewTransform": {
|
|
749
|
+
"type": "string",
|
|
750
|
+
"enum": [
|
|
751
|
+
"Standard",
|
|
752
|
+
"AgX",
|
|
753
|
+
"Filmic",
|
|
754
|
+
"False Color",
|
|
755
|
+
"Raw"
|
|
756
|
+
]
|
|
757
|
+
},
|
|
758
|
+
"look": {
|
|
759
|
+
"type": "string"
|
|
760
|
+
},
|
|
761
|
+
"exposure": {
|
|
762
|
+
"type": "number",
|
|
763
|
+
"minimum": -10,
|
|
764
|
+
"maximum": 10
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
},
|
|
768
|
+
"maxSamplesBudget": {
|
|
769
|
+
"type": "integer",
|
|
770
|
+
"minimum": 1,
|
|
771
|
+
"description": "Upper bound a render action may use. Guards the render-cost threshold of SPEC §15.4."
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
},
|
|
775
|
+
"renderProfiles": {
|
|
776
|
+
"type": "object",
|
|
777
|
+
"additionalProperties": false,
|
|
778
|
+
"required": [
|
|
779
|
+
"preview"
|
|
780
|
+
],
|
|
781
|
+
"properties": {
|
|
782
|
+
"preview": {
|
|
783
|
+
"$ref": "#/$defs/renderProfile"
|
|
784
|
+
},
|
|
785
|
+
"final": {
|
|
786
|
+
"$ref": "#/$defs/renderProfile"
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
}
|