UNPKG

@photo-sphere-viewer/cubemap-adapter

Version:
1 lines 24.2 kB
{"version":3,"sources":["src/index.ts","src/CubemapAdapter.ts","src/utils.ts"],"sourcesContent":["export { CubemapAdapter } from './CubemapAdapter';\nexport * from './model';\n","import type { AdapterConstructor, PanoramaPosition, Position, TextureData, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractAdapter, CONSTANTS, PSVError, SYSTEM, utils } from '@photo-sphere-viewer/core';\nimport { BoxGeometry, MathUtils, Mesh, MeshBasicMaterial, Texture, Vector2, Vector3 } from 'three';\nimport {\n Cubemap,\n CubemapAdapterConfig,\n CubemapData,\n CubemapFaces,\n CubemapNet,\n CubemapPanorama,\n CubemapSeparate,\n CubemapStripe,\n} from './model';\nimport { cleanCubemap, cleanCubemapArray, isCubemap } from './utils';\n\ntype CubemapMesh = Mesh<BoxGeometry, MeshBasicMaterial[]>;\ntype CubemapTextureData = TextureData<Texture[], CubemapPanorama, CubemapData>;\n\nconst getConfig = utils.getConfigParser<CubemapAdapterConfig>({\n blur: false,\n});\n\nconst EPS = 0.000001;\nconst ORIGIN = new Vector3();\n\n/**\n * Adapter for cubemaps\n */\nexport class CubemapAdapter extends AbstractAdapter<CubemapPanorama, CubemapData, Texture[], CubemapMesh> {\n static override readonly id = 'cubemap';\n static override readonly VERSION = PKG_VERSION;\n static override readonly supportsDownload = false;\n\n private readonly config: CubemapAdapterConfig;\n\n static withConfig(config: CubemapAdapterConfig): [AdapterConstructor, any] {\n return [CubemapAdapter, config];\n }\n\n constructor(viewer: Viewer, config: CubemapAdapterConfig) {\n super(viewer);\n\n this.config = getConfig(config);\n }\n\n override supportsTransition() {\n return true;\n }\n\n override supportsPreload() {\n return true;\n }\n\n /**\n * {@link https://github.com/bhautikj/vrProjector/blob/master/vrProjector/CubemapProjection.py#L130}\n */\n override textureCoordsToSphericalCoords(point: PanoramaPosition, data: CubemapData): Position {\n if (utils.isNil(point.textureX) || utils.isNil(point.textureY) || utils.isNil(point.textureFace)) {\n throw new PSVError(`Texture position is missing 'textureX', 'textureY' or 'textureFace'`);\n }\n\n const u = 2 * (point.textureX / data.faceSize - 0.5);\n const v = 2 * (point.textureY / data.faceSize - 0.5);\n\n function yawPitch(x: number, y: number, z: number): [number, number] {\n const dv = Math.sqrt(x * x + y * y + z * z);\n return [Math.atan2(y / dv, x / dv), -Math.asin(z / dv)];\n }\n\n let yaw: number;\n let pitch: number;\n switch (point.textureFace) {\n case 'front':\n [yaw, pitch] = yawPitch(1, u, v);\n break;\n case 'right':\n [yaw, pitch] = yawPitch(-u, 1, v);\n break;\n case 'left':\n [yaw, pitch] = yawPitch(u, -1, v);\n break;\n case 'back':\n [yaw, pitch] = yawPitch(-1, -u, v);\n break;\n case 'bottom':\n [yaw, pitch] = data.flipTopBottom ? yawPitch(-v, u, 1) : yawPitch(v, -u, 1);\n break;\n case 'top':\n [yaw, pitch] = data.flipTopBottom ? yawPitch(v, u, -1) : yawPitch(-v, -u, -1);\n break;\n }\n\n return { yaw, pitch };\n }\n\n override sphericalCoordsToTextureCoords(position: Position, data: CubemapData): PanoramaPosition {\n // @ts-ignore\n const raycaster = this.viewer.renderer.raycaster;\n // @ts-ignore\n const mesh = this.viewer.renderer.mesh;\n raycaster.set(ORIGIN, this.viewer.dataHelper.sphericalCoordsToVector3(position));\n const point = raycaster.intersectObject(mesh)[0].point.divideScalar(CONSTANTS.SPHERE_RADIUS);\n\n function mapUV(x: number, a1: number, a2: number): number {\n return Math.round(MathUtils.mapLinear(x, a1, a2, 0, data.faceSize));\n }\n\n let textureFace: CubemapFaces;\n let textureX: number;\n let textureY: number;\n if (1 - Math.abs(point.z) < EPS) {\n if (point.z > 0) {\n textureFace = 'front';\n textureX = mapUV(point.x, 1, -1);\n textureY = mapUV(point.y, 1, -1);\n } else {\n textureFace = 'back';\n textureX = mapUV(point.x, -1, 1);\n textureY = mapUV(point.y, 1, -1);\n }\n } else if (1 - Math.abs(point.x) < EPS) {\n if (point.x > 0) {\n textureFace = 'left';\n textureX = mapUV(point.z, -1, 1);\n textureY = mapUV(point.y, 1, -1);\n } else {\n textureFace = 'right';\n textureX = mapUV(point.z, 1, -1);\n textureY = mapUV(point.y, 1, -1);\n }\n } else {\n if (point.y > 0) {\n textureFace = 'top';\n textureX = mapUV(point.x, -1, 1);\n textureY = mapUV(point.z, 1, -1);\n } else {\n textureFace = 'bottom';\n textureX = mapUV(point.x, -1, 1);\n textureY = mapUV(point.z, -1, 1);\n }\n if (data.flipTopBottom) {\n textureX = data.faceSize - textureX;\n textureY = data.faceSize - textureY;\n }\n }\n\n return { textureFace, textureX, textureY };\n }\n\n async loadTexture(panorama: CubemapPanorama, loader = true): Promise<CubemapTextureData> {\n if (this.viewer.config.fisheye) {\n utils.logWarn('fisheye effect with cubemap texture can generate distorsion');\n }\n\n let cleanPanorama: CubemapSeparate | CubemapStripe | CubemapNet;\n if (Array.isArray(panorama) || isCubemap(panorama)) {\n cleanPanorama = {\n type: 'separate',\n paths: panorama,\n } as CubemapSeparate;\n } else {\n cleanPanorama = panorama as any;\n }\n\n let result: { textures: Texture[]; flipTopBottom: boolean; cacheKey: string };\n switch (cleanPanorama.type) {\n case 'separate':\n result = await this.loadTexturesSeparate(cleanPanorama, loader);\n break;\n\n case 'stripe':\n result = await this.loadTexturesStripe(cleanPanorama, loader);\n break;\n\n case 'net':\n result = await this.loadTexturesNet(cleanPanorama, loader);\n break;\n\n default:\n throw new PSVError('Invalid cubemap panorama, are you using the right adapter?');\n }\n\n return {\n panorama,\n texture: result.textures,\n cacheKey: result.cacheKey,\n panoData: {\n isCubemap: true,\n flipTopBottom: result.flipTopBottom,\n faceSize: (result.textures[0].image as HTMLImageElement | HTMLCanvasElement).width,\n },\n };\n }\n\n private async loadTexturesSeparate(panorama: CubemapSeparate, loader: boolean) {\n let paths: string[];\n if (Array.isArray(panorama.paths)) {\n paths = cleanCubemapArray(panorama.paths as string[]);\n } else {\n paths = cleanCubemap(panorama.paths as Cubemap);\n }\n\n const cacheKey = paths[0];\n const promises: Array<Promise<Texture>> = [];\n const progress = [0, 0, 0, 0, 0, 0];\n\n for (let i = 0; i < 6; i++) {\n if (!paths[i]) {\n progress[i] = 100;\n promises.push(Promise.resolve(null));\n } else {\n promises.push(\n this.viewer.textureLoader\n .loadImage(\n paths[i],\n loader\n ? (p) => {\n progress[i] = p;\n this.viewer.textureLoader.dispatchProgress(utils.sum(progress) / 6);\n }\n : null,\n cacheKey,\n )\n .then(img => this.createCubemapTexture(img)),\n );\n }\n }\n\n return {\n textures: await Promise.all(promises),\n cacheKey,\n flipTopBottom: panorama.flipTopBottom ?? false,\n };\n }\n\n private createCubemapTexture(img: HTMLImageElement): Texture {\n if (img.width !== img.height) {\n utils.logWarn('Invalid cubemap image, the width should equal the height');\n }\n\n // resize image\n if (this.config.blur || img.width > SYSTEM.maxTextureWidth) {\n const ratio = Math.min(1, SYSTEM.maxCanvasWidth / img.width);\n\n const buffer = new OffscreenCanvas(Math.floor(img.width * ratio), Math.floor(img.height * ratio));\n\n const ctx = buffer.getContext('2d');\n\n if (this.config.blur) {\n ctx.filter = `blur(${buffer.width / 512}px)`;\n }\n\n ctx.drawImage(img, 0, 0, buffer.width, buffer.height);\n\n return utils.createTexture(buffer);\n }\n\n return utils.createTexture(img);\n }\n\n private async loadTexturesStripe(panorama: CubemapStripe, loader: boolean) {\n if (!panorama.order) {\n panorama.order = ['left', 'front', 'right', 'back', 'top', 'bottom'];\n }\n\n const cacheKey = panorama.path;\n const img = await this.viewer.textureLoader.loadImage(\n panorama.path,\n loader ? p => this.viewer.textureLoader.dispatchProgress(p) : null,\n cacheKey,\n );\n\n if (img.width !== img.height * 6) {\n utils.logWarn('Invalid cubemap image, the width should be six times the height');\n }\n\n const ratio = Math.min(1, SYSTEM.maxCanvasWidth / img.height);\n const tileWidth = Math.floor(img.height * ratio);\n\n const textures = {} as Record<CubemapFaces, Texture>;\n\n for (let i = 0; i < 6; i++) {\n const buffer = new OffscreenCanvas(tileWidth, tileWidth);\n\n const ctx = buffer.getContext('2d');\n\n if (this.config.blur) {\n ctx.filter = `blur(${buffer.width / 512}px)`;\n }\n\n ctx.drawImage(\n img,\n img.height * i, 0,\n img.height, img.height,\n 0, 0,\n tileWidth, tileWidth,\n );\n\n textures[panorama.order[i]] = utils.createTexture(buffer);\n }\n\n return {\n textures: cleanCubemap(textures),\n cacheKey,\n flipTopBottom: panorama.flipTopBottom ?? false,\n };\n }\n\n private async loadTexturesNet(panorama: CubemapNet, loader: boolean) {\n const cacheKey = panorama.path;\n const img = await this.viewer.textureLoader.loadImage(\n panorama.path,\n loader ? p => this.viewer.textureLoader.dispatchProgress(p) : null,\n cacheKey,\n );\n\n if (img.width / 4 !== img.height / 3) {\n utils.logWarn('Invalid cubemap image, the width should be 4/3rd of the height');\n }\n\n const ratio = Math.min(1, SYSTEM.maxCanvasWidth / (img.width / 4));\n const tileWidth = Math.floor((img.width / 4) * ratio);\n\n const pts = [\n [0, 1 / 3], // left\n [1 / 2, 1 / 3], // right\n [1 / 4, 0], // top\n [1 / 4, 2 / 3], // bottom\n [3 / 4, 1 / 3], // back\n [1 / 4, 1 / 3], // front\n ];\n\n const textures: Texture[] = [];\n\n for (let i = 0; i < 6; i++) {\n const buffer = new OffscreenCanvas(tileWidth, tileWidth);\n\n const ctx = buffer.getContext('2d');\n\n if (this.config.blur) {\n ctx.filter = `blur(${buffer.width / 512}px)`;\n }\n\n ctx.drawImage(\n img,\n img.width * pts[i][0], img.height * pts[i][1],\n img.width / 4, img.height / 3,\n 0, 0,\n tileWidth, tileWidth,\n );\n\n textures[i] = utils.createTexture(buffer);\n }\n\n return {\n textures,\n cacheKey,\n flipTopBottom: true,\n };\n }\n\n createMesh(): CubemapMesh {\n const cubeSize = CONSTANTS.SPHERE_RADIUS * 2;\n const geometry = new BoxGeometry(cubeSize, cubeSize, cubeSize).scale(1, 1, -1);\n\n const materials: MeshBasicMaterial[] = [];\n for (let i = 0; i < 6; i++) {\n const material = new MeshBasicMaterial({ depthTest: false, depthWrite: false });\n materials.push(material);\n }\n\n return new Mesh(geometry, materials);\n }\n\n setTexture(mesh: CubemapMesh, { texture, panoData }: CubemapTextureData) {\n mesh.material.forEach((material, i) => {\n if (texture[i]) {\n if (panoData.flipTopBottom && (i === 2 || i === 3)) {\n texture[i].center = new Vector2(0.5, 0.5);\n texture[i].rotation = Math.PI;\n }\n\n material.map = texture[i];\n } else {\n material.opacity = 0;\n material.transparent = true;\n }\n });\n }\n\n setTextureOpacity(mesh: CubemapMesh, opacity: number) {\n mesh.material.forEach((material) => {\n if (material.map) {\n material.opacity = opacity;\n material.transparent = opacity < 1;\n }\n });\n }\n\n disposeTexture({ texture }: CubemapTextureData): void {\n texture.forEach(t => t.dispose());\n }\n\n disposeMesh(mesh: CubemapMesh): void {\n mesh.geometry.dispose();\n mesh.material.forEach(m => m.dispose());\n }\n}\n","import { PSVError } from '@photo-sphere-viewer/core';\nimport { Cubemap, CubemapFaces } from './model';\n\n// PSV faces order is left, front, right, back, top, bottom\n// 3JS faces order is left, right, top, bottom, back, front\nconst CUBE_ARRAY = [0, 2, 4, 5, 3, 1];\nconst CUBE_HASHMAP: CubemapFaces[] = ['left', 'right', 'top', 'bottom', 'back', 'front'];\n\nexport function isCubemap(cubemap: any): cubemap is Cubemap {\n return cubemap && typeof cubemap === 'object' && CUBE_HASHMAP.every(side => side in cubemap);\n}\n\n/**\n * Given an array of 6 objects in PSV order, returns an array in 3JS order\n */\nexport function cleanCubemapArray<T>(panorama: T[]): T[] {\n const cleanPanorama: T[] = [];\n\n if (panorama.length !== 6) {\n throw new PSVError('A cubemap array must contain exactly 6 images.');\n }\n\n // reorder images\n for (let i = 0; i < 6; i++) {\n cleanPanorama[i] = panorama[CUBE_ARRAY[i]];\n }\n\n return cleanPanorama;\n}\n\n/**\n * Given an object where keys are faces names, returns an array in 3JS order\n */\nexport function cleanCubemap<T>(cubemap: Record<CubemapFaces, T>): T[] {\n const cleanPanorama: T[] = [];\n\n if (!isCubemap(cubemap)) {\n throw new PSVError('A cubemap object must contain exactly left, front, right, back, top, bottom images.');\n }\n\n // transform into array\n CUBE_HASHMAP.forEach((side, i) => {\n cleanPanorama[i] = (cubemap as any)[side];\n });\n\n return cleanPanorama;\n}\n"],"mappings":"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","names":["import_core"]}