three-zoo 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -60,7 +60,7 @@ export declare class SceneTraversal {
60
60
  * @param object - Root object to start from
61
61
  * @param callback - Function to execute for each material. Return a material to replace.
62
62
  */
63
- static enumerateMaterials(object: Object3D, callback: (material: Material) => Material | undefined): void;
63
+ static enumerateMaterials(object: Object3D, callback: (material: Material, mesh: Mesh) => Material | undefined): void;
64
64
  /**
65
65
  * Returns all objects matching filter criteria.
66
66
  *
package/dist/index.js CHANGED
@@ -360,11 +360,11 @@ class SceneTraversal {
360
360
  if (Array.isArray(object.material)) {
361
361
  for (let i = 0; i < object.material.length; i++) {
362
362
  object.material[i] =
363
- callback(object.material[i]) ?? object.material[i];
363
+ callback(object.material[i], object) ?? object.material[i];
364
364
  }
365
365
  }
366
366
  else {
367
- object.material = callback(object.material) ?? object.material;
367
+ object.material = callback(object.material, object) ?? object.material;
368
368
  }
369
369
  }
370
370
  for (const child of object.children) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/DualFovCamera.ts","../src/SceneTraversal.ts","../src/SkinnedMeshBaker.ts","../src/StandardToBasicConverter.ts","../src/StandardToLambertConverter.ts","../src/StandardToPhongConverter.ts","../src/Sun.ts"],"sourcesContent":["import type { Box3, BufferAttribute, SkinnedMesh } from \"three\";\nimport { MathUtils, PerspectiveCamera, Vector3 } from \"three\";\n\n/** Default horizontal field of view in degrees */\nconst DEFAULT_HORIZONTAL_FOV = 90;\n/** Default vertical field of view in degrees */\nconst DEFAULT_VERTICAL_FOV = 90;\n/** Default aspect ratio (width/height) */\nconst DEFAULT_ASPECT = 1;\n/** Default near clipping plane distance */\nconst DEFAULT_NEAR = 1;\n/** Default far clipping plane distance */\nconst DEFAULT_FAR = 1000;\n\n/** Minimum allowed field of view in degrees */\nconst MIN_FOV = 1;\n/** Maximum allowed field of view in degrees */\nconst MAX_FOV = 179;\n\n/**\n * Camera with independent horizontal and vertical FOV settings.\n */\nexport class DualFovCamera extends PerspectiveCamera {\n /** Internal storage for horizontal field of view in degrees */\n private horizontalFovInternal: number;\n /** Internal storage for vertical field of view in degrees */\n private verticalFovInternal: number;\n\n /**\n * @param horizontalFov - Horizontal FOV in degrees (clamped 1-179°)\n * @param verticalFov - Vertical FOV in degrees (clamped 1-179°)\n * @param aspect - Aspect ratio (width/height)\n * @param near - Near clipping plane distance\n * @param far - Far clipping plane distance\n */\n constructor(\n horizontalFov = DEFAULT_HORIZONTAL_FOV,\n verticalFov = DEFAULT_VERTICAL_FOV,\n aspect = DEFAULT_ASPECT,\n near = DEFAULT_NEAR,\n far = DEFAULT_FAR,\n ) {\n super(verticalFov, aspect, near, far);\n this.horizontalFovInternal = horizontalFov;\n this.verticalFovInternal = verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * @returns Horizontal FOV in degrees\n */\n public get horizontalFov(): number {\n return this.horizontalFovInternal;\n }\n\n /**\n * @returns Vertical FOV in degrees\n */\n public get verticalFov(): number {\n return this.verticalFovInternal;\n }\n\n /**\n * @param value - Horizontal FOV in degrees (clamped 1-179°)\n */\n public set horizontalFov(value: number) {\n this.horizontalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * @param value - Vertical FOV in degrees (clamped 1-179°)\n */\n public set verticalFov(value: number) {\n this.verticalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Sets both FOV values.\n *\n * @param horizontal - Horizontal FOV in degrees (clamped 1-179°)\n * @param vertical - Vertical FOV in degrees (clamped 1-179°)\n */\n public setFov(horizontal: number, vertical: number): void {\n this.horizontalFovInternal = MathUtils.clamp(horizontal, MIN_FOV, MAX_FOV);\n this.verticalFovInternal = MathUtils.clamp(vertical, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Copies FOV settings from another DualFovCamera.\n *\n * @param source - Source camera to copy from\n */\n public copyFovSettings(source: DualFovCamera): void {\n this.horizontalFovInternal = source.horizontalFov;\n this.verticalFovInternal = source.verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * Updates projection matrix based on FOV and aspect ratio.\n *\n * Landscape (aspect > 1): preserves horizontal FOV.\n * Portrait (aspect ≤ 1): preserves vertical FOV.\n *\n * @override\n */\n public override updateProjectionMatrix(): void {\n if (this.aspect > 1) {\n // Landscape orientation: preserve horizontal FOV\n const radians = MathUtils.degToRad(this.horizontalFovInternal);\n this.fov = MathUtils.radToDeg(\n Math.atan(Math.tan(radians / 2) / this.aspect) * 2,\n );\n } else {\n // Portrait orientation: preserve vertical FOV\n this.fov = this.verticalFovInternal;\n }\n\n super.updateProjectionMatrix();\n }\n\n /**\n * Gets actual horizontal FOV after aspect ratio adjustments.\n *\n * @returns Horizontal FOV in degrees\n */\n public getActualHorizontalFov(): number {\n if (this.aspect >= 1) {\n return this.horizontalFovInternal;\n }\n const verticalRadians = MathUtils.degToRad(this.verticalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(verticalRadians / 2) * this.aspect) * 2,\n );\n }\n\n /**\n * Gets actual vertical FOV after aspect ratio adjustments.\n *\n * @returns Vertical FOV in degrees\n */\n public getActualVerticalFov(): number {\n if (this.aspect < 1) {\n return this.verticalFovInternal;\n }\n const horizontalRadians = MathUtils.degToRad(this.horizontalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(horizontalRadians / 2) / this.aspect) * 2,\n );\n }\n\n /**\n * Adjusts vertical FOV to fit points within camera view.\n *\n * @param vertices - Array of 3D points in world coordinates\n */\n public fitVerticalFovToPoints(vertices: Vector3[]): void {\n const up = new Vector3(0, 1, 0).applyQuaternion(this.quaternion);\n\n let maxVerticalAngle = 0;\n\n for (const vertex of vertices) {\n const vertexToCam = this.position.clone().sub(vertex);\n const vertexDirection = vertexToCam.normalize();\n\n const verticalAngle =\n Math.asin(Math.abs(vertexDirection.dot(up))) *\n Math.sign(vertexDirection.dot(up));\n\n if (Math.abs(verticalAngle) > maxVerticalAngle) {\n maxVerticalAngle = Math.abs(verticalAngle);\n }\n }\n\n const requiredFov = MathUtils.radToDeg(2 * maxVerticalAngle);\n\n this.verticalFovInternal = MathUtils.clamp(requiredFov, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Adjusts vertical FOV to fit bounding box within camera view.\n *\n * @param box - 3D bounding box in world coordinates\n */\n public fitVerticalFovToBox(box: Box3): void {\n this.fitVerticalFovToPoints([\n new Vector3(box.min.x, box.min.y, box.min.z),\n new Vector3(box.min.x, box.min.y, box.max.z),\n new Vector3(box.min.x, box.max.y, box.min.z),\n new Vector3(box.min.x, box.max.y, box.max.z),\n new Vector3(box.max.x, box.min.y, box.min.z),\n new Vector3(box.max.x, box.min.y, box.max.z),\n new Vector3(box.max.x, box.max.y, box.min.z),\n new Vector3(box.max.x, box.max.y, box.max.z),\n ]);\n }\n\n /**\n * Adjusts vertical FOV to fit skinned mesh within camera view.\n * Updates skeleton and applies bone transformations.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public fitVerticalFovToMesh(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const target = new Vector3();\n\n const points = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n this.fitVerticalFovToPoints(points);\n }\n\n /**\n * Points camera to look at skinned mesh center of mass.\n * Uses iterative clustering to find main vertex concentration.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public lookAtMeshCenterOfMass(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes.position as BufferAttribute;\n const target = new Vector3();\n const points: Vector3[] = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n /**\n * Finds main cluster center using iterative refinement.\n *\n * @param points - Array of 3D points to cluster\n * @param iterations - Number of refinement iterations\n * @returns Center point of main cluster\n */\n const findMainCluster = (points: Vector3[], iterations = 3): Vector3 => {\n if (points.length === 0) {\n return new Vector3();\n }\n\n let center = points[Math.floor(points.length / 2)].clone();\n\n for (let i = 0; i < iterations; i++) {\n let total = new Vector3();\n let count = 0;\n\n for (const point of points) {\n if (\n point.distanceTo(center) < point.distanceTo(total) ||\n count === 0\n ) {\n total.add(point);\n count++;\n }\n }\n\n if (count > 0) {\n center = total.divideScalar(count);\n }\n }\n\n return center;\n };\n\n const centerOfMass = findMainCluster(points);\n this.lookAt(centerOfMass);\n }\n\n /**\n * Creates a copy of this camera with identical settings.\n *\n * @returns New DualFovCamera instance\n * @override\n */\n public override clone(): this {\n const camera = new DualFovCamera(\n this.horizontalFovInternal,\n this.verticalFovInternal,\n this.aspect,\n this.near,\n this.far,\n ) as this;\n\n camera.copy(this, true);\n return camera;\n }\n}\n","import type { Material, Object3D } from \"three\";\nimport { Mesh } from \"three\";\n\n/**\n * Constructor type for runtime type checking.\n *\n * @template T - The type that the constructor creates\n */\nexport type Constructor<T> = abstract new (...args: never[]) => T;\n\n/**\n * Static methods for traversing Three.js scene hierarchies.\n *\n * All methods use depth-first traversal.\n */\nexport class SceneTraversal {\n /**\n * Finds first object with exact name match.\n *\n * @param object - Root object to start from\n * @param name - Name to search for (case-sensitive)\n * @returns First matching object or undefined\n */\n public static getObjectByName(\n object: Object3D,\n name: string,\n ): Object3D | undefined {\n if (object.name === name) {\n return object;\n }\n\n for (const child of object.children) {\n const result = SceneTraversal.getObjectByName(child, name);\n if (result) {\n return result;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds first material with exact name match from mesh objects.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns First matching material or undefined\n */\n public static getMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material.name === name) {\n return material;\n }\n }\n } else if (object.material.name === name) {\n return object.material;\n }\n }\n\n for (const child of object.children) {\n const material = SceneTraversal.getMaterialByName(child, name);\n if (material) {\n return material;\n }\n }\n\n return undefined;\n }\n\n /**\n * Executes callback for all objects of specified type.\n *\n * @template T - Type of objects to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching object\n */\n public static enumerateObjectsByType<T extends Object3D>(\n object: Object3D,\n type: Constructor<T>,\n callback: (instance: T) => void,\n ): void {\n if (object instanceof type) {\n callback(object);\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjectsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all materials of specified type from mesh objects.\n *\n * @template T - Type of materials to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching material\n */\n public static enumerateMaterialsByType<T extends Material>(\n object: Object3D,\n type: Constructor<T>,\n callback: (material: T) => void,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material instanceof type) {\n callback(material);\n }\n }\n } else if (object.material instanceof type) {\n callback(object.material);\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterialsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all objects in hierarchy.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each object\n */\n public static enumerateObjects(\n object: Object3D,\n callback: (object: Object3D) => void,\n ): void {\n callback(object);\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjects(child, callback);\n }\n }\n\n /**\n * Executes callback for all materials from mesh objects.\n * If callback returns a material, replaces the original material.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each material. Return a material to replace.\n */\n public static enumerateMaterials(\n object: Object3D,\n callback: (material: Material) => Material | undefined,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (let i = 0; i < object.material.length; i++) {\n object.material[i] =\n callback(object.material[i]) ?? object.material[i];\n }\n } else {\n object.material = callback(object.material) ?? object.material;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterials(child, callback);\n }\n }\n\n /**\n * Returns all objects matching filter criteria.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for object names or predicate function\n * @returns Array of matching objects\n */\n public static filterObjects(\n object: Object3D,\n filter: RegExp | ((object: Object3D) => boolean),\n ): Object3D[] {\n let result: Object3D[] = [];\n\n if (typeof filter === \"function\") {\n if (filter(object)) {\n result.push(object);\n }\n } else {\n if (object.name && filter.test(object.name)) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterObjects(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all materials matching filter criteria from mesh objects.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for material names or predicate function\n * @returns Array of matching materials\n */\n public static filterMaterials(\n object: Object3D,\n filter: RegExp | ((object: Material) => boolean),\n ): Material[] {\n let result: Material[] = [];\n\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (typeof filter === \"function\") {\n if (filter(material)) {\n result.push(material);\n }\n } else if (filter.test(material.name)) {\n result.push(material);\n }\n }\n } else if (typeof filter === \"function\") {\n if (filter(object.material)) {\n result.push(object.material);\n }\n } else if (filter.test(object.material.name)) {\n result.push(object.material);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterMaterials(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all mesh objects that use any of the specified materials.\n *\n * @param object - Root object to start from\n * @param materials - Array of materials to search for\n * @returns Array of mesh objects using the materials\n */\n public static findMaterialUsers(\n object: Object3D,\n materials: Material[],\n ): Mesh[] {\n let result: Mesh[] = [];\n\n if (object instanceof Mesh) {\n let hasMatchingMaterial = false;\n\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (materials.includes(material)) {\n hasMatchingMaterial = true;\n break;\n }\n }\n } else {\n if (materials.includes(object.material)) {\n hasMatchingMaterial = true;\n }\n }\n\n if (hasMatchingMaterial) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(\n SceneTraversal.findMaterialUsers(child, materials),\n );\n }\n\n return result;\n }\n\n /**\n * Clones material by name and replaces all instances with the clone.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns Cloned material or undefined if not found\n */\n public static cloneMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n const originalMaterial = SceneTraversal.getMaterialByName(object, name);\n\n if (!originalMaterial) {\n return undefined;\n }\n\n const clonedMaterial = originalMaterial.clone();\n\n SceneTraversal.replaceMaterial(object, originalMaterial, clonedMaterial);\n\n return clonedMaterial;\n }\n\n /**\n * Replaces all instances of a material with another material.\n *\n * @param object - Root object to start from\n * @param oldMaterial - Material to replace\n * @param newMaterial - Material to use as replacement\n */\n private static replaceMaterial(\n object: Object3D,\n oldMaterial: Material,\n newMaterial: Material,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n object.material = object.material.map((material) =>\n material === oldMaterial ? newMaterial : material,\n );\n } else if (object.material === oldMaterial) {\n object.material = newMaterial;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.replaceMaterial(child, oldMaterial, newMaterial);\n }\n }\n}\n","import type { AnimationClip, Object3D, SkinnedMesh } from \"three\";\nimport { AnimationMixer, BufferAttribute, Mesh, Vector3 } from \"three\";\n\n/** Number of components per vertex */\nconst COMPONENT_COUNT = 3;\n\n/** Converts skinned meshes to static meshes. */\nexport class SkinnedMeshBaker {\n /**\n * Converts skinned mesh to static mesh in current pose.\n *\n * @param skinnedMesh - Mesh to convert\n * @returns Static mesh with baked positions\n */\n public static bakePose(skinnedMesh: SkinnedMesh): Mesh {\n const bakedGeometry = skinnedMesh.geometry.clone();\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const newPositions = new Float32Array(position.count * COMPONENT_COUNT);\n const target = new Vector3();\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n newPositions[i * COMPONENT_COUNT + 0] = target.x;\n newPositions[i * COMPONENT_COUNT + 1] = target.y;\n newPositions[i * COMPONENT_COUNT + 2] = target.z;\n }\n\n bakedGeometry.setAttribute(\n \"position\",\n new BufferAttribute(newPositions, COMPONENT_COUNT),\n );\n bakedGeometry.computeVertexNormals();\n bakedGeometry.deleteAttribute(\"skinIndex\");\n bakedGeometry.deleteAttribute(\"skinWeight\");\n\n const mesh = new Mesh(bakedGeometry, skinnedMesh.material);\n mesh.name = skinnedMesh.name;\n return mesh;\n }\n\n /**\n * Bakes animation frame to static mesh.\n *\n * @param armature - Root object with bones\n * @param skinnedMesh - Mesh to convert\n * @param timeOffset - Time in seconds within animation\n * @param clip - Animation clip for pose\n * @returns Static mesh with baked positions\n */\n public static bakeAnimationFrame(\n armature: Object3D,\n skinnedMesh: SkinnedMesh,\n timeOffset: number,\n clip: AnimationClip,\n ): Mesh {\n const mixer = new AnimationMixer(armature);\n const action = mixer.clipAction(clip);\n action.play();\n mixer.setTime(timeOffset);\n\n armature.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n return this.bakePose(skinnedMesh);\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshBasicMaterial } from \"three\";\n\n/** Factor for metalness brightness adjustment */\nconst METALNESS_BRIGHTNESS_FACTOR = 0.3;\n/** Factor for emissive color contribution when combining with base color */\nconst EMISSIVE_CONTRIBUTION_FACTOR = 0.5;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToBasicConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Apply emissive color to base color for brightness compensation.\n * @defaultValue true\n */\n combineEmissive: boolean;\n /**\n * Brightness adjustment factor to compensate for loss of lighting.\n * @defaultValue 1.3\n */\n brightnessFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshBasicMaterial with brightness compensation.\n */\nexport class StandardToBasicConverter {\n /**\n * Converts MeshStandardMaterial to MeshBasicMaterial.\n *\n * @param standardMaterial - Source material to convert\n * @param options - Conversion options\n * @returns New MeshBasicMaterial with mapped properties\n */\n public static convert(\n standardMaterial: MeshStandardMaterial,\n options: Partial<StandardToBasicConverterOptions> = {},\n ): MeshBasicMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n combineEmissive: true,\n brightnessFactor: 1.3,\n ...options,\n };\n\n // Create new Basic material\n const basicMaterial = new MeshBasicMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(standardMaterial, basicMaterial, config);\n\n // Handle color properties with lighting compensation\n this.convertColorProperties(standardMaterial, basicMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(standardMaterial, basicMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(standardMaterial, basicMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n standardMaterial.dispose();\n }\n\n basicMaterial.needsUpdate = true;\n return basicMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with lighting compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n // Base color conversion with brightness compensation\n target.color = source.color.clone();\n\n // Apply brightness compensation since BasicMaterial doesn't respond to lighting\n target.color.multiplyScalar(config.brightnessFactor);\n\n // Adjust for metalness - metallic materials tend to be darker without lighting\n if (source.metalness > 0) {\n const metalnessBrightness =\n 1 + source.metalness * METALNESS_BRIGHTNESS_FACTOR;\n target.color.multiplyScalar(metalnessBrightness);\n }\n\n // Combine emissive color if requested\n if (config.combineEmissive) {\n const emissiveContribution = source.emissive\n .clone()\n .multiplyScalar(\n source.emissiveIntensity * EMISSIVE_CONTRIBUTION_FACTOR,\n );\n target.color.add(emissiveContribution);\n }\n\n // Ensure color doesn't exceed valid range\n target.color.r = Math.min(target.color.r, 1.0);\n target.color.g = Math.min(target.color.g, 1.0);\n target.color.b = Math.min(target.color.b, 1.0);\n }\n\n /**\n * Converts texture properties from Standard to Basic material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main diffuse/albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Environment map (BasicMaterial supports this for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n // Use metalness to determine reflectivity\n target.reflectivity = source.metalness;\n }\n\n // Light map (BasicMaterial supports this)\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map (BasicMaterial supports this)\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Specular map (BasicMaterial supports this)\n if (source.metalnessMap) {\n // Use metalness map as specular map for some reflective effect\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n\nexport default StandardToBasicConverter;\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshLambertMaterial } from \"three\";\n\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Roughness threshold for additional darkening */\nconst ROUGHNESS_THRESHOLD = 0.5;\n/** Factor for roughness color adjustment */\nconst ROUGHNESS_COLOR_ADJUSTMENT = 0.2;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToLambertConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Color adjustment factor for roughness compensation.\n * @defaultValue 0.8\n */\n roughnessColorFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshLambertMaterial with PBR compensation.\n */\nexport class StandardToLambertConverter {\n /**\n * Converts MeshStandardMaterial to MeshLambertMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshLambertMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToLambertConverterOptions> = {},\n ): MeshLambertMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n roughnessColorFactor: 0.8,\n ...options,\n };\n\n // Create new Lambert material\n const lambertMaterial = new MeshLambertMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, lambertMaterial, config);\n\n // Handle color properties with roughness compensation\n this.convertColorProperties(material, lambertMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, lambertMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, lambertMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n lambertMaterial.needsUpdate = true;\n return lambertMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness and roughness for better visual match\n if (source.metalness > 0) {\n // Metallic materials tend to be darker in Lambert shading\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n if (source.roughness > ROUGHNESS_THRESHOLD) {\n // Rough materials appear slightly darker\n const roughnessFactor =\n config.roughnessColorFactor +\n source.roughness * ROUGHNESS_COLOR_ADJUSTMENT;\n target.color.multiplyScalar(roughnessFactor);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Lambert material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map (Lambert materials support normal mapping)\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map (for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { Color, MeshPhongMaterial } from \"three\";\n\n/** Maximum shininess value for Phong material */\nconst MAX_SHININESS = 100;\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToPhongConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Maximum shininess value when roughness is 0.\n * @defaultValue 100\n */\n maxShininess: number;\n /**\n * Specular intensity multiplier.\n * @defaultValue 0.5\n */\n specularIntensity: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshPhongMaterial with PBR compensation.\n */\nexport class StandardToPhongConverter {\n /**\n * Converts MeshStandardMaterial to MeshPhongMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshPhongMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToPhongConverterOptions> = {},\n ): MeshPhongMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n maxShininess: MAX_SHININESS,\n specularIntensity: 0.5,\n ...options,\n };\n\n // Create new Phong material\n const phongMaterial = new MeshPhongMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, phongMaterial, config);\n\n // Handle color properties with PBR compensation\n this.convertColorProperties(material, phongMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, phongMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, phongMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n phongMaterial.needsUpdate = true;\n return phongMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness\n if (source.metalness > 0) {\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n // Convert roughness to shininess (inverse relationship)\n // Roughness 0 = max shininess, Roughness 1 = shininess 0\n target.shininess = (1 - source.roughness) * config.maxShininess;\n\n // Calculate specular color from metalness and base color\n if (source.metalness > 0) {\n // Metallic materials have tinted specular\n target.specular = source.color\n .clone()\n .multiplyScalar(source.metalness * config.specularIntensity);\n } else {\n // Non-metallic materials have white/gray specular\n const specularValue = config.specularIntensity * (1 - source.roughness);\n target.specular = new Color(specularValue, specularValue, specularValue);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Phong material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Bump map\n if (source.bumpMap) {\n target.bumpMap = source.bumpMap;\n target.bumpScale = source.bumpScale;\n }\n\n // Displacement map\n if (source.displacementMap) {\n target.displacementMap = source.displacementMap;\n target.displacementScale = source.displacementScale;\n target.displacementBias = source.displacementBias;\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Use metalness map as specular map\n if (source.metalnessMap) {\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { Texture } from \"three\";\nimport { Box3, DirectionalLight, RGBAFormat, Spherical, Vector3 } from \"three\";\n\n/** Number of color channels in RGBA format */\nconst RGBA_CHANNEL_COUNT = 4;\n/** Number of color channels in RGB format */\nconst RGB_CHANNEL_COUNT = 3;\n\n/** Red channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_R = 0.2126;\n/** Green channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_G = 0.7152;\n/** Blue channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_B = 0.0722;\n\n/**\n * Directional light with spherical positioning and HDR environment support.\n */\nexport class Sun extends DirectionalLight {\n /** Internal vectors to avoid garbage collection during calculations */\n private readonly tempVector3D0 = new Vector3();\n private readonly tempVector3D1 = new Vector3();\n private readonly tempVector3D2 = new Vector3();\n private readonly tempVector3D3 = new Vector3();\n private readonly tempVector3D4 = new Vector3();\n private readonly tempVector3D5 = new Vector3();\n private readonly tempVector3D6 = new Vector3();\n private readonly tempVector3D7 = new Vector3();\n private readonly tempBox3 = new Box3();\n private readonly tempSpherical = new Spherical();\n\n /**\n * @returns Distance from light position to origin\n */\n public get distance(): number {\n return this.position.length();\n }\n\n /**\n * @returns Elevation angle in radians (phi angle)\n */\n public get elevation(): number {\n return this.tempSpherical.setFromVector3(this.position).phi;\n }\n\n /**\n * @returns Azimuth angle in radians (theta angle)\n */\n public get azimuth(): number {\n return this.tempSpherical.setFromVector3(this.position).theta;\n }\n\n /**\n * @param value - New distance in world units\n */\n public set distance(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n value,\n this.tempSpherical.phi,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New elevation angle in radians (phi angle)\n */\n public set elevation(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n value,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New azimuth angle in radians (theta angle)\n */\n public set azimuth(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n this.tempSpherical.phi,\n value,\n );\n }\n\n /**\n * Configures shadow camera frustum to cover bounding box.\n *\n * @param box3 - 3D bounding box to cover with shadows\n */\n public configureShadowsForBoundingBox(box3: Box3): void {\n const camera = this.shadow.camera;\n\n this.target.updateWorldMatrix(true, false);\n this.lookAt(this.target.getWorldPosition(this.tempVector3D0));\n\n this.updateWorldMatrix(true, false);\n\n const points: Vector3[] = [\n this.tempVector3D0.set(box3.min.x, box3.min.y, box3.min.z),\n this.tempVector3D1.set(box3.min.x, box3.min.y, box3.max.z),\n this.tempVector3D2.set(box3.min.x, box3.max.y, box3.min.z),\n this.tempVector3D3.set(box3.min.x, box3.max.y, box3.max.z),\n this.tempVector3D4.set(box3.max.x, box3.min.y, box3.min.z),\n this.tempVector3D5.set(box3.max.x, box3.min.y, box3.max.z),\n this.tempVector3D6.set(box3.max.x, box3.max.y, box3.min.z),\n this.tempVector3D7.set(box3.max.x, box3.max.y, box3.max.z),\n ];\n\n const inverseMatrix = this.matrixWorld.clone().invert();\n\n for (const point of points) {\n point.applyMatrix4(inverseMatrix);\n }\n\n const newBox3 = this.tempBox3.setFromPoints(points);\n\n camera.left = newBox3.min.x;\n camera.bottom = newBox3.min.y;\n camera.near = -newBox3.max.z;\n\n camera.right = newBox3.max.x;\n camera.top = newBox3.max.y;\n camera.far = -newBox3.min.z;\n\n camera.updateWorldMatrix(true, false);\n camera.updateProjectionMatrix();\n }\n\n /**\n * Sets sun direction based on brightest point in HDR environment map.\n *\n * @param texture - HDR texture to analyze (must have image data)\n * @param distance - Distance to place sun from origin\n */\n public setDirectionFromHDRTexture(texture: Texture, distance = 1): void {\n const data = texture.image.data;\n const width = texture.image.width;\n const height = texture.image.height;\n\n let maxLuminance = 0;\n let maxIndex = 0;\n\n // Find brightest pixel\n\n const step =\n texture.format === RGBAFormat ? RGBA_CHANNEL_COUNT : RGB_CHANNEL_COUNT;\n for (let i = 0; i < data.length; i += step) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const luminance = LUMINANCE_R * r + LUMINANCE_G * g + LUMINANCE_B * b;\n if (luminance > maxLuminance) {\n maxLuminance = luminance;\n maxIndex = i;\n }\n }\n\n // Convert to spherical coordinates\n const pixelIndex = maxIndex / step;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n\n const u = x / width;\n const v = y / height;\n\n const elevation = v * Math.PI;\n const azimuth = u * -Math.PI * 2 - Math.PI / 2;\n\n this.position.setFromSphericalCoords(distance, elevation, azimuth);\n }\n}\n"],"names":["METALNESS_DARKNESS_FACTOR","REFLECTIVITY_BOOST"],"mappings":";;AAGA;AACA,MAAM,sBAAsB,GAAG,EAAE;AACjC;AACA,MAAM,oBAAoB,GAAG,EAAE;AAC/B;AACA,MAAM,cAAc,GAAG,CAAC;AACxB;AACA,MAAM,YAAY,GAAG,CAAC;AACtB;AACA,MAAM,WAAW,GAAG,IAAI;AAExB;AACA,MAAM,OAAO,GAAG,CAAC;AACjB;AACA,MAAM,OAAO,GAAG,GAAG;AAEnB;;AAEG;AACG,MAAO,aAAc,SAAQ,iBAAiB,CAAA;AAMlD;;;;;;AAMG;AACH,IAAA,WAAA,CACE,aAAa,GAAG,sBAAsB,EACtC,WAAW,GAAG,oBAAoB,EAClC,MAAM,GAAG,cAAc,EACvB,IAAI,GAAG,YAAY,EACnB,GAAG,GAAG,WAAW,EAAA;QAEjB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC;QACrC,IAAI,CAAA,8BAAA,GAAyB,aAAa;QAC1C,IAAI,CAAA,4BAAA,GAAuB,WAAW;QACtC,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;AAEG;AACH,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAA,8BAAA;IACb;AAEA;;AAEG;AACH,IAAA,IAAW,WAAW,GAAA;AACpB,QAAA,OAAO,IAAI,CAAA,4BAAA;IACb;AAEA;;AAEG;IACH,IAAW,aAAa,CAAC,KAAa,EAAA;QACpC,IAAI,CAAA,8BAAA,GAAyB,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QACrE,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;AAEG;IACH,IAAW,WAAW,CAAC,KAAa,EAAA;QAClC,IAAI,CAAA,4BAAA,GAAuB,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QACnE,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;;;AAKG;IACI,MAAM,CAAC,UAAkB,EAAE,QAAgB,EAAA;QAChD,IAAI,CAAA,8BAAA,GAAyB,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;QAC1E,IAAI,CAAA,4BAAA,GAAuB,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;QACtE,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;;AAIG;AACI,IAAA,eAAe,CAAC,MAAqB,EAAA;AAC1C,QAAA,IAAI,CAAA,8BAAA,GAAyB,MAAM,CAAC,aAAa;AACjD,QAAA,IAAI,CAAA,4BAAA,GAAuB,MAAM,CAAC,WAAW;QAC7C,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;;;;;AAOG;IACa,sBAAsB,GAAA;AACpC,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;YAEnB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,gCAAuB;YAC9D,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CACnD;QACH;aAAO;;AAEL,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,6BAAoB;QACrC;QAEA,KAAK,CAAC,sBAAsB,EAAE;IAChC;AAEA;;;;AAIG;IACI,sBAAsB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;AACpB,YAAA,OAAO,IAAI,CAAA,8BAAA;QACb;QACA,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,8BAAqB;QACpE,OAAO,SAAS,CAAC,QAAQ,CACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAC3D;IACH;AAEA;;;;AAIG;IACI,oBAAoB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACnB,YAAA,OAAO,IAAI,CAAA,4BAAA;QACb;QACA,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,gCAAuB;QACxE,OAAO,SAAS,CAAC,QAAQ,CACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAC7D;IACH;AAEA;;;;AAIG;AACI,IAAA,sBAAsB,CAAC,QAAmB,EAAA;AAC/C,QAAA,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;QAEhE,IAAI,gBAAgB,GAAG,CAAC;AAExB,QAAA,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;AAC7B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;AACrD,YAAA,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE;AAE/C,YAAA,MAAM,aAAa,GACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,gBAAgB,EAAE;AAC9C,gBAAA,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;YAC5C;QACF;QAEA,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,gBAAgB,CAAC;QAE5D,IAAI,CAAA,4BAAA,GAAuB,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC;QACzE,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;;AAIG;AACI,IAAA,mBAAmB,CAAC,GAAS,EAAA;QAClC,IAAI,CAAC,sBAAsB,CAAC;AAC1B,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;AACI,IAAA,oBAAoB,CAAC,WAAwB,EAAA;AAClD,QAAA,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;AACzC,QAAA,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;AAE7B,QAAA,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ;QAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU,CAAoB;AACxE,QAAA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAE;QAE5B,MAAM,MAAM,GAAG,EAAE;AAEjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAA,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B;AAEA,QAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;IACrC;AAEA;;;;;AAKG;AACI,IAAA,sBAAsB,CAAC,WAAwB,EAAA;AACpD,QAAA,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;AACzC,QAAA,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;AAE7B,QAAA,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ;AAC1C,QAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,QAA2B;AACrE,QAAA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAE;QAC5B,MAAM,MAAM,GAAc,EAAE;AAE5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAA,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B;AAEA;;;;;;AAMG;QACH,MAAM,eAAe,GAAG,CAAC,MAAiB,EAAE,UAAU,GAAG,CAAC,KAAa;AACrE,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,OAAO,IAAI,OAAO,EAAE;YACtB;AAEA,YAAA,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAE1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACnC,gBAAA,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE;gBACzB,IAAI,KAAK,GAAG,CAAC;AAEb,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,oBAAA,IACE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;wBAClD,KAAK,KAAK,CAAC,EACX;AACA,wBAAA,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AAChB,wBAAA,KAAK,EAAE;oBACT;gBACF;AAEA,gBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,oBAAA,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;gBACpC;YACF;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;AAED,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAC3B;AAEA;;;;;AAKG;IACa,KAAK,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,IAAI,CAAA,8BAAA,EACJ,IAAI,CAAA,4BAAA,EACJ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,GAAG,CACD;AAET,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACvB,QAAA,OAAO,MAAM;IACf;AACD;;ACvSD;;;;AAIG;MACU,cAAc,CAAA;AACzB;;;;;;AAMG;AACI,IAAA,OAAO,eAAe,CAC3B,MAAgB,EAChB,IAAY,EAAA;AAEZ,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AACxB,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,MAAM,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;YAC1D,IAAI,MAAM,EAAE;AACV,gBAAA,OAAO,MAAM;YACf;QACF;AAEA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,iBAAiB,CAC7B,MAAgB,EAChB,IAAY,EAAA;AAEZ,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE;AACtC,oBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;AAC1B,wBAAA,OAAO,QAAQ;oBACjB;gBACF;YACF;iBAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;gBACxC,OAAO,MAAM,CAAC,QAAQ;YACxB;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;YAC9D,IAAI,QAAQ,EAAE;AACZ,gBAAA,OAAO,QAAQ;YACjB;QACF;AAEA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;;;;AAOG;AACI,IAAA,OAAO,sBAAsB,CAClC,MAAgB,EAChB,IAAoB,EACpB,QAA+B,EAAA;AAE/B,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,QAAQ,CAAC,MAAM,CAAC;QAClB;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,cAAc,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;QAC9D;IACF;AAEA;;;;;;;AAOG;AACI,IAAA,OAAO,wBAAwB,CACpC,MAAgB,EAChB,IAAoB,EACpB,QAA+B,EAAA;AAE/B,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE;AACtC,oBAAA,IAAI,QAAQ,YAAY,IAAI,EAAE;wBAC5B,QAAQ,CAAC,QAAQ,CAAC;oBACpB;gBACF;YACF;AAAO,iBAAA,IAAI,MAAM,CAAC,QAAQ,YAAY,IAAI,EAAE;AAC1C,gBAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3B;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,cAAc,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;QAChE;IACF;AAEA;;;;;AAKG;AACI,IAAA,OAAO,gBAAgB,CAC5B,MAAgB,EAChB,QAAoC,EAAA;QAEpC,QAAQ,CAAC,MAAM,CAAC;AAEhB,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC;QAClD;IACF;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,kBAAkB,CAC9B,MAAgB,EAChB,QAAsD,EAAA;AAEtD,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/C,oBAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChB,wBAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtD;YACF;iBAAO;AACL,gBAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ;YAChE;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC;QACpD;IACF;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,aAAa,CACzB,MAAgB,EAChB,MAAgD,EAAA;QAEhD,IAAI,MAAM,GAAe,EAAE;AAE3B,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE;AAClB,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB;QACF;aAAO;AACL,YAAA,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC3C,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrE;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,eAAe,CAC3B,MAAgB,EAChB,MAAgD,EAAA;QAEhD,IAAI,MAAM,GAAe,EAAE;AAE3B,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE;AACtC,oBAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,wBAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE;AACpB,4BAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;wBACvB;oBACF;yBAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACrC,wBAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACvB;gBACF;YACF;AAAO,iBAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAC3B,oBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC9B;YACF;iBAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC5C,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC9B;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvE;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,iBAAiB,CAC7B,MAAgB,EAChB,SAAqB,EAAA;QAErB,IAAI,MAAM,GAAW,EAAE;AAEvB,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,mBAAmB,GAAG,KAAK;YAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE;AACtC,oBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;wBAChC,mBAAmB,GAAG,IAAI;wBAC1B;oBACF;gBACF;YACF;iBAAO;gBACL,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACvC,mBAAmB,GAAG,IAAI;gBAC5B;YACF;YAEA,IAAI,mBAAmB,EAAE;AACvB,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,cAAc,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CACnD;QACH;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;AACI,IAAA,OAAO,mBAAmB,CAC/B,MAAgB,EAChB,IAAY,EAAA;QAEZ,MAAM,gBAAgB,GAAG,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC;QAEvE,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,EAAE;QAE/C,cAAc,CAAC,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,cAAc,CAAC;AAExE,QAAA,OAAO,cAAc;IACvB;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,eAAe,CAC5B,MAAgB,EAChB,WAAqB,EACrB,WAAqB,EAAA;AAErB,QAAA,IAAI,MAAM,YAAY,IAAI,EAAE;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;gBAClC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,KAC7C,QAAQ,KAAK,WAAW,GAAG,WAAW,GAAG,QAAQ,CAClD;YACH;AAAO,iBAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE;AAC1C,gBAAA,MAAM,CAAC,QAAQ,GAAG,WAAW;YAC/B;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,cAAc,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;QACjE;IACF;AACD;;AC1UD;AACA,MAAM,eAAe,GAAG,CAAC;AAEzB;MACa,gBAAgB,CAAA;AAC3B;;;;;AAKG;IACI,OAAO,QAAQ,CAAC,WAAwB,EAAA;QAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE;QAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU,CAAoB;QACxE,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,eAAe,CAAC;AACvE,QAAA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAE;AAE5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAA,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC;YACzC,YAAY,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YAChD,YAAY,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YAChD,YAAY,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClD;AAEA,QAAA,aAAa,CAAC,YAAY,CACxB,UAAU,EACV,IAAI,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,CACnD;QACD,aAAa,CAAC,oBAAoB,EAAE;AACpC,QAAA,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC;AAC1C,QAAA,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC;AAC1D,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;AAC5B,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;;;AAQG;IACI,OAAO,kBAAkB,CAC9B,QAAkB,EAClB,WAAwB,EACxB,UAAkB,EAClB,IAAmB,EAAA;AAEnB,QAAA,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,IAAI,EAAE;AACb,QAAA,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;AAEzB,QAAA,QAAQ,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;AACtC,QAAA,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;AAE7B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnC;AACD;;AC/DD;AACA,MAAM,2BAA2B,GAAG,GAAG;AACvC;AACA,MAAM,4BAA4B,GAAG,GAAG;AAiCxC;;AAEG;MACU,wBAAwB,CAAA;AACnC;;;;;;AAMG;AACI,IAAA,OAAO,OAAO,CACnB,gBAAsC,EACtC,UAAoD,EAAE,EAAA;AAEtD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,gBAAgB,EAAE,GAAG;AACrB,YAAA,GAAG,OAAO;SACX;;AAGD,QAAA,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE;;QAG7C,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC;;QAGjE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC;;AAGpE,QAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,aAAa,CAAC;;AAGxD,QAAA,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,EAAE,aAAa,CAAC;;AAGnE,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,gBAAgB,CAAC,OAAO,EAAE;QAC5B;AAEA,QAAA,aAAa,CAAC,WAAW,GAAG,IAAI;AAChC,QAAA,OAAO,aAAa;IACtB;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,mBAAmB,CAChC,MAA4B,EAC5B,MAAyB,EACzB,MAAiD,EAAA;AAEjD,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QAC3B;AAEA,QAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACzB,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACvB,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB;AACrD,QAAA,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AAEzC,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QAC1C;IACF;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,sBAAsB,CACnC,MAA4B,EAC5B,MAAyB,EACzB,MAAiD,EAAA;;QAGjD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;;QAGnC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC;;AAGpD,QAAA,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE;YACxB,MAAM,mBAAmB,GACvB,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,2BAA2B;AACpD,YAAA,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC;QAClD;;AAGA,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,YAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACjC,iBAAA,KAAK;AACL,iBAAA,cAAc,CACb,MAAM,CAAC,iBAAiB,GAAG,4BAA4B,CACxD;AACH,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxC;;AAGA,QAAA,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;IAChD;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,kBAAkB,CAC/B,MAA4B,EAC5B,MAAyB,EAAA;;AAGzB,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;QACzB;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;QACnC;;AAGA,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;;AAE7B,YAAA,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS;QACxC;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AACjC,YAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;QACrD;;AAGA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,YAAA,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;QAC/C;;AAGA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;;AAEvB,YAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY;QAC1C;;AAGA,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,gBAAgB,CAC7B,MAA4B,EAC5B,MAAyB,EAAA;;QAGzB,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3C;IACF;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,6BAA6B,CAC1C,MAA4B,EAC5B,MAAyB,EAAA;AAEzB,QAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AACvC,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACrC,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;IACnC;AACD;;ACnPD;AACA,MAAMA,2BAAyB,GAAG,GAAG;AACrC;AACA,MAAM,mBAAmB,GAAG,GAAG;AAC/B;AACA,MAAM,0BAA0B,GAAG,GAAG;AACtC;AACA,MAAMC,oBAAkB,GAAG,GAAG;AA4B9B;;AAEG;MACU,0BAA0B,CAAA;AACrC;;;;;;AAMG;AACI,IAAA,OAAO,OAAO,CACnB,QAA8B,EAC9B,UAAsD,EAAE,EAAA;AAExD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,oBAAoB,EAAE,GAAG;AACzB,YAAA,GAAG,OAAO;SACX;;AAGD,QAAA,MAAM,eAAe,GAAG,IAAI,mBAAmB,EAAE;;QAGjD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC;;QAG3D,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC;;AAG9D,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC;;AAGlD,QAAA,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,eAAe,CAAC;;AAG7D,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,QAAQ,CAAC,OAAO,EAAE;QACpB;AAEA,QAAA,eAAe,CAAC,WAAW,GAAG,IAAI;AAClC,QAAA,OAAO,eAAe;IACxB;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,mBAAmB,CAChC,MAA4B,EAC5B,MAA2B,EAC3B,MAAmD,EAAA;AAEnD,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QAC3B;AAEA,QAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACzB,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACvB,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB;AACrD,QAAA,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACzC,QAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AAEvC,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QAC1C;IACF;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,sBAAsB,CACnC,MAA4B,EAC5B,MAA2B,EAC3B,MAAmD,EAAA;QAEnD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;;AAGnC,QAAA,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE;;YAExB,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,GAAGD,2BAAyB;AACxE,YAAA,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;QAC9C;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,GAAG,mBAAmB,EAAE;;AAE1C,YAAA,MAAM,eAAe,GACnB,MAAM,CAAC,oBAAoB;AAC3B,gBAAA,MAAM,CAAC,SAAS,GAAG,0BAA0B;AAC/C,YAAA,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;QAC9C;QAEA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;AACzC,QAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;IACrD;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,kBAAkB,CAC/B,MAA4B,EAC5B,MAA2B,EAAA;;AAG3B,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;QACzB;;AAGA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;QACzC;;AAGA,QAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,YAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;YACnC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE;QACjD;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AACjC,YAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;QACrD;;AAGA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,YAAA,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;QAC/C;;AAGA,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC7B,YAAA,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAC5B,MAAM,CAAC,SAAS,GAAGC,oBAAkB,EACrC,GAAG,CACJ;QACH;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;QACnC;;AAGA,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,gBAAgB,CAC7B,MAA4B,EAC5B,MAA2B,EAAA;;QAG3B,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3C;IACF;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,6BAA6B,CAC1C,MAA4B,EAC5B,MAA2B,EAAA;AAE3B,QAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AACvC,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACrC,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;IACnC;AACD;;ACjPD;AACA,MAAM,aAAa,GAAG,GAAG;AACzB;AACA,MAAM,yBAAyB,GAAG,GAAG;AACrC;AACA,MAAM,kBAAkB,GAAG,GAAG;AAiC9B;;AAEG;MACU,wBAAwB,CAAA;AACnC;;;;;;AAMG;AACI,IAAA,OAAO,OAAO,CACnB,QAA8B,EAC9B,UAAoD,EAAE,EAAA;AAEtD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,YAAY,EAAE,aAAa;AAC3B,YAAA,iBAAiB,EAAE,GAAG;AACtB,YAAA,GAAG,OAAO;SACX;;AAGD,QAAA,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE;;QAG7C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC;;QAGzD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC;;AAG5D,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC;;AAGhD,QAAA,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,aAAa,CAAC;;AAG3D,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,QAAQ,CAAC,OAAO,EAAE;QACpB;AAEA,QAAA,aAAa,CAAC,WAAW,GAAG,IAAI;AAChC,QAAA,OAAO,aAAa;IACtB;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,mBAAmB,CAChC,MAA4B,EAC5B,MAAyB,EACzB,MAAiD,EAAA;AAEjD,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QAC3B;AAEA,QAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACzB,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACvB,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB;AACrD,QAAA,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACzC,QAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AAEvC,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QAC1C;IACF;AAEA;;;;;;;AAOG;AACK,IAAA,OAAO,sBAAsB,CACnC,MAA4B,EAC5B,MAAyB,EACzB,MAAiD,EAAA;QAEjD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;;AAGnC,QAAA,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE;YACxB,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,yBAAyB;AACxE,YAAA,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;QAC9C;;;AAIA,QAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,YAAY;;AAG/D,QAAA,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE;;AAExB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;AACtB,iBAAA,KAAK;iBACL,cAAc,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAChE;aAAO;;AAEL,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;AACvE,YAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;QAC1E;QAEA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;AACzC,QAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;IACrD;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,kBAAkB,CAC/B,MAA4B,EAC5B,MAAyB,EAAA;;AAGzB,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;QACzB;;AAGA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;QACzC;;AAGA,QAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,YAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;YACnC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE;QACjD;;AAGA,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,YAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;QACrC;;AAGA,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,YAAA,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;AAC/C,YAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;AACnD,YAAA,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB;QACnD;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AACjC,YAAA,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;QACrD;;AAGA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,YAAA,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;QAC/C;;AAGA,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC7B,YAAA,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAC5B,MAAM,CAAC,SAAS,GAAG,kBAAkB,EACrC,GAAG,CACJ;QACH;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;QACnC;;AAGA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY;QAC1C;;AAGA,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,gBAAgB,CAC7B,MAA4B,EAC5B,MAAyB,EAAA;;QAGzB,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ;AACzC,YAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3C;IACF;AAEA;;;;;;AAMG;AACK,IAAA,OAAO,6BAA6B,CAC1C,MAA4B,EAC5B,MAAyB,EAAA;AAEzB,QAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AACvC,QAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,QAAA,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACrC,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;IACnC;AACD;;AC9QD;AACA,MAAM,kBAAkB,GAAG,CAAC;AAC5B;AACA,MAAM,iBAAiB,GAAG,CAAC;AAE3B;AACA,MAAM,WAAW,GAAG,MAAM;AAC1B;AACA,MAAM,WAAW,GAAG,MAAM;AAC1B;AACA,MAAM,WAAW,GAAG,MAAM;AAE1B;;AAEG;AACG,MAAO,GAAI,SAAQ,gBAAgB,CAAA;AAAzC,IAAA,WAAA,GAAA;;;sCAEmC,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;sCACb,IAAI,OAAO,EAAE;iCAClB,IAAI,IAAI,EAAE;sCACL,IAAI,SAAS,EAAE;IAiJlD;AA/IE;;AAEG;AACH,IAAA,IAAW,QAAQ,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;IAC/B;AAEA;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAA,sBAAA,CAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG;IAC7D;AAEA;;AAEG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,OAAO,IAAI,CAAA,sBAAA,CAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK;IAC/D;AAEA;;AAEG;IACH,IAAW,QAAQ,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,wBAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAClC,KAAK,EACL,IAAI,CAAA,sBAAA,CAAe,GAAG,EACtB,IAAI,CAAA,sBAAA,CAAe,KAAK,CACzB;IACH;AAEA;;AAEG;IACH,IAAW,SAAS,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,wBAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAClC,IAAI,CAAA,sBAAA,CAAe,MAAM,EACzB,KAAK,EACL,IAAI,CAAA,sBAAA,CAAe,KAAK,CACzB;IACH;AAEA;;AAEG;IACH,IAAW,OAAO,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,wBAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAClC,IAAI,CAAA,sBAAA,CAAe,MAAM,EACzB,IAAI,CAAA,sBAAA,CAAe,GAAG,EACtB,KAAK,CACN;IACH;AAEA;;;;AAIG;AACI,IAAA,8BAA8B,CAAC,IAAU,EAAA;AAC9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;QAEjC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAA,sBAAA,CAAe,CAAC;AAE7D,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;AAEnC,QAAA,MAAM,MAAM,GAAc;YACxB,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAA,sBAAA,CAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3D;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE;AAEvD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC;QACnC;QAEA,MAAM,OAAO,GAAG,IAAI,CAAA,iBAAA,CAAU,aAAa,CAAC,MAAM,CAAC;QAEnD,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAE3B,QAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;QACrC,MAAM,CAAC,sBAAsB,EAAE;IACjC;AAEA;;;;;AAKG;AACI,IAAA,0BAA0B,CAAC,OAAgB,EAAE,QAAQ,GAAG,CAAC,EAAA;AAC9D,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI;AAC/B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK;AACjC,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM;QAEnC,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,QAAQ,GAAG,CAAC;;AAIhB,QAAA,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,UAAU,GAAG,kBAAkB,GAAG,iBAAiB;AACxE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE;AAC1C,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,MAAM,SAAS,GAAG,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC;AACrE,YAAA,IAAI,SAAS,GAAG,YAAY,EAAE;gBAC5B,YAAY,GAAG,SAAS;gBACxB,QAAQ,GAAG,CAAC;YACd;QACF;;AAGA,QAAA,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI;AAClC,QAAA,MAAM,CAAC,GAAG,UAAU,GAAG,KAAK;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAExC,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;AACnB,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;AAEpB,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;QAE9C,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;IACpE;AACD;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/DualFovCamera.ts","../src/SceneTraversal.ts","../src/SkinnedMeshBaker.ts","../src/StandardToBasicConverter.ts","../src/StandardToLambertConverter.ts","../src/StandardToPhongConverter.ts","../src/Sun.ts"],"sourcesContent":["import type { Box3, BufferAttribute, SkinnedMesh } from \"three\";\nimport { MathUtils, PerspectiveCamera, Vector3 } from \"three\";\n\n/** Default horizontal field of view in degrees */\nconst DEFAULT_HORIZONTAL_FOV = 90;\n/** Default vertical field of view in degrees */\nconst DEFAULT_VERTICAL_FOV = 90;\n/** Default aspect ratio (width/height) */\nconst DEFAULT_ASPECT = 1;\n/** Default near clipping plane distance */\nconst DEFAULT_NEAR = 1;\n/** Default far clipping plane distance */\nconst DEFAULT_FAR = 1000;\n\n/** Minimum allowed field of view in degrees */\nconst MIN_FOV = 1;\n/** Maximum allowed field of view in degrees */\nconst MAX_FOV = 179;\n\n/**\n * Camera with independent horizontal and vertical FOV settings.\n */\nexport class DualFovCamera extends PerspectiveCamera {\n /** Internal storage for horizontal field of view in degrees */\n private horizontalFovInternal: number;\n /** Internal storage for vertical field of view in degrees */\n private verticalFovInternal: number;\n\n /**\n * @param horizontalFov - Horizontal FOV in degrees (clamped 1-179°)\n * @param verticalFov - Vertical FOV in degrees (clamped 1-179°)\n * @param aspect - Aspect ratio (width/height)\n * @param near - Near clipping plane distance\n * @param far - Far clipping plane distance\n */\n constructor(\n horizontalFov = DEFAULT_HORIZONTAL_FOV,\n verticalFov = DEFAULT_VERTICAL_FOV,\n aspect = DEFAULT_ASPECT,\n near = DEFAULT_NEAR,\n far = DEFAULT_FAR,\n ) {\n super(verticalFov, aspect, near, far);\n this.horizontalFovInternal = horizontalFov;\n this.verticalFovInternal = verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * @returns Horizontal FOV in degrees\n */\n public get horizontalFov(): number {\n return this.horizontalFovInternal;\n }\n\n /**\n * @returns Vertical FOV in degrees\n */\n public get verticalFov(): number {\n return this.verticalFovInternal;\n }\n\n /**\n * @param value - Horizontal FOV in degrees (clamped 1-179°)\n */\n public set horizontalFov(value: number) {\n this.horizontalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * @param value - Vertical FOV in degrees (clamped 1-179°)\n */\n public set verticalFov(value: number) {\n this.verticalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Sets both FOV values.\n *\n * @param horizontal - Horizontal FOV in degrees (clamped 1-179°)\n * @param vertical - Vertical FOV in degrees (clamped 1-179°)\n */\n public setFov(horizontal: number, vertical: number): void {\n this.horizontalFovInternal = MathUtils.clamp(horizontal, MIN_FOV, MAX_FOV);\n this.verticalFovInternal = MathUtils.clamp(vertical, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Copies FOV settings from another DualFovCamera.\n *\n * @param source - Source camera to copy from\n */\n public copyFovSettings(source: DualFovCamera): void {\n this.horizontalFovInternal = source.horizontalFov;\n this.verticalFovInternal = source.verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * Updates projection matrix based on FOV and aspect ratio.\n *\n * Landscape (aspect > 1): preserves horizontal FOV.\n * Portrait (aspect ≤ 1): preserves vertical FOV.\n *\n * @override\n */\n public override updateProjectionMatrix(): void {\n if (this.aspect > 1) {\n // Landscape orientation: preserve horizontal FOV\n const radians = MathUtils.degToRad(this.horizontalFovInternal);\n this.fov = MathUtils.radToDeg(\n Math.atan(Math.tan(radians / 2) / this.aspect) * 2,\n );\n } else {\n // Portrait orientation: preserve vertical FOV\n this.fov = this.verticalFovInternal;\n }\n\n super.updateProjectionMatrix();\n }\n\n /**\n * Gets actual horizontal FOV after aspect ratio adjustments.\n *\n * @returns Horizontal FOV in degrees\n */\n public getActualHorizontalFov(): number {\n if (this.aspect >= 1) {\n return this.horizontalFovInternal;\n }\n const verticalRadians = MathUtils.degToRad(this.verticalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(verticalRadians / 2) * this.aspect) * 2,\n );\n }\n\n /**\n * Gets actual vertical FOV after aspect ratio adjustments.\n *\n * @returns Vertical FOV in degrees\n */\n public getActualVerticalFov(): number {\n if (this.aspect < 1) {\n return this.verticalFovInternal;\n }\n const horizontalRadians = MathUtils.degToRad(this.horizontalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(horizontalRadians / 2) / this.aspect) * 2,\n );\n }\n\n /**\n * Adjusts vertical FOV to fit points within camera view.\n *\n * @param vertices - Array of 3D points in world coordinates\n */\n public fitVerticalFovToPoints(vertices: Vector3[]): void {\n const up = new Vector3(0, 1, 0).applyQuaternion(this.quaternion);\n\n let maxVerticalAngle = 0;\n\n for (const vertex of vertices) {\n const vertexToCam = this.position.clone().sub(vertex);\n const vertexDirection = vertexToCam.normalize();\n\n const verticalAngle =\n Math.asin(Math.abs(vertexDirection.dot(up))) *\n Math.sign(vertexDirection.dot(up));\n\n if (Math.abs(verticalAngle) > maxVerticalAngle) {\n maxVerticalAngle = Math.abs(verticalAngle);\n }\n }\n\n const requiredFov = MathUtils.radToDeg(2 * maxVerticalAngle);\n\n this.verticalFovInternal = MathUtils.clamp(requiredFov, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Adjusts vertical FOV to fit bounding box within camera view.\n *\n * @param box - 3D bounding box in world coordinates\n */\n public fitVerticalFovToBox(box: Box3): void {\n this.fitVerticalFovToPoints([\n new Vector3(box.min.x, box.min.y, box.min.z),\n new Vector3(box.min.x, box.min.y, box.max.z),\n new Vector3(box.min.x, box.max.y, box.min.z),\n new Vector3(box.min.x, box.max.y, box.max.z),\n new Vector3(box.max.x, box.min.y, box.min.z),\n new Vector3(box.max.x, box.min.y, box.max.z),\n new Vector3(box.max.x, box.max.y, box.min.z),\n new Vector3(box.max.x, box.max.y, box.max.z),\n ]);\n }\n\n /**\n * Adjusts vertical FOV to fit skinned mesh within camera view.\n * Updates skeleton and applies bone transformations.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public fitVerticalFovToMesh(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const target = new Vector3();\n\n const points = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n this.fitVerticalFovToPoints(points);\n }\n\n /**\n * Points camera to look at skinned mesh center of mass.\n * Uses iterative clustering to find main vertex concentration.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public lookAtMeshCenterOfMass(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes.position as BufferAttribute;\n const target = new Vector3();\n const points: Vector3[] = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n /**\n * Finds main cluster center using iterative refinement.\n *\n * @param points - Array of 3D points to cluster\n * @param iterations - Number of refinement iterations\n * @returns Center point of main cluster\n */\n const findMainCluster = (points: Vector3[], iterations = 3): Vector3 => {\n if (points.length === 0) {\n return new Vector3();\n }\n\n let center = points[Math.floor(points.length / 2)].clone();\n\n for (let i = 0; i < iterations; i++) {\n let total = new Vector3();\n let count = 0;\n\n for (const point of points) {\n if (\n point.distanceTo(center) < point.distanceTo(total) ||\n count === 0\n ) {\n total.add(point);\n count++;\n }\n }\n\n if (count > 0) {\n center = total.divideScalar(count);\n }\n }\n\n return center;\n };\n\n const centerOfMass = findMainCluster(points);\n this.lookAt(centerOfMass);\n }\n\n /**\n * Creates a copy of this camera with identical settings.\n *\n * @returns New DualFovCamera instance\n * @override\n */\n public override clone(): this {\n const camera = new DualFovCamera(\n this.horizontalFovInternal,\n this.verticalFovInternal,\n this.aspect,\n this.near,\n this.far,\n ) as this;\n\n camera.copy(this, true);\n return camera;\n }\n}\n","import type { Material, Object3D } from \"three\";\nimport { Mesh } from \"three\";\n\n/**\n * Constructor type for runtime type checking.\n *\n * @template T - The type that the constructor creates\n */\nexport type Constructor<T> = abstract new (...args: never[]) => T;\n\n/**\n * Static methods for traversing Three.js scene hierarchies.\n *\n * All methods use depth-first traversal.\n */\nexport class SceneTraversal {\n /**\n * Finds first object with exact name match.\n *\n * @param object - Root object to start from\n * @param name - Name to search for (case-sensitive)\n * @returns First matching object or undefined\n */\n public static getObjectByName(\n object: Object3D,\n name: string,\n ): Object3D | undefined {\n if (object.name === name) {\n return object;\n }\n\n for (const child of object.children) {\n const result = SceneTraversal.getObjectByName(child, name);\n if (result) {\n return result;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds first material with exact name match from mesh objects.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns First matching material or undefined\n */\n public static getMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material.name === name) {\n return material;\n }\n }\n } else if (object.material.name === name) {\n return object.material;\n }\n }\n\n for (const child of object.children) {\n const material = SceneTraversal.getMaterialByName(child, name);\n if (material) {\n return material;\n }\n }\n\n return undefined;\n }\n\n /**\n * Executes callback for all objects of specified type.\n *\n * @template T - Type of objects to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching object\n */\n public static enumerateObjectsByType<T extends Object3D>(\n object: Object3D,\n type: Constructor<T>,\n callback: (instance: T) => void,\n ): void {\n if (object instanceof type) {\n callback(object);\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjectsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all materials of specified type from mesh objects.\n *\n * @template T - Type of materials to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching material\n */\n public static enumerateMaterialsByType<T extends Material>(\n object: Object3D,\n type: Constructor<T>,\n callback: (material: T) => void,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material instanceof type) {\n callback(material);\n }\n }\n } else if (object.material instanceof type) {\n callback(object.material);\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterialsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all objects in hierarchy.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each object\n */\n public static enumerateObjects(\n object: Object3D,\n callback: (object: Object3D) => void,\n ): void {\n callback(object);\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjects(child, callback);\n }\n }\n\n /**\n * Executes callback for all materials from mesh objects.\n * If callback returns a material, replaces the original material.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each material. Return a material to replace.\n */\n public static enumerateMaterials(\n object: Object3D,\n callback: (material: Material, mesh: Mesh) => Material | undefined,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (let i = 0; i < object.material.length; i++) {\n object.material[i] =\n callback(object.material[i], object) ?? object.material[i];\n }\n } else {\n object.material = callback(object.material, object) ?? object.material;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterials(child, callback);\n }\n }\n\n /**\n * Returns all objects matching filter criteria.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for object names or predicate function\n * @returns Array of matching objects\n */\n public static filterObjects(\n object: Object3D,\n filter: RegExp | ((object: Object3D) => boolean),\n ): Object3D[] {\n let result: Object3D[] = [];\n\n if (typeof filter === \"function\") {\n if (filter(object)) {\n result.push(object);\n }\n } else {\n if (object.name && filter.test(object.name)) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterObjects(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all materials matching filter criteria from mesh objects.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for material names or predicate function\n * @returns Array of matching materials\n */\n public static filterMaterials(\n object: Object3D,\n filter: RegExp | ((object: Material) => boolean),\n ): Material[] {\n let result: Material[] = [];\n\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (typeof filter === \"function\") {\n if (filter(material)) {\n result.push(material);\n }\n } else if (filter.test(material.name)) {\n result.push(material);\n }\n }\n } else if (typeof filter === \"function\") {\n if (filter(object.material)) {\n result.push(object.material);\n }\n } else if (filter.test(object.material.name)) {\n result.push(object.material);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterMaterials(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all mesh objects that use any of the specified materials.\n *\n * @param object - Root object to start from\n * @param materials - Array of materials to search for\n * @returns Array of mesh objects using the materials\n */\n public static findMaterialUsers(\n object: Object3D,\n materials: Material[],\n ): Mesh[] {\n let result: Mesh[] = [];\n\n if (object instanceof Mesh) {\n let hasMatchingMaterial = false;\n\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (materials.includes(material)) {\n hasMatchingMaterial = true;\n break;\n }\n }\n } else {\n if (materials.includes(object.material)) {\n hasMatchingMaterial = true;\n }\n }\n\n if (hasMatchingMaterial) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(\n SceneTraversal.findMaterialUsers(child, materials),\n );\n }\n\n return result;\n }\n\n /**\n * Clones material by name and replaces all instances with the clone.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns Cloned material or undefined if not found\n */\n public static cloneMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n const originalMaterial = SceneTraversal.getMaterialByName(object, name);\n\n if (!originalMaterial) {\n return undefined;\n }\n\n const clonedMaterial = originalMaterial.clone();\n\n SceneTraversal.replaceMaterial(object, originalMaterial, clonedMaterial);\n\n return clonedMaterial;\n }\n\n /**\n * Replaces all instances of a material with another material.\n *\n * @param object - Root object to start from\n * @param oldMaterial - Material to replace\n * @param newMaterial - Material to use as replacement\n */\n private static replaceMaterial(\n object: Object3D,\n oldMaterial: Material,\n newMaterial: Material,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n object.material = object.material.map((material) =>\n material === oldMaterial ? newMaterial : material,\n );\n } else if (object.material === oldMaterial) {\n object.material = newMaterial;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.replaceMaterial(child, oldMaterial, newMaterial);\n }\n }\n}\n","import type { AnimationClip, Object3D, SkinnedMesh } from \"three\";\nimport { AnimationMixer, BufferAttribute, Mesh, Vector3 } from \"three\";\n\n/** Number of components per vertex */\nconst COMPONENT_COUNT = 3;\n\n/** Converts skinned meshes to static meshes. */\nexport class SkinnedMeshBaker {\n /**\n * Converts skinned mesh to static mesh in current pose.\n *\n * @param skinnedMesh - Mesh to convert\n * @returns Static mesh with baked positions\n */\n public static bakePose(skinnedMesh: SkinnedMesh): Mesh {\n const bakedGeometry = skinnedMesh.geometry.clone();\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const newPositions = new Float32Array(position.count * COMPONENT_COUNT);\n const target = new Vector3();\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n newPositions[i * COMPONENT_COUNT + 0] = target.x;\n newPositions[i * COMPONENT_COUNT + 1] = target.y;\n newPositions[i * COMPONENT_COUNT + 2] = target.z;\n }\n\n bakedGeometry.setAttribute(\n \"position\",\n new BufferAttribute(newPositions, COMPONENT_COUNT),\n );\n bakedGeometry.computeVertexNormals();\n bakedGeometry.deleteAttribute(\"skinIndex\");\n bakedGeometry.deleteAttribute(\"skinWeight\");\n\n const mesh = new Mesh(bakedGeometry, skinnedMesh.material);\n mesh.name = skinnedMesh.name;\n return mesh;\n }\n\n /**\n * Bakes animation frame to static mesh.\n *\n * @param armature - Root object with bones\n * @param skinnedMesh - Mesh to convert\n * @param timeOffset - Time in seconds within animation\n * @param clip - Animation clip for pose\n * @returns Static mesh with baked positions\n */\n public static bakeAnimationFrame(\n armature: Object3D,\n skinnedMesh: SkinnedMesh,\n timeOffset: number,\n clip: AnimationClip,\n ): Mesh {\n const mixer = new AnimationMixer(armature);\n const action = mixer.clipAction(clip);\n action.play();\n mixer.setTime(timeOffset);\n\n armature.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n return this.bakePose(skinnedMesh);\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshBasicMaterial } from \"three\";\n\n/** Factor for metalness brightness adjustment */\nconst METALNESS_BRIGHTNESS_FACTOR = 0.3;\n/** Factor for emissive color contribution when combining with base color */\nconst EMISSIVE_CONTRIBUTION_FACTOR = 0.5;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToBasicConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Apply emissive color to base color for brightness compensation.\n * @defaultValue true\n */\n combineEmissive: boolean;\n /**\n * Brightness adjustment factor to compensate for loss of lighting.\n * @defaultValue 1.3\n */\n brightnessFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshBasicMaterial with brightness compensation.\n */\nexport class StandardToBasicConverter {\n /**\n * Converts MeshStandardMaterial to MeshBasicMaterial.\n *\n * @param standardMaterial - Source material to convert\n * @param options - Conversion options\n * @returns New MeshBasicMaterial with mapped properties\n */\n public static convert(\n standardMaterial: MeshStandardMaterial,\n options: Partial<StandardToBasicConverterOptions> = {},\n ): MeshBasicMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n combineEmissive: true,\n brightnessFactor: 1.3,\n ...options,\n };\n\n // Create new Basic material\n const basicMaterial = new MeshBasicMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(standardMaterial, basicMaterial, config);\n\n // Handle color properties with lighting compensation\n this.convertColorProperties(standardMaterial, basicMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(standardMaterial, basicMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(standardMaterial, basicMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n standardMaterial.dispose();\n }\n\n basicMaterial.needsUpdate = true;\n return basicMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with lighting compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n // Base color conversion with brightness compensation\n target.color = source.color.clone();\n\n // Apply brightness compensation since BasicMaterial doesn't respond to lighting\n target.color.multiplyScalar(config.brightnessFactor);\n\n // Adjust for metalness - metallic materials tend to be darker without lighting\n if (source.metalness > 0) {\n const metalnessBrightness =\n 1 + source.metalness * METALNESS_BRIGHTNESS_FACTOR;\n target.color.multiplyScalar(metalnessBrightness);\n }\n\n // Combine emissive color if requested\n if (config.combineEmissive) {\n const emissiveContribution = source.emissive\n .clone()\n .multiplyScalar(\n source.emissiveIntensity * EMISSIVE_CONTRIBUTION_FACTOR,\n );\n target.color.add(emissiveContribution);\n }\n\n // Ensure color doesn't exceed valid range\n target.color.r = Math.min(target.color.r, 1.0);\n target.color.g = Math.min(target.color.g, 1.0);\n target.color.b = Math.min(target.color.b, 1.0);\n }\n\n /**\n * Converts texture properties from Standard to Basic material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main diffuse/albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Environment map (BasicMaterial supports this for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n // Use metalness to determine reflectivity\n target.reflectivity = source.metalness;\n }\n\n // Light map (BasicMaterial supports this)\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map (BasicMaterial supports this)\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Specular map (BasicMaterial supports this)\n if (source.metalnessMap) {\n // Use metalness map as specular map for some reflective effect\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n\nexport default StandardToBasicConverter;\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshLambertMaterial } from \"three\";\n\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Roughness threshold for additional darkening */\nconst ROUGHNESS_THRESHOLD = 0.5;\n/** Factor for roughness color adjustment */\nconst ROUGHNESS_COLOR_ADJUSTMENT = 0.2;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToLambertConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Color adjustment factor for roughness compensation.\n * @defaultValue 0.8\n */\n roughnessColorFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshLambertMaterial with PBR compensation.\n */\nexport class StandardToLambertConverter {\n /**\n * Converts MeshStandardMaterial to MeshLambertMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshLambertMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToLambertConverterOptions> = {},\n ): MeshLambertMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n roughnessColorFactor: 0.8,\n ...options,\n };\n\n // Create new Lambert material\n const lambertMaterial = new MeshLambertMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, lambertMaterial, config);\n\n // Handle color properties with roughness compensation\n this.convertColorProperties(material, lambertMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, lambertMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, lambertMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n lambertMaterial.needsUpdate = true;\n return lambertMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness and roughness for better visual match\n if (source.metalness > 0) {\n // Metallic materials tend to be darker in Lambert shading\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n if (source.roughness > ROUGHNESS_THRESHOLD) {\n // Rough materials appear slightly darker\n const roughnessFactor =\n config.roughnessColorFactor +\n source.roughness * ROUGHNESS_COLOR_ADJUSTMENT;\n target.color.multiplyScalar(roughnessFactor);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Lambert material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map (Lambert materials support normal mapping)\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map (for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { Color, MeshPhongMaterial } from \"three\";\n\n/** Maximum shininess value for Phong material */\nconst MAX_SHININESS = 100;\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToPhongConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Maximum shininess value when roughness is 0.\n * @defaultValue 100\n */\n maxShininess: number;\n /**\n * Specular intensity multiplier.\n * @defaultValue 0.5\n */\n specularIntensity: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshPhongMaterial with PBR compensation.\n */\nexport class StandardToPhongConverter {\n /**\n * Converts MeshStandardMaterial to MeshPhongMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshPhongMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToPhongConverterOptions> = {},\n ): MeshPhongMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n maxShininess: MAX_SHININESS,\n specularIntensity: 0.5,\n ...options,\n };\n\n // Create new Phong material\n const phongMaterial = new MeshPhongMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, phongMaterial, config);\n\n // Handle color properties with PBR compensation\n this.convertColorProperties(material, phongMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, phongMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, phongMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n phongMaterial.needsUpdate = true;\n return phongMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness\n if (source.metalness > 0) {\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n // Convert roughness to shininess (inverse relationship)\n // Roughness 0 = max shininess, Roughness 1 = shininess 0\n target.shininess = (1 - source.roughness) * config.maxShininess;\n\n // Calculate specular color from metalness and base color\n if (source.metalness > 0) {\n // Metallic materials have tinted specular\n target.specular = source.color\n .clone()\n .multiplyScalar(source.metalness * config.specularIntensity);\n } else {\n // Non-metallic materials have white/gray specular\n const specularValue = config.specularIntensity * (1 - source.roughness);\n target.specular = new Color(specularValue, specularValue, specularValue);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Phong material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Bump map\n if (source.bumpMap) {\n target.bumpMap = source.bumpMap;\n target.bumpScale = source.bumpScale;\n }\n\n // Displacement map\n if (source.displacementMap) {\n target.displacementMap = source.displacementMap;\n target.displacementScale = source.displacementScale;\n target.displacementBias = source.displacementBias;\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Use metalness map as specular map\n if (source.metalnessMap) {\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { Texture } from \"three\";\nimport { Box3, DirectionalLight, RGBAFormat, Spherical, Vector3 } from \"three\";\n\n/** Number of color channels in RGBA format */\nconst RGBA_CHANNEL_COUNT = 4;\n/** Number of color channels in RGB format */\nconst RGB_CHANNEL_COUNT = 3;\n\n/** Red channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_R = 0.2126;\n/** Green channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_G = 0.7152;\n/** Blue channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_B = 0.0722;\n\n/**\n * Directional light with spherical positioning and HDR environment support.\n */\nexport class Sun extends DirectionalLight {\n /** Internal vectors to avoid garbage collection during calculations */\n private readonly tempVector3D0 = new Vector3();\n private readonly tempVector3D1 = new Vector3();\n private readonly tempVector3D2 = new Vector3();\n private readonly tempVector3D3 = new Vector3();\n private readonly tempVector3D4 = new Vector3();\n private readonly tempVector3D5 = new Vector3();\n private readonly tempVector3D6 = new Vector3();\n private readonly tempVector3D7 = new Vector3();\n private readonly tempBox3 = new Box3();\n private readonly tempSpherical = new Spherical();\n\n /**\n * @returns Distance from light position to origin\n */\n public get distance(): number {\n return this.position.length();\n }\n\n /**\n * @returns Elevation angle in radians (phi angle)\n */\n public get elevation(): number {\n return this.tempSpherical.setFromVector3(this.position).phi;\n }\n\n /**\n * @returns Azimuth angle in radians (theta angle)\n */\n public get azimuth(): number {\n return this.tempSpherical.setFromVector3(this.position).theta;\n }\n\n /**\n * @param value - New distance in world units\n */\n public set distance(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n value,\n this.tempSpherical.phi,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New elevation angle in radians (phi angle)\n */\n public set elevation(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n value,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New azimuth angle in radians (theta angle)\n */\n public set azimuth(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n this.tempSpherical.phi,\n value,\n );\n }\n\n /**\n * Configures shadow camera frustum to cover bounding box.\n *\n * @param box3 - 3D bounding box to cover with shadows\n */\n public configureShadowsForBoundingBox(box3: Box3): void {\n const camera = this.shadow.camera;\n\n this.target.updateWorldMatrix(true, false);\n this.lookAt(this.target.getWorldPosition(this.tempVector3D0));\n\n this.updateWorldMatrix(true, false);\n\n const points: Vector3[] = [\n this.tempVector3D0.set(box3.min.x, box3.min.y, box3.min.z),\n this.tempVector3D1.set(box3.min.x, box3.min.y, box3.max.z),\n this.tempVector3D2.set(box3.min.x, box3.max.y, box3.min.z),\n this.tempVector3D3.set(box3.min.x, box3.max.y, box3.max.z),\n this.tempVector3D4.set(box3.max.x, box3.min.y, box3.min.z),\n this.tempVector3D5.set(box3.max.x, box3.min.y, box3.max.z),\n this.tempVector3D6.set(box3.max.x, box3.max.y, box3.min.z),\n this.tempVector3D7.set(box3.max.x, box3.max.y, box3.max.z),\n ];\n\n const inverseMatrix = this.matrixWorld.clone().invert();\n\n for (const point of points) {\n point.applyMatrix4(inverseMatrix);\n }\n\n const newBox3 = this.tempBox3.setFromPoints(points);\n\n camera.left = newBox3.min.x;\n camera.bottom = newBox3.min.y;\n camera.near = -newBox3.max.z;\n\n camera.right = newBox3.max.x;\n camera.top = newBox3.max.y;\n camera.far = -newBox3.min.z;\n\n camera.updateWorldMatrix(true, false);\n camera.updateProjectionMatrix();\n }\n\n /**\n * Sets sun direction based on brightest point in HDR environment map.\n *\n * @param texture - HDR texture to analyze (must have image data)\n * @param distance - Distance to place sun from origin\n */\n public setDirectionFromHDRTexture(texture: Texture, distance = 1): void {\n const data = texture.image.data;\n const width = texture.image.width;\n const height = texture.image.height;\n\n let maxLuminance = 0;\n let maxIndex = 0;\n\n // Find brightest pixel\n\n const step =\n texture.format === RGBAFormat ? RGBA_CHANNEL_COUNT : RGB_CHANNEL_COUNT;\n for (let i = 0; i < data.length; i += step) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const luminance = LUMINANCE_R * r + LUMINANCE_G * g + LUMINANCE_B * b;\n if (luminance > maxLuminance) {\n maxLuminance = luminance;\n maxIndex = i;\n }\n }\n\n // Convert to spherical coordinates\n const pixelIndex = maxIndex / step;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n\n const u = x / width;\n const v = y / height;\n\n const elevation = v * Math.PI;\n const azimuth = u * -Math.PI * 2 - Math.PI / 2;\n\n this.position.setFromSphericalCoords(distance, elevation, azimuth);\n }\n}\n"],"names":["METALNESS_DARKNESS_FACTOR","REFLECTIVITY_BOOST"],"mappings":"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"}
package/dist/index.min.js CHANGED
@@ -1,2 +1,2 @@
1
- import{PerspectiveCamera as t,MathUtils as s,Vector3 as e,Mesh as i,BufferAttribute as r,AnimationMixer as o,MeshBasicMaterial as n,MeshLambertMaterial as a,MeshPhongMaterial as c,Color as h,DirectionalLight as f,Box3 as l,Spherical as u,RGBAFormat as p}from"three";const M=179;class w extends t{constructor(t=90,s=90,e=1,i=1,r=1e3){super(s,e,i,r),this.t=t,this.i=s,this.updateProjectionMatrix()}get horizontalFov(){return this.t}get verticalFov(){return this.i}set horizontalFov(t){this.t=s.clamp(t,1,M),this.updateProjectionMatrix()}set verticalFov(t){this.i=s.clamp(t,1,M),this.updateProjectionMatrix()}setFov(t,e){this.t=s.clamp(t,1,M),this.i=s.clamp(e,1,M),this.updateProjectionMatrix()}copyFovSettings(t){this.t=t.horizontalFov,this.i=t.verticalFov,this.updateProjectionMatrix()}updateProjectionMatrix(){if(this.aspect>1){const t=s.degToRad(this.t);this.fov=s.radToDeg(2*Math.atan(Math.tan(t/2)/this.aspect))}else this.fov=this.i;super.updateProjectionMatrix()}getActualHorizontalFov(){if(this.aspect>=1)return this.t;const t=s.degToRad(this.i);return s.radToDeg(2*Math.atan(Math.tan(t/2)*this.aspect))}getActualVerticalFov(){if(1>this.aspect)return this.i;const t=s.degToRad(this.t);return s.radToDeg(2*Math.atan(Math.tan(t/2)/this.aspect))}fitVerticalFovToPoints(t){const i=new e(0,1,0).applyQuaternion(this.quaternion);let r=0;for(const s of t){const t=this.position.clone().sub(s).normalize(),e=Math.asin(Math.abs(t.dot(i)))*Math.sign(t.dot(i));Math.abs(e)>r&&(r=Math.abs(e))}const o=s.radToDeg(2*r);this.i=s.clamp(o,1,M),this.updateProjectionMatrix()}fitVerticalFovToBox(t){this.fitVerticalFovToPoints([new e(t.min.x,t.min.y,t.min.z),new e(t.min.x,t.min.y,t.max.z),new e(t.min.x,t.max.y,t.min.z),new e(t.min.x,t.max.y,t.max.z),new e(t.max.x,t.min.y,t.min.z),new e(t.max.x,t.min.y,t.max.z),new e(t.max.x,t.max.y,t.min.z),new e(t.max.x,t.max.y,t.max.z)])}fitVerticalFovToMesh(t){t.updateWorldMatrix(!0,!0),t.skeleton.update();const s=t.geometry.attributes.position,i=new e,r=[];for(let e=0;s.count>e;e++)i.fromBufferAttribute(s,e),t.applyBoneTransform(e,i),r.push(i.clone());this.fitVerticalFovToPoints(r)}lookAtMeshCenterOfMass(t){t.updateWorldMatrix(!0,!0),t.skeleton.update();const s=t.geometry.attributes.position,i=new e,r=[];for(let e=0;s.count>e;e++)i.fromBufferAttribute(s,e),t.applyBoneTransform(e,i),r.push(i.clone());const o=((t,s=3)=>{if(0===t.length)return new e;let i=t[Math.floor(t.length/2)].clone();for(let r=0;s>r;r++){let s=new e,r=0;for(const e of t)(e.distanceTo(i)<e.distanceTo(s)||0===r)&&(s.add(e),r++);r>0&&(i=s.divideScalar(r))}return i})(r);this.lookAt(o)}clone(){const t=new w(this.t,this.i,this.aspect,this.near,this.far);return t.copy(this,!0),t}}class v{static getObjectByName(t,s){if(t.name===s)return t;for(const e of t.children){const t=v.getObjectByName(e,s);if(t)return t}}static getMaterialByName(t,s){if(t instanceof i)if(Array.isArray(t.material)){for(const e of t.material)if(e.name===s)return e}else if(t.material.name===s)return t.material;for(const e of t.children){const t=v.getMaterialByName(e,s);if(t)return t}}static enumerateObjectsByType(t,s,e){t instanceof s&&e(t);for(const i of t.children)v.enumerateObjectsByType(i,s,e)}static enumerateMaterialsByType(t,s,e){if(t instanceof i)if(Array.isArray(t.material))for(const i of t.material)i instanceof s&&e(i);else t.material instanceof s&&e(t.material);for(const i of t.children)v.enumerateMaterialsByType(i,s,e)}static enumerateObjects(t,s){s(t);for(const e of t.children)v.enumerateObjects(e,s)}static enumerateMaterials(t,s){if(t instanceof i)if(Array.isArray(t.material))for(let e=0;t.material.length>e;e++)t.material[e]=s(t.material[e])??t.material[e];else t.material=s(t.material)??t.material;for(const e of t.children)v.enumerateMaterials(e,s)}static filterObjects(t,s){let e=[];"function"==typeof s?s(t)&&e.push(t):t.name&&s.test(t.name)&&e.push(t);for(const i of t.children)e=e.concat(v.filterObjects(i,s));return e}static filterMaterials(t,s){let e=[];if(t instanceof i)if(Array.isArray(t.material))for(const i of t.material)"function"==typeof s?s(i)&&e.push(i):s.test(i.name)&&e.push(i);else"function"==typeof s?s(t.material)&&e.push(t.material):s.test(t.material.name)&&e.push(t.material);for(const i of t.children)e=e.concat(v.filterMaterials(i,s));return e}static findMaterialUsers(t,s){let e=[];if(t instanceof i){let i=!1;if(Array.isArray(t.material)){for(const e of t.material)if(s.includes(e)){i=!0;break}}else s.includes(t.material)&&(i=!0);i&&e.push(t)}for(const i of t.children)e=e.concat(v.findMaterialUsers(i,s));return e}static cloneMaterialByName(t,s){const e=v.getMaterialByName(t,s);if(!e)return;const i=e.clone();return v.replaceMaterial(t,e,i),i}static replaceMaterial(t,s,e){t instanceof i&&(Array.isArray(t.material)?t.material=t.material.map(t=>t===s?e:t):t.material===s&&(t.material=e));for(const i of t.children)v.replaceMaterial(i,s,e)}}class y{static bakePose(t){const s=t.geometry.clone(),o=s.attributes.position,n=new Float32Array(3*o.count),a=new e;for(let s=0;o.count>s;s++)a.fromBufferAttribute(o,s),t.applyBoneTransform(s,a),n[3*s+0]=a.x,n[3*s+1]=a.y,n[3*s+2]=a.z;s.setAttribute("position",new r(n,3)),s.computeVertexNormals(),s.deleteAttribute("skinIndex"),s.deleteAttribute("skinWeight");const c=new i(s,t.material);return c.name=t.name,c}static bakeAnimationFrame(t,s,e,i){const r=new o(t);return r.clipAction(i).play(),r.setTime(e),t.updateWorldMatrix(!0,!0),s.skeleton.update(),this.bakePose(s)}}class m{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,combineEmissive:!0,brightnessFactor:1.3,...s},i=new n;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){if(s.color=t.color.clone(),s.color.multiplyScalar(e.brightnessFactor),t.metalness>0&&s.color.multiplyScalar(1+.3*t.metalness),e.combineEmissive){const e=t.emissive.clone().multiplyScalar(.5*t.emissiveIntensity);s.color.add(e)}s.color.r=Math.min(s.color.r,1),s.color.g=Math.min(s.color.g,1),s.color.b=Math.min(s.color.b,1)}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.alphaMap&&(s.alphaMap=t.alphaMap),t.envMap&&(s.envMap=t.envMap,s.reflectivity=t.metalness),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.metalnessMap&&(s.specularMap=t.metalnessMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class g{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,roughnessColorFactor:.8,...s},i=new a;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,s.flatShading=t.flatShading,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){s.color=t.color.clone(),t.metalness>0&&s.color.multiplyScalar(1-.3*t.metalness),t.roughness>.5&&s.color.multiplyScalar(e.roughnessColorFactor+.2*t.roughness),s.emissive=t.emissive.clone(),s.emissiveIntensity=t.emissiveIntensity}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.emissiveMap&&(s.emissiveMap=t.emissiveMap),t.normalMap&&(s.normalMap=t.normalMap,s.normalScale=t.normalScale.clone()),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.envMap&&(s.envMap=t.envMap,s.reflectivity=Math.min(t.metalness+.1,1)),t.alphaMap&&(s.alphaMap=t.alphaMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class F{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,maxShininess:100,specularIntensity:.5,...s},i=new c;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,s.flatShading=t.flatShading,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){if(s.color=t.color.clone(),t.metalness>0&&s.color.multiplyScalar(1-.3*t.metalness),s.shininess=(1-t.roughness)*e.maxShininess,t.metalness>0)s.specular=t.color.clone().multiplyScalar(t.metalness*e.specularIntensity);else{const i=e.specularIntensity*(1-t.roughness);s.specular=new h(i,i,i)}s.emissive=t.emissive.clone(),s.emissiveIntensity=t.emissiveIntensity}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.emissiveMap&&(s.emissiveMap=t.emissiveMap),t.normalMap&&(s.normalMap=t.normalMap,s.normalScale=t.normalScale.clone()),t.bumpMap&&(s.bumpMap=t.bumpMap,s.bumpScale=t.bumpScale),t.displacementMap&&(s.displacementMap=t.displacementMap,s.displacementScale=t.displacementScale,s.displacementBias=t.displacementBias),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.envMap&&(s.envMap=t.envMap,s.reflectivity=Math.min(t.metalness+.1,1)),t.alphaMap&&(s.alphaMap=t.alphaMap),t.metalnessMap&&(s.specularMap=t.metalnessMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class T extends f{constructor(){super(...arguments),this.o=new e,this.h=new e,this.l=new e,this.u=new e,this.p=new e,this.M=new e,this.v=new e,this.m=new e,this.F=new l,this.T=new u}get distance(){return this.position.length()}get elevation(){return this.T.setFromVector3(this.position).phi}get azimuth(){return this.T.setFromVector3(this.position).theta}set distance(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(t,this.T.phi,this.T.theta)}set elevation(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(this.T.radius,t,this.T.theta)}set azimuth(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(this.T.radius,this.T.phi,t)}configureShadowsForBoundingBox(t){const s=this.shadow.camera;this.target.updateWorldMatrix(!0,!1),this.lookAt(this.target.getWorldPosition(this.o)),this.updateWorldMatrix(!0,!1);const e=[this.o.set(t.min.x,t.min.y,t.min.z),this.h.set(t.min.x,t.min.y,t.max.z),this.l.set(t.min.x,t.max.y,t.min.z),this.u.set(t.min.x,t.max.y,t.max.z),this.p.set(t.max.x,t.min.y,t.min.z),this.M.set(t.max.x,t.min.y,t.max.z),this.v.set(t.max.x,t.max.y,t.min.z),this.m.set(t.max.x,t.max.y,t.max.z)],i=this.matrixWorld.clone().invert();for(const t of e)t.applyMatrix4(i);const r=this.F.setFromPoints(e);s.left=r.min.x,s.bottom=r.min.y,s.near=-r.max.z,s.right=r.max.x,s.top=r.max.y,s.far=-r.min.z,s.updateWorldMatrix(!0,!1),s.updateProjectionMatrix()}setDirectionFromHDRTexture(t,s=1){const e=t.image.data,i=t.image.width,r=t.image.height;let o=0,n=0;const a=t.format===p?4:3;for(let t=0;e.length>t;t+=a){const s=.2126*e[t]+.7152*e[t+1]+.0722*e[t+2];s>o&&(o=s,n=t)}const c=n/a,h=c%i;this.position.setFromSphericalCoords(s,Math.floor(c/i)/r*Math.PI,h/i*-Math.PI*2-Math.PI/2)}}export{w as DualFovCamera,v as SceneTraversal,y as SkinnedMeshBaker,m as StandardToBasicConverter,g as StandardToLambertConverter,F as StandardToPhongConverter,T as Sun};
1
+ import{PerspectiveCamera as t,MathUtils as s,Vector3 as e,Mesh as i,BufferAttribute as r,AnimationMixer as o,MeshBasicMaterial as n,MeshLambertMaterial as a,MeshPhongMaterial as c,Color as h,DirectionalLight as f,Box3 as l,Spherical as u,RGBAFormat as p}from"three";const M=179;class w extends t{constructor(t=90,s=90,e=1,i=1,r=1e3){super(s,e,i,r),this.t=t,this.i=s,this.updateProjectionMatrix()}get horizontalFov(){return this.t}get verticalFov(){return this.i}set horizontalFov(t){this.t=s.clamp(t,1,M),this.updateProjectionMatrix()}set verticalFov(t){this.i=s.clamp(t,1,M),this.updateProjectionMatrix()}setFov(t,e){this.t=s.clamp(t,1,M),this.i=s.clamp(e,1,M),this.updateProjectionMatrix()}copyFovSettings(t){this.t=t.horizontalFov,this.i=t.verticalFov,this.updateProjectionMatrix()}updateProjectionMatrix(){if(this.aspect>1){const t=s.degToRad(this.t);this.fov=s.radToDeg(2*Math.atan(Math.tan(t/2)/this.aspect))}else this.fov=this.i;super.updateProjectionMatrix()}getActualHorizontalFov(){if(this.aspect>=1)return this.t;const t=s.degToRad(this.i);return s.radToDeg(2*Math.atan(Math.tan(t/2)*this.aspect))}getActualVerticalFov(){if(1>this.aspect)return this.i;const t=s.degToRad(this.t);return s.radToDeg(2*Math.atan(Math.tan(t/2)/this.aspect))}fitVerticalFovToPoints(t){const i=new e(0,1,0).applyQuaternion(this.quaternion);let r=0;for(const s of t){const t=this.position.clone().sub(s).normalize(),e=Math.asin(Math.abs(t.dot(i)))*Math.sign(t.dot(i));Math.abs(e)>r&&(r=Math.abs(e))}const o=s.radToDeg(2*r);this.i=s.clamp(o,1,M),this.updateProjectionMatrix()}fitVerticalFovToBox(t){this.fitVerticalFovToPoints([new e(t.min.x,t.min.y,t.min.z),new e(t.min.x,t.min.y,t.max.z),new e(t.min.x,t.max.y,t.min.z),new e(t.min.x,t.max.y,t.max.z),new e(t.max.x,t.min.y,t.min.z),new e(t.max.x,t.min.y,t.max.z),new e(t.max.x,t.max.y,t.min.z),new e(t.max.x,t.max.y,t.max.z)])}fitVerticalFovToMesh(t){t.updateWorldMatrix(!0,!0),t.skeleton.update();const s=t.geometry.attributes.position,i=new e,r=[];for(let e=0;s.count>e;e++)i.fromBufferAttribute(s,e),t.applyBoneTransform(e,i),r.push(i.clone());this.fitVerticalFovToPoints(r)}lookAtMeshCenterOfMass(t){t.updateWorldMatrix(!0,!0),t.skeleton.update();const s=t.geometry.attributes.position,i=new e,r=[];for(let e=0;s.count>e;e++)i.fromBufferAttribute(s,e),t.applyBoneTransform(e,i),r.push(i.clone());const o=((t,s=3)=>{if(0===t.length)return new e;let i=t[Math.floor(t.length/2)].clone();for(let r=0;s>r;r++){let s=new e,r=0;for(const e of t)(e.distanceTo(i)<e.distanceTo(s)||0===r)&&(s.add(e),r++);r>0&&(i=s.divideScalar(r))}return i})(r);this.lookAt(o)}clone(){const t=new w(this.t,this.i,this.aspect,this.near,this.far);return t.copy(this,!0),t}}class v{static getObjectByName(t,s){if(t.name===s)return t;for(const e of t.children){const t=v.getObjectByName(e,s);if(t)return t}}static getMaterialByName(t,s){if(t instanceof i)if(Array.isArray(t.material)){for(const e of t.material)if(e.name===s)return e}else if(t.material.name===s)return t.material;for(const e of t.children){const t=v.getMaterialByName(e,s);if(t)return t}}static enumerateObjectsByType(t,s,e){t instanceof s&&e(t);for(const i of t.children)v.enumerateObjectsByType(i,s,e)}static enumerateMaterialsByType(t,s,e){if(t instanceof i)if(Array.isArray(t.material))for(const i of t.material)i instanceof s&&e(i);else t.material instanceof s&&e(t.material);for(const i of t.children)v.enumerateMaterialsByType(i,s,e)}static enumerateObjects(t,s){s(t);for(const e of t.children)v.enumerateObjects(e,s)}static enumerateMaterials(t,s){if(t instanceof i)if(Array.isArray(t.material))for(let e=0;t.material.length>e;e++)t.material[e]=s(t.material[e],t)??t.material[e];else t.material=s(t.material,t)??t.material;for(const e of t.children)v.enumerateMaterials(e,s)}static filterObjects(t,s){let e=[];"function"==typeof s?s(t)&&e.push(t):t.name&&s.test(t.name)&&e.push(t);for(const i of t.children)e=e.concat(v.filterObjects(i,s));return e}static filterMaterials(t,s){let e=[];if(t instanceof i)if(Array.isArray(t.material))for(const i of t.material)"function"==typeof s?s(i)&&e.push(i):s.test(i.name)&&e.push(i);else"function"==typeof s?s(t.material)&&e.push(t.material):s.test(t.material.name)&&e.push(t.material);for(const i of t.children)e=e.concat(v.filterMaterials(i,s));return e}static findMaterialUsers(t,s){let e=[];if(t instanceof i){let i=!1;if(Array.isArray(t.material)){for(const e of t.material)if(s.includes(e)){i=!0;break}}else s.includes(t.material)&&(i=!0);i&&e.push(t)}for(const i of t.children)e=e.concat(v.findMaterialUsers(i,s));return e}static cloneMaterialByName(t,s){const e=v.getMaterialByName(t,s);if(!e)return;const i=e.clone();return v.replaceMaterial(t,e,i),i}static replaceMaterial(t,s,e){t instanceof i&&(Array.isArray(t.material)?t.material=t.material.map(t=>t===s?e:t):t.material===s&&(t.material=e));for(const i of t.children)v.replaceMaterial(i,s,e)}}class y{static bakePose(t){const s=t.geometry.clone(),o=s.attributes.position,n=new Float32Array(3*o.count),a=new e;for(let s=0;o.count>s;s++)a.fromBufferAttribute(o,s),t.applyBoneTransform(s,a),n[3*s+0]=a.x,n[3*s+1]=a.y,n[3*s+2]=a.z;s.setAttribute("position",new r(n,3)),s.computeVertexNormals(),s.deleteAttribute("skinIndex"),s.deleteAttribute("skinWeight");const c=new i(s,t.material);return c.name=t.name,c}static bakeAnimationFrame(t,s,e,i){const r=new o(t);return r.clipAction(i).play(),r.setTime(e),t.updateWorldMatrix(!0,!0),s.skeleton.update(),this.bakePose(s)}}class m{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,combineEmissive:!0,brightnessFactor:1.3,...s},i=new n;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){if(s.color=t.color.clone(),s.color.multiplyScalar(e.brightnessFactor),t.metalness>0&&s.color.multiplyScalar(1+.3*t.metalness),e.combineEmissive){const e=t.emissive.clone().multiplyScalar(.5*t.emissiveIntensity);s.color.add(e)}s.color.r=Math.min(s.color.r,1),s.color.g=Math.min(s.color.g,1),s.color.b=Math.min(s.color.b,1)}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.alphaMap&&(s.alphaMap=t.alphaMap),t.envMap&&(s.envMap=t.envMap,s.reflectivity=t.metalness),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.metalnessMap&&(s.specularMap=t.metalnessMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class g{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,roughnessColorFactor:.8,...s},i=new a;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,s.flatShading=t.flatShading,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){s.color=t.color.clone(),t.metalness>0&&s.color.multiplyScalar(1-.3*t.metalness),t.roughness>.5&&s.color.multiplyScalar(e.roughnessColorFactor+.2*t.roughness),s.emissive=t.emissive.clone(),s.emissiveIntensity=t.emissiveIntensity}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.emissiveMap&&(s.emissiveMap=t.emissiveMap),t.normalMap&&(s.normalMap=t.normalMap,s.normalScale=t.normalScale.clone()),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.envMap&&(s.envMap=t.envMap,s.reflectivity=Math.min(t.metalness+.1,1)),t.alphaMap&&(s.alphaMap=t.alphaMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class F{static convert(t,s={}){const e={preserveName:!0,copyUserData:!0,disposeOriginal:!1,maxShininess:100,specularIntensity:.5,...s},i=new c;return this.copyBasicProperties(t,i,e),this.convertColorProperties(t,i,e),this.convertTextureMaps(t,i),this.convertTransparencyProperties(t,i),e.disposeOriginal&&t.dispose(),i.needsUpdate=!0,i}static copyBasicProperties(t,s,e){e.preserveName&&(s.name=t.name),s.side=t.side,s.visible=t.visible,s.fog=t.fog,s.wireframe=t.wireframe,s.wireframeLinewidth=t.wireframeLinewidth,s.vertexColors=t.vertexColors,s.flatShading=t.flatShading,e.copyUserData&&(s.userData={...t.userData})}static convertColorProperties(t,s,e){if(s.color=t.color.clone(),t.metalness>0&&s.color.multiplyScalar(1-.3*t.metalness),s.shininess=(1-t.roughness)*e.maxShininess,t.metalness>0)s.specular=t.color.clone().multiplyScalar(t.metalness*e.specularIntensity);else{const i=e.specularIntensity*(1-t.roughness);s.specular=new h(i,i,i)}s.emissive=t.emissive.clone(),s.emissiveIntensity=t.emissiveIntensity}static convertTextureMaps(t,s){t.map&&(s.map=t.map),t.emissiveMap&&(s.emissiveMap=t.emissiveMap),t.normalMap&&(s.normalMap=t.normalMap,s.normalScale=t.normalScale.clone()),t.bumpMap&&(s.bumpMap=t.bumpMap,s.bumpScale=t.bumpScale),t.displacementMap&&(s.displacementMap=t.displacementMap,s.displacementScale=t.displacementScale,s.displacementBias=t.displacementBias),t.lightMap&&(s.lightMap=t.lightMap,s.lightMapIntensity=t.lightMapIntensity),t.aoMap&&(s.aoMap=t.aoMap,s.aoMapIntensity=t.aoMapIntensity),t.envMap&&(s.envMap=t.envMap,s.reflectivity=Math.min(t.metalness+.1,1)),t.alphaMap&&(s.alphaMap=t.alphaMap),t.metalnessMap&&(s.specularMap=t.metalnessMap),this.copyUVTransforms(t,s)}static copyUVTransforms(t,s){t.map&&s.map&&(s.map.offset.copy(t.map.offset),s.map.repeat.copy(t.map.repeat),s.map.rotation=t.map.rotation,s.map.center.copy(t.map.center))}static convertTransparencyProperties(t,s){s.transparent=t.transparent,s.opacity=t.opacity,s.alphaTest=t.alphaTest,s.depthTest=t.depthTest,s.depthWrite=t.depthWrite,s.blending=t.blending}}class T extends f{constructor(){super(...arguments),this.o=new e,this.h=new e,this.l=new e,this.u=new e,this.p=new e,this.M=new e,this.v=new e,this.m=new e,this.F=new l,this.T=new u}get distance(){return this.position.length()}get elevation(){return this.T.setFromVector3(this.position).phi}get azimuth(){return this.T.setFromVector3(this.position).theta}set distance(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(t,this.T.phi,this.T.theta)}set elevation(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(this.T.radius,t,this.T.theta)}set azimuth(t){this.T.setFromVector3(this.position),this.position.setFromSphericalCoords(this.T.radius,this.T.phi,t)}configureShadowsForBoundingBox(t){const s=this.shadow.camera;this.target.updateWorldMatrix(!0,!1),this.lookAt(this.target.getWorldPosition(this.o)),this.updateWorldMatrix(!0,!1);const e=[this.o.set(t.min.x,t.min.y,t.min.z),this.h.set(t.min.x,t.min.y,t.max.z),this.l.set(t.min.x,t.max.y,t.min.z),this.u.set(t.min.x,t.max.y,t.max.z),this.p.set(t.max.x,t.min.y,t.min.z),this.M.set(t.max.x,t.min.y,t.max.z),this.v.set(t.max.x,t.max.y,t.min.z),this.m.set(t.max.x,t.max.y,t.max.z)],i=this.matrixWorld.clone().invert();for(const t of e)t.applyMatrix4(i);const r=this.F.setFromPoints(e);s.left=r.min.x,s.bottom=r.min.y,s.near=-r.max.z,s.right=r.max.x,s.top=r.max.y,s.far=-r.min.z,s.updateWorldMatrix(!0,!1),s.updateProjectionMatrix()}setDirectionFromHDRTexture(t,s=1){const e=t.image.data,i=t.image.width,r=t.image.height;let o=0,n=0;const a=t.format===p?4:3;for(let t=0;e.length>t;t+=a){const s=.2126*e[t]+.7152*e[t+1]+.0722*e[t+2];s>o&&(o=s,n=t)}const c=n/a,h=c%i;this.position.setFromSphericalCoords(s,Math.floor(c/i)/r*Math.PI,h/i*-Math.PI*2-Math.PI/2)}}export{w as DualFovCamera,v as SceneTraversal,y as SkinnedMeshBaker,m as StandardToBasicConverter,g as StandardToLambertConverter,F as StandardToPhongConverter,T as Sun};
2
2
  //# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../src/DualFovCamera.ts","../src/SceneTraversal.ts","../src/SkinnedMeshBaker.ts","../src/StandardToBasicConverter.ts","../src/StandardToLambertConverter.ts","../src/StandardToPhongConverter.ts","../src/Sun.ts"],"sourcesContent":["import type { Box3, BufferAttribute, SkinnedMesh } from \"three\";\nimport { MathUtils, PerspectiveCamera, Vector3 } from \"three\";\n\n/** Default horizontal field of view in degrees */\nconst DEFAULT_HORIZONTAL_FOV = 90;\n/** Default vertical field of view in degrees */\nconst DEFAULT_VERTICAL_FOV = 90;\n/** Default aspect ratio (width/height) */\nconst DEFAULT_ASPECT = 1;\n/** Default near clipping plane distance */\nconst DEFAULT_NEAR = 1;\n/** Default far clipping plane distance */\nconst DEFAULT_FAR = 1000;\n\n/** Minimum allowed field of view in degrees */\nconst MIN_FOV = 1;\n/** Maximum allowed field of view in degrees */\nconst MAX_FOV = 179;\n\n/**\n * Camera with independent horizontal and vertical FOV settings.\n */\nexport class DualFovCamera extends PerspectiveCamera {\n /** Internal storage for horizontal field of view in degrees */\n private horizontalFovInternal: number;\n /** Internal storage for vertical field of view in degrees */\n private verticalFovInternal: number;\n\n /**\n * @param horizontalFov - Horizontal FOV in degrees (clamped 1-179°)\n * @param verticalFov - Vertical FOV in degrees (clamped 1-179°)\n * @param aspect - Aspect ratio (width/height)\n * @param near - Near clipping plane distance\n * @param far - Far clipping plane distance\n */\n constructor(\n horizontalFov = DEFAULT_HORIZONTAL_FOV,\n verticalFov = DEFAULT_VERTICAL_FOV,\n aspect = DEFAULT_ASPECT,\n near = DEFAULT_NEAR,\n far = DEFAULT_FAR,\n ) {\n super(verticalFov, aspect, near, far);\n this.horizontalFovInternal = horizontalFov;\n this.verticalFovInternal = verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * @returns Horizontal FOV in degrees\n */\n public get horizontalFov(): number {\n return this.horizontalFovInternal;\n }\n\n /**\n * @returns Vertical FOV in degrees\n */\n public get verticalFov(): number {\n return this.verticalFovInternal;\n }\n\n /**\n * @param value - Horizontal FOV in degrees (clamped 1-179°)\n */\n public set horizontalFov(value: number) {\n this.horizontalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * @param value - Vertical FOV in degrees (clamped 1-179°)\n */\n public set verticalFov(value: number) {\n this.verticalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Sets both FOV values.\n *\n * @param horizontal - Horizontal FOV in degrees (clamped 1-179°)\n * @param vertical - Vertical FOV in degrees (clamped 1-179°)\n */\n public setFov(horizontal: number, vertical: number): void {\n this.horizontalFovInternal = MathUtils.clamp(horizontal, MIN_FOV, MAX_FOV);\n this.verticalFovInternal = MathUtils.clamp(vertical, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Copies FOV settings from another DualFovCamera.\n *\n * @param source - Source camera to copy from\n */\n public copyFovSettings(source: DualFovCamera): void {\n this.horizontalFovInternal = source.horizontalFov;\n this.verticalFovInternal = source.verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * Updates projection matrix based on FOV and aspect ratio.\n *\n * Landscape (aspect > 1): preserves horizontal FOV.\n * Portrait (aspect ≤ 1): preserves vertical FOV.\n *\n * @override\n */\n public override updateProjectionMatrix(): void {\n if (this.aspect > 1) {\n // Landscape orientation: preserve horizontal FOV\n const radians = MathUtils.degToRad(this.horizontalFovInternal);\n this.fov = MathUtils.radToDeg(\n Math.atan(Math.tan(radians / 2) / this.aspect) * 2,\n );\n } else {\n // Portrait orientation: preserve vertical FOV\n this.fov = this.verticalFovInternal;\n }\n\n super.updateProjectionMatrix();\n }\n\n /**\n * Gets actual horizontal FOV after aspect ratio adjustments.\n *\n * @returns Horizontal FOV in degrees\n */\n public getActualHorizontalFov(): number {\n if (this.aspect >= 1) {\n return this.horizontalFovInternal;\n }\n const verticalRadians = MathUtils.degToRad(this.verticalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(verticalRadians / 2) * this.aspect) * 2,\n );\n }\n\n /**\n * Gets actual vertical FOV after aspect ratio adjustments.\n *\n * @returns Vertical FOV in degrees\n */\n public getActualVerticalFov(): number {\n if (this.aspect < 1) {\n return this.verticalFovInternal;\n }\n const horizontalRadians = MathUtils.degToRad(this.horizontalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(horizontalRadians / 2) / this.aspect) * 2,\n );\n }\n\n /**\n * Adjusts vertical FOV to fit points within camera view.\n *\n * @param vertices - Array of 3D points in world coordinates\n */\n public fitVerticalFovToPoints(vertices: Vector3[]): void {\n const up = new Vector3(0, 1, 0).applyQuaternion(this.quaternion);\n\n let maxVerticalAngle = 0;\n\n for (const vertex of vertices) {\n const vertexToCam = this.position.clone().sub(vertex);\n const vertexDirection = vertexToCam.normalize();\n\n const verticalAngle =\n Math.asin(Math.abs(vertexDirection.dot(up))) *\n Math.sign(vertexDirection.dot(up));\n\n if (Math.abs(verticalAngle) > maxVerticalAngle) {\n maxVerticalAngle = Math.abs(verticalAngle);\n }\n }\n\n const requiredFov = MathUtils.radToDeg(2 * maxVerticalAngle);\n\n this.verticalFovInternal = MathUtils.clamp(requiredFov, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Adjusts vertical FOV to fit bounding box within camera view.\n *\n * @param box - 3D bounding box in world coordinates\n */\n public fitVerticalFovToBox(box: Box3): void {\n this.fitVerticalFovToPoints([\n new Vector3(box.min.x, box.min.y, box.min.z),\n new Vector3(box.min.x, box.min.y, box.max.z),\n new Vector3(box.min.x, box.max.y, box.min.z),\n new Vector3(box.min.x, box.max.y, box.max.z),\n new Vector3(box.max.x, box.min.y, box.min.z),\n new Vector3(box.max.x, box.min.y, box.max.z),\n new Vector3(box.max.x, box.max.y, box.min.z),\n new Vector3(box.max.x, box.max.y, box.max.z),\n ]);\n }\n\n /**\n * Adjusts vertical FOV to fit skinned mesh within camera view.\n * Updates skeleton and applies bone transformations.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public fitVerticalFovToMesh(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const target = new Vector3();\n\n const points = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n this.fitVerticalFovToPoints(points);\n }\n\n /**\n * Points camera to look at skinned mesh center of mass.\n * Uses iterative clustering to find main vertex concentration.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public lookAtMeshCenterOfMass(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes.position as BufferAttribute;\n const target = new Vector3();\n const points: Vector3[] = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n /**\n * Finds main cluster center using iterative refinement.\n *\n * @param points - Array of 3D points to cluster\n * @param iterations - Number of refinement iterations\n * @returns Center point of main cluster\n */\n const findMainCluster = (points: Vector3[], iterations = 3): Vector3 => {\n if (points.length === 0) {\n return new Vector3();\n }\n\n let center = points[Math.floor(points.length / 2)].clone();\n\n for (let i = 0; i < iterations; i++) {\n let total = new Vector3();\n let count = 0;\n\n for (const point of points) {\n if (\n point.distanceTo(center) < point.distanceTo(total) ||\n count === 0\n ) {\n total.add(point);\n count++;\n }\n }\n\n if (count > 0) {\n center = total.divideScalar(count);\n }\n }\n\n return center;\n };\n\n const centerOfMass = findMainCluster(points);\n this.lookAt(centerOfMass);\n }\n\n /**\n * Creates a copy of this camera with identical settings.\n *\n * @returns New DualFovCamera instance\n * @override\n */\n public override clone(): this {\n const camera = new DualFovCamera(\n this.horizontalFovInternal,\n this.verticalFovInternal,\n this.aspect,\n this.near,\n this.far,\n ) as this;\n\n camera.copy(this, true);\n return camera;\n }\n}\n","import type { Material, Object3D } from \"three\";\nimport { Mesh } from \"three\";\n\n/**\n * Constructor type for runtime type checking.\n *\n * @template T - The type that the constructor creates\n */\nexport type Constructor<T> = abstract new (...args: never[]) => T;\n\n/**\n * Static methods for traversing Three.js scene hierarchies.\n *\n * All methods use depth-first traversal.\n */\nexport class SceneTraversal {\n /**\n * Finds first object with exact name match.\n *\n * @param object - Root object to start from\n * @param name - Name to search for (case-sensitive)\n * @returns First matching object or undefined\n */\n public static getObjectByName(\n object: Object3D,\n name: string,\n ): Object3D | undefined {\n if (object.name === name) {\n return object;\n }\n\n for (const child of object.children) {\n const result = SceneTraversal.getObjectByName(child, name);\n if (result) {\n return result;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds first material with exact name match from mesh objects.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns First matching material or undefined\n */\n public static getMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material.name === name) {\n return material;\n }\n }\n } else if (object.material.name === name) {\n return object.material;\n }\n }\n\n for (const child of object.children) {\n const material = SceneTraversal.getMaterialByName(child, name);\n if (material) {\n return material;\n }\n }\n\n return undefined;\n }\n\n /**\n * Executes callback for all objects of specified type.\n *\n * @template T - Type of objects to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching object\n */\n public static enumerateObjectsByType<T extends Object3D>(\n object: Object3D,\n type: Constructor<T>,\n callback: (instance: T) => void,\n ): void {\n if (object instanceof type) {\n callback(object);\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjectsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all materials of specified type from mesh objects.\n *\n * @template T - Type of materials to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching material\n */\n public static enumerateMaterialsByType<T extends Material>(\n object: Object3D,\n type: Constructor<T>,\n callback: (material: T) => void,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material instanceof type) {\n callback(material);\n }\n }\n } else if (object.material instanceof type) {\n callback(object.material);\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterialsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all objects in hierarchy.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each object\n */\n public static enumerateObjects(\n object: Object3D,\n callback: (object: Object3D) => void,\n ): void {\n callback(object);\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjects(child, callback);\n }\n }\n\n /**\n * Executes callback for all materials from mesh objects.\n * If callback returns a material, replaces the original material.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each material. Return a material to replace.\n */\n public static enumerateMaterials(\n object: Object3D,\n callback: (material: Material) => Material | undefined,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (let i = 0; i < object.material.length; i++) {\n object.material[i] =\n callback(object.material[i]) ?? object.material[i];\n }\n } else {\n object.material = callback(object.material) ?? object.material;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterials(child, callback);\n }\n }\n\n /**\n * Returns all objects matching filter criteria.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for object names or predicate function\n * @returns Array of matching objects\n */\n public static filterObjects(\n object: Object3D,\n filter: RegExp | ((object: Object3D) => boolean),\n ): Object3D[] {\n let result: Object3D[] = [];\n\n if (typeof filter === \"function\") {\n if (filter(object)) {\n result.push(object);\n }\n } else {\n if (object.name && filter.test(object.name)) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterObjects(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all materials matching filter criteria from mesh objects.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for material names or predicate function\n * @returns Array of matching materials\n */\n public static filterMaterials(\n object: Object3D,\n filter: RegExp | ((object: Material) => boolean),\n ): Material[] {\n let result: Material[] = [];\n\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (typeof filter === \"function\") {\n if (filter(material)) {\n result.push(material);\n }\n } else if (filter.test(material.name)) {\n result.push(material);\n }\n }\n } else if (typeof filter === \"function\") {\n if (filter(object.material)) {\n result.push(object.material);\n }\n } else if (filter.test(object.material.name)) {\n result.push(object.material);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterMaterials(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all mesh objects that use any of the specified materials.\n *\n * @param object - Root object to start from\n * @param materials - Array of materials to search for\n * @returns Array of mesh objects using the materials\n */\n public static findMaterialUsers(\n object: Object3D,\n materials: Material[],\n ): Mesh[] {\n let result: Mesh[] = [];\n\n if (object instanceof Mesh) {\n let hasMatchingMaterial = false;\n\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (materials.includes(material)) {\n hasMatchingMaterial = true;\n break;\n }\n }\n } else {\n if (materials.includes(object.material)) {\n hasMatchingMaterial = true;\n }\n }\n\n if (hasMatchingMaterial) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(\n SceneTraversal.findMaterialUsers(child, materials),\n );\n }\n\n return result;\n }\n\n /**\n * Clones material by name and replaces all instances with the clone.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns Cloned material or undefined if not found\n */\n public static cloneMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n const originalMaterial = SceneTraversal.getMaterialByName(object, name);\n\n if (!originalMaterial) {\n return undefined;\n }\n\n const clonedMaterial = originalMaterial.clone();\n\n SceneTraversal.replaceMaterial(object, originalMaterial, clonedMaterial);\n\n return clonedMaterial;\n }\n\n /**\n * Replaces all instances of a material with another material.\n *\n * @param object - Root object to start from\n * @param oldMaterial - Material to replace\n * @param newMaterial - Material to use as replacement\n */\n private static replaceMaterial(\n object: Object3D,\n oldMaterial: Material,\n newMaterial: Material,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n object.material = object.material.map((material) =>\n material === oldMaterial ? newMaterial : material,\n );\n } else if (object.material === oldMaterial) {\n object.material = newMaterial;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.replaceMaterial(child, oldMaterial, newMaterial);\n }\n }\n}\n","import type { AnimationClip, Object3D, SkinnedMesh } from \"three\";\nimport { AnimationMixer, BufferAttribute, Mesh, Vector3 } from \"three\";\n\n/** Number of components per vertex */\nconst COMPONENT_COUNT = 3;\n\n/** Converts skinned meshes to static meshes. */\nexport class SkinnedMeshBaker {\n /**\n * Converts skinned mesh to static mesh in current pose.\n *\n * @param skinnedMesh - Mesh to convert\n * @returns Static mesh with baked positions\n */\n public static bakePose(skinnedMesh: SkinnedMesh): Mesh {\n const bakedGeometry = skinnedMesh.geometry.clone();\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const newPositions = new Float32Array(position.count * COMPONENT_COUNT);\n const target = new Vector3();\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n newPositions[i * COMPONENT_COUNT + 0] = target.x;\n newPositions[i * COMPONENT_COUNT + 1] = target.y;\n newPositions[i * COMPONENT_COUNT + 2] = target.z;\n }\n\n bakedGeometry.setAttribute(\n \"position\",\n new BufferAttribute(newPositions, COMPONENT_COUNT),\n );\n bakedGeometry.computeVertexNormals();\n bakedGeometry.deleteAttribute(\"skinIndex\");\n bakedGeometry.deleteAttribute(\"skinWeight\");\n\n const mesh = new Mesh(bakedGeometry, skinnedMesh.material);\n mesh.name = skinnedMesh.name;\n return mesh;\n }\n\n /**\n * Bakes animation frame to static mesh.\n *\n * @param armature - Root object with bones\n * @param skinnedMesh - Mesh to convert\n * @param timeOffset - Time in seconds within animation\n * @param clip - Animation clip for pose\n * @returns Static mesh with baked positions\n */\n public static bakeAnimationFrame(\n armature: Object3D,\n skinnedMesh: SkinnedMesh,\n timeOffset: number,\n clip: AnimationClip,\n ): Mesh {\n const mixer = new AnimationMixer(armature);\n const action = mixer.clipAction(clip);\n action.play();\n mixer.setTime(timeOffset);\n\n armature.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n return this.bakePose(skinnedMesh);\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshBasicMaterial } from \"three\";\n\n/** Factor for metalness brightness adjustment */\nconst METALNESS_BRIGHTNESS_FACTOR = 0.3;\n/** Factor for emissive color contribution when combining with base color */\nconst EMISSIVE_CONTRIBUTION_FACTOR = 0.5;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToBasicConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Apply emissive color to base color for brightness compensation.\n * @defaultValue true\n */\n combineEmissive: boolean;\n /**\n * Brightness adjustment factor to compensate for loss of lighting.\n * @defaultValue 1.3\n */\n brightnessFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshBasicMaterial with brightness compensation.\n */\nexport class StandardToBasicConverter {\n /**\n * Converts MeshStandardMaterial to MeshBasicMaterial.\n *\n * @param standardMaterial - Source material to convert\n * @param options - Conversion options\n * @returns New MeshBasicMaterial with mapped properties\n */\n public static convert(\n standardMaterial: MeshStandardMaterial,\n options: Partial<StandardToBasicConverterOptions> = {},\n ): MeshBasicMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n combineEmissive: true,\n brightnessFactor: 1.3,\n ...options,\n };\n\n // Create new Basic material\n const basicMaterial = new MeshBasicMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(standardMaterial, basicMaterial, config);\n\n // Handle color properties with lighting compensation\n this.convertColorProperties(standardMaterial, basicMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(standardMaterial, basicMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(standardMaterial, basicMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n standardMaterial.dispose();\n }\n\n basicMaterial.needsUpdate = true;\n return basicMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with lighting compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n // Base color conversion with brightness compensation\n target.color = source.color.clone();\n\n // Apply brightness compensation since BasicMaterial doesn't respond to lighting\n target.color.multiplyScalar(config.brightnessFactor);\n\n // Adjust for metalness - metallic materials tend to be darker without lighting\n if (source.metalness > 0) {\n const metalnessBrightness =\n 1 + source.metalness * METALNESS_BRIGHTNESS_FACTOR;\n target.color.multiplyScalar(metalnessBrightness);\n }\n\n // Combine emissive color if requested\n if (config.combineEmissive) {\n const emissiveContribution = source.emissive\n .clone()\n .multiplyScalar(\n source.emissiveIntensity * EMISSIVE_CONTRIBUTION_FACTOR,\n );\n target.color.add(emissiveContribution);\n }\n\n // Ensure color doesn't exceed valid range\n target.color.r = Math.min(target.color.r, 1.0);\n target.color.g = Math.min(target.color.g, 1.0);\n target.color.b = Math.min(target.color.b, 1.0);\n }\n\n /**\n * Converts texture properties from Standard to Basic material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main diffuse/albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Environment map (BasicMaterial supports this for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n // Use metalness to determine reflectivity\n target.reflectivity = source.metalness;\n }\n\n // Light map (BasicMaterial supports this)\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map (BasicMaterial supports this)\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Specular map (BasicMaterial supports this)\n if (source.metalnessMap) {\n // Use metalness map as specular map for some reflective effect\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n\nexport default StandardToBasicConverter;\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshLambertMaterial } from \"three\";\n\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Roughness threshold for additional darkening */\nconst ROUGHNESS_THRESHOLD = 0.5;\n/** Factor for roughness color adjustment */\nconst ROUGHNESS_COLOR_ADJUSTMENT = 0.2;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToLambertConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Color adjustment factor for roughness compensation.\n * @defaultValue 0.8\n */\n roughnessColorFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshLambertMaterial with PBR compensation.\n */\nexport class StandardToLambertConverter {\n /**\n * Converts MeshStandardMaterial to MeshLambertMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshLambertMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToLambertConverterOptions> = {},\n ): MeshLambertMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n roughnessColorFactor: 0.8,\n ...options,\n };\n\n // Create new Lambert material\n const lambertMaterial = new MeshLambertMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, lambertMaterial, config);\n\n // Handle color properties with roughness compensation\n this.convertColorProperties(material, lambertMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, lambertMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, lambertMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n lambertMaterial.needsUpdate = true;\n return lambertMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness and roughness for better visual match\n if (source.metalness > 0) {\n // Metallic materials tend to be darker in Lambert shading\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n if (source.roughness > ROUGHNESS_THRESHOLD) {\n // Rough materials appear slightly darker\n const roughnessFactor =\n config.roughnessColorFactor +\n source.roughness * ROUGHNESS_COLOR_ADJUSTMENT;\n target.color.multiplyScalar(roughnessFactor);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Lambert material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map (Lambert materials support normal mapping)\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map (for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { Color, MeshPhongMaterial } from \"three\";\n\n/** Maximum shininess value for Phong material */\nconst MAX_SHININESS = 100;\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToPhongConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Maximum shininess value when roughness is 0.\n * @defaultValue 100\n */\n maxShininess: number;\n /**\n * Specular intensity multiplier.\n * @defaultValue 0.5\n */\n specularIntensity: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshPhongMaterial with PBR compensation.\n */\nexport class StandardToPhongConverter {\n /**\n * Converts MeshStandardMaterial to MeshPhongMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshPhongMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToPhongConverterOptions> = {},\n ): MeshPhongMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n maxShininess: MAX_SHININESS,\n specularIntensity: 0.5,\n ...options,\n };\n\n // Create new Phong material\n const phongMaterial = new MeshPhongMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, phongMaterial, config);\n\n // Handle color properties with PBR compensation\n this.convertColorProperties(material, phongMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, phongMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, phongMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n phongMaterial.needsUpdate = true;\n return phongMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness\n if (source.metalness > 0) {\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n // Convert roughness to shininess (inverse relationship)\n // Roughness 0 = max shininess, Roughness 1 = shininess 0\n target.shininess = (1 - source.roughness) * config.maxShininess;\n\n // Calculate specular color from metalness and base color\n if (source.metalness > 0) {\n // Metallic materials have tinted specular\n target.specular = source.color\n .clone()\n .multiplyScalar(source.metalness * config.specularIntensity);\n } else {\n // Non-metallic materials have white/gray specular\n const specularValue = config.specularIntensity * (1 - source.roughness);\n target.specular = new Color(specularValue, specularValue, specularValue);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Phong material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Bump map\n if (source.bumpMap) {\n target.bumpMap = source.bumpMap;\n target.bumpScale = source.bumpScale;\n }\n\n // Displacement map\n if (source.displacementMap) {\n target.displacementMap = source.displacementMap;\n target.displacementScale = source.displacementScale;\n target.displacementBias = source.displacementBias;\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Use metalness map as specular map\n if (source.metalnessMap) {\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { Texture } from \"three\";\nimport { Box3, DirectionalLight, RGBAFormat, Spherical, Vector3 } from \"three\";\n\n/** Number of color channels in RGBA format */\nconst RGBA_CHANNEL_COUNT = 4;\n/** Number of color channels in RGB format */\nconst RGB_CHANNEL_COUNT = 3;\n\n/** Red channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_R = 0.2126;\n/** Green channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_G = 0.7152;\n/** Blue channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_B = 0.0722;\n\n/**\n * Directional light with spherical positioning and HDR environment support.\n */\nexport class Sun extends DirectionalLight {\n /** Internal vectors to avoid garbage collection during calculations */\n private readonly tempVector3D0 = new Vector3();\n private readonly tempVector3D1 = new Vector3();\n private readonly tempVector3D2 = new Vector3();\n private readonly tempVector3D3 = new Vector3();\n private readonly tempVector3D4 = new Vector3();\n private readonly tempVector3D5 = new Vector3();\n private readonly tempVector3D6 = new Vector3();\n private readonly tempVector3D7 = new Vector3();\n private readonly tempBox3 = new Box3();\n private readonly tempSpherical = new Spherical();\n\n /**\n * @returns Distance from light position to origin\n */\n public get distance(): number {\n return this.position.length();\n }\n\n /**\n * @returns Elevation angle in radians (phi angle)\n */\n public get elevation(): number {\n return this.tempSpherical.setFromVector3(this.position).phi;\n }\n\n /**\n * @returns Azimuth angle in radians (theta angle)\n */\n public get azimuth(): number {\n return this.tempSpherical.setFromVector3(this.position).theta;\n }\n\n /**\n * @param value - New distance in world units\n */\n public set distance(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n value,\n this.tempSpherical.phi,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New elevation angle in radians (phi angle)\n */\n public set elevation(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n value,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New azimuth angle in radians (theta angle)\n */\n public set azimuth(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n this.tempSpherical.phi,\n value,\n );\n }\n\n /**\n * Configures shadow camera frustum to cover bounding box.\n *\n * @param box3 - 3D bounding box to cover with shadows\n */\n public configureShadowsForBoundingBox(box3: Box3): void {\n const camera = this.shadow.camera;\n\n this.target.updateWorldMatrix(true, false);\n this.lookAt(this.target.getWorldPosition(this.tempVector3D0));\n\n this.updateWorldMatrix(true, false);\n\n const points: Vector3[] = [\n this.tempVector3D0.set(box3.min.x, box3.min.y, box3.min.z),\n this.tempVector3D1.set(box3.min.x, box3.min.y, box3.max.z),\n this.tempVector3D2.set(box3.min.x, box3.max.y, box3.min.z),\n this.tempVector3D3.set(box3.min.x, box3.max.y, box3.max.z),\n this.tempVector3D4.set(box3.max.x, box3.min.y, box3.min.z),\n this.tempVector3D5.set(box3.max.x, box3.min.y, box3.max.z),\n this.tempVector3D6.set(box3.max.x, box3.max.y, box3.min.z),\n this.tempVector3D7.set(box3.max.x, box3.max.y, box3.max.z),\n ];\n\n const inverseMatrix = this.matrixWorld.clone().invert();\n\n for (const point of points) {\n point.applyMatrix4(inverseMatrix);\n }\n\n const newBox3 = this.tempBox3.setFromPoints(points);\n\n camera.left = newBox3.min.x;\n camera.bottom = newBox3.min.y;\n camera.near = -newBox3.max.z;\n\n camera.right = newBox3.max.x;\n camera.top = newBox3.max.y;\n camera.far = -newBox3.min.z;\n\n camera.updateWorldMatrix(true, false);\n camera.updateProjectionMatrix();\n }\n\n /**\n * Sets sun direction based on brightest point in HDR environment map.\n *\n * @param texture - HDR texture to analyze (must have image data)\n * @param distance - Distance to place sun from origin\n */\n public setDirectionFromHDRTexture(texture: Texture, distance = 1): void {\n const data = texture.image.data;\n const width = texture.image.width;\n const height = texture.image.height;\n\n let maxLuminance = 0;\n let maxIndex = 0;\n\n // Find brightest pixel\n\n const step =\n texture.format === RGBAFormat ? RGBA_CHANNEL_COUNT : RGB_CHANNEL_COUNT;\n for (let i = 0; i < data.length; i += step) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const luminance = LUMINANCE_R * r + LUMINANCE_G * g + LUMINANCE_B * b;\n if (luminance > maxLuminance) {\n maxLuminance = luminance;\n maxIndex = i;\n }\n }\n\n // Convert to spherical coordinates\n const pixelIndex = maxIndex / step;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n\n const u = x / width;\n const v = y / height;\n\n const elevation = v * Math.PI;\n const azimuth = u * -Math.PI * 2 - Math.PI / 2;\n\n this.position.setFromSphericalCoords(distance, elevation, azimuth);\n }\n}\n"],"names":["MAX_FOV","DualFovCamera","PerspectiveCamera","constructor","horizontalFov","verticalFov","aspect","near","far","super","this","_private_horizontalFovInternal","_private_verticalFovInternal","updateProjectionMatrix","value","MathUtils","clamp","setFov","horizontal","vertical","copyFovSettings","source","radians","degToRad","fov","radToDeg","Math","atan","tan","getActualHorizontalFov","verticalRadians","getActualVerticalFov","horizontalRadians","fitVerticalFovToPoints","vertices","up","Vector3","applyQuaternion","quaternion","maxVerticalAngle","vertex","vertexDirection","position","clone","sub","normalize","verticalAngle","asin","abs","dot","sign","requiredFov","fitVerticalFovToBox","box","min","x","y","z","max","fitVerticalFovToMesh","skinnedMesh","updateWorldMatrix","skeleton","update","geometry","attributes","target","points","i","count","fromBufferAttribute","applyBoneTransform","push","lookAtMeshCenterOfMass","centerOfMass","iterations","length","center","floor","total","point","distanceTo","add","divideScalar","findMainCluster","lookAt","camera","copy","SceneTraversal","getObjectByName","object","name","child","children","result","getMaterialByName","Mesh","Array","isArray","material","enumerateObjectsByType","type","callback","enumerateMaterialsByType","enumerateObjects","enumerateMaterials","filterObjects","filter","test","concat","filterMaterials","findMaterialUsers","materials","hasMatchingMaterial","includes","cloneMaterialByName","originalMaterial","clonedMaterial","replaceMaterial","oldMaterial","newMaterial","map","SkinnedMeshBaker","bakePose","bakedGeometry","newPositions","Float32Array","setAttribute","BufferAttribute","computeVertexNormals","deleteAttribute","mesh","bakeAnimationFrame","armature","timeOffset","clip","mixer","AnimationMixer","clipAction","play","setTime","StandardToBasicConverter","convert","standardMaterial","options","config","preserveName","copyUserData","disposeOriginal","combineEmissive","brightnessFactor","basicMaterial","MeshBasicMaterial","copyBasicProperties","convertColorProperties","convertTextureMaps","convertTransparencyProperties","dispose","needsUpdate","side","visible","fog","wireframe","wireframeLinewidth","vertexColors","userData","color","multiplyScalar","metalness","emissiveContribution","emissive","emissiveIntensity","r","g","b","alphaMap","envMap","reflectivity","lightMap","lightMapIntensity","aoMap","aoMapIntensity","metalnessMap","specularMap","copyUVTransforms","offset","repeat","rotation","transparent","opacity","alphaTest","depthTest","depthWrite","blending","StandardToLambertConverter","roughnessColorFactor","lambertMaterial","MeshLambertMaterial","flatShading","roughness","emissiveMap","normalMap","normalScale","StandardToPhongConverter","maxShininess","specularIntensity","phongMaterial","MeshPhongMaterial","shininess","specular","specularValue","Color","bumpMap","bumpScale","displacementMap","displacementScale","displacementBias","Sun","DirectionalLight","Box3","Spherical","distance","elevation","_private_tempSpherical","setFromVector3","phi","azimuth","theta","setFromSphericalCoords","radius","configureShadowsForBoundingBox","box3","shadow","getWorldPosition","_private_tempVector3D0","set","_private_tempVector3D1","_private_tempVector3D2","_private_tempVector3D3","_private_tempVector3D4","_private_tempVector3D5","_private_tempVector3D6","_private_tempVector3D7","inverseMatrix","matrixWorld","invert","applyMatrix4","newBox3","_private_tempBox3","setFromPoints","left","bottom","right","top","setDirectionFromHDRTexture","texture","data","image","width","height","maxLuminance","maxIndex","step","format","RGBAFormat","luminance","pixelIndex","PI"],"mappings":"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"}
1
+ {"version":3,"file":"index.min.js","sources":["../src/DualFovCamera.ts","../src/SceneTraversal.ts","../src/SkinnedMeshBaker.ts","../src/StandardToBasicConverter.ts","../src/StandardToLambertConverter.ts","../src/StandardToPhongConverter.ts","../src/Sun.ts"],"sourcesContent":["import type { Box3, BufferAttribute, SkinnedMesh } from \"three\";\nimport { MathUtils, PerspectiveCamera, Vector3 } from \"three\";\n\n/** Default horizontal field of view in degrees */\nconst DEFAULT_HORIZONTAL_FOV = 90;\n/** Default vertical field of view in degrees */\nconst DEFAULT_VERTICAL_FOV = 90;\n/** Default aspect ratio (width/height) */\nconst DEFAULT_ASPECT = 1;\n/** Default near clipping plane distance */\nconst DEFAULT_NEAR = 1;\n/** Default far clipping plane distance */\nconst DEFAULT_FAR = 1000;\n\n/** Minimum allowed field of view in degrees */\nconst MIN_FOV = 1;\n/** Maximum allowed field of view in degrees */\nconst MAX_FOV = 179;\n\n/**\n * Camera with independent horizontal and vertical FOV settings.\n */\nexport class DualFovCamera extends PerspectiveCamera {\n /** Internal storage for horizontal field of view in degrees */\n private horizontalFovInternal: number;\n /** Internal storage for vertical field of view in degrees */\n private verticalFovInternal: number;\n\n /**\n * @param horizontalFov - Horizontal FOV in degrees (clamped 1-179°)\n * @param verticalFov - Vertical FOV in degrees (clamped 1-179°)\n * @param aspect - Aspect ratio (width/height)\n * @param near - Near clipping plane distance\n * @param far - Far clipping plane distance\n */\n constructor(\n horizontalFov = DEFAULT_HORIZONTAL_FOV,\n verticalFov = DEFAULT_VERTICAL_FOV,\n aspect = DEFAULT_ASPECT,\n near = DEFAULT_NEAR,\n far = DEFAULT_FAR,\n ) {\n super(verticalFov, aspect, near, far);\n this.horizontalFovInternal = horizontalFov;\n this.verticalFovInternal = verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * @returns Horizontal FOV in degrees\n */\n public get horizontalFov(): number {\n return this.horizontalFovInternal;\n }\n\n /**\n * @returns Vertical FOV in degrees\n */\n public get verticalFov(): number {\n return this.verticalFovInternal;\n }\n\n /**\n * @param value - Horizontal FOV in degrees (clamped 1-179°)\n */\n public set horizontalFov(value: number) {\n this.horizontalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * @param value - Vertical FOV in degrees (clamped 1-179°)\n */\n public set verticalFov(value: number) {\n this.verticalFovInternal = MathUtils.clamp(value, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Sets both FOV values.\n *\n * @param horizontal - Horizontal FOV in degrees (clamped 1-179°)\n * @param vertical - Vertical FOV in degrees (clamped 1-179°)\n */\n public setFov(horizontal: number, vertical: number): void {\n this.horizontalFovInternal = MathUtils.clamp(horizontal, MIN_FOV, MAX_FOV);\n this.verticalFovInternal = MathUtils.clamp(vertical, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Copies FOV settings from another DualFovCamera.\n *\n * @param source - Source camera to copy from\n */\n public copyFovSettings(source: DualFovCamera): void {\n this.horizontalFovInternal = source.horizontalFov;\n this.verticalFovInternal = source.verticalFov;\n this.updateProjectionMatrix();\n }\n\n /**\n * Updates projection matrix based on FOV and aspect ratio.\n *\n * Landscape (aspect > 1): preserves horizontal FOV.\n * Portrait (aspect ≤ 1): preserves vertical FOV.\n *\n * @override\n */\n public override updateProjectionMatrix(): void {\n if (this.aspect > 1) {\n // Landscape orientation: preserve horizontal FOV\n const radians = MathUtils.degToRad(this.horizontalFovInternal);\n this.fov = MathUtils.radToDeg(\n Math.atan(Math.tan(radians / 2) / this.aspect) * 2,\n );\n } else {\n // Portrait orientation: preserve vertical FOV\n this.fov = this.verticalFovInternal;\n }\n\n super.updateProjectionMatrix();\n }\n\n /**\n * Gets actual horizontal FOV after aspect ratio adjustments.\n *\n * @returns Horizontal FOV in degrees\n */\n public getActualHorizontalFov(): number {\n if (this.aspect >= 1) {\n return this.horizontalFovInternal;\n }\n const verticalRadians = MathUtils.degToRad(this.verticalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(verticalRadians / 2) * this.aspect) * 2,\n );\n }\n\n /**\n * Gets actual vertical FOV after aspect ratio adjustments.\n *\n * @returns Vertical FOV in degrees\n */\n public getActualVerticalFov(): number {\n if (this.aspect < 1) {\n return this.verticalFovInternal;\n }\n const horizontalRadians = MathUtils.degToRad(this.horizontalFovInternal);\n return MathUtils.radToDeg(\n Math.atan(Math.tan(horizontalRadians / 2) / this.aspect) * 2,\n );\n }\n\n /**\n * Adjusts vertical FOV to fit points within camera view.\n *\n * @param vertices - Array of 3D points in world coordinates\n */\n public fitVerticalFovToPoints(vertices: Vector3[]): void {\n const up = new Vector3(0, 1, 0).applyQuaternion(this.quaternion);\n\n let maxVerticalAngle = 0;\n\n for (const vertex of vertices) {\n const vertexToCam = this.position.clone().sub(vertex);\n const vertexDirection = vertexToCam.normalize();\n\n const verticalAngle =\n Math.asin(Math.abs(vertexDirection.dot(up))) *\n Math.sign(vertexDirection.dot(up));\n\n if (Math.abs(verticalAngle) > maxVerticalAngle) {\n maxVerticalAngle = Math.abs(verticalAngle);\n }\n }\n\n const requiredFov = MathUtils.radToDeg(2 * maxVerticalAngle);\n\n this.verticalFovInternal = MathUtils.clamp(requiredFov, MIN_FOV, MAX_FOV);\n this.updateProjectionMatrix();\n }\n\n /**\n * Adjusts vertical FOV to fit bounding box within camera view.\n *\n * @param box - 3D bounding box in world coordinates\n */\n public fitVerticalFovToBox(box: Box3): void {\n this.fitVerticalFovToPoints([\n new Vector3(box.min.x, box.min.y, box.min.z),\n new Vector3(box.min.x, box.min.y, box.max.z),\n new Vector3(box.min.x, box.max.y, box.min.z),\n new Vector3(box.min.x, box.max.y, box.max.z),\n new Vector3(box.max.x, box.min.y, box.min.z),\n new Vector3(box.max.x, box.min.y, box.max.z),\n new Vector3(box.max.x, box.max.y, box.min.z),\n new Vector3(box.max.x, box.max.y, box.max.z),\n ]);\n }\n\n /**\n * Adjusts vertical FOV to fit skinned mesh within camera view.\n * Updates skeleton and applies bone transformations.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public fitVerticalFovToMesh(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const target = new Vector3();\n\n const points = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n this.fitVerticalFovToPoints(points);\n }\n\n /**\n * Points camera to look at skinned mesh center of mass.\n * Uses iterative clustering to find main vertex concentration.\n *\n * @param skinnedMesh - Skinned mesh with active skeleton\n */\n public lookAtMeshCenterOfMass(skinnedMesh: SkinnedMesh): void {\n skinnedMesh.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n const bakedGeometry = skinnedMesh.geometry;\n const position = bakedGeometry.attributes.position as BufferAttribute;\n const target = new Vector3();\n const points: Vector3[] = [];\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n points.push(target.clone());\n }\n\n /**\n * Finds main cluster center using iterative refinement.\n *\n * @param points - Array of 3D points to cluster\n * @param iterations - Number of refinement iterations\n * @returns Center point of main cluster\n */\n const findMainCluster = (points: Vector3[], iterations = 3): Vector3 => {\n if (points.length === 0) {\n return new Vector3();\n }\n\n let center = points[Math.floor(points.length / 2)].clone();\n\n for (let i = 0; i < iterations; i++) {\n let total = new Vector3();\n let count = 0;\n\n for (const point of points) {\n if (\n point.distanceTo(center) < point.distanceTo(total) ||\n count === 0\n ) {\n total.add(point);\n count++;\n }\n }\n\n if (count > 0) {\n center = total.divideScalar(count);\n }\n }\n\n return center;\n };\n\n const centerOfMass = findMainCluster(points);\n this.lookAt(centerOfMass);\n }\n\n /**\n * Creates a copy of this camera with identical settings.\n *\n * @returns New DualFovCamera instance\n * @override\n */\n public override clone(): this {\n const camera = new DualFovCamera(\n this.horizontalFovInternal,\n this.verticalFovInternal,\n this.aspect,\n this.near,\n this.far,\n ) as this;\n\n camera.copy(this, true);\n return camera;\n }\n}\n","import type { Material, Object3D } from \"three\";\nimport { Mesh } from \"three\";\n\n/**\n * Constructor type for runtime type checking.\n *\n * @template T - The type that the constructor creates\n */\nexport type Constructor<T> = abstract new (...args: never[]) => T;\n\n/**\n * Static methods for traversing Three.js scene hierarchies.\n *\n * All methods use depth-first traversal.\n */\nexport class SceneTraversal {\n /**\n * Finds first object with exact name match.\n *\n * @param object - Root object to start from\n * @param name - Name to search for (case-sensitive)\n * @returns First matching object or undefined\n */\n public static getObjectByName(\n object: Object3D,\n name: string,\n ): Object3D | undefined {\n if (object.name === name) {\n return object;\n }\n\n for (const child of object.children) {\n const result = SceneTraversal.getObjectByName(child, name);\n if (result) {\n return result;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds first material with exact name match from mesh objects.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns First matching material or undefined\n */\n public static getMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material.name === name) {\n return material;\n }\n }\n } else if (object.material.name === name) {\n return object.material;\n }\n }\n\n for (const child of object.children) {\n const material = SceneTraversal.getMaterialByName(child, name);\n if (material) {\n return material;\n }\n }\n\n return undefined;\n }\n\n /**\n * Executes callback for all objects of specified type.\n *\n * @template T - Type of objects to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching object\n */\n public static enumerateObjectsByType<T extends Object3D>(\n object: Object3D,\n type: Constructor<T>,\n callback: (instance: T) => void,\n ): void {\n if (object instanceof type) {\n callback(object);\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjectsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all materials of specified type from mesh objects.\n *\n * @template T - Type of materials to process\n * @param object - Root object to start from\n * @param type - Constructor to filter by\n * @param callback - Function to execute for each matching material\n */\n public static enumerateMaterialsByType<T extends Material>(\n object: Object3D,\n type: Constructor<T>,\n callback: (material: T) => void,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (material instanceof type) {\n callback(material);\n }\n }\n } else if (object.material instanceof type) {\n callback(object.material);\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterialsByType(child, type, callback);\n }\n }\n\n /**\n * Executes callback for all objects in hierarchy.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each object\n */\n public static enumerateObjects(\n object: Object3D,\n callback: (object: Object3D) => void,\n ): void {\n callback(object);\n\n for (const child of object.children) {\n SceneTraversal.enumerateObjects(child, callback);\n }\n }\n\n /**\n * Executes callback for all materials from mesh objects.\n * If callback returns a material, replaces the original material.\n *\n * @param object - Root object to start from\n * @param callback - Function to execute for each material. Return a material to replace.\n */\n public static enumerateMaterials(\n object: Object3D,\n callback: (material: Material, mesh: Mesh) => Material | undefined,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (let i = 0; i < object.material.length; i++) {\n object.material[i] =\n callback(object.material[i], object) ?? object.material[i];\n }\n } else {\n object.material = callback(object.material, object) ?? object.material;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.enumerateMaterials(child, callback);\n }\n }\n\n /**\n * Returns all objects matching filter criteria.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for object names or predicate function\n * @returns Array of matching objects\n */\n public static filterObjects(\n object: Object3D,\n filter: RegExp | ((object: Object3D) => boolean),\n ): Object3D[] {\n let result: Object3D[] = [];\n\n if (typeof filter === \"function\") {\n if (filter(object)) {\n result.push(object);\n }\n } else {\n if (object.name && filter.test(object.name)) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterObjects(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all materials matching filter criteria from mesh objects.\n *\n * @param object - Root object to start from\n * @param filter - RegExp for material names or predicate function\n * @returns Array of matching materials\n */\n public static filterMaterials(\n object: Object3D,\n filter: RegExp | ((object: Material) => boolean),\n ): Material[] {\n let result: Material[] = [];\n\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (typeof filter === \"function\") {\n if (filter(material)) {\n result.push(material);\n }\n } else if (filter.test(material.name)) {\n result.push(material);\n }\n }\n } else if (typeof filter === \"function\") {\n if (filter(object.material)) {\n result.push(object.material);\n }\n } else if (filter.test(object.material.name)) {\n result.push(object.material);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(SceneTraversal.filterMaterials(child, filter));\n }\n\n return result;\n }\n\n /**\n * Returns all mesh objects that use any of the specified materials.\n *\n * @param object - Root object to start from\n * @param materials - Array of materials to search for\n * @returns Array of mesh objects using the materials\n */\n public static findMaterialUsers(\n object: Object3D,\n materials: Material[],\n ): Mesh[] {\n let result: Mesh[] = [];\n\n if (object instanceof Mesh) {\n let hasMatchingMaterial = false;\n\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n if (materials.includes(material)) {\n hasMatchingMaterial = true;\n break;\n }\n }\n } else {\n if (materials.includes(object.material)) {\n hasMatchingMaterial = true;\n }\n }\n\n if (hasMatchingMaterial) {\n result.push(object);\n }\n }\n\n for (const child of object.children) {\n result = result.concat(\n SceneTraversal.findMaterialUsers(child, materials),\n );\n }\n\n return result;\n }\n\n /**\n * Clones material by name and replaces all instances with the clone.\n *\n * @param object - Root object to start from\n * @param name - Material name to search for (case-sensitive)\n * @returns Cloned material or undefined if not found\n */\n public static cloneMaterialByName(\n object: Object3D,\n name: string,\n ): Material | undefined {\n const originalMaterial = SceneTraversal.getMaterialByName(object, name);\n\n if (!originalMaterial) {\n return undefined;\n }\n\n const clonedMaterial = originalMaterial.clone();\n\n SceneTraversal.replaceMaterial(object, originalMaterial, clonedMaterial);\n\n return clonedMaterial;\n }\n\n /**\n * Replaces all instances of a material with another material.\n *\n * @param object - Root object to start from\n * @param oldMaterial - Material to replace\n * @param newMaterial - Material to use as replacement\n */\n private static replaceMaterial(\n object: Object3D,\n oldMaterial: Material,\n newMaterial: Material,\n ): void {\n if (object instanceof Mesh) {\n if (Array.isArray(object.material)) {\n object.material = object.material.map((material) =>\n material === oldMaterial ? newMaterial : material,\n );\n } else if (object.material === oldMaterial) {\n object.material = newMaterial;\n }\n }\n\n for (const child of object.children) {\n SceneTraversal.replaceMaterial(child, oldMaterial, newMaterial);\n }\n }\n}\n","import type { AnimationClip, Object3D, SkinnedMesh } from \"three\";\nimport { AnimationMixer, BufferAttribute, Mesh, Vector3 } from \"three\";\n\n/** Number of components per vertex */\nconst COMPONENT_COUNT = 3;\n\n/** Converts skinned meshes to static meshes. */\nexport class SkinnedMeshBaker {\n /**\n * Converts skinned mesh to static mesh in current pose.\n *\n * @param skinnedMesh - Mesh to convert\n * @returns Static mesh with baked positions\n */\n public static bakePose(skinnedMesh: SkinnedMesh): Mesh {\n const bakedGeometry = skinnedMesh.geometry.clone();\n const position = bakedGeometry.attributes[\"position\"] as BufferAttribute;\n const newPositions = new Float32Array(position.count * COMPONENT_COUNT);\n const target = new Vector3();\n\n for (let i = 0; i < position.count; i++) {\n target.fromBufferAttribute(position, i);\n skinnedMesh.applyBoneTransform(i, target);\n newPositions[i * COMPONENT_COUNT + 0] = target.x;\n newPositions[i * COMPONENT_COUNT + 1] = target.y;\n newPositions[i * COMPONENT_COUNT + 2] = target.z;\n }\n\n bakedGeometry.setAttribute(\n \"position\",\n new BufferAttribute(newPositions, COMPONENT_COUNT),\n );\n bakedGeometry.computeVertexNormals();\n bakedGeometry.deleteAttribute(\"skinIndex\");\n bakedGeometry.deleteAttribute(\"skinWeight\");\n\n const mesh = new Mesh(bakedGeometry, skinnedMesh.material);\n mesh.name = skinnedMesh.name;\n return mesh;\n }\n\n /**\n * Bakes animation frame to static mesh.\n *\n * @param armature - Root object with bones\n * @param skinnedMesh - Mesh to convert\n * @param timeOffset - Time in seconds within animation\n * @param clip - Animation clip for pose\n * @returns Static mesh with baked positions\n */\n public static bakeAnimationFrame(\n armature: Object3D,\n skinnedMesh: SkinnedMesh,\n timeOffset: number,\n clip: AnimationClip,\n ): Mesh {\n const mixer = new AnimationMixer(armature);\n const action = mixer.clipAction(clip);\n action.play();\n mixer.setTime(timeOffset);\n\n armature.updateWorldMatrix(true, true);\n skinnedMesh.skeleton.update();\n\n return this.bakePose(skinnedMesh);\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshBasicMaterial } from \"three\";\n\n/** Factor for metalness brightness adjustment */\nconst METALNESS_BRIGHTNESS_FACTOR = 0.3;\n/** Factor for emissive color contribution when combining with base color */\nconst EMISSIVE_CONTRIBUTION_FACTOR = 0.5;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToBasicConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Apply emissive color to base color for brightness compensation.\n * @defaultValue true\n */\n combineEmissive: boolean;\n /**\n * Brightness adjustment factor to compensate for loss of lighting.\n * @defaultValue 1.3\n */\n brightnessFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshBasicMaterial with brightness compensation.\n */\nexport class StandardToBasicConverter {\n /**\n * Converts MeshStandardMaterial to MeshBasicMaterial.\n *\n * @param standardMaterial - Source material to convert\n * @param options - Conversion options\n * @returns New MeshBasicMaterial with mapped properties\n */\n public static convert(\n standardMaterial: MeshStandardMaterial,\n options: Partial<StandardToBasicConverterOptions> = {},\n ): MeshBasicMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n combineEmissive: true,\n brightnessFactor: 1.3,\n ...options,\n };\n\n // Create new Basic material\n const basicMaterial = new MeshBasicMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(standardMaterial, basicMaterial, config);\n\n // Handle color properties with lighting compensation\n this.convertColorProperties(standardMaterial, basicMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(standardMaterial, basicMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(standardMaterial, basicMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n standardMaterial.dispose();\n }\n\n basicMaterial.needsUpdate = true;\n return basicMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with lighting compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n config: Required<StandardToBasicConverterOptions>,\n ): void {\n // Base color conversion with brightness compensation\n target.color = source.color.clone();\n\n // Apply brightness compensation since BasicMaterial doesn't respond to lighting\n target.color.multiplyScalar(config.brightnessFactor);\n\n // Adjust for metalness - metallic materials tend to be darker without lighting\n if (source.metalness > 0) {\n const metalnessBrightness =\n 1 + source.metalness * METALNESS_BRIGHTNESS_FACTOR;\n target.color.multiplyScalar(metalnessBrightness);\n }\n\n // Combine emissive color if requested\n if (config.combineEmissive) {\n const emissiveContribution = source.emissive\n .clone()\n .multiplyScalar(\n source.emissiveIntensity * EMISSIVE_CONTRIBUTION_FACTOR,\n );\n target.color.add(emissiveContribution);\n }\n\n // Ensure color doesn't exceed valid range\n target.color.r = Math.min(target.color.r, 1.0);\n target.color.g = Math.min(target.color.g, 1.0);\n target.color.b = Math.min(target.color.b, 1.0);\n }\n\n /**\n * Converts texture properties from Standard to Basic material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main diffuse/albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Environment map (BasicMaterial supports this for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n // Use metalness to determine reflectivity\n target.reflectivity = source.metalness;\n }\n\n // Light map (BasicMaterial supports this)\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map (BasicMaterial supports this)\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Specular map (BasicMaterial supports this)\n if (source.metalnessMap) {\n // Use metalness map as specular map for some reflective effect\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshBasicMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n\nexport default StandardToBasicConverter;\n","import type { MeshStandardMaterial } from \"three\";\nimport { MeshLambertMaterial } from \"three\";\n\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Roughness threshold for additional darkening */\nconst ROUGHNESS_THRESHOLD = 0.5;\n/** Factor for roughness color adjustment */\nconst ROUGHNESS_COLOR_ADJUSTMENT = 0.2;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToLambertConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Color adjustment factor for roughness compensation.\n * @defaultValue 0.8\n */\n roughnessColorFactor: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshLambertMaterial with PBR compensation.\n */\nexport class StandardToLambertConverter {\n /**\n * Converts MeshStandardMaterial to MeshLambertMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshLambertMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToLambertConverterOptions> = {},\n ): MeshLambertMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n roughnessColorFactor: 0.8,\n ...options,\n };\n\n // Create new Lambert material\n const lambertMaterial = new MeshLambertMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, lambertMaterial, config);\n\n // Handle color properties with roughness compensation\n this.convertColorProperties(material, lambertMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, lambertMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, lambertMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n lambertMaterial.needsUpdate = true;\n return lambertMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n config: Required<StandardToLambertConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness and roughness for better visual match\n if (source.metalness > 0) {\n // Metallic materials tend to be darker in Lambert shading\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n if (source.roughness > ROUGHNESS_THRESHOLD) {\n // Rough materials appear slightly darker\n const roughnessFactor =\n config.roughnessColorFactor +\n source.roughness * ROUGHNESS_COLOR_ADJUSTMENT;\n target.color.multiplyScalar(roughnessFactor);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Lambert material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map (Lambert materials support normal mapping)\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map (for reflections)\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshLambertMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { MeshStandardMaterial } from \"three\";\nimport { Color, MeshPhongMaterial } from \"three\";\n\n/** Maximum shininess value for Phong material */\nconst MAX_SHININESS = 100;\n/** Factor for metalness darkness adjustment */\nconst METALNESS_DARKNESS_FACTOR = 0.3;\n/** Minimum reflectivity boost for environment maps */\nconst REFLECTIVITY_BOOST = 0.1;\n\n/**\n * Configuration options for material conversion.\n */\nexport interface StandardToPhongConverterOptions {\n /**\n * Preserve original material name.\n * @defaultValue true\n */\n preserveName: boolean;\n /**\n * Copy user data from original material.\n * @defaultValue true\n */\n copyUserData: boolean;\n /**\n * Dispose original material after conversion.\n * @defaultValue false\n */\n disposeOriginal: boolean;\n /**\n * Maximum shininess value when roughness is 0.\n * @defaultValue 100\n */\n maxShininess: number;\n /**\n * Specular intensity multiplier.\n * @defaultValue 0.5\n */\n specularIntensity: number;\n}\n\n/**\n * Converts MeshStandardMaterial to MeshPhongMaterial with PBR compensation.\n */\nexport class StandardToPhongConverter {\n /**\n * Converts MeshStandardMaterial to MeshPhongMaterial.\n *\n * @param material - Source material to convert\n * @param options - Conversion options\n * @returns New MeshPhongMaterial with mapped properties\n */\n public static convert(\n material: MeshStandardMaterial,\n options: Partial<StandardToPhongConverterOptions> = {},\n ): MeshPhongMaterial {\n const config = {\n preserveName: true,\n copyUserData: true,\n disposeOriginal: false,\n maxShininess: MAX_SHININESS,\n specularIntensity: 0.5,\n ...options,\n };\n\n // Create new Phong material\n const phongMaterial = new MeshPhongMaterial();\n\n // Copy basic material properties\n this.copyBasicProperties(material, phongMaterial, config);\n\n // Handle color properties with PBR compensation\n this.convertColorProperties(material, phongMaterial, config);\n\n // Handle texture maps\n this.convertTextureMaps(material, phongMaterial);\n\n // Handle transparency and alpha\n this.convertTransparencyProperties(material, phongMaterial);\n\n // Cleanup if requested\n if (config.disposeOriginal) {\n material.dispose();\n }\n\n phongMaterial.needsUpdate = true;\n return phongMaterial;\n }\n\n /**\n * Copies basic material properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static copyBasicProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n if (config.preserveName) {\n target.name = source.name;\n }\n\n target.side = source.side;\n target.visible = source.visible;\n target.fog = source.fog;\n target.wireframe = source.wireframe;\n target.wireframeLinewidth = source.wireframeLinewidth;\n target.vertexColors = source.vertexColors;\n target.flatShading = source.flatShading;\n\n if (config.copyUserData) {\n target.userData = { ...source.userData };\n }\n }\n\n /**\n * Converts color properties with PBR compensation.\n *\n * @param source - Source material\n * @param target - Target material\n * @param config - Configuration options\n * @internal\n */\n private static convertColorProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n config: Required<StandardToPhongConverterOptions>,\n ): void {\n target.color = source.color.clone();\n\n // Adjust color based on metalness\n if (source.metalness > 0) {\n const metalnessFactor = 1 - source.metalness * METALNESS_DARKNESS_FACTOR;\n target.color.multiplyScalar(metalnessFactor);\n }\n\n // Convert roughness to shininess (inverse relationship)\n // Roughness 0 = max shininess, Roughness 1 = shininess 0\n target.shininess = (1 - source.roughness) * config.maxShininess;\n\n // Calculate specular color from metalness and base color\n if (source.metalness > 0) {\n // Metallic materials have tinted specular\n target.specular = source.color\n .clone()\n .multiplyScalar(source.metalness * config.specularIntensity);\n } else {\n // Non-metallic materials have white/gray specular\n const specularValue = config.specularIntensity * (1 - source.roughness);\n target.specular = new Color(specularValue, specularValue, specularValue);\n }\n\n target.emissive = source.emissive.clone();\n target.emissiveIntensity = source.emissiveIntensity;\n }\n\n /**\n * Converts texture properties from Standard to Phong material.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTextureMaps(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Diffuse/Albedo map\n if (source.map) {\n target.map = source.map;\n }\n\n // Emissive map\n if (source.emissiveMap) {\n target.emissiveMap = source.emissiveMap;\n }\n\n // Normal map\n if (source.normalMap) {\n target.normalMap = source.normalMap;\n target.normalScale = source.normalScale.clone();\n }\n\n // Bump map\n if (source.bumpMap) {\n target.bumpMap = source.bumpMap;\n target.bumpScale = source.bumpScale;\n }\n\n // Displacement map\n if (source.displacementMap) {\n target.displacementMap = source.displacementMap;\n target.displacementScale = source.displacementScale;\n target.displacementBias = source.displacementBias;\n }\n\n // Light map\n if (source.lightMap) {\n target.lightMap = source.lightMap;\n target.lightMapIntensity = source.lightMapIntensity;\n }\n\n // AO map\n if (source.aoMap) {\n target.aoMap = source.aoMap;\n target.aoMapIntensity = source.aoMapIntensity;\n }\n\n // Environment map\n if (source.envMap) {\n target.envMap = source.envMap;\n target.reflectivity = Math.min(\n source.metalness + REFLECTIVITY_BOOST,\n 1.0,\n );\n }\n\n // Alpha map\n if (source.alphaMap) {\n target.alphaMap = source.alphaMap;\n }\n\n // Use metalness map as specular map\n if (source.metalnessMap) {\n target.specularMap = source.metalnessMap;\n }\n\n // Copy UV transforms\n this.copyUVTransforms(source, target);\n }\n\n /**\n * Copies UV transformation properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static copyUVTransforms(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n // Main texture UV transform\n if (source.map && target.map) {\n target.map.offset.copy(source.map.offset);\n target.map.repeat.copy(source.map.repeat);\n target.map.rotation = source.map.rotation;\n target.map.center.copy(source.map.center);\n }\n }\n\n /**\n * Converts transparency and rendering properties.\n *\n * @param source - Source material\n * @param target - Target material\n * @internal\n */\n private static convertTransparencyProperties(\n source: MeshStandardMaterial,\n target: MeshPhongMaterial,\n ): void {\n target.transparent = source.transparent;\n target.opacity = source.opacity;\n target.alphaTest = source.alphaTest;\n target.depthTest = source.depthTest;\n target.depthWrite = source.depthWrite;\n target.blending = source.blending;\n }\n}\n","import type { Texture } from \"three\";\nimport { Box3, DirectionalLight, RGBAFormat, Spherical, Vector3 } from \"three\";\n\n/** Number of color channels in RGBA format */\nconst RGBA_CHANNEL_COUNT = 4;\n/** Number of color channels in RGB format */\nconst RGB_CHANNEL_COUNT = 3;\n\n/** Red channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_R = 0.2126;\n/** Green channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_G = 0.7152;\n/** Blue channel weight for luminance calculation (ITU-R BT.709) */\nconst LUMINANCE_B = 0.0722;\n\n/**\n * Directional light with spherical positioning and HDR environment support.\n */\nexport class Sun extends DirectionalLight {\n /** Internal vectors to avoid garbage collection during calculations */\n private readonly tempVector3D0 = new Vector3();\n private readonly tempVector3D1 = new Vector3();\n private readonly tempVector3D2 = new Vector3();\n private readonly tempVector3D3 = new Vector3();\n private readonly tempVector3D4 = new Vector3();\n private readonly tempVector3D5 = new Vector3();\n private readonly tempVector3D6 = new Vector3();\n private readonly tempVector3D7 = new Vector3();\n private readonly tempBox3 = new Box3();\n private readonly tempSpherical = new Spherical();\n\n /**\n * @returns Distance from light position to origin\n */\n public get distance(): number {\n return this.position.length();\n }\n\n /**\n * @returns Elevation angle in radians (phi angle)\n */\n public get elevation(): number {\n return this.tempSpherical.setFromVector3(this.position).phi;\n }\n\n /**\n * @returns Azimuth angle in radians (theta angle)\n */\n public get azimuth(): number {\n return this.tempSpherical.setFromVector3(this.position).theta;\n }\n\n /**\n * @param value - New distance in world units\n */\n public set distance(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n value,\n this.tempSpherical.phi,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New elevation angle in radians (phi angle)\n */\n public set elevation(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n value,\n this.tempSpherical.theta,\n );\n }\n\n /**\n * @param value - New azimuth angle in radians (theta angle)\n */\n public set azimuth(value: number) {\n this.tempSpherical.setFromVector3(this.position);\n this.position.setFromSphericalCoords(\n this.tempSpherical.radius,\n this.tempSpherical.phi,\n value,\n );\n }\n\n /**\n * Configures shadow camera frustum to cover bounding box.\n *\n * @param box3 - 3D bounding box to cover with shadows\n */\n public configureShadowsForBoundingBox(box3: Box3): void {\n const camera = this.shadow.camera;\n\n this.target.updateWorldMatrix(true, false);\n this.lookAt(this.target.getWorldPosition(this.tempVector3D0));\n\n this.updateWorldMatrix(true, false);\n\n const points: Vector3[] = [\n this.tempVector3D0.set(box3.min.x, box3.min.y, box3.min.z),\n this.tempVector3D1.set(box3.min.x, box3.min.y, box3.max.z),\n this.tempVector3D2.set(box3.min.x, box3.max.y, box3.min.z),\n this.tempVector3D3.set(box3.min.x, box3.max.y, box3.max.z),\n this.tempVector3D4.set(box3.max.x, box3.min.y, box3.min.z),\n this.tempVector3D5.set(box3.max.x, box3.min.y, box3.max.z),\n this.tempVector3D6.set(box3.max.x, box3.max.y, box3.min.z),\n this.tempVector3D7.set(box3.max.x, box3.max.y, box3.max.z),\n ];\n\n const inverseMatrix = this.matrixWorld.clone().invert();\n\n for (const point of points) {\n point.applyMatrix4(inverseMatrix);\n }\n\n const newBox3 = this.tempBox3.setFromPoints(points);\n\n camera.left = newBox3.min.x;\n camera.bottom = newBox3.min.y;\n camera.near = -newBox3.max.z;\n\n camera.right = newBox3.max.x;\n camera.top = newBox3.max.y;\n camera.far = -newBox3.min.z;\n\n camera.updateWorldMatrix(true, false);\n camera.updateProjectionMatrix();\n }\n\n /**\n * Sets sun direction based on brightest point in HDR environment map.\n *\n * @param texture - HDR texture to analyze (must have image data)\n * @param distance - Distance to place sun from origin\n */\n public setDirectionFromHDRTexture(texture: Texture, distance = 1): void {\n const data = texture.image.data;\n const width = texture.image.width;\n const height = texture.image.height;\n\n let maxLuminance = 0;\n let maxIndex = 0;\n\n // Find brightest pixel\n\n const step =\n texture.format === RGBAFormat ? RGBA_CHANNEL_COUNT : RGB_CHANNEL_COUNT;\n for (let i = 0; i < data.length; i += step) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const luminance = LUMINANCE_R * r + LUMINANCE_G * g + LUMINANCE_B * b;\n if (luminance > maxLuminance) {\n maxLuminance = luminance;\n maxIndex = i;\n }\n }\n\n // Convert to spherical coordinates\n const pixelIndex = maxIndex / step;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n\n const u = x / width;\n const v = y / height;\n\n const elevation = v * Math.PI;\n const azimuth = u * -Math.PI * 2 - Math.PI / 2;\n\n this.position.setFromSphericalCoords(distance, elevation, azimuth);\n }\n}\n"],"names":["MAX_FOV","DualFovCamera","PerspectiveCamera","constructor","horizontalFov","verticalFov","aspect","near","far","super","this","_private_horizontalFovInternal","_private_verticalFovInternal","updateProjectionMatrix","value","MathUtils","clamp","setFov","horizontal","vertical","copyFovSettings","source","radians","degToRad","fov","radToDeg","Math","atan","tan","getActualHorizontalFov","verticalRadians","getActualVerticalFov","horizontalRadians","fitVerticalFovToPoints","vertices","up","Vector3","applyQuaternion","quaternion","maxVerticalAngle","vertex","vertexDirection","position","clone","sub","normalize","verticalAngle","asin","abs","dot","sign","requiredFov","fitVerticalFovToBox","box","min","x","y","z","max","fitVerticalFovToMesh","skinnedMesh","updateWorldMatrix","skeleton","update","geometry","attributes","target","points","i","count","fromBufferAttribute","applyBoneTransform","push","lookAtMeshCenterOfMass","centerOfMass","iterations","length","center","floor","total","point","distanceTo","add","divideScalar","findMainCluster","lookAt","camera","copy","SceneTraversal","getObjectByName","object","name","child","children","result","getMaterialByName","Mesh","Array","isArray","material","enumerateObjectsByType","type","callback","enumerateMaterialsByType","enumerateObjects","enumerateMaterials","filterObjects","filter","test","concat","filterMaterials","findMaterialUsers","materials","hasMatchingMaterial","includes","cloneMaterialByName","originalMaterial","clonedMaterial","replaceMaterial","oldMaterial","newMaterial","map","SkinnedMeshBaker","bakePose","bakedGeometry","newPositions","Float32Array","setAttribute","BufferAttribute","computeVertexNormals","deleteAttribute","mesh","bakeAnimationFrame","armature","timeOffset","clip","mixer","AnimationMixer","clipAction","play","setTime","StandardToBasicConverter","convert","standardMaterial","options","config","preserveName","copyUserData","disposeOriginal","combineEmissive","brightnessFactor","basicMaterial","MeshBasicMaterial","copyBasicProperties","convertColorProperties","convertTextureMaps","convertTransparencyProperties","dispose","needsUpdate","side","visible","fog","wireframe","wireframeLinewidth","vertexColors","userData","color","multiplyScalar","metalness","emissiveContribution","emissive","emissiveIntensity","r","g","b","alphaMap","envMap","reflectivity","lightMap","lightMapIntensity","aoMap","aoMapIntensity","metalnessMap","specularMap","copyUVTransforms","offset","repeat","rotation","transparent","opacity","alphaTest","depthTest","depthWrite","blending","StandardToLambertConverter","roughnessColorFactor","lambertMaterial","MeshLambertMaterial","flatShading","roughness","emissiveMap","normalMap","normalScale","StandardToPhongConverter","maxShininess","specularIntensity","phongMaterial","MeshPhongMaterial","shininess","specular","specularValue","Color","bumpMap","bumpScale","displacementMap","displacementScale","displacementBias","Sun","DirectionalLight","Box3","Spherical","distance","elevation","_private_tempSpherical","setFromVector3","phi","azimuth","theta","setFromSphericalCoords","radius","configureShadowsForBoundingBox","box3","shadow","getWorldPosition","_private_tempVector3D0","set","_private_tempVector3D1","_private_tempVector3D2","_private_tempVector3D3","_private_tempVector3D4","_private_tempVector3D5","_private_tempVector3D6","_private_tempVector3D7","inverseMatrix","matrixWorld","invert","applyMatrix4","newBox3","_private_tempBox3","setFromPoints","left","bottom","right","top","setDirectionFromHDRTexture","texture","data","image","width","height","maxLuminance","maxIndex","step","format","RGBAFormat","luminance","pixelIndex","PI"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-zoo",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Some reusable bits for building things with Three.js ",
5
5
  "scripts": {
6
6
  "clean": "rm -rf dist",