@flighthq/camera 0.5.1-next.1052.ea38f97 → 0.5.1-next.1058.751c53a
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/camera.d.ts.map +1 -1
- package/dist/camera.js +6 -0
- package/dist/camera.js.map +1 -1
- package/dist/contract.d.ts +1 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +1 -1
- 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/projection.d.ts +4 -1
- package/dist/projection.d.ts.map +1 -1
- package/dist/projection.js +19 -1
- package/dist/projection.js.map +1 -1
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +2 -0
- package/dist/reflection.js.map +1 -1
- package/package.json +5 -5
- package/src/camera.test.ts +62 -1
- package/src/projection.test.ts +53 -1
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/camera`. The `@fligh
|
|
|
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/camera@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/camera@0.5.1-next.1058.751c53a](https://github.com/flighthq/flight/tree/751c53a7765e345d4c3e29d3a6089601b35c2bad/packages/camera)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/751c53a7765e345d4c3e29d3a6089601b35c2bad/LICENSE.md)
|
package/dist/camera.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKxH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ,CAIxE;AASD,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAGT;AAQD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKnH;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAQ3G;AAQD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQxE;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAG9E;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAE/F;AAOD,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC1B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC7B,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,GACxB,IAAI,CAEN;AAeD,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAGrG;AAMD,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIvG"}
|
package/dist/camera.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { createMatrix4, createVector2, inverseMatrix4, multiplyMatrix4, setMatrix4LookAt, } from '@flighthq/geometry/contract';
|
|
3
3
|
import { setProjectionMatrix4 } from './projection';
|
|
4
|
+
import { applyObliqueNearClipPlane } from './reflection';
|
|
4
5
|
export function createCamera3D(opts) {
|
|
5
6
|
const out = allocateEntity();
|
|
6
7
|
initializeCamera3D(out, opts);
|
|
@@ -26,6 +27,8 @@ export function getCamera3DInverseViewProjectionMatrix4(out, camera, aspect) {
|
|
|
26
27
|
export function getCamera3DViewProjectionMatrix4(out, camera, aspect) {
|
|
27
28
|
setProjectionMatrix4(__scratchProjection, camera.projection, aspect, camera.near, camera.far);
|
|
28
29
|
applyCamera3DProjectionJitter(__scratchProjection, camera.jitter.x, camera.jitter.y);
|
|
30
|
+
if (camera.nearClipPlane)
|
|
31
|
+
applyObliqueNearClipPlane(__scratchProjection, camera.nearClipPlane);
|
|
29
32
|
multiplyMatrix4(out, __scratchProjection, camera.view);
|
|
30
33
|
}
|
|
31
34
|
// Allocates a 3D camera. The camera stores its projection descriptor, a world->view Matrix4
|
|
@@ -39,6 +42,7 @@ export function initializeCamera3D(out, opts) {
|
|
|
39
42
|
out.inverseViewProjection = createMatrix4();
|
|
40
43
|
out.jitter = createVector2(0, 0);
|
|
41
44
|
out.near = opts.near;
|
|
45
|
+
out.nearClipPlane = opts.nearClipPlane ?? null;
|
|
42
46
|
out.projection = opts.projection;
|
|
43
47
|
out.view = createMatrix4();
|
|
44
48
|
}
|
|
@@ -54,6 +58,8 @@ export function setCamera3DAspect(camera, aspect) {
|
|
|
54
58
|
projection.aspect = aspect;
|
|
55
59
|
return;
|
|
56
60
|
}
|
|
61
|
+
if (projection.kind === 'raw')
|
|
62
|
+
return;
|
|
57
63
|
projection.halfWidth = projection.halfHeight * aspect;
|
|
58
64
|
}
|
|
59
65
|
// Sets the camera's per-frame sub-pixel jitter offset (in NDC), in place. Every view-projection
|
package/dist/camera.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -18,5 +18,5 @@ export * from './viewMatrix';
|
|
|
18
18
|
export * from './visibleBounds';
|
|
19
19
|
export * from './zoom';
|
|
20
20
|
export { initializeCamera3D } from './camera';
|
|
21
|
-
export { initializeOrthographicProjection, initializePerspectiveProjection } from './projection';
|
|
21
|
+
export { initializeOrthographicProjection, initializePerspectiveProjection, initializeRawProjection, } from './projection';
|
|
22
22
|
//# 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,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
|
package/dist/contract.js
CHANGED
|
@@ -18,5 +18,5 @@ export * from './viewMatrix';
|
|
|
18
18
|
export * from './visibleBounds';
|
|
19
19
|
export * from './zoom';
|
|
20
20
|
export { initializeCamera3D } from './camera';
|
|
21
|
-
export { initializeOrthographicProjection, initializePerspectiveProjection } from './projection';
|
|
21
|
+
export { initializeOrthographicProjection, initializePerspectiveProjection, initializeRawProjection, } from './projection';
|
|
22
22
|
//# 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,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { applyObliqueNearClipPlane, areCameraGuardsEnabled, configureDirectionalShadowCamera3D, configureDirectionalShadowCamera3DTightFit, createCamera2D, createCamera3D, createOrthographicProjection, createPerspectiveProjection, disableCameraGuards, enableCameraGuards, getCamera2DParallaxPoint, getCamera2DViewMatrix, getCamera2DVisibleBounds, getCamera3DForward, getCamera3DFrustum, getCamera3DFrustumCorners, getCamera3DInverseViewProjectionMatrix4, getCamera3DLinearDepth, getCamera3DPosition, getCamera3DRayThroughBoundingSphere, getCamera3DRight, getCamera3DScreenToWorldRay, getCamera3DUp, getCamera3DViewProjectionMatrix4, getCamera3DViewSpaceZ, getCamera3DWorldToScreen, getCubeCaptureFaceCamera3D, getOrthographicProjectionTexelSize, intersectCamera3DRayWithPlane, isBoxInCamera3DFrustum, isOrthographicProjection, isPerspectiveProjection, isPointInCamera3DFrustum, isSphereInCamera3DFrustum, projectCamera2DPoint, reflectCamera3DByPlane, setCamera3DAspect, setCamera3DJitter, setCamera3DViewMatrix4FromLookAt, setCamera3DViewMatrix4FromMatrix4, setProjectionMatrix4, unprojectCamera2DPoint, updateCamera3DInverseViewProjection, zoomCamera2DAtScreenPoint, } from './contract';
|
|
1
|
+
export { applyObliqueNearClipPlane, areCameraGuardsEnabled, configureDirectionalShadowCamera3D, configureDirectionalShadowCamera3DTightFit, createCamera2D, createCamera3D, createOrthographicProjection, createPerspectiveProjection, createRawProjection, disableCameraGuards, enableCameraGuards, getCamera2DParallaxPoint, getCamera2DViewMatrix, getCamera2DVisibleBounds, getCamera3DForward, getCamera3DFrustum, getCamera3DFrustumCorners, getCamera3DInverseViewProjectionMatrix4, getCamera3DLinearDepth, getCamera3DPosition, getCamera3DRayThroughBoundingSphere, getCamera3DRight, getCamera3DScreenToWorldRay, getCamera3DUp, getCamera3DViewProjectionMatrix4, getCamera3DViewSpaceZ, getCamera3DWorldToScreen, getCubeCaptureFaceCamera3D, getOrthographicProjectionTexelSize, intersectCamera3DRayWithPlane, isBoxInCamera3DFrustum, isOrthographicProjection, isPerspectiveProjection, isRawProjection, isPointInCamera3DFrustum, isSphereInCamera3DFrustum, projectCamera2DPoint, reflectCamera3DByPlane, setCamera3DAspect, setCamera3DJitter, setCamera3DViewMatrix4FromLookAt, setCamera3DViewMatrix4FromMatrix4, setProjectionMatrix4, unprojectCamera2DPoint, updateCamera3DInverseViewProjection, zoomCamera2DAtScreenPoint, } 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,yBAAyB,EACzB,sBAAsB,EACtB,kCAAkC,EAClC,0CAA0C,EAC1C,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,uCAAuC,EACvC,sBAAsB,EACtB,mBAAmB,EACnB,mCAAmC,EACnC,gBAAgB,EAChB,2BAA2B,EAC3B,aAAa,EACb,gCAAgC,EAChC,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,EACpB,sBAAsB,EACtB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,kCAAkC,EAClC,0CAA0C,EAC1C,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,uCAAuC,EACvC,sBAAsB,EACtB,mBAAmB,EACnB,mCAAmC,EACnC,gBAAgB,EAChB,2BAA2B,EAC3B,aAAa,EACb,gCAAgC,EAChC,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,EACpB,sBAAsB,EACtB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { applyObliqueNearClipPlane, areCameraGuardsEnabled, configureDirectionalShadowCamera3D, configureDirectionalShadowCamera3DTightFit, createCamera2D, createCamera3D, createOrthographicProjection, createPerspectiveProjection, disableCameraGuards, enableCameraGuards, getCamera2DParallaxPoint, getCamera2DViewMatrix, getCamera2DVisibleBounds, getCamera3DForward, getCamera3DFrustum, getCamera3DFrustumCorners, getCamera3DInverseViewProjectionMatrix4, getCamera3DLinearDepth, getCamera3DPosition, getCamera3DRayThroughBoundingSphere, getCamera3DRight, getCamera3DScreenToWorldRay, getCamera3DUp, getCamera3DViewProjectionMatrix4, getCamera3DViewSpaceZ, getCamera3DWorldToScreen, getCubeCaptureFaceCamera3D, getOrthographicProjectionTexelSize, intersectCamera3DRayWithPlane, isBoxInCamera3DFrustum, isOrthographicProjection, isPerspectiveProjection, isPointInCamera3DFrustum, isSphereInCamera3DFrustum, projectCamera2DPoint, reflectCamera3DByPlane, setCamera3DAspect, setCamera3DJitter, setCamera3DViewMatrix4FromLookAt, setCamera3DViewMatrix4FromMatrix4, setProjectionMatrix4, unprojectCamera2DPoint, updateCamera3DInverseViewProjection, zoomCamera2DAtScreenPoint, } from './contract';
|
|
1
|
+
export { applyObliqueNearClipPlane, areCameraGuardsEnabled, configureDirectionalShadowCamera3D, configureDirectionalShadowCamera3DTightFit, createCamera2D, createCamera3D, createOrthographicProjection, createPerspectiveProjection, createRawProjection, disableCameraGuards, enableCameraGuards, getCamera2DParallaxPoint, getCamera2DViewMatrix, getCamera2DVisibleBounds, getCamera3DForward, getCamera3DFrustum, getCamera3DFrustumCorners, getCamera3DInverseViewProjectionMatrix4, getCamera3DLinearDepth, getCamera3DPosition, getCamera3DRayThroughBoundingSphere, getCamera3DRight, getCamera3DScreenToWorldRay, getCamera3DUp, getCamera3DViewProjectionMatrix4, getCamera3DViewSpaceZ, getCamera3DWorldToScreen, getCubeCaptureFaceCamera3D, getOrthographicProjectionTexelSize, intersectCamera3DRayWithPlane, isBoxInCamera3DFrustum, isOrthographicProjection, isPerspectiveProjection, isRawProjection, isPointInCamera3DFrustum, isSphereInCamera3DFrustum, projectCamera2DPoint, reflectCamera3DByPlane, setCamera3DAspect, setCamera3DJitter, setCamera3DViewMatrix4FromLookAt, setCamera3DViewMatrix4FromMatrix4, setProjectionMatrix4, unprojectCamera2DPoint, updateCamera3DInverseViewProjection, zoomCamera2DAtScreenPoint, } 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,yBAAyB,EACzB,sBAAsB,EACtB,kCAAkC,EAClC,0CAA0C,EAC1C,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,uCAAuC,EACvC,sBAAsB,EACtB,mBAAmB,EACnB,mCAAmC,EACnC,gBAAgB,EAChB,2BAA2B,EAC3B,aAAa,EACb,gCAAgC,EAChC,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,EACpB,sBAAsB,EACtB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,kCAAkC,EAClC,0CAA0C,EAC1C,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,uCAAuC,EACvC,sBAAsB,EACtB,mBAAmB,EACnB,mCAAmC,EACnC,gBAAgB,EAChB,2BAA2B,EAC3B,aAAa,EACb,gCAAgC,EAChC,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,EACpB,sBAAsB,EACtB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
package/dist/projection.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { EntityConstruction, Matrix4Like } from '@flighthq/types/contract';
|
|
2
|
-
import type { OrthographicProjection, OrthographicProjectionOptions, PerspectiveProjection, PerspectiveProjectionOptions, Projection } from '@flighthq/types/contract';
|
|
2
|
+
import type { OrthographicProjection, OrthographicProjectionOptions, PerspectiveProjection, PerspectiveProjectionOptions, Projection, RawProjection, RawProjectionOptions } from '@flighthq/types/contract';
|
|
3
3
|
export declare function createOrthographicProjection(opts: Readonly<OrthographicProjectionOptions>): OrthographicProjection;
|
|
4
4
|
export declare function createPerspectiveProjection(opts: Readonly<PerspectiveProjectionOptions>): PerspectiveProjection;
|
|
5
|
+
export declare function createRawProjection(opts: Readonly<RawProjectionOptions>): RawProjection;
|
|
5
6
|
export declare function getOrthographicProjectionTexelSize(projection: Readonly<OrthographicProjection>, pixelWidth: number, pixelHeight: number): number;
|
|
6
7
|
export declare function initializeOrthographicProjection(out: EntityConstruction<OrthographicProjection>, opts: Readonly<OrthographicProjectionOptions>): void;
|
|
7
8
|
export declare function initializePerspectiveProjection(out: EntityConstruction<PerspectiveProjection>, opts: Readonly<PerspectiveProjectionOptions>): void;
|
|
9
|
+
export declare function initializeRawProjection(out: EntityConstruction<RawProjection>, opts: Readonly<RawProjectionOptions>): void;
|
|
8
10
|
export declare function isOrthographicProjection(projection: Readonly<Projection>): projection is OrthographicProjection;
|
|
9
11
|
export declare function isPerspectiveProjection(projection: Readonly<Projection>): projection is PerspectiveProjection;
|
|
12
|
+
export declare function isRawProjection(projection: Readonly<Projection>): projection is RawProjection;
|
|
10
13
|
export declare function setProjectionMatrix4(out: Matrix4Like, projection: Readonly<Projection>, aspect: number, near: number, far: number): void;
|
|
11
14
|
//# sourceMappingURL=projection.d.ts.map
|
package/dist/projection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,UAAU,
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,UAAU,EACV,aAAa,EACb,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,sBAAsB,CAIlH;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAAG,qBAAqB,CAI/G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,aAAa,CAIvF;AAKD,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,QAAQ,CAAC,sBAAsB,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAKD,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,EAC/C,IAAI,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC5C,IAAI,CAIN;AAID,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,EAC9C,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAC3C,IAAI,CAIN;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,kBAAkB,CAAC,aAAa,CAAC,EACtC,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GACnC,IAAI,CAIN;AAGD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,IAAI,sBAAsB,CAE/G;AAGD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,IAAI,qBAAqB,CAE7G;AAGD,wBAAgB,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,IAAI,aAAa,CAE7F;AAUD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,IAAI,CAaN"}
|
package/dist/projection.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
|
-
import { setOrthographicMatrix4, setPerspectiveMatrix4 } from '@flighthq/geometry/contract';
|
|
2
|
+
import { createMatrix4, setOrthographicMatrix4, setPerspectiveMatrix4 } from '@flighthq/geometry/contract';
|
|
3
3
|
export function createOrthographicProjection(opts) {
|
|
4
4
|
const out = allocateEntity();
|
|
5
5
|
initializeOrthographicProjection(out, opts);
|
|
@@ -10,6 +10,11 @@ export function createPerspectiveProjection(opts) {
|
|
|
10
10
|
initializePerspectiveProjection(out, opts);
|
|
11
11
|
return finishEntity(out);
|
|
12
12
|
}
|
|
13
|
+
export function createRawProjection(opts) {
|
|
14
|
+
const out = allocateEntity();
|
|
15
|
+
initializeRawProjection(out, opts);
|
|
16
|
+
return finishEntity(out);
|
|
17
|
+
}
|
|
13
18
|
// Returns the larger world-space footprint of one texel across an orthographic projection. Using the
|
|
14
19
|
// larger axis gives receiver offsets one conservative, aspect-independent unit even when the shadow
|
|
15
20
|
// map or light projection is not square. `pixelWidth`/`pixelHeight` must be positive.
|
|
@@ -31,6 +36,11 @@ export function initializePerspectiveProjection(out, opts) {
|
|
|
31
36
|
out.fovY = opts.fovY;
|
|
32
37
|
out.kind = 'perspective';
|
|
33
38
|
}
|
|
39
|
+
export function initializeRawProjection(out, opts) {
|
|
40
|
+
out.kind = 'raw';
|
|
41
|
+
out.matrix = createMatrix4();
|
|
42
|
+
out.matrix.m.set(opts.matrix.m);
|
|
43
|
+
}
|
|
34
44
|
// True when the projection is an orthographic descriptor. Narrows the discriminated union.
|
|
35
45
|
export function isOrthographicProjection(projection) {
|
|
36
46
|
return projection.kind === 'orthographic';
|
|
@@ -39,6 +49,10 @@ export function isOrthographicProjection(projection) {
|
|
|
39
49
|
export function isPerspectiveProjection(projection) {
|
|
40
50
|
return projection.kind === 'perspective';
|
|
41
51
|
}
|
|
52
|
+
// True when the projection is a raw (pre-built) matrix. Narrows the discriminated union.
|
|
53
|
+
export function isRawProjection(projection) {
|
|
54
|
+
return projection.kind === 'raw';
|
|
55
|
+
}
|
|
42
56
|
// Writes the projection matrix for `projection` into `out`, delegating to geometry's perspective
|
|
43
57
|
// or orthographic builders. `aspect` (viewport width / height) overrides a perspective
|
|
44
58
|
// projection's stored aspect so a single descriptor can drive a resizing viewport; it is ignored
|
|
@@ -52,6 +66,10 @@ export function setProjectionMatrix4(out, projection, aspect, near, far) {
|
|
|
52
66
|
setPerspectiveMatrix4(out, Math.tan(projection.fovY * 0.5), aspect, near, far);
|
|
53
67
|
return;
|
|
54
68
|
}
|
|
69
|
+
if (projection.kind === 'raw') {
|
|
70
|
+
out.m.set(projection.matrix.m);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
55
73
|
const halfWidth = projection.halfWidth;
|
|
56
74
|
const halfHeight = projection.halfHeight;
|
|
57
75
|
setOrthographicMatrix4(out, -halfWidth, halfWidth, -halfHeight, halfHeight, near, far);
|
package/dist/projection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAY3G,MAAM,UAAU,4BAA4B,CAAC,IAA6C;IACxF,MAAM,GAAG,GAAG,cAAc,EAA0B,CAAC;IACrD,gCAAgC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAA4C;IACtF,MAAM,GAAG,GAAG,cAAc,EAAyB,CAAC;IACpD,+BAA+B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAoC;IACtE,MAAM,GAAG,GAAG,cAAc,EAAiB,CAAC;IAC5C,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,oGAAoG;AACpG,sFAAsF;AACtF,MAAM,UAAU,kCAAkC,CAChD,UAA4C,EAC5C,UAAkB,EAClB,WAAmB;IAEnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;AACtG,CAAC;AAED,0FAA0F;AAC1F,wFAAwF;AACxF,wEAAwE;AACxE,MAAM,UAAU,gCAAgC,CAC9C,GAA+C,EAC/C,IAA6C;IAE7C,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACjC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC;AAC5B,CAAC;AAED,2FAA2F;AAC3F,gGAAgG;AAChG,MAAM,UAAU,+BAA+B,CAC7C,GAA8C,EAC9C,IAA4C;IAE5C,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,GAAG,CAAC,IAAI,GAAG,aAAa,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,GAAsC,EACtC,IAAoC;IAEpC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;IAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,wBAAwB,CAAC,UAAgC;IACvE,OAAO,UAAU,CAAC,IAAI,KAAK,cAAc,CAAC;AAC5C,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,uBAAuB,CAAC,UAAgC;IACtE,OAAO,UAAU,CAAC,IAAI,KAAK,aAAa,CAAC;AAC3C,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,UAAgC;IAC9D,OAAO,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC;AACnC,CAAC;AAED,iGAAiG;AACjG,uFAAuF;AACvF,iGAAiG;AACjG,iGAAiG;AACjG,6CAA6C;AAC7C,EAAE;AACF,4FAA4F;AAC5F,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CAClC,GAAgB,EAChB,UAAgC,EAChC,MAAc,EACd,IAAY,EACZ,GAAW;IAEX,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACzC,sBAAsB,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/reflection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflection.d.ts","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAYjF,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAkB5G;AAQD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"reflection.d.ts","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAYjF,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAkB5G;AAQD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAuClH"}
|
package/dist/reflection.js
CHANGED
|
@@ -41,12 +41,14 @@ export function reflectCamera3DByPlane(out, camera, plane) {
|
|
|
41
41
|
const jx = camera.jitter.x;
|
|
42
42
|
const jy = camera.jitter.y;
|
|
43
43
|
const projection = camera.projection;
|
|
44
|
+
const nearClipPlane = camera.nearClipPlane;
|
|
44
45
|
setMatrix4(__scratchReflection, 1 - 2 * pa * pa, -2 * pa * pb, -2 * pa * pc, 0, -2 * pa * pb, 1 - 2 * pb * pb, -2 * pb * pc, 0, -2 * pa * pc, -2 * pb * pc, 1 - 2 * pc * pc, 0, -2 * pa * pd, -2 * pb * pd, -2 * pc * pd, 1);
|
|
45
46
|
multiplyMatrix4(out.view, camera.view, __scratchReflection);
|
|
46
47
|
out.near = near;
|
|
47
48
|
out.far = far;
|
|
48
49
|
out.jitter.x = jx;
|
|
49
50
|
out.jitter.y = jy;
|
|
51
|
+
out.nearClipPlane = nearClipPlane;
|
|
50
52
|
out.projection = projection;
|
|
51
53
|
}
|
|
52
54
|
function _sgn(x) {
|
package/dist/reflection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzF,6FAA6F;AAC7F,2FAA2F;AAC3F,6FAA6F;AAC7F,8FAA8F;AAC9F,mDAAmD;AACnD,EAAE;AACF,qFAAqF;AACrF,6FAA6F;AAC7F,yFAAyF;AACzF,iBAAiB;AACjB,MAAM,UAAU,yBAAyB,CAAC,UAAuB,EAAE,cAAmC;IACpG,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAE5B,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACd,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,0FAA0F;AAC1F,yFAAyF;AACzF,qEAAqE;AACrE,EAAE;AACF,0FAA0F;AAC1F,6BAA6B;AAC7B,MAAM,UAAU,sBAAsB,CAAC,GAAa,EAAE,MAA0B,EAAE,KAA0B;IAC1G,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/camera",
|
|
3
|
-
"version": "0.5.1-next.
|
|
3
|
+
"version": "0.5.1-next.1058.751c53a",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.5.1-next.
|
|
42
|
-
"@flighthq/geometry": "0.5.1-next.
|
|
43
|
-
"@flighthq/log": "0.5.1-next.
|
|
44
|
-
"@flighthq/types": "0.5.1-next.
|
|
41
|
+
"@flighthq/entity": "0.5.1-next.1058.751c53a",
|
|
42
|
+
"@flighthq/geometry": "0.5.1-next.1058.751c53a",
|
|
43
|
+
"@flighthq/log": "0.5.1-next.1058.751c53a",
|
|
44
|
+
"@flighthq/types": "0.5.1-next.1058.751c53a"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"typescript": "^5.3.0"
|
package/src/camera.test.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createMatrix4,
|
|
3
|
+
createPlane,
|
|
3
4
|
createVector3,
|
|
4
5
|
inverseMatrix4,
|
|
5
6
|
multiplyMatrix4,
|
|
6
7
|
setMatrix4LookAt,
|
|
8
|
+
setPerspectiveMatrix4,
|
|
7
9
|
} from '@flighthq/geometry/contract';
|
|
8
10
|
|
|
9
11
|
import {
|
|
@@ -18,7 +20,13 @@ import {
|
|
|
18
20
|
setCamera3DViewMatrix4FromMatrix4,
|
|
19
21
|
updateCamera3DInverseViewProjection,
|
|
20
22
|
} from './camera';
|
|
21
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
createOrthographicProjection,
|
|
25
|
+
createPerspectiveProjection,
|
|
26
|
+
createRawProjection,
|
|
27
|
+
setProjectionMatrix4,
|
|
28
|
+
} from './projection';
|
|
29
|
+
import { applyObliqueNearClipPlane } from './reflection';
|
|
22
30
|
|
|
23
31
|
describe('createCamera3D', () => {
|
|
24
32
|
it('stores projection, near, far and identity view/inverse with zero jitter', () => {
|
|
@@ -30,10 +38,22 @@ describe('createCamera3D', () => {
|
|
|
30
38
|
expect(camera.far).toBe(100);
|
|
31
39
|
expect(camera.jitter.x).toBe(0);
|
|
32
40
|
expect(camera.jitter.y).toBe(0);
|
|
41
|
+
expect(camera.nearClipPlane).toBeNull();
|
|
33
42
|
expect(camera.view.m[0]).toBe(1);
|
|
34
43
|
expect(camera.view.m[5]).toBe(1);
|
|
35
44
|
expect(camera.inverseViewProjection.m[10]).toBe(1);
|
|
36
45
|
});
|
|
46
|
+
|
|
47
|
+
it('accepts an optional nearClipPlane', () => {
|
|
48
|
+
const plane = createPlane(0, 1, 0, -2);
|
|
49
|
+
const camera = createCamera3D({
|
|
50
|
+
far: 100,
|
|
51
|
+
near: 0.1,
|
|
52
|
+
nearClipPlane: plane,
|
|
53
|
+
projection: createPerspectiveProjection({ aspect: 1, fovY: 1 }),
|
|
54
|
+
});
|
|
55
|
+
expect(camera.nearClipPlane).toBe(plane);
|
|
56
|
+
});
|
|
37
57
|
});
|
|
38
58
|
|
|
39
59
|
describe('getCamera3DInverseViewProjectionMatrix4', () => {
|
|
@@ -108,6 +128,36 @@ describe('getCamera3DViewProjectionMatrix4', () => {
|
|
|
108
128
|
expect(jittered.m[9]).toBeCloseTo(base.m[9] + 0.5);
|
|
109
129
|
});
|
|
110
130
|
|
|
131
|
+
it('applies the oblique near clip plane when nearClipPlane is set', () => {
|
|
132
|
+
const camera = createCamera3D({
|
|
133
|
+
far: 100,
|
|
134
|
+
near: 0.1,
|
|
135
|
+
projection: createPerspectiveProjection({ aspect: 1.5, fovY: Math.PI / 3 }),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const withoutClip = createMatrix4();
|
|
139
|
+
getCamera3DViewProjectionMatrix4(withoutClip, camera, 1.5);
|
|
140
|
+
|
|
141
|
+
camera.nearClipPlane = createPlane(0, 1, 0, -1);
|
|
142
|
+
const withClip = createMatrix4();
|
|
143
|
+
getCamera3DViewProjectionMatrix4(withClip, camera, 1.5);
|
|
144
|
+
|
|
145
|
+
// The oblique clip modifies the third row of the projection (m[2], m[6], m[10], m[14]).
|
|
146
|
+
// Verify it differs from the symmetric projection.
|
|
147
|
+
const differs = Array.from({ length: 16 }, (_, i) => withClip.m[i] !== withoutClip.m[i]);
|
|
148
|
+
expect(differs.some(Boolean)).toBe(true);
|
|
149
|
+
|
|
150
|
+
// Verify the result matches manual oblique clip application.
|
|
151
|
+
const projMatrix = createMatrix4();
|
|
152
|
+
setProjectionMatrix4(projMatrix, camera.projection, 1.5, camera.near, camera.far);
|
|
153
|
+
applyObliqueNearClipPlane(projMatrix, camera.nearClipPlane);
|
|
154
|
+
const expected = createMatrix4();
|
|
155
|
+
multiplyMatrix4(expected, projMatrix, camera.view);
|
|
156
|
+
for (let i = 0; i < 16; i++) {
|
|
157
|
+
expect(withClip.m[i]).toBeCloseTo(expected.m[i]);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
111
161
|
it('is safe when out aliases the camera view', () => {
|
|
112
162
|
const projection = createPerspectiveProjection({ aspect: 1, fovY: 1 });
|
|
113
163
|
const camera = createCamera3D({ far: 100, near: 0.1, projection });
|
|
@@ -148,6 +198,17 @@ describe('setCamera3DAspect', () => {
|
|
|
148
198
|
expect(projection.halfHeight).toBe(5);
|
|
149
199
|
expect(projection.halfWidth).toBe(10);
|
|
150
200
|
});
|
|
201
|
+
|
|
202
|
+
it('is a no-op for a raw projection', () => {
|
|
203
|
+
const source = createMatrix4();
|
|
204
|
+
setPerspectiveMatrix4(source, 1, 1.5, 0.1, 100);
|
|
205
|
+
const projection = createRawProjection({ matrix: source });
|
|
206
|
+
const camera = createCamera3D({ far: 100, near: 0.1, projection });
|
|
207
|
+
setCamera3DAspect(camera, 999);
|
|
208
|
+
for (let i = 0; i < 16; i++) {
|
|
209
|
+
expect(projection.matrix.m[i]).toBeCloseTo(source.m[i]);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
151
212
|
});
|
|
152
213
|
|
|
153
214
|
describe('setCamera3DJitter', () => {
|
package/src/projection.test.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createMatrix4,
|
|
3
|
+
createPerspectiveMatrix4,
|
|
4
|
+
setPerspectiveMatrix4,
|
|
5
|
+
setOrthographicMatrix4,
|
|
6
|
+
} from '@flighthq/geometry/contract';
|
|
2
7
|
import { EntityRuntimeKey } from '@flighthq/types/contract';
|
|
3
8
|
import type { OrthographicProjection, PerspectiveProjection } from '@flighthq/types/contract';
|
|
4
9
|
|
|
5
10
|
import {
|
|
6
11
|
createOrthographicProjection,
|
|
7
12
|
createPerspectiveProjection,
|
|
13
|
+
createRawProjection,
|
|
8
14
|
getOrthographicProjectionTexelSize,
|
|
9
15
|
initializeOrthographicProjection,
|
|
10
16
|
initializePerspectiveProjection,
|
|
17
|
+
initializeRawProjection,
|
|
11
18
|
isOrthographicProjection,
|
|
12
19
|
isPerspectiveProjection,
|
|
20
|
+
isRawProjection,
|
|
13
21
|
setProjectionMatrix4,
|
|
14
22
|
} from './projection';
|
|
15
23
|
|
|
@@ -38,6 +46,20 @@ describe('createPerspectiveProjection', () => {
|
|
|
38
46
|
});
|
|
39
47
|
});
|
|
40
48
|
|
|
49
|
+
describe('createRawProjection', () => {
|
|
50
|
+
it('builds a raw projection from a matrix, copying the data', () => {
|
|
51
|
+
const source = createPerspectiveMatrix4(Math.tan(Math.PI / 6), 1.5, 0.1, 100);
|
|
52
|
+
const projection = createRawProjection({ matrix: source });
|
|
53
|
+
expect(EntityRuntimeKey in projection).toBe(true);
|
|
54
|
+
expect(projection.kind).toBe('raw');
|
|
55
|
+
for (let i = 0; i < 16; i++) {
|
|
56
|
+
expect(projection.matrix.m[i]).toBeCloseTo(source.m[i]);
|
|
57
|
+
}
|
|
58
|
+
source.m[0] = 999;
|
|
59
|
+
expect(projection.matrix.m[0]).not.toBe(999);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
41
63
|
describe('getOrthographicProjectionTexelSize', () => {
|
|
42
64
|
it('uses the larger world-space texel footprint for a non-square projection and map', () => {
|
|
43
65
|
const projection = createOrthographicProjection({ halfHeight: 20, halfWidth: 10 });
|
|
@@ -59,6 +81,12 @@ describe('initializePerspectiveProjection', () => {
|
|
|
59
81
|
});
|
|
60
82
|
});
|
|
61
83
|
|
|
84
|
+
describe('initializeRawProjection', () => {
|
|
85
|
+
it('is the construction initializer of createRawProjection', () => {
|
|
86
|
+
expect(typeof initializeRawProjection).toBe('function');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
62
90
|
describe('isOrthographicProjection', () => {
|
|
63
91
|
it('is true for orthographic and false for perspective', () => {
|
|
64
92
|
const ortho = createOrthographicProjection({ halfHeight: 1, halfWidth: 1 });
|
|
@@ -76,6 +104,17 @@ describe('isPerspectiveProjection', () => {
|
|
|
76
104
|
});
|
|
77
105
|
});
|
|
78
106
|
|
|
107
|
+
describe('isRawProjection', () => {
|
|
108
|
+
it('is true for raw and false for perspective and orthographic', () => {
|
|
109
|
+
const raw = createRawProjection({ matrix: createMatrix4() });
|
|
110
|
+
const persp = createPerspectiveProjection({ aspect: 1, fovY: 1 });
|
|
111
|
+
const ortho = createOrthographicProjection({ halfHeight: 1, halfWidth: 1 });
|
|
112
|
+
expect(isRawProjection(raw)).toBe(true);
|
|
113
|
+
expect(isRawProjection(persp)).toBe(false);
|
|
114
|
+
expect(isRawProjection(ortho)).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
79
118
|
describe('setProjectionMatrix4', () => {
|
|
80
119
|
it('matches geometry perspective builder using tan(fovY/2)', () => {
|
|
81
120
|
const fovY = Math.PI / 2;
|
|
@@ -106,6 +145,19 @@ describe('setProjectionMatrix4', () => {
|
|
|
106
145
|
}
|
|
107
146
|
});
|
|
108
147
|
|
|
148
|
+
it('copies the raw projection matrix verbatim, ignoring aspect/near/far', () => {
|
|
149
|
+
const source = createMatrix4();
|
|
150
|
+
setPerspectiveMatrix4(source, Math.tan(Math.PI / 4), 1.5, 0.1, 100);
|
|
151
|
+
const projection = createRawProjection({ matrix: source });
|
|
152
|
+
|
|
153
|
+
const out = createMatrix4();
|
|
154
|
+
setProjectionMatrix4(out, projection, 999, 0, 1);
|
|
155
|
+
|
|
156
|
+
for (let i = 0; i < 16; i++) {
|
|
157
|
+
expect(out.m[i]).toBeCloseTo(source.m[i]);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
109
161
|
it('matches geometry orthographic builder using symmetric half-extents', () => {
|
|
110
162
|
const projection: OrthographicProjection = createOrthographicProjection({ halfHeight: 3, halfWidth: 5 });
|
|
111
163
|
const near = 1;
|