three-stdlib 2.30.0 → 2.30.2

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.
@@ -231,6 +231,14 @@ ${array.join("")}
231
231
  inputs.push(
232
232
  `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`
233
233
  );
234
+ if (material.transparent || material.alphaTest > 0) {
235
+ inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`);
236
+ }
237
+ if (material.alphaTest > 0.01) {
238
+ inputs.push(`${pad}float inputs:opacityThreshold = ${material.alphaTest}`);
239
+ } else if (material.transparent || material.alphaTest > 0) {
240
+ inputs.push(`${pad}float inputs:opacityThreshold = 0.01`);
241
+ }
234
242
  samplers.push(this.buildTexture(material, material.map, "diffuse", material.color));
235
243
  } else {
236
244
  inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`);
@@ -328,6 +336,7 @@ ${samplers.join("\n")}
328
336
  float outputs:g
329
337
  float outputs:b
330
338
  float3 outputs:rgb
339
+ ${material.transparent || material.alphaTest > 0 ? "float outputs:a" : ""}
331
340
  }`;
332
341
  }
333
342
  buildColor(color) {
@@ -1 +1 @@
1
- {"version":3,"file":"USDZExporter.cjs","sources":["../../src/exporters/USDZExporter.ts"],"sourcesContent":["import { zipSync, strToU8, Zippable } from 'fflate'\nimport {\n BufferGeometry,\n Color,\n Matrix4,\n Mesh,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n Texture,\n Vector2,\n} from 'three'\nimport { Nullable } from '../types/utils'\n\ntype MaterialRepresentaion = MeshStandardMaterial | MeshPhysicalMaterial\n\nclass USDZExporter {\n private readonly PRECISION = 7\n\n private materials: { [key: string]: MaterialRepresentaion }\n private textures: { [key: string]: Texture }\n\n private files: Nullable<Zippable>\n\n constructor() {\n this.materials = {}\n this.textures = {}\n\n this.files = {}\n }\n\n public async parse(scene: Object3D): Promise<Uint8Array> {\n const modelFileName = 'model.usda'\n\n // model file should be first in USDZ archive so we init it here\n this.files[modelFileName] = null\n\n let output: string | null = this.buildHeader()\n\n scene.traverseVisible((object) => {\n if (object instanceof Mesh && object.isMesh && object.material.isMeshStandardMaterial) {\n const geometry: BufferGeometry = object.geometry\n const material: MaterialRepresentaion = object.material\n\n const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd'\n\n if (!(geometryFileName in this.files)) {\n const meshObject = this.buildMeshObject(geometry)\n this.files[geometryFileName] = this.buildUSDFileAsString(meshObject)\n }\n\n if (!(material.uuid in this.materials)) {\n this.materials[material.uuid] = material\n }\n\n output += this.buildXform(object, geometry, material)\n }\n })\n\n output += this.buildMaterials(this.materials)\n\n this.files[modelFileName] = strToU8(output)\n output = null\n\n for (const id in this.textures) {\n const texture = this.textures[id]\n const color = id.split('_')[1]\n const isRGBA = texture.format === 1023\n\n const canvas = this.imageToCanvas(texture.image, color)\n const blob = await new Promise<Blob | null>((resolve) =>\n canvas?.toBlob(resolve, isRGBA ? 'image/png' : 'image/jpeg', 1),\n )\n\n if (blob) {\n this.files[`textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}`] = new Uint8Array(await blob.arrayBuffer())\n }\n }\n\n // 64 byte alignment\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n let offset = 0\n\n for (const filename in this.files) {\n const file = this.files[filename]\n const headerSize = 34 + filename.length\n\n offset += headerSize\n\n const offsetMod64 = offset & 63\n\n if (offsetMod64 !== 4 && file !== null && file instanceof Uint8Array) {\n const padLength = 64 - offsetMod64\n const padding = new Uint8Array(padLength)\n\n this.files[filename] = [file, { extra: { 12345: padding } }]\n }\n\n if (file && typeof file.length === 'number') {\n offset = file.length\n }\n }\n\n return zipSync(this.files as Zippable, { level: 0 })\n }\n\n private imageToCanvas(\n image: HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap,\n color: string,\n ): HTMLCanvasElement | undefined {\n if (\n (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||\n (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap)\n ) {\n const scale = 1024 / Math.max(image.width, image.height)\n\n const canvas = document.createElement('canvas')\n canvas.width = image.width * Math.min(1, scale)\n canvas.height = image.height * Math.min(1, scale)\n\n const context = canvas.getContext('2d')\n context?.drawImage(image, 0, 0, canvas.width, canvas.height)\n\n if (color !== undefined) {\n const hex = parseInt(color, 16)\n\n const r = ((hex >> 16) & 255) / 255\n const g = ((hex >> 8) & 255) / 255\n const b = (hex & 255) / 255\n\n const imagedata = context?.getImageData(0, 0, canvas.width, canvas.height)\n if (imagedata) {\n const data = imagedata?.data\n\n for (let i = 0; i < data.length; i += 4) {\n data[i + 0] = data[i + 0] * r\n data[i + 1] = data[i + 1] * g\n data[i + 2] = data[i + 2] * b\n }\n\n context?.putImageData(imagedata, 0, 0)\n }\n }\n\n return canvas\n }\n }\n\n private buildHeader(): string {\n return `#usda 1.0\n(\n customLayerData = {\n string creator = \"Three.js USDZExporter\"\n }\n metersPerUnit = 1\n upAxis = \"Y\"\n)\n`\n }\n\n private buildUSDFileAsString(dataToInsert: string): Uint8Array {\n let output = this.buildHeader()\n output += dataToInsert\n return strToU8(output)\n }\n\n // Xform\n private buildXform(object: Object3D, geometry: BufferGeometry, material: MaterialRepresentaion): string {\n const name = 'Object_' + object.id\n const transform = this.buildMatrix(object.matrixWorld)\n\n if (object.matrixWorld.determinant() < 0) {\n console.warn('THREE.USDZExporter: USDZ does not support negative scales', object)\n }\n\n return `def Xform \"${name}\" (\n prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>\n)\n{\n matrix4d xformOp:transform = ${transform}\n uniform token[] xformOpOrder = [\"xformOp:transform\"]\n rel material:binding = </Materials/Material_${material.id}>\n}\n`\n }\n\n private buildMatrix(matrix: Matrix4): string {\n const array = matrix.elements\n\n return `( ${this.buildMatrixRow(array, 0)}, ${this.buildMatrixRow(array, 4)}, ${this.buildMatrixRow(\n array,\n 8,\n )}, ${this.buildMatrixRow(array, 12)} )`\n }\n\n private buildMatrixRow(array: number[], offset: number): string {\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`\n }\n\n // Mesh\n private buildMeshObject(geometry: BufferGeometry): string {\n const mesh = this.buildMesh(geometry)\n return `\ndef \"Geometry\"\n{\n ${mesh}\n}\n`\n }\n\n private buildMesh(geometry: BufferGeometry): string {\n const name = 'Geometry'\n const attributes = geometry.attributes\n const count = attributes.position.count\n\n return `\n def Mesh \"${name}\"\n {\n int[] faceVertexCounts = [${this.buildMeshVertexCount(geometry)}]\n int[] faceVertexIndices = [${this.buildMeshVertexIndices(geometry)}]\n normal3f[] normals = [${this.buildVector3Array(attributes.normal, count)}] (\n interpolation = \"vertex\"\n )\n point3f[] points = [${this.buildVector3Array(attributes.position, count)}]\n float2[] primvars:st = [${this.buildVector2Array(attributes.uv, count)}] (\n interpolation = \"vertex\"\n )\n uniform token subdivisionScheme = \"none\"\n }\n`\n }\n\n private buildMeshVertexCount(geometry: BufferGeometry): string {\n const count = geometry.index !== null ? geometry.index.array.length : geometry.attributes.position.count\n\n return Array(count / 3)\n .fill(3)\n .join(', ')\n }\n\n private buildMeshVertexIndices(geometry: BufferGeometry): string {\n if (geometry.index !== null) {\n // @ts-ignore\n return geometry.index.array.join(', ')\n }\n\n const array: number[] = []\n const length = geometry.attributes.position.count\n\n for (let i = 0; i < length; i++) {\n array.push(i)\n }\n\n return array.join(', ')\n }\n\n private buildVector3Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: Normals missing.')\n return Array(count).fill('(0, 0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 3) {\n array.push(\n `(${data[i + 0].toPrecision(this.PRECISION)}, ${data[i + 1].toPrecision(this.PRECISION)}, ${data[\n i + 2\n ].toPrecision(this.PRECISION)})`,\n )\n }\n\n return array.join(', ')\n }\n\n private buildVector2Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: UVs missing.')\n return Array(count).fill('(0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 2) {\n // @ts-ignore\n array.push(`(${data[i + 0].toPrecision(this.PRECISION)}, ${1 - data[i + 1].toPrecision(this.PRECISION)})`)\n }\n\n return array.join(', ')\n }\n\n // Materials\n private buildMaterials(materials: USDZExporter['materials']): string {\n const array: string[] = []\n\n for (const uuid in materials) {\n const material = materials[uuid]\n\n array.push(this.buildMaterial(material))\n }\n\n return `def \"Materials\"\n{\n${array.join('')}\n}\n`\n }\n\n private buildMaterial(material: MaterialRepresentaion): string {\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n const pad = ' '\n const inputs = []\n const samplers = []\n\n if (material.map !== null) {\n inputs.push(\n `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.map, 'diffuse', material.color))\n } else {\n inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`)\n }\n\n if (material.emissiveMap !== null) {\n inputs.push(\n `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.emissiveMap, 'emissive'))\n } else if (material.emissive.getHex() > 0) {\n inputs.push(`${pad}color3f inputs:emissiveColor = ${this.buildColor(material.emissive)}`)\n }\n\n if (material.normalMap !== null) {\n inputs.push(\n `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.normalMap, 'normal'))\n }\n\n if (material.aoMap !== null) {\n inputs.push(\n `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`,\n )\n\n samplers.push(this.buildTexture(material, material.aoMap, 'occlusion'))\n }\n\n if (material.roughnessMap !== null && material.roughness === 1) {\n inputs.push(\n `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`,\n )\n\n samplers.push(this.buildTexture(material, material.roughnessMap, 'roughness'))\n } else {\n inputs.push(`${pad}float inputs:roughness = ${material.roughness}`)\n }\n\n if (material.metalnessMap !== null && material.metalness === 1) {\n inputs.push(\n `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`,\n )\n\n samplers.push(this.buildTexture(material, material.metalnessMap, 'metallic'))\n } else {\n inputs.push(`${pad}float inputs:metallic = ${material.metalness}`)\n }\n\n inputs.push(`${pad}float inputs:opacity = ${material.opacity}`)\n\n if (material instanceof MeshPhysicalMaterial) {\n inputs.push(`${pad}float inputs:clearcoat = ${material.clearcoat}`)\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`)\n inputs.push(`${pad}float inputs:ior = ${material.ior}`)\n }\n\n return `\n def Material \"Material_${material.id}\"\n {\n def Shader \"PreviewSurface\"\n {\n uniform token info:id = \"UsdPreviewSurface\"\n${inputs.join('\\n')}\n int inputs:useSpecularWorkflow = 0\n token outputs:surface\n }\n token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>\n token inputs:frame:stPrimvarName = \"st\"\n def Shader \"uvReader_st\"\n {\n uniform token info:id = \"UsdPrimvarReader_float2\"\n token inputs:varname.connect = </Materials/Material_${material.id}.inputs:frame:stPrimvarName>\n float2 inputs:fallback = (0.0, 0.0)\n float2 outputs:result\n }\n${samplers.join('\\n')}\n }\n`\n }\n\n private buildTexture(material: MaterialRepresentaion, texture: Texture, mapType: string, color?: Color): string {\n const id = texture.id + (color ? '_' + color.getHexString() : '')\n const isRGBA = texture.format === 1023\n\n this.textures[id] = texture\n\n return `\n def Shader \"Transform2d_${mapType}\" (\n sdrMetadata = {\n string role = \"math\"\n }\n )\n {\n uniform token info:id = \"UsdTransform2d\"\n float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>\n float2 inputs:scale = ${this.buildVector2(texture.repeat)}\n float2 inputs:translation = ${this.buildVector2(texture.offset)}\n float2 outputs:result\n }\n def Shader \"Texture_${texture.id}_${mapType}\"\n {\n uniform token info:id = \"UsdUVTexture\"\n asset inputs:file = @textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}@\n float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>\n token inputs:wrapS = \"repeat\"\n token inputs:wrapT = \"repeat\"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n }`\n }\n\n private buildColor(color: Color): string {\n return `(${color.r}, ${color.g}, ${color.b})`\n }\n\n private buildVector2(vector: Vector2): string {\n return `(${vector.x}, ${vector.y})`\n }\n}\n\nexport { USDZExporter }\n"],"names":["Mesh","strToU8","zipSync","MeshPhysicalMaterial"],"mappings":"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"}
1
+ {"version":3,"file":"USDZExporter.cjs","sources":["../../src/exporters/USDZExporter.ts"],"sourcesContent":["import { zipSync, strToU8, Zippable } from 'fflate'\nimport {\n BufferGeometry,\n Color,\n Matrix4,\n Mesh,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n Texture,\n Vector2,\n} from 'three'\nimport { Nullable } from '../types/utils'\n\ntype MaterialRepresentaion = MeshStandardMaterial | MeshPhysicalMaterial\n\nclass USDZExporter {\n private readonly PRECISION = 7\n\n private materials: { [key: string]: MaterialRepresentaion }\n private textures: { [key: string]: Texture }\n\n private files: Nullable<Zippable>\n\n constructor() {\n this.materials = {}\n this.textures = {}\n\n this.files = {}\n }\n\n public async parse(scene: Object3D): Promise<Uint8Array> {\n const modelFileName = 'model.usda'\n\n // model file should be first in USDZ archive so we init it here\n this.files[modelFileName] = null\n\n let output: string | null = this.buildHeader()\n\n scene.traverseVisible((object) => {\n if (object instanceof Mesh && object.isMesh && object.material.isMeshStandardMaterial) {\n const geometry: BufferGeometry = object.geometry\n const material: MaterialRepresentaion = object.material\n\n const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd'\n\n if (!(geometryFileName in this.files)) {\n const meshObject = this.buildMeshObject(geometry)\n this.files[geometryFileName] = this.buildUSDFileAsString(meshObject)\n }\n\n if (!(material.uuid in this.materials)) {\n this.materials[material.uuid] = material\n }\n\n output += this.buildXform(object, geometry, material)\n }\n })\n\n output += this.buildMaterials(this.materials)\n\n this.files[modelFileName] = strToU8(output)\n output = null\n\n for (const id in this.textures) {\n const texture = this.textures[id]\n const color = id.split('_')[1]\n const isRGBA = texture.format === 1023\n\n const canvas = this.imageToCanvas(texture.image, color)\n const blob = await new Promise<Blob | null>((resolve) =>\n canvas?.toBlob(resolve, isRGBA ? 'image/png' : 'image/jpeg', 1),\n )\n\n if (blob) {\n this.files[`textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}`] = new Uint8Array(await blob.arrayBuffer())\n }\n }\n\n // 64 byte alignment\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n let offset = 0\n\n for (const filename in this.files) {\n const file = this.files[filename]\n const headerSize = 34 + filename.length\n\n offset += headerSize\n\n const offsetMod64 = offset & 63\n\n if (offsetMod64 !== 4 && file !== null && file instanceof Uint8Array) {\n const padLength = 64 - offsetMod64\n const padding = new Uint8Array(padLength)\n\n this.files[filename] = [file, { extra: { 12345: padding } }]\n }\n\n if (file && typeof file.length === 'number') {\n offset = file.length\n }\n }\n\n return zipSync(this.files as Zippable, { level: 0 })\n }\n\n private imageToCanvas(\n image: HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap,\n color: string,\n ): HTMLCanvasElement | undefined {\n if (\n (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||\n (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap)\n ) {\n const scale = 1024 / Math.max(image.width, image.height)\n\n const canvas = document.createElement('canvas')\n canvas.width = image.width * Math.min(1, scale)\n canvas.height = image.height * Math.min(1, scale)\n\n const context = canvas.getContext('2d')\n context?.drawImage(image, 0, 0, canvas.width, canvas.height)\n\n if (color !== undefined) {\n const hex = parseInt(color, 16)\n\n const r = ((hex >> 16) & 255) / 255\n const g = ((hex >> 8) & 255) / 255\n const b = (hex & 255) / 255\n\n const imagedata = context?.getImageData(0, 0, canvas.width, canvas.height)\n if (imagedata) {\n const data = imagedata?.data\n\n for (let i = 0; i < data.length; i += 4) {\n data[i + 0] = data[i + 0] * r\n data[i + 1] = data[i + 1] * g\n data[i + 2] = data[i + 2] * b\n }\n\n context?.putImageData(imagedata, 0, 0)\n }\n }\n\n return canvas\n }\n }\n\n private buildHeader(): string {\n return `#usda 1.0\n(\n customLayerData = {\n string creator = \"Three.js USDZExporter\"\n }\n metersPerUnit = 1\n upAxis = \"Y\"\n)\n`\n }\n\n private buildUSDFileAsString(dataToInsert: string): Uint8Array {\n let output = this.buildHeader()\n output += dataToInsert\n return strToU8(output)\n }\n\n // Xform\n private buildXform(object: Object3D, geometry: BufferGeometry, material: MaterialRepresentaion): string {\n const name = 'Object_' + object.id\n const transform = this.buildMatrix(object.matrixWorld)\n\n if (object.matrixWorld.determinant() < 0) {\n console.warn('THREE.USDZExporter: USDZ does not support negative scales', object)\n }\n\n return `def Xform \"${name}\" (\n prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>\n)\n{\n matrix4d xformOp:transform = ${transform}\n uniform token[] xformOpOrder = [\"xformOp:transform\"]\n rel material:binding = </Materials/Material_${material.id}>\n}\n`\n }\n\n private buildMatrix(matrix: Matrix4): string {\n const array = matrix.elements\n\n return `( ${this.buildMatrixRow(array, 0)}, ${this.buildMatrixRow(array, 4)}, ${this.buildMatrixRow(\n array,\n 8,\n )}, ${this.buildMatrixRow(array, 12)} )`\n }\n\n private buildMatrixRow(array: number[], offset: number): string {\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`\n }\n\n // Mesh\n private buildMeshObject(geometry: BufferGeometry): string {\n const mesh = this.buildMesh(geometry)\n return `\ndef \"Geometry\"\n{\n ${mesh}\n}\n`\n }\n\n private buildMesh(geometry: BufferGeometry): string {\n const name = 'Geometry'\n const attributes = geometry.attributes\n const count = attributes.position.count\n\n return `\n def Mesh \"${name}\"\n {\n int[] faceVertexCounts = [${this.buildMeshVertexCount(geometry)}]\n int[] faceVertexIndices = [${this.buildMeshVertexIndices(geometry)}]\n normal3f[] normals = [${this.buildVector3Array(attributes.normal, count)}] (\n interpolation = \"vertex\"\n )\n point3f[] points = [${this.buildVector3Array(attributes.position, count)}]\n float2[] primvars:st = [${this.buildVector2Array(attributes.uv, count)}] (\n interpolation = \"vertex\"\n )\n uniform token subdivisionScheme = \"none\"\n }\n`\n }\n\n private buildMeshVertexCount(geometry: BufferGeometry): string {\n const count = geometry.index !== null ? geometry.index.array.length : geometry.attributes.position.count\n\n return Array(count / 3)\n .fill(3)\n .join(', ')\n }\n\n private buildMeshVertexIndices(geometry: BufferGeometry): string {\n if (geometry.index !== null) {\n // @ts-ignore\n return geometry.index.array.join(', ')\n }\n\n const array: number[] = []\n const length = geometry.attributes.position.count\n\n for (let i = 0; i < length; i++) {\n array.push(i)\n }\n\n return array.join(', ')\n }\n\n private buildVector3Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: Normals missing.')\n return Array(count).fill('(0, 0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 3) {\n array.push(\n `(${data[i + 0].toPrecision(this.PRECISION)}, ${data[i + 1].toPrecision(this.PRECISION)}, ${data[\n i + 2\n ].toPrecision(this.PRECISION)})`,\n )\n }\n\n return array.join(', ')\n }\n\n private buildVector2Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: UVs missing.')\n return Array(count).fill('(0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 2) {\n // @ts-ignore\n array.push(`(${data[i + 0].toPrecision(this.PRECISION)}, ${1 - data[i + 1].toPrecision(this.PRECISION)})`)\n }\n\n return array.join(', ')\n }\n\n // Materials\n private buildMaterials(materials: USDZExporter['materials']): string {\n const array: string[] = []\n\n for (const uuid in materials) {\n const material = materials[uuid]\n\n array.push(this.buildMaterial(material))\n }\n\n return `def \"Materials\"\n{\n${array.join('')}\n}\n`\n }\n\n private buildMaterial(material: MaterialRepresentaion): string {\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n const pad = ' '\n const inputs = []\n const samplers = []\n\n if (material.map !== null) {\n inputs.push(\n `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`,\n )\n\n // Include alpha input\n if (material.transparent || material.alphaTest > 0.0) {\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`);\n }\n\n // Check if alpha test is bigger than minimum of 0.01, if not and it is transparent still apply a 0.01 alpha clip in order to remove white blur in transparent place.\n if (material.alphaTest > 0.01) {\n inputs.push(`${pad}float inputs:opacityThreshold = ${material.alphaTest}`);\n }\n else if(material.transparent || material.alphaTest > 0.0) {\n inputs.push(`${pad}float inputs:opacityThreshold = 0.01`);\n }\n \n samplers.push(this.buildTexture(material, material.map, 'diffuse', material.color))\n } else {\n inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`)\n }\n\n if (material.emissiveMap !== null) {\n inputs.push(\n `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.emissiveMap, 'emissive'))\n } else if (material.emissive.getHex() > 0) {\n inputs.push(`${pad}color3f inputs:emissiveColor = ${this.buildColor(material.emissive)}`)\n }\n\n if (material.normalMap !== null) {\n inputs.push(\n `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.normalMap, 'normal'))\n }\n\n if (material.aoMap !== null) {\n inputs.push(\n `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`,\n )\n\n samplers.push(this.buildTexture(material, material.aoMap, 'occlusion'))\n }\n\n if (material.roughnessMap !== null && material.roughness === 1) {\n inputs.push(\n `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`,\n )\n\n samplers.push(this.buildTexture(material, material.roughnessMap, 'roughness'))\n } else {\n inputs.push(`${pad}float inputs:roughness = ${material.roughness}`)\n }\n\n if (material.metalnessMap !== null && material.metalness === 1) {\n inputs.push(\n `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`,\n )\n\n samplers.push(this.buildTexture(material, material.metalnessMap, 'metallic'))\n } else {\n inputs.push(`${pad}float inputs:metallic = ${material.metalness}`)\n }\n\n inputs.push(`${pad}float inputs:opacity = ${material.opacity}`)\n\n if (material instanceof MeshPhysicalMaterial) {\n inputs.push(`${pad}float inputs:clearcoat = ${material.clearcoat}`)\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`)\n inputs.push(`${pad}float inputs:ior = ${material.ior}`)\n }\n\n return `\n def Material \"Material_${material.id}\"\n {\n def Shader \"PreviewSurface\"\n {\n uniform token info:id = \"UsdPreviewSurface\"\n${inputs.join('\\n')}\n int inputs:useSpecularWorkflow = 0\n token outputs:surface\n }\n token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>\n token inputs:frame:stPrimvarName = \"st\"\n def Shader \"uvReader_st\"\n {\n uniform token info:id = \"UsdPrimvarReader_float2\"\n token inputs:varname.connect = </Materials/Material_${material.id}.inputs:frame:stPrimvarName>\n float2 inputs:fallback = (0.0, 0.0)\n float2 outputs:result\n }\n${samplers.join('\\n')}\n }\n`\n }\n\n private buildTexture(material: MaterialRepresentaion, texture: Texture, mapType: string, color?: Color): string {\n const id = texture.id + (color ? '_' + color.getHexString() : '')\n const isRGBA = texture.format === 1023\n\n this.textures[id] = texture\n\n // Add the alpha output for when transparency is set or the alpha test is above 0\n return `\n def Shader \"Transform2d_${mapType}\" (\n sdrMetadata = {\n string role = \"math\"\n }\n )\n {\n uniform token info:id = \"UsdTransform2d\"\n float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>\n float2 inputs:scale = ${this.buildVector2(texture.repeat)}\n float2 inputs:translation = ${this.buildVector2(texture.offset)}\n float2 outputs:result\n }\n def Shader \"Texture_${texture.id}_${mapType}\"\n {\n uniform token info:id = \"UsdUVTexture\"\n asset inputs:file = @textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}@\n float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>\n token inputs:wrapS = \"repeat\"\n token inputs:wrapT = \"repeat\"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n ${material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : ''}\n }`\n }\n\n private buildColor(color: Color): string {\n return `(${color.r}, ${color.g}, ${color.b})`\n }\n\n private buildVector2(vector: Vector2): string {\n return `(${vector.x}, ${vector.y})`\n }\n}\n\nexport { USDZExporter }\n"],"names":["Mesh","strToU8","zipSync","MeshPhysicalMaterial"],"mappings":"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"}
@@ -229,6 +229,14 @@ ${array.join("")}
229
229
  inputs.push(
230
230
  `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`
231
231
  );
