three-stdlib 2.30.0 → 2.30.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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":";AAEA,MAAM,IAAI;AAAA,EACR,YAAY,UAAU,QAAQ,IAAI;AAChC,SAAK,QAAQ;AAEb,SAAK,MAAM,CAAE;AACb,SAAK,MAAM,CAAE;AACb,SAAK,IAAI;AACT,SAAK,OAAO;AACZ,SAAK,OAAO;AAEZ,SAAK,YAAY,UAAU,KAAK;AAAA,EACjC;AAAA,EAED,IAAI,OAAO;AACT,QAAI,MAAM,UAAU,MAAM;AACxB,WAAK,KAAK,KAAK;AAAA,IAChB;AAED,WAAO;AAAA,EACR;AAAA,EAED,OAAO,KAAK;AACV,SAAK,OAAO;AAEZ,WAAO;AAAA,EACR;AAAA,EAED,OAAO,KAAK;AACV,SAAK,OAAO;AAEZ,WAAO;AAAA,EACR;AAAA,EAED,YAAY,UAAU,QAAQ,IAAI;AAChC,SAAK,MAAM,iBAAiB,QAAQ,KAAK,iBAAiB;AAC1D,SAAK,IAAI;AAET,UAAM,OAAO,IAAM,KAAK;AACxB,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,WAAW,IAAI,MAAO;AAE5B,SAAK,IAAI,SAAS;AAIlB,SAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAIvC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,QAAQ,IAAI;AAElB,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK;AAC5C,YAAI,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG;AACzD,gBAAM,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACzB,gBAAM,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAE7B,mBAAS,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAC7C,mBAAS,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAEjD,gBAAM,QAAQ,IAAI,MAAO,EAAC,WAAW,UAAU,WAAW,QAAQ,QAAQ,MAAM,IAAI;AAEpF,eAAK,IAAI,KAAK,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAID,SAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzD,WAAO;AAAA,EACR;AAAA,EAED,KAAK,KAAK;AACR,SAAK,MAAM,IAAI;AACf,SAAK,MAAM,IAAI;AACf,SAAK,IAAI,IAAI;AACb,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAEhB,WAAO;AAAA,EACR;AAAA,EAED,SAAS,OAAO;AACd,YAAQ,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AAEnD,aAAS,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAK;AAEhD,UAAM,gBAAgB,KAAK,MAAM,QAAQ,KAAK,CAAC;AAE/C,WAAO,KAAK,IAAI,aAAa;AAAA,EAC9B;AAAA,EAED,YAAY,MAAM,eAAe;AAC/B,qBAAiB,IAAI,IAAI;AAEzB,WAAO;AAAA,EACR;AAAA,EAED,eAAe;AACb,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS,KAAK;AAErB,SAAK,aAAa,MAAM;AAExB,WAAO;AAAA,EACR;AAAA,EAED,aAAa,QAAQ;AACnB,UAAM,MAAM,OAAO,WAAW,MAAM,EAAE,OAAO,OAAO;AAEpD,UAAM,YAAY,IAAI,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;AAElD,UAAM,OAAO,UAAU;AAEvB,QAAI,IAAI;AAER,UAAM,OAAO,IAAM,KAAK;AAExB,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,aAAa,IAAI,MAAO;AAE9B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK,MAAM;AACjC,eAAS,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG;AACjD,gBAAM,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAC7B,gBAAM,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAEzB,mBAAS,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AACjD,mBAAS,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAE7C,qBAAW,WAAW,UAAU,WAAW,IAAI,QAAQ,MAAM,IAAI;AAEjE,eAAK,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC3C,eAAK,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC/C,eAAK,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC/C,eAAK,IAAI,IAAI,CAAC,IAAI;AAElB,eAAK;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAED,QAAI,aAAa,WAAW,GAAG,CAAC;AAEhC,WAAO;AAAA,EACR;AACH;AAEK,MAAC,mBAAmB;AAAA,EACvB,SAAS;AAAA,IACP,CAAC,GAAK,GAAQ;AAAA,IACd,CAAC,KAAK,KAAQ;AAAA,IACd,CAAC,KAAK,KAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,YAAY;AAAA,IACV,CAAC,GAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,WAAW;AAAA,IACT,CAAC,GAAK,CAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,WAAW;AAAA,IACT,CAAC,GAAK,CAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AACH;"}
@@ -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":"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"}
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;