@realsee/equirect-toolbox 1.0.0

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.
Files changed (40) hide show
  1. package/README.md +184 -0
  2. package/configs/schema/cube.schema.json +40 -0
  3. package/configs/schema/rectlinear.schema.json +105 -0
  4. package/configs/templates/cube.json +8 -0
  5. package/configs/templates/rectlinear-euler.json +12 -0
  6. package/configs/templates/rectlinear-matrix.json +10 -0
  7. package/configs/templates/rectlinear-quaternion.json +15 -0
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +116 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/cube2equirect.d.ts +7 -0
  13. package/dist/cube2equirect.d.ts.map +1 -0
  14. package/dist/cube2equirect.js +77 -0
  15. package/dist/cube2equirect.js.map +1 -0
  16. package/dist/equirect2cube.d.ts +7 -0
  17. package/dist/equirect2cube.d.ts.map +1 -0
  18. package/dist/equirect2cube.js +63 -0
  19. package/dist/equirect2cube.js.map +1 -0
  20. package/dist/lib/create-webgl-canvas.d.ts +58 -0
  21. package/dist/lib/create-webgl-canvas.d.ts.map +1 -0
  22. package/dist/lib/create-webgl-canvas.js +191 -0
  23. package/dist/lib/create-webgl-canvas.js.map +1 -0
  24. package/dist/lib/cube-manifest.d.ts +11 -0
  25. package/dist/lib/cube-manifest.d.ts.map +1 -0
  26. package/dist/lib/cube-manifest.js +94 -0
  27. package/dist/lib/cube-manifest.js.map +1 -0
  28. package/dist/lib/cube-output.d.ts +9 -0
  29. package/dist/lib/cube-output.d.ts.map +1 -0
  30. package/dist/lib/cube-output.js +23 -0
  31. package/dist/lib/cube-output.js.map +1 -0
  32. package/dist/lib/headless-three.d.ts +8 -0
  33. package/dist/lib/headless-three.d.ts.map +1 -0
  34. package/dist/lib/headless-three.js +24 -0
  35. package/dist/lib/headless-three.js.map +1 -0
  36. package/dist/rectlinear.d.ts +36 -0
  37. package/dist/rectlinear.d.ts.map +1 -0
  38. package/dist/rectlinear.js +128 -0
  39. package/dist/rectlinear.js.map +1 -0
  40. package/package.json +72 -0