232
+ if (material.transparent || material.alphaTest > 0) {
233
+ inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`);
234
+ }
235
+ if (material.alphaTest > 0.01) {
236
+ inputs.push(`${pad}float inputs:opacityThreshold = ${material.alphaTest}`);
237
+ } else if (material.transparent || material.alphaTest > 0) {
238
+ inputs.push(`${pad}float inputs:opacityThreshold = 0.01`);
239
+ }
232
240
  samplers.push(this.buildTexture(material, material.map, "diffuse", material.color));
233
241
  } else {
234
242
  inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`);
@@ -326,6 +334,7 @@ ${samplers.join("\n")}
326
334
  float outputs:g
327
335
  float outputs:b
328
336
  float3 outputs:rgb
337
+ ${material.transparent || material.alphaTest > 0 ? "float outputs:a" : ""}
329
338
  }`;
330
339
  }
331
340
  buildColor(color) {
@@ -1 +1 @@
1
- {"version":3,"file":"USDZExporter.js","sources":["../../src/exporters/USDZExporter.ts"],"sourcesContent":["import { zipSync, strToU8, Zippable } from 'fflate'\nimport {\n BufferGeometry,\n Color,\n Matrix4,\n Mesh,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n Texture,\n Vector2,\n} from 'three'\nimport { Nullable } from '../types/utils'\n\ntype MaterialRepresentaion = MeshStandardMaterial | MeshPhysicalMaterial\n\nclass USDZExporter {\n private readonly PRECISION = 7\n\n private materials: { [key: string]: MaterialRepresentaion }\n private textures: { [key: string]: Texture }\n\n private files: Nullable<Zippable>\n\n constructor() {\n this.materials = {}\n this.textures = {}\n\n this.files = {}\n }\n\n public async parse(scene: Object3D): Promise<Uint8Array> {\n const modelFileName = 'model.usda'\n\n // model file should be first in USDZ archive so we init it here\n this.files[modelFileName] = null\n\n let output: string | null = this.buildHeader()\n\n scene.traverseVisible((object) => {\n if (object instanceof Mesh && object.isMesh && object.material.isMeshStandardMaterial) {\n const geometry: BufferGeometry = object.geometry\n const material: MaterialRepresentaion = object.material\n\n const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd'\n\n if (!(geometryFileName in this.files)) {\n const meshObject = this.buildMeshObject(geometry)\n this.files[geometryFileName] = this.buildUSDFileAsString(meshObject)\n }\n\n if (!(material.uuid in this.materials)) {\n this.materials[material.uuid] = material\n }\n\n output += this.buildXform(object, geometry, material)\n }\n })\n\n output += this.buildMaterials(this.materials)\n\n this.files[modelFileName] = strToU8(output)\n output = null\n\n for (const id in this.textures) {\n const texture = this.textures[id]\n const color = id.split('_')[1]\n const isRGBA = texture.format === 1023\n\n const canvas = this.imageToCanvas(texture.image, color)\n const blob = await new Promise<Blob | null>((resolve) =>\n canvas?.toBlob(resolve, isRGBA ? 'image/png' : 'image/jpeg', 1),\n )\n\n if (blob) {\n this.files[`textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}`] = new Uint8Array(await blob.arrayBuffer())\n }\n }\n\n // 64 byte alignment\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n let offset = 0\n\n for (const filename in this.files) {\n const file = this.files[filename]\n const headerSize = 34 + filename.length\n\n offset += headerSize\n\n const offsetMod64 = offset & 63\n\n if (offsetMod64 !== 4 && file !== null && file instanceof Uint8Array) {\n const padLength = 64 - offsetMod64\n const padding = new Uint8Array(padLength)\n\n this.files[filename] = [file, { extra: { 12345: padding } }]\n }\n\n if (file && typeof file.length === 'number') {\n offset = file.length\n }\n }\n\n return zipSync(this.files as Zippable, { level: 0 })\n }\n\n private imageToCanvas(\n image: HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap,\n color: string,\n ): HTMLCanvasElement | undefined {\n if (\n (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||\n (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap)\n ) {\n const scale = 1024 / Math.max(image.width, image.height)\n\n const canvas = document.createElement('canvas')\n canvas.width = image.width * Math.min(1, scale)\n canvas.height = image.height * Math.min(1, scale)\n\n const context = canvas.getContext('2d')\n context?.drawImage(image, 0, 0, canvas.width, canvas.height)\n\n if (color !== undefined) {\n const hex = parseInt(color, 16)\n\n const r = ((hex >> 16) & 255) / 255\n const g = ((hex >> 8) & 255) / 255\n const b = (hex & 255) / 255\n\n const imagedata = context?.getImageData(0, 0, canvas.width, canvas.height)\n if (imagedata) {\n const data = imagedata?.data\n\n for (let i = 0; i < data.length; i += 4) {\n data[i + 0] = data[i + 0] * r\n data[i + 1] = data[i + 1] * g\n data[i + 2] = data[i + 2] * b\n }\n\n context?.putImageData(imagedata, 0, 0)\n }\n }\n\n return canvas\n }\n }\n\n private buildHeader(): string {\n return `#usda 1.0\n(\n customLayerData = {\n string creator = \"Three.js USDZExporter\"\n }\n metersPerUnit = 1\n upAxis = \"Y\"\n)\n`\n }\n\n private buildUSDFileAsString(dataToInsert: string): Uint8Array {\n let output = this.buildHeader()\n output += dataToInsert\n return strToU8(output)\n }\n\n // Xform\n private buildXform(object: Object3D, geometry: BufferGeometry, material: MaterialRepresentaion): string {\n const name = 'Object_' + object.id\n const transform = this.buildMatrix(object.matrixWorld)\n\n if (object.matrixWorld.determinant() < 0) {\n console.warn('THREE.USDZExporter: USDZ does not support negative scales', object)\n }\n\n return `def Xform \"${name}\" (\n prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>\n)\n{\n matrix4d xformOp:transform = ${transform}\n uniform token[] xformOpOrder = [\"xformOp:transform\"]\n rel material:binding = </Materials/Material_${material.id}>\n}\n`\n }\n\n private buildMatrix(matrix: Matrix4): string {\n const array = matrix.elements\n\n return `( ${this.buildMatrixRow(array, 0)}, ${this.buildMatrixRow(array, 4)}, ${this.buildMatrixRow(\n array,\n 8,\n )}, ${this.buildMatrixRow(array, 12)} )`\n }\n\n private buildMatrixRow(array: number[], offset: number): string {\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`\n }\n\n // Mesh\n private buildMeshObject(geometry: BufferGeometry): string {\n const mesh = this.buildMesh(geometry)\n return `\ndef \"Geometry\"\n{\n ${mesh}\n}\n`\n }\n\n private buildMesh(geometry: BufferGeometry): string {\n const name = 'Geometry'\n const attributes = geometry.attributes\n const count = attributes.position.count\n\n return `\n def Mesh \"${name}\"\n {\n int[] faceVertexCounts = [${this.buildMeshVertexCount(geometry)}]\n int[] faceVertexIndices = [${this.buildMeshVertexIndices(geometry)}]\n normal3f[] normals = [${this.buildVector3Array(attributes.normal, count)}] (\n interpolation = \"vertex\"\n )\n point3f[] points = [${this.buildVector3Array(attributes.position, count)}]\n float2[] primvars:st = [${this.buildVector2Array(attributes.uv, count)}] (\n interpolation = \"vertex\"\n )\n uniform token subdivisionScheme = \"none\"\n }\n`\n }\n\n private buildMeshVertexCount(geometry: BufferGeometry): string {\n const count = geometry.index !== null ? geometry.index.array.length : geometry.attributes.position.count\n\n return Array(count / 3)\n .fill(3)\n .join(', ')\n }\n\n private buildMeshVertexIndices(geometry: BufferGeometry): string {\n if (geometry.index !== null) {\n // @ts-ignore\n return geometry.index.array.join(', ')\n }\n\n const array: number[] = []\n const length = geometry.attributes.position.count\n\n for (let i = 0; i < length; i++) {\n array.push(i)\n }\n\n return array.join(', ')\n }\n\n private buildVector3Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: Normals missing.')\n return Array(count).fill('(0, 0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 3) {\n array.push(\n `(${data[i + 0].toPrecision(this.PRECISION)}, ${data[i + 1].toPrecision(this.PRECISION)}, ${data[\n i + 2\n ].toPrecision(this.PRECISION)})`,\n )\n }\n\n return array.join(', ')\n }\n\n private buildVector2Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: UVs missing.')\n return Array(count).fill('(0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 2) {\n // @ts-ignore\n array.push(`(${data[i + 0].toPrecision(this.PRECISION)}, ${1 - data[i + 1].toPrecision(this.PRECISION)})`)\n }\n\n return array.join(', ')\n }\n\n // Materials\n private buildMaterials(materials: USDZExporter['materials']): string {\n const array: string[] = []\n\n for (const uuid in materials) {\n const material = materials[uuid]\n\n array.push(this.buildMaterial(material))\n }\n\n return `def \"Materials\"\n{\n${array.join('')}\n}\n`\n }\n\n private buildMaterial(material: MaterialRepresentaion): string {\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n const pad = ' '\n const inputs = []\n const samplers = []\n\n if (material.map !== null) {\n inputs.push(\n `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.map, 'diffuse', material.color))\n } else {\n inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`)\n }\n\n if (material.emissiveMap !== null) {\n inputs.push(\n `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.emissiveMap, 'emissive'))\n } else if (material.emissive.getHex() > 0) {\n inputs.push(`${pad}color3f inputs:emissiveColor = ${this.buildColor(material.emissive)}`)\n }\n\n if (material.normalMap !== null) {\n inputs.push(\n `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.normalMap, 'normal'))\n }\n\n if (material.aoMap !== null) {\n inputs.push(\n `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`,\n )\n\n samplers.push(this.buildTexture(material, material.aoMap, 'occlusion'))\n }\n\n if (material.roughnessMap !== null && material.roughness === 1) {\n inputs.push(\n `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`,\n )\n\n samplers.push(this.buildTexture(material, material.roughnessMap, 'roughness'))\n } else {\n inputs.push(`${pad}float inputs:roughness = ${material.roughness}`)\n }\n\n if (material.metalnessMap !== null && material.metalness === 1) {\n inputs.push(\n `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`,\n )\n\n samplers.push(this.buildTexture(material, material.metalnessMap, 'metallic'))\n } else {\n inputs.push(`${pad}float inputs:metallic = ${material.metalness}`)\n }\n\n inputs.push(`${pad}float inputs:opacity = ${material.opacity}`)\n\n if (material instanceof MeshPhysicalMaterial) {\n inputs.push(`${pad}float inputs:clearcoat = ${material.clearcoat}`)\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`)\n inputs.push(`${pad}float inputs:ior = ${material.ior}`)\n }\n\n return `\n def Material \"Material_${material.id}\"\n {\n def Shader \"PreviewSurface\"\n {\n uniform token info:id = \"UsdPreviewSurface\"\n${inputs.join('\\n')}\n int inputs:useSpecularWorkflow = 0\n token outputs:surface\n }\n token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>\n token inputs:frame:stPrimvarName = \"st\"\n def Shader \"uvReader_st\"\n {\n uniform token info:id = \"UsdPrimvarReader_float2\"\n token inputs:varname.connect = </Materials/Material_${material.id}.inputs:frame:stPrimvarName>\n float2 inputs:fallback = (0.0, 0.0)\n float2 outputs:result\n }\n${samplers.join('\\n')}\n }\n`\n }\n\n private buildTexture(material: MaterialRepresentaion, texture: Texture, mapType: string, color?: Color): string {\n const id = texture.id + (color ? '_' + color.getHexString() : '')\n const isRGBA = texture.format === 1023\n\n this.textures[id] = texture\n\n return `\n def Shader \"Transform2d_${mapType}\" (\n sdrMetadata = {\n string role = \"math\"\n }\n )\n {\n uniform token info:id = \"UsdTransform2d\"\n float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>\n float2 inputs:scale = ${this.buildVector2(texture.repeat)}\n float2 inputs:translation = ${this.buildVector2(texture.offset)}\n float2 outputs:result\n }\n def Shader \"Texture_${texture.id}_${mapType}\"\n {\n uniform token info:id = \"UsdUVTexture\"\n asset inputs:file = @textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}@\n float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>\n token inputs:wrapS = \"repeat\"\n token inputs:wrapT = \"repeat\"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n }`\n }\n\n private buildColor(color: Color): string {\n return `(${color.r}, ${color.g}, ${color.b})`\n }\n\n private buildVector2(vector: Vector2): string {\n return `(${vector.x}, ${vector.y})`\n }\n}\n\nexport { USDZExporter }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"USDZExporter.js","sources":["../../src/exporters/USDZExporter.ts"],"sourcesContent":["import { zipSync, strToU8, Zippable } from 'fflate'\nimport {\n BufferGeometry,\n Color,\n Matrix4,\n Mesh,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n Texture,\n Vector2,\n} from 'three'\nimport { Nullable } from '../types/utils'\n\ntype MaterialRepresentaion = MeshStandardMaterial | MeshPhysicalMaterial\n\nclass USDZExporter {\n private readonly PRECISION = 7\n\n private materials: { [key: string]: MaterialRepresentaion }\n private textures: { [key: string]: Texture }\n\n private files: Nullable<Zippable>\n\n constructor() {\n this.materials = {}\n this.textures = {}\n\n this.files = {}\n }\n\n public async parse(scene: Object3D): Promise<Uint8Array> {\n const modelFileName = 'model.usda'\n\n // model file should be first in USDZ archive so we init it here\n this.files[modelFileName] = null\n\n let output: string | null = this.buildHeader()\n\n scene.traverseVisible((object) => {\n if (object instanceof Mesh && object.isMesh && object.material.isMeshStandardMaterial) {\n const geometry: BufferGeometry = object.geometry\n const material: MaterialRepresentaion = object.material\n\n const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd'\n\n if (!(geometryFileName in this.files)) {\n const meshObject = this.buildMeshObject(geometry)\n this.files[geometryFileName] = this.buildUSDFileAsString(meshObject)\n }\n\n if (!(material.uuid in this.materials)) {\n this.materials[material.uuid] = material\n }\n\n output += this.buildXform(object, geometry, material)\n }\n })\n\n output += this.buildMaterials(this.materials)\n\n this.files[modelFileName] = strToU8(output)\n output = null\n\n for (const id in this.textures) {\n const texture = this.textures[id]\n const color = id.split('_')[1]\n const isRGBA = texture.format === 1023\n\n const canvas = this.imageToCanvas(texture.image, color)\n const blob = await new Promise<Blob | null>((resolve) =>\n canvas?.toBlob(resolve, isRGBA ? 'image/png' : 'image/jpeg', 1),\n )\n\n if (blob) {\n this.files[`textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}`] = new Uint8Array(await blob.arrayBuffer())\n }\n }\n\n // 64 byte alignment\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n let offset = 0\n\n for (const filename in this.files) {\n const file = this.files[filename]\n const headerSize = 34 + filename.length\n\n offset += headerSize\n\n const offsetMod64 = offset & 63\n\n if (offsetMod64 !== 4 && file !== null && file instanceof Uint8Array) {\n const padLength = 64 - offsetMod64\n const padding = new Uint8Array(padLength)\n\n this.files[filename] = [file, { extra: { 12345: padding } }]\n }\n\n if (file && typeof file.length === 'number') {\n offset = file.length\n }\n }\n\n return zipSync(this.files as Zippable, { level: 0 })\n }\n\n private imageToCanvas(\n image: HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap,\n color: string,\n ): HTMLCanvasElement | undefined {\n if (\n (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||\n (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap)\n ) {\n const scale = 1024 / Math.max(image.width, image.height)\n\n const canvas = document.createElement('canvas')\n canvas.width = image.width * Math.min(1, scale)\n canvas.height = image.height * Math.min(1, scale)\n\n const context = canvas.getContext('2d')\n context?.drawImage(image, 0, 0, canvas.width, canvas.height)\n\n if (color !== undefined) {\n const hex = parseInt(color, 16)\n\n const r = ((hex >> 16) & 255) / 255\n const g = ((hex >> 8) & 255) / 255\n const b = (hex & 255) / 255\n\n const imagedata = context?.getImageData(0, 0, canvas.width, canvas.height)\n if (imagedata) {\n const data = imagedata?.data\n\n for (let i = 0; i < data.length; i += 4) {\n data[i + 0] = data[i + 0] * r\n data[i + 1] = data[i + 1] * g\n data[i + 2] = data[i + 2] * b\n }\n\n context?.putImageData(imagedata, 0, 0)\n }\n }\n\n return canvas\n }\n }\n\n private buildHeader(): string {\n return `#usda 1.0\n(\n customLayerData = {\n string creator = \"Three.js USDZExporter\"\n }\n metersPerUnit = 1\n upAxis = \"Y\"\n)\n`\n }\n\n private buildUSDFileAsString(dataToInsert: string): Uint8Array {\n let output = this.buildHeader()\n output += dataToInsert\n return strToU8(output)\n }\n\n // Xform\n private buildXform(object: Object3D, geometry: BufferGeometry, material: MaterialRepresentaion): string {\n const name = 'Object_' + object.id\n const transform = this.buildMatrix(object.matrixWorld)\n\n if (object.matrixWorld.determinant() < 0) {\n console.warn('THREE.USDZExporter: USDZ does not support negative scales', object)\n }\n\n return `def Xform \"${name}\" (\n prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>\n)\n{\n matrix4d xformOp:transform = ${transform}\n uniform token[] xformOpOrder = [\"xformOp:transform\"]\n rel material:binding = </Materials/Material_${material.id}>\n}\n`\n }\n\n private buildMatrix(matrix: Matrix4): string {\n const array = matrix.elements\n\n return `( ${this.buildMatrixRow(array, 0)}, ${this.buildMatrixRow(array, 4)}, ${this.buildMatrixRow(\n array,\n 8,\n )}, ${this.buildMatrixRow(array, 12)} )`\n }\n\n private buildMatrixRow(array: number[], offset: number): string {\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`\n }\n\n // Mesh\n private buildMeshObject(geometry: BufferGeometry): string {\n const mesh = this.buildMesh(geometry)\n return `\ndef \"Geometry\"\n{\n ${mesh}\n}\n`\n }\n\n private buildMesh(geometry: BufferGeometry): string {\n const name = 'Geometry'\n const attributes = geometry.attributes\n const count = attributes.position.count\n\n return `\n def Mesh \"${name}\"\n {\n int[] faceVertexCounts = [${this.buildMeshVertexCount(geometry)}]\n int[] faceVertexIndices = [${this.buildMeshVertexIndices(geometry)}]\n normal3f[] normals = [${this.buildVector3Array(attributes.normal, count)}] (\n interpolation = \"vertex\"\n )\n point3f[] points = [${this.buildVector3Array(attributes.position, count)}]\n float2[] primvars:st = [${this.buildVector2Array(attributes.uv, count)}] (\n interpolation = \"vertex\"\n )\n uniform token subdivisionScheme = \"none\"\n }\n`\n }\n\n private buildMeshVertexCount(geometry: BufferGeometry): string {\n const count = geometry.index !== null ? geometry.index.array.length : geometry.attributes.position.count\n\n return Array(count / 3)\n .fill(3)\n .join(', ')\n }\n\n private buildMeshVertexIndices(geometry: BufferGeometry): string {\n if (geometry.index !== null) {\n // @ts-ignore\n return geometry.index.array.join(', ')\n }\n\n const array: number[] = []\n const length = geometry.attributes.position.count\n\n for (let i = 0; i < length; i++) {\n array.push(i)\n }\n\n return array.join(', ')\n }\n\n private buildVector3Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: Normals missing.')\n return Array(count).fill('(0, 0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 3) {\n array.push(\n `(${data[i + 0].toPrecision(this.PRECISION)}, ${data[i + 1].toPrecision(this.PRECISION)}, ${data[\n i + 2\n ].toPrecision(this.PRECISION)})`,\n )\n }\n\n return array.join(', ')\n }\n\n private buildVector2Array(attribute: BufferGeometry['attributes'][number], count: number): string {\n if (attribute === undefined) {\n console.warn('USDZExporter: UVs missing.')\n return Array(count).fill('(0, 0)').join(', ')\n }\n\n const array: string[] = []\n const data = attribute.array\n\n for (let i = 0; i < data.length; i += 2) {\n // @ts-ignore\n array.push(`(${data[i + 0].toPrecision(this.PRECISION)}, ${1 - data[i + 1].toPrecision(this.PRECISION)})`)\n }\n\n return array.join(', ')\n }\n\n // Materials\n private buildMaterials(materials: USDZExporter['materials']): string {\n const array: string[] = []\n\n for (const uuid in materials) {\n const material = materials[uuid]\n\n array.push(this.buildMaterial(material))\n }\n\n return `def \"Materials\"\n{\n${array.join('')}\n}\n`\n }\n\n private buildMaterial(material: MaterialRepresentaion): string {\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n const pad = ' '\n const inputs = []\n const samplers = []\n\n if (material.map !== null) {\n inputs.push(\n `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`,\n )\n\n // Include alpha input\n if (material.transparent || material.alphaTest > 0.0) {\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`);\n }\n\n // Check if alpha test is bigger than minimum of 0.01, if not and it is transparent still apply a 0.01 alpha clip in order to remove white blur in transparent place.\n if (material.alphaTest > 0.01) {\n inputs.push(`${pad}float inputs:opacityThreshold = ${material.alphaTest}`);\n }\n else if(material.transparent || material.alphaTest > 0.0) {\n inputs.push(`${pad}float inputs:opacityThreshold = 0.01`);\n }\n \n samplers.push(this.buildTexture(material, material.map, 'diffuse', material.color))\n } else {\n inputs.push(`${pad}color3f inputs:diffuseColor = ${this.buildColor(material.color)}`)\n }\n\n if (material.emissiveMap !== null) {\n inputs.push(\n `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.emissiveMap, 'emissive'))\n } else if (material.emissive.getHex() > 0) {\n inputs.push(`${pad}color3f inputs:emissiveColor = ${this.buildColor(material.emissive)}`)\n }\n\n if (material.normalMap !== null) {\n inputs.push(\n `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`,\n )\n\n samplers.push(this.buildTexture(material, material.normalMap, 'normal'))\n }\n\n if (material.aoMap !== null) {\n inputs.push(\n `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`,\n )\n\n samplers.push(this.buildTexture(material, material.aoMap, 'occlusion'))\n }\n\n if (material.roughnessMap !== null && material.roughness === 1) {\n inputs.push(\n `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`,\n )\n\n samplers.push(this.buildTexture(material, material.roughnessMap, 'roughness'))\n } else {\n inputs.push(`${pad}float inputs:roughness = ${material.roughness}`)\n }\n\n if (material.metalnessMap !== null && material.metalness === 1) {\n inputs.push(\n `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`,\n )\n\n samplers.push(this.buildTexture(material, material.metalnessMap, 'metallic'))\n } else {\n inputs.push(`${pad}float inputs:metallic = ${material.metalness}`)\n }\n\n inputs.push(`${pad}float inputs:opacity = ${material.opacity}`)\n\n if (material instanceof MeshPhysicalMaterial) {\n inputs.push(`${pad}float inputs:clearcoat = ${material.clearcoat}`)\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`)\n inputs.push(`${pad}float inputs:ior = ${material.ior}`)\n }\n\n return `\n def Material \"Material_${material.id}\"\n {\n def Shader \"PreviewSurface\"\n {\n uniform token info:id = \"UsdPreviewSurface\"\n${inputs.join('\\n')}\n int inputs:useSpecularWorkflow = 0\n token outputs:surface\n }\n token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>\n token inputs:frame:stPrimvarName = \"st\"\n def Shader \"uvReader_st\"\n {\n uniform token info:id = \"UsdPrimvarReader_float2\"\n token inputs:varname.connect = </Materials/Material_${material.id}.inputs:frame:stPrimvarName>\n float2 inputs:fallback = (0.0, 0.0)\n float2 outputs:result\n }\n${samplers.join('\\n')}\n }\n`\n }\n\n private buildTexture(material: MaterialRepresentaion, texture: Texture, mapType: string, color?: Color): string {\n const id = texture.id + (color ? '_' + color.getHexString() : '')\n const isRGBA = texture.format === 1023\n\n this.textures[id] = texture\n\n // Add the alpha output for when transparency is set or the alpha test is above 0\n return `\n def Shader \"Transform2d_${mapType}\" (\n sdrMetadata = {\n string role = \"math\"\n }\n )\n {\n uniform token info:id = \"UsdTransform2d\"\n float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>\n float2 inputs:scale = ${this.buildVector2(texture.repeat)}\n float2 inputs:translation = ${this.buildVector2(texture.offset)}\n float2 outputs:result\n }\n def Shader \"Texture_${texture.id}_${mapType}\"\n {\n uniform token info:id = \"UsdUVTexture\"\n asset inputs:file = @textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}@\n float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>\n token inputs:wrapS = \"repeat\"\n token inputs:wrapT = \"repeat\"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n ${material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : ''}\n }`\n }\n\n private buildColor(color: Color): string {\n return `(${color.r}, ${color.g}, ${color.b})`\n }\n\n private buildVector2(vector: Vector2): string {\n return `(${vector.x}, ${vector.y})`\n }\n}\n\nexport { USDZExporter }\n"],"names":[],"mappings":";;;;;;;;AAgBA,MAAM,aAAa;AAAA,EAQjB,cAAc;AAPG,qCAAY;AAErB;AACA;AAEA;AAGN,SAAK,YAAY;AACjB,SAAK,WAAW;AAEhB,SAAK,QAAQ;EACf;AAAA,EAEA,MAAa,MAAM,OAAsC;AACvD,UAAM,gBAAgB;AAGjB,SAAA,MAAM,aAAa,IAAI;AAExB,QAAA,SAAwB,KAAK;AAE3B,UAAA,gBAAgB,CAAC,WAAW;AAChC,UAAI,kBAAkB,QAAQ,OAAO,UAAU,OAAO,SAAS,wBAAwB;AACrF,cAAM,WAA2B,OAAO;AACxC,cAAM,WAAkC,OAAO;AAEzC,cAAA,mBAAmB,yBAAyB,SAAS,KAAK;AAE5D,YAAA,EAAE,oBAAoB,KAAK,QAAQ;AAC/B,gBAAA,aAAa,KAAK,gBAAgB,QAAQ;AAChD,eAAK,MAAM,gBAAgB,IAAI,KAAK,qBAAqB,UAAU;AAAA,QACrE;AAEA,YAAI,EAAE,SAAS,QAAQ,KAAK,YAAY;AACjC,eAAA,UAAU,SAAS,IAAI,IAAI;AAAA,QAClC;AAEA,kBAAU,KAAK,WAAW,QAAQ,UAAU,QAAQ;AAAA,MACtD;AAAA,IAAA,CACD;AAES,cAAA,KAAK,eAAe,KAAK,SAAS;AAE5C,SAAK,MAAM,aAAa,IAAI,QAAQ,MAAM;AACjC,aAAA;AAEE,eAAA,MAAM,KAAK,UAAU;AACxB,YAAA,UAAU,KAAK,SAAS,EAAE;AAChC,YAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;AACvB,YAAA,SAAS,QAAQ,WAAW;AAElC,YAAM,SAAS,KAAK,cAAc,QAAQ,OAAO,KAAK;AAChD,YAAA,OAAO,MAAM,IAAI;AAAA,QAAqB,CAAC,YAC3C,iCAAQ,OAAO,SAAS,SAAS,cAAc,cAAc;AAAA,MAAC;AAGhE,UAAI,MAAM;AACR,aAAK,MAAM,oBAAoB,MAAM,SAAS,QAAQ,OAAO,IAAI,IAAI,WAAW,MAAM,KAAK,YAAA,CAAa;AAAA,MAC1G;AAAA,IACF;AAKA,QAAI,SAAS;AAEF,eAAA,YAAY,KAAK,OAAO;AAC3B,YAAA,OAAO,KAAK,MAAM,QAAQ;AAC1B,YAAA,aAAa,KAAK,SAAS;AAEvB,gBAAA;AAEV,YAAM,cAAc,SAAS;AAE7B,UAAI,gBAAgB,KAAK,SAAS,QAAQ,gBAAgB,YAAY;AACpE,cAAM,YAAY,KAAK;AACjB,cAAA,UAAU,IAAI,WAAW,SAAS;AAEnC,aAAA,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAA,CAAG;AAAA,MAC7D;AAEA,UAAI,QAAQ,OAAO,KAAK,WAAW,UAAU;AAC3C,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,OAAmB,EAAE,OAAO,GAAG;AAAA,EACrD;AAAA,EAEQ,cACN,OACA,OAC+B;AAC/B,QACG,OAAO,qBAAqB,eAAe,iBAAiB,oBAC5D,OAAO,sBAAsB,eAAe,iBAAiB,qBAC7D,OAAO,oBAAoB,eAAe,iBAAiB,mBAC3D,OAAO,gBAAgB,eAAe,iBAAiB,aACxD;AACA,YAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM,MAAM;AAEjD,YAAA,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK;AAC9C,aAAO,SAAS,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK;AAE1C,YAAA,UAAU,OAAO,WAAW,IAAI;AACtC,yCAAS,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO;AAErD,UAAI,UAAU,QAAW;AACjB,cAAA,MAAM,SAAS,OAAO,EAAE;AAExB,cAAA,KAAM,OAAO,KAAM,OAAO;AAC1B,cAAA,KAAM,OAAO,IAAK,OAAO;AACzB,cAAA,KAAK,MAAM,OAAO;AAElB,cAAA,YAAY,mCAAS,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO;AACnE,YAAI,WAAW;AACb,gBAAM,OAAO,uCAAW;AAExB,mBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,iBAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AAC5B,iBAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AAC5B,iBAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AAAA,UAC9B;AAES,6CAAA,aAAa,WAAW,GAAG;AAAA,QACtC;AAAA,MACF;AAEO,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,cAAsB;AACrB,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST;AAAA,EAEQ,qBAAqB,cAAkC;AACzD,QAAA,SAAS,KAAK;AACR,cAAA;AACV,WAAO,QAAQ,MAAM;AAAA,EACvB;AAAA;AAAA,EAGQ,WAAW,QAAkB,UAA0B,UAAyC;AAChG,UAAA,OAAO,YAAY,OAAO;AAChC,UAAM,YAAY,KAAK,YAAY,OAAO,WAAW;AAErD,QAAI,OAAO,YAAY,YAAY,IAAI,GAAG;AAChC,cAAA,KAAK,6DAA6D,MAAM;AAAA,IAClF;AAEA,WAAO,cAAc;AAAA,kDACyB,SAAS;AAAA;AAAA;AAAA,mCAGxB;AAAA;AAAA,kDAEe,SAAS;AAAA;AAAA;AAAA,EAGzD;AAAA,EAEQ,YAAY,QAAyB;AAC3C,UAAM,QAAQ,OAAO;AAEd,WAAA,KAAK,KAAK,eAAe,OAAO,CAAC,MAAM,KAAK,eAAe,OAAO,CAAC,MAAM,KAAK;AAAA,MACnF;AAAA,MACA;AAAA,IAAA,MACI,KAAK,eAAe,OAAO,EAAE;AAAA,EACrC;AAAA,EAEQ,eAAe,OAAiB,QAAwB;AAC9D,WAAO,IAAI,MAAM,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/F;AAAA;AAAA,EAGQ,gBAAgB,UAAkC;AAClD,UAAA,OAAO,KAAK,UAAU,QAAQ;AAC7B,WAAA;AAAA;AAAA;AAAA,IAGP;AAAA;AAAA;AAAA,EAGF;AAAA,EAEQ,UAAU,UAAkC;AAClD,UAAM,OAAO;AACb,UAAM,aAAa,SAAS;AACtB,UAAA,QAAQ,WAAW,SAAS;AAE3B,WAAA;AAAA,gBACK;AAAA;AAAA,oCAEoB,KAAK,qBAAqB,QAAQ;AAAA,qCACjC,KAAK,uBAAuB,QAAQ;AAAA,gCACzC,KAAK,kBAAkB,WAAW,QAAQ,KAAK;AAAA;AAAA;AAAA,8BAGjD,KAAK,kBAAkB,WAAW,UAAU,KAAK;AAAA,kCAC7C,KAAK,kBAAkB,WAAW,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3E;AAAA,EAEQ,qBAAqB,UAAkC;AACvD,UAAA,QAAQ,SAAS,UAAU,OAAO,SAAS,MAAM,MAAM,SAAS,SAAS,WAAW,SAAS;AAE5F,WAAA,MAAM,QAAQ,CAAC,EACnB,KAAK,CAAC,EACN,KAAK,IAAI;AAAA,EACd;AAAA,EAEQ,uBAAuB,UAAkC;AAC3D,QAAA,SAAS,UAAU,MAAM;AAE3B,aAAO,SAAS,MAAM,MAAM,KAAK,IAAI;AAAA,IACvC;AAEA,UAAM,QAAkB,CAAA;AAClB,UAAA,SAAS,SAAS,WAAW,SAAS;AAE5C,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAM,KAAK,CAAC;AAAA,IACd;AAEO,WAAA,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,kBAAkB,WAAiD,OAAuB;AAChG,QAAI,cAAc,QAAW;AAC3B,cAAQ,KAAK,gCAAgC;AAC7C,aAAO,MAAM,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI;AAAA,IACjD;AAEA,UAAM,QAAkB,CAAA;AACxB,UAAM,OAAO,UAAU;AAEvB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACjC,YAAA;AAAA,QACJ,IAAI,KAAK,IAAI,CAAC,EAAE,YAAY,KAAK,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE,YAAY,KAAK,SAAS,MAAM,KAC1F,IAAI,CACN,EAAE,YAAY,KAAK,SAAS;AAAA,MAAA;AAAA,IAEhC;AAEO,WAAA,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,kBAAkB,WAAiD,OAAuB;AAChG,QAAI,cAAc,QAAW;AAC3B,cAAQ,KAAK,4BAA4B;AACzC,aAAO,MAAM,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI;AAAA,IAC9C;AAEA,UAAM,QAAkB,CAAA;AACxB,UAAM,OAAO,UAAU;AAEvB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AAEvC,YAAM,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE,YAAY,KAAK,SAAS,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,YAAY,KAAK,SAAS,IAAI;AAAA,IAC3G;AAEO,WAAA,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA,EAGQ,eAAe,WAA8C;AACnE,UAAM,QAAkB,CAAA;AAExB,eAAW,QAAQ,WAAW;AACtB,YAAA,WAAW,UAAU,IAAI;AAE/B,YAAM,KAAK,KAAK,cAAc,QAAQ,CAAC;AAAA,IACzC;AAEO,WAAA;AAAA;AAAA,EAET,MAAM,KAAK,EAAE;AAAA;AAAA;AAAA,EAGb;AAAA,EAEQ,cAAc,UAAyC;AAG7D,UAAM,MAAM;AACZ,UAAM,SAAS,CAAA;AACf,UAAM,WAAW,CAAA;AAEb,QAAA,SAAS,QAAQ,MAAM;AAClB,aAAA;AAAA,QACL,GAAG,iEAAiE,SAAS,cAAc,SAAS,IAAI;AAAA,MAAA;AAI1G,UAAI,SAAS,eAAe,SAAS,YAAY,GAAK;AACpD,eAAO,KAAK,GAAG,0DAA0D,SAAS,cAAc,SAAS,IAAI,uBAAuB;AAAA,MACtI;AAGI,UAAA,SAAS,YAAY,MAAM;AAC7B,eAAO,KAAK,GAAG,sCAAsC,SAAS,WAAW;AAAA,MAEnE,WAAA,SAAS,eAAe,SAAS,YAAY,GAAK;AACjD,eAAA,KAAK,GAAG,yCAAyC;AAAA,MAC1D;AAES,eAAA,KAAK,KAAK,aAAa,UAAU,SAAS,KAAK,WAAW,SAAS,KAAK,CAAC;AAAA,IAAA,OAC7E;AACL,aAAO,KAAK,GAAG,oCAAoC,KAAK,WAAW,SAAS,KAAK,GAAG;AAAA,IACtF;AAEI,QAAA,SAAS,gBAAgB,MAAM;AAC1B,aAAA;AAAA,QACL,GAAG,kEAAkE,SAAS,cAAc,SAAS,YAAY;AAAA,MAAA;AAGnH,eAAS,KAAK,KAAK,aAAa,UAAU,SAAS,aAAa,UAAU,CAAC;AAAA,IAClE,WAAA,SAAS,SAAS,OAAA,IAAW,GAAG;AACzC,aAAO,KAAK,GAAG,qCAAqC,KAAK,WAAW,SAAS,QAAQ,GAAG;AAAA,IAC1F;AAEI,QAAA,SAAS,cAAc,MAAM;AACxB,aAAA;AAAA,QACL,GAAG,4DAA4D,SAAS,cAAc,SAAS,UAAU;AAAA,MAAA;AAG3G,eAAS,KAAK,KAAK,aAAa,UAAU,SAAS,WAAW,QAAQ,CAAC;AAAA,IACzE;AAEI,QAAA,SAAS,UAAU,MAAM;AACpB,aAAA;AAAA,QACL,GAAG,4DAA4D,SAAS,cAAc,SAAS,MAAM;AAAA,MAAA;AAGvG,eAAS,KAAK,KAAK,aAAa,UAAU,SAAS,OAAO,WAAW,CAAC;AAAA,IACxE;AAEA,QAAI,SAAS,iBAAiB,QAAQ,SAAS,cAAc,GAAG;AACvD,aAAA;AAAA,QACL,GAAG,4DAA4D,SAAS,cAAc,SAAS,aAAa;AAAA,MAAA;AAG9G,eAAS,KAAK,KAAK,aAAa,UAAU,SAAS,cAAc,WAAW,CAAC;AAAA,IAAA,OACxE;AACL,aAAO,KAAK,GAAG,+BAA+B,SAAS,WAAW;AAAA,IACpE;AAEA,QAAI,SAAS,iBAAiB,QAAQ,SAAS,cAAc,GAAG;AACvD,aAAA;AAAA,QACL,GAAG,2DAA2D,SAAS,cAAc,SAAS,aAAa;AAAA,MAAA;AAG7G,eAAS,KAAK,KAAK,aAAa,UAAU,SAAS,cAAc,UAAU,CAAC;AAAA,IAAA,OACvE;AACL,aAAO,KAAK,GAAG,8BAA8B,SAAS,WAAW;AAAA,IACnE;AAEA,WAAO,KAAK,GAAG,6BAA6B,SAAS,SAAS;AAE9D,QAAI,oBAAoB,sBAAsB;AAC5C,aAAO,KAAK,GAAG,+BAA+B,SAAS,WAAW;AAClE,aAAO,KAAK,GAAG,wCAAwC,SAAS,oBAAoB;AACpF,aAAO,KAAK,GAAG,yBAAyB,SAAS,KAAK;AAAA,IACxD;AAEO,WAAA;AAAA,6BACkB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA,+DAI6C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,kEAKN,SAAS;AAAA;AAAA;AAAA;AAAA,EAIzE,SAAS,KAAK,IAAI;AAAA;AAAA;AAAA,EAGlB;AAAA,EAEQ,aAAa,UAAiC,SAAkB,SAAiB,OAAuB;AAC9G,UAAM,KAAK,QAAQ,MAAM,QAAQ,MAAM,MAAM,iBAAiB;AACxD,UAAA,SAAS,QAAQ,WAAW;AAE7B,SAAA,SAAS,EAAE,IAAI;AAGb,WAAA;AAAA,gCACqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAO4B,SAAS;AAAA,kCACnC,KAAK,aAAa,QAAQ,MAAM;AAAA,wCAC1B,KAAK,aAAa,QAAQ,MAAM;AAAA;AAAA;AAAA,4BAG5C,QAAQ,MAAM;AAAA;AAAA;AAAA,kDAGQ,MAAM,SAAS,QAAQ;AAAA,4DACb,SAAS,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAO3E,SAAS,eAAe,SAAS,YAAY,IAAM,oBAAoB;AAAA;AAAA,EAEjF;AAAA,EAEQ,WAAW,OAAsB;AACvC,WAAO,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AAAA,EAC3C;AAAA,EAEQ,aAAa,QAAyB;AACrC,WAAA,IAAI,OAAO,MAAM,OAAO;AAAA,EACjC;AACF;"}
package/math/Lut.cjs CHANGED
@@ -39,8 +39,8 @@ class Lut {
39
39
  if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {
40
40
  const min = this.map[j][0];
41
41
  const max = this.map[j + 1][0];
42
- minColor.setHex(this.map[j][1], "linear-srgb");
43
- maxColor.setHex(this.map[j + 1][1], "linear-srgb");
42
+ minColor.setHex(this.map[j][1], "srgb-linear");
43
+ maxColor.setHex(this.map[j + 1][1], "srgb-linear");
44
44
  const color = new THREE.Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min));
