@flighthq/scene-document 0.4.1-next.109.0f3397e → 0.4.1-next.200.8e568d5
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 +2 -2
- package/dist/sceneDocumentScene3DMaterialization.d.ts.map +1 -1
- package/dist/sceneDocumentScene3DMaterialization.js +73 -20
- package/dist/sceneDocumentScene3DMaterialization.js.map +1 -1
- package/package.json +10 -9
- package/src/sceneDocumentScene3DMaterialization.test.ts +156 -5
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/scene-document`. The
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/scene-document@0.4.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/scene-document@0.4.1-next.200.8e568d5](https://github.com/flighthq/flight/tree/8e568d54191966026e2e03febb7282be8abc99d0/packages/scene-document)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/8e568d54191966026e2e03febb7282be8abc99d0/LICENSE.md)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneDocumentScene3DMaterialization.d.ts","sourceRoot":"","sources":["../src/sceneDocumentScene3DMaterialization.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sceneDocumentScene3DMaterialization.d.ts","sourceRoot":"","sources":["../src/sceneDocumentScene3DMaterialization.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAEV,cAAc,EAId,gCAAgC,EAGhC,sCAAsC,EACtC,qBAAqB,EACrB,oCAAoC,EACpC,4BAA4B,EAG5B,OAAO,EAEP,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EACzB,OAAO,EAAE,SAAS,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EACnD,MAAM,EAAE,SAAS,QAAQ,CAAC,oBAAoB,CAAC,EAAE,EACjD,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAC9C,qBAAqB,CAOvB;AAED,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,SAAS,CAAC,EAAE,QAAQ,CAAC,sCAAsC,CAAC,EAC5D,UAAU,GAAE,MAA8B,GACzC,oCAAoC,GAAG,IAAI,CAkB7C;AAED,wBAAgB,kDAAkD,CAChE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,SAAS,CAAC,EAAE,QAAQ,CAAC,sCAAsC,CAAC,EAC5D,UAAU,CAAC,EAAE,MAAM,GAClB,oCAAoC,GAAG,IAAI,CAI7C;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,UAAU,GAAE,MAA8B,GACzC,gCAAgC,GAAG,IAAI,CASzC;AAED,wBAAgB,2CAA2C,CACzD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,UAAU,CAAC,EAAE,MAAM,GAClB,gCAAgC,GAAG,IAAI,CAIzC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createCamera3D } from '@flighthq/camera/contract';
|
|
1
|
+
import { createCamera3D, setCamera3DViewMatrix4FromMatrix4 } from '@flighthq/camera/contract';
|
|
2
2
|
import { getEntityRuntime } from '@flighthq/entity/contract';
|
|
3
|
-
import {
|
|
4
|
-
import { addNodeChild, getNodeChildren } from '@flighthq/node/contract';
|
|
3
|
+
import { acquireMatrix4, composeMatrix4FromTransform3D, createTransform3D, decomposeMatrix4ToTransform3D, inverseMatrix4, releaseMatrix4, } from '@flighthq/geometry/contract';
|
|
4
|
+
import { addNodeChild, getNodeChildren, getNodeWorldMatrix4 } from '@flighthq/node/contract';
|
|
5
5
|
import { getRegistryTableEntry } from '@flighthq/registry/contract';
|
|
6
|
-
import { createScene3D } from '@flighthq/scene3d/contract';
|
|
6
|
+
import { createScene3D, createScene3DLightsFromDocument } from '@flighthq/scene3d/contract';
|
|
7
7
|
import { AmbientLightKind, DirectionalLightKind, FlightDocumentRefusalReason, Node3DTraitsKey, } from '@flighthq/types/contract';
|
|
8
8
|
import { explainFlightDocumentText, parseFlightDocumentText } from './flightDocumentText';
|
|
9
9
|
import { selectFlightDocumentScene } from './sceneDocumentMaterializationSelection';
|
|
@@ -34,8 +34,9 @@ export function createFlightDocumentScene3DMaterialization(document, schemas, re
|
|
|
34
34
|
if (!adoptDocumentRoot3D(scene, documentScene.scene, schemas, resources))
|
|
35
35
|
return null;
|
|
36
36
|
materializeChildren(scene.root, documentScene.scene.children, schemas, resources);
|
|
37
|
-
const
|
|
38
|
-
const
|
|
37
|
+
const materializedNodes = getMaterializedNodes(scene.root);
|
|
38
|
+
const cameras = materializeCameras(documentScene.cameras, materializedNodes);
|
|
39
|
+
const lights = materializeLights(documentScene.lights, materializedNodes);
|
|
39
40
|
return { cameras, lights, scene };
|
|
40
41
|
}
|
|
41
42
|
export function createFlightDocumentScene3DMaterializationFromText(text, schemas, resolvers, sceneIndex) {
|
|
@@ -83,12 +84,72 @@ function checkDuplicateLights(lights, sceneIndex) {
|
|
|
83
84
|
}
|
|
84
85
|
return null;
|
|
85
86
|
}
|
|
86
|
-
function materializeCameras(cameras) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
function materializeCameras(cameras, materializedNodes) {
|
|
88
|
+
const placement = acquireMatrix4();
|
|
89
|
+
const view = acquireMatrix4();
|
|
90
|
+
const out = [];
|
|
91
|
+
for (const source of cameras) {
|
|
92
|
+
const camera = createCamera3D({
|
|
93
|
+
far: source.far,
|
|
94
|
+
near: source.near,
|
|
95
|
+
projection: source.projection,
|
|
96
|
+
});
|
|
97
|
+
const boundNode = getBoundMaterializedNode(source.node, materializedNodes);
|
|
98
|
+
if (boundNode === null) {
|
|
99
|
+
composeMatrix4FromTransform3D(placement, source.transform);
|
|
100
|
+
if (inverseMatrix4(view, placement))
|
|
101
|
+
setCamera3DViewMatrix4FromMatrix4(camera, view);
|
|
102
|
+
}
|
|
103
|
+
else if (inverseMatrix4(view, getNodeWorldMatrix4(boundNode))) {
|
|
104
|
+
setCamera3DViewMatrix4FromMatrix4(camera, view);
|
|
105
|
+
}
|
|
106
|
+
out.push(camera);
|
|
107
|
+
}
|
|
108
|
+
releaseMatrix4(view);
|
|
109
|
+
releaseMatrix4(placement);
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
function getBoundMaterializedNode(index, materializedNodes) {
|
|
113
|
+
if (index === undefined || !Number.isInteger(index) || index < 0)
|
|
114
|
+
return null;
|
|
115
|
+
return materializedNodes[index] ?? null;
|
|
116
|
+
}
|
|
117
|
+
// Scene3DDocument binding indices address a flat node table. A Flight document stores the same logical
|
|
118
|
+
// population as a nested tree, so flatten it in the binary format's depth-first order, including the scene
|
|
119
|
+
// root at index zero. Keeping this derivation separate from node creation lets the root materializer own how
|
|
120
|
+
// that root is instantiated without creating a second placement model here.
|
|
121
|
+
function getMaterializedNodes(root) {
|
|
122
|
+
const out = [];
|
|
123
|
+
appendMaterializedNodes(out, root);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
function appendMaterializedNodes(out, node) {
|
|
127
|
+
out.push(node);
|
|
128
|
+
for (const child of getNodeChildren(node))
|
|
129
|
+
appendMaterializedNodes(out, child);
|
|
130
|
+
}
|
|
131
|
+
function materializeLights(lights, materializedNodes) {
|
|
132
|
+
const resolvedLights = lights.map((source) => {
|
|
133
|
+
const boundNode = getBoundMaterializedNode(source.node, materializedNodes);
|
|
134
|
+
if (boundNode === null)
|
|
135
|
+
return { ...source };
|
|
136
|
+
const transform = createTransform3D();
|
|
137
|
+
decomposeMatrix4ToTransform3D(transform, getNodeWorldMatrix4(boundNode));
|
|
138
|
+
return { ...source, transform };
|
|
139
|
+
});
|
|
140
|
+
const document = {
|
|
141
|
+
animations: [],
|
|
142
|
+
cameras: [],
|
|
143
|
+
lights: resolvedLights,
|
|
144
|
+
materials: [],
|
|
145
|
+
meshes: [],
|
|
146
|
+
metadata: null,
|
|
147
|
+
nodes: [],
|
|
148
|
+
resources: [],
|
|
149
|
+
scenes: [],
|
|
150
|
+
skins: [],
|
|
151
|
+
};
|
|
152
|
+
return createScene3DLightsFromDocument(document);
|
|
92
153
|
}
|
|
93
154
|
function materializeChildren(parent, children, schemas, resources) {
|
|
94
155
|
for (const child of children) {
|
|
@@ -102,14 +163,6 @@ function materializeChildren(parent, children, schemas, resources) {
|
|
|
102
163
|
materializeChildren(node, child.children, schemas, resources);
|
|
103
164
|
}
|
|
104
165
|
}
|
|
105
|
-
function materializeLights(lights) {
|
|
106
|
-
const ambientEntry = lights.find((l) => l.descriptor.kind === AmbientLightKind);
|
|
107
|
-
const directionalEntry = lights.find((l) => l.descriptor.kind === DirectionalLightKind);
|
|
108
|
-
return createScene3DLights({
|
|
109
|
-
ambient: ambientEntry !== undefined ? ambientEntry.descriptor : null,
|
|
110
|
-
directional: directionalEntry !== undefined ? directionalEntry.descriptor : null,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
166
|
function resolveResources(descriptors, resolvers) {
|
|
114
167
|
const out = {};
|
|
115
168
|
if (resolvers === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneDocumentScene3DMaterialization.js","sourceRoot":"","sources":["../src/sceneDocumentScene3DMaterialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"sceneDocumentScene3DMaterialization.js","sourceRoot":"","sources":["../src/sceneDocumentScene3DMaterialization.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene-document",
|
|
3
|
-
"version": "0.4.1-next.
|
|
3
|
+
"version": "0.4.1-next.200.8e568d5",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,14 +38,15 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/camera": "0.4.1-next.
|
|
42
|
-
"@flighthq/
|
|
43
|
-
"@flighthq/
|
|
44
|
-
"@flighthq/
|
|
45
|
-
"@flighthq/
|
|
46
|
-
"@flighthq/
|
|
47
|
-
"@flighthq/
|
|
48
|
-
"@flighthq/
|
|
41
|
+
"@flighthq/camera": "0.4.1-next.200.8e568d5",
|
|
42
|
+
"@flighthq/entity": "0.4.1-next.200.8e568d5",
|
|
43
|
+
"@flighthq/geometry": "0.4.1-next.200.8e568d5",
|
|
44
|
+
"@flighthq/lighting": "0.4.1-next.200.8e568d5",
|
|
45
|
+
"@flighthq/node": "0.4.1-next.200.8e568d5",
|
|
46
|
+
"@flighthq/registry": "0.4.1-next.200.8e568d5",
|
|
47
|
+
"@flighthq/scene2d": "0.4.1-next.200.8e568d5",
|
|
48
|
+
"@flighthq/scene3d": "0.4.1-next.200.8e568d5",
|
|
49
|
+
"@flighthq/types": "0.4.1-next.200.8e568d5"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
52
|
"@flighthq/camera": "*",
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import { createTransform3D } from '@flighthq/geometry/contract';
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { createTransform3D, createVector3, setQuaternionFromAxisAngle } from '@flighthq/geometry/contract';
|
|
2
|
+
import {
|
|
3
|
+
createAmbientLight,
|
|
4
|
+
createDirectionalLight,
|
|
5
|
+
createHemisphereLight,
|
|
6
|
+
createPointLight,
|
|
7
|
+
createSpotLight,
|
|
8
|
+
} from '@flighthq/lighting/contract';
|
|
9
|
+
import { getNodeChildren, invalidateNodeLocalTransform } from '@flighthq/node/contract';
|
|
4
10
|
import { createKeyedTable, withRegistryTableEntry } from '@flighthq/registry/contract';
|
|
5
11
|
import { createDisplayObject } from '@flighthq/scene2d/contract';
|
|
6
12
|
import { createNode3D, createScene3D } from '@flighthq/scene3d/contract';
|
|
@@ -13,7 +19,9 @@ import type {
|
|
|
13
19
|
FlightDocumentScene,
|
|
14
20
|
FlightDocumentScene3DMaterialization,
|
|
15
21
|
FlightDocumentSchemaRegistry,
|
|
22
|
+
Light,
|
|
16
23
|
NodeAny,
|
|
24
|
+
Scene3DLightsLike,
|
|
17
25
|
Scene3DDocumentCamera,
|
|
18
26
|
Scene3DDocumentLight,
|
|
19
27
|
} from '@flighthq/types/contract';
|
|
@@ -110,6 +118,122 @@ describe('createFlightDocumentScene3DMaterialization', () => {
|
|
|
110
118
|
expect(materialization.cameras[0].projection.kind).toBe('perspective');
|
|
111
119
|
});
|
|
112
120
|
|
|
121
|
+
it('applies authored camera placement to the runtime view matrix', () => {
|
|
122
|
+
const transform = createTransform3D();
|
|
123
|
+
transform.position.x = 7;
|
|
124
|
+
const document = createTestDocument({
|
|
125
|
+
cameras: [
|
|
126
|
+
{
|
|
127
|
+
far: 500,
|
|
128
|
+
near: 0.5,
|
|
129
|
+
projection: { aspect: 1.77, fovY: 1.047, kind: 'perspective' },
|
|
130
|
+
transform,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
kind: 'Scene3D',
|
|
134
|
+
lights: [],
|
|
135
|
+
scene: { children: [], fields: {}, kind: Node3DKind },
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const result = createFlightDocumentScene3DMaterialization(document, createTestSchemas());
|
|
139
|
+
|
|
140
|
+
expect(result?.cameras[0].view.m[12]).toBe(-7);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('applies a bound depth-first node placement to the runtime camera', () => {
|
|
144
|
+
const transform = createTransform3D();
|
|
145
|
+
transform.position.x = 7;
|
|
146
|
+
const document = createTestDocument({
|
|
147
|
+
cameras: [
|
|
148
|
+
{
|
|
149
|
+
far: 500,
|
|
150
|
+
near: 0.5,
|
|
151
|
+
node: 2,
|
|
152
|
+
projection: { aspect: 1.77, fovY: 1.047, kind: 'perspective' },
|
|
153
|
+
transform,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
kind: 'Scene3D',
|
|
157
|
+
lights: [],
|
|
158
|
+
scene: {
|
|
159
|
+
children: [
|
|
160
|
+
{
|
|
161
|
+
children: [{ children: [], fields: { positionX: 3 }, kind: Node3DKind }],
|
|
162
|
+
fields: { positionX: 2 },
|
|
163
|
+
kind: Node3DKind,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
fields: {},
|
|
167
|
+
kind: Node3DKind,
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const result = createFlightDocumentScene3DMaterialization(document, createTestSchemas());
|
|
172
|
+
|
|
173
|
+
expect(result?.cameras[0].view.m[12]).toBe(-5);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('preserves the source-derived representable light population and authored placement', () => {
|
|
177
|
+
const transform = createTransform3D();
|
|
178
|
+
transform.position.x = 10;
|
|
179
|
+
transform.position.y = 20;
|
|
180
|
+
transform.position.z = 30;
|
|
181
|
+
transform.scale.x = 2;
|
|
182
|
+
transform.scale.y = 3;
|
|
183
|
+
transform.scale.z = 4;
|
|
184
|
+
setQuaternionFromAxisAngle(transform.rotation, createVector3(0, 1, 0), Math.PI / 2);
|
|
185
|
+
const authoredLights: Required<Scene3DLightsLike> = {
|
|
186
|
+
ambient: createAmbientLight(),
|
|
187
|
+
directional: createDirectionalLight({ direction: { x: 0, y: 0, z: -1 } }),
|
|
188
|
+
hemisphere: [createHemisphereLight()],
|
|
189
|
+
point: [createPointLight({ position: { x: 1, y: 0, z: 0 } })],
|
|
190
|
+
spot: [createSpotLight({ direction: { x: 0, y: 0, z: -1 }, position: { x: 1, y: 0, z: 0 } })],
|
|
191
|
+
};
|
|
192
|
+
const document = createTestDocument({
|
|
193
|
+
cameras: [],
|
|
194
|
+
kind: 'Scene3D',
|
|
195
|
+
lights: getDocumentLights(authoredLights, transform),
|
|
196
|
+
scene: { children: [], fields: {}, kind: Node3DKind },
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
const result = createFlightDocumentScene3DMaterialization(document, createTestSchemas());
|
|
200
|
+
|
|
201
|
+
expect(getScene3DLightKinds(result?.lights ?? null).sort()).toEqual(getScene3DLightKinds(authoredLights).sort());
|
|
202
|
+
expect(result?.lights.directional?.direction.x).toBeCloseTo(-1);
|
|
203
|
+
expect(result?.lights.directional?.direction.y).toBeCloseTo(0);
|
|
204
|
+
expect(result?.lights.directional?.direction.z).toBeCloseTo(0);
|
|
205
|
+
expect(result?.lights.point?.[0].position).toMatchObject({ x: 10, y: 20, z: 28 });
|
|
206
|
+
expect(result?.lights.spot?.[0].position).toMatchObject({ x: 10, y: 20, z: 28 });
|
|
207
|
+
expect(result?.lights.spot?.[0].direction.x).toBeCloseTo(-1);
|
|
208
|
+
expect(result?.lights.spot?.[0].direction.y).toBeCloseTo(0);
|
|
209
|
+
expect(result?.lights.spot?.[0].direction.z).toBeCloseTo(0);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('applies a bound depth-first node placement to a punctual light', () => {
|
|
213
|
+
const transform = createTransform3D();
|
|
214
|
+
transform.position.x = 7;
|
|
215
|
+
const document = createTestDocument({
|
|
216
|
+
cameras: [],
|
|
217
|
+
kind: 'Scene3D',
|
|
218
|
+
lights: [{ descriptor: createPointLight(), node: 2, transform }],
|
|
219
|
+
scene: {
|
|
220
|
+
children: [
|
|
221
|
+
{
|
|
222
|
+
children: [{ children: [], fields: { positionX: 3 }, kind: Node3DKind }],
|
|
223
|
+
fields: { positionX: 2 },
|
|
224
|
+
kind: Node3DKind,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
fields: {},
|
|
228
|
+
kind: Node3DKind,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const result = createFlightDocumentScene3DMaterialization(document, createTestSchemas());
|
|
233
|
+
|
|
234
|
+
expect(result?.lights.point?.[0].position).toMatchObject({ x: 5, y: 0, z: 0 });
|
|
235
|
+
});
|
|
236
|
+
|
|
113
237
|
it('materializes a tree with children', () => {
|
|
114
238
|
const document = createTestDocument({
|
|
115
239
|
cameras: [],
|
|
@@ -571,8 +695,14 @@ function createTestDocument(
|
|
|
571
695
|
|
|
572
696
|
function createTestSchemas(): FlightDocumentSchemaRegistry {
|
|
573
697
|
const node3DSchema: FlightDocumentNodeSchema = {
|
|
574
|
-
createNode: (
|
|
575
|
-
|
|
698
|
+
createNode: (fields: Readonly<FlightDocumentFields>, _resources: FlightDocumentResourceLookup) => {
|
|
699
|
+
const node = createNode3D();
|
|
700
|
+
const positionX = fields['positionX'];
|
|
701
|
+
if (typeof positionX === 'number') {
|
|
702
|
+
node.position.x = positionX;
|
|
703
|
+
invalidateNodeLocalTransform(node);
|
|
704
|
+
}
|
|
705
|
+
return node;
|
|
576
706
|
},
|
|
577
707
|
fields: [],
|
|
578
708
|
kind: Node3DKind,
|
|
@@ -619,3 +749,24 @@ function rootDocument3D(
|
|
|
619
749
|
version: 1,
|
|
620
750
|
} as unknown as FlightDocument;
|
|
621
751
|
}
|
|
752
|
+
|
|
753
|
+
function getDocumentLights(
|
|
754
|
+
source: Readonly<Required<Scene3DLightsLike>>,
|
|
755
|
+
transform: Readonly<Scene3DDocumentLight['transform']>,
|
|
756
|
+
): Scene3DDocumentLight[] {
|
|
757
|
+
return getScene3DLights(source).map((descriptor) => ({ descriptor, transform }));
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
function getScene3DLightKinds(source: Readonly<Scene3DLightsLike> | null): string[] {
|
|
761
|
+
return source === null ? [] : getScene3DLights(source).map((light) => light.kind);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
function getScene3DLights(source: Readonly<Scene3DLightsLike>): Readonly<Light>[] {
|
|
765
|
+
const lights: Readonly<Light>[] = [];
|
|
766
|
+
for (const value of Object.values(source)) {
|
|
767
|
+
if (value === null) continue;
|
|
768
|
+
if ('kind' in value) lights.push(value);
|
|
769
|
+
else lights.push(...value);
|
|
770
|
+
}
|
|
771
|
+
return lights;
|
|
772
|
+
}
|