@@ -0,0 +1,63 @@
1
+ import { resolve } from "path";
2
+ import { existsSync } from "fs";
3
+ import { loadImage } from "@napi-rs/canvas";
4
+ import { ceilPowerOfTwo, cubeFaceKeys, getOutputFormat, writeCanvasImage, } from "./lib/cube-output.js";
5
+ import { createCubeManifestOutput, readCubeManifest, writeCubeManifest, } from "./lib/cube-manifest.js";
6
+ import * as THREE from "three";
7
+ import { createHeadlessRenderer } from "./lib/headless-three.js";
8
+ const faceRotations = {
9
+ px: [0, -Math.PI / 2, 0],
10
+ nx: [0, Math.PI / 2, 0],
11
+ py: [Math.PI / 2, 0, 0],
12
+ ny: [-Math.PI / 2, 0, 0],
13
+ pz: [0, Math.PI, 0],
14
+ nz: [0, 0, 0],
15
+ };
16
+ export async function convertEquirectToCube(options) {
17
+ const image = await loadImage(resolve(options.input));
18
+ const faceSize = ceilPowerOfTwo(Math.max(image.width / 4, image.height / 2));
19
+ const quality = options.quality ?? 95;
20
+ const imageFormat = "jpg";
21
+ let imagePaths;
22
+ let manifestToWrite;
23
+ if (existsSync(resolve(options.output))) {
24
+ imagePaths = readCubeManifest(options.output);
25
+ }
26
+ else {
27
+ const created = createCubeManifestOutput(options.output, imageFormat);
28
+ imagePaths = created.imagePaths;
29
+ manifestToWrite = created.manifest;
30
+ }
31
+ const format = getOutputFormat(imagePaths.px);
32
+ const { canvas, renderer } = await createHeadlessRenderer(faceSize, faceSize);
33
+ let texture;
34
+ let material;
35
+ try {
36
+ texture = new THREE.Texture(image);
37
+ texture.minFilter = THREE.LinearFilter;
38
+ texture.magFilter = THREE.LinearFilter;
39
+ texture.needsUpdate = true;
40
+ const geometry = new THREE.SphereGeometry(10, 64, 40);
41
+ geometry.scale(-1, 1, 1);
42
+ material = new THREE.MeshBasicMaterial({ map: texture });
43
+ const mesh = new THREE.Mesh(geometry, material);
44
+ const scene = new THREE.Scene();
45
+ scene.add(mesh);
46
+ const camera = new THREE.PerspectiveCamera(90, 1, 0.1, 100);
47
+ renderer.setSize(faceSize, faceSize, false);
48
+ for (const faceKey of cubeFaceKeys) {
49
+ const [x, y, z] = faceRotations[faceKey];
50
+ camera.rotation.set(x, y, z);
51
+ renderer.render(scene, camera);
52
+ writeCanvasImage(canvas, imagePaths[faceKey], format, quality);
53
+ }
54
+ if (manifestToWrite)
55
+ writeCubeManifest(options.output, manifestToWrite);
56
+ }
57
+ finally {
58
+ texture?.dispose();
59
+ material?.dispose();
60
+ renderer.dispose();
61
+ }
62
+ }
63
+ //# sourceMappingURL=equirect2cube.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equirect2cube.js","sourceRoot":"","sources":["../src/equirect2cube.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { EventEmitter } from "events";
2
+ import { type ContextAttributes, type SKRSContext2D, type SvgExportFlag } from "@napi-rs/canvas";
3
+ declare const _ctx: unique symbol;
4
+ type WebGLContextOptions = Record<string, unknown> | undefined;
5
+ type GLResizeExtension = {
6
+ resize(width: number, height: number): void;
7
+ };
8
+ type GLProgram = {
9
+ _uniforms?: Array<{
10
+ name: string;
11
+ }>;
12
+ };
13
+ type GLContext = {
14
+ RGBA: number;
15
+ UNSIGNED_BYTE: number;
16
+ canvas?: WebGLCanvas;
17
+ getExtension(name: string): GLResizeExtension | null;
18
+ getUniformLocation(program: GLProgram, name: string): unknown;
19
+ readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: Uint8Array): void;
20
+ texImage2D(...args: unknown[]): unknown;
21
+ };
22
+ export interface CanvasEvent {
23
+ type: string;
24
+ target?: WebGLCanvas;
25
+ [key: string]: unknown;
26
+ }
27
+ export declare class WebGLCanvas {
28
+ private readonly __canvas__;
29
+ private readonly __event__;
30
+ private readonly __attributes__;
31
+ private __gl__?;
32
+ private __contextType__?;
33
+ private [_ctx]?;
34
+ style: Record<string, unknown>;
35
+ constructor(width: number, height: number, type?: SvgExportFlag);
36
+ get width(): number;
37
+ set width(value: number);
38
+ get height(): number;
39
+ set height(value: number);
40
+ get clientWidth(): number;
41
+ get clientHeight(): number;
42
+ get __ctx__(): SKRSContext2D | undefined;
43
+ getContext(type: string, options?: ContextAttributes | WebGLContextOptions): GLContext | SKRSContext2D | null;
44
+ toBuffer(...args: unknown[]): Buffer;
45
+ toDataURL(...args: unknown[]): string;
46
+ createPNGStream(...args: unknown[]): NodeJS.ReadableStream;
47
+ createJPEGStream(...args: unknown[]): NodeJS.ReadableStream;
48
+ createPDFStream(...args: unknown[]): NodeJS.ReadableStream;
49
+ addEventListener(type: string, listener: (...args: unknown[]) => void): EventEmitter;
50
+ removeEventListener(type: string, listener?: (...args: unknown[]) => void): EventEmitter;
51
+ dispatchEvent(event: CanvasEvent): boolean;
52
+ setAttribute(key: string, value: string): void;
53
+ getAttribute(key: string): string | undefined;
54
+ removeAttribute(key: string): void;
55
+ }
56
+ declare function createWebGLCanvas(width: number, height: number, type?: SvgExportFlag): WebGLCanvas;
57
+ export default createWebGLCanvas;
58
+ //# sourceMappingURL=create-webgl-canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-webgl-canvas.d.ts","sourceRoot":"","sources":["../../src/lib/create-webgl-canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ import { createRequire } from "module";
2
+ import { EventEmitter } from "events";
3
+ import { Canvas, Image, } from "@napi-rs/canvas";
4
+ const require = createRequire(import.meta.url);
5
+ const createGLContext = require("gl");
6
+ const _ctx = Symbol("ctx");
7
+ function putImageData(gl, canvas) {
8
+ const { width, height } = canvas;
9
+ const ctx = canvas[_ctx];
10
+ if (!ctx) {
11
+ throw new Error("A 2D context is required before reading WebGL pixels");
12
+ }
13
+ const data = ctx.getImageData(0, 0, width, height);
14
+ const pixels = new Uint8Array(width * height * 4);
15
+ gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
16
+ for (let i = 0; i < height; i++) {
17
+ for (let j = 0; j < width; j++) {
18
+ const col = j;
19
+ const row = height - i - 1;
20
+ for (let k = 0; k < 4; k++) {
21
+ const idx = 4 * (row * width + col) + k;
22
+ const idx2 = 4 * (i * width + col) + k;
23
+ data.data[idx] = pixels[idx2];
24
+ }
25
+ }
26
+ }
27
+ ctx.putImageData(data, 0, 0);
28
+ return ctx;
29
+ }
30
+ function unwrapImage(value) {
31
+ if (typeof value === "object" && value !== null && "_image" in value) {
32
+ return value._image;
33
+ }
34
+ return value;
35
+ }
36
+ export class WebGLCanvas {
37
+ __canvas__;
38
+ __event__ = new EventEmitter();
39
+ __attributes__ = {};
40
+ __gl__;
41
+ __contextType__;
42
+ [_ctx];
43
+ style = {};
44
+ constructor(width, height, type) {
45
+ this.__canvas__ = new Canvas(width, height, type);
46
+ }
47
+ get width() {
48
+ return this.__canvas__.width;
49
+ }
50
+ set width(value) {
51
+ if (this.__gl__) {
52
+ const ext = this.__gl__.getExtension("STACKGL_resize_drawingbuffer");
53
+ ext?.resize(value, this.height);
54
+ }
55
+ this.__canvas__.width = value;
56
+ }
57
+ get height() {
58
+ return this.__canvas__.height;
59
+ }
60
+ set height(value) {
61
+ if (this.__gl__) {
62
+ const ext = this.__gl__.getExtension("STACKGL_resize_drawingbuffer");
63
+ ext?.resize(this.width, value);
64
+ }
65
+ this.__canvas__.height = value;
66
+ }
67
+ get clientWidth() {
68
+ return this.__canvas__.width;
69
+ }
70
+ get clientHeight() {
71
+ return this.__canvas__.height;
72
+ }
73
+ get __ctx__() {
74
+ const gl = this.__gl__;
75
+ if (gl) {
76
+ putImageData(gl, this);
77
+ }
78
+ return this[_ctx];
79
+ }
80
+ getContext(type, options) {
81
+ if (this.__contextType__ && this.__contextType__ !== type)
82
+ return null;
83
+ if (this.__gl__)
84
+ return this.__gl__;
85
+ // headless-gl only supports WebGL1. Reject webgl2 so three.js falls back.
86
+ if (type === "webgl2")
87
+ return null;
88
+ this.__contextType__ = type;
89
+ if (type === "webgl") {
90
+ const { width, height } = this;
91
+ this[_ctx] = this.__canvas__.getContext("2d", options) ?? undefined;
92
+ const ctx = createGLContext(width, height, options);
93
+ if (!ctx)
94
+ return null;
95
+ const originalGetUniformLocation = ctx.getUniformLocation.bind(ctx);
96
+ // Temporary fix https://github.com/stackgl/headless-gl/issues/170
97
+ ctx.getUniformLocation = (program, name) => {
98
+ if (program._uniforms && !/\[\d+\]$/.test(name)) {
99
+ const reg = new RegExp(`${name}\\[\\d+\\]$`);
100
+ for (let i = 0; i < program._uniforms.length; i++) {
101
+ const uniformName = program._uniforms[i].name;
102
+ if (reg.test(uniformName)) {
103
+ name = uniformName;
104
+ }
105
+ }
106
+ }
107
+ return originalGetUniformLocation(program, name);
108
+ };
109
+ ctx.canvas = this;
110
+ const originalTexImage2D = ctx.texImage2D.bind(ctx);
111
+ ctx.texImage2D = (...args) => {
112
+ let pixels = unwrapImage(args[args.length - 1]);
113
+ if (pixels instanceof Image) {
114
+ const canvas = new Canvas(pixels.width, pixels.height);
115
+ const canvasContext = canvas.getContext("2d");
116
+ canvasContext.drawImage(pixels, 0, 0);
117
+ args[args.length - 1] = canvasContext.getImageData(0, 0, pixels.width, pixels.height);
118
+ }
119
+ return originalTexImage2D(...args);
120
+ };
121
+ this.__gl__ = ctx;
122
+ return this.__gl__;
123
+ }
124
+ if (type === "2d") {
125
+ return this.__canvas__.getContext("2d", options);
126
+ }
127
+ return null;
128
+ }
129
+ toBuffer(...args) {
130
+ const gl = this.__gl__;
131
+ if (gl) {
132
+ putImageData(gl, this);
133
+ }
134
+ return this.__canvas__.toBuffer(...args);
135
+ }
136
+ toDataURL(...args) {
137
+ const gl = this.__gl__;
138
+ if (gl) {
139
+ putImageData(gl, this);
140
+ }
141
+ return this.__canvas__.toDataURL(...args);
142
+ }
143
+ createPNGStream(...args) {
144
+ const gl = this.__gl__;
145
+ if (gl) {
146
+ putImageData(gl, this);
147
+ }
148
+ return this.__canvas__.createPNGStream(...args);
149
+ }
150
+ createJPEGStream(...args) {
151
+ const gl = this.__gl__;
152
+ if (gl) {
153
+ putImageData(gl, this);
154
+ }
155
+ return this.__canvas__.createJPEGStream(...args);
156
+ }
157
+ createPDFStream(...args) {
158
+ const gl = this.__gl__;
159
+ if (gl) {
160
+ putImageData(gl, this);
161
+ }
162
+ return this.__canvas__.createPDFStream(...args);
163
+ }
164
+ addEventListener(type, listener) {
165
+ return this.__event__.addListener(type, listener);
166
+ }
167
+ removeEventListener(type, listener) {
168
+ if (listener) {
169
+ return this.__event__.removeListener(type, listener);
170
+ }
171
+ return this.__event__.removeAllListeners(type);
172
+ }
173
+ dispatchEvent(event) {
174
+ event.target = this;
175
+ return this.__event__.emit(event.type, event);
176
+ }
177
+ setAttribute(key, value) {
178
+ this.__attributes__[key] = value;
179
+ }
180
+ getAttribute(key) {
181
+ return this.__attributes__[key];
182
+ }
183
+ removeAttribute(key) {
184
+ delete this.__attributes__[key];
185
+ }
186
+ }
187
+ function createWebGLCanvas(width, height, type) {
188
+ return new WebGLCanvas(width, height, type);
189
+ }
190
+ export default createWebGLCanvas;
191
+ //# sourceMappingURL=create-webgl-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-webgl-canvas.js","sourceRoot":"","sources":["../../src/lib/create-webgl-canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type CubeFaceKey } from "./cube-output.js";
2
+ export type CubeManifest = Record<CubeFaceKey, string>;
3
+ export declare function initializeCubeJson(output: string): void;
4
+ export type CubeImageFormat = "jpg" | "png";
5
+ export declare function createCubeManifestOutput(output: string, imageFormat: CubeImageFormat): {
6
+ manifest: CubeManifest;
7
+ imagePaths: Record<CubeFaceKey, string>;
8
+ };
9
+ export declare function writeCubeManifest(output: string, manifest: CubeManifest): void;
10
+ export declare function readCubeManifest(path: string): CubeManifest;
11
+ //# sourceMappingURL=cube-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cube-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/cube-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;AAE5C,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,eAAe,GAC3B;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;CAAE,CA6BrE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAG9E;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAiC3D"}
@@ -0,0 +1,94 @@
1
+ import { Ajv2020 } from "ajv/dist/2020.js";
2
+ import { basename, dirname, extname, resolve } from "path";
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
4
+ import { fileURLToPath } from "url";
5
+ export function initializeCubeJson(output) {
6
+ const template = readFileSync(findCubeTemplate(), "utf8");
7
+ mkdirSync(dirname(resolve(output)), { recursive: true });
8
+ writeFileSync(resolve(output), template.endsWith("\n") ? template : `${template}\n`, "utf8");
9
+ }
10
+ export function createCubeManifestOutput(output, imageFormat) {
11
+ const manifestPath = resolve(output);
12
+ const extension = extname(manifestPath);
13
+ if (extension.toLowerCase() !== ".json") {
14
+ throw new Error("equirect2cube output must be a .json cube manifest path.");
15
+ }
16
+ const baseName = basename(manifestPath, extension);
17
+ const manifestDirectory = dirname(manifestPath);
18
+ const manifest = {
19
+ px: `${baseName}_px.${imageFormat}`,
20
+ nx: `${baseName}_nx.${imageFormat}`,
21
+ py: `${baseName}_py.${imageFormat}`,
22
+ ny: `${baseName}_ny.${imageFormat}`,
23
+ pz: `${baseName}_pz.${imageFormat}`,
24
+ nz: `${baseName}_nz.${imageFormat}`,
25
+ };
26
+ return {
27
+ manifest,
28
+ imagePaths: {
29
+ px: resolve(manifestDirectory, manifest.px),
30
+ nx: resolve(manifestDirectory, manifest.nx),
31
+ py: resolve(manifestDirectory, manifest.py),
32
+ ny: resolve(manifestDirectory, manifest.ny),
33
+ pz: resolve(manifestDirectory, manifest.pz),
34
+ nz: resolve(manifestDirectory, manifest.nz),
35
+ },
36
+ };
37
+ }
38
+ export function writeCubeManifest(output, manifest) {
39
+ mkdirSync(dirname(resolve(output)), { recursive: true });
40
+ writeFileSync(resolve(output), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
41
+ }
42
+ export function readCubeManifest(path) {
43
+ let value;
44
+ try {
45
+ value = JSON.parse(readFileSync(resolve(path), "utf8"));
46
+ }
47
+ catch (error) {
48
+ throw new Error(`Unable to read cube manifest ${path}: ${getErrorMessage(error)}`);
49
+ }
50
+ let schema;
51
+ try {
52
+ schema = JSON.parse(readFileSync(findCubeSchema(), "utf8"));
53
+ }
54
+ catch (error) {
55
+ throw new Error(`Unable to read cube schema: ${getErrorMessage(error)}`);
56
+ }
57
+ const ajv = new Ajv2020({ allErrors: true, strict: true });
58
+ const validate = ajv.compile(schema);
59
+ if (!validate(value)) {
60
+ throw new Error(`Invalid cube manifest:\n${ajv.errorsText(validate.errors, { separator: "\n" })}`);
61
+ }
62
+ const manifest = value;
63
+ const manifestDirectory = dirname(resolve(path));
64
+ return {
65
+ px: resolve(manifestDirectory, manifest.px),
66
+ nx: resolve(manifestDirectory, manifest.nx),
67
+ py: resolve(manifestDirectory, manifest.py),
68
+ ny: resolve(manifestDirectory, manifest.ny),
69
+ pz: resolve(manifestDirectory, manifest.pz),
70
+ nz: resolve(manifestDirectory, manifest.nz),
71
+ };
72
+ }
73
+ function findCubeTemplate() {
74
+ const moduleTemplate = resolve(dirname(fileURLToPath(import.meta.url)), "../../configs/templates/cube.json");
75
+ if (existsSync(moduleTemplate))
76
+ return moduleTemplate;
77
+ const workingDirectoryTemplate = resolve(process.cwd(), "configs/templates/cube.json");
78
+ if (existsSync(workingDirectoryTemplate))
79
+ return workingDirectoryTemplate;
80
+ throw new Error("Cube template not found: configs/templates/cube.json");
81
+ }
82
+ function findCubeSchema() {
83
+ const moduleSchema = resolve(dirname(fileURLToPath(import.meta.url)), "../../configs/schema/cube.schema.json");
84
+ if (existsSync(moduleSchema))
85
+ return moduleSchema;
86
+ const workingDirectorySchema = resolve(process.cwd(), "configs/schema/cube.schema.json");
87
+ if (existsSync(workingDirectorySchema))
88
+ return workingDirectorySchema;
89
+ throw new Error("Cube schema not found: configs/schema/cube.schema.json");
90
+ }
91
+ function getErrorMessage(error) {
92
+ return error instanceof Error ? error.message : String(error);
93
+ }
94
+ //# sourceMappingURL=cube-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cube-manifest.js","sourceRoot":"","sources":["../../src/lib/cube-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { WebGLCanvas } from "./create-webgl-canvas.js";
2
+ export type OutputFormat = "image/jpeg" | "image/png";
3
+ export declare const cubeFaceKeys: readonly ["px", "nx", "py", "ny", "pz", "nz"];
4
+ export type CubeFaceKey = (typeof cubeFaceKeys)[number];
5
+ export declare function getOutputFormat(output: string): OutputFormat;
6
+ export declare function writeCanvasImage(canvas: Pick<WebGLCanvas, "toBuffer">, output: string, format: OutputFormat, quality: number): void;
7
+ export declare function isPowerOfTwo(value: number): boolean;
8
+ export declare function ceilPowerOfTwo(value: number): number;
9
+ //# sourceMappingURL=cube-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cube-output.d.ts","sourceRoot":"","sources":["../../src/lib/cube-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEtD,eAAO,MAAM,YAAY,+CAAgD,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAO5D;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAKN;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,23 @@
1
+ import { dirname, extname, resolve } from "path";
2
+ import { mkdirSync, writeFileSync } from "fs";
3
+ export const cubeFaceKeys = ["px", "nx", "py", "ny", "pz", "nz"];
4
+ export function getOutputFormat(output) {
5
+ const extension = extname(output).toLowerCase();
6
+ if (extension === ".jpg" || extension === ".jpeg")
7
+ return "image/jpeg";
8
+ if (extension === ".png")
9
+ return "image/png";
10
+ throw new Error(`Unsupported output format ${extension || "(missing extension)"}. Use .jpg, .jpeg, or .png.`);
11
+ }
12
+ export function writeCanvasImage(canvas, output, format, quality) {
13
+ const buffer = format === "image/jpeg" ? canvas.toBuffer(format, quality) : canvas.toBuffer(format);
14
+ mkdirSync(dirname(resolve(output)), { recursive: true });
15
+ writeFileSync(resolve(output), buffer);
16
+ }
17
+ export function isPowerOfTwo(value) {
18
+ return value > 0 && (value & (value - 1)) === 0;
19
+ }
20
+ export function ceilPowerOfTwo(value) {
21
+ return 2 ** Math.ceil(Math.log2(value));
22
+ }
23
+ //# sourceMappingURL=cube-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cube-output.js","sourceRoot":"","sources":["../../src/lib/cube-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAK9C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAG1E,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC;IACvE,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IAC7C,MAAM,IAAI,KAAK,CACb,6BAA6B,SAAS,IAAI,qBAAqB,6BAA6B,CAC7F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAqC,EACrC,MAAc,EACd,MAAoB,EACpB,OAAe;IAEf,MAAM,MAAM,GACV,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvF,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as THREE from "three";
2
+ import type { WebGLCanvas } from "./create-webgl-canvas.js";
3
+ export declare function createHeadlessRenderer(width: number, height: number): Promise<{
4
+ canvas: WebGLCanvas;
5
+ renderer: THREE.WebGLRenderer;
6
+ }>;
7
+ export declare function ensureAnimationContext(): void;
8
+ //# sourceMappingURL=headless-three.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-three.d.ts","sourceRoot":"","sources":["../../src/lib/headless-three.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO5D,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC;CAC/B,CAAC,CAWD;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAU7C"}
@@ -0,0 +1,24 @@
1
+ import * as THREE from "three";
2
+ export async function createHeadlessRenderer(width, height) {
3
+ ensureAnimationContext();
4
+ const { default: createWebGLCanvas } = await import("./create-webgl-canvas.js");
5
+ const canvas = createWebGLCanvas(width, height);
6
+ const renderer = new THREE.WebGLRenderer({
7
+ canvas: canvas,
8
+ preserveDrawingBuffer: true,
9
+ });
10
+ return { canvas, renderer };
11
+ }
12
+ export function ensureAnimationContext() {
13
+ const runtime = globalThis;
14
+ if (runtime.self)
15
+ return;
16
+ runtime.self = {
17
+ requestAnimationFrame: (callback) => setImmediate(() => callback(Date.now())),
18
+ cancelAnimationFrame: (handle) => {
19
+ if (handle)
20
+ clearImmediate(handle);
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=headless-three.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-three.js","sourceRoot":"","sources":["../../src/lib/headless-three.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAa,EACb,MAAc;IAKd,sBAAsB,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,EAAE,MAEG;QACX,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,UAA6D,CAAC;IAC9E,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO;IAEzB,OAAO,CAAC,IAAI,GAAG;QACb,qBAAqB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7E,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,IAAI,MAAM;gBAAE,cAAc,CAAC,MAA0B,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ export type RectlinearConfig = {
2
+ viewport: {
3
+ width: number;
4
+ height: number;
5
+ };
6
+ camera: {
7
+ vfov: number;
8
+ } & (EulerPose | MatrixPose | QuaternionPose);
9
+ };
10
+ type EulerPose = {
11
+ yaw: number;
12
+ pitch: number;
13
+ roll: number;
14
+ };
15
+ type MatrixPose = {
16
+ matrix: [number, number, number, number, number, number, number, number, number];
17
+ };
18
+ type QuaternionPose = {
19
+ quaternion: {
20
+ x: number;
21
+ y: number;
22
+ z: number;
23
+ w: number;
24
+ };
25
+ };
26
+ type RectlinearOptions = {
27
+ input: string;
28
+ output: string;
29
+ config: string;
30
+ quality?: number;
31
+ };
32
+ export declare function renderRectlinear(options: RectlinearOptions): Promise<void>;
33
+ export declare function initializeRectlinearConfig(type: string, output: string): void;
34
+ export declare function validateRectlinearConfig(value: unknown): asserts value is RectlinearConfig;
35
+ export {};
36
+ //# sourceMappingURL=rectlinear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rectlinear.d.ts","sourceRoot":"","sources":["../src/rectlinear.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,CAAC,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC,CAAC;CAC/C,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClF,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;CACH,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAW7E;AAcD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAe1F"}