Skip to content

Commit 4218650

Browse files
feat: handle camera type fallback properly
Set camera parameters to default value properly when falling back to perspective projection type.
1 parent 0a12f88 commit 4218650

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

src/api/provider/GraphConverter.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,21 @@ export type MeshParameters = {
2020
perspective: boolean;
2121
};
2222

23-
export function convertCameraType(graphCameraType: string): string {
24-
switch (graphCameraType) {
23+
type ProjectionModel = {
24+
cameraType: string;
25+
parameters: number[];
26+
}
27+
28+
export function convertCameraType(cameraType: string, parameters: number[]): ProjectionModel {
29+
switch (cameraType) {
2530
case "equirectangular":
2631
case "spherical":
27-
return "spherical";
32+
return {cameraType: "spherical", parameters};
33+
case "perspective":
2834
case "fisheye":
29-
return "fisheye";
35+
return {cameraType, parameters};
3036
default:
31-
return "perspective";
37+
return {cameraType: "perspective", parameters: [0.85, 0, 0]};
3238
}
3339
}
3440

@@ -150,8 +156,9 @@ export class GraphConverter {
150156
public spatialImage(
151157
source: GraphSpatialImageEnt)
152158
: SpatialImageEnt {
153-
source.camera_type = convertCameraType(source.camera_type);
154-
source.camera_parameters = source.camera_parameters ?? [];
159+
const {cameraType, parameters} = convertCameraType(source.camera_type, source.camera_parameters);
160+
source.camera_type = cameraType;
161+
source.camera_parameters = parameters;
155162
source.merge_id = source.merge_cc ? source.merge_cc.toString() : null;
156163
source.private = null;
157164
const thumbUrl = source.camera_type === 'spherical' ?

test/api/provider/GraphConverter.test.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,36 @@ import {
1515

1616
describe("convertCameraType", () => {
1717
test("should convert to supported types", () => {
18-
expect(convertCameraType("spherical")).toBe("spherical");
19-
expect(convertCameraType("equirectangular")).toBe("spherical");
20-
expect(convertCameraType("fisheye")).toBe("fisheye");
21-
expect(convertCameraType("perspective")).toBe("perspective");
22-
expect(convertCameraType("not-supported")).toBe("perspective");
18+
const equirectangular = convertCameraType("equirectangular", []);
19+
expect(equirectangular.cameraType).toBe("spherical");
20+
21+
const spherical = convertCameraType("spherical", []);
22+
expect(spherical.cameraType).toBe("spherical");
23+
24+
const fisheye = convertCameraType("fisheye", [0.5]);
25+
expect(fisheye.cameraType).toBe("fisheye");
26+
expect(fisheye.parameters.length).toBe(1);
27+
expect(fisheye.parameters[0]).toBe(0.5);
28+
29+
const perspective = convertCameraType("perspective", [0.2, 0.3]);
30+
expect(perspective.cameraType).toBe("perspective");
31+
expect(perspective.parameters.length).toBe(2);
32+
expect(perspective.parameters[0]).toBe(0.2);
33+
expect(perspective.parameters[1]).toBe(0.3);
34+
35+
const incorrect = convertCameraType("not-supported", [0.4]);
36+
expect(incorrect.cameraType).toBe("perspective");
37+
expect(incorrect.parameters.length).toBe(3);
38+
expect(incorrect.parameters[0]).toBe(0.85);
39+
expect(incorrect.parameters[1]).toBe(0);
40+
expect(incorrect.parameters[2]).toBe(0);
41+
42+
const empty = convertCameraType("", [0.4]);
43+
expect(empty.cameraType).toBe("perspective");
44+
expect(empty.parameters.length).toBe(3);
45+
expect(empty.parameters[0]).toBe(0.85);
46+
expect(empty.parameters[1]).toBe(0);
47+
expect(empty.parameters[2]).toBe(0);
2348
});
2449
});
2550

0 commit comments

Comments
 (0)