@flighthq/camera 0.2.1-next.451.d9a4a4e → 0.2.1-next.530.a223ca9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"basis.d.ts","sourceRoot":"","sources":["../src/basis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAOrF;AAWD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CA2BtF;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAKnF;AAMD,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAKhF"}
1
+ {"version":3,"file":"basis.d.ts","sourceRoot":"","sources":["../src/basis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAOrF;AAWD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAuBtF;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAKnF;AAMD,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAKhF"}
package/dist/basis.js CHANGED
@@ -22,11 +22,7 @@ export function getCamera3DForward(out, camera) {
22
22
  // Safe when `out` aliases any field of the camera.
23
23
  export function getCamera3DPosition(out, camera) {
24
24
  const m = camera.view.m;
25
- // Column-major storage: element(row, col) = m[row + 4*col].
26
- // The 3×3 rotation block R^T (transposed) has rows:
27
- // row 0: m[0], m[1], m[2] (column 0 of R = right x-components)
28
- // row 1: m[4], m[5], m[6] (column 1 of R = up y-components ... wait, this is col 1 of R)
29
- // Actually R^T column 0 = R row 0 = [m[0], m[4], m[8]], but the inverse translation is:
25
+ // Column-major storage: element(row, col) = m[row + 4*col]. For the orthonormal rotation block:
30
26
  // eye = -(R^T · t)
31
27
  // (R^T · t).x = m[0]*m[12] + m[1]*m[13] + m[2]*m[14]
32
28
  // (R^T · t).y = m[4]*m[12] + m[5]*m[13] + m[6]*m[14]
package/dist/basis.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"basis.js","sourceRoot":"","sources":["../src/basis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"basis.js","sourceRoot":"","sources":["../src/basis.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"depth.d.ts","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAchD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBvF;AAOD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtF"}
1
+ {"version":3,"file":"depth.d.ts","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAahD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBvF;AAOD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtF"}
package/dist/depth.js CHANGED
@@ -3,8 +3,7 @@
3
3
  // point in front of the camera (standard right-handed convention where the camera looks toward -Z).
4
4
  //
5
5
  // For perspective projection the NDC depth is non-linear; this undoes that non-linearity using the
6
- // camera's near/far clip planes. For orthographic projection the depth is already linear, so the
7
- // same formula still applies but the result is a simple remap.
6
+ // camera's near/far clip planes. Orthographic projection uses its own affine remap.
8
7
  //
9
8
  // `ndcZ` should be in [-1, 1] (OpenGL depth convention). Values outside that range are clamped
10
9
  // mathematically — no explicit clamp is applied; callers should supply valid NDC depths.
@@ -17,6 +16,9 @@ export function getCamera3DLinearDepth(camera, ndcZ) {
17
16
  if (range === 0) {
18
17
  return 0;
19
18
  }
19
+ if (camera.projection.kind === 'orthographic') {
20
+ return -(near + ((ndcZ + 1) * range) / 2);
21
+ }
20
22
  // Map ndcZ from [-1, 1] back to the view-space Z for a perspective projection.
21
23
  // Derived from the perspective depth mapping:
22
24
  // ndcZ = (far + near) / (near - far) + (2 * far * near) / ((near - far) * viewZ)
package/dist/depth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"depth.js","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,kGAAkG;AAClG,oGAAoG;AACpG,EAAE;AACF,mGAAmG;AACnG,iGAAiG;AACjG,+DAA+D;AAC/D,EAAE;AACF,+FAA+F;AAC/F,yFAAyF;AACzF,EAAE;AACF,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CAAC,MAA0B,EAAE,IAAY;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;IACzB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,+EAA+E;IAC/E,8CAA8C;IAC9C,mFAAmF;IACnF,qBAAqB;IACrB,sEAAsE;IACtE,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;AACxC,CAAC;AAED,8FAA8F;AAC9F,qGAAqG;AACrG,6FAA6F;AAC7F,EAAE;AACF,8DAA8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,MAA0B,EAAE,IAAY;IAC5E,OAAO,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"depth.js","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,kGAAkG;AAClG,oGAAoG;AACpG,EAAE;AACF,mGAAmG;AACnG,oFAAoF;AACpF,EAAE;AACF,+FAA+F;AAC/F,yFAAyF;AACzF,EAAE;AACF,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CAAC,MAA0B,EAAE,IAAY;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;IACzB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,+EAA+E;IAC/E,8CAA8C;IAC9C,mFAAmF;IACnF,qBAAqB;IACrB,sEAAsE;IACtE,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;AACxC,CAAC;AAED,8FAA8F;AAC9F,qGAAqG;AACrG,6FAA6F;AAC7F,EAAE;AACF,8DAA8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,MAA0B,EAAE,IAAY;IAC5E,OAAO,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/camera",
3
- "version": "0.2.1-next.451.d9a4a4e",
3
+ "version": "0.2.1-next.530.a223ca9",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/flighthq/flight.git",
@@ -32,9 +32,9 @@
32
32
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
33
33
  },
34
34
  "dependencies": {
35
- "@flighthq/entity": "0.2.1-next.451.d9a4a4e",
36
- "@flighthq/geometry": "0.2.1-next.451.d9a4a4e",
37
- "@flighthq/types": "0.2.1-next.451.d9a4a4e"
35
+ "@flighthq/entity": "0.2.1-next.530.a223ca9",
36
+ "@flighthq/geometry": "0.2.1-next.530.a223ca9",
37
+ "@flighthq/types": "0.2.1-next.530.a223ca9"
38
38
  },
39
39
  "devDependencies": {
40
40
  "typescript": "^5.3.0"
package/src/depth.test.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createCamera3D } from './camera';
2
2
  import { getCamera3DLinearDepth, getCamera3DViewSpaceZ } from './depth';
3
- import { createPerspectiveProjection } from './projection';
3
+ import { createOrthographicProjection, createPerspectiveProjection } from './projection';
4
4
 
5
5
  function makeCamera(near = 0.1, far = 100) {
6
6
  return createCamera3D({
@@ -37,6 +37,18 @@ describe('getCamera3DLinearDepth', () => {
37
37
  expect(depth).toBeLessThan(-1);
38
38
  expect(depth).toBeGreaterThan(-100);
39
39
  });
40
+
41
+ it('linearly maps orthographic NDC depth to the clip range', () => {
42
+ const camera = createCamera3D({
43
+ far: 101,
44
+ near: 1,
45
+ projection: createOrthographicProjection({ halfHeight: 1, halfWidth: 1 }),
46
+ });
47
+
48
+ expect(getCamera3DLinearDepth(camera, -1)).toBeCloseTo(-1);
49
+ expect(getCamera3DLinearDepth(camera, 0)).toBeCloseTo(-51);
50
+ expect(getCamera3DLinearDepth(camera, 1)).toBeCloseTo(-101);
51
+ });
40
52
  });
41
53
 
42
54
  describe('getCamera3DViewSpaceZ', () => {