@flighthq/scene3d 0.3.0-next.906.07cea63 → 0.3.1-next.209.43ef1bc
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/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scene.js +1 -1
- package/dist/scene.js.map +1 -1
- package/dist/sceneDocument.d.ts.map +1 -1
- package/dist/sceneDocument.js +4 -1
- package/dist/sceneDocument.js.map +1 -1
- package/dist/sceneDocumentLights.d.ts +3 -0
- package/dist/sceneDocumentLights.d.ts.map +1 -0
- package/dist/sceneDocumentLights.js +64 -0
- package/dist/sceneDocumentLights.js.map +1 -0
- package/dist/sceneKindUsage.d.ts +4 -0
- package/dist/sceneKindUsage.d.ts.map +1 -0
- package/dist/sceneKindUsage.js +79 -0
- package/dist/sceneKindUsage.js.map +1 -0
- package/package.json +14 -9
- package/src/sceneDocumentLights.test.ts +117 -0
- package/src/sceneKindUsage.test.ts +137 -0
package/dist/contract.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './prepareScene3DMorph';
|
|
|
5
5
|
export * from './scene';
|
|
6
6
|
export * from './sceneAnimation';
|
|
7
7
|
export * from './sceneDocument';
|
|
8
|
+
export * from './sceneDocumentLights';
|
|
8
9
|
export * from './sceneMaterial';
|
|
9
10
|
export * from './sceneNode';
|
|
10
11
|
export * from './sceneNodeAppearance';
|
|
@@ -12,4 +13,5 @@ export * from './sceneNodeBounds';
|
|
|
12
13
|
export * from './sceneNodeCulling';
|
|
13
14
|
export * from './sceneNodeDispose';
|
|
14
15
|
export * from './sceneNodeTransform';
|
|
16
|
+
export * from './sceneKindUsage';
|
|
15
17
|
//# sourceMappingURL=contract.d.ts.map
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
|
package/dist/contract.js
CHANGED
|
@@ -5,6 +5,7 @@ export * from './prepareScene3DMorph';
|
|
|
5
5
|
export * from './scene';
|
|
6
6
|
export * from './sceneAnimation';
|
|
7
7
|
export * from './sceneDocument';
|
|
8
|
+
export * from './sceneDocumentLights';
|
|
8
9
|
export * from './sceneMaterial';
|
|
9
10
|
export * from './sceneNode';
|
|
10
11
|
export * from './sceneNodeAppearance';
|
|
@@ -12,4 +13,5 @@ export * from './sceneNodeBounds';
|
|
|
12
13
|
export * from './sceneNodeCulling';
|
|
13
14
|
export * from './sceneNodeDispose';
|
|
14
15
|
export * from './sceneNodeTransform';
|
|
16
|
+
export * from './sceneKindUsage';
|
|
15
17
|
//# sourceMappingURL=contract.js.map
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { BillboardKind, MeshKind, Node3DKind, applyAnimationClipToScene3D, buildScene3DFrustum, cloneMesh, createBillboard, createMesh, createNode3D, createScene3D, createScene3DFromDocument, createScene3DsFromDocument, cullNode3DByFrustum, disposeNode3D, enableBillboardSignals, enableMeshSignals, enableNode3DSignals, findScene3DMaterialByName, getBillboardSignals, getMeshDeformer, getMeshSignals, getNode3DSignals, getNode3DWorldAlpha, getNode3DWorldBounds, getScene3DMaterials, isBillboard, isMesh, orientBillboardToCamera, orientScene3DBillboardsToCamera, prepareScene3DMorph, setNode3DAlpha, setNode3DLookAt, } from './contract';
|
|
1
|
+
export { BillboardKind, MeshKind, Node3DKind, applyAnimationClipToScene3D, buildScene3DFrustum, cloneMesh, createBillboard, createMesh, createNode3D, createScene3D, createScene3DFromDocument, createScene3DKindUsage, createScene3DLightsFromDocument, createScene3DsFromDocument, cullNode3DByFrustum, disposeNode3D, enableBillboardSignals, enableMeshSignals, enableNode3DSignals, findScene3DMaterialByName, getBillboardSignals, getMeshDeformer, getMeshSignals, getNode3DSignals, getNode3DWorldAlpha, getNode3DWorldBounds, getScene3DMaterials, getScene3DKindUsage, isBillboard, isMesh, orientBillboardToCamera, orientScene3DBillboardsToCamera, prepareScene3DMorph, setNode3DAlpha, setNode3DLookAt, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,sBAAsB,EACtB,+BAA+B,EAC/B,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { BillboardKind, MeshKind, Node3DKind, applyAnimationClipToScene3D, buildScene3DFrustum, cloneMesh, createBillboard, createMesh, createNode3D, createScene3D, createScene3DFromDocument, createScene3DsFromDocument, cullNode3DByFrustum, disposeNode3D, enableBillboardSignals, enableMeshSignals, enableNode3DSignals, findScene3DMaterialByName, getBillboardSignals, getMeshDeformer, getMeshSignals, getNode3DSignals, getNode3DWorldAlpha, getNode3DWorldBounds, getScene3DMaterials, isBillboard, isMesh, orientBillboardToCamera, orientScene3DBillboardsToCamera, prepareScene3DMorph, setNode3DAlpha, setNode3DLookAt, } from './contract';
|
|
1
|
+
export { BillboardKind, MeshKind, Node3DKind, applyAnimationClipToScene3D, buildScene3DFrustum, cloneMesh, createBillboard, createMesh, createNode3D, createScene3D, createScene3DFromDocument, createScene3DKindUsage, createScene3DLightsFromDocument, createScene3DsFromDocument, cullNode3DByFrustum, disposeNode3D, enableBillboardSignals, enableMeshSignals, enableNode3DSignals, findScene3DMaterialByName, getBillboardSignals, getMeshDeformer, getMeshSignals, getNode3DSignals, getNode3DWorldAlpha, getNode3DWorldBounds, getScene3DMaterials, getScene3DKindUsage, isBillboard, isMesh, orientBillboardToCamera, orientScene3DBillboardsToCamera, prepareScene3DMorph, setNode3DAlpha, setNode3DLookAt, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,sBAAsB,EACtB,+BAA+B,EAC/B,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/scene.js
CHANGED
|
@@ -7,6 +7,6 @@ import { createNode3D } from './sceneNode';
|
|
|
7
7
|
// (`createScene3DFrom*`) fill them. `obj` configures the root node (`enabled`/`name`).
|
|
8
8
|
export function createScene3D(obj) {
|
|
9
9
|
const root = createNode3D(Node3DKind, obj);
|
|
10
|
-
return createEntity({ animations: {}, metadata: null, root });
|
|
10
|
+
return createEntity({ animations: {}, metadata: null, resources: [], root });
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=scene.js.map
|
package/dist/scene.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,oFAAoF;AAEpF,8GAA8G;AAC9G,+GAA+G;AAC/G,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,GAAyD;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,oFAAoF;AAEpF,8GAA8G;AAC9G,+GAA+G;AAC/G,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,GAAyD;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAY,CAAC;AAC1F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneDocument.d.ts","sourceRoot":"","sources":["../src/sceneDocument.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIV,OAAO,EAEP,eAAe,EAIhB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"sceneDocument.d.ts","sourceRoot":"","sources":["../src/sceneDocument.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIV,OAAO,EAEP,eAAe,EAIhB,MAAM,0BAA0B,CAAC;AAoBlC,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,SAAI,GAAG,OAAO,CAatG;AAKD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,OAAO,EAAE,CAmBzF"}
|
package/dist/sceneDocument.js
CHANGED
|
@@ -17,7 +17,8 @@ import { createNode3D } from './sceneNode';
|
|
|
17
17
|
// indices to the built nodes, and rebuild each animation clip's channels against them — no format knowledge
|
|
18
18
|
// lives here. Cameras and lights are placement tables the document carries for the caller to read; they are
|
|
19
19
|
// not parented into the graph (a camera is a pure entity, not a scene node), so this assembler leaves them
|
|
20
|
-
// on the document.
|
|
20
|
+
// on the document. Use createScene3DLightsFromDocument when the parsed light table should become a
|
|
21
|
+
// renderer-ready, separately passed Scene3DLights draw argument.
|
|
21
22
|
export function createScene3DFromDocument(document, sceneIndex = 0) {
|
|
22
23
|
const nodes = buildDocumentNodes(document);
|
|
23
24
|
applyDocumentSkins(document, nodes);
|
|
@@ -30,6 +31,7 @@ export function createScene3DFromDocument(document, sceneIndex = 0) {
|
|
|
30
31
|
}
|
|
31
32
|
attachDocumentAnimations(document, nodes, scene);
|
|
32
33
|
scene.metadata = document.metadata;
|
|
34
|
+
scene.resources = document.resources.slice();
|
|
33
35
|
return scene;
|
|
34
36
|
}
|
|
35
37
|
// Assembles every scene the document declares (each a view of the shared node pool), in declaration order.
|
|
@@ -48,6 +50,7 @@ export function createScene3DsFromDocument(document) {
|
|
|
48
50
|
addNodeChild(scene.root, node);
|
|
49
51
|
}
|
|
50
52
|
scenes.push(scene);
|
|
53
|
+
scene.resources = document.resources.slice();
|
|
51
54
|
}
|
|
52
55
|
if (scenes.length > 0) {
|
|
53
56
|
attachDocumentAnimations(document, nodes, scenes[0]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneDocument.js","sourceRoot":"","sources":["../src/sceneDocument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAarF,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,gHAAgH;AAChH,+GAA+G;AAC/G,iHAAiH;AACjH,2GAA2G;AAC3G,wGAAwG;AACxG,iBAAiB;AACjB,EAAE;AACF,sGAAsG;AACtG,4GAA4G;AAC5G,4GAA4G;AAC5G,4GAA4G;AAC5G,2GAA2G;AAC3G,
|
|
1
|
+
{"version":3,"file":"sceneDocument.js","sourceRoot":"","sources":["../src/sceneDocument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneDocumentLights.d.ts","sourceRoot":"","sources":["../src/sceneDocumentLights.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAKV,eAAe,EACf,aAAa,EAId,MAAM,0BAA0B,CAAC;AAkBlC,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,aAAa,CAwClG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { rotateVector3ByQuaternion } from '@flighthq/geometry/contract';
|
|
2
|
+
import { cloneAmbientLight, cloneDirectionalLight, cloneHemisphereLight, clonePointLight, cloneSpotLight, createScene3DLights, } from '@flighthq/lighting/contract';
|
|
3
|
+
import { AmbientLightKind, DirectionalLightKind, HemisphereLightKind, PointLightKind, SpotLightKind, } from '@flighthq/types/contract';
|
|
4
|
+
// Constructs the renderer-ready light draw argument carried by a Scene3DDocument without attaching any
|
|
5
|
+
// light to the assembled Scene3D. Document descriptors are cloned so resolving their local placement never
|
|
6
|
+
// mutates the parsed document. Directional/spot directions are rotated into world space; point/spot positions
|
|
7
|
+
// are transformed by the document light's authored TRS. Ambient and hemisphere lights have no placement.
|
|
8
|
+
//
|
|
9
|
+
// Scene3DLights has one ambient and one directional slot, so the first supported descriptor of each kind in
|
|
10
|
+
// document order wins. Every point, spot, and hemisphere descriptor is retained. Descriptors whose kind is
|
|
11
|
+
// not representable by Scene3DLights are left out. This is an initial-placement snapshot: a document light's
|
|
12
|
+
// optional node binding is not live, so an animation of that node does not update the returned descriptor.
|
|
13
|
+
export function createScene3DLightsFromDocument(document) {
|
|
14
|
+
let ambient = null;
|
|
15
|
+
let directional = null;
|
|
16
|
+
const hemisphere = [];
|
|
17
|
+
const point = [];
|
|
18
|
+
const spot = [];
|
|
19
|
+
for (let i = 0; i < document.lights.length; i++) {
|
|
20
|
+
const source = document.lights[i];
|
|
21
|
+
const descriptor = source.descriptor;
|
|
22
|
+
if (descriptor.kind === AmbientLightKind) {
|
|
23
|
+
if (ambient === null)
|
|
24
|
+
ambient = cloneAmbientLight(descriptor);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (descriptor.kind === DirectionalLightKind) {
|
|
28
|
+
if (directional === null) {
|
|
29
|
+
directional = cloneDirectionalLight(descriptor);
|
|
30
|
+
rotateVector3ByQuaternion(directional.direction, directional.direction, source.transform.rotation);
|
|
31
|
+
}
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (descriptor.kind === HemisphereLightKind) {
|
|
35
|
+
hemisphere.push(cloneHemisphereLight(descriptor));
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (descriptor.kind === PointLightKind) {
|
|
39
|
+
const resolved = clonePointLight(descriptor);
|
|
40
|
+
transformDocumentLightPosition(resolved.position, source.transform);
|
|
41
|
+
point.push(resolved);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (descriptor.kind === SpotLightKind) {
|
|
45
|
+
const resolved = cloneSpotLight(descriptor);
|
|
46
|
+
transformDocumentLightPosition(resolved.position, source.transform);
|
|
47
|
+
rotateVector3ByQuaternion(resolved.direction, resolved.direction, source.transform.rotation);
|
|
48
|
+
spot.push(resolved);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return createScene3DLights({ ambient, directional, hemisphere, point, spot });
|
|
52
|
+
}
|
|
53
|
+
// Applies scale, then rotation, then translation: the same TRS order as composeMatrix4FromTransform3D,
|
|
54
|
+
// without allocating a temporary matrix for each light. rotateVector3ByQuaternion is alias-safe.
|
|
55
|
+
function transformDocumentLightPosition(out, transform) {
|
|
56
|
+
out.x *= transform.scale.x;
|
|
57
|
+
out.y *= transform.scale.y;
|
|
58
|
+
out.z *= transform.scale.z;
|
|
59
|
+
rotateVector3ByQuaternion(out, out, transform.rotation);
|
|
60
|
+
out.x += transform.position.x;
|
|
61
|
+
out.y += transform.position.y;
|
|
62
|
+
out.z += transform.position.z;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sceneDocumentLights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneDocumentLights.js","sourceRoot":"","sources":["../src/sceneDocumentLights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Scene3D, Scene3DKindUsage } from '@flighthq/types/contract';
|
|
2
|
+
export declare function createScene3DKindUsage(): Scene3DKindUsage;
|
|
3
|
+
export declare function getScene3DKindUsage(out: Scene3DKindUsage, scene: Readonly<Scene3D>): void;
|
|
4
|
+
//# sourceMappingURL=sceneKindUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneKindUsage.d.ts","sourceRoot":"","sources":["../src/sceneKindUsage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAOtG,wBAAgB,sBAAsB,IAAI,gBAAgB,CAQzD;AAWD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAyCzF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { forEachNodeDescendant } from '@flighthq/node/contract';
|
|
2
|
+
import { ImageTextureSourceKind } from '@flighthq/types/contract';
|
|
3
|
+
import { isMesh } from './mesh';
|
|
4
|
+
// Allocates an empty usage record. Separate from the walk so a caller can reuse one across scenes or
|
|
5
|
+
// frames without reallocating five arrays.
|
|
6
|
+
export function createScene3DKindUsage() {
|
|
7
|
+
return {
|
|
8
|
+
materialKinds: [],
|
|
9
|
+
modifierKinds: [],
|
|
10
|
+
nodeKinds: [],
|
|
11
|
+
resourceMimeTypes: [],
|
|
12
|
+
textureSourceKinds: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// Clears `out`, then fills it with every kind this scene uses. One walk, no registry, no backend, no
|
|
16
|
+
// prose — it reads `kind` off the entities the parser already built, so it cannot itself be the thing
|
|
17
|
+
// you forgot to wire.
|
|
18
|
+
//
|
|
19
|
+
// This answers only WHAT IS IN THE SCENE. Whether anything is registered to draw or resolve those kinds
|
|
20
|
+
// is a question for the package that owns the registry — a backend checks its own material and texture
|
|
21
|
+
// registries, the resource layer its listers and decoders. Keeping those answers out of here is what
|
|
22
|
+
// lets a scene stay ignorant of rendering, and what stops this walk from going stale when a registry
|
|
23
|
+
// moves or a registrar is renamed.
|
|
24
|
+
export function getScene3DKindUsage(out, scene) {
|
|
25
|
+
out.materialKinds.length = 0;
|
|
26
|
+
out.modifierKinds.length = 0;
|
|
27
|
+
out.nodeKinds.length = 0;
|
|
28
|
+
out.resourceMimeTypes.length = 0;
|
|
29
|
+
out.textureSourceKinds.length = 0;
|
|
30
|
+
const visit = (node) => {
|
|
31
|
+
addScene3DUsedKind(out.nodeKinds, node.kind);
|
|
32
|
+
if (!isMesh(node))
|
|
33
|
+
return;
|
|
34
|
+
const materials = node.materials;
|
|
35
|
+
for (let i = 0; i < materials.length; i++) {
|
|
36
|
+
const material = materials[i];
|
|
37
|
+
if (material === null)
|
|
38
|
+
continue;
|
|
39
|
+
addScene3DUsedKind(out.materialKinds, material.kind);
|
|
40
|
+
// Structural, like isMesh: any material family carrying a `modifiers` stack is walked, including
|
|
41
|
+
// a custom kind, without a per-kind table that would drift as families are added.
|
|
42
|
+
const modifiers = material.modifiers;
|
|
43
|
+
if (modifiers === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
for (let m = 0; m < modifiers.length; m++)
|
|
46
|
+
addScene3DUsedKind(out.modifierKinds, modifiers[m].kind);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
visit(scene.root);
|
|
50
|
+
// forEachNodeDescendant yields Node<Node3DTraits>; isMesh re-narrows inside the visitor, so the cast
|
|
51
|
+
// only restores the trait fields the walk generic drops.
|
|
52
|
+
forEachNodeDescendant(scene.root, (node) => visit(node));
|
|
53
|
+
for (let i = 0; i < scene.resources.length; i++) {
|
|
54
|
+
const resource = scene.resources[i];
|
|
55
|
+
// A resource nothing consumes is inert sidecar data (a glTF image no material sampled): it is
|
|
56
|
+
// never fetched, so nothing about it is used.
|
|
57
|
+
if (resource.textures === undefined || resource.textures.length === 0)
|
|
58
|
+
continue;
|
|
59
|
+
addScene3DUsedKind(out.textureSourceKinds, ImageTextureSourceKind);
|
|
60
|
+
if (resource.mimeType !== null)
|
|
61
|
+
addScene3DUsedKind(out.resourceMimeTypes, resource.mimeType);
|
|
62
|
+
}
|
|
63
|
+
out.materialKinds.sort();
|
|
64
|
+
out.modifierKinds.sort();
|
|
65
|
+
out.nodeKinds.sort();
|
|
66
|
+
out.resourceMimeTypes.sort();
|
|
67
|
+
out.textureSourceKinds.sort();
|
|
68
|
+
}
|
|
69
|
+
// Linear scan rather than a Set: these lists are the handful of distinct kinds a document uses, where
|
|
70
|
+
// scanning beats allocating five Sets per walk, and it keeps the result a plain array a C port can hold
|
|
71
|
+
// without a hash container.
|
|
72
|
+
function addScene3DUsedKind(kinds, kind) {
|
|
73
|
+
for (let i = 0; i < kinds.length; i++) {
|
|
74
|
+
if (kinds[i] === kind)
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
kinds.push(kind);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=sceneKindUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneKindUsage.js","sourceRoot":"","sources":["../src/sceneKindUsage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene3d",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1-next.209.43ef1bc",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,17 +38,20 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/adjustments": "0.3.
|
|
40
|
-
"@flighthq/animation": "0.3.
|
|
41
|
-
"@flighthq/entity": "0.3.
|
|
42
|
-
"@flighthq/geometry": "0.3.
|
|
43
|
-
"@flighthq/
|
|
44
|
-
"@flighthq/
|
|
45
|
-
"@flighthq/
|
|
46
|
-
"@flighthq/
|
|
41
|
+
"@flighthq/adjustments": "0.3.1-next.209.43ef1bc",
|
|
42
|
+
"@flighthq/animation": "0.3.1-next.209.43ef1bc",
|
|
43
|
+
"@flighthq/entity": "0.3.1-next.209.43ef1bc",
|
|
44
|
+
"@flighthq/geometry": "0.3.1-next.209.43ef1bc",
|
|
45
|
+
"@flighthq/lighting": "0.3.1-next.209.43ef1bc",
|
|
46
|
+
"@flighthq/materials": "0.3.1-next.209.43ef1bc",
|
|
47
|
+
"@flighthq/mesh": "0.3.1-next.209.43ef1bc",
|
|
48
|
+
"@flighthq/node": "0.3.1-next.209.43ef1bc",
|
|
49
|
+
"@flighthq/types": "0.3.1-next.209.43ef1bc"
|
|
47
50
|
},
|
|
48
51
|
"devDependencies": {
|
|
49
52
|
"@flighthq/camera": "*",
|
|
53
|
+
"@flighthq/shading": "*",
|
|
54
|
+
"@flighthq/texture": "*",
|
|
50
55
|
"typescript": "^5.3.0"
|
|
51
56
|
},
|
|
52
57
|
"description": "3D scene graph and spatial node hierarchy",
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createTransform3D } from '@flighthq/geometry/contract';
|
|
2
|
+
import {
|
|
3
|
+
createAmbientLight,
|
|
4
|
+
createAreaLight,
|
|
5
|
+
createDirectionalLight,
|
|
6
|
+
createHemisphereLight,
|
|
7
|
+
createPointLight,
|
|
8
|
+
createSpotLight,
|
|
9
|
+
} from '@flighthq/lighting/contract';
|
|
10
|
+
import type { Scene3DDocument } from '@flighthq/types/contract';
|
|
11
|
+
import { describe, expect, it } from 'vitest';
|
|
12
|
+
|
|
13
|
+
import { createScene3DLightsFromDocument } from './sceneDocumentLights';
|
|
14
|
+
|
|
15
|
+
function emptyDocument(): Scene3DDocument {
|
|
16
|
+
return {
|
|
17
|
+
animations: [],
|
|
18
|
+
cameras: [],
|
|
19
|
+
lights: [],
|
|
20
|
+
materials: [],
|
|
21
|
+
meshes: [],
|
|
22
|
+
metadata: null,
|
|
23
|
+
nodes: [],
|
|
24
|
+
resources: [],
|
|
25
|
+
scenes: [],
|
|
26
|
+
skins: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function placedTransform() {
|
|
31
|
+
const transform = createTransform3D();
|
|
32
|
+
transform.position.x = 10;
|
|
33
|
+
transform.position.y = 20;
|
|
34
|
+
transform.position.z = 30;
|
|
35
|
+
transform.rotation.y = Math.SQRT1_2;
|
|
36
|
+
transform.rotation.w = Math.SQRT1_2;
|
|
37
|
+
transform.scale.x = 2;
|
|
38
|
+
transform.scale.y = 3;
|
|
39
|
+
transform.scale.z = 4;
|
|
40
|
+
return transform;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe('createScene3DLightsFromDocument', () => {
|
|
44
|
+
it('returns a complete empty light set for an empty document', () => {
|
|
45
|
+
const lights = createScene3DLightsFromDocument(emptyDocument());
|
|
46
|
+
|
|
47
|
+
expect(lights.ambient).toBeNull();
|
|
48
|
+
expect(lights.directional).toBeNull();
|
|
49
|
+
expect(lights.hemisphere).toEqual([]);
|
|
50
|
+
expect(lights.point).toEqual([]);
|
|
51
|
+
expect(lights.spot).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('clones every representable descriptor and preserves the single-slot document order', () => {
|
|
55
|
+
const document = emptyDocument();
|
|
56
|
+
const transform = createTransform3D();
|
|
57
|
+
const firstAmbient = createAmbientLight({ intensity: 0.25 });
|
|
58
|
+
const firstDirectional = createDirectionalLight({ intensity: 2 });
|
|
59
|
+
const hemisphere = createHemisphereLight({ intensity: 0.5 });
|
|
60
|
+
document.lights.push(
|
|
61
|
+
{ descriptor: firstAmbient, transform },
|
|
62
|
+
{ descriptor: createAmbientLight({ intensity: 4 }), transform },
|
|
63
|
+
{ descriptor: firstDirectional, transform },
|
|
64
|
+
{ descriptor: createDirectionalLight({ intensity: 8 }), transform },
|
|
65
|
+
{ descriptor: hemisphere, transform },
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const lights = createScene3DLightsFromDocument(document);
|
|
69
|
+
|
|
70
|
+
expect(lights.ambient?.intensity).toBe(0.25);
|
|
71
|
+
expect(lights.directional?.intensity).toBe(2);
|
|
72
|
+
expect(lights.hemisphere).toHaveLength(1);
|
|
73
|
+
expect(lights.ambient).not.toBe(firstAmbient);
|
|
74
|
+
expect(lights.directional).not.toBe(firstDirectional);
|
|
75
|
+
expect(lights.hemisphere?.[0]).not.toBe(hemisphere);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('resolves point and spot placement plus directional and spot aim into world space', () => {
|
|
79
|
+
const document = emptyDocument();
|
|
80
|
+
const transform = placedTransform();
|
|
81
|
+
const directional = createDirectionalLight({ direction: { x: 0, y: 0, z: -1 } });
|
|
82
|
+
const point = createPointLight({ position: { x: 1, y: 0, z: 0 } });
|
|
83
|
+
const spot = createSpotLight({ direction: { x: 0, y: 0, z: -1 }, position: { x: 1, y: 0, z: 0 } });
|
|
84
|
+
document.lights.push(
|
|
85
|
+
{ descriptor: directional, transform },
|
|
86
|
+
{ descriptor: point, transform },
|
|
87
|
+
{ descriptor: spot, transform },
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const lights = createScene3DLightsFromDocument(document);
|
|
91
|
+
|
|
92
|
+
expect(lights.directional?.direction.x).toBeCloseTo(-1);
|
|
93
|
+
expect(lights.directional?.direction.y).toBeCloseTo(0);
|
|
94
|
+
expect(lights.directional?.direction.z).toBeCloseTo(0);
|
|
95
|
+
expect(lights.point?.[0].position).toMatchObject({ x: 10, y: 20, z: 28 });
|
|
96
|
+
expect(lights.spot?.[0].position).toMatchObject({ x: 10, y: 20, z: 28 });
|
|
97
|
+
expect(lights.spot?.[0].direction.x).toBeCloseTo(-1);
|
|
98
|
+
expect(lights.spot?.[0].direction.y).toBeCloseTo(0);
|
|
99
|
+
expect(lights.spot?.[0].direction.z).toBeCloseTo(0);
|
|
100
|
+
expect(directional.direction).toMatchObject({ x: 0, y: 0, z: -1 });
|
|
101
|
+
expect(point.position).toMatchObject({ x: 1, y: 0, z: 0 });
|
|
102
|
+
expect(spot.position).toMatchObject({ x: 1, y: 0, z: 0 });
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('leaves document-only kinds out when Scene3DLights cannot represent them', () => {
|
|
106
|
+
const document = emptyDocument();
|
|
107
|
+
document.lights.push({ descriptor: createAreaLight(), transform: createTransform3D() });
|
|
108
|
+
|
|
109
|
+
const lights = createScene3DLightsFromDocument(document);
|
|
110
|
+
|
|
111
|
+
expect(lights.ambient).toBeNull();
|
|
112
|
+
expect(lights.directional).toBeNull();
|
|
113
|
+
expect(lights.hemisphere).toEqual([]);
|
|
114
|
+
expect(lights.point).toEqual([]);
|
|
115
|
+
expect(lights.spot).toEqual([]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { createBlinnPhongMaterial, createUnlitMaterial } from '@flighthq/materials/contract';
|
|
2
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh/contract';
|
|
3
|
+
import { addNodeChild } from '@flighthq/node/contract';
|
|
4
|
+
import { createRimModifier, createShadedMaterial } from '@flighthq/shading/contract';
|
|
5
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
6
|
+
import type { ImageResourceReference } from '@flighthq/types/contract';
|
|
7
|
+
import { ImageResourceReferenceKind, MeshKind, Node3DKind, ResourceResolutionState } from '@flighthq/types/contract';
|
|
8
|
+
import { describe, expect, it } from 'vitest';
|
|
9
|
+
|
|
10
|
+
import { createMesh } from './mesh';
|
|
11
|
+
import { createScene3D } from './scene';
|
|
12
|
+
import { createScene3DKindUsage, getScene3DKindUsage } from './sceneKindUsage';
|
|
13
|
+
import { createNode3D } from './sceneNode';
|
|
14
|
+
|
|
15
|
+
function embeddedRef(mimeType: string | null = 'image/png'): ImageResourceReference {
|
|
16
|
+
return {
|
|
17
|
+
alphaType: 'straight',
|
|
18
|
+
bytes: new Uint8Array([1, 2, 3]),
|
|
19
|
+
failure: null,
|
|
20
|
+
kind: ImageResourceReferenceKind.Embedded,
|
|
21
|
+
mimeType,
|
|
22
|
+
state: ResourceResolutionState.Unresolved,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe('createScene3DKindUsage', () => {
|
|
27
|
+
it('starts empty so a caller can reuse one record across scenes', () => {
|
|
28
|
+
expect(createScene3DKindUsage()).toEqual({
|
|
29
|
+
materialKinds: [],
|
|
30
|
+
modifierKinds: [],
|
|
31
|
+
nodeKinds: [],
|
|
32
|
+
resourceMimeTypes: [],
|
|
33
|
+
textureSourceKinds: [],
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('getScene3DKindUsage', () => {
|
|
39
|
+
it('collects distinct material kinds across meshes, sorted and deduped', () => {
|
|
40
|
+
const scene = createScene3D();
|
|
41
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createUnlitMaterial()]));
|
|
42
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createUnlitMaterial()]));
|
|
43
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createBlinnPhongMaterial()]));
|
|
44
|
+
|
|
45
|
+
const usage = createScene3DKindUsage();
|
|
46
|
+
getScene3DKindUsage(usage, scene);
|
|
47
|
+
expect(usage.materialKinds).toEqual(['BlinnPhongMaterial', 'UnlitMaterial']);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('reports node kinds including non-mesh groups, leaving the render rule to the consumer', () => {
|
|
51
|
+
const scene = createScene3D();
|
|
52
|
+
const group = createNode3D(Node3DKind);
|
|
53
|
+
addNodeChild(group, createMesh(createBoxMeshGeometry(), [createUnlitMaterial()]));
|
|
54
|
+
addNodeChild(scene.root, group);
|
|
55
|
+
|
|
56
|
+
const usage = createScene3DKindUsage();
|
|
57
|
+
getScene3DKindUsage(usage, scene);
|
|
58
|
+
expect(usage.nodeKinds).toEqual([MeshKind, Node3DKind]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('reads modifier kinds structurally, off any material carrying a stack', () => {
|
|
62
|
+
const rim = createRimModifier({ color: 0x49d8ffff, intensity: 0.72, power: 2.4 });
|
|
63
|
+
const material = createShadedMaterial();
|
|
64
|
+
material.modifiers = [rim];
|
|
65
|
+
const scene = createScene3D();
|
|
66
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [material]));
|
|
67
|
+
|
|
68
|
+
const usage = createScene3DKindUsage();
|
|
69
|
+
getScene3DKindUsage(usage, scene);
|
|
70
|
+
expect(usage.modifierKinds).toEqual([rim.kind]);
|
|
71
|
+
expect(usage.materialKinds).toEqual(['ShadedMaterial']);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('leaves modifier kinds empty for a material family that has no stack', () => {
|
|
75
|
+
const scene = createScene3D();
|
|
76
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createUnlitMaterial()]));
|
|
77
|
+
|
|
78
|
+
const usage = createScene3DKindUsage();
|
|
79
|
+
getScene3DKindUsage(usage, scene);
|
|
80
|
+
expect(usage.modifierKinds).toEqual([]);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('skips null material slots', () => {
|
|
84
|
+
const scene = createScene3D();
|
|
85
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [null, createUnlitMaterial()]));
|
|
86
|
+
|
|
87
|
+
const usage = createScene3DKindUsage();
|
|
88
|
+
getScene3DKindUsage(usage, scene);
|
|
89
|
+
expect(usage.materialKinds).toEqual(['UnlitMaterial']);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('reports the image source kind and MIME type of a consumed resource', () => {
|
|
93
|
+
const ref = embeddedRef();
|
|
94
|
+
const map = createTexture({ resource: ref });
|
|
95
|
+
const scene = createScene3D();
|
|
96
|
+
scene.resources.push(ref);
|
|
97
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createUnlitMaterial({ baseColorMap: map })]));
|
|
98
|
+
|
|
99
|
+
const usage = createScene3DKindUsage();
|
|
100
|
+
getScene3DKindUsage(usage, scene);
|
|
101
|
+
expect(usage.textureSourceKinds).toEqual(['image']);
|
|
102
|
+
expect(usage.resourceMimeTypes).toEqual(['image/png']);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('ignores a resource no texture consumes, since nothing will ever fetch it', () => {
|
|
106
|
+
const scene = createScene3D();
|
|
107
|
+
scene.resources.push(embeddedRef());
|
|
108
|
+
|
|
109
|
+
const usage = createScene3DKindUsage();
|
|
110
|
+
getScene3DKindUsage(usage, scene);
|
|
111
|
+
expect(usage.textureSourceKinds).toEqual([]);
|
|
112
|
+
expect(usage.resourceMimeTypes).toEqual([]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('omits the MIME type when the container declared none, but still needs the resolver', () => {
|
|
116
|
+
const ref = embeddedRef(null);
|
|
117
|
+
createTexture({ resource: ref });
|
|
118
|
+
const scene = createScene3D();
|
|
119
|
+
scene.resources.push(ref);
|
|
120
|
+
|
|
121
|
+
const usage = createScene3DKindUsage();
|
|
122
|
+
getScene3DKindUsage(usage, scene);
|
|
123
|
+
expect(usage.resourceMimeTypes).toEqual([]);
|
|
124
|
+
expect(usage.textureSourceKinds).toEqual(['image']);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('clears every list, so a reused record does not accumulate', () => {
|
|
128
|
+
const scene = createScene3D();
|
|
129
|
+
addNodeChild(scene.root, createMesh(createBoxMeshGeometry(), [createUnlitMaterial()]));
|
|
130
|
+
|
|
131
|
+
const usage = createScene3DKindUsage();
|
|
132
|
+
getScene3DKindUsage(usage, scene);
|
|
133
|
+
getScene3DKindUsage(usage, scene);
|
|
134
|
+
expect(usage.materialKinds).toEqual(['UnlitMaterial']);
|
|
135
|
+
expect(usage.nodeKinds).toEqual([MeshKind, Node3DKind]);
|
|
136
|
+
});
|
|
137
|
+
});
|