45
45
  this.lut.push(color);
46
46
  }
@@ -88,8 +88,8 @@ class Lut {
88
88
  if (i < this.map[j][0] && i >= this.map[j - 1][0]) {
89
89
  const min = this.map[j - 1][0];
90
90
  const max = this.map[j][0];
91
- minColor.setHex(this.map[j - 1][1], "linear-srgb");
92
- maxColor.setHex(this.map[j][1], "linear-srgb");
91
+ minColor.setHex(this.map[j - 1][1], "srgb-linear");
92
+ maxColor.setHex(this.map[j][1], "srgb-linear");
93
93
  finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min));
94
94
  data[k * 4] = Math.round(finalColor.r * 255);
95
95
  data[k * 4 + 1] = Math.round(finalColor.g * 255);
package/math/Lut.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Lut.cjs","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'linear-srgb')\n maxColor.setHex(this.map[j + 1][1], 'linear-srgb')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'linear-srgb')\n maxColor.setHex(this.map[j][1], 'linear-srgb')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":["Color","MathUtils"],"mappings":"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"}
1
+ {"version":3,"file":"Lut.cjs","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'srgb-linear')\n maxColor.setHex(this.map[j + 1][1], 'srgb-linear')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'srgb-linear')\n maxColor.setHex(this.map[j][1], 'srgb-linear')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":["Color","MathUtils"],"mappings":"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"}
package/math/Lut.js CHANGED
@@ -37,8 +37,8 @@ class Lut {
37
37
  if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {
38
38
  const min = this.map[j][0];
39
39
  const max = this.map[j + 1][0];
40
- minColor.setHex(this.map[j][1], "linear-srgb");
41
- maxColor.setHex(this.map[j + 1][1], "linear-srgb");
40
+ minColor.setHex(this.map[j][1], "srgb-linear");
41
+ maxColor.setHex(this.map[j + 1][1], "srgb-linear");
42
42
  const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min));
43
43
  this.lut.push(color);
44
44
  }
@@ -86,8 +86,8 @@ class Lut {
86
86
  if (i < this.map[j][0] && i >= this.map[j - 1][0]) {
87
87
  const min = this.map[j - 1][0];
88
88
  const max = this.map[j][0];
89
- minColor.setHex(this.map[j - 1][1], "linear-srgb");
90
- maxColor.setHex(this.map[j][1], "linear-srgb");
89
+ minColor.setHex(this.map[j - 1][1], "srgb-linear");
90
+ maxColor.setHex(this.map[j][1], "srgb-linear");
91
91
  finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min));
92
92
  data[k * 4] = Math.round(finalColor.r * 255);
93
93
  data[k * 4 + 1] = Math.round(finalColor.g * 255);
package/math/Lut.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Lut.js","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'linear-srgb')\n maxColor.setHex(this.map[j + 1][1], 'linear-srgb')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'linear-srgb')\n maxColor.setHex(this.map[j][1], 'linear-srgb')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lut.js","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'srgb-linear')\n maxColor.setHex(this.map[j + 1][1], 'srgb-linear')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'srgb-linear')\n maxColor.setHex(this.map[j][1], 'srgb-linear')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":[],"mappings":"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"}
@@ -102,7 +102,7 @@ const _Reflector = class extends THREE.Mesh {
102
102
  renderer.xr.enabled = false;
103
103
  renderer.shadowMap.autoUpdate = false;
104
104
  if ("outputColorSpace" in renderer)
105
- renderer.outputColorSpace = "linear-srgb";
105
+ renderer.outputColorSpace = "srgb-linear";
106
106
  else
107
107
  renderer.outputEncoding = 3e3;
108
108
  renderer.toneMapping = THREE.NoToneMapping;
@@ -1 +1 @@
1
- {"version":3,"file":"Reflector.cjs","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Vector3","Matrix4","Vector4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","NoToneMapping","version"],"mappings":";;;;;;;;;;AAgBA,MAAM,aAAN,cAAwBA,MAAAA,KAAK;AAAA,EAiE3B,YAAY,UAAU,UAAU,IAAI;AAClC,UAAM,QAAQ;AAEd,SAAK,cAAc;AAEnB,SAAK,OAAO;AACZ,SAAK,SAAS,IAAIC,wBAAmB;AAErC,UAAM,QAAQ;AAEd,UAAM,QAAQ,QAAQ,UAAU,SAAY,IAAIC,YAAM,QAAQ,KAAK,IAAI,IAAIA,MAAAA,MAAM,OAAQ;AACzF,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,SAAS,QAAQ,UAAU,WAAU;AAC3C,UAAM,cAAc,QAAQ,gBAAgB,SAAY,QAAQ,cAAc;AAI9E,UAAM,iBAAiB,IAAIC,YAAO;AAClC,UAAM,SAAS,IAAIC,cAAS;AAC5B,UAAM,yBAAyB,IAAIA,cAAS;AAC5C,UAAM,sBAAsB,IAAIA,cAAS;AACzC,UAAM,iBAAiB,IAAIC,cAAS;AACpC,UAAM,iBAAiB,IAAID,MAAO,QAAC,GAAG,GAAG,EAAE;AAC3C,UAAM,YAAY,IAAIE,cAAS;AAE/B,UAAM,OAAO,IAAIF,cAAS;AAC1B,UAAM,SAAS,IAAIA,cAAS;AAC5B,UAAM,IAAI,IAAIE,cAAS;AAEvB,UAAM,gBAAgB,IAAID,cAAS;AACnC,UAAM,gBAAgB,KAAK;AAE3B,UAAM,eAAe,IAAIE,wBAAkB,cAAc,eAAe;AAAA,MACtE,SAAS;AAAA,MACT,MAAMC,MAAa;AAAA,IACzB,CAAK;AAED,UAAM,WAAW,IAAIC,qBAAe;AAAA,MAClC,UAAUC,MAAa,cAAC,MAAM,OAAO,QAAQ;AAAA,MAC7C,gBAAgB,OAAO;AAAA,MACvB,cAAc,OAAO;AAAA,IAC3B,CAAK;AAED,aAAS,SAAS,UAAU,EAAE,QAAQ,aAAa;AACnD,aAAS,SAAS,OAAO,EAAE,QAAQ;AACnC,aAAS,SAAS,eAAe,EAAE,QAAQ;AAE3C,SAAK,WAAW;AAEhB,SAAK,iBAAiB,SAAU,UAAU,OAAO,QAAQ;AACvD,6BAAuB,sBAAsB,MAAM,WAAW;AAC9D,0BAAoB,sBAAsB,OAAO,WAAW;AAE5D,qBAAe,gBAAgB,MAAM,WAAW;AAEhD,aAAO,IAAI,GAAG,GAAG,CAAC;AAClB,aAAO,aAAa,cAAc;AAElC,WAAK,WAAW,wBAAwB,mBAAmB;AAI3D,UAAI,KAAK,IAAI,MAAM,IAAI;AAAG;AAE1B,WAAK,QAAQ,MAAM,EAAE,OAAQ;AAC7B,WAAK,IAAI,sBAAsB;AAE/B,qBAAe,gBAAgB,OAAO,WAAW;AAEjD,qBAAe,IAAI,GAAG,GAAG,EAAE;AAC3B,qBAAe,aAAa,cAAc;AAC1C,qBAAe,IAAI,mBAAmB;AAEtC,aAAO,WAAW,wBAAwB,cAAc;AACxD,aAAO,QAAQ,MAAM,EAAE,OAAQ;AAC/B,aAAO,IAAI,sBAAsB;AAEjC,oBAAc,SAAS,KAAK,IAAI;AAChC,oBAAc,GAAG,IAAI,GAAG,GAAG,CAAC;AAC5B,oBAAc,GAAG,aAAa,cAAc;AAC5C,oBAAc,GAAG,QAAQ,MAAM;AAC/B,oBAAc,OAAO,MAAM;AAE3B,oBAAc,MAAM,OAAO;AAE3B,oBAAc,kBAAmB;AACjC,oBAAc,iBAAiB,KAAK,OAAO,gBAAgB;AAG3D,oBAAc,IAAI,KAAK,GAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,GAAK,KAAK,KAAK,GAAK,GAAK,GAAK,CAAG;AAChG,oBAAc,SAAS,cAAc,gBAAgB;AACrD,oBAAc,SAAS,cAAc,kBAAkB;AACvD,oBAAc,SAAS,MAAM,WAAW;AAIxC,qBAAe,8BAA8B,QAAQ,sBAAsB;AAC3E,qBAAe,aAAa,cAAc,kBAAkB;AAE5D,gBAAU,IAAI,eAAe,OAAO,GAAG,eAAe,OAAO,GAAG,eAAe,OAAO,GAAG,eAAe,QAAQ;AAEhH,YAAM,mBAAmB,cAAc;AAEvC,QAAE,KAAK,KAAK,KAAK,UAAU,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC3F,QAAE,KAAK,KAAK,KAAK,UAAU,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC3F,QAAE,IAAI;AACN,QAAE,KAAK,IAAM,iBAAiB,SAAS,EAAE,KAAK,iBAAiB,SAAS,EAAE;AAG1E,gBAAU,eAAe,IAAM,UAAU,IAAI,CAAC,CAAC;AAG/C,uBAAiB,SAAS,CAAC,IAAI,UAAU;AACzC,uBAAiB,SAAS,CAAC,IAAI,UAAU;AACzC,uBAAiB,SAAS,EAAE,IAAI,UAAU,IAAI,IAAM;AACpD,uBAAiB,SAAS,EAAE,IAAI,UAAU;AAG1C,YAAM,UAAU;AAEhB,YAAM,sBAAsB,SAAS,gBAAiB;AAEtD,YAAM,mBAAmB,SAAS,GAAG;AACrC,YAAM,0BAA0B,SAAS,UAAU;AACnD,YAAM,qBAAqB,SAAS;AAEpC,UAAI,SAAS;AACb,UAAI,sBAAsB;AAAU,iBAAS,SAAS,qBAAqB;AAAA;AACtE,iBAAS,SAAS,mBAAmB;AAE1C,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB;AAAA;AAC3D,iBAAS,iBAAiB;AAC/B,eAAS,cAAcC,MAAa;AAEpC,eAAS,gBAAgB,YAAY;AAErC,eAAS,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAEzC,UAAI,SAAS,cAAc;AAAO,iBAAS,MAAO;AAClD,eAAS,OAAO,OAAO,aAAa;AAEpC,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,eAAS,cAAc;AAEvB,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB,SAAS,SAAS;AAAA;AAC7E,iBAAS,iBAAiB,SAAS,OAAO;AAE/C,eAAS,gBAAgB,mBAAmB;AAI5C,YAAM,WAAW,OAAO;AAExB,UAAI,aAAa,QAAW;AAC1B,iBAAS,MAAM,SAAS,QAAQ;AAAA,MACjC;AAED,YAAM,UAAU;AAAA,IACjB;AAED,SAAK,kBAAkB,WAAY;AACjC,aAAO;AAAA,IACR;AAED,SAAK,UAAU,WAAY;AACzB,mBAAa,QAAS;AACtB,YAAM,SAAS,QAAS;AAAA,IACzB;AAAA,EACF;AACH;AA/OA,IAAM,YAAN;AACE,cADI,WACG,mBAAkB;AAAA,EACvB,UAAU;AAAA,IACR,OAAO;AAAA,MACL,OAAO;AAAA,IACR;AAAA,IAED,UAAU;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IAED,eAAe;AAAA,MACb,OAAO;AAAA,IACR;AAAA,EACF;AAAA,EAED;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBzB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eA2BhBC,qBAAW,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAGrD;;"}
1
+ {"version":3,"file":"Reflector.cjs","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Vector3","Matrix4","Vector4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","NoToneMapping","version"],"mappings":"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"}
@@ -100,7 +100,7 @@ const _Reflector = class extends Mesh {
100
100
  renderer.xr.enabled = false;
101
101
  renderer.shadowMap.autoUpdate = false;
102
102
  if ("outputColorSpace" in renderer)
103
- renderer.outputColorSpace = "linear-srgb";
103
+ renderer.outputColorSpace = "srgb-linear";
104
104
  else
105
105
  renderer.outputEncoding = 3e3;
106
106
  renderer.toneMapping = NoToneMapping;
@@ -1 +1 @@
1
- {"version":3,"file":"Reflector.js","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Reflector.js","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":[],"mappings":"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"}
@@ -112,7 +112,7 @@ const _Refractor = class extends THREE.Mesh {
112
112
  renderer.xr.enabled = false;
113
113
  renderer.shadowMap.autoUpdate = false;
114
114
  if ("outputColorSpace" in renderer)
115
- renderer.outputColorSpace = "linear-srgb";
115
+ renderer.outputColorSpace = "srgb-linear";
116
116
  else
117
117
  renderer.outputEncoding = 3e3;
118
118
  renderer.toneMapping = THREE.NoToneMapping;