three-low-poly 0.9.10 → 0.9.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/constants/Direction.js","../src/constants/Falloff.js","../src/brushes/DisplacementBrush.js","../src/brushes/FlattenBrush.js","../src/brushes/NoiseBrush.js","../src/brushes/SmoothBrush.js","../src/brushes/SpikeBrush.js","../src/brushes/TwistBrush.js","../src/constants/Easing.js","../src/effects/Bubbling.js","../src/geometry/books/BookGeometry.js","../src/utils/RandomNumberUtils.js","../src/factory/BookFactory.js","../src/geometry/architecture/BifurcatedStaircaseGeometry.js","../src/geometry/architecture/DioramaGeometry.js","../src/geometry/architecture/LShapedStaircaseGeometry.js","../src/geometry/architecture/SpiralStaircaseGeometry.js","../src/geometry/architecture/StaircaseGeometry.js","../src/geometry/cemetery/CrossHeadstoneGeometry.js","../src/geometry/cemetery/ObeliskHeadstoneGeometry.js","../src/geometry/cemetery/RoundedHeadstoneGeometry.js","../src/geometry/cemetery/SquareHeadstoneGeometry.js","../src/geometry/fence/FenceColumnGeometry.js","../src/geometry/fence/WroughtIronBarGeometry.js","../src/geometry/fence/WroughtIronFenceGeometry.js","../src/geometry/furniture/BookshelfGeometry.js","../src/geometry/leafs/SimpleLeafGeometry.js","../src/utils/VertexUtils.js","../src/geometry/rocks/RockGeometry.js","../src/geometry/skeleton/BoneGeometry.js","../src/geometry/science/BeakerGeometry.js","../src/geometry/science/ErlenmeyerFlaskGeometry.js","../src/geometry/science/MortarGeometry.js","../src/geometry/science/StandGeometry.js","../src/geometry/science/TestTubeGeometry.js","../src/geometry/science/WineBottleGeometry.js","../src/geometry/terrain/HillGeometry.js","../src/utils/SphericalGeometryUtils.js","../src/geometry/terrain/MoundGeometry.js","../src/geometry/trees/TreeGeometry.js","../src/models/astronomy/Moon.js","../src/models/books/Book.js","../src/models/cemetery/CrossHeadstone.js","../src/models/cemetery/Mausoleum.js","../src/models/cemetery/ObeliskHeadstone.js","../src/models/cemetery/RoundedHeadstone.js","../src/models/cemetery/SquareHeadstone.js","../src/models/fence/FenceColumn.js","../src/models/fence/WroughtIronBar.js","../src/models/fence/WroughtIronFence.js","../src/models/furniture/Bookshelf.js","../src/models/furniture/Desk.js","../src/models/lighting/Candle.js","../src/models/lighting/Lantern.js","../src/models/rocks/MossyRocks.js","../src/models/rocks/Rock.js","../src/models/rocks/Rocks.js","../src/models/science/Beaker.js","../src/models/science/Bottle.js","../src/models/science/BunsenBurner.js","../src/models/science/ElectricPanel.js","../src/models/science/ErlenmeyerFlask.js","../src/models/science/Flask.js","../src/models/science/LeverPanel.js","../src/models/science/Microscope.js","../src/models/science/MortarAndPestle.js","../src/models/science/SpiralTube.js","../src/models/science/Stand.js","../src/models/science/TeslaCoil.js","../src/models/science/TestTube.js","../src/models/science/TestTubeRack.js","../src/models/science/WineBottle.js","../src/shapes/BurstShape.js","../src/models/shapes/Burst.js","../src/shapes/GearShape.js","../src/models/shapes/Gear.js","../src/shapes/HeartShape.js","../src/models/shapes/Heart.js","../src/shapes/StarShape.js","../src/models/shapes/Star.js","../src/models/skeleton/Bone.js","../src/models/trees/Tree.js","../src/models/terrain/Hill.js","../src/models/terrain/Mound.js","../src/shaders/addWaterDisplacement.js","../src/shaders/addNoiseDisplacement.js","../src/shaders/daySkyShader.js","../src/shaders/fadeShader.js","../src/shaders/nightSkyShader.js","../src/skybox/DaySkybox.js","../src/skybox/NightSkybox.js","../src/skybox/TwilightSkybox.js","../src/textures/checkerboard.js","../src/utils/GroupUtils.js","../src/utils/InstancedMeshUtils.js","../src/utils/MeshUtils.js","../src/utils/SceneUtils.js"],"sourcesContent":["import { Vector3 } from \"three\";\n\nexport const Direction = {\n UP: new Vector3(0, 1, 0),\n DOWN: new Vector3(0, -1, 0),\n LEFT: new Vector3(-1, 0, 0),\n RIGHT: new Vector3(1, 0, 0),\n FORWARD: new Vector3(0, 0, 1),\n BACKWARD: new Vector3(0, 0, -1),\n X: new Vector3(1, 0, 0),\n Y: new Vector3(0, 1, 0),\n Z: new Vector3(0, 0, 1),\n XY: new Vector3(1, 1, 0).normalize(),\n XZ: new Vector3(1, 0, 1).normalize(),\n YZ: new Vector3(0, 1, 1).normalize(),\n XYZ: new Vector3(1, 1, 1).normalize(),\n};\n","export const Falloff = {\n LINEAR: (distance, radius) => 1 - distance / radius,\n QUADRATIC: (distance, radius) => Math.pow(1 - distance / radius, 2),\n SQUARE_ROOT: (distance, radius) => Math.pow(1 - distance / radius, 0.5),\n LOGARITHMIC: (distance, radius) => Math.log(1 + (radius - distance)) / Math.log(1 + radius),\n SINE: (distance, radius) => Math.cos(((distance / radius) * Math.PI) / 2),\n EXPONENTIAL: (distance, radius) => Math.exp(-distance / radius),\n CUBIC: (distance, radius) => Math.pow(1 - distance / radius, 3),\n GAUSSIAN: (distance, radius) => Math.exp(-Math.pow(distance, 2) / (2 * Math.pow(radius / 3, 2))),\n INVERSE: (distance, radius) => radius / (radius + distance),\n SMOOTHSTEP: (distance, radius) => {\n const t = Math.max(0, Math.min(1, 1 - distance / radius));\n return t * t * (3 - 2 * t);\n },\n};\n","import { Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Moves vertices within a specified radius around a target position along a given direction\n */\nexport const displacementBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength;\n\n // Apply the effect (e.g., pulling the vertex upwards)\n vertex.add(direction.clone().multiplyScalar(influence));\n\n // Update the vertex position\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import {Direction} from \"../constants/Direction.js\";\nimport {Vector3} from \"three\";\nimport {Falloff} from \"../constants/Falloff.js\";\n\n/**\n * Flattens vertices to a given plane defined by a target height or normal direction.\n */\nexport const flattenBrush = (geometry, position, radius, targetHeight, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength;\n\n // Project vertex onto flatten plane\n const projectedHeight = vertex.dot(direction.normalize());\n const delta = targetHeight - projectedHeight;\n\n vertex.add(direction.clone().multiplyScalar(delta * influence));\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { MathUtils, Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Adds random noise to the vertices within the specified radius to create a more rugged or natural look.\n */\nexport const noiseBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n const falloff = falloffFn(distance, radius);\n const noiseStrength = strength * falloff;\n\n // Generate random noise in the direction specified\n const noise = direction.clone().normalize();\n vertex.x += MathUtils.randFloatSpread(noiseStrength) * noise.x;\n vertex.y += MathUtils.randFloatSpread(noiseStrength) * noise.y;\n vertex.z += MathUtils.randFloatSpread(noiseStrength) * noise.z;\n\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { Vector3 } from \"three\";\n\n/**\n * Smooths out the vertices by averaging their positions with neighboring vertices within a given radius.\n */\nexport const smoothBrush = (geometry, position, radius, strength) => {\n const positions = geometry.attributes.position;\n const tempPosition = new Vector3();\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n let averagePosition = new Vector3();\n let count = 0;\n\n // Average position of nearby vertices\n for (let j = 0; j < positions.count; j++) {\n tempPosition.fromBufferAttribute(positions, j);\n if (tempPosition.distanceTo(vertex) < radius) {\n averagePosition.add(tempPosition);\n count++;\n }\n }\n\n if (count > 0) {\n averagePosition.divideScalar(count);\n vertex.lerp(averagePosition, strength); // Blend between current and average\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n }\n positions.needsUpdate = true;\n};\n","import { Falloff } from \"../constants/Falloff.js\";\nimport { Vector3 } from \"three\";\n\n/**\n * Creates spikes or depressions centered on the target position, pushing vertices away or pulling them towards the center.\n */\nexport const spikeBrush = (geometry, position, radius, strength, inward = false, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength * (inward ? -1 : 1);\n\n // Move the vertex along the direction from the center\n const direction = vertex.clone().sub(position).normalize();\n vertex.add(direction.multiplyScalar(influence));\n\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { Quaternion, Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Applies a twisting force to the vertices, rotating them around the direction defined by the target position.\n */\nexport const twistBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n const quaternion = new Quaternion();\n\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff and rotation angle\n const falloff = falloffFn(distance, radius);\n const angle = falloff * strength;\n\n // Create quaternion for rotation around the axis\n quaternion.setFromAxisAngle(direction, angle);\n\n // Apply twist rotation\n vertex.sub(position).applyQuaternion(quaternion).add(position);\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","export const Easing = {\n LINEAR: (t) => t,\n QUADRATIC_EASE_IN: (t) => t * t,\n QUADRATIC_EASE_OUT: (t) => 1 - Math.pow(1 - t, 2),\n SQUARE_ROOT_EASING: (t) => Math.sqrt(t),\n LOGARITHMIC_EASING: (t) => Math.log(1 + t) / Math.log(2),\n SINE_EASE_IN: (t) => 1 - Math.cos((t * Math.PI) / 2),\n SINE_EASE_OUT: (t) => Math.sin((t * Math.PI) / 2),\n EXPONENTIAL_EASE_IN: (t) => Math.pow(2, 10 * (t - 1)),\n EXPONENTIAL_EASE_OUT: (t) => 1 - Math.pow(2, -10 * t),\n CUBIC_EASE_IN: (t) => t * t * t,\n CUBIC_EASE_OUT: (t) => 1 - Math.pow(1 - t, 3),\n GAUSSIAN_EASING: (t) => Math.exp(-Math.pow(t - 0.5, 2) / (2 * 0.1)),\n INVERSE_EASING: (t) => 1 / (1 + t),\n SMOOTHSTEP_EASING: (t) => t * t * (3 - 2 * t),\n};\n","import {Group, Mesh, MeshStandardMaterial, SphereGeometry} from \"three\";\n\nclass Bubbling extends Group {\n constructor() {\n super();\n\n // Bubble properties\n const bubbles = [];\n const bubbleCount = 20; // Number of bubbles\n\n // Create bubble geometry and material\n const bubbleGeometry = new SphereGeometry(0.1, 6, 6); // Small spheres\n const bubbleMaterial = new MeshStandardMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.6,\n roughness: 0.3,\n metalness: 0.3,\n });\n\n for (let i = 0; i < bubbleCount; i++) {\n const bubble = new Mesh(bubbleGeometry, bubbleMaterial);\n bubble.position.set(\n (Math.random() - 0.5) * 1.5, // Random x position within flask\n Math.random() * 3, // Random y position within flask height\n (Math.random() - 0.5) * 1.5, // Random z position within flask\n );\n bubbles.push(bubble);\n this.add(bubble);\n }\n\n // Bubble animation loop\n function animateBubbles() {\n bubbles.forEach((bubble) => {\n bubble.position.y += 0.02; // Move bubble upwards\n\n // Reset bubble to bottom if it reaches top\n if (bubble.position.y > 3) {\n bubble.position.y = 0;\n bubble.position.x = (Math.random() - 0.5) * 1.5; // Randomize x position again\n bubble.position.z = (Math.random() - 0.5) * 1.5; // Randomize z position again\n }\n });\n }\n\n // Add animateBubbles to the main render loop\n function animate() {\n requestAnimationFrame(animate);\n animateBubbles(); // Update bubble positions\n }\n\n animate();\n }\n}\n\nexport { Bubbling };\n","import { BoxGeometry, BufferAttribute, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class BookGeometry extends BufferGeometry {\n constructor(width = 1, height = 1.5, depth = 0.5, coverThickness = 0.05, pageIndent = 0.05) {\n super();\n\n const w = width;\n const h = height;\n const d = depth;\n const t = coverThickness;\n const i = pageIndent;\n\n const vertices = [\n // Front cover\n 0, 0, 0,\n w, 0, 0,\n w, h, 0,\n 0, h, 0,\n\n // Back cover\n w, 0, -d,\n 0, 0, -d,\n 0, h, -d,\n w, h, -d,\n\n // Spine\n 0, 0, -d,\n 0, 0, 0,\n 0, h, 0,\n 0, h, -d,\n\n // Inside front cover\n w, 0, -t,\n t, 0, -t,\n t, h, -t,\n w, h, -t,\n\n // Inside back cover\n t, 0, -d + t,\n w, 0, -d + t,\n w, h, -d + t,\n t, h, -d + t,\n\n // Inside spine\n t, 0, -t,\n t, 0, -d + t,\n t, h, -d + t,\n t, h, -t,\n\n // Front cover top\n 0, h, 0,\n w, h, 0,\n w, h, -t,\n t, h, -t,\n\n // Back cover top\n 0, h, -d,\n t, h, -d + t,\n w, h, -d + t,\n w, h, -d,\n\n // Spine cover top\n 0, h, 0,\n t, h, -t,\n t, h, -d + t,\n 0, h, -d,\n\n // Front cover bottom\n 0, 0, 0,\n t, 0, -t,\n w, 0, -t,\n w, 0, 0,\n\n // Back cover bottom\n 0, 0, -d,\n w, 0, -d,\n w, 0, -d + t,\n t, 0, -d + t,\n\n // Spine cover bottom\n 0, 0, 0,\n 0, 0, -d,\n t, 0, -d + t,\n t, 0, -t,\n\n // Front cover edge\n w, 0, 0,\n w, 0, -t,\n w, h, -t,\n w, h, 0,\n\n // Back cover edge\n w, 0, -d,\n w, h, -d,\n w, h, -d + t,\n w, 0, -d + t,\n ];\n\n\n\n const normals = [\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // Front cover\n 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, // Back cover\n -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // Spine\n 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, // Inside front cover\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // Inside back cover\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Inside spine\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Front cover top\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Back cover top\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Spine cover top\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Front cover bottom\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Back cover bottom\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Spine cover bottom\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Front cover edge\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Back cover edge\n ];\n\n const u1 = width / ((width * 2) + depth);\n const u2 = (width + depth) / ((width * 2) + depth);\n\n const uvs = [\n u2,0, 1,0, 1,1, u2,1, // Front cover\n 0,0, u1,0, u1,1, 0,1, // Back cover\n u1,0, u2,0, u2,1, u1,1, // Spine\n 1,0, u2,0, u2,1, 1,1, // Inside front cover\n u1,0, 0,0, 0,1, u1,1, // Inside back cover\n u2,0, u1,0, u1,1, u2,1, // Inside spine\n u2,0, 1,0, 1,1, u2,1, // Front cover top\n 0,0, 1,0, 1,1, 0,1, // Back cover top\n 0,0, 1,0, 1,1, 0,1, // Spine cover top\n 0,0, 1,0, 1,1, 0,1, // Front cover bottom\n 0,0, 1,0, 1,1, 0,1, // Back cover bottom\n 0,0, 1,0, 1,1, 0,1, // Spine cover bottom\n 0,0, 1,0, 1,1, 0,1, // Front cover edge\n 0,0, 1,0, 1,1, 0,1, // Back cover edge\n ];\n\n const indices = [\n 0, 1, 2, 0, 2, 3, // Front cover face\n 4, 5, 6, 4, 6, 7, // Back cover face\n 8, 9, 10, 8, 10, 11, // Spine face\n 12, 13, 14, 12, 14, 15, // Inside front cover\n 16, 17, 18, 16, 18, 19, // Inside back cover\n 20, 21, 22, 20, 22, 23, // Inside spine\n 24, 25, 26, 24, 26, 27, // Front cover top\n 28, 29, 30, 28, 30, 31, // Back cover top\n 32, 33, 34, 32, 34, 35, // Spine cover top\n 36, 37, 38, 36, 38, 39, // Front cover bottom\n 40, 41, 42, 40, 42, 43, // Back cover bottom\n 44, 45, 46, 44, 46, 47, // Spine cover bottom\n 48, 49, 50, 48, 50, 51, // Front cover edge\n 52, 53, 54, 52, 54, 55, // Back cover edge\n ];\n\n const positions = new Float32Array(vertices);\n const normalArray = new Float32Array(normals);\n const uvArray = new Float32Array(uvs);\n const indexArray = new Uint16Array(indices);\n\n const coverGeometry = new BufferGeometry();\n coverGeometry.setAttribute('position', new BufferAttribute(positions, 3));\n coverGeometry.setAttribute('normal', new BufferAttribute(normalArray, 3));\n coverGeometry.setAttribute('uv', new BufferAttribute(uvArray, 2));\n coverGeometry.setIndex(new BufferAttribute(indexArray, 1));\n\n const pagesGeometry = new BoxGeometry(width - t - i, h - i * 2, d - t * 2);\n pagesGeometry.translate((width - t - i) / 2 + t, h / 2, -d / 2 );\n this.copy(mergeGeometries([coverGeometry, pagesGeometry], true));\n }\n}\n","/**\n * Generates a random number between `min` and `max`.\n */\nexport function randomFloat(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n}\n\n/**\n * Generates a random integer between `min` and `max`.\n */\nexport function randomInteger(min = 0, max = 1) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * Generates a random number skewed towards the maximum value.\n *\n * @param {number} [exponent=0.5] - Controls the skew of the distribution.\n * A smaller value (e.g., 0.3) skews the values towards the max.\n * A larger value (e.g., 0.8) creates a more even distribution.\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards `max`.\n */\nexport function logarithmicRandomMax(exponent = 0.5, min = 0, max = 1) {\n return min + (max - min) * Math.pow(Math.random(), exponent);\n}\n\n/**\n * Generates a random number skewed towards the minimum value.\n *\n * @param {number} [exponent=0.5] - Controls the skew of the distribution.\n * A smaller value (e.g., 0.3) skews the values towards the min.\n * A larger value (e.g., 0.8) creates a more even distribution.\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards `min`.\n */\nexport function logarithmicRandomMin(exponent = 0.5, min = 0, max = 1) {\n return min + (max - min) * Math.pow(1 - Math.random(), exponent);\n}\n\n/**\n * Generates a random number with an inverse logarithmic distribution, biased towards the maximum value.\n *\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards the maximum.\n */\n\nfunction inverseLogarithmicRandomMax(min = 0, max = 1) {\n // Generate the inverse-logarithmic skewed value between 0 and 1\n const randomValue = 1 - Math.log(1 - Math.random()) / Math.log(2);\n\n // Scale it to the desired range [min, max]\n return min + (max - min) * randomValue;\n}\n\n/**\n * Generates a random number with an inverse logarithmic distribution, biased towards the minimum value.\n *\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards the minimum.\n */\nfunction inverseLogarithmicRandomMin(min = 0, max = 1) {\n // Generate the inverse-logarithmic skewed value between 0 and 1, but reverse it to bias towards the minimum\n const randomValue = Math.log(1 - Math.random()) / Math.log(2);\n const adjustedValue = -randomValue;\n\n // Clamp the adjusted value between 0 and 1 to prevent out-of-range values\n const clampedValue = Math.min(Math.max(adjustedValue, 0), 1);\n\n // Scale it to the desired range [min, max]\n return min + (max - min) * clampedValue;\n}\n","import { BookGeometry } from \"../geometry/books/BookGeometry.js\";\nimport { InstancedMesh, Matrix4, Vector3 } from \"three\";\nimport { logarithmicRandomMax, logarithmicRandomMin, randomFloat } from \"../utils/RandomNumberUtils.js\";\n\nfunction randomScale({\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n return new Vector3(\n randomFloat(scaleXMin, scaleXMax),\n logarithmicRandomMax(0.25, scaleYMin, scaleYMax),\n logarithmicRandomMin(0.8, scaleZMin, scaleZMax),\n );\n}\n\n/**\n * Creates a row of books from the scales array of Vector3.\n */\nexport function rowOfBooksByScales({ coverMaterial, pagesMaterial, scales = [] } = {}) {\n const geometry = new BookGeometry();\n const row = new InstancedMesh(geometry, [coverMaterial, pagesMaterial], scales.length);\n const matrix = new Matrix4();\n let currentZ = 0;\n\n for (let i = 0; i < scales.length; i++) {\n const scale = scales[i];\n const scaleMatrix = new Matrix4();\n scaleMatrix.makeScale(scale.x, scale.y, scale.z);\n matrix.identity();\n matrix.multiply(scaleMatrix);\n matrix.setPosition(0.01 + Math.random() * 0.1, 0, currentZ + scale.z * 0.5);\n row.setMatrixAt(i, matrix);\n currentZ += scale.z * 0.5;\n }\n return row;\n}\n\n/**\n * Creates a row of books with a given count.\n */\nexport function rowOfBooksByCount({\n coverMaterial,\n pagesMaterial,\n count = 10,\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n const scales = Array.from({ length: count }, () =>\n randomScale({ scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax }),\n );\n\n return rowOfBooksByScales({ coverMaterial, pagesMaterial, scales });\n}\n\n/**\n * Creates a row of books with a total length.\n */\nexport function rowOfBooksByLength({\n coverMaterial,\n pagesMaterial,\n length = 10,\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n const scales = [];\n let remainingZ = length;\n while (remainingZ > 0) {\n const scale = randomScale({ scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax });\n scale.z = Math.min(scale.z, remainingZ);\n scales.push(scale);\n remainingZ -= scale.z;\n }\n\n return rowOfBooksByScales({ coverMaterial, pagesMaterial, scales });\n}\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass BifurcatedStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 2, stepHeight = 0.3, stepDepth = 0.6, numStepsCentral = 5, numStepsBranch = 5, branchAngle = Math.PI / 4) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate central flight of steps\n for (let i = 0; i < numStepsCentral; i++) {\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n const zFront = i * stepDepth;\n const zBack = zFront + stepDepth;\n\n // Central flight of steps (8 vertices per step)\n vertices.push(\n // Vertical riser\n -stepWidth / 2, yBottom, zFront, // Bottom-left\n stepWidth / 2, yBottom, zFront, // Bottom-right\n stepWidth / 2, yTop, zFront, // Top-right\n -stepWidth / 2, yTop, zFront, // Top-left\n\n // Horizontal tread\n -stepWidth / 2, yTop, zFront, // Top-left\n stepWidth / 2, yTop, zFront, // Top-right\n stepWidth / 2, yTop, zBack, // Back-right\n -stepWidth / 2, yTop, zBack // Back-left\n );\n\n const baseIndex = i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Landing platform\n const landingY = numStepsCentral * stepHeight;\n const landingZ = numStepsCentral * stepDepth;\n const landingWidth = stepWidth * 2;\n\n vertices.push(\n // Landing platform (4 vertices)\n -landingWidth / 2, landingY, landingZ, // Bottom-left\n landingWidth / 2, landingY, landingZ, // Bottom-right\n landingWidth / 2, landingY, landingZ + stepDepth,// Top-right\n -landingWidth / 2, landingY, landingZ + stepDepth // Top-left\n );\n\n const landingBaseIndex = numStepsCentral * 8;\n indices.push(\n landingBaseIndex, landingBaseIndex + 1, landingBaseIndex + 2, // First triangle for landing\n landingBaseIndex, landingBaseIndex + 2, landingBaseIndex + 3 // Second triangle for landing\n );\n\n // Generate branching flights (left and right)\n for (let j = 0; j < 2; j++) {\n const direction = j === 0 ? 1 : -1; // Left or right branch\n\n for (let i = 0; i < numStepsBranch; i++) {\n const yBottom = landingY + i * stepHeight;\n const yTop = yBottom + stepHeight;\n\n // Calculate positions for the branching steps\n const xStart = direction * (landingWidth / 4);\n const zStart = landingZ + stepDepth;\n\n const xOffset = i * stepDepth * Math.cos(branchAngle);\n const zOffset = i * stepDepth * Math.sin(branchAngle);\n\n const xFrontLeft = xStart + direction * xOffset - (stepWidth / 2) * Math.cos(branchAngle);\n const xFrontRight = xStart + direction * xOffset + (stepWidth / 2) * Math.cos(branchAngle);\n const zFront = zStart + zOffset;\n const xBackLeft = xFrontLeft + direction * stepDepth * Math.cos(branchAngle);\n const xBackRight = xFrontRight + direction * stepDepth * Math.cos(branchAngle);\n const zBack = zFront + stepDepth * Math.sin(branchAngle);\n\n // Branch flight of steps (8 vertices per step)\n vertices.push(\n // Vertical riser\n xFrontLeft, yBottom, zFront, // Bottom-left\n xFrontRight, yBottom, zFront, // Bottom-right\n xFrontRight, yTop, zFront, // Top-right\n xFrontLeft, yTop, zFront, // Top-left\n\n // Horizontal tread\n xFrontLeft, yTop, zFront, // Top-left\n xFrontRight, yTop, zFront, // Top-right\n xBackRight, yTop, zBack, // Back-right\n xBackLeft, yTop, zBack // Back-left\n );\n\n const baseIndex = landingBaseIndex + 4 + j * numStepsBranch * 8 + i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { BifurcatedStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass DioramaGeometry extends BufferGeometry {\n constructor(width = 5, height = 3, depth = 5, wallThickness = 0.2) {\n super();\n\n // Vertices array (each set of 3 numbers represents x, y, z of a vertex)\n const vertices = [\n // Floor vertices\n -width / 2, 0, -depth / 2, // 0\n width / 2, 0, -depth / 2, // 1\n width / 2, 0, depth / 2, // 2\n -width / 2, 0, depth / 2, // 3\n\n // Back wall vertices\n -width / 2, 0, -depth / 2, // 4\n width / 2, 0, -depth / 2, // 5\n width / 2, height, -depth / 2, // 6\n -width / 2, height, -depth / 2, // 7\n\n // Left wall vertices\n -width / 2, 0, -depth / 2, // 8\n -width / 2, 0, depth / 2, // 9\n -width / 2, height, depth / 2, // 10\n -width / 2, height, -depth / 2, // 11\n ];\n\n // Indices array (each set of 3 numbers represents a triangle)\n const indices = [\n // Floor\n 0, 1, 2,\n 0, 2, 3,\n\n // Back wall\n 4, 5, 6,\n 4, 6, 7,\n\n // Left wall\n 8, 9, 10,\n 8, 10, 11,\n ];\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { DioramaGeometry }\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass LShapedStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 2, stepHeight = 0.3, stepDepth = 0.5, numStepsPerFlight = 5, landingDepth = 2) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate first flight of steps\n for (let i = 0; i < numStepsPerFlight; i++) {\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n const zFront = i * stepDepth;\n const zBack = zFront + stepDepth;\n\n // First flight of steps (4 vertices per step, 8 vertices per flight)\n vertices.push(\n // Vertical riser\n -stepWidth / 2, yBottom, zFront, // Bottom-left\n stepWidth / 2, yBottom, zFront, // Bottom-right\n stepWidth / 2, yTop, zFront, // Top-right\n -stepWidth / 2, yTop, zFront, // Top-left\n\n // Horizontal tread\n -stepWidth / 2, yTop, zFront, // Top-left\n stepWidth / 2, yTop, zFront, // Top-right\n stepWidth / 2, yTop, zBack, // Back-right\n -stepWidth / 2, yTop, zBack // Back-left\n );\n\n const baseIndex = i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Add landing platform\n const landingY = numStepsPerFlight * stepHeight;\n const landingZ = numStepsPerFlight * stepDepth;\n\n vertices.push(\n // Landing platform (4 vertices)\n -stepWidth / 2, landingY, landingZ, // Bottom-left\n stepWidth / 2, landingY, landingZ, // Bottom-right\n stepWidth / 2, landingY, landingZ + landingDepth, // Top-right\n -stepWidth / 2, landingY, landingZ + landingDepth // Top-left\n );\n\n const landingBaseIndex = numStepsPerFlight * 8;\n indices.push(\n landingBaseIndex, landingBaseIndex + 1, landingBaseIndex + 2, // First triangle for landing\n landingBaseIndex, landingBaseIndex + 2, landingBaseIndex + 3 // Second triangle for landing\n );\n\n // Generate second flight of steps (turn 90 degrees)\n for (let i = 0; i < numStepsPerFlight; i++) {\n const yBottom = landingY + i * stepHeight;\n const yTop = yBottom + stepHeight;\n const xFront = -stepWidth / 2 - i * stepDepth;\n const xBack = xFront - stepDepth;\n\n // Second flight of steps (4 vertices per step, 8 vertices per flight)\n vertices.push(\n // Vertical riser\n xFront, yBottom, landingZ + landingDepth, // Bottom-left\n xFront, yBottom, landingZ + landingDepth - stepWidth, // Bottom-right\n xFront, yTop, landingZ + landingDepth - stepWidth, // Top-right\n xFront, yTop, landingZ + landingDepth, // Top-left\n\n // Horizontal tread\n xFront, yTop, landingZ + landingDepth, // Top-left\n xFront, yTop, landingZ + landingDepth - stepWidth, // Top-right\n xBack, yTop, landingZ + landingDepth - stepWidth, // Back-right\n xBack, yTop, landingZ + landingDepth // Back-left\n );\n\n const baseIndex = landingBaseIndex + 4 + i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { LShapedStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass SpiralStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 1, stepDepth = 0.4, stepHeight = 0.2, numSteps = 20, radius = 2, angleIncrement = Math.PI / 8) {\n super();\n\n const vertices = [];\n const indices = [];\n let currentAngle = 0;\n\n // Generate vertices and indices for each step\n for (let i = 0; i < numSteps; i++) {\n // Calculate the center position of the step based on the angle and radius\n const xCenter = radius * Math.cos(currentAngle);\n const zCenter = radius * Math.sin(currentAngle);\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n\n // Define the four corners of the vertical riser part of the current step\n vertices.push(\n // Front face (vertical riser)\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yBottom, zCenter - (stepWidth / 2) * Math.sin(currentAngle), // Bottom-left\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yBottom, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Bottom-right\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Top-right\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle) // Top-left\n );\n\n // Define the four corners of the horizontal tread part of the current step\n vertices.push(\n // Top face (horizontal tread)\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle), // Top-left-front\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Top-right-front\n xCenter + (stepWidth / 2) * Math.cos(currentAngle) - stepDepth * Math.sin(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle) + stepDepth * Math.cos(currentAngle), // Back-right\n xCenter - (stepWidth / 2) * Math.cos(currentAngle) - stepDepth * Math.sin(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle) + stepDepth * Math.cos(currentAngle) // Back-left\n );\n\n // Indices for the riser (vertical face of each step)\n const baseIndex = i * 8; // 8 vertices per step (4 for riser, 4 for tread)\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2, // First triangle for riser\n baseIndex, baseIndex + 2, baseIndex + 3 // Second triangle for riser\n );\n\n // Indices for the tread (horizontal face of each step)\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6, // First triangle for tread\n baseIndex + 4, baseIndex + 6, baseIndex + 7 // Second triangle for tread\n );\n\n // Increment the angle for the next step\n currentAngle += angleIncrement;\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { SpiralStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass StaircaseGeometry extends BufferGeometry {\n constructor(width = 2, stepHeight = 0.3, stepDepth = 0.5, numSteps = 10) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate vertices and indices for each step\n for (let i = 0; i < numSteps; i++) {\n const stepBottomY = i * stepHeight;\n const stepTopY = stepBottomY + stepHeight;\n const stepFrontZ = i * stepDepth;\n const stepBackZ = stepFrontZ + stepDepth;\n\n // Vertices for each step (8 vertices per step to cover tread and riser)\n vertices.push(\n // Bottom face of riser (front face)\n -width / 2, stepBottomY, stepFrontZ, // 0: Bottom-left-front\n width / 2, stepBottomY, stepFrontZ, // 1: Bottom-right-front\n width / 2, stepTopY, stepFrontZ, // 2: Top-right-front\n -width / 2, stepTopY, stepFrontZ, // 3: Top-left-front\n\n // Top face of tread (horizontal step)\n -width / 2, stepTopY, stepFrontZ, // 4: Top-left-front (repeated)\n width / 2, stepTopY, stepFrontZ, // 5: Top-right-front (repeated)\n width / 2, stepTopY, stepBackZ, // 6: Top-right-back\n -width / 2, stepTopY, stepBackZ // 7: Top-left-back\n );\n\n // Indices for each step\n const baseIndex = i * 8;\n\n // Riser face (front face of each step)\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2, // First triangle for riser\n baseIndex, baseIndex + 2, baseIndex + 3 // Second triangle for riser\n );\n\n // Tread face (top horizontal surface of each step)\n indices.push(\n baseIndex + 4, baseIndex + 6, baseIndex + 5, // First triangle for tread\n baseIndex + 4, baseIndex + 7, baseIndex + 6 // Second triangle for tread\n );\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { StaircaseGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass CrossHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.4, height = 1.2, depth = 0.2) {\n super();\n\n // Create the vertical part of the cross\n const verticalHeight = height * 0.6;\n const verticalGeometry = new BoxGeometry(width / 2, verticalHeight, depth);\n verticalGeometry.translate(0, verticalHeight / 2, 0);\n\n // Create the horizontal part of the cross\n const horizontalWidth = width * 1.5;\n const horizontalGeometry = new BoxGeometry(horizontalWidth, width / 4, depth);\n horizontalGeometry.translate(0, verticalHeight * 0.75, 0);\n\n // Merge both parts into a cross\n this.copy(mergeGeometries([verticalGeometry, horizontalGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { CrossHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry, ConeGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass ObeliskHeadstoneGeometry extends BufferGeometry {\n constructor(totalHeight = 1.75, baseWidth = 0.75) {\n super();\n\n // Define height proportions relative to the total height\n const baseHeight = totalHeight * 0.05;\n const lowerSegmentHeight = totalHeight * 0.15;\n const middleSegmentHeight = totalHeight * 0.15;\n const topSegmentHeight = totalHeight * 0.75;\n\n let currentHeight = 0;\n\n // Base of the Headstone (a wide box)\n const baseGeometry = new BoxGeometry(baseWidth, baseHeight, baseWidth);\n baseGeometry.translate(0, currentHeight + baseHeight / 2, 0);\n currentHeight += baseHeight;\n\n // Lower Segment (a slightly narrower box)\n const lowerSegmentGeometry = new BoxGeometry(baseWidth * 0.8, lowerSegmentHeight, baseWidth * 0.8);\n lowerSegmentGeometry.translate(0, currentHeight + lowerSegmentHeight / 2, 0);\n currentHeight += lowerSegmentHeight;\n\n // Middle Segment (an even narrower box)\n const middleSegmentGeometry = new BoxGeometry(baseWidth * 0.6, middleSegmentHeight, baseWidth * 0.6);\n middleSegmentGeometry.translate(0, currentHeight + middleSegmentHeight / 2, 0);\n currentHeight += middleSegmentHeight;\n\n // Top Segment (a tall, thin box to form the obelisk shape)\n const topSegmentGeometry = new BoxGeometry(baseWidth * 0.4, topSegmentHeight, baseWidth * 0.4);\n topSegmentGeometry.translate(0, currentHeight + topSegmentHeight / 2, 0);\n currentHeight += topSegmentHeight;\n\n // Pyramid Top (a cone to form the pointed top of the obelisk)\n const pyramidGeometry = new ConeGeometry((baseWidth * 0.4) / Math.sqrt(2), 0.1, 4, 1, false, Math.PI / 4);\n pyramidGeometry.translate(0, currentHeight + 0.1 / 2, 0);\n\n this.copy(mergeGeometries([baseGeometry, lowerSegmentGeometry, middleSegmentGeometry, topSegmentGeometry, pyramidGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { ObeliskHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass RoundedHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.6, height = 1.0, depth = 0.2, radius = 0.6) {\n super();\n\n // Create the base of the headstone (a box)\n const baseHeight = height - radius / 2;\n const baseGeometry = new BoxGeometry(width, baseHeight, depth);\n baseGeometry.translate(0, baseHeight / 2, 0);\n\n // Create the rounded top part (a half cylinder with caps)\n const topGeometry = new CylinderGeometry(radius / 2, radius / 2, depth, 16, 1, false, 0, Math.PI);\n topGeometry.rotateY(Math.PI / 2);\n topGeometry.rotateX(Math.PI / 2);\n topGeometry.translate(0, baseHeight, 0);\n\n // Merge base and top into a single geometry\n this.copy(mergeGeometries([baseGeometry, topGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { RoundedHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\n\nclass SquareHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.5, height = 0.8, depth = 0.15) {\n super();\n\n // Create a rectangular slab\n const slabGeometry = new BoxGeometry(width, height, depth);\n slabGeometry.translate(0, height / 2, 0);\n\n this.copy(slabGeometry);\n }\n}\nexport { SquareHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Fence Column Geometry, a stone slab fence column shape\n */\nexport class FenceColumnGeometry extends BufferGeometry {\n constructor({ height = 2.25 } = {}) {\n super();\n\n // Column Base (a wider base for stability)\n const baseGeometry = new BoxGeometry(1.2, 0.5, 1.2);\n baseGeometry.translate(0, 0.25, 0);\n\n // Main Column (a tall rectangular shape, adjustable height)\n const columnGeometry = new BoxGeometry(1, height, 1);\n columnGeometry.translate(0, 0.5 + height / 2, 0);\n\n // Column Cap (a slightly wider cap on top)\n const capGeometry = new BoxGeometry(1.4, 0.3, 1.4);\n capGeometry.translate(0, 0.5 + height + 0.15, 0);\n\n this.copy(mergeGeometries([baseGeometry, columnGeometry, capGeometry], false));\n }\n}\n","import { BufferGeometry, ConeGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Wrought Iron Bar Geometry, a simple wrought iron bar shape\n */\nexport class WroughtIronBarGeometry extends BufferGeometry {\n constructor({\n barHeight = 2.0, //\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n // Create a cylinder for the vertical bar\n const barGeometry = new CylinderGeometry(barRadius, barRadius, barHeight, radialSegments);\n barGeometry.translate(0, barHeight / 2, 0);\n\n // Create a cone for the spike on top\n const spikeGeometry = new ConeGeometry(spikeRadius, spikeHeight, radialSegments);\n spikeGeometry.translate(0, barHeight + spikeHeight / 2, 0);\n spikeGeometry.scale(1, 1, spikeScaleZ);\n\n // Merge bar and spike into one geometry\n this.copy(mergeGeometries([barGeometry, spikeGeometry], false));\n }\n}\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { WroughtIronBarGeometry } from \"./WroughtIronBarGeometry.js\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class WroughtIronFenceGeometry extends BufferGeometry {\n constructor({\n count = 20, //\n spacing = 0.4,\n barHeight = 2.0,\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n railHeight = 0.1,\n railDepth = 0.05,\n railOffset = 0.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n const geometries = [];\n const bar = new WroughtIronBarGeometry({ barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments });\n const rail = new BoxGeometry(count * spacing, railHeight, railDepth);\n\n for (let i = 0; i < count; i++) {\n const geometry = bar.clone();\n geometry.translate(i * spacing, 0, 0);\n geometries.push(geometry);\n }\n\n const topRail = rail.clone();\n topRail.translate((spacing * (count - 1)) / 2, barHeight - railOffset - railHeight / 2, 0);\n geometries.push(topRail);\n\n const bottomRail = rail.clone();\n bottomRail.translate((spacing * (count - 1)) / 2, railHeight / 2, 0);\n geometries.push(bottomRail);\n\n this.copy(mergeGeometries(geometries));\n }\n}\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class BookshelfGeometry extends BufferGeometry {\n constructor({\n width = 5, //\n height = 8,\n depth = 1,\n shelves = 4,\n frameThickness = 0.1,\n open = false,\n } = {}) {\n super();\n\n // Create the outer frame of the bookshelf\n const frameHeight = height;\n const frameWidth = width;\n const frameDepth = depth;\n\n // Base geometries\n const sidePanelGeometry = new BoxGeometry(frameThickness, frameHeight, frameDepth);\n const shelfGeometry = new BoxGeometry(frameWidth - 2 * frameThickness, frameThickness, frameDepth);\n\n // Panels\n const leftPanel = sidePanelGeometry.clone();\n leftPanel.translate(-frameWidth / 2 + frameThickness / 2, frameHeight / 2, 0);\n\n const rightPanel = sidePanelGeometry.clone();\n rightPanel.translate(frameWidth / 2 - frameThickness / 2, frameHeight / 2, 0);\n\n const topPanel = shelfGeometry.clone();\n topPanel.translate(0, frameHeight - frameThickness / 2, 0);\n\n const bottomPanel = shelfGeometry.clone();\n bottomPanel.translate(0, frameThickness / 2, 0);\n\n const backPanel = new BoxGeometry(frameWidth, frameHeight, frameThickness);\n backPanel.translate(0, frameHeight / 2, -frameDepth / 2 + frameThickness / 2);\n\n const shelfPanels = [];\n const shelfSpacing = (frameHeight - frameThickness) / (shelves + 1);\n for (let i = 1; i <= shelves; i++) {\n const shelfPanel = shelfGeometry.clone();\n shelfPanel.translate(0, frameThickness / 2 + i * shelfSpacing, 0);\n shelfPanels.push(shelfPanel);\n }\n\n this.copy(mergeGeometries([\n leftPanel, //\n rightPanel,\n topPanel,\n bottomPanel,\n ...(open ? [] : [backPanel]),\n ...shelfPanels\n ], false));\n }\n}\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass SimpleLeafGeometry extends BufferGeometry {\n constructor(size = 0.1) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Define vertices to approximate a simple, elongated, oval leaf shape\n const leafPoints = [\n [0, 1], // Top point\n [0.5, 0.75], // Right upper middle\n [0.75, 0.25], // Right lower middle\n [0.5, -0.5], // Right bottom middle\n [0, -1], // Bottom point\n [-0.5, -0.5], // Left bottom middle\n [-0.75, 0.25], // Left lower middle\n [-0.5, 0.75], // Left upper middle\n ];\n\n // Add vertices to the geometry, scaling them with the `size` parameter\n for (let i = 0; i < leafPoints.length; i++) {\n const [x, y] = leafPoints[i];\n vertices.push(x * size, y * size, 0);\n }\n\n // Define indices to form triangular faces of the leaf\n // Create a fan-like structure connecting the top vertex (index 0) to other neighboring vertices\n for (let i = 1; i < leafPoints.length - 1; i++) {\n indices.push(0, i, i + 1);\n }\n // Close the fan with the last triangle\n indices.push(0, leafPoints.length - 1, 1);\n\n // Convert the vertices and indices to buffer attributes\n const positionAttribute = new Float32BufferAttribute(vertices, 3);\n this.setAttribute('position', positionAttribute);\n this.setIndex(indices);\n\n this.computeVertexNormals();\n }\n}\n\nexport { SimpleLeafGeometry };\n","import { Vector3 } from \"three\";\nimport { mergeVertices } from \"three/addons/utils/BufferGeometryUtils.js\";\nimport { Direction } from \"../constants/Direction.js\";\n\nexport function randomTransformVertices(geometry, direction = Direction.XYZ, minScale = 0.5, maxScale = 2.0) {\n // Delete unnecessary attributes\n geometry.deleteAttribute(\"uv\");\n geometry.deleteAttribute(\"normal\");\n geometry = mergeVertices(geometry);\n geometry.computeVertexNormals();\n\n // Get position attribute\n const positionAttribute = geometry.getAttribute(\"position\");\n\n // Loop through each vertex\n for (let i = 0; i < positionAttribute.count; i++) {\n const vertex = new Vector3().fromBufferAttribute(positionAttribute, i);\n\n // Randomly scale the displacement along the given direction\n const randomScale = Math.random() * (maxScale - minScale) + minScale;\n const displacement = direction.clone().multiplyScalar(randomScale);\n\n // Apply the displacement to the vertex\n vertex.add(displacement);\n positionAttribute.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n\n // Notify Three.js that the position attribute has been updated\n positionAttribute.needsUpdate = true;\n geometry.computeVertexNormals();\n\n return geometry;\n}\n","import { BufferGeometry, SphereGeometry } from \"three\";\nimport { Direction } from \"../../constants/Direction.js\";\nimport { randomTransformVertices } from \"../../utils/VertexUtils.js\";\n\nexport class RockGeometry extends BufferGeometry {\n constructor(radius = 1, widthSegments = 4, heightSegments = 4) {\n super();\n\n const sphere = new SphereGeometry(radius, widthSegments, heightSegments);\n this.copy(randomTransformVertices(sphere, Direction.XYZ, 0.5, 1.0));\n this.computeVertexNormals();\n this.center();\n }\n}\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Bone Geometry, a simple bone shape\n * @extends BufferGeometry\n *\n * @example\n * // Create a bone\n * const boneGeometry = new BoneGeometry();\n * const boneMaterial = new MeshStandardMaterial({ color: 0xffffff });\n * const bone = new Mesh(boneGeometry, boneMaterial);\n * scene.add(bone);\n */\nclass BoneGeometry extends BufferGeometry {\n constructor(radiusTop = 0.1, radiusBottom = 0.1, height = 0.4, radialSegments = 8) {\n super();\n\n // Create the cylinder (shaft of the bone)\n const cylinderGeometry = new CylinderGeometry(radiusTop * 0.6, radiusBottom * 0.6, height, radialSegments);\n cylinderGeometry.translate(0, 0, 0);\n\n // Create the spheres (ends of the bone)\n const sphereGeometry = new SphereGeometry(radiusTop, radialSegments, radialSegments);\n const topSphere1 = sphereGeometry.clone();\n const topSphere2 = sphereGeometry.clone();\n const bottomSphere1 = sphereGeometry.clone();\n const bottomSphere2 = sphereGeometry.clone();\n\n // Position the spheres at each end of the cylinder\n topSphere1.translate(0, height / 2 + radiusTop * 0.6, -radiusTop * 0.6);\n topSphere2.translate(0, height / 2 + radiusTop * 0.6, radiusTop * 0.6);\n bottomSphere1.translate(0, -height / 2 - radiusBottom * 0.6, -radiusBottom * 0.6);\n bottomSphere2.translate(0, -height / 2 - radiusBottom * 0.6, radiusBottom * 0.6);\n\n // Merge the parts\n this.copy(mergeGeometries([cylinderGeometry, topSphere1, topSphere2, bottomSphere1, bottomSphere2], false));\n }\n}\n\nexport { BoneGeometry };\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass BeakerGeometry extends BufferGeometry {\n constructor() {\n super();\n\n // Create the sphere part of the glassware\n const sphereGeometry = new SphereGeometry(1, 16, 16);\n const tubeGeometry = new CylinderGeometry(0.2, 0.2, 2, 16, 1, true);\n\n // Adjust tube position to stick out of the sphere\n tubeGeometry.translate(0, 1.5, 0);\n tubeGeometry.rotateX(Math.PI / 2);\n\n this.copy(mergeGeometries([sphereGeometry, tubeGeometry], false));\n }\n}\n\nexport { BeakerGeometry };\n","import { BufferGeometry, LatheGeometry, Vector2 } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class ErlenmeyerFlaskGeometry extends BufferGeometry {\n constructor({\n flaskRadius = 1, //\n neckRadius = 0.3,\n height = 2.5,\n neckHeight = 1,\n radialSegments = 16,\n } = {}) {\n super();\n\n // Recalculating other radii to keep proportions consistent\n const points = [\n new Vector2(0, 0), // Bottom of the flask\n new Vector2(flaskRadius * 0.875, 0), // Flat base with minimum width\n new Vector2(flaskRadius, 0.1), // End of the rounded base\n new Vector2(neckRadius, height), // Start of the straight neck\n new Vector2(neckRadius, height + neckHeight), // End of the straight neck\n new Vector2(neckRadius * 1.1, height + neckHeight + 0.3), // Slight outward lip at the top\n ];\n\n const flaskGeometry = new LatheGeometry(points, radialSegments);\n\n this.copy(mergeGeometries([flaskGeometry], false));\n }\n}\n","import { BufferGeometry, CircleGeometry, LatheGeometry, Vector2 } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass MortarGeometry extends BufferGeometry {\n constructor() {\n super();\n\n const mortarPoints = [\n new Vector2(1, 0), // Bottom of the bowl\n new Vector2(1.2, 0.5), // Slight flare at the base\n new Vector2(1.4, 1.5), // Outer wall\n new Vector2(1.3, 1.8), // Flared edge\n new Vector2(0.8, 1.8), // Lip of the bowl\n ];\n const mortarGeometry = new LatheGeometry(mortarPoints, 12);\n\n // Create a disk to close off the bottom\n const baseDisk = new CircleGeometry(1, 12); // Radius matches the base of the mortar\n baseDisk.rotateX(-Math.PI / 2); // Rotate to align with the bottom\n baseDisk.translate(0, 0, 0); // Position at the base of the mortar\n\n this.copy(mergeGeometries([mortarGeometry, baseDisk], false));\n }\n}\n\nexport { MortarGeometry };\n","import { BufferGeometry, CylinderGeometry, TorusGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class StandGeometry extends BufferGeometry {\n constructor({\n radius = 0.3, //\n height = 0.4,\n count = 3,\n thickness = 0.03,\n radialSegments = 16,\n } = {}) {\n super();\n\n const ringGeometry = new TorusGeometry(radius, thickness, 8, radialSegments);\n ringGeometry.rotateX(Math.PI / 2);\n ringGeometry.translate(0, height, 0);\n\n const legGeometry = new CylinderGeometry(thickness * 0.6, thickness * 0.6, height, radialSegments);\n const legs = [];\n\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n const leg = legGeometry.clone();\n leg.translate(Math.cos(angle) * radius, height / 2, Math.sin(angle) * radius);\n legs.push(leg);\n }\n\n this.copy(mergeGeometries([ringGeometry, ...legs], false));\n }\n}\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass TestTubeGeometry extends BufferGeometry {\n constructor(radiusTop = 0.2, radiusBottom = 0.2, height = 3, segments = 32, openEnded = true) {\n super();\n\n // Create the cylindrical body\n const tubeGeometry = new CylinderGeometry(radiusTop, radiusBottom, height, segments, 1, openEnded);\n\n // Create the rounded bottom using a half sphere\n const bottomGeometry = new SphereGeometry(radiusBottom, segments, segments / 2, 0, Math.PI * 2, Math.PI / 2, Math.PI / 2);\n bottomGeometry.translate(0, -(height / 2), 0); // Position it at the bottom of the cylinder\n\n // Merge parts\n this.copy(mergeGeometries([tubeGeometry, bottomGeometry], false));\n }\n}\n\nexport { TestTubeGeometry };\n","import { BufferGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass WineBottleGeometry extends BufferGeometry {\n constructor({ radius = 0.5, neckRadius = 0.2, height = 3, neckHeight = 1, segments = 16 } = {}) {\n super();\n\n // Main body\n const bodyHeight = height - neckHeight;\n const bodyGeometry = new CylinderGeometry(radius, radius, bodyHeight, segments);\n bodyGeometry.translate(0, bodyHeight / 2, 0);\n\n // Shoulder section between body and neck\n const shoulderHeight = 0.3;\n const shoulderGeometry = new CylinderGeometry(neckRadius, radius, shoulderHeight, segments);\n shoulderGeometry.translate(0, bodyHeight + shoulderHeight / 2, 0);\n\n // Neck\n const neckGeometry = new CylinderGeometry(neckRadius, neckRadius, neckHeight, segments);\n neckGeometry.translate(0, bodyHeight + shoulderHeight + neckHeight / 2, 0);\n\n // Merge geometries\n this.copy(mergeGeometries([bodyGeometry, shoulderGeometry, neckGeometry], false));\n }\n}\n\nexport { WineBottleGeometry };\n","import { BufferGeometry, SphereGeometry } from \"three\";\n\nexport class HillGeometry extends BufferGeometry {\n constructor({\n radius = 3, //\n height = 0.6,\n widthSegments = 64,\n heightSegments = 16,\n phiStart = 0,\n phiLength = Math.PI * 2,\n } = {}) {\n super();\n\n this.copy(new SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, 0, Math.PI / 2));\n this.scale(1, height / radius, 1);\n }\n}\n","/**\n * Calculate the radius to achieve a spherical cap height.\n * R = r / (1 - cos(thetaLength))\n */\nexport const radiusFromCapHeight = (height, thetaLength) => height / (1 - Math.cos(thetaLength));\n\n/**\n * Calculate the radius to achieve a spherical cap width.\n * R = w / (2 * sin(thetaLength))\n */\nexport const radiusFromCapWidth = (width, thetaLength) => width / (2 * Math.sin(thetaLength));\n\n/**\n * Calculate the height of a spherical cap.\n * h = R * (1 - cos(thetaLength))\n */\nexport const capHeightFromRadius = (radius, thetaLength) => radius * (1 - Math.cos(thetaLength));\n\n/**\n * Calculate the width of a spherical cap.\n * w = 2 * R * sin(thetaLength)\n */\nexport const capWidthFromRadius = (radius, thetaLength) => 2 * radius * Math.sin(thetaLength);\n\n\n/**\n * Convert spherical coordinates to Cartesian coordinates.\n * @param {number} radius - The radius of the sphere.\n * @param {number} theta - The azimuthal angle in radians (from the x-axis in the x-y plane).\n * @param {number} phi - The polar angle in radians (from the positive z-axis).\n * @returns {{x: number, y: number, z: number}} The Cartesian coordinates.\n */\nexport const sphericalToCartesian = (radius, theta, phi) => {\n return {\n x: radius * Math.sin(phi) * Math.cos(theta),\n y: radius * Math.sin(phi) * Math.sin(theta),\n z: radius * Math.cos(phi)\n };\n};\n\n/**\n * Convert Cartesian coordinates to spherical coordinates.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @param {number} z - The z-coordinate.\n * @returns {{radius: number, theta: number, phi: number}} The spherical coordinates.\n */\nexport const cartesianToSpherical = (x, y, z) => {\n const radius = Math.sqrt(x * x + y * y + z * z);\n const theta = Math.atan2(y, x); // Azimuthal angle\n const phi = Math.acos(z / radius); // Polar angle\n return { radius, theta, phi };\n};\n","import { BufferGeometry, SphereGeometry } from \"three\";\nimport {capHeightFromRadius, radiusFromCapWidth} from \"../../utils/SphericalGeometryUtils.js\";\n\n/**\n * Mound-like geometry with a flat top.\n *\n * To create a radius based on a desired width:\n * ```\n * const moundGeometry = new MoundGeometry({\n * radius: radiusFromCapWidth(5, Math.PI / 10),\n * }\n * ```\n *\n * To create a radius based on a desired height:\n * ```\n * const moundGeometry = new MoundGeometry({\n * radius: radiusFromCapHeight(5, Math.PI / 10),\n * }\n * ```\n */\nexport class MoundGeometry extends BufferGeometry {\n constructor({\n radius = radiusFromCapWidth(5, Math.PI / 10), //\n widthSegments = 64,\n heightSegments = 32,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaLength = Math.PI / 10,\n } = {}) {\n super();\n\n this.copy(new SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, 0, thetaLength));\n\n // Translate the geometry so the base is at the origin\n const height = capHeightFromRadius(radius, thetaLength);\n this.translate(0, -radius + height, 0);\n }\n}\n","import { BufferGeometry, CylinderGeometry, DodecahedronGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Tree geometry, consisting of a trunk and leaves.\n *\n * Group order:\n * - Trunk Material\n * - Leaf Material\n *\n * @example\n * const treeGeometry = new TreeGeometry({\n * trunkRadiusTop: 0.25,\n * trunkRadiusBottom: 0.4,\n * trunkHeight: 2.5,\n * trunkSegments: 14,\n * leafSize: 0.8,\n * leafCount: 6,\n * leafDetail: 0,\n * leafSpreadRadius: 1.5\n * });\n */\nclass TreeGeometry extends BufferGeometry {\n constructor({\n trunkRadiusTop = 0.25,\n trunkRadiusBottom = 0.4,\n trunkHeight = 2.5,\n trunkSegments = 14,\n leafSize = 0.8,\n leafCount = 6,\n leafDetail = 0,\n leafSpreadRadius = 1.5,\n } = {}) {\n super();\n\n // Create trunk geometry\n const trunk = new CylinderGeometry(trunkRadiusTop, trunkRadiusBottom, trunkHeight, trunkSegments);\n trunk.translate(0, trunkHeight / 2, 0);\n\n // Create leaf geometries\n const leafs = [];\n for (let i = 0; i < leafCount; i++) {\n const leaf = new DodecahedronGeometry(leafSize, leafDetail);\n leaf.translate(\n (Math.random() - 0.5) * leafSpreadRadius,\n (Math.random() - 0.5) * leafSize + trunkHeight,\n (Math.random() - 0.5) * leafSpreadRadius,\n );\n leafs.push(leaf);\n }\n\n // Merge trunk and leaves\n this.copy(mergeGeometries([trunk.toNonIndexed(), mergeGeometries(leafs, false)], true));\n this.computeVertexNormals();\n }\n}\n\nexport { TreeGeometry };\n","import { Group, Mesh, ShaderMaterial, SphereGeometry } from \"three\";\n\nclass Moon extends Group {\n constructor() {\n super();\n\n // Create moon geometry\n const moonGeometry = new SphereGeometry(5, 32, 32);\n\n // Custom ShaderMaterial\n const moonMaterial = new ShaderMaterial({\n uniforms: {\n time: { value: 0.0 },\n },\n vertexShader: `\n varying vec3 vNormal;\n varying vec3 vPosition;\n void main() {\n vNormal = normalize(normal);\n vPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n varying vec3 vNormal;\n varying vec3 vPosition;\n\n // Simple 3D noise function\n float hash(vec3 p) {\n p = fract(p * 0.3183099 + vec3(0.71, 0.113, 0.419));\n p *= 17.0;\n return fract(p.x * p.y * p.z * (p.x + p.y + p.z));\n }\n\n float noise(vec3 p) {\n vec3 ip = floor(p);\n vec3 fp = fract(p);\n fp = fp * fp * (3.0 - 2.0 * fp); // Smoothstep\n return mix(\n mix(mix(hash(ip), hash(ip + vec3(1.0, 0.0, 0.0)), fp.x),\n mix(hash(ip + vec3(0.0, 1.0, 0.0)), hash(ip + vec3(1.0, 1.0, 0.0)), fp.x), fp.y),\n mix(mix(hash(ip + vec3(0.0, 0.0, 1.0)), hash(ip + vec3(1.0, 0.0, 1.0)), fp.x),\n mix(hash(ip + vec3(0.0, 1.0, 1.0)), hash(ip + vec3(1.0, 1.0, 1.0)), fp.x), fp.y),\n fp.z);\n }\n\n void main() {\n vec3 color = vec3(0.8, 0.8, 0.7); // Base moon color\n float n = noise(vPosition * 0.5); // Apply noise with frequency\n color *= 0.8 + 0.2 * n; // Modulate color by noise\n gl_FragColor = vec4(color, 1.0);\n }\n `\n });\n\n // Create the moon mesh and add it to the scene\n const moon = new Mesh(moonGeometry, moonMaterial);\n this.add(moon);\n }\n}\n\nexport { Moon };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BookGeometry } from \"../../geometry/books/BookGeometry.js\";\n\nexport class Book extends Mesh {\n constructor({\n width = 1,\n height = 1.5,\n depth = 0.5,\n coverThickness = 0.05,\n pageIndent = 0.05,\n coverColor = 0x8b0000,\n pageColor = 0xffffff,\n } = {}) {\n super();\n\n this.geometry = new BookGeometry(width, height, depth, coverThickness, pageIndent);\n this.material = [\n new MeshStandardMaterial({ color: coverColor, metalness: 0.1, roughness: 0.7, flatShading: true }),\n new MeshStandardMaterial({ color: pageColor, flatShading: true }),\n ];\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { CrossHeadstoneGeometry } from \"../../geometry/cemetery/CrossHeadstoneGeometry.js\";\n\nexport class CrossHeadstone extends Mesh {\n constructor(width = 0.4, height = 1.2, depth = 0.2) {\n super();\n\n this.geometry = new CrossHeadstoneGeometry(width, height, depth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { BoxGeometry, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Group, Mesh, MeshStandardMaterial, Shape } from \"three\";\n\nclass Mausoleum extends Group {\n constructor() {\n super();\n\n // Base of the Mausoleum\n const baseGeometry = new BoxGeometry(5, 1, 5);\n const baseMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n const baseMesh = new Mesh(baseGeometry, baseMaterial);\n baseMesh.position.set(0, 0.5, 0);\n this.add(baseMesh);\n\n // Main Building Structure\n const buildingGeometry = new BoxGeometry(4, 3, 4);\n const buildingMaterial = new MeshStandardMaterial({ color: 0x696969, flatShading: true });\n const buildingMesh = new Mesh(buildingGeometry, buildingMaterial);\n buildingMesh.position.set(0, 2.5, 0);\n this.add(buildingMesh);\n\n // Roof (Peaked)\n const roofGeometry = new ConeGeometry(3.5, 2, 4);\n const roofMaterial = new MeshStandardMaterial({ color: 0x505050, flatShading: true });\n const roofMesh = new Mesh(roofGeometry, roofMaterial);\n roofMesh.rotation.y = Math.PI / 4;\n roofMesh.position.set(0, 5, 0);\n this.add(roofMesh);\n\n // Pillars\n const pillarGeometry = new CylinderGeometry(0.2, 0.2, 3.5, 16);\n const pillarMaterial = new MeshStandardMaterial({ color: 0x696969, flatShading: true });\n\n const pillarPositions = [\n [-1.8, 2.3, -2.2],\n [1.8, 2.3, -2.2],\n [-1.8, 2.3, 2.2],\n [1.8, 2.3, 2.2],\n ];\n\n pillarPositions.forEach((position) => {\n const pillarMesh = new Mesh(pillarGeometry, pillarMaterial);\n pillarMesh.position.set(...position);\n this.add(pillarMesh);\n });\n\n // Corrected Arched Entrance\n const archShape = new Shape();\n archShape.moveTo(-1, 0);\n archShape.lineTo(-1, 2);\n archShape.absarc(0, 2, 1, Math.PI, 0, true);\n archShape.lineTo(1, 0);\n\n const extrudeSettings = {\n depth: 0.5,\n bevelEnabled: false,\n };\n const archGeometry = new ExtrudeGeometry(archShape, extrudeSettings);\n const archMaterial = new MeshStandardMaterial({ color: 0x404040, flatShading: true });\n const archMesh = new Mesh(archGeometry, archMaterial);\n archMesh.position.set(0, 0.5, 1.7);\n this.add(archMesh);\n }\n}\n\nexport { Mausoleum };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { ObeliskHeadstoneGeometry } from \"../../geometry/cemetery/ObeliskHeadstoneGeometry.js\";\n\nexport class ObeliskHeadstone extends Mesh {\n constructor(totalHeight = 1.75, baseWidth = 0.75) {\n super();\n\n this.geometry = new ObeliskHeadstoneGeometry(totalHeight, baseWidth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { RoundedHeadstoneGeometry } from \"../../geometry/cemetery/RoundedHeadstoneGeometry.js\";\n\nexport class RoundedHeadstone extends Mesh {\n constructor(width = 0.6, height = 1.0, depth = 0.2, radius = 0.6) {\n super();\n\n this.geometry = new RoundedHeadstoneGeometry(width, height, depth, radius);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { SquareHeadstoneGeometry } from \"../../geometry/cemetery/SquareHeadstoneGeometry.js\";\n\nexport class SquareHeadstone extends Mesh {\n constructor(width = 0.5, height = 0.8, depth = 0.15) {\n super();\n\n this.geometry = new SquareHeadstoneGeometry(width, height, depth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { FenceColumnGeometry } from \"../../geometry/fence/FenceColumnGeometry.js\";\n\nexport class FenceColumn extends Mesh {\n constructor({ height = 2.25 } = {}) {\n super();\n\n this.geometry = new FenceColumnGeometry({ height });\n this.material = new MeshStandardMaterial({ color: 0x8b7d7b, flatShading: true });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { WroughtIronBarGeometry } from \"../../geometry/fence/WroughtIronBarGeometry.js\";\n\nexport class WroughtIronBar extends Mesh {\n constructor({\n barHeight = 2.0, //\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n this.geometry = new WroughtIronBarGeometry({\n barHeight,\n barRadius,\n spikeHeight,\n spikeRadius,\n spikeScaleZ,\n radialSegments,\n });\n this.material = new MeshStandardMaterial({ color: 0x333333, metalness: 0.8, roughness: 0.4 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { WroughtIronFenceGeometry } from \"../../geometry/fence/WroughtIronFenceGeometry.js\";\n\nexport class WroughtIronFence extends Mesh {\n constructor({\n count = 20, //\n spacing = 0.4,\n barHeight = 2.0,\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n railHeight = 0.1,\n railDepth = 0.05,\n railOffset = 0.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n this.geometry = new WroughtIronFenceGeometry({\n count,\n spacing,\n barHeight,\n barRadius,\n spikeHeight,\n spikeRadius,\n spikeScaleZ,\n railHeight,\n railDepth,\n railOffset,\n radialSegments,\n });\n this.material = new MeshStandardMaterial({ color: 0x333333, metalness: 0.8, roughness: 0.4 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BookshelfGeometry } from \"../../geometry/furniture/BookshelfGeometry\";\n\nexport class Bookshelf extends Mesh {\n constructor({\n width = 5, //\n height = 8,\n depth = 1,\n shelves = 4,\n frameThickness = 0.1,\n open = false,\n } = {}) {\n super();\n\n this.geometry = new BookshelfGeometry({ width, height, depth, shelves, frameThickness, open });\n this.material = new MeshStandardMaterial({ color: 0x8b4513 });\n }\n}\n","import { BoxGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2 } from \"three\";\n\nclass Desk extends Group {\n constructor() {\n super();\n\n // Desk Surface\n const surfaceGeometry = new BoxGeometry(5, 0.3, 3); // Width, Height (depth), Length\n const surfaceMaterial = new MeshStandardMaterial({ color: 0x8b5a2b }); // Wood-like color\n const deskSurface = new Mesh(surfaceGeometry, surfaceMaterial);\n deskSurface.position.set(0, 3.15, 0); // Raise the desk up\n\n // Desk Legs (using lathe geometry)\n const points = [];\n points.push(new Vector2(0.2, 0)); // Starting point at bottom (thin)\n points.push(new Vector2(0.25, 0.5)); // Curve outward\n points.push(new Vector2(0.15, 1.5)); // Narrow toward the middle\n points.push(new Vector2(0.3, 3)); // Final part toward the top\n\n const legGeometry = new LatheGeometry(points, 32);\n const legMaterial = new MeshStandardMaterial({ color: 0x4b3621 }); // Darker wood for legs\n\n // Create four legs for the desk\n const legPositions = [\n [2.2, 0, 1.2], // Adjust Y to 0 so legs start at ground level\n [-2.2, 0, 1.2],\n [2.2, 0, -1.2],\n [-2.2, 0, -1.2],\n ];\n\n legPositions.forEach((position) => {\n const leg = new Mesh(legGeometry, legMaterial);\n leg.position.set(...position);\n this.add(leg);\n });\n\n this.add(deskSurface);\n }\n}\n\nexport { Desk };\n","import { CylinderGeometry, Group, Mesh, MeshBasicMaterial, MeshStandardMaterial, PointLight, SphereGeometry } from \"three\";\n\nclass Candle extends Group {\n constructor(height = 1, radius = 0.2) {\n super();\n this.height = height;\n this.radius = radius;\n this.createCandle();\n this.animateFlicker();\n }\n\n createCandle() {\n // Candle Geometry\n const candleGeometry = new CylinderGeometry(this.radius, this.radius, this.height, 32);\n const candleMaterial = new MeshStandardMaterial({ color: 0xffffff });\n this.candle = new Mesh(candleGeometry, candleMaterial);\n this.candle.position.set(0, this.height / 2, 0);\n this.add(this.candle);\n\n // Flame Geometry\n const flameGeometry = new SphereGeometry(0.05, 16, 16);\n const flameMaterial = new MeshBasicMaterial({ color: 0xffa500 });\n this.flame = new Mesh(flameGeometry, flameMaterial);\n this.flame.position.set(0, this.height + 0.05, 0);\n this.add(this.flame);\n\n // Candlelight\n this.candleLight = new PointLight(0xffa500, 1, 5);\n this.candleLight.position.set(0, this.height + 0.05, 0);\n this.candleLight.castShadow = true;\n this.add(this.candleLight);\n }\n\n animateFlicker() {\n const flicker = () => {\n // Random flicker intensity between 0.8 and 1.2\n this.candleLight.intensity = 1 + (Math.random() * 0.4 - 0.2);\n\n // Optional: slight random movement to simulate a flickering flame\n this.candleLight.position.x = Math.random() * 0.02 - 0.01;\n this.candleLight.position.z = Math.random() * 0.02 - 0.01;\n\n requestAnimationFrame(flicker);\n };\n flicker();\n }\n}\n\nexport { Candle };\n","import { ConeGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, PointLight, TorusGeometry } from \"three\";\n\n// Class for Lantern Geometry\nclass Lantern extends Group {\n constructor(height = 1.3, baseWidth = 0.5) {\n super();\n\n // Lantern Base (cylinder)\n const baseGeometry = new CylinderGeometry(baseWidth, baseWidth, 0.2, 16);\n const baseMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const baseMesh = new Mesh(baseGeometry, baseMaterial);\n baseMesh.position.set(0, 0, 0);\n this.add(baseMesh);\n\n // Lantern Body (a rectangular frame)\n const bodyGeometry = new CylinderGeometry(baseWidth * 0.9, baseWidth * 0.9, height);\n const bodyMaterial = new MeshStandardMaterial({ color: 0xffd700, flatShading: true, transparent: true, opacity: 0.6 });\n const bodyMesh = new Mesh(bodyGeometry, bodyMaterial);\n bodyMesh.position.set(0, height / 2 + 0.1, 0); // Adjust position based on height\n this.add(bodyMesh);\n\n // Lantern Roof (a cone)\n const roofGeometry = new ConeGeometry(baseWidth * 1.1, 0.5, 8);\n const roofMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const roofMesh = new Mesh(roofGeometry, roofMaterial);\n roofMesh.position.set(0, height + 0.35, 0); // Adjusted position based on height\n this.add(roofMesh);\n\n // Lantern Handle (a torus)\n const handleGeometry = new TorusGeometry(baseWidth * 0.8, 0.05, 8, 16);\n const handleMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const handleMesh = new Mesh(handleGeometry, handleMaterial);\n handleMesh.position.set(0, height + 0.85, 0); // Adjusted to sit above the roof\n this.add(handleMesh);\n\n // Lantern Light (point light inside)\n const light = new PointLight(0xffaa00, 1.5, 15);\n light.position.set(0, height / 2 + 0.1, 0); // Adjust position based on height\n light.castShadow = true;\n this.add(light);\n }\n}\n\nexport { Lantern };\n","import { DodecahedronGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass MossyRocks extends Group {\n constructor() {\n super();\n\n // Rock Geometry (using Dodecahedron for a low-poly random rock-like shape)\n const rockGeometry = new DodecahedronGeometry(1, 0); // Low-poly shape\n const rockMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n const mossMaterial = new MeshStandardMaterial({ color: 0x4b8b3b, flatShading: true, opacity: 0.8, transparent: true });\n\n // Create multiple random rocks with slight variations\n for (let i = 0; i < 5; i++) {\n const rockMesh = new Mesh(rockGeometry, rockMaterial);\n rockMesh.scale.set(0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4); // Scale randomly to make each rock unique\n rockMesh.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI); // Random rotation for variation\n rockMesh.position.set((Math.random() - 0.5) * 4, 0, (Math.random() - 0.5) * 4); // Keep rocks at ground level\n this.add(rockMesh);\n\n // Moss Layer (using a slightly smaller scale and positioned on top of the rock)\n const mossMesh = new Mesh(rockGeometry, mossMaterial);\n mossMesh.scale.set(rockMesh.scale.x * 0.9, rockMesh.scale.y * 0.5, rockMesh.scale.z * 0.9); // Make the moss layer flatter\n mossMesh.rotation.copy(rockMesh.rotation);\n mossMesh.position.copy(rockMesh.position);\n mossMesh.position.y += 0.3; // Raise the moss slightly to sit on top of the rock\n this.add(mossMesh);\n }\n }\n}\n\nexport { MossyRocks };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { RockGeometry } from \"../../geometry/rocks/RockGeometry.js\";\n\nexport class Rock extends Mesh {\n constructor(radius = 1, widthSegments = 4, heightSegments = 4) {\n super();\n\n // Create a rock geometry\n this.geometry = new RockGeometry(radius, widthSegments, heightSegments);\n this.material = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n }\n}\n","import { DodecahedronGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass Rocks extends Group {\n constructor() {\n super();\n\n // Rock Geometry (using Dodecahedron for a low-poly random rock-like shape)\n const rockGeometry = new DodecahedronGeometry(1, 0); // Low-poly shape\n const rockMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n\n // Create multiple random rocks with slight variations\n for (let i = 0; i < 5; i++) {\n const rockMesh = new Mesh(rockGeometry, rockMaterial);\n rockMesh.scale.set(0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4); // Scale randomly to make each rock unique\n rockMesh.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI); // Random rotation for variation\n rockMesh.position.set((Math.random() - 0.5) * 4, 0, (Math.random() - 0.5) * 4); // Keep rocks at ground level\n this.add(rockMesh);\n }\n }\n}\n\nexport { Rocks };\n","import { BeakerGeometry } from \"../../geometry/science/BeakerGeometry.js\";\nimport { DoubleSide, Group, Mesh, MeshPhysicalMaterial } from \"three\";\n\nclass Beaker extends Group {\n constructor() {\n super();\n\n // Create the geometry\n const beakerGeometry = new BeakerGeometry();\n\n // Create a group to combine the geometries\n const glassMaterial = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9,\n side: DoubleSide,\n });\n\n const beaker = new Mesh(beakerGeometry, glassMaterial);\n beaker.rotation.x = -Math.PI / 2;\n this.add(beaker);\n }\n}\n\nexport { Beaker };\n","import { CylinderGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2 } from \"three\";\n\nclass Bottle extends Group {\n constructor() {\n super();\n\n // Potion bottle geometry\n const bottlePoints = [\n new Vector2(0, 0), // Bottom\n new Vector2(0.8, 0), // Base\n new Vector2(1, 1.5), // Rounded body\n new Vector2(0.5, 2.2), // Neck\n new Vector2(0.6, 2.5), // Mouth\n ];\n const bottleGeometry = new LatheGeometry(bottlePoints, 10); // Low-poly segments\n\n // Cork geometry\n const corkGeometry = new CylinderGeometry(0.3, 0.4, 0.2, 8);\n\n // Materials\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.5,\n roughness: 0.1,\n metalness: 0.3,\n });\n\n const liquidMaterial = new MeshStandardMaterial({\n color: 0xff3366, // Vibrant potion color\n transparent: true,\n opacity: 0.6,\n });\n\n const corkMaterial = new MeshStandardMaterial({\n color: 0x8b4513,\n roughness: 1.0,\n });\n\n // Meshes\n const bottle = new Mesh(bottleGeometry, glassMaterial);\n const liquid = new Mesh(bottleGeometry, liquidMaterial);\n const cork = new Mesh(corkGeometry, corkMaterial);\n\n // Adjust liquid position to appear inside bottle\n liquid.scale.set(0.8, 0.8, 0.8);\n liquid.position.y = 0.1; // Position slightly lower to appear \"inside\"\n\n // Position cork at the bottle's mouth\n cork.position.y = 2.5;\n\n // Group all elements for easy manipulation\n const potionBottle = new Group();\n potionBottle.add(bottle, liquid, cork);\n this.add(potionBottle);\n }\n}\n\nexport { Bottle };\n","import { ConeGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass BunsenBurner extends Group {\n constructor() {\n super();\n\n // Base geometry\n const baseGeometry = new CylinderGeometry(0.3, 0.4, 0.1, 16);\n const baseMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.6,\n metalness: 0.3,\n });\n const base = new Mesh(baseGeometry, baseMaterial);\n base.position.y = 0.05;\n\n // Burner tube geometry\n const tubeGeometry = new CylinderGeometry(0.1, 0.1, 0.7, 16);\n const tubeMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.5,\n metalness: 0.4,\n });\n const tube = new Mesh(tubeGeometry, tubeMaterial);\n tube.position.y = 0.4;\n\n // Flame geometry\n const flameGeometry = new ConeGeometry(0.075, 0.2, 16);\n const flameMaterial = new MeshStandardMaterial({\n color: 0xff5500,\n emissive: 0xff5500,\n emissiveIntensity: 0.6,\n transparent: true,\n opacity: 0.8,\n });\n const flame = new Mesh(flameGeometry, flameMaterial);\n flame.position.y = 0.8;\n\n this.add(base, tube, flame);\n }\n}\n\nexport { BunsenBurner };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, SphereGeometry } from \"three\";\n\nclass ElectricPanel extends Group {\n constructor() {\n super();\n\n // Panel base geometry\n const panelGeometry = new BoxGeometry(3, 4, 0.1);\n const panelMaterial = new MeshStandardMaterial({\n color: 0x2e2e2e,\n roughness: 0.8,\n metalness: 0.6,\n });\n\n // Create switches and dials\n const switchGeometry = new BoxGeometry(0.2, 0.5, 0.2);\n const switchMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n roughness: 0.5,\n metalness: 0.7,\n });\n\n const dialGeometry = new CylinderGeometry(0.3, 0.3, 0.1, 16);\n const dialMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.7,\n metalness: 0.5,\n });\n\n // Create panel and switches\n const panel = new Mesh(panelGeometry, panelMaterial);\n\n // Add multiple switches and dials\n const switches = [];\n for (let i = -1; i <= 1; i++) {\n const toggleSwitch = new Mesh(switchGeometry, switchMaterial);\n toggleSwitch.position.set(i, 1.5, 0.1);\n switches.push(toggleSwitch);\n panel.add(toggleSwitch);\n }\n\n const dial = new Mesh(dialGeometry, dialMaterial);\n dial.rotation.x = Math.PI / 2;\n dial.position.set(0, 0.5, 0.15);\n panel.add(dial);\n\n // Create red indicator light\n const lightGeometry = new SphereGeometry(0.15, 8, 8);\n const lightMaterial = new MeshStandardMaterial({\n color: 0xff0000,\n emissive: 0xff0000,\n emissiveIntensity: 0.5,\n });\n const light = new Mesh(lightGeometry, lightMaterial);\n light.position.set(0, -1, 0.1);\n panel.add(light);\n\n this.add(panel);\n\n // Define variables for flickering effect\n let flickerSpeed = 0.015; // Speed of flicker\n let flickerMaxIntensity = 0.8; // Maximum emissive intensity\n let flickerMinIntensity = 0.2; // Minimum emissive intensity\n\n // Main render loop\n function animate() {\n requestAnimationFrame(animate);\n\n // Create a flicker effect by adjusting the emissive intensity\n const flickerIntensity = flickerMinIntensity + Math.abs(Math.sin(Date.now() * flickerSpeed)) * (flickerMaxIntensity - flickerMinIntensity);\n light.material.emissiveIntensity = flickerIntensity;\n }\n\n animate();\n }\n}\n\nexport { ElectricPanel };\n","import { ErlenmeyerFlaskGeometry } from \"../../geometry/science/ErlenmeyerFlaskGeometry.js\";\nimport { DoubleSide, Mesh, MeshPhysicalMaterial } from \"three\";\n\nexport class ErlenmeyerFlask extends Mesh {\n constructor({\n flaskRadius = 1, //\n neckRadius = 0.3,\n height = 2.5,\n neckHeight = 1,\n radialSegments = 16,\n } = {}) {\n super();\n\n this.geometry = new ErlenmeyerFlaskGeometry({ flaskRadius, neckRadius, height, neckHeight, radialSegments });\n this.material = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9,\n side: DoubleSide,\n wireframe: false,\n });\n }\n}\n","import {CylinderGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2} from \"three\";\n\nclass Flask extends Group {\n constructor() {\n super();\n\n // Flask body geometry\n const flaskPoints = [\n new Vector2(0, 0), // Bottom of the flask\n new Vector2(1.2, 0), // Base\n new Vector2(1.5, 1.5), // Mid-body\n new Vector2(1, 3), // Narrow neck\n new Vector2(0.6, 3.5), // Mouth of the flask\n ];\n const flaskGeometry = new LatheGeometry(flaskPoints, 12); // 12 segments for low-poly style\n\n // Cork stopper geometry\n const corkGeometry = new CylinderGeometry(0.6, 0.7, 0.3, 8); // Simple tapered cylinder\n\n // Materials for flask and cork\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccaa,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.5,\n });\n\n const corkMaterial = new MeshStandardMaterial({\n color: 0x8b4513,\n roughness: 1.0,\n });\n\n // Meshes\n const flask = new Mesh(flaskGeometry, glassMaterial);\n const cork = new Mesh(corkGeometry, corkMaterial);\n\n // Position cork on top of the flask\n cork.position.y = 3.5;\n\n // Add both to a single object for easy manipulation\n this.add(flask, cork);\n }\n}\n\nexport { Flask };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, SphereGeometry } from \"three\";\n\nclass LeverPanel extends Group {\n constructor() {\n super();\n\n // New panel for levers\n const leverPanelGeometry = new BoxGeometry(2, 3, 0.1);\n const leverPanelMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.8,\n metalness: 0.5,\n });\n const leverPanel = new Mesh(leverPanelGeometry, leverPanelMaterial);\n\n // Lever geometry\n const leverBaseGeometry = new CylinderGeometry(0.1, 0.1, 0.2, 8);\n const leverHandleGeometry = new CylinderGeometry(0.05, 0.05, 1, 8);\n\n // Lever material\n const leverMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n roughness: 0.5,\n metalness: 0.7,\n });\n\n // Create multiple levers\n const levers = [];\n for (let i = -0.5; i <= 0.5; i += 0.5) {\n // Lever base\n const leverBase = new Mesh(leverBaseGeometry, leverMaterial);\n leverBase.position.set(i, 1, 0.1);\n\n // Lever handle\n const leverHandle = new Mesh(leverHandleGeometry, leverMaterial);\n leverHandle.position.y = 0.5; // Position handle on top of the base\n // leverHandle.rotation.x = Math.PI / 4; // Tilt forward along the x-axis\n leverBase.add(leverHandle);\n\n // Group base and handle as a lever\n levers.push(leverHandle);\n this.add(leverBase);\n }\n\n // Position the panel in the scene\n this.add(leverPanel);\n }\n}\n\nexport { LeverPanel };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass Microscope extends Group {\n constructor() {\n super();\n\n // Base geometry\n const baseGeometry = new BoxGeometry(1, 0.2, 0.5);\n const baseMaterial = new MeshStandardMaterial({\n color: 0x444444,\n roughness: 0.6,\n metalness: 0.3,\n });\n const base = new Mesh(baseGeometry, baseMaterial);\n base.position.y = 0.1;\n\n // Arm geometry\n const armGeometry = new BoxGeometry(0.2, 1, 0.2);\n const arm = new Mesh(armGeometry, baseMaterial);\n arm.position.set(0, 0.6, -0.2);\n\n // Eyepiece geometry\n const eyepieceGeometry = new CylinderGeometry(0.1, 0.1, 0.4, 8);\n const eyepieceMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.5,\n metalness: 0.6,\n });\n const eyepiece = new Mesh(eyepieceGeometry, eyepieceMaterial);\n eyepiece.position.set(0, 1.1, -0.35);\n eyepiece.rotation.x = -Math.PI / 4; // Angle the eyepiece for viewing\n\n // Stage geometry\n const stageGeometry = new BoxGeometry(0.6, 0.1, 0.6);\n const stageMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.8,\n metalness: 0.2,\n });\n const stage = new Mesh(stageGeometry, stageMaterial);\n stage.position.set(0, 0.6, 0);\n\n // Assemble microscope\n this.add(base, arm, eyepiece, stage);\n }\n}\n\nexport { Microscope };\n","import { CylinderGeometry, DoubleSide, Group, Mesh, MeshStandardMaterial } from \"three\";\nimport { MortarGeometry } from \"../../geometry/science/MortarGeometry.js\";\n\nclass MortarAndPestle extends Group {\n constructor() {\n super();\n\n // Mortar geometry\n const mortarGeometry = new MortarGeometry();\n\n // Pestle geometry\n const pestleGeometry = new CylinderGeometry(0.2, 0.3, 1.5, 8);\n pestleGeometry.translate(0, 0.75, 0); // Offset to make the end rounded\n\n // Materials\n const mortarMaterial = new MeshStandardMaterial({\n color: 0x5c4033, // Dark earthy tone\n roughness: 1.0,\n metalness: 0.0,\n side: DoubleSide, // Render inside and outside\n });\n\n const pestleMaterial = new MeshStandardMaterial({\n color: 0x8b5a2b, // Slightly lighter earthy color\n roughness: 0.8,\n metalness: 0.1,\n });\n\n // Meshes\n const mortar = new Mesh(mortarGeometry, mortarMaterial);\n const pestle = new Mesh(pestleGeometry, pestleMaterial);\n\n // Position and rotate the pestle to rest in the mortar\n pestle.position.set(0.3, 1.3, 0);\n pestle.rotation.z = Math.PI / 4;\n\n // Group for easy manipulation\n this.add(mortar, pestle);\n }\n}\n\nexport { MortarAndPestle };\n","import { CatmullRomCurve3, Group, Mesh, MeshStandardMaterial, TubeGeometry, Vector3 } from \"three\";\n\nclass SpiralTube extends Group {\n constructor() {\n super();\n\n // Create a multi-spiral path for the tube\n const spiralLength = 100; // Total number of points for more coils\n const heightIncrement = 0.05; // Smaller increment to keep the coils tight\n const curve = new CatmullRomCurve3(\n Array.from({ length: spiralLength }, (_, i) => {\n const angle = i * 0.2; // Controls tightness of the spiral\n return new Vector3(\n Math.cos(angle) * 0.4,\n i * heightIncrement, // Gradual height increase\n Math.sin(angle) * 0.4,\n );\n }),\n );\n\n // Create tube geometry with a high segment count for smoothness\n const tubeGeometry = new TubeGeometry(curve, 200, 0.1, 8, false);\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.3,\n roughness: 0.1,\n metalness: 0.2,\n emissive: 0x88ccff,\n });\n const multiSpiralTube = new Mesh(tubeGeometry, glassMaterial);\n this.add(multiSpiralTube);\n\n // Optional fluid animation inside tube (using gradient effect)\n function animateFluid() {\n glassMaterial.emissiveIntensity = 0.2 + Math.sin(Date.now() * 0.005) * 0.1;\n }\n\n // Main render loop with fluid animation\n function animate() {\n requestAnimationFrame(animate);\n animateFluid(); // Add subtle animation for fluid effect\n }\n\n animate();\n }\n}\n\nexport { SpiralTube };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { StandGeometry } from \"../../geometry/science/StandGeometry.js\";\n\nclass Stand extends Mesh {\n constructor({\n radius = 0.3, //\n height = 0.4,\n count = 3,\n thickness = 0.03,\n radialSegments = 16,\n } = {}) {\n super();\n\n this.geometry = new StandGeometry({ radius, height, count, thickness, radialSegments });\n this.material = new MeshStandardMaterial({\n color: 0x888888,\n roughness: 0.7,\n metalness: 0.3,\n });\n }\n}\n\nexport { Stand };\n","import {\n BufferGeometry,\n CylinderGeometry,\n DoubleSide,\n Group,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshStandardMaterial,\n SphereGeometry,\n Vector3,\n} from \"three\";\n\nclass TeslaCoil extends Group {\n constructor() {\n super();\n\n // Base geometry\n const coilBaseGeometry = new CylinderGeometry(0.5, 0.6, 0.3, 16);\n const coilBaseMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.6,\n metalness: 0.5,\n });\n const coilBase = new Mesh(coilBaseGeometry, coilBaseMaterial);\n coilBase.position.y = 0.15;\n\n // Coil geometry\n const coilGeometry = new CylinderGeometry(0.15, 0.15, 2, 12, 1, true);\n const coilMaterial = new MeshStandardMaterial({\n color: 0xff6600,\n roughness: 0.5,\n metalness: 0.8,\n side: DoubleSide,\n });\n const coil = new Mesh(coilGeometry, coilMaterial);\n coil.position.y = 1.3;\n\n // Sphere at the top\n const coilTopGeometry = new SphereGeometry(0.3, 16, 16);\n const coilTop = new Mesh(coilTopGeometry, coilMaterial);\n coilTop.position.y = 2.4;\n\n this.add(coilBase, coil, coilTop);\n\n // Sparking effect (using lines)\n const sparks = [];\n for (let i = 0; i < 5; i++) {\n const sparkMaterial = new LineBasicMaterial({ color: 0x99ccff });\n const points = [\n new Vector3(0, 2.4, 0),\n new Vector3((Math.random() - 0.5) * 1.5, Math.random() * 2.4, (Math.random() - 0.5) * 1.5),\n ];\n const sparkGeometry = new BufferGeometry().setFromPoints(points);\n const spark = new Line(sparkGeometry, sparkMaterial);\n this.add(spark);\n sparks.push(spark);\n }\n\n // Update spark positions\n function animateSparks() {\n sparks.forEach((spark) => {\n const points = [\n new Vector3(0, 2.4, 0),\n new Vector3((Math.random() - 0.5) * 1.5, Math.random() * 2.4, (Math.random() - 0.5) * 1.5),\n ];\n spark.geometry.setFromPoints(points);\n });\n }\n\n function animate() {\n requestAnimationFrame(animate);\n animateSparks(); // Make the sparks “jump”\n }\n\n animate();\n }\n}\n\nexport { TeslaCoil };\n","import { DoubleSide, Group, Mesh, MeshPhysicalMaterial } from \"three\";\nimport { TestTubeGeometry } from \"../../geometry/science/TestTubeGeometry.js\";\n\nclass TestTube extends Group {\n constructor(radiusTop = 0.2, radiusBottom = 0.2, height = 3, segments = 32) {\n super();\n\n // Test Tube Geometry\n const tubeGeometry = new TestTubeGeometry(radiusTop, radiusBottom, height, segments);\n\n const tubeMaterial = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9, // For glass effect\n side: DoubleSide,\n });\n\n const tube = new Mesh(tubeGeometry, tubeMaterial);\n\n this.add(tube);\n }\n}\n\nexport { TestTube };\n","import { BoxGeometry, DoubleSide, Group, Mesh, MeshStandardMaterial } from \"three\";\nimport { TestTubeGeometry } from \"../../geometry/science/TestTubeGeometry.js\";\n\nclass TestTubeRack extends Group {\n constructor(count = 3, colors = [0x00ffaa, 0xff00aa, 0xaa00ff]) {\n super();\n\n // Rack geometry\n const rackGeometry = new BoxGeometry(3, 0.2, 1);\n const rackMaterial = new MeshStandardMaterial({\n color: 0x8b4513, // Wooden color or change to metallic tone\n roughness: 0.7,\n metalness: 0.3,\n });\n const rack = new Mesh(rackGeometry, rackMaterial);\n rack.position.y = 0.5;\n\n // Test tube properties\n const testTubeGeometry = new TestTubeGeometry(0.1, 0.1, 1, 16);\n const glassMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.5,\n side: DoubleSide,\n });\n\n // Create multiple test tubes with specified liquid colors\n for (let i = 0; i < count; i++) {\n // Test tube\n const testTube = new Mesh(testTubeGeometry, glassMaterial);\n const xPosition = (i - (count - 1) / 2) * 0.8;\n testTube.position.set(xPosition, 1, 0);\n\n // Liquid geometry and material with unique color\n const liquidGeometry = new TestTubeGeometry(0.099, 0.099, 0.5, 16, false);\n const liquidColor = colors[i % colors.length]; // Cycle through colors if fewer than tubes\n const liquidMaterial = new MeshStandardMaterial({\n color: liquidColor,\n emissive: liquidColor,\n emissiveIntensity: 0.5,\n transparent: true,\n opacity: 0.6,\n });\n\n // Liquid inside test tube\n const liquid = new Mesh(liquidGeometry, liquidMaterial);\n liquid.position.set(0, -0.25, 0); // Position liquid inside tube\n testTube.add(liquid);\n\n // Add tube to rack\n rack.add(testTube);\n }\n\n // Group rack\n this.add(rack);\n }\n}\n\nexport { TestTubeRack };\n","import { Mesh, MeshPhysicalMaterial } from \"three\";\nimport { WineBottleGeometry } from \"../../geometry/science/WineBottleGeometry.js\";\n\nclass WineBottle extends Mesh {\n constructor() {\n super();\n\n // Create wine bottle geometry\n const wineBottle = new WineBottleGeometry();\n\n // Create a glass-like material\n const bottleMaterial = new MeshPhysicalMaterial({\n color: 0x556b2f,\n roughness: 0.1,\n transmission: 0.9, // Makes the material transparent\n thickness: 0.2,\n metalness: 0,\n clearcoat: 1.0,\n clearcoatRoughness: 0.1,\n });\n\n // Create mesh and add to the scene\n this.geometry = wineBottle;\n this.material = bottleMaterial;\n }\n}\n\nexport { WineBottle };\n","import { Shape } from \"three\";\n\nclass BurstShape extends Shape {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1.0) {\n super();\n\n const step = (Math.PI * 2) / sides;\n const halfStep = step / 2;\n const qtrStep = step / 4;\n\n this.moveTo(Math.cos(0) * outerRadius, -Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= sides; ++n) {\n let cx = Math.cos(step * n - qtrStep * 3) * (innerRadius / Math.cos(qtrStep));\n let cy = -Math.sin(step * n - qtrStep * 3) * (innerRadius / Math.cos(qtrStep));\n let dx = Math.cos(step * n - halfStep) * innerRadius;\n let dy = -Math.sin(step * n - halfStep) * innerRadius;\n this.quadraticCurveTo(cx, cy, dx, dy);\n cx = Math.cos(step * n - qtrStep) * (innerRadius / Math.cos(qtrStep));\n cy = -Math.sin(step * n - qtrStep) * (innerRadius / Math.cos(qtrStep));\n dx = Math.cos(step * n) * outerRadius;\n dy = -Math.sin(step * n) * outerRadius;\n this.quadraticCurveTo(cx, cy, dx, dy);\n }\n\n this.closePath();\n }\n}\n\nexport { BurstShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { BurstShape } from \"../../shapes/BurstShape.js\";\n\nclass Burst extends Mesh {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1.0, depth = 0.25) {\n super();\n\n const shape = new BurstShape(sides, innerRadius, outerRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xffff00,\n emissive: 0xffd700,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Burst };\n","import { Path, Shape } from \"three\";\n\nclass GearShape extends Shape {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1, holeSides = 5, holeRadius = 0.25) {\n super();\n\n const step = (Math.PI * 2) / sides;\n const qtrStep = step / 4;\n\n this.moveTo(Math.cos(0) * outerRadius, -Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= sides; ++n) {\n this.lineTo(Math.cos(step * n - qtrStep * 3) * innerRadius, -Math.sin(step * n - qtrStep * 3) * innerRadius);\n this.lineTo(Math.cos(step * n - qtrStep * 2) * innerRadius, -Math.sin(step * n - qtrStep * 2) * innerRadius);\n this.lineTo(Math.cos(step * n - qtrStep) * outerRadius, -Math.sin(step * n - qtrStep) * outerRadius);\n this.lineTo(Math.cos(step * n) * outerRadius, -Math.sin(step * n) * outerRadius);\n }\n this.closePath();\n\n // Create the hole in the gear, if specified\n if (holeRadius > 0 && holeSides > 2) {\n const hole = new Path();\n const holeStep = (Math.PI * 2) / holeSides;\n\n hole.moveTo(Math.cos(0) * holeRadius, -Math.sin(0) * holeRadius);\n for (let n = 1; n < holeSides; ++n) {\n hole.lineTo(Math.cos(holeStep * n) * holeRadius, -Math.sin(holeStep * n) * holeRadius);\n }\n hole.lineTo(Math.cos(0) * holeRadius, -Math.sin(0) * holeRadius);\n\n this.holes.push(hole);\n }\n }\n}\n\nexport { GearShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { GearShape } from \"../../shapes/GearShape.js\";\n\nclass Gear extends Mesh {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1, holeSides = 5, holeRadius = 0.25, depth = 0.25) {\n super();\n\n const shape = new GearShape(sides, innerRadius, outerRadius, holeSides, holeRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xaaaaaa,\n metalness: 0.8,\n roughness: 0.2,\n reflectivity: 0.5,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Gear };\n","import { Shape } from \"three\";\n\nclass HeartShape extends Shape {\n constructor(size = 1, width = 2.1, height = 1.4, tipDepth = 1.6) {\n super();\n\n // Start from the top middle of the heart\n this.moveTo(0, height * size / 3);\n\n // Left curve\n this.bezierCurveTo(\n -width * 0.375 * size, height * size, // Control point 1 for the left lobe\n -width * size, height * size / 3, // Control point 2 for the left side of the heart\n 0, -tipDepth * size // Bottom tip of the heart, controlled by `tipDepth`\n );\n\n // Right curve\n this.bezierCurveTo(\n width * size, height * size / 3, // Control point 3 for the right side of the heart\n width * 0.375 * size, height * size, // Control point 4 for the right lobe\n 0, height * size / 3 // Close shape at the top middle\n );\n }\n}\n\nexport { HeartShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { HeartShape } from \"../../shapes/HeartShape.js\";\n\nclass Heart extends Mesh {\n constructor(size = 1, width = 1, height = 1, tipDepth = 10, depth = 0.25) {\n super();\n\n const shape = new HeartShape(size, width, height, tipDepth);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xc62828,\n emissive: 0xc61416,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Heart };\n","import { Shape } from \"three\";\n\nclass StarShape extends Shape {\n constructor(points = 5, innerRadius = 0.5, outerRadius = 1.0) {\n super();\n\n const step = (Math.PI * 2) / points;\n const halfStep = step / 2;\n this.moveTo(Math.cos(0) * outerRadius, Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= points; ++n) {\n this.lineTo(Math.cos(step * n - halfStep) * innerRadius, Math.sin(step * n - halfStep) * innerRadius);\n this.lineTo(Math.cos(step * n) * outerRadius, Math.sin(step * n) * outerRadius);\n }\n\n this.closePath();\n }\n}\n\nexport { StarShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { StarShape } from \"../../shapes/StarShape.js\";\n\nclass Star extends Mesh {\n constructor(points = 5, innerRadius = 0.5, outerRadius = 1.0, depth = 0.25) {\n super();\n\n const shape = new StarShape(points, innerRadius, outerRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xffff00,\n emissive: 0xffd700,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Star };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BoneGeometry } from \"../../geometry/skeleton/BoneGeometry.js\";\n\nexport class Bone extends Mesh {\n constructor() {\n super();\n\n this.geometry = new BoneGeometry();\n this.material = new MeshStandardMaterial({ color: 0xffffff });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { TreeGeometry } from \"../../geometry/trees/TreeGeometry.js\";\n\n/**\n * @example\n * const tree = new Tree({\n * trunkRadiusTop: 0.25,\n * trunkRadiusBottom: 0.4,\n * trunkHeight: 2.5,\n * trunkSegments: 14,\n * trunkColor: 0x8b4513,\n * leafSize: 0.8,\n * leafCount: 6,\n * leafDetail: 0,\n * leafSpreadRadius: 1.5,\n * leafColor: 0x228b22,\n * });\n */\nclass Tree extends Mesh {\n constructor({\n trunkRadiusTop = 0.25,\n trunkRadiusBottom = 0.4,\n trunkHeight = 2.5,\n trunkSegments = 14,\n trunkColor = 0x8b4513,\n leafSize = 0.8,\n leafCount = 6,\n leafDetail = 0,\n leafSpreadRadius = 1.5,\n leafColor = 0x228b22,\n } = {}) {\n super();\n\n const treeGeometry = new TreeGeometry({\n trunkRadiusTop: trunkRadiusTop,\n trunkRadiusBottom: trunkRadiusBottom,\n trunkHeight: trunkHeight,\n trunkSegments: trunkSegments,\n trunkColor: trunkColor,\n leafSize: leafSize,\n leafCount: leafCount,\n leafDetail: leafDetail,\n leafSpreadRadius: leafSpreadRadius,\n leafColor: leafColor,\n });\n\n const trunkMaterial = new MeshStandardMaterial({\n color: trunkColor,\n roughness: 0.9,\n metalness: 0,\n flatShading: true,\n });\n\n const leafMaterial = new MeshStandardMaterial({\n color: leafColor,\n roughness: 0.8,\n metalness: 0,\n flatShading: true,\n });\n\n this.geometry = treeGeometry;\n this.material = [trunkMaterial, leafMaterial];\n }\n}\n\nexport { Tree };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { HillGeometry } from \"../../geometry/terrain/HillGeometry.js\";\n\nexport class Hill extends Mesh {\n constructor({\n radius = 3, //\n height = 0.6,\n widthSegments = 64,\n heightSegments = 16,\n phiStart = 0,\n phiLength = Math.PI * 2,\n } = {}) {\n super();\n\n this.geometry = new HillGeometry({\n radius,\n height,\n widthSegments,\n heightSegments,\n phiStart,\n phiLength,\n });\n\n this.material = new MeshStandardMaterial({ color: 0x00ff00, flatShading: true });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { MoundGeometry } from \"../../geometry/terrain/MoundGeometry.js\";\nimport { radiusFromCapWidth } from \"../../utils/SphericalGeometryUtils.js\";\n\n/**\n * Mound-like mesh with a flat top.\n *\n * To create a radius based on a desired width:\n * ```\n * const mound = new Mound({\n * radius: radiusFromCapWidth(5, Math.PI / 10),\n * }\n * ```\n *\n * To create a radius based on a desired height:\n * ```\n * const mound = new Mound({\n * radius: radiusFromCapHeight(5, Math.PI / 10),\n * }\n * ```\n */\nexport class Mound extends Mesh {\n constructor({\n radius = radiusFromCapWidth(5, Math.PI / 10), //\n widthSegments = 64,\n heightSegments = 32,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaLength = Math.PI / 10,\n } = {}) {\n super();\n\n this.geometry = new MoundGeometry({\n radius,\n widthSegments,\n heightSegments,\n phiStart,\n phiLength,\n thetaLength,\n });\n\n this.material = new MeshStandardMaterial({ color: 0x00ff00, flatShading: true });\n }\n}\n","/**\n * Utility function to add water-like vertex displacement to an existing Three.js material.\n * @param {Material} material - The material to mutate, e.g., MeshStandardMaterial.\n * @param {Object} options - Options for water wave modification.\n * @param {number} [options.time=0.0] - The time value for the wave function.\n * @param {number} [options.waveFrequency=0.2] - The frequency of the water waves.\n * @param {number} [options.waveAmplitude=0.5] - The amplitude of the water waves.\n */\nexport function addWaterDisplacement(material, { time = 0.0, waveFrequency = 0.2, waveAmplitude = 0.5 } = {}) {\n material.onBeforeCompile = (shader) => {\n // Add uniforms for time, wave frequency, and wave amplitude\n shader.uniforms.time = { value: time };\n shader.uniforms.waveFrequency = { value: waveFrequency };\n shader.uniforms.waveAmplitude = { value: waveAmplitude };\n\n // Inject the water-like wave displacement code in the vertex shader\n shader.vertexShader = `\n uniform float time;\n uniform float waveFrequency;\n uniform float waveAmplitude;\n\n vec3 waterDisplacement(vec3 position, vec3 normal) {\n vec3 displaced = position;\n\n // Displace along the normal direction instead of local y-axis\n displaced += normal * (sin(position.x * waveFrequency + time) * waveAmplitude);\n displaced += normal * (cos(position.z * waveFrequency + time) * waveAmplitude);\n\n return displaced;\n }\n ` + shader.vertexShader;\n\n // Replace the vertex transformation logic to add displacement based on the normal\n shader.vertexShader = shader.vertexShader.replace(\n `#include <begin_vertex>`,\n `\n vec3 transformed = waterDisplacement(position, normal);\n `\n );\n\n // Store shader reference in material for time updates\n material.userData.shader = shader;\n };\n}\n\n/**\n * Updates the time uniform of the material's shader to animate the water effect.\n * @param {Material} material - The material to update.\n * @param {number} deltaTime - The time increment to add.\n */\nexport function updateWaterDisplacementTime(material, deltaTime) {\n if (material.userData.shader) {\n material.userData.shader.uniforms.time.value += deltaTime;\n }\n}\n","import { Direction } from \"../constants/Direction.js\";\n\n/**\n * Utility function to add noise-based vertex displacement to an existing Three.js material.\n * @param {Material} material - The material to mutate, e.g., MeshStandardMaterial.\n * @param {Object} options - Options for noise modification.\n * @param {number} [options.time=0.0] - The time value for the noise function.\n * @param {number} [options.intensity=1.0] - The intensity of the displacement.\n * @param {Vector3} [options.direction=new Vector3(1, 1, 1)] - The direction of displacement.\n * @param {number} [options.scale=10.0] - The scale of the noise effect.\n */\nexport function addNoiseDisplacement(material, { time = 0.0, intensity = 1.0, direction = Direction.XYZ, scale = 10.0 } = {}) {\n material.onBeforeCompile = (shader) => {\n // Add uniforms for time, direction, intensity, and scale\n shader.uniforms.time = { value: time };\n shader.uniforms.direction = { value: direction };\n shader.uniforms.intensity = { value: intensity };\n shader.uniforms.scale = { value: scale };\n\n // Add noise function and modify the vertex shader to displace vertices\n shader.vertexShader = `\n uniform float time;\n uniform vec3 direction;\n uniform float intensity;\n uniform float scale;\n\n float mod289(float x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 perm(vec4 x) { return mod289(((x * 34.0) + 1.0) * x); }\n\n float noise(vec3 p) {\n vec3 a = floor(p);\n vec3 d = p - a;\n d = d * d * (3.0 - 2.0 * d);\n\n vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0);\n vec4 k1 = perm(b.xyxy);\n vec4 k2 = perm(k1.xyxy + b.zzww);\n\n vec4 c = k2 + a.zzzz;\n vec4 k3 = perm(c);\n vec4 k4 = perm(c + 1.0);\n\n vec4 o1 = fract(k3 * (1.0 / 41.0));\n vec4 o2 = fract(k4 * (1.0 / 41.0));\n\n vec4 o3 = o2 * d.z + o1 * (1.0 - d.z);\n vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);\n\n return o4.y * d.y + o4.x * (1.0 - d.y);\n }\n ` + shader.vertexShader;\n\n // Replace the vertex transformation logic to add noise-based displacement\n shader.vertexShader = shader.vertexShader.replace(\n `#include <begin_vertex>`,\n `\n vec3 transformed = vec3(position);\n float n = noise(transformed * scale + time);\n transformed += normalize(direction) * n * intensity;\n vec3 transformedNormal = normal;\n `\n );\n\n // Store shader reference in material for time updates\n material.userData.shader = shader;\n };\n}\n\n/**\n * Updates the time uniform of the material's shader to animate the noise effect.\n * @param {Material} material - The material to update.\n * @param {number} deltaTime - The time increment to add.\n */\nexport function updateNoiseDisplacementTime(material, deltaTime) {\n if (material.userData.shader) {\n material.userData.shader.uniforms.time.value += deltaTime;\n }\n}\n","export const daySkyShader = {\n uniforms: {\n },\n vertexShader: `\n varying vec3 vPosition;\n void main() {\n vPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n varying vec3 vPosition;\n void main() {\n float y = normalize(vPosition).y * 0.5 + 0.5; // Normalizing y to range 0 to 1\n vec3 topColor = vec3(0.5, 0.8, 1.0); // Light blue\n vec3 bottomColor = vec3(1.0, 1.0, 1.0); // Light white/gray for the horizon\n gl_FragColor = vec4(mix(bottomColor, topColor, y), 1.0);\n }\n `,\n};\n","// Shader for fade effect\nexport const fadeShader = {\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1.0 },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float opacity;\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n vec4 texel = texture2D(tDiffuse, vUv);\n gl_FragColor = opacity * texel;\n }\n `,\n};\n","import { Color } from \"three\";\n\nexport const nightSkyShader = {\n uniforms: {\n topColor: { value: new Color(0x000033) },\n bottomColor: { value: new Color(0x000011) },\n offset: { value: 33 },\n exponent: { value: 0.6 },\n },\n vertexShader: `\n varying vec3 vWorldPosition;\n void main() {\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform vec3 topColor;\n uniform vec3 bottomColor;\n uniform float offset;\n uniform float exponent;\n varying vec3 vWorldPosition;\n void main() {\n float h = normalize(vWorldPosition + offset).y;\n gl_FragColor = vec4(mix(bottomColor, topColor, max(pow(max(h, 0.0), exponent), 0.0)), 1.0);\n }\n `,\n};\n","import { BackSide, BoxGeometry, Mesh, ShaderMaterial } from \"three\";\nimport { daySkyShader } from \"../shaders/daySkyShader.js\";\n\nclass DaySkybox extends Mesh {\n constructor(size = 1000) {\n super();\n\n this.geometry = new BoxGeometry(size, size, size);\n\n this.material = new ShaderMaterial({\n vertexShader: daySkyShader.vertexShader,\n fragmentShader: daySkyShader.fragmentShader,\n side: BackSide,\n });\n }\n}\n\nexport { DaySkybox };\n","import { BackSide, Mesh, ShaderMaterial, SphereGeometry } from \"three\";\nimport { nightSkyShader } from \"../shaders/nightSkyShader.js\";\n\nclass NightSkybox extends Mesh {\n constructor(size = 1000) {\n super();\n\n this.geometry = new SphereGeometry(size, 32, 15);\n\n this.material = new ShaderMaterial({\n vertexShader: nightSkyShader.vertexShader,\n fragmentShader: nightSkyShader.fragmentShader,\n uniforms: nightSkyShader.uniforms,\n side: BackSide,\n });\n }\n}\n\nexport { NightSkybox };\n","import { Mesh, Vector3 } from \"three\";\nimport { Sky } from \"three/addons/objects/Sky.js\";\n\nclass TwilightSkybox extends Mesh {\n constructor(\n theta = Math.PI * 0.49, // Elevation angle (0 to PI)\n phi = 2 * Math.PI * 0.25, // Azimuth angle (0 to 2*PI)\n turbidity = 10,\n rayleigh = 2,\n mieCoefficient = 0.005,\n mieDirectionalG = 0.8,\n ) {\n super();\n\n const sky = new Sky();\n sky.scale.setScalar(450000);\n this.add(sky);\n\n const skyUniforms = sky.material.uniforms;\n skyUniforms[\"turbidity\"].value = turbidity;\n skyUniforms[\"rayleigh\"].value = rayleigh;\n skyUniforms[\"mieCoefficient\"].value = mieCoefficient;\n skyUniforms[\"mieDirectionalG\"].value = mieDirectionalG;\n\n this.skyUniforms = skyUniforms;\n\n this.sunPosition(theta, phi);\n }\n\n sunPosition(theta, phi) {\n const sun = new Vector3();\n const skyUniforms = this.skyUniforms;\n\n sun.setFromSphericalCoords(1, theta, phi);\n skyUniforms[\"sunPosition\"].value.copy(sun);\n }\n}\n\nexport { TwilightSkybox };\n","import { DataTexture, NearestFilter, RepeatWrapping, RGBAFormat, UnsignedByteType } from \"three\";\n\n/**\n * Create a checkerboard texture\n * @param size\n * @returns {DataTexture}\n *\n * @example\n * const material = new MeshStandardMaterial();\n * material.map = createCheckerboardTexture(8);\n */\nexport const checkerboardTexture = (size) => {\n const data = new Uint8Array(4 * size * size);\n for (let i = 0; i < size * size; i++) {\n const stride = i * 4;\n const color = (i % size ^ Math.floor(i / size)) & 1 ? 255 : 0;\n data[stride] = color; // red\n data[stride + 1] = color; // green\n data[stride + 2] = color; // blue\n data[stride + 3] = 255; // alpha\n }\n\n const texture = new DataTexture(data, size, size, RGBAFormat, UnsignedByteType);\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n texture.minFilter = NearestFilter;\n texture.needsUpdate = true;\n\n return texture;\n};\n","import { Box3, Vector3 } from \"three\";\n\nexport function centerGroup(group) {\n const box = new Box3().setFromObject(group);\n const center = new Vector3();\n box.getCenter(center);\n group.position.sub(center);\n}\n\nexport function centerGroupAtTarget(group, target = new Vector3(0, 0, 0)) {\n const box = new Box3().setFromObject(group);\n const currentCenter = new Vector3();\n box.getCenter(currentCenter);\n\n const offset = new Vector3().subVectors(target, currentCenter);\n group.position.add(offset);\n}\n","import { Vector3 } from \"three\";\n\nexport function centerInstancedMesh(mesh) {\n mesh.computeBoundingBox();\n const box = mesh.boundingBox;\n const center = box.getCenter(new Vector3());\n\n mesh.translateX(-center.x);\n mesh.translateY(-center.y);\n mesh.translateZ(-center.z);\n}\n","import { Box3, Vector3 } from \"three\";\n\n/**\n * Centers the given mesh at the origin (0, 0, 0) of the scene by adjusting its position.\n * The mesh is moved so that its bounding box center is placed at the origin.\n */\nexport function centerMesh(mesh) {\n const box = new Box3().setFromObject(mesh);\n const center = box.getCenter(new Vector3());\n\n mesh.translateX(-center.x);\n mesh.translateY(-center.y);\n mesh.translateZ(-center.z);\n mesh.updateMatrixWorld(true);\n}\n\n/**\n * Centers the geometry of the given mesh at the local origin (0, 0, 0) by modifying the geometry vertices.\n * This method moves the geometry itself so that its center is at the local origin,\n * without affecting the position, rotation, or scale of the mesh.\n */\nexport function centerMeshGeometry(mesh) {\n mesh.geometry.computeBoundingBox();\n const box = mesh.geometry.boundingBox;\n const center = box.getCenter(new Vector3());\n\n mesh.geometry.translate(-center.x, -center.y, -center.z);\n}\n","import { EffectComposer } from \"three/addons/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/addons/postprocessing/RenderPass.js\";\nimport { ShaderPass } from \"three/addons/postprocessing/ShaderPass.js\";\nimport { fadeShader } from \"../shaders/fadeShader.js\";\n\nclass SceneUtils {\n static dispose(scene) {\n scene?.traverse((object) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) {\n if (Array.isArray(object.material)) {\n object.material.forEach((mat) => mat.dispose());\n } else {\n object.material.dispose();\n }\n }\n });\n }\n\n static fadeBetween(renderer, camera, scene1, scene2, duration = 1.0) {\n // Create composer and passes\n const composer = new EffectComposer(renderer);\n\n // Render pass for the initial scene\n const renderPass1 = new RenderPass(scene1, camera);\n composer.addPass(renderPass1);\n\n // Shader pass for fade effect\n const fadePass = new ShaderPass(fadeShader);\n fadePass.uniforms[\"opacity\"].value = 1.0;\n composer.addPass(fadePass);\n\n // Start fade out\n let startTime = null;\n\n function animateFadeOut(time) {\n if (!startTime) startTime = time;\n const elapsed = (time - startTime) / 1000;\n const progress = elapsed / duration;\n\n fadePass.uniforms[\"opacity\"].value = Math.max(1.0 - progress, 0.0);\n\n if (progress < 1.0) {\n composer.render();\n requestAnimationFrame(animateFadeOut);\n } else {\n // Switch to the new scene and start fade in\n composer.passes[0] = new RenderPass(scene2, camera);\n startTime = null;\n requestAnimationFrame(animateFadeIn);\n }\n }\n\n function animateFadeIn(time) {\n if (!startTime) startTime = time;\n const elapsed = (time - startTime) / 1000;\n const progress = elapsed / duration;\n\n fadePass.uniforms[\"opacity\"].value = Math.min(progress, 1.0);\n\n if (progress < 1.0) {\n composer.render();\n requestAnimationFrame(animateFadeIn);\n }\n }\n\n // Start the fade-out animation\n requestAnimationFrame(animateFadeOut);\n }\n}\n\nexport { SceneUtils };\n"],"names":["Direction","Vector3","Falloff","distance","radius","t","displacementBrush","geometry","position","strength","direction","falloffFn","positions","i","vertex","influence","flattenBrush","targetHeight","projectedHeight","delta","noiseBrush","falloff","noiseStrength","noise","MathUtils","smoothBrush","tempPosition","averagePosition","count","j","spikeBrush","inward","twistBrush","quaternion","Quaternion","angle","Easing","Bubbling","Group","bubbles","bubbleCount","bubbleGeometry","SphereGeometry","bubbleMaterial","MeshStandardMaterial","bubble","Mesh","animateBubbles","animate","BookGeometry","BufferGeometry","width","height","depth","coverThickness","pageIndent","w","h","d","vertices","normals","u1","u2","uvs","indices","normalArray","uvArray","indexArray","coverGeometry","BufferAttribute","pagesGeometry","BoxGeometry","mergeGeometries","randomFloat","min","max","randomInteger","logarithmicRandomMax","exponent","logarithmicRandomMin","randomScale","scaleXMin","scaleXMax","scaleYMin","scaleYMax","scaleZMin","scaleZMax","rowOfBooksByScales","coverMaterial","pagesMaterial","scales","row","InstancedMesh","matrix","Matrix4","currentZ","scale","scaleMatrix","rowOfBooksByCount","rowOfBooksByLength","length","remainingZ","BifurcatedStaircaseGeometry","stepWidth","stepHeight","stepDepth","numStepsCentral","numStepsBranch","branchAngle","yBottom","yTop","zFront","zBack","baseIndex","landingY","landingZ","landingWidth","landingBaseIndex","xStart","zStart","xOffset","zOffset","xFrontLeft","xFrontRight","xBackLeft","xBackRight","Float32BufferAttribute","DioramaGeometry","wallThickness","LShapedStaircaseGeometry","numStepsPerFlight","landingDepth","xFront","xBack","SpiralStaircaseGeometry","numSteps","angleIncrement","currentAngle","xCenter","zCenter","StaircaseGeometry","stepBottomY","stepTopY","stepFrontZ","stepBackZ","CrossHeadstoneGeometry","verticalHeight","verticalGeometry","horizontalWidth","horizontalGeometry","ObeliskHeadstoneGeometry","totalHeight","baseWidth","baseHeight","lowerSegmentHeight","middleSegmentHeight","topSegmentHeight","currentHeight","baseGeometry","lowerSegmentGeometry","middleSegmentGeometry","topSegmentGeometry","pyramidGeometry","ConeGeometry","RoundedHeadstoneGeometry","topGeometry","CylinderGeometry","SquareHeadstoneGeometry","slabGeometry","FenceColumnGeometry","columnGeometry","capGeometry","WroughtIronBarGeometry","barHeight","barRadius","spikeHeight","spikeRadius","spikeScaleZ","radialSegments","barGeometry","spikeGeometry","WroughtIronFenceGeometry","spacing","railHeight","railDepth","railOffset","geometries","bar","rail","topRail","bottomRail","BookshelfGeometry","shelves","frameThickness","open","frameHeight","frameWidth","frameDepth","sidePanelGeometry","shelfGeometry","leftPanel","rightPanel","topPanel","bottomPanel","backPanel","shelfPanels","shelfSpacing","shelfPanel","SimpleLeafGeometry","size","leafPoints","x","y","positionAttribute","randomTransformVertices","minScale","maxScale","mergeVertices","displacement","RockGeometry","widthSegments","heightSegments","sphere","BoneGeometry","radiusTop","radiusBottom","cylinderGeometry","sphereGeometry","topSphere1","topSphere2","bottomSphere1","bottomSphere2","BeakerGeometry","tubeGeometry","ErlenmeyerFlaskGeometry","flaskRadius","neckRadius","neckHeight","points","Vector2","flaskGeometry","LatheGeometry","MortarGeometry","mortarPoints","mortarGeometry","baseDisk","CircleGeometry","StandGeometry","thickness","ringGeometry","TorusGeometry","legGeometry","legs","leg","TestTubeGeometry","segments","openEnded","bottomGeometry","WineBottleGeometry","bodyHeight","bodyGeometry","shoulderHeight","shoulderGeometry","neckGeometry","HillGeometry","phiStart","phiLength","radiusFromCapHeight","thetaLength","radiusFromCapWidth","capHeightFromRadius","capWidthFromRadius","sphericalToCartesian","theta","phi","cartesianToSpherical","z","MoundGeometry","TreeGeometry","trunkRadiusTop","trunkRadiusBottom","trunkHeight","trunkSegments","leafSize","leafCount","leafDetail","leafSpreadRadius","trunk","leafs","leaf","DodecahedronGeometry","Moon","moonGeometry","moonMaterial","ShaderMaterial","moon","Book","coverColor","pageColor","CrossHeadstone","Mausoleum","baseMaterial","baseMesh","buildingGeometry","buildingMaterial","buildingMesh","roofGeometry","roofMaterial","roofMesh","pillarGeometry","pillarMaterial","pillarMesh","archShape","Shape","extrudeSettings","archGeometry","ExtrudeGeometry","archMaterial","archMesh","ObeliskHeadstone","RoundedHeadstone","SquareHeadstone","FenceColumn","WroughtIronBar","WroughtIronFence","Bookshelf","Desk","surfaceGeometry","surfaceMaterial","deskSurface","legMaterial","Candle","candleGeometry","candleMaterial","flameGeometry","flameMaterial","MeshBasicMaterial","PointLight","flicker","Lantern","bodyMaterial","bodyMesh","handleGeometry","handleMaterial","handleMesh","light","MossyRocks","rockGeometry","rockMaterial","mossMaterial","rockMesh","mossMesh","Rock","Rocks","Beaker","beakerGeometry","glassMaterial","MeshPhysicalMaterial","DoubleSide","beaker","Bottle","bottlePoints","bottleGeometry","corkGeometry","liquidMaterial","corkMaterial","bottle","liquid","cork","potionBottle","BunsenBurner","base","tubeMaterial","tube","flame","ElectricPanel","panelGeometry","panelMaterial","switchGeometry","switchMaterial","dialGeometry","dialMaterial","panel","toggleSwitch","dial","lightGeometry","lightMaterial","flickerSpeed","flickerMaxIntensity","flickerMinIntensity","flickerIntensity","ErlenmeyerFlask","Flask","flaskPoints","flask","LeverPanel","leverPanelGeometry","leverPanelMaterial","leverPanel","leverBaseGeometry","leverHandleGeometry","leverMaterial","leverBase","leverHandle","Microscope","armGeometry","arm","eyepieceGeometry","eyepieceMaterial","eyepiece","stageGeometry","stageMaterial","stage","MortarAndPestle","pestleGeometry","mortarMaterial","pestleMaterial","mortar","pestle","SpiralTube","spiralLength","heightIncrement","curve","CatmullRomCurve3","_","TubeGeometry","multiSpiralTube","animateFluid","Stand","TeslaCoil","coilBaseGeometry","coilBaseMaterial","coilBase","coilGeometry","coilMaterial","coil","coilTopGeometry","coilTop","sparks","sparkMaterial","LineBasicMaterial","sparkGeometry","spark","Line","animateSparks","TestTube","TestTubeRack","colors","rackGeometry","rackMaterial","rack","testTubeGeometry","testTube","xPosition","liquidGeometry","liquidColor","WineBottle","wineBottle","bottleMaterial","BurstShape","sides","innerRadius","outerRadius","step","halfStep","qtrStep","n","cx","cy","dx","dy","Burst","shape","material","GearShape","holeSides","holeRadius","hole","Path","holeStep","Gear","HeartShape","tipDepth","Heart","StarShape","Star","Bone","Tree","trunkColor","leafColor","treeGeometry","trunkMaterial","leafMaterial","Hill","Mound","addWaterDisplacement","time","waveFrequency","waveAmplitude","shader","updateWaterDisplacementTime","deltaTime","addNoiseDisplacement","intensity","updateNoiseDisplacementTime","daySkyShader","fadeShader","nightSkyShader","Color","DaySkybox","BackSide","NightSkybox","TwilightSkybox","turbidity","rayleigh","mieCoefficient","mieDirectionalG","sky","Sky","skyUniforms","sun","checkerboardTexture","data","stride","color","texture","DataTexture","RGBAFormat","UnsignedByteType","RepeatWrapping","NearestFilter","centerGroup","group","box","Box3","center","centerGroupAtTarget","target","currentCenter","offset","centerInstancedMesh","mesh","centerMesh","centerMeshGeometry","SceneUtils","scene","object","mat","renderer","camera","scene1","scene2","duration","composer","EffectComposer","renderPass1","RenderPass","fadePass","ShaderPass","startTime","animateFadeOut","progress","animateFadeIn"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/constants/Direction.js","../src/constants/Falloff.js","../src/brushes/DisplacementBrush.js","../src/brushes/FlattenBrush.js","../src/brushes/NoiseBrush.js","../src/brushes/SmoothBrush.js","../src/brushes/SpikeBrush.js","../src/brushes/TwistBrush.js","../src/constants/Easing.js","../src/constants/ParametricCurve.js","../src/effects/Bubbling.js","../src/geometry/books/BookGeometry.js","../src/utils/RandomNumberUtils.js","../src/factory/BookFactory.js","../src/geometry/architecture/BifurcatedStaircaseGeometry.js","../src/geometry/architecture/DioramaGeometry.js","../src/geometry/architecture/LShapedStaircaseGeometry.js","../src/geometry/architecture/SpiralStaircaseGeometry.js","../src/geometry/architecture/StaircaseGeometry.js","../src/geometry/cemetery/CrossHeadstoneGeometry.js","../src/geometry/cemetery/ObeliskHeadstoneGeometry.js","../src/geometry/cemetery/RoundedHeadstoneGeometry.js","../src/geometry/cemetery/SquareHeadstoneGeometry.js","../src/geometry/fence/FenceColumnGeometry.js","../src/geometry/fence/WroughtIronBarGeometry.js","../src/geometry/fence/WroughtIronFenceGeometry.js","../src/geometry/furniture/BookshelfGeometry.js","../src/geometry/leafs/SimpleLeafGeometry.js","../src/utils/VertexUtils.js","../src/geometry/rocks/RockGeometry.js","../src/geometry/skeleton/BoneGeometry.js","../src/geometry/science/BeakerGeometry.js","../src/geometry/science/ErlenmeyerFlaskGeometry.js","../src/geometry/science/MortarGeometry.js","../src/geometry/science/StandGeometry.js","../src/geometry/science/TestTubeGeometry.js","../src/geometry/science/WineBottleGeometry.js","../src/geometry/terrain/HillGeometry.js","../src/utils/SphericalGeometryUtils.js","../src/geometry/terrain/MoundGeometry.js","../src/geometry/trees/TreeGeometry.js","../src/models/astronomy/Moon.js","../src/models/books/Book.js","../src/models/cemetery/CrossHeadstone.js","../src/models/cemetery/Mausoleum.js","../src/models/cemetery/ObeliskHeadstone.js","../src/models/cemetery/RoundedHeadstone.js","../src/models/cemetery/SquareHeadstone.js","../src/models/fence/FenceColumn.js","../src/models/fence/WroughtIronBar.js","../src/models/fence/WroughtIronFence.js","../src/models/furniture/Bookshelf.js","../src/models/furniture/Desk.js","../src/models/lighting/Candle.js","../src/models/lighting/Lantern.js","../src/models/rocks/MossyRocks.js","../src/models/rocks/Rock.js","../src/models/rocks/Rocks.js","../src/models/science/Beaker.js","../src/models/science/Bottle.js","../src/models/science/BunsenBurner.js","../src/models/science/ElectricPanel.js","../src/models/science/ErlenmeyerFlask.js","../src/models/science/Flask.js","../src/models/science/LeverPanel.js","../src/models/science/Microscope.js","../src/models/science/MortarAndPestle.js","../src/models/science/SpiralTube.js","../src/models/science/Stand.js","../src/models/science/TeslaCoil.js","../src/models/science/TestTube.js","../src/models/science/TestTubeRack.js","../src/models/science/WineBottle.js","../src/shapes/BurstShape.js","../src/models/shapes/Burst.js","../src/shapes/GearShape.js","../src/models/shapes/Gear.js","../src/shapes/HeartShape.js","../src/models/shapes/Heart.js","../src/shapes/StarShape.js","../src/models/shapes/Star.js","../src/models/skeleton/Bone.js","../src/models/trees/Tree.js","../src/models/terrain/Hill.js","../src/models/terrain/Mound.js","../src/shaders/addWaterDisplacement.js","../src/shaders/addNoiseDisplacement.js","../src/shaders/daySkyShader.js","../src/shaders/fadeShader.js","../src/shaders/nightSkyShader.js","../src/skybox/DaySkybox.js","../src/skybox/NightSkybox.js","../src/skybox/TwilightSkybox.js","../src/textures/checkerboard.js","../src/utils/GroupUtils.js","../src/utils/InstancedMeshUtils.js","../src/utils/InterpolateCurve.js","../src/utils/MeshUtils.js","../src/utils/ParametricCurveUtils.js","../src/utils/SceneUtils.js"],"sourcesContent":["import { Vector3 } from \"three\";\n\nexport const Direction = {\n UP: new Vector3(0, 1, 0),\n DOWN: new Vector3(0, -1, 0),\n LEFT: new Vector3(-1, 0, 0),\n RIGHT: new Vector3(1, 0, 0),\n FORWARD: new Vector3(0, 0, 1),\n BACKWARD: new Vector3(0, 0, -1),\n X: new Vector3(1, 0, 0),\n Y: new Vector3(0, 1, 0),\n Z: new Vector3(0, 0, 1),\n XY: new Vector3(1, 1, 0).normalize(),\n XZ: new Vector3(1, 0, 1).normalize(),\n YZ: new Vector3(0, 1, 1).normalize(),\n XYZ: new Vector3(1, 1, 1).normalize(),\n};\n","export const Falloff = {\n LINEAR: (distance, radius) => 1 - distance / radius,\n QUADRATIC: (distance, radius) => Math.pow(1 - distance / radius, 2),\n SQUARE_ROOT: (distance, radius) => Math.pow(1 - distance / radius, 0.5),\n LOGARITHMIC: (distance, radius) => Math.log(1 + (radius - distance)) / Math.log(1 + radius),\n SINE: (distance, radius) => Math.cos(((distance / radius) * Math.PI) / 2),\n EXPONENTIAL: (distance, radius) => Math.exp(-distance / radius),\n CUBIC: (distance, radius) => Math.pow(1 - distance / radius, 3),\n GAUSSIAN: (distance, radius) => Math.exp(-Math.pow(distance, 2) / (2 * Math.pow(radius / 3, 2))),\n INVERSE: (distance, radius) => radius / (radius + distance),\n SMOOTHSTEP: (distance, radius) => {\n const t = Math.max(0, Math.min(1, 1 - distance / radius));\n return t * t * (3 - 2 * t);\n },\n};\n","import { Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Moves vertices within a specified radius around a target position along a given direction\n */\nexport const displacementBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength;\n\n // Apply the effect (e.g., pulling the vertex upwards)\n vertex.add(direction.clone().multiplyScalar(influence));\n\n // Update the vertex position\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import {Direction} from \"../constants/Direction.js\";\nimport {Vector3} from \"three\";\nimport {Falloff} from \"../constants/Falloff.js\";\n\n/**\n * Flattens vertices to a given plane defined by a target height or normal direction.\n */\nexport const flattenBrush = (geometry, position, radius, targetHeight, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength;\n\n // Project vertex onto flatten plane\n const projectedHeight = vertex.dot(direction.normalize());\n const delta = targetHeight - projectedHeight;\n\n vertex.add(direction.clone().multiplyScalar(delta * influence));\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { MathUtils, Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Adds random noise to the vertices within the specified radius to create a more rugged or natural look.\n */\nexport const noiseBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n const falloff = falloffFn(distance, radius);\n const noiseStrength = strength * falloff;\n\n // Generate random noise in the direction specified\n const noise = direction.clone().normalize();\n vertex.x += MathUtils.randFloatSpread(noiseStrength) * noise.x;\n vertex.y += MathUtils.randFloatSpread(noiseStrength) * noise.y;\n vertex.z += MathUtils.randFloatSpread(noiseStrength) * noise.z;\n\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { Vector3 } from \"three\";\n\n/**\n * Smooths out the vertices by averaging their positions with neighboring vertices within a given radius.\n */\nexport const smoothBrush = (geometry, position, radius, strength) => {\n const positions = geometry.attributes.position;\n const tempPosition = new Vector3();\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n let averagePosition = new Vector3();\n let count = 0;\n\n // Average position of nearby vertices\n for (let j = 0; j < positions.count; j++) {\n tempPosition.fromBufferAttribute(positions, j);\n if (tempPosition.distanceTo(vertex) < radius) {\n averagePosition.add(tempPosition);\n count++;\n }\n }\n\n if (count > 0) {\n averagePosition.divideScalar(count);\n vertex.lerp(averagePosition, strength); // Blend between current and average\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n }\n positions.needsUpdate = true;\n};\n","import { Falloff } from \"../constants/Falloff.js\";\nimport { Vector3 } from \"three\";\n\n/**\n * Creates spikes or depressions centered on the target position, pushing vertices away or pulling them towards the center.\n */\nexport const spikeBrush = (geometry, position, radius, strength, inward = false, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff\n const falloff = falloffFn(distance, radius);\n const influence = falloff * strength * (inward ? -1 : 1);\n\n // Move the vertex along the direction from the center\n const direction = vertex.clone().sub(position).normalize();\n vertex.add(direction.multiplyScalar(influence));\n\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","import { Quaternion, Vector3 } from \"three\";\nimport { Direction } from \"../constants/Direction.js\";\nimport { Falloff } from \"../constants/Falloff.js\";\n\n/**\n * Applies a twisting force to the vertices, rotating them around the direction defined by the target position.\n */\nexport const twistBrush = (geometry, position, radius, strength, direction = Direction.UP, falloffFn = Falloff.LINEAR) => {\n const positions = geometry.attributes.position;\n const quaternion = new Quaternion();\n\n for (let i = 0; i < positions.count; i++) {\n const vertex = new Vector3();\n vertex.fromBufferAttribute(positions, i);\n const distance = vertex.distanceTo(position);\n\n if (distance < radius) {\n // Calculate falloff and rotation angle\n const falloff = falloffFn(distance, radius);\n const angle = falloff * strength;\n\n // Create quaternion for rotation around the axis\n quaternion.setFromAxisAngle(direction, angle);\n\n // Apply twist rotation\n vertex.sub(position).applyQuaternion(quaternion).add(position);\n positions.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n }\n positions.needsUpdate = true;\n};\n","export const sineEaseIn = (t) => 1 - Math.cos((t * Math.PI) / 2);\nexport const sineEaseOut = (t) => Math.sin((t * Math.PI) / 2);\nexport const sineEaseInOut = (t) => -0.5 * (Math.cos(Math.PI * t) - 1);\n\nexport const quadraticEaseIn = (t) => t * t;\nexport const quadraticEaseOut = (t) => 1 - Math.pow(1 - t, 2);\nexport const quadraticEaseInOut = (t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\n\nexport const cubicEaseIn = (t) => t * t * t;\nexport const cubicEaseOut = (t) => 1 - Math.pow(1 - t, 3);\nexport const cubicEaseInOut = (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\n\nexport const quarticEaseIn = (t) => t * t * t * t;\nexport const quarticEaseOut = (t) => 1 - Math.pow(1 - t, 4);\nexport const quarticEaseInOut = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2);\n\nexport const quinticEaseIn = (t) => t * t * t * t * t;\nexport const quinticEaseOut = (t) => 1 - Math.pow(1 - t, 5);\nexport const quinticEaseInOut = (t) => (t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2);\n\nexport const exponentialEaseIn = (t) => (t === 0 ? 0 : Math.pow(2, 10 * t - 10));\nexport const exponentialEaseOut = (t) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\nexport const exponentialEaseInOut = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2;\n};\n\nexport const circularEaseIn = (t) => 1 - Math.sqrt(1 - Math.pow(t, 2));\nexport const circularEaseOut = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\nexport const circularEaseInOut = (t) =>\n t < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n\nexport const linear = (t) => t;\nexport const smoothstep = (t) => t * t * (3 - 2 * t);\nexport const concave = (t) => 1 - Math.pow(1 - t, 0.3);\nexport const convex = (t) => Math.pow(t, 0.3);\nexport const logarithmic = (t) => Math.log(Math.max(0.01, t)) / Math.log(2);\nexport const squareRoot = (t) => Math.sqrt(t);\nexport const inverse = (t) => 1 - t;\nexport const gaussian = (t) => {\n const sigma = 0.5;\n return Math.exp(-Math.pow(t - 0.5, 2) / (2 * sigma));\n};\n\n/**\n * Easing functions for interpolating values over time.\n */\nexport const Easing = {\n SINE_EASE_IN: sineEaseIn,\n SINE_EASE_OUT: sineEaseOut,\n SINE_EASE_IN_OUT: sineEaseInOut,\n QUADRATIC_EASE_IN: quadraticEaseIn,\n QUADRATIC_EASE_OUT: quadraticEaseOut,\n QUADRATIC_EASE_IN_OUT: quadraticEaseInOut,\n CUBIC_EASE_IN: cubicEaseIn,\n CUBIC_EASE_OUT: cubicEaseOut,\n CUBIC_EASE_IN_OUT: cubicEaseInOut,\n QUARTIC_EASE_IN: quarticEaseIn,\n QUARTIC_EASE_OUT: quarticEaseOut,\n QUARTIC_EASE_IN_OUT: quarticEaseInOut,\n QUINTIC_EASE_IN: quinticEaseIn,\n QUINTIC_EASE_OUT: quinticEaseOut,\n QUINTIC_EASE_IN_OUT: quinticEaseInOut,\n EXPONENTIAL_EASE_IN: exponentialEaseIn,\n EXPONENTIAL_EASE_OUT: exponentialEaseOut,\n EXPONENTIAL_EASE_IN_OUT: exponentialEaseInOut,\n CIRCULAR_EASE_IN: circularEaseIn,\n CIRCULAR_EASE_OUT: circularEaseOut,\n CIRCULAR_EASE_IN_OUT: circularEaseInOut,\n LINEAR: linear,\n SMOOTHSTEP: smoothstep,\n CONCAVE: concave,\n CONVEX: convex,\n LOGARITHMIC: logarithmic,\n SQUARE_ROOT: squareRoot,\n INVERSE: inverse,\n GAUSSIAN: gaussian,\n};\n","export const parabolicCurve = (t, a = 1, b = 0, c = 0) => {\n const clampedT = Math.max(0, Math.min(1, t));\n return a * clampedT * clampedT + b * clampedT + c;\n};\n\nexport const dampedCurve = (t, damping = 1) => {\n const clampedDamping = Math.max(0.001, damping); // Avoid zero or negative damping\n return (1 - Math.exp(-clampedDamping * t)) / (1 - Math.exp(-clampedDamping));\n};\n\nexport const quadraticCurve = (t, p0, p1, p2) => {\n const clampedT = Math.max(0, Math.min(1, t));\n const oneMinusT = 1 - clampedT;\n return oneMinusT * oneMinusT * p0 + 2 * oneMinusT * clampedT * p1 + clampedT * clampedT * p2;\n};\n\nexport const cubicCurve = (t, p0, p1, p2, p3) => {\n const clampedT = Math.max(0, Math.min(1, t));\n const oneMinusT = 1 - clampedT;\n return (\n oneMinusT * oneMinusT * oneMinusT * p0 +\n 3 * oneMinusT * oneMinusT * clampedT * p1 +\n 3 * oneMinusT * clampedT * clampedT * p2 +\n clampedT * clampedT * clampedT * p3\n );\n};\n\nexport const exponentialCurve = (t, base = 1, factor = 1) => {\n const clampedT = Math.max(0, Math.min(1, t));\n return base * Math.pow(clampedT, factor);\n};\n\nexport const logarithmicCurve = (t, base = 1, factor = 1) => {\n const clampedT = Math.max(0.001, Math.min(1, t)); // Avoid log(0)\n return base * Math.log(factor * clampedT + 1);\n};\n\nexport const sigmoidCurve = (t, a = 10) => {\n const clampedT = Math.max(0, Math.min(1, t));\n return 1 / (1 + Math.exp(-a * (clampedT - 0.5)));\n};\n\nexport const ParametricCurve = {\n PARABOLIC: parabolicCurve,\n DAMPED: dampedCurve,\n QUADRATIC: quadraticCurve,\n CUBIC: cubicCurve,\n EXPONENTIAL: exponentialCurve,\n LOGARITHMIC: logarithmicCurve,\n SIGMOID: sigmoidCurve,\n};\n","import {Group, Mesh, MeshStandardMaterial, SphereGeometry} from \"three\";\n\nclass Bubbling extends Group {\n constructor() {\n super();\n\n // Bubble properties\n const bubbles = [];\n const bubbleCount = 20; // Number of bubbles\n\n // Create bubble geometry and material\n const bubbleGeometry = new SphereGeometry(0.1, 6, 6); // Small spheres\n const bubbleMaterial = new MeshStandardMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.6,\n roughness: 0.3,\n metalness: 0.3,\n });\n\n for (let i = 0; i < bubbleCount; i++) {\n const bubble = new Mesh(bubbleGeometry, bubbleMaterial);\n bubble.position.set(\n (Math.random() - 0.5) * 1.5, // Random x position within flask\n Math.random() * 3, // Random y position within flask height\n (Math.random() - 0.5) * 1.5, // Random z position within flask\n );\n bubbles.push(bubble);\n this.add(bubble);\n }\n\n // Bubble animation loop\n function animateBubbles() {\n bubbles.forEach((bubble) => {\n bubble.position.y += 0.02; // Move bubble upwards\n\n // Reset bubble to bottom if it reaches top\n if (bubble.position.y > 3) {\n bubble.position.y = 0;\n bubble.position.x = (Math.random() - 0.5) * 1.5; // Randomize x position again\n bubble.position.z = (Math.random() - 0.5) * 1.5; // Randomize z position again\n }\n });\n }\n\n // Add animateBubbles to the main render loop\n function animate() {\n requestAnimationFrame(animate);\n animateBubbles(); // Update bubble positions\n }\n\n animate();\n }\n}\n\nexport { Bubbling };\n","import { BoxGeometry, BufferAttribute, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class BookGeometry extends BufferGeometry {\n constructor(width = 1, height = 1.5, depth = 0.5, coverThickness = 0.05, pageIndent = 0.05) {\n super();\n\n const w = width;\n const h = height;\n const d = depth;\n const t = coverThickness;\n const i = pageIndent;\n\n const vertices = [\n // Front cover\n 0, 0, 0,\n w, 0, 0,\n w, h, 0,\n 0, h, 0,\n\n // Back cover\n w, 0, -d,\n 0, 0, -d,\n 0, h, -d,\n w, h, -d,\n\n // Spine\n 0, 0, -d,\n 0, 0, 0,\n 0, h, 0,\n 0, h, -d,\n\n // Inside front cover\n w, 0, -t,\n t, 0, -t,\n t, h, -t,\n w, h, -t,\n\n // Inside back cover\n t, 0, -d + t,\n w, 0, -d + t,\n w, h, -d + t,\n t, h, -d + t,\n\n // Inside spine\n t, 0, -t,\n t, 0, -d + t,\n t, h, -d + t,\n t, h, -t,\n\n // Front cover top\n 0, h, 0,\n w, h, 0,\n w, h, -t,\n t, h, -t,\n\n // Back cover top\n 0, h, -d,\n t, h, -d + t,\n w, h, -d + t,\n w, h, -d,\n\n // Spine cover top\n 0, h, 0,\n t, h, -t,\n t, h, -d + t,\n 0, h, -d,\n\n // Front cover bottom\n 0, 0, 0,\n t, 0, -t,\n w, 0, -t,\n w, 0, 0,\n\n // Back cover bottom\n 0, 0, -d,\n w, 0, -d,\n w, 0, -d + t,\n t, 0, -d + t,\n\n // Spine cover bottom\n 0, 0, 0,\n 0, 0, -d,\n t, 0, -d + t,\n t, 0, -t,\n\n // Front cover edge\n w, 0, 0,\n w, 0, -t,\n w, h, -t,\n w, h, 0,\n\n // Back cover edge\n w, 0, -d,\n w, h, -d,\n w, h, -d + t,\n w, 0, -d + t,\n ];\n\n\n\n const normals = [\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // Front cover\n 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, // Back cover\n -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // Spine\n 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, // Inside front cover\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // Inside back cover\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Inside spine\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Front cover top\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Back cover top\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // Spine cover top\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Front cover bottom\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Back cover bottom\n 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // Spine cover bottom\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Front cover edge\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // Back cover edge\n ];\n\n const u1 = width / ((width * 2) + depth);\n const u2 = (width + depth) / ((width * 2) + depth);\n\n const uvs = [\n u2,0, 1,0, 1,1, u2,1, // Front cover\n 0,0, u1,0, u1,1, 0,1, // Back cover\n u1,0, u2,0, u2,1, u1,1, // Spine\n 1,0, u2,0, u2,1, 1,1, // Inside front cover\n u1,0, 0,0, 0,1, u1,1, // Inside back cover\n u2,0, u1,0, u1,1, u2,1, // Inside spine\n u2,0, 1,0, 1,1, u2,1, // Front cover top\n 0,0, 1,0, 1,1, 0,1, // Back cover top\n 0,0, 1,0, 1,1, 0,1, // Spine cover top\n 0,0, 1,0, 1,1, 0,1, // Front cover bottom\n 0,0, 1,0, 1,1, 0,1, // Back cover bottom\n 0,0, 1,0, 1,1, 0,1, // Spine cover bottom\n 0,0, 1,0, 1,1, 0,1, // Front cover edge\n 0,0, 1,0, 1,1, 0,1, // Back cover edge\n ];\n\n const indices = [\n 0, 1, 2, 0, 2, 3, // Front cover face\n 4, 5, 6, 4, 6, 7, // Back cover face\n 8, 9, 10, 8, 10, 11, // Spine face\n 12, 13, 14, 12, 14, 15, // Inside front cover\n 16, 17, 18, 16, 18, 19, // Inside back cover\n 20, 21, 22, 20, 22, 23, // Inside spine\n 24, 25, 26, 24, 26, 27, // Front cover top\n 28, 29, 30, 28, 30, 31, // Back cover top\n 32, 33, 34, 32, 34, 35, // Spine cover top\n 36, 37, 38, 36, 38, 39, // Front cover bottom\n 40, 41, 42, 40, 42, 43, // Back cover bottom\n 44, 45, 46, 44, 46, 47, // Spine cover bottom\n 48, 49, 50, 48, 50, 51, // Front cover edge\n 52, 53, 54, 52, 54, 55, // Back cover edge\n ];\n\n const positions = new Float32Array(vertices);\n const normalArray = new Float32Array(normals);\n const uvArray = new Float32Array(uvs);\n const indexArray = new Uint16Array(indices);\n\n const coverGeometry = new BufferGeometry();\n coverGeometry.setAttribute('position', new BufferAttribute(positions, 3));\n coverGeometry.setAttribute('normal', new BufferAttribute(normalArray, 3));\n coverGeometry.setAttribute('uv', new BufferAttribute(uvArray, 2));\n coverGeometry.setIndex(new BufferAttribute(indexArray, 1));\n\n const pagesGeometry = new BoxGeometry(width - t - i, h - i * 2, d - t * 2);\n pagesGeometry.translate((width - t - i) / 2 + t, h / 2, -d / 2 );\n this.copy(mergeGeometries([coverGeometry, pagesGeometry], true));\n }\n}\n","/**\n * Generates a random number between `min` and `max`.\n */\nexport function randomFloat(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n}\n\n/**\n * Generates a random integer between `min` and `max`.\n */\nexport function randomInteger(min = 0, max = 1) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * Generates a random number skewed towards the maximum value.\n *\n * @param {number} [exponent=0.5] - Controls the skew of the distribution.\n * A smaller value (e.g., 0.3) skews the values towards the max.\n * A larger value (e.g., 0.8) creates a more even distribution.\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards `max`.\n */\nexport function logarithmicRandomMax(exponent = 0.5, min = 0, max = 1) {\n return min + (max - min) * Math.pow(Math.random(), exponent);\n}\n\n/**\n * Generates a random number skewed towards the minimum value.\n *\n * @param {number} [exponent=0.5] - Controls the skew of the distribution.\n * A smaller value (e.g., 0.3) skews the values towards the min.\n * A larger value (e.g., 0.8) creates a more even distribution.\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards `min`.\n */\nexport function logarithmicRandomMin(exponent = 0.5, min = 0, max = 1) {\n return min + (max - min) * Math.pow(1 - Math.random(), exponent);\n}\n\n/**\n * Generates a random number with an inverse logarithmic distribution, biased towards the maximum value.\n *\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards the maximum.\n */\n\nfunction inverseLogarithmicRandomMax(min = 0, max = 1) {\n // Generate the inverse-logarithmic skewed value between 0 and 1\n const randomValue = 1 - Math.log(1 - Math.random()) / Math.log(2);\n\n // Scale it to the desired range [min, max]\n return min + (max - min) * randomValue;\n}\n\n/**\n * Generates a random number with an inverse logarithmic distribution, biased towards the minimum value.\n *\n * @param {number} [min=0] - Minimum value of the range.\n * @param {number} [max=1] - Maximum value of the range.\n * @returns {number} A random number between `min` and `max`, skewed towards the minimum.\n */\nfunction inverseLogarithmicRandomMin(min = 0, max = 1) {\n // Generate the inverse-logarithmic skewed value between 0 and 1, but reverse it to bias towards the minimum\n const randomValue = Math.log(1 - Math.random()) / Math.log(2);\n const adjustedValue = -randomValue;\n\n // Clamp the adjusted value between 0 and 1 to prevent out-of-range values\n const clampedValue = Math.min(Math.max(adjustedValue, 0), 1);\n\n // Scale it to the desired range [min, max]\n return min + (max - min) * clampedValue;\n}\n","import { BookGeometry } from \"../geometry/books/BookGeometry.js\";\nimport { InstancedMesh, Matrix4, Vector3 } from \"three\";\nimport { logarithmicRandomMax, logarithmicRandomMin, randomFloat } from \"../utils/RandomNumberUtils.js\";\n\nfunction randomScale({\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n return new Vector3(\n randomFloat(scaleXMin, scaleXMax),\n logarithmicRandomMax(0.25, scaleYMin, scaleYMax),\n logarithmicRandomMin(0.8, scaleZMin, scaleZMax),\n );\n}\n\n/**\n * Creates a row of books from the scales array of Vector3.\n */\nexport function rowOfBooksByScales({ coverMaterial, pagesMaterial, scales = [] } = {}) {\n const geometry = new BookGeometry();\n const row = new InstancedMesh(geometry, [coverMaterial, pagesMaterial], scales.length);\n const matrix = new Matrix4();\n let currentZ = 0;\n\n for (let i = 0; i < scales.length; i++) {\n const scale = scales[i];\n const scaleMatrix = new Matrix4();\n scaleMatrix.makeScale(scale.x, scale.y, scale.z);\n matrix.identity();\n matrix.multiply(scaleMatrix);\n matrix.setPosition(0.01 + Math.random() * 0.1, 0, currentZ + scale.z * 0.5);\n row.setMatrixAt(i, matrix);\n currentZ += scale.z * 0.5;\n }\n return row;\n}\n\n/**\n * Creates a row of books with a given count.\n */\nexport function rowOfBooksByCount({\n coverMaterial,\n pagesMaterial,\n count = 10,\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n const scales = Array.from({ length: count }, () =>\n randomScale({ scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax }),\n );\n\n return rowOfBooksByScales({ coverMaterial, pagesMaterial, scales });\n}\n\n/**\n * Creates a row of books with a total length.\n */\nexport function rowOfBooksByLength({\n coverMaterial,\n pagesMaterial,\n length = 10,\n scaleXMin = 0.4,\n scaleXMax = 0.7,\n scaleYMin = 0.3,\n scaleYMax = 0.95,\n scaleZMin = 0.1,\n scaleZMax = 0.5,\n} = {}) {\n const scales = [];\n let remainingZ = length;\n while (remainingZ > 0) {\n const scale = randomScale({ scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax });\n scale.z = Math.min(scale.z, remainingZ);\n scales.push(scale);\n remainingZ -= scale.z;\n }\n\n return rowOfBooksByScales({ coverMaterial, pagesMaterial, scales });\n}\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass BifurcatedStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 2, stepHeight = 0.3, stepDepth = 0.6, numStepsCentral = 5, numStepsBranch = 5, branchAngle = Math.PI / 4) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate central flight of steps\n for (let i = 0; i < numStepsCentral; i++) {\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n const zFront = i * stepDepth;\n const zBack = zFront + stepDepth;\n\n // Central flight of steps (8 vertices per step)\n vertices.push(\n // Vertical riser\n -stepWidth / 2, yBottom, zFront, // Bottom-left\n stepWidth / 2, yBottom, zFront, // Bottom-right\n stepWidth / 2, yTop, zFront, // Top-right\n -stepWidth / 2, yTop, zFront, // Top-left\n\n // Horizontal tread\n -stepWidth / 2, yTop, zFront, // Top-left\n stepWidth / 2, yTop, zFront, // Top-right\n stepWidth / 2, yTop, zBack, // Back-right\n -stepWidth / 2, yTop, zBack // Back-left\n );\n\n const baseIndex = i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Landing platform\n const landingY = numStepsCentral * stepHeight;\n const landingZ = numStepsCentral * stepDepth;\n const landingWidth = stepWidth * 2;\n\n vertices.push(\n // Landing platform (4 vertices)\n -landingWidth / 2, landingY, landingZ, // Bottom-left\n landingWidth / 2, landingY, landingZ, // Bottom-right\n landingWidth / 2, landingY, landingZ + stepDepth,// Top-right\n -landingWidth / 2, landingY, landingZ + stepDepth // Top-left\n );\n\n const landingBaseIndex = numStepsCentral * 8;\n indices.push(\n landingBaseIndex, landingBaseIndex + 1, landingBaseIndex + 2, // First triangle for landing\n landingBaseIndex, landingBaseIndex + 2, landingBaseIndex + 3 // Second triangle for landing\n );\n\n // Generate branching flights (left and right)\n for (let j = 0; j < 2; j++) {\n const direction = j === 0 ? 1 : -1; // Left or right branch\n\n for (let i = 0; i < numStepsBranch; i++) {\n const yBottom = landingY + i * stepHeight;\n const yTop = yBottom + stepHeight;\n\n // Calculate positions for the branching steps\n const xStart = direction * (landingWidth / 4);\n const zStart = landingZ + stepDepth;\n\n const xOffset = i * stepDepth * Math.cos(branchAngle);\n const zOffset = i * stepDepth * Math.sin(branchAngle);\n\n const xFrontLeft = xStart + direction * xOffset - (stepWidth / 2) * Math.cos(branchAngle);\n const xFrontRight = xStart + direction * xOffset + (stepWidth / 2) * Math.cos(branchAngle);\n const zFront = zStart + zOffset;\n const xBackLeft = xFrontLeft + direction * stepDepth * Math.cos(branchAngle);\n const xBackRight = xFrontRight + direction * stepDepth * Math.cos(branchAngle);\n const zBack = zFront + stepDepth * Math.sin(branchAngle);\n\n // Branch flight of steps (8 vertices per step)\n vertices.push(\n // Vertical riser\n xFrontLeft, yBottom, zFront, // Bottom-left\n xFrontRight, yBottom, zFront, // Bottom-right\n xFrontRight, yTop, zFront, // Top-right\n xFrontLeft, yTop, zFront, // Top-left\n\n // Horizontal tread\n xFrontLeft, yTop, zFront, // Top-left\n xFrontRight, yTop, zFront, // Top-right\n xBackRight, yTop, zBack, // Back-right\n xBackLeft, yTop, zBack // Back-left\n );\n\n const baseIndex = landingBaseIndex + 4 + j * numStepsBranch * 8 + i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { BifurcatedStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass DioramaGeometry extends BufferGeometry {\n constructor(width = 5, height = 3, depth = 5, wallThickness = 0.2) {\n super();\n\n // Vertices array (each set of 3 numbers represents x, y, z of a vertex)\n const vertices = [\n // Floor vertices\n -width / 2, 0, -depth / 2, // 0\n width / 2, 0, -depth / 2, // 1\n width / 2, 0, depth / 2, // 2\n -width / 2, 0, depth / 2, // 3\n\n // Back wall vertices\n -width / 2, 0, -depth / 2, // 4\n width / 2, 0, -depth / 2, // 5\n width / 2, height, -depth / 2, // 6\n -width / 2, height, -depth / 2, // 7\n\n // Left wall vertices\n -width / 2, 0, -depth / 2, // 8\n -width / 2, 0, depth / 2, // 9\n -width / 2, height, depth / 2, // 10\n -width / 2, height, -depth / 2, // 11\n ];\n\n // Indices array (each set of 3 numbers represents a triangle)\n const indices = [\n // Floor\n 0, 1, 2,\n 0, 2, 3,\n\n // Back wall\n 4, 5, 6,\n 4, 6, 7,\n\n // Left wall\n 8, 9, 10,\n 8, 10, 11,\n ];\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { DioramaGeometry }\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass LShapedStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 2, stepHeight = 0.3, stepDepth = 0.5, numStepsPerFlight = 5, landingDepth = 2) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate first flight of steps\n for (let i = 0; i < numStepsPerFlight; i++) {\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n const zFront = i * stepDepth;\n const zBack = zFront + stepDepth;\n\n // First flight of steps (4 vertices per step, 8 vertices per flight)\n vertices.push(\n // Vertical riser\n -stepWidth / 2, yBottom, zFront, // Bottom-left\n stepWidth / 2, yBottom, zFront, // Bottom-right\n stepWidth / 2, yTop, zFront, // Top-right\n -stepWidth / 2, yTop, zFront, // Top-left\n\n // Horizontal tread\n -stepWidth / 2, yTop, zFront, // Top-left\n stepWidth / 2, yTop, zFront, // Top-right\n stepWidth / 2, yTop, zBack, // Back-right\n -stepWidth / 2, yTop, zBack // Back-left\n );\n\n const baseIndex = i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Add landing platform\n const landingY = numStepsPerFlight * stepHeight;\n const landingZ = numStepsPerFlight * stepDepth;\n\n vertices.push(\n // Landing platform (4 vertices)\n -stepWidth / 2, landingY, landingZ, // Bottom-left\n stepWidth / 2, landingY, landingZ, // Bottom-right\n stepWidth / 2, landingY, landingZ + landingDepth, // Top-right\n -stepWidth / 2, landingY, landingZ + landingDepth // Top-left\n );\n\n const landingBaseIndex = numStepsPerFlight * 8;\n indices.push(\n landingBaseIndex, landingBaseIndex + 1, landingBaseIndex + 2, // First triangle for landing\n landingBaseIndex, landingBaseIndex + 2, landingBaseIndex + 3 // Second triangle for landing\n );\n\n // Generate second flight of steps (turn 90 degrees)\n for (let i = 0; i < numStepsPerFlight; i++) {\n const yBottom = landingY + i * stepHeight;\n const yTop = yBottom + stepHeight;\n const xFront = -stepWidth / 2 - i * stepDepth;\n const xBack = xFront - stepDepth;\n\n // Second flight of steps (4 vertices per step, 8 vertices per flight)\n vertices.push(\n // Vertical riser\n xFront, yBottom, landingZ + landingDepth, // Bottom-left\n xFront, yBottom, landingZ + landingDepth - stepWidth, // Bottom-right\n xFront, yTop, landingZ + landingDepth - stepWidth, // Top-right\n xFront, yTop, landingZ + landingDepth, // Top-left\n\n // Horizontal tread\n xFront, yTop, landingZ + landingDepth, // Top-left\n xFront, yTop, landingZ + landingDepth - stepWidth, // Top-right\n xBack, yTop, landingZ + landingDepth - stepWidth, // Back-right\n xBack, yTop, landingZ + landingDepth // Back-left\n );\n\n const baseIndex = landingBaseIndex + 4 + i * 8;\n // Indices for riser\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2,\n baseIndex, baseIndex + 2, baseIndex + 3\n );\n\n // Indices for tread\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6,\n baseIndex + 4, baseIndex + 6, baseIndex + 7\n );\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { LShapedStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass SpiralStaircaseGeometry extends BufferGeometry {\n constructor(stepWidth = 1, stepDepth = 0.4, stepHeight = 0.2, numSteps = 20, radius = 2, angleIncrement = Math.PI / 8) {\n super();\n\n const vertices = [];\n const indices = [];\n let currentAngle = 0;\n\n // Generate vertices and indices for each step\n for (let i = 0; i < numSteps; i++) {\n // Calculate the center position of the step based on the angle and radius\n const xCenter = radius * Math.cos(currentAngle);\n const zCenter = radius * Math.sin(currentAngle);\n const yBottom = i * stepHeight;\n const yTop = yBottom + stepHeight;\n\n // Define the four corners of the vertical riser part of the current step\n vertices.push(\n // Front face (vertical riser)\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yBottom, zCenter - (stepWidth / 2) * Math.sin(currentAngle), // Bottom-left\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yBottom, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Bottom-right\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Top-right\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle) // Top-left\n );\n\n // Define the four corners of the horizontal tread part of the current step\n vertices.push(\n // Top face (horizontal tread)\n xCenter - (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle), // Top-left-front\n xCenter + (stepWidth / 2) * Math.cos(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle), // Top-right-front\n xCenter + (stepWidth / 2) * Math.cos(currentAngle) - stepDepth * Math.sin(currentAngle), yTop, zCenter + (stepWidth / 2) * Math.sin(currentAngle) + stepDepth * Math.cos(currentAngle), // Back-right\n xCenter - (stepWidth / 2) * Math.cos(currentAngle) - stepDepth * Math.sin(currentAngle), yTop, zCenter - (stepWidth / 2) * Math.sin(currentAngle) + stepDepth * Math.cos(currentAngle) // Back-left\n );\n\n // Indices for the riser (vertical face of each step)\n const baseIndex = i * 8; // 8 vertices per step (4 for riser, 4 for tread)\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2, // First triangle for riser\n baseIndex, baseIndex + 2, baseIndex + 3 // Second triangle for riser\n );\n\n // Indices for the tread (horizontal face of each step)\n indices.push(\n baseIndex + 4, baseIndex + 5, baseIndex + 6, // First triangle for tread\n baseIndex + 4, baseIndex + 6, baseIndex + 7 // Second triangle for tread\n );\n\n // Increment the angle for the next step\n currentAngle += angleIncrement;\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { SpiralStaircaseGeometry };\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass StaircaseGeometry extends BufferGeometry {\n constructor(width = 2, stepHeight = 0.3, stepDepth = 0.5, numSteps = 10) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Generate vertices and indices for each step\n for (let i = 0; i < numSteps; i++) {\n const stepBottomY = i * stepHeight;\n const stepTopY = stepBottomY + stepHeight;\n const stepFrontZ = i * stepDepth;\n const stepBackZ = stepFrontZ + stepDepth;\n\n // Vertices for each step (8 vertices per step to cover tread and riser)\n vertices.push(\n // Bottom face of riser (front face)\n -width / 2, stepBottomY, stepFrontZ, // 0: Bottom-left-front\n width / 2, stepBottomY, stepFrontZ, // 1: Bottom-right-front\n width / 2, stepTopY, stepFrontZ, // 2: Top-right-front\n -width / 2, stepTopY, stepFrontZ, // 3: Top-left-front\n\n // Top face of tread (horizontal step)\n -width / 2, stepTopY, stepFrontZ, // 4: Top-left-front (repeated)\n width / 2, stepTopY, stepFrontZ, // 5: Top-right-front (repeated)\n width / 2, stepTopY, stepBackZ, // 6: Top-right-back\n -width / 2, stepTopY, stepBackZ // 7: Top-left-back\n );\n\n // Indices for each step\n const baseIndex = i * 8;\n\n // Riser face (front face of each step)\n indices.push(\n baseIndex, baseIndex + 1, baseIndex + 2, // First triangle for riser\n baseIndex, baseIndex + 2, baseIndex + 3 // Second triangle for riser\n );\n\n // Tread face (top horizontal surface of each step)\n indices.push(\n baseIndex + 4, baseIndex + 6, baseIndex + 5, // First triangle for tread\n baseIndex + 4, baseIndex + 7, baseIndex + 6 // Second triangle for tread\n );\n }\n\n // Create BufferAttribute for vertices and indices\n this.setIndex(indices);\n this.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n this.computeVertexNormals(); // Compute normals for proper lighting\n }\n}\n\nexport { StaircaseGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass CrossHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.4, height = 1.2, depth = 0.2) {\n super();\n\n // Create the vertical part of the cross\n const verticalHeight = height * 0.6;\n const verticalGeometry = new BoxGeometry(width / 2, verticalHeight, depth);\n verticalGeometry.translate(0, verticalHeight / 2, 0);\n\n // Create the horizontal part of the cross\n const horizontalWidth = width * 1.5;\n const horizontalGeometry = new BoxGeometry(horizontalWidth, width / 4, depth);\n horizontalGeometry.translate(0, verticalHeight * 0.75, 0);\n\n // Merge both parts into a cross\n this.copy(mergeGeometries([verticalGeometry, horizontalGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { CrossHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry, ConeGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass ObeliskHeadstoneGeometry extends BufferGeometry {\n constructor(totalHeight = 1.75, baseWidth = 0.75) {\n super();\n\n // Define height proportions relative to the total height\n const baseHeight = totalHeight * 0.05;\n const lowerSegmentHeight = totalHeight * 0.15;\n const middleSegmentHeight = totalHeight * 0.15;\n const topSegmentHeight = totalHeight * 0.75;\n\n let currentHeight = 0;\n\n // Base of the Headstone (a wide box)\n const baseGeometry = new BoxGeometry(baseWidth, baseHeight, baseWidth);\n baseGeometry.translate(0, currentHeight + baseHeight / 2, 0);\n currentHeight += baseHeight;\n\n // Lower Segment (a slightly narrower box)\n const lowerSegmentGeometry = new BoxGeometry(baseWidth * 0.8, lowerSegmentHeight, baseWidth * 0.8);\n lowerSegmentGeometry.translate(0, currentHeight + lowerSegmentHeight / 2, 0);\n currentHeight += lowerSegmentHeight;\n\n // Middle Segment (an even narrower box)\n const middleSegmentGeometry = new BoxGeometry(baseWidth * 0.6, middleSegmentHeight, baseWidth * 0.6);\n middleSegmentGeometry.translate(0, currentHeight + middleSegmentHeight / 2, 0);\n currentHeight += middleSegmentHeight;\n\n // Top Segment (a tall, thin box to form the obelisk shape)\n const topSegmentGeometry = new BoxGeometry(baseWidth * 0.4, topSegmentHeight, baseWidth * 0.4);\n topSegmentGeometry.translate(0, currentHeight + topSegmentHeight / 2, 0);\n currentHeight += topSegmentHeight;\n\n // Pyramid Top (a cone to form the pointed top of the obelisk)\n const pyramidGeometry = new ConeGeometry((baseWidth * 0.4) / Math.sqrt(2), 0.1, 4, 1, false, Math.PI / 4);\n pyramidGeometry.translate(0, currentHeight + 0.1 / 2, 0);\n\n this.copy(mergeGeometries([baseGeometry, lowerSegmentGeometry, middleSegmentGeometry, topSegmentGeometry, pyramidGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { ObeliskHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass RoundedHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.6, height = 1.0, depth = 0.2, radius = 0.6) {\n super();\n\n // Create the base of the headstone (a box)\n const baseHeight = height - radius / 2;\n const baseGeometry = new BoxGeometry(width, baseHeight, depth);\n baseGeometry.translate(0, baseHeight / 2, 0);\n\n // Create the rounded top part (a half cylinder with caps)\n const topGeometry = new CylinderGeometry(radius / 2, radius / 2, depth, 16, 1, false, 0, Math.PI);\n topGeometry.rotateY(Math.PI / 2);\n topGeometry.rotateX(Math.PI / 2);\n topGeometry.translate(0, baseHeight, 0);\n\n // Merge base and top into a single geometry\n this.copy(mergeGeometries([baseGeometry, topGeometry], false));\n this.computeVertexNormals();\n }\n}\n\nexport { RoundedHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\n\nclass SquareHeadstoneGeometry extends BufferGeometry {\n constructor(width = 0.5, height = 0.8, depth = 0.15) {\n super();\n\n // Create a rectangular slab\n const slabGeometry = new BoxGeometry(width, height, depth);\n slabGeometry.translate(0, height / 2, 0);\n\n this.copy(slabGeometry);\n }\n}\nexport { SquareHeadstoneGeometry };\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Fence Column Geometry, a stone slab fence column shape\n */\nexport class FenceColumnGeometry extends BufferGeometry {\n constructor({ height = 2.25 } = {}) {\n super();\n\n // Column Base (a wider base for stability)\n const baseGeometry = new BoxGeometry(1.2, 0.5, 1.2);\n baseGeometry.translate(0, 0.25, 0);\n\n // Main Column (a tall rectangular shape, adjustable height)\n const columnGeometry = new BoxGeometry(1, height, 1);\n columnGeometry.translate(0, 0.5 + height / 2, 0);\n\n // Column Cap (a slightly wider cap on top)\n const capGeometry = new BoxGeometry(1.4, 0.3, 1.4);\n capGeometry.translate(0, 0.5 + height + 0.15, 0);\n\n this.copy(mergeGeometries([baseGeometry, columnGeometry, capGeometry], false));\n }\n}\n","import { BufferGeometry, ConeGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Wrought Iron Bar Geometry, a simple wrought iron bar shape\n */\nexport class WroughtIronBarGeometry extends BufferGeometry {\n constructor({\n barHeight = 2.0, //\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n // Create a cylinder for the vertical bar\n const barGeometry = new CylinderGeometry(barRadius, barRadius, barHeight, radialSegments);\n barGeometry.translate(0, barHeight / 2, 0);\n\n // Create a cone for the spike on top\n const spikeGeometry = new ConeGeometry(spikeRadius, spikeHeight, radialSegments);\n spikeGeometry.translate(0, barHeight + spikeHeight / 2, 0);\n spikeGeometry.scale(1, 1, spikeScaleZ);\n\n // Merge bar and spike into one geometry\n this.copy(mergeGeometries([barGeometry, spikeGeometry], false));\n }\n}\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { WroughtIronBarGeometry } from \"./WroughtIronBarGeometry.js\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class WroughtIronFenceGeometry extends BufferGeometry {\n constructor({\n count = 20, //\n spacing = 0.4,\n barHeight = 2.0,\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n railHeight = 0.1,\n railDepth = 0.05,\n railOffset = 0.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n const geometries = [];\n const bar = new WroughtIronBarGeometry({ barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments });\n const rail = new BoxGeometry(count * spacing, railHeight, railDepth);\n\n for (let i = 0; i < count; i++) {\n const geometry = bar.clone();\n geometry.translate(i * spacing, 0, 0);\n geometries.push(geometry);\n }\n\n const topRail = rail.clone();\n topRail.translate((spacing * (count - 1)) / 2, barHeight - railOffset - railHeight / 2, 0);\n geometries.push(topRail);\n\n const bottomRail = rail.clone();\n bottomRail.translate((spacing * (count - 1)) / 2, railHeight / 2, 0);\n geometries.push(bottomRail);\n\n this.copy(mergeGeometries(geometries));\n }\n}\n","import { BoxGeometry, BufferGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class BookshelfGeometry extends BufferGeometry {\n constructor({\n width = 5, //\n height = 8,\n depth = 1,\n shelves = 4,\n frameThickness = 0.1,\n open = false,\n } = {}) {\n super();\n\n // Create the outer frame of the bookshelf\n const frameHeight = height;\n const frameWidth = width;\n const frameDepth = depth;\n\n // Base geometries\n const sidePanelGeometry = new BoxGeometry(frameThickness, frameHeight, frameDepth);\n const shelfGeometry = new BoxGeometry(frameWidth - 2 * frameThickness, frameThickness, frameDepth);\n\n // Panels\n const leftPanel = sidePanelGeometry.clone();\n leftPanel.translate(-frameWidth / 2 + frameThickness / 2, frameHeight / 2, 0);\n\n const rightPanel = sidePanelGeometry.clone();\n rightPanel.translate(frameWidth / 2 - frameThickness / 2, frameHeight / 2, 0);\n\n const topPanel = shelfGeometry.clone();\n topPanel.translate(0, frameHeight - frameThickness / 2, 0);\n\n const bottomPanel = shelfGeometry.clone();\n bottomPanel.translate(0, frameThickness / 2, 0);\n\n const backPanel = new BoxGeometry(frameWidth, frameHeight, frameThickness);\n backPanel.translate(0, frameHeight / 2, -frameDepth / 2 + frameThickness / 2);\n\n const shelfPanels = [];\n const shelfSpacing = (frameHeight - frameThickness) / (shelves + 1);\n for (let i = 1; i <= shelves; i++) {\n const shelfPanel = shelfGeometry.clone();\n shelfPanel.translate(0, frameThickness / 2 + i * shelfSpacing, 0);\n shelfPanels.push(shelfPanel);\n }\n\n this.copy(mergeGeometries([\n leftPanel, //\n rightPanel,\n topPanel,\n bottomPanel,\n ...(open ? [] : [backPanel]),\n ...shelfPanels\n ], false));\n }\n}\n","import { BufferGeometry, Float32BufferAttribute } from \"three\";\n\nclass SimpleLeafGeometry extends BufferGeometry {\n constructor(size = 0.1) {\n super();\n\n const vertices = [];\n const indices = [];\n\n // Define vertices to approximate a simple, elongated, oval leaf shape\n const leafPoints = [\n [0, 1], // Top point\n [0.5, 0.75], // Right upper middle\n [0.75, 0.25], // Right lower middle\n [0.5, -0.5], // Right bottom middle\n [0, -1], // Bottom point\n [-0.5, -0.5], // Left bottom middle\n [-0.75, 0.25], // Left lower middle\n [-0.5, 0.75], // Left upper middle\n ];\n\n // Add vertices to the geometry, scaling them with the `size` parameter\n for (let i = 0; i < leafPoints.length; i++) {\n const [x, y] = leafPoints[i];\n vertices.push(x * size, y * size, 0);\n }\n\n // Define indices to form triangular faces of the leaf\n // Create a fan-like structure connecting the top vertex (index 0) to other neighboring vertices\n for (let i = 1; i < leafPoints.length - 1; i++) {\n indices.push(0, i, i + 1);\n }\n // Close the fan with the last triangle\n indices.push(0, leafPoints.length - 1, 1);\n\n // Convert the vertices and indices to buffer attributes\n const positionAttribute = new Float32BufferAttribute(vertices, 3);\n this.setAttribute('position', positionAttribute);\n this.setIndex(indices);\n\n this.computeVertexNormals();\n }\n}\n\nexport { SimpleLeafGeometry };\n","import { Vector3 } from \"three\";\nimport { mergeVertices } from \"three/addons/utils/BufferGeometryUtils.js\";\nimport { Direction } from \"../constants/Direction.js\";\n\nexport function randomTransformVertices(geometry, direction = Direction.XYZ, minScale = 0.5, maxScale = 2.0) {\n // Delete unnecessary attributes\n geometry.deleteAttribute(\"uv\");\n geometry.deleteAttribute(\"normal\");\n geometry = mergeVertices(geometry);\n geometry.computeVertexNormals();\n\n // Get position attribute\n const positionAttribute = geometry.getAttribute(\"position\");\n\n // Loop through each vertex\n for (let i = 0; i < positionAttribute.count; i++) {\n const vertex = new Vector3().fromBufferAttribute(positionAttribute, i);\n\n // Randomly scale the displacement along the given direction\n const randomScale = Math.random() * (maxScale - minScale) + minScale;\n const displacement = direction.clone().multiplyScalar(randomScale);\n\n // Apply the displacement to the vertex\n vertex.add(displacement);\n positionAttribute.setXYZ(i, vertex.x, vertex.y, vertex.z);\n }\n\n // Notify Three.js that the position attribute has been updated\n positionAttribute.needsUpdate = true;\n geometry.computeVertexNormals();\n\n return geometry;\n}\n","import { BufferGeometry, SphereGeometry } from \"three\";\nimport { Direction } from \"../../constants/Direction.js\";\nimport { randomTransformVertices } from \"../../utils/VertexUtils.js\";\n\nexport class RockGeometry extends BufferGeometry {\n constructor(radius = 1, widthSegments = 4, heightSegments = 4) {\n super();\n\n const sphere = new SphereGeometry(radius, widthSegments, heightSegments);\n this.copy(randomTransformVertices(sphere, Direction.XYZ, 0.5, 1.0));\n this.computeVertexNormals();\n this.center();\n }\n}\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Bone Geometry, a simple bone shape\n * @extends BufferGeometry\n *\n * @example\n * // Create a bone\n * const boneGeometry = new BoneGeometry();\n * const boneMaterial = new MeshStandardMaterial({ color: 0xffffff });\n * const bone = new Mesh(boneGeometry, boneMaterial);\n * scene.add(bone);\n */\nclass BoneGeometry extends BufferGeometry {\n constructor(radiusTop = 0.1, radiusBottom = 0.1, height = 0.4, radialSegments = 8) {\n super();\n\n // Create the cylinder (shaft of the bone)\n const cylinderGeometry = new CylinderGeometry(radiusTop * 0.6, radiusBottom * 0.6, height, radialSegments);\n cylinderGeometry.translate(0, 0, 0);\n\n // Create the spheres (ends of the bone)\n const sphereGeometry = new SphereGeometry(radiusTop, radialSegments, radialSegments);\n const topSphere1 = sphereGeometry.clone();\n const topSphere2 = sphereGeometry.clone();\n const bottomSphere1 = sphereGeometry.clone();\n const bottomSphere2 = sphereGeometry.clone();\n\n // Position the spheres at each end of the cylinder\n topSphere1.translate(0, height / 2 + radiusTop * 0.6, -radiusTop * 0.6);\n topSphere2.translate(0, height / 2 + radiusTop * 0.6, radiusTop * 0.6);\n bottomSphere1.translate(0, -height / 2 - radiusBottom * 0.6, -radiusBottom * 0.6);\n bottomSphere2.translate(0, -height / 2 - radiusBottom * 0.6, radiusBottom * 0.6);\n\n // Merge the parts\n this.copy(mergeGeometries([cylinderGeometry, topSphere1, topSphere2, bottomSphere1, bottomSphere2], false));\n }\n}\n\nexport { BoneGeometry };\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass BeakerGeometry extends BufferGeometry {\n constructor() {\n super();\n\n // Create the sphere part of the glassware\n const sphereGeometry = new SphereGeometry(1, 16, 16);\n const tubeGeometry = new CylinderGeometry(0.2, 0.2, 2, 16, 1, true);\n\n // Adjust tube position to stick out of the sphere\n tubeGeometry.translate(0, 1.5, 0);\n tubeGeometry.rotateX(Math.PI / 2);\n\n this.copy(mergeGeometries([sphereGeometry, tubeGeometry], false));\n }\n}\n\nexport { BeakerGeometry };\n","import { BufferGeometry, LatheGeometry, Vector2 } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class ErlenmeyerFlaskGeometry extends BufferGeometry {\n constructor({\n flaskRadius = 1, //\n neckRadius = 0.3,\n height = 2.5,\n neckHeight = 1,\n radialSegments = 16,\n } = {}) {\n super();\n\n // Recalculating other radii to keep proportions consistent\n const points = [\n new Vector2(0, 0), // Bottom of the flask\n new Vector2(flaskRadius * 0.875, 0), // Flat base with minimum width\n new Vector2(flaskRadius, 0.1), // End of the rounded base\n new Vector2(neckRadius, height), // Start of the straight neck\n new Vector2(neckRadius, height + neckHeight), // End of the straight neck\n new Vector2(neckRadius * 1.1, height + neckHeight + 0.3), // Slight outward lip at the top\n ];\n\n const flaskGeometry = new LatheGeometry(points, radialSegments);\n\n this.copy(mergeGeometries([flaskGeometry], false));\n }\n}\n","import { BufferGeometry, CircleGeometry, LatheGeometry, Vector2 } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass MortarGeometry extends BufferGeometry {\n constructor() {\n super();\n\n const mortarPoints = [\n new Vector2(1, 0), // Bottom of the bowl\n new Vector2(1.2, 0.5), // Slight flare at the base\n new Vector2(1.4, 1.5), // Outer wall\n new Vector2(1.3, 1.8), // Flared edge\n new Vector2(0.8, 1.8), // Lip of the bowl\n ];\n const mortarGeometry = new LatheGeometry(mortarPoints, 12);\n\n // Create a disk to close off the bottom\n const baseDisk = new CircleGeometry(1, 12); // Radius matches the base of the mortar\n baseDisk.rotateX(-Math.PI / 2); // Rotate to align with the bottom\n baseDisk.translate(0, 0, 0); // Position at the base of the mortar\n\n this.copy(mergeGeometries([mortarGeometry, baseDisk], false));\n }\n}\n\nexport { MortarGeometry };\n","import { BufferGeometry, CylinderGeometry, TorusGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nexport class StandGeometry extends BufferGeometry {\n constructor({\n radius = 0.3, //\n height = 0.4,\n count = 3,\n thickness = 0.03,\n radialSegments = 16,\n } = {}) {\n super();\n\n const ringGeometry = new TorusGeometry(radius, thickness, 8, radialSegments);\n ringGeometry.rotateX(Math.PI / 2);\n ringGeometry.translate(0, height, 0);\n\n const legGeometry = new CylinderGeometry(thickness * 0.6, thickness * 0.6, height, radialSegments);\n const legs = [];\n\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n const leg = legGeometry.clone();\n leg.translate(Math.cos(angle) * radius, height / 2, Math.sin(angle) * radius);\n legs.push(leg);\n }\n\n this.copy(mergeGeometries([ringGeometry, ...legs], false));\n }\n}\n","import { BufferGeometry, CylinderGeometry, SphereGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass TestTubeGeometry extends BufferGeometry {\n constructor(radiusTop = 0.2, radiusBottom = 0.2, height = 3, segments = 32, openEnded = true) {\n super();\n\n // Create the cylindrical body\n const tubeGeometry = new CylinderGeometry(radiusTop, radiusBottom, height, segments, 1, openEnded);\n\n // Create the rounded bottom using a half sphere\n const bottomGeometry = new SphereGeometry(radiusBottom, segments, segments / 2, 0, Math.PI * 2, Math.PI / 2, Math.PI / 2);\n bottomGeometry.translate(0, -(height / 2), 0); // Position it at the bottom of the cylinder\n\n // Merge parts\n this.copy(mergeGeometries([tubeGeometry, bottomGeometry], false));\n }\n}\n\nexport { TestTubeGeometry };\n","import { BufferGeometry, CylinderGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\nclass WineBottleGeometry extends BufferGeometry {\n constructor({ radius = 0.5, neckRadius = 0.2, height = 3, neckHeight = 1, segments = 16 } = {}) {\n super();\n\n // Main body\n const bodyHeight = height - neckHeight;\n const bodyGeometry = new CylinderGeometry(radius, radius, bodyHeight, segments);\n bodyGeometry.translate(0, bodyHeight / 2, 0);\n\n // Shoulder section between body and neck\n const shoulderHeight = 0.3;\n const shoulderGeometry = new CylinderGeometry(neckRadius, radius, shoulderHeight, segments);\n shoulderGeometry.translate(0, bodyHeight + shoulderHeight / 2, 0);\n\n // Neck\n const neckGeometry = new CylinderGeometry(neckRadius, neckRadius, neckHeight, segments);\n neckGeometry.translate(0, bodyHeight + shoulderHeight + neckHeight / 2, 0);\n\n // Merge geometries\n this.copy(mergeGeometries([bodyGeometry, shoulderGeometry, neckGeometry], false));\n }\n}\n\nexport { WineBottleGeometry };\n","import { BufferGeometry, SphereGeometry } from \"three\";\n\nexport class HillGeometry extends BufferGeometry {\n constructor({\n radius = 3, //\n height = 0.6,\n widthSegments = 64,\n heightSegments = 16,\n phiStart = 0,\n phiLength = Math.PI * 2,\n } = {}) {\n super();\n\n this.copy(new SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, 0, Math.PI / 2));\n this.scale(1, height / radius, 1);\n }\n}\n","/**\n * Calculate the radius to achieve a spherical cap height.\n * R = r / (1 - cos(thetaLength))\n */\nexport const radiusFromCapHeight = (height, thetaLength) => height / (1 - Math.cos(thetaLength));\n\n/**\n * Calculate the radius to achieve a spherical cap width.\n * R = w / (2 * sin(thetaLength))\n */\nexport const radiusFromCapWidth = (width, thetaLength) => width / (2 * Math.sin(thetaLength));\n\n/**\n * Calculate the height of a spherical cap.\n * h = R * (1 - cos(thetaLength))\n */\nexport const capHeightFromRadius = (radius, thetaLength) => radius * (1 - Math.cos(thetaLength));\n\n/**\n * Calculate the width of a spherical cap.\n * w = 2 * R * sin(thetaLength)\n */\nexport const capWidthFromRadius = (radius, thetaLength) => 2 * radius * Math.sin(thetaLength);\n\n\n/**\n * Convert spherical coordinates to Cartesian coordinates.\n * @param {number} radius - The radius of the sphere.\n * @param {number} theta - The azimuthal angle in radians (from the x-axis in the x-y plane).\n * @param {number} phi - The polar angle in radians (from the positive z-axis).\n * @returns {{x: number, y: number, z: number}} The Cartesian coordinates.\n */\nexport const sphericalToCartesian = (radius, theta, phi) => {\n return {\n x: radius * Math.sin(phi) * Math.cos(theta),\n y: radius * Math.sin(phi) * Math.sin(theta),\n z: radius * Math.cos(phi)\n };\n};\n\n/**\n * Convert Cartesian coordinates to spherical coordinates.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @param {number} z - The z-coordinate.\n * @returns {{radius: number, theta: number, phi: number}} The spherical coordinates.\n */\nexport const cartesianToSpherical = (x, y, z) => {\n const radius = Math.sqrt(x * x + y * y + z * z);\n const theta = Math.atan2(y, x); // Azimuthal angle\n const phi = Math.acos(z / radius); // Polar angle\n return { radius, theta, phi };\n};\n","import { BufferGeometry, SphereGeometry } from \"three\";\nimport {capHeightFromRadius, radiusFromCapWidth} from \"../../utils/SphericalGeometryUtils.js\";\n\n/**\n * Mound-like geometry with a flat top.\n *\n * To create a radius based on a desired width:\n * ```\n * const moundGeometry = new MoundGeometry({\n * radius: radiusFromCapWidth(5, Math.PI / 10),\n * }\n * ```\n *\n * To create a radius based on a desired height:\n * ```\n * const moundGeometry = new MoundGeometry({\n * radius: radiusFromCapHeight(5, Math.PI / 10),\n * }\n * ```\n */\nexport class MoundGeometry extends BufferGeometry {\n constructor({\n radius = radiusFromCapWidth(5, Math.PI / 10), //\n widthSegments = 64,\n heightSegments = 32,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaLength = Math.PI / 10,\n } = {}) {\n super();\n\n this.copy(new SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, 0, thetaLength));\n\n // Translate the geometry so the base is at the origin\n const height = capHeightFromRadius(radius, thetaLength);\n this.translate(0, -radius + height, 0);\n }\n}\n","import { BufferGeometry, CylinderGeometry, DodecahedronGeometry } from \"three\";\nimport { mergeGeometries } from \"three/addons/utils/BufferGeometryUtils.js\";\n\n/**\n * Tree geometry, consisting of a trunk and leaves.\n *\n * Group order:\n * - Trunk Material\n * - Leaf Material\n *\n * @example\n * const treeGeometry = new TreeGeometry({\n * trunkRadiusTop: 0.25,\n * trunkRadiusBottom: 0.4,\n * trunkHeight: 2.5,\n * trunkSegments: 14,\n * leafSize: 0.8,\n * leafCount: 6,\n * leafDetail: 0,\n * leafSpreadRadius: 1.5\n * });\n */\nclass TreeGeometry extends BufferGeometry {\n constructor({\n trunkRadiusTop = 0.25,\n trunkRadiusBottom = 0.4,\n trunkHeight = 2.5,\n trunkSegments = 14,\n leafSize = 0.8,\n leafCount = 6,\n leafDetail = 0,\n leafSpreadRadius = 1.5,\n } = {}) {\n super();\n\n // Create trunk geometry\n const trunk = new CylinderGeometry(trunkRadiusTop, trunkRadiusBottom, trunkHeight, trunkSegments);\n trunk.translate(0, trunkHeight / 2, 0);\n\n // Create leaf geometries\n const leafs = [];\n for (let i = 0; i < leafCount; i++) {\n const leaf = new DodecahedronGeometry(leafSize, leafDetail);\n leaf.translate(\n (Math.random() - 0.5) * leafSpreadRadius,\n (Math.random() - 0.5) * leafSize + trunkHeight,\n (Math.random() - 0.5) * leafSpreadRadius,\n );\n leafs.push(leaf);\n }\n\n // Merge trunk and leaves\n this.copy(mergeGeometries([trunk.toNonIndexed(), mergeGeometries(leafs, false)], true));\n this.computeVertexNormals();\n }\n}\n\nexport { TreeGeometry };\n","import { Group, Mesh, ShaderMaterial, SphereGeometry } from \"three\";\n\nclass Moon extends Group {\n constructor() {\n super();\n\n // Create moon geometry\n const moonGeometry = new SphereGeometry(5, 32, 32);\n\n // Custom ShaderMaterial\n const moonMaterial = new ShaderMaterial({\n uniforms: {\n time: { value: 0.0 },\n },\n vertexShader: `\n varying vec3 vNormal;\n varying vec3 vPosition;\n void main() {\n vNormal = normalize(normal);\n vPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n varying vec3 vNormal;\n varying vec3 vPosition;\n\n // Simple 3D noise function\n float hash(vec3 p) {\n p = fract(p * 0.3183099 + vec3(0.71, 0.113, 0.419));\n p *= 17.0;\n return fract(p.x * p.y * p.z * (p.x + p.y + p.z));\n }\n\n float noise(vec3 p) {\n vec3 ip = floor(p);\n vec3 fp = fract(p);\n fp = fp * fp * (3.0 - 2.0 * fp); // Smoothstep\n return mix(\n mix(mix(hash(ip), hash(ip + vec3(1.0, 0.0, 0.0)), fp.x),\n mix(hash(ip + vec3(0.0, 1.0, 0.0)), hash(ip + vec3(1.0, 1.0, 0.0)), fp.x), fp.y),\n mix(mix(hash(ip + vec3(0.0, 0.0, 1.0)), hash(ip + vec3(1.0, 0.0, 1.0)), fp.x),\n mix(hash(ip + vec3(0.0, 1.0, 1.0)), hash(ip + vec3(1.0, 1.0, 1.0)), fp.x), fp.y),\n fp.z);\n }\n\n void main() {\n vec3 color = vec3(0.8, 0.8, 0.7); // Base moon color\n float n = noise(vPosition * 0.5); // Apply noise with frequency\n color *= 0.8 + 0.2 * n; // Modulate color by noise\n gl_FragColor = vec4(color, 1.0);\n }\n `\n });\n\n // Create the moon mesh and add it to the scene\n const moon = new Mesh(moonGeometry, moonMaterial);\n this.add(moon);\n }\n}\n\nexport { Moon };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BookGeometry } from \"../../geometry/books/BookGeometry.js\";\n\nexport class Book extends Mesh {\n constructor({\n width = 1,\n height = 1.5,\n depth = 0.5,\n coverThickness = 0.05,\n pageIndent = 0.05,\n coverColor = 0x8b0000,\n pageColor = 0xffffff,\n } = {}) {\n super();\n\n this.geometry = new BookGeometry(width, height, depth, coverThickness, pageIndent);\n this.material = [\n new MeshStandardMaterial({ color: coverColor, metalness: 0.1, roughness: 0.7, flatShading: true }),\n new MeshStandardMaterial({ color: pageColor, flatShading: true }),\n ];\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { CrossHeadstoneGeometry } from \"../../geometry/cemetery/CrossHeadstoneGeometry.js\";\n\nexport class CrossHeadstone extends Mesh {\n constructor(width = 0.4, height = 1.2, depth = 0.2) {\n super();\n\n this.geometry = new CrossHeadstoneGeometry(width, height, depth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { BoxGeometry, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Group, Mesh, MeshStandardMaterial, Shape } from \"three\";\n\nclass Mausoleum extends Group {\n constructor() {\n super();\n\n // Base of the Mausoleum\n const baseGeometry = new BoxGeometry(5, 1, 5);\n const baseMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n const baseMesh = new Mesh(baseGeometry, baseMaterial);\n baseMesh.position.set(0, 0.5, 0);\n this.add(baseMesh);\n\n // Main Building Structure\n const buildingGeometry = new BoxGeometry(4, 3, 4);\n const buildingMaterial = new MeshStandardMaterial({ color: 0x696969, flatShading: true });\n const buildingMesh = new Mesh(buildingGeometry, buildingMaterial);\n buildingMesh.position.set(0, 2.5, 0);\n this.add(buildingMesh);\n\n // Roof (Peaked)\n const roofGeometry = new ConeGeometry(3.5, 2, 4);\n const roofMaterial = new MeshStandardMaterial({ color: 0x505050, flatShading: true });\n const roofMesh = new Mesh(roofGeometry, roofMaterial);\n roofMesh.rotation.y = Math.PI / 4;\n roofMesh.position.set(0, 5, 0);\n this.add(roofMesh);\n\n // Pillars\n const pillarGeometry = new CylinderGeometry(0.2, 0.2, 3.5, 16);\n const pillarMaterial = new MeshStandardMaterial({ color: 0x696969, flatShading: true });\n\n const pillarPositions = [\n [-1.8, 2.3, -2.2],\n [1.8, 2.3, -2.2],\n [-1.8, 2.3, 2.2],\n [1.8, 2.3, 2.2],\n ];\n\n pillarPositions.forEach((position) => {\n const pillarMesh = new Mesh(pillarGeometry, pillarMaterial);\n pillarMesh.position.set(...position);\n this.add(pillarMesh);\n });\n\n // Corrected Arched Entrance\n const archShape = new Shape();\n archShape.moveTo(-1, 0);\n archShape.lineTo(-1, 2);\n archShape.absarc(0, 2, 1, Math.PI, 0, true);\n archShape.lineTo(1, 0);\n\n const extrudeSettings = {\n depth: 0.5,\n bevelEnabled: false,\n };\n const archGeometry = new ExtrudeGeometry(archShape, extrudeSettings);\n const archMaterial = new MeshStandardMaterial({ color: 0x404040, flatShading: true });\n const archMesh = new Mesh(archGeometry, archMaterial);\n archMesh.position.set(0, 0.5, 1.7);\n this.add(archMesh);\n }\n}\n\nexport { Mausoleum };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { ObeliskHeadstoneGeometry } from \"../../geometry/cemetery/ObeliskHeadstoneGeometry.js\";\n\nexport class ObeliskHeadstone extends Mesh {\n constructor(totalHeight = 1.75, baseWidth = 0.75) {\n super();\n\n this.geometry = new ObeliskHeadstoneGeometry(totalHeight, baseWidth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { RoundedHeadstoneGeometry } from \"../../geometry/cemetery/RoundedHeadstoneGeometry.js\";\n\nexport class RoundedHeadstone extends Mesh {\n constructor(width = 0.6, height = 1.0, depth = 0.2, radius = 0.6) {\n super();\n\n this.geometry = new RoundedHeadstoneGeometry(width, height, depth, radius);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { SquareHeadstoneGeometry } from \"../../geometry/cemetery/SquareHeadstoneGeometry.js\";\n\nexport class SquareHeadstone extends Mesh {\n constructor(width = 0.5, height = 0.8, depth = 0.15) {\n super();\n\n this.geometry = new SquareHeadstoneGeometry(width, height, depth);\n this.material = new MeshStandardMaterial({ color: 0x777777, roughness: 0.8 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { FenceColumnGeometry } from \"../../geometry/fence/FenceColumnGeometry.js\";\n\nexport class FenceColumn extends Mesh {\n constructor({ height = 2.25 } = {}) {\n super();\n\n this.geometry = new FenceColumnGeometry({ height });\n this.material = new MeshStandardMaterial({ color: 0x8b7d7b, flatShading: true });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { WroughtIronBarGeometry } from \"../../geometry/fence/WroughtIronBarGeometry.js\";\n\nexport class WroughtIronBar extends Mesh {\n constructor({\n barHeight = 2.0, //\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n this.geometry = new WroughtIronBarGeometry({\n barHeight,\n barRadius,\n spikeHeight,\n spikeRadius,\n spikeScaleZ,\n radialSegments,\n });\n this.material = new MeshStandardMaterial({ color: 0x333333, metalness: 0.8, roughness: 0.4 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { WroughtIronFenceGeometry } from \"../../geometry/fence/WroughtIronFenceGeometry.js\";\n\nexport class WroughtIronFence extends Mesh {\n constructor({\n count = 20, //\n spacing = 0.4,\n barHeight = 2.0,\n barRadius = 0.05,\n spikeHeight = 0.3,\n spikeRadius = 0.075,\n spikeScaleZ = 1.0,\n railHeight = 0.1,\n railDepth = 0.05,\n railOffset = 0.0,\n radialSegments = 8,\n } = {}) {\n super();\n\n this.geometry = new WroughtIronFenceGeometry({\n count,\n spacing,\n barHeight,\n barRadius,\n spikeHeight,\n spikeRadius,\n spikeScaleZ,\n railHeight,\n railDepth,\n railOffset,\n radialSegments,\n });\n this.material = new MeshStandardMaterial({ color: 0x333333, metalness: 0.8, roughness: 0.4 });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BookshelfGeometry } from \"../../geometry/furniture/BookshelfGeometry\";\n\nexport class Bookshelf extends Mesh {\n constructor({\n width = 5, //\n height = 8,\n depth = 1,\n shelves = 4,\n frameThickness = 0.1,\n open = false,\n } = {}) {\n super();\n\n this.geometry = new BookshelfGeometry({ width, height, depth, shelves, frameThickness, open });\n this.material = new MeshStandardMaterial({ color: 0x8b4513 });\n }\n}\n","import { BoxGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2 } from \"three\";\n\nclass Desk extends Group {\n constructor() {\n super();\n\n // Desk Surface\n const surfaceGeometry = new BoxGeometry(5, 0.3, 3); // Width, Height (depth), Length\n const surfaceMaterial = new MeshStandardMaterial({ color: 0x8b5a2b }); // Wood-like color\n const deskSurface = new Mesh(surfaceGeometry, surfaceMaterial);\n deskSurface.position.set(0, 3.15, 0); // Raise the desk up\n\n // Desk Legs (using lathe geometry)\n const points = [];\n points.push(new Vector2(0.2, 0)); // Starting point at bottom (thin)\n points.push(new Vector2(0.25, 0.5)); // Curve outward\n points.push(new Vector2(0.15, 1.5)); // Narrow toward the middle\n points.push(new Vector2(0.3, 3)); // Final part toward the top\n\n const legGeometry = new LatheGeometry(points, 32);\n const legMaterial = new MeshStandardMaterial({ color: 0x4b3621 }); // Darker wood for legs\n\n // Create four legs for the desk\n const legPositions = [\n [2.2, 0, 1.2], // Adjust Y to 0 so legs start at ground level\n [-2.2, 0, 1.2],\n [2.2, 0, -1.2],\n [-2.2, 0, -1.2],\n ];\n\n legPositions.forEach((position) => {\n const leg = new Mesh(legGeometry, legMaterial);\n leg.position.set(...position);\n this.add(leg);\n });\n\n this.add(deskSurface);\n }\n}\n\nexport { Desk };\n","import { CylinderGeometry, Group, Mesh, MeshBasicMaterial, MeshStandardMaterial, PointLight, SphereGeometry } from \"three\";\n\nclass Candle extends Group {\n constructor(height = 1, radius = 0.2) {\n super();\n this.height = height;\n this.radius = radius;\n this.createCandle();\n this.animateFlicker();\n }\n\n createCandle() {\n // Candle Geometry\n const candleGeometry = new CylinderGeometry(this.radius, this.radius, this.height, 32);\n const candleMaterial = new MeshStandardMaterial({ color: 0xffffff });\n this.candle = new Mesh(candleGeometry, candleMaterial);\n this.candle.position.set(0, this.height / 2, 0);\n this.add(this.candle);\n\n // Flame Geometry\n const flameGeometry = new SphereGeometry(0.05, 16, 16);\n const flameMaterial = new MeshBasicMaterial({ color: 0xffa500 });\n this.flame = new Mesh(flameGeometry, flameMaterial);\n this.flame.position.set(0, this.height + 0.05, 0);\n this.add(this.flame);\n\n // Candlelight\n this.candleLight = new PointLight(0xffa500, 1, 5);\n this.candleLight.position.set(0, this.height + 0.05, 0);\n this.candleLight.castShadow = true;\n this.add(this.candleLight);\n }\n\n animateFlicker() {\n const flicker = () => {\n // Random flicker intensity between 0.8 and 1.2\n this.candleLight.intensity = 1 + (Math.random() * 0.4 - 0.2);\n\n // Optional: slight random movement to simulate a flickering flame\n this.candleLight.position.x = Math.random() * 0.02 - 0.01;\n this.candleLight.position.z = Math.random() * 0.02 - 0.01;\n\n requestAnimationFrame(flicker);\n };\n flicker();\n }\n}\n\nexport { Candle };\n","import { ConeGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, PointLight, TorusGeometry } from \"three\";\n\n// Class for Lantern Geometry\nclass Lantern extends Group {\n constructor(height = 1.3, baseWidth = 0.5) {\n super();\n\n // Lantern Base (cylinder)\n const baseGeometry = new CylinderGeometry(baseWidth, baseWidth, 0.2, 16);\n const baseMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const baseMesh = new Mesh(baseGeometry, baseMaterial);\n baseMesh.position.set(0, 0, 0);\n this.add(baseMesh);\n\n // Lantern Body (a rectangular frame)\n const bodyGeometry = new CylinderGeometry(baseWidth * 0.9, baseWidth * 0.9, height);\n const bodyMaterial = new MeshStandardMaterial({ color: 0xffd700, flatShading: true, transparent: true, opacity: 0.6 });\n const bodyMesh = new Mesh(bodyGeometry, bodyMaterial);\n bodyMesh.position.set(0, height / 2 + 0.1, 0); // Adjust position based on height\n this.add(bodyMesh);\n\n // Lantern Roof (a cone)\n const roofGeometry = new ConeGeometry(baseWidth * 1.1, 0.5, 8);\n const roofMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const roofMesh = new Mesh(roofGeometry, roofMaterial);\n roofMesh.position.set(0, height + 0.35, 0); // Adjusted position based on height\n this.add(roofMesh);\n\n // Lantern Handle (a torus)\n const handleGeometry = new TorusGeometry(baseWidth * 0.8, 0.05, 8, 16);\n const handleMaterial = new MeshStandardMaterial({ color: 0x8b4513, flatShading: true });\n const handleMesh = new Mesh(handleGeometry, handleMaterial);\n handleMesh.position.set(0, height + 0.85, 0); // Adjusted to sit above the roof\n this.add(handleMesh);\n\n // Lantern Light (point light inside)\n const light = new PointLight(0xffaa00, 1.5, 15);\n light.position.set(0, height / 2 + 0.1, 0); // Adjust position based on height\n light.castShadow = true;\n this.add(light);\n }\n}\n\nexport { Lantern };\n","import { DodecahedronGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass MossyRocks extends Group {\n constructor() {\n super();\n\n // Rock Geometry (using Dodecahedron for a low-poly random rock-like shape)\n const rockGeometry = new DodecahedronGeometry(1, 0); // Low-poly shape\n const rockMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n const mossMaterial = new MeshStandardMaterial({ color: 0x4b8b3b, flatShading: true, opacity: 0.8, transparent: true });\n\n // Create multiple random rocks with slight variations\n for (let i = 0; i < 5; i++) {\n const rockMesh = new Mesh(rockGeometry, rockMaterial);\n rockMesh.scale.set(0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4); // Scale randomly to make each rock unique\n rockMesh.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI); // Random rotation for variation\n rockMesh.position.set((Math.random() - 0.5) * 4, 0, (Math.random() - 0.5) * 4); // Keep rocks at ground level\n this.add(rockMesh);\n\n // Moss Layer (using a slightly smaller scale and positioned on top of the rock)\n const mossMesh = new Mesh(rockGeometry, mossMaterial);\n mossMesh.scale.set(rockMesh.scale.x * 0.9, rockMesh.scale.y * 0.5, rockMesh.scale.z * 0.9); // Make the moss layer flatter\n mossMesh.rotation.copy(rockMesh.rotation);\n mossMesh.position.copy(rockMesh.position);\n mossMesh.position.y += 0.3; // Raise the moss slightly to sit on top of the rock\n this.add(mossMesh);\n }\n }\n}\n\nexport { MossyRocks };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { RockGeometry } from \"../../geometry/rocks/RockGeometry.js\";\n\nexport class Rock extends Mesh {\n constructor(radius = 1, widthSegments = 4, heightSegments = 4) {\n super();\n\n // Create a rock geometry\n this.geometry = new RockGeometry(radius, widthSegments, heightSegments);\n this.material = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n }\n}\n","import { DodecahedronGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass Rocks extends Group {\n constructor() {\n super();\n\n // Rock Geometry (using Dodecahedron for a low-poly random rock-like shape)\n const rockGeometry = new DodecahedronGeometry(1, 0); // Low-poly shape\n const rockMaterial = new MeshStandardMaterial({ color: 0x808080, flatShading: true });\n\n // Create multiple random rocks with slight variations\n for (let i = 0; i < 5; i++) {\n const rockMesh = new Mesh(rockGeometry, rockMaterial);\n rockMesh.scale.set(0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4, 0.8 + Math.random() * 0.4); // Scale randomly to make each rock unique\n rockMesh.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI); // Random rotation for variation\n rockMesh.position.set((Math.random() - 0.5) * 4, 0, (Math.random() - 0.5) * 4); // Keep rocks at ground level\n this.add(rockMesh);\n }\n }\n}\n\nexport { Rocks };\n","import { BeakerGeometry } from \"../../geometry/science/BeakerGeometry.js\";\nimport { DoubleSide, Group, Mesh, MeshPhysicalMaterial } from \"three\";\n\nclass Beaker extends Group {\n constructor() {\n super();\n\n // Create the geometry\n const beakerGeometry = new BeakerGeometry();\n\n // Create a group to combine the geometries\n const glassMaterial = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9,\n side: DoubleSide,\n });\n\n const beaker = new Mesh(beakerGeometry, glassMaterial);\n beaker.rotation.x = -Math.PI / 2;\n this.add(beaker);\n }\n}\n\nexport { Beaker };\n","import { CylinderGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2 } from \"three\";\n\nclass Bottle extends Group {\n constructor() {\n super();\n\n // Potion bottle geometry\n const bottlePoints = [\n new Vector2(0, 0), // Bottom\n new Vector2(0.8, 0), // Base\n new Vector2(1, 1.5), // Rounded body\n new Vector2(0.5, 2.2), // Neck\n new Vector2(0.6, 2.5), // Mouth\n ];\n const bottleGeometry = new LatheGeometry(bottlePoints, 10); // Low-poly segments\n\n // Cork geometry\n const corkGeometry = new CylinderGeometry(0.3, 0.4, 0.2, 8);\n\n // Materials\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.5,\n roughness: 0.1,\n metalness: 0.3,\n });\n\n const liquidMaterial = new MeshStandardMaterial({\n color: 0xff3366, // Vibrant potion color\n transparent: true,\n opacity: 0.6,\n });\n\n const corkMaterial = new MeshStandardMaterial({\n color: 0x8b4513,\n roughness: 1.0,\n });\n\n // Meshes\n const bottle = new Mesh(bottleGeometry, glassMaterial);\n const liquid = new Mesh(bottleGeometry, liquidMaterial);\n const cork = new Mesh(corkGeometry, corkMaterial);\n\n // Adjust liquid position to appear inside bottle\n liquid.scale.set(0.8, 0.8, 0.8);\n liquid.position.y = 0.1; // Position slightly lower to appear \"inside\"\n\n // Position cork at the bottle's mouth\n cork.position.y = 2.5;\n\n // Group all elements for easy manipulation\n const potionBottle = new Group();\n potionBottle.add(bottle, liquid, cork);\n this.add(potionBottle);\n }\n}\n\nexport { Bottle };\n","import { ConeGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass BunsenBurner extends Group {\n constructor() {\n super();\n\n // Base geometry\n const baseGeometry = new CylinderGeometry(0.3, 0.4, 0.1, 16);\n const baseMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.6,\n metalness: 0.3,\n });\n const base = new Mesh(baseGeometry, baseMaterial);\n base.position.y = 0.05;\n\n // Burner tube geometry\n const tubeGeometry = new CylinderGeometry(0.1, 0.1, 0.7, 16);\n const tubeMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.5,\n metalness: 0.4,\n });\n const tube = new Mesh(tubeGeometry, tubeMaterial);\n tube.position.y = 0.4;\n\n // Flame geometry\n const flameGeometry = new ConeGeometry(0.075, 0.2, 16);\n const flameMaterial = new MeshStandardMaterial({\n color: 0xff5500,\n emissive: 0xff5500,\n emissiveIntensity: 0.6,\n transparent: true,\n opacity: 0.8,\n });\n const flame = new Mesh(flameGeometry, flameMaterial);\n flame.position.y = 0.8;\n\n this.add(base, tube, flame);\n }\n}\n\nexport { BunsenBurner };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, SphereGeometry } from \"three\";\n\nclass ElectricPanel extends Group {\n constructor() {\n super();\n\n // Panel base geometry\n const panelGeometry = new BoxGeometry(3, 4, 0.1);\n const panelMaterial = new MeshStandardMaterial({\n color: 0x2e2e2e,\n roughness: 0.8,\n metalness: 0.6,\n });\n\n // Create switches and dials\n const switchGeometry = new BoxGeometry(0.2, 0.5, 0.2);\n const switchMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n roughness: 0.5,\n metalness: 0.7,\n });\n\n const dialGeometry = new CylinderGeometry(0.3, 0.3, 0.1, 16);\n const dialMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.7,\n metalness: 0.5,\n });\n\n // Create panel and switches\n const panel = new Mesh(panelGeometry, panelMaterial);\n\n // Add multiple switches and dials\n const switches = [];\n for (let i = -1; i <= 1; i++) {\n const toggleSwitch = new Mesh(switchGeometry, switchMaterial);\n toggleSwitch.position.set(i, 1.5, 0.1);\n switches.push(toggleSwitch);\n panel.add(toggleSwitch);\n }\n\n const dial = new Mesh(dialGeometry, dialMaterial);\n dial.rotation.x = Math.PI / 2;\n dial.position.set(0, 0.5, 0.15);\n panel.add(dial);\n\n // Create red indicator light\n const lightGeometry = new SphereGeometry(0.15, 8, 8);\n const lightMaterial = new MeshStandardMaterial({\n color: 0xff0000,\n emissive: 0xff0000,\n emissiveIntensity: 0.5,\n });\n const light = new Mesh(lightGeometry, lightMaterial);\n light.position.set(0, -1, 0.1);\n panel.add(light);\n\n this.add(panel);\n\n // Define variables for flickering effect\n let flickerSpeed = 0.015; // Speed of flicker\n let flickerMaxIntensity = 0.8; // Maximum emissive intensity\n let flickerMinIntensity = 0.2; // Minimum emissive intensity\n\n // Main render loop\n function animate() {\n requestAnimationFrame(animate);\n\n // Create a flicker effect by adjusting the emissive intensity\n const flickerIntensity = flickerMinIntensity + Math.abs(Math.sin(Date.now() * flickerSpeed)) * (flickerMaxIntensity - flickerMinIntensity);\n light.material.emissiveIntensity = flickerIntensity;\n }\n\n animate();\n }\n}\n\nexport { ElectricPanel };\n","import { ErlenmeyerFlaskGeometry } from \"../../geometry/science/ErlenmeyerFlaskGeometry.js\";\nimport { DoubleSide, Mesh, MeshPhysicalMaterial } from \"three\";\n\nexport class ErlenmeyerFlask extends Mesh {\n constructor({\n flaskRadius = 1, //\n neckRadius = 0.3,\n height = 2.5,\n neckHeight = 1,\n radialSegments = 16,\n } = {}) {\n super();\n\n this.geometry = new ErlenmeyerFlaskGeometry({ flaskRadius, neckRadius, height, neckHeight, radialSegments });\n this.material = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9,\n side: DoubleSide,\n wireframe: false,\n });\n }\n}\n","import {CylinderGeometry, Group, LatheGeometry, Mesh, MeshStandardMaterial, Vector2} from \"three\";\n\nclass Flask extends Group {\n constructor() {\n super();\n\n // Flask body geometry\n const flaskPoints = [\n new Vector2(0, 0), // Bottom of the flask\n new Vector2(1.2, 0), // Base\n new Vector2(1.5, 1.5), // Mid-body\n new Vector2(1, 3), // Narrow neck\n new Vector2(0.6, 3.5), // Mouth of the flask\n ];\n const flaskGeometry = new LatheGeometry(flaskPoints, 12); // 12 segments for low-poly style\n\n // Cork stopper geometry\n const corkGeometry = new CylinderGeometry(0.6, 0.7, 0.3, 8); // Simple tapered cylinder\n\n // Materials for flask and cork\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccaa,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.5,\n });\n\n const corkMaterial = new MeshStandardMaterial({\n color: 0x8b4513,\n roughness: 1.0,\n });\n\n // Meshes\n const flask = new Mesh(flaskGeometry, glassMaterial);\n const cork = new Mesh(corkGeometry, corkMaterial);\n\n // Position cork on top of the flask\n cork.position.y = 3.5;\n\n // Add both to a single object for easy manipulation\n this.add(flask, cork);\n }\n}\n\nexport { Flask };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial, SphereGeometry } from \"three\";\n\nclass LeverPanel extends Group {\n constructor() {\n super();\n\n // New panel for levers\n const leverPanelGeometry = new BoxGeometry(2, 3, 0.1);\n const leverPanelMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.8,\n metalness: 0.5,\n });\n const leverPanel = new Mesh(leverPanelGeometry, leverPanelMaterial);\n\n // Lever geometry\n const leverBaseGeometry = new CylinderGeometry(0.1, 0.1, 0.2, 8);\n const leverHandleGeometry = new CylinderGeometry(0.05, 0.05, 1, 8);\n\n // Lever material\n const leverMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n roughness: 0.5,\n metalness: 0.7,\n });\n\n // Create multiple levers\n const levers = [];\n for (let i = -0.5; i <= 0.5; i += 0.5) {\n // Lever base\n const leverBase = new Mesh(leverBaseGeometry, leverMaterial);\n leverBase.position.set(i, 1, 0.1);\n\n // Lever handle\n const leverHandle = new Mesh(leverHandleGeometry, leverMaterial);\n leverHandle.position.y = 0.5; // Position handle on top of the base\n // leverHandle.rotation.x = Math.PI / 4; // Tilt forward along the x-axis\n leverBase.add(leverHandle);\n\n // Group base and handle as a lever\n levers.push(leverHandle);\n this.add(leverBase);\n }\n\n // Position the panel in the scene\n this.add(leverPanel);\n }\n}\n\nexport { LeverPanel };\n","import { BoxGeometry, CylinderGeometry, Group, Mesh, MeshStandardMaterial } from \"three\";\n\nclass Microscope extends Group {\n constructor() {\n super();\n\n // Base geometry\n const baseGeometry = new BoxGeometry(1, 0.2, 0.5);\n const baseMaterial = new MeshStandardMaterial({\n color: 0x444444,\n roughness: 0.6,\n metalness: 0.3,\n });\n const base = new Mesh(baseGeometry, baseMaterial);\n base.position.y = 0.1;\n\n // Arm geometry\n const armGeometry = new BoxGeometry(0.2, 1, 0.2);\n const arm = new Mesh(armGeometry, baseMaterial);\n arm.position.set(0, 0.6, -0.2);\n\n // Eyepiece geometry\n const eyepieceGeometry = new CylinderGeometry(0.1, 0.1, 0.4, 8);\n const eyepieceMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.5,\n metalness: 0.6,\n });\n const eyepiece = new Mesh(eyepieceGeometry, eyepieceMaterial);\n eyepiece.position.set(0, 1.1, -0.35);\n eyepiece.rotation.x = -Math.PI / 4; // Angle the eyepiece for viewing\n\n // Stage geometry\n const stageGeometry = new BoxGeometry(0.6, 0.1, 0.6);\n const stageMaterial = new MeshStandardMaterial({\n color: 0x555555,\n roughness: 0.8,\n metalness: 0.2,\n });\n const stage = new Mesh(stageGeometry, stageMaterial);\n stage.position.set(0, 0.6, 0);\n\n // Assemble microscope\n this.add(base, arm, eyepiece, stage);\n }\n}\n\nexport { Microscope };\n","import { CylinderGeometry, DoubleSide, Group, Mesh, MeshStandardMaterial } from \"three\";\nimport { MortarGeometry } from \"../../geometry/science/MortarGeometry.js\";\n\nclass MortarAndPestle extends Group {\n constructor() {\n super();\n\n // Mortar geometry\n const mortarGeometry = new MortarGeometry();\n\n // Pestle geometry\n const pestleGeometry = new CylinderGeometry(0.2, 0.3, 1.5, 8);\n pestleGeometry.translate(0, 0.75, 0); // Offset to make the end rounded\n\n // Materials\n const mortarMaterial = new MeshStandardMaterial({\n color: 0x5c4033, // Dark earthy tone\n roughness: 1.0,\n metalness: 0.0,\n side: DoubleSide, // Render inside and outside\n });\n\n const pestleMaterial = new MeshStandardMaterial({\n color: 0x8b5a2b, // Slightly lighter earthy color\n roughness: 0.8,\n metalness: 0.1,\n });\n\n // Meshes\n const mortar = new Mesh(mortarGeometry, mortarMaterial);\n const pestle = new Mesh(pestleGeometry, pestleMaterial);\n\n // Position and rotate the pestle to rest in the mortar\n pestle.position.set(0.3, 1.3, 0);\n pestle.rotation.z = Math.PI / 4;\n\n // Group for easy manipulation\n this.add(mortar, pestle);\n }\n}\n\nexport { MortarAndPestle };\n","import { CatmullRomCurve3, Group, Mesh, MeshStandardMaterial, TubeGeometry, Vector3 } from \"three\";\n\nclass SpiralTube extends Group {\n constructor() {\n super();\n\n // Create a multi-spiral path for the tube\n const spiralLength = 100; // Total number of points for more coils\n const heightIncrement = 0.05; // Smaller increment to keep the coils tight\n const curve = new CatmullRomCurve3(\n Array.from({ length: spiralLength }, (_, i) => {\n const angle = i * 0.2; // Controls tightness of the spiral\n return new Vector3(\n Math.cos(angle) * 0.4,\n i * heightIncrement, // Gradual height increase\n Math.sin(angle) * 0.4,\n );\n }),\n );\n\n // Create tube geometry with a high segment count for smoothness\n const tubeGeometry = new TubeGeometry(curve, 200, 0.1, 8, false);\n const glassMaterial = new MeshStandardMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.3,\n roughness: 0.1,\n metalness: 0.2,\n emissive: 0x88ccff,\n });\n const multiSpiralTube = new Mesh(tubeGeometry, glassMaterial);\n this.add(multiSpiralTube);\n\n // Optional fluid animation inside tube (using gradient effect)\n function animateFluid() {\n glassMaterial.emissiveIntensity = 0.2 + Math.sin(Date.now() * 0.005) * 0.1;\n }\n\n // Main render loop with fluid animation\n function animate() {\n requestAnimationFrame(animate);\n animateFluid(); // Add subtle animation for fluid effect\n }\n\n animate();\n }\n}\n\nexport { SpiralTube };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { StandGeometry } from \"../../geometry/science/StandGeometry.js\";\n\nclass Stand extends Mesh {\n constructor({\n radius = 0.3, //\n height = 0.4,\n count = 3,\n thickness = 0.03,\n radialSegments = 16,\n } = {}) {\n super();\n\n this.geometry = new StandGeometry({ radius, height, count, thickness, radialSegments });\n this.material = new MeshStandardMaterial({\n color: 0x888888,\n roughness: 0.7,\n metalness: 0.3,\n });\n }\n}\n\nexport { Stand };\n","import {\n BufferGeometry,\n CylinderGeometry,\n DoubleSide,\n Group,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshStandardMaterial,\n SphereGeometry,\n Vector3,\n} from \"three\";\n\nclass TeslaCoil extends Group {\n constructor() {\n super();\n\n // Base geometry\n const coilBaseGeometry = new CylinderGeometry(0.5, 0.6, 0.3, 16);\n const coilBaseMaterial = new MeshStandardMaterial({\n color: 0x333333,\n roughness: 0.6,\n metalness: 0.5,\n });\n const coilBase = new Mesh(coilBaseGeometry, coilBaseMaterial);\n coilBase.position.y = 0.15;\n\n // Coil geometry\n const coilGeometry = new CylinderGeometry(0.15, 0.15, 2, 12, 1, true);\n const coilMaterial = new MeshStandardMaterial({\n color: 0xff6600,\n roughness: 0.5,\n metalness: 0.8,\n side: DoubleSide,\n });\n const coil = new Mesh(coilGeometry, coilMaterial);\n coil.position.y = 1.3;\n\n // Sphere at the top\n const coilTopGeometry = new SphereGeometry(0.3, 16, 16);\n const coilTop = new Mesh(coilTopGeometry, coilMaterial);\n coilTop.position.y = 2.4;\n\n this.add(coilBase, coil, coilTop);\n\n // Sparking effect (using lines)\n const sparks = [];\n for (let i = 0; i < 5; i++) {\n const sparkMaterial = new LineBasicMaterial({ color: 0x99ccff });\n const points = [\n new Vector3(0, 2.4, 0),\n new Vector3((Math.random() - 0.5) * 1.5, Math.random() * 2.4, (Math.random() - 0.5) * 1.5),\n ];\n const sparkGeometry = new BufferGeometry().setFromPoints(points);\n const spark = new Line(sparkGeometry, sparkMaterial);\n this.add(spark);\n sparks.push(spark);\n }\n\n // Update spark positions\n function animateSparks() {\n sparks.forEach((spark) => {\n const points = [\n new Vector3(0, 2.4, 0),\n new Vector3((Math.random() - 0.5) * 1.5, Math.random() * 2.4, (Math.random() - 0.5) * 1.5),\n ];\n spark.geometry.setFromPoints(points);\n });\n }\n\n function animate() {\n requestAnimationFrame(animate);\n animateSparks(); // Make the sparks “jump”\n }\n\n animate();\n }\n}\n\nexport { TeslaCoil };\n","import { DoubleSide, Group, Mesh, MeshPhysicalMaterial } from \"three\";\nimport { TestTubeGeometry } from \"../../geometry/science/TestTubeGeometry.js\";\n\nclass TestTube extends Group {\n constructor(radiusTop = 0.2, radiusBottom = 0.2, height = 3, segments = 32) {\n super();\n\n // Test Tube Geometry\n const tubeGeometry = new TestTubeGeometry(radiusTop, radiusBottom, height, segments);\n\n const tubeMaterial = new MeshPhysicalMaterial({\n color: 0x88ccff,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.1,\n reflectivity: 0.8,\n transmission: 0.9, // For glass effect\n side: DoubleSide,\n });\n\n const tube = new Mesh(tubeGeometry, tubeMaterial);\n\n this.add(tube);\n }\n}\n\nexport { TestTube };\n","import { BoxGeometry, DoubleSide, Group, Mesh, MeshStandardMaterial } from \"three\";\nimport { TestTubeGeometry } from \"../../geometry/science/TestTubeGeometry.js\";\n\nclass TestTubeRack extends Group {\n constructor(count = 3, colors = [0x00ffaa, 0xff00aa, 0xaa00ff]) {\n super();\n\n // Rack geometry\n const rackGeometry = new BoxGeometry(3, 0.2, 1);\n const rackMaterial = new MeshStandardMaterial({\n color: 0x8b4513, // Wooden color or change to metallic tone\n roughness: 0.7,\n metalness: 0.3,\n });\n const rack = new Mesh(rackGeometry, rackMaterial);\n rack.position.y = 0.5;\n\n // Test tube properties\n const testTubeGeometry = new TestTubeGeometry(0.1, 0.1, 1, 16);\n const glassMaterial = new MeshStandardMaterial({\n color: 0xaaaaaa,\n transparent: true,\n opacity: 0.4,\n roughness: 0.1,\n metalness: 0.5,\n side: DoubleSide,\n });\n\n // Create multiple test tubes with specified liquid colors\n for (let i = 0; i < count; i++) {\n // Test tube\n const testTube = new Mesh(testTubeGeometry, glassMaterial);\n const xPosition = (i - (count - 1) / 2) * 0.8;\n testTube.position.set(xPosition, 1, 0);\n\n // Liquid geometry and material with unique color\n const liquidGeometry = new TestTubeGeometry(0.099, 0.099, 0.5, 16, false);\n const liquidColor = colors[i % colors.length]; // Cycle through colors if fewer than tubes\n const liquidMaterial = new MeshStandardMaterial({\n color: liquidColor,\n emissive: liquidColor,\n emissiveIntensity: 0.5,\n transparent: true,\n opacity: 0.6,\n });\n\n // Liquid inside test tube\n const liquid = new Mesh(liquidGeometry, liquidMaterial);\n liquid.position.set(0, -0.25, 0); // Position liquid inside tube\n testTube.add(liquid);\n\n // Add tube to rack\n rack.add(testTube);\n }\n\n // Group rack\n this.add(rack);\n }\n}\n\nexport { TestTubeRack };\n","import { Mesh, MeshPhysicalMaterial } from \"three\";\nimport { WineBottleGeometry } from \"../../geometry/science/WineBottleGeometry.js\";\n\nclass WineBottle extends Mesh {\n constructor() {\n super();\n\n // Create wine bottle geometry\n const wineBottle = new WineBottleGeometry();\n\n // Create a glass-like material\n const bottleMaterial = new MeshPhysicalMaterial({\n color: 0x556b2f,\n roughness: 0.1,\n transmission: 0.9, // Makes the material transparent\n thickness: 0.2,\n metalness: 0,\n clearcoat: 1.0,\n clearcoatRoughness: 0.1,\n });\n\n // Create mesh and add to the scene\n this.geometry = wineBottle;\n this.material = bottleMaterial;\n }\n}\n\nexport { WineBottle };\n","import { Shape } from \"three\";\n\nclass BurstShape extends Shape {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1.0) {\n super();\n\n const step = (Math.PI * 2) / sides;\n const halfStep = step / 2;\n const qtrStep = step / 4;\n\n this.moveTo(Math.cos(0) * outerRadius, -Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= sides; ++n) {\n let cx = Math.cos(step * n - qtrStep * 3) * (innerRadius / Math.cos(qtrStep));\n let cy = -Math.sin(step * n - qtrStep * 3) * (innerRadius / Math.cos(qtrStep));\n let dx = Math.cos(step * n - halfStep) * innerRadius;\n let dy = -Math.sin(step * n - halfStep) * innerRadius;\n this.quadraticCurveTo(cx, cy, dx, dy);\n cx = Math.cos(step * n - qtrStep) * (innerRadius / Math.cos(qtrStep));\n cy = -Math.sin(step * n - qtrStep) * (innerRadius / Math.cos(qtrStep));\n dx = Math.cos(step * n) * outerRadius;\n dy = -Math.sin(step * n) * outerRadius;\n this.quadraticCurveTo(cx, cy, dx, dy);\n }\n\n this.closePath();\n }\n}\n\nexport { BurstShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { BurstShape } from \"../../shapes/BurstShape.js\";\n\nclass Burst extends Mesh {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1.0, depth = 0.25) {\n super();\n\n const shape = new BurstShape(sides, innerRadius, outerRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xffff00,\n emissive: 0xffd700,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Burst };\n","import { Path, Shape } from \"three\";\n\nclass GearShape extends Shape {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1, holeSides = 5, holeRadius = 0.25) {\n super();\n\n const step = (Math.PI * 2) / sides;\n const qtrStep = step / 4;\n\n this.moveTo(Math.cos(0) * outerRadius, -Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= sides; ++n) {\n this.lineTo(Math.cos(step * n - qtrStep * 3) * innerRadius, -Math.sin(step * n - qtrStep * 3) * innerRadius);\n this.lineTo(Math.cos(step * n - qtrStep * 2) * innerRadius, -Math.sin(step * n - qtrStep * 2) * innerRadius);\n this.lineTo(Math.cos(step * n - qtrStep) * outerRadius, -Math.sin(step * n - qtrStep) * outerRadius);\n this.lineTo(Math.cos(step * n) * outerRadius, -Math.sin(step * n) * outerRadius);\n }\n this.closePath();\n\n // Create the hole in the gear, if specified\n if (holeRadius > 0 && holeSides > 2) {\n const hole = new Path();\n const holeStep = (Math.PI * 2) / holeSides;\n\n hole.moveTo(Math.cos(0) * holeRadius, -Math.sin(0) * holeRadius);\n for (let n = 1; n < holeSides; ++n) {\n hole.lineTo(Math.cos(holeStep * n) * holeRadius, -Math.sin(holeStep * n) * holeRadius);\n }\n hole.lineTo(Math.cos(0) * holeRadius, -Math.sin(0) * holeRadius);\n\n this.holes.push(hole);\n }\n }\n}\n\nexport { GearShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { GearShape } from \"../../shapes/GearShape.js\";\n\nclass Gear extends Mesh {\n constructor(sides = 5, innerRadius = 0.5, outerRadius = 1, holeSides = 5, holeRadius = 0.25, depth = 0.25) {\n super();\n\n const shape = new GearShape(sides, innerRadius, outerRadius, holeSides, holeRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xaaaaaa,\n metalness: 0.8,\n roughness: 0.2,\n reflectivity: 0.5,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Gear };\n","import { Shape } from \"three\";\n\nclass HeartShape extends Shape {\n constructor(size = 1, width = 2.1, height = 1.4, tipDepth = 1.6) {\n super();\n\n // Start from the top middle of the heart\n this.moveTo(0, height * size / 3);\n\n // Left curve\n this.bezierCurveTo(\n -width * 0.375 * size, height * size, // Control point 1 for the left lobe\n -width * size, height * size / 3, // Control point 2 for the left side of the heart\n 0, -tipDepth * size // Bottom tip of the heart, controlled by `tipDepth`\n );\n\n // Right curve\n this.bezierCurveTo(\n width * size, height * size / 3, // Control point 3 for the right side of the heart\n width * 0.375 * size, height * size, // Control point 4 for the right lobe\n 0, height * size / 3 // Close shape at the top middle\n );\n }\n}\n\nexport { HeartShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { HeartShape } from \"../../shapes/HeartShape.js\";\n\nclass Heart extends Mesh {\n constructor(size = 1, width = 1, height = 1, tipDepth = 10, depth = 0.25) {\n super();\n\n const shape = new HeartShape(size, width, height, tipDepth);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xc62828,\n emissive: 0xc61416,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Heart };\n","import { Shape } from \"three\";\n\nclass StarShape extends Shape {\n constructor(points = 5, innerRadius = 0.5, outerRadius = 1.0) {\n super();\n\n const step = (Math.PI * 2) / points;\n const halfStep = step / 2;\n this.moveTo(Math.cos(0) * outerRadius, Math.sin(0) * outerRadius);\n\n for (let n = 1; n <= points; ++n) {\n this.lineTo(Math.cos(step * n - halfStep) * innerRadius, Math.sin(step * n - halfStep) * innerRadius);\n this.lineTo(Math.cos(step * n) * outerRadius, Math.sin(step * n) * outerRadius);\n }\n\n this.closePath();\n }\n}\n\nexport { StarShape };\n","import { ExtrudeGeometry, Mesh, MeshStandardMaterial } from \"three\";\nimport { StarShape } from \"../../shapes/StarShape.js\";\n\nclass Star extends Mesh {\n constructor(points = 5, innerRadius = 0.5, outerRadius = 1.0, depth = 0.25) {\n super();\n\n const shape = new StarShape(points, innerRadius, outerRadius);\n const geometry = new ExtrudeGeometry(shape, {\n depth: depth,\n bevelEnabled: depth > 0,\n bevelThickness: 0,\n bevelSize: 0,\n });\n const material = new MeshStandardMaterial({\n color: 0xffff00,\n emissive: 0xffd700,\n emissiveIntensity: 0.25,\n metalness: 0.1,\n roughness: 0.3,\n flatShading: true,\n });\n\n geometry.center();\n this.geometry = geometry;\n this.material = material;\n }\n}\n\nexport { Star };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { BoneGeometry } from \"../../geometry/skeleton/BoneGeometry.js\";\n\nexport class Bone extends Mesh {\n constructor() {\n super();\n\n this.geometry = new BoneGeometry();\n this.material = new MeshStandardMaterial({ color: 0xffffff });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { TreeGeometry } from \"../../geometry/trees/TreeGeometry.js\";\n\n/**\n * @example\n * const tree = new Tree({\n * trunkRadiusTop: 0.25,\n * trunkRadiusBottom: 0.4,\n * trunkHeight: 2.5,\n * trunkSegments: 14,\n * trunkColor: 0x8b4513,\n * leafSize: 0.8,\n * leafCount: 6,\n * leafDetail: 0,\n * leafSpreadRadius: 1.5,\n * leafColor: 0x228b22,\n * });\n */\nclass Tree extends Mesh {\n constructor({\n trunkRadiusTop = 0.25,\n trunkRadiusBottom = 0.4,\n trunkHeight = 2.5,\n trunkSegments = 14,\n trunkColor = 0x8b4513,\n leafSize = 0.8,\n leafCount = 6,\n leafDetail = 0,\n leafSpreadRadius = 1.5,\n leafColor = 0x228b22,\n } = {}) {\n super();\n\n const treeGeometry = new TreeGeometry({\n trunkRadiusTop: trunkRadiusTop,\n trunkRadiusBottom: trunkRadiusBottom,\n trunkHeight: trunkHeight,\n trunkSegments: trunkSegments,\n trunkColor: trunkColor,\n leafSize: leafSize,\n leafCount: leafCount,\n leafDetail: leafDetail,\n leafSpreadRadius: leafSpreadRadius,\n leafColor: leafColor,\n });\n\n const trunkMaterial = new MeshStandardMaterial({\n color: trunkColor,\n roughness: 0.9,\n metalness: 0,\n flatShading: true,\n });\n\n const leafMaterial = new MeshStandardMaterial({\n color: leafColor,\n roughness: 0.8,\n metalness: 0,\n flatShading: true,\n });\n\n this.geometry = treeGeometry;\n this.material = [trunkMaterial, leafMaterial];\n }\n}\n\nexport { Tree };\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { HillGeometry } from \"../../geometry/terrain/HillGeometry.js\";\n\nexport class Hill extends Mesh {\n constructor({\n radius = 3, //\n height = 0.6,\n widthSegments = 64,\n heightSegments = 16,\n phiStart = 0,\n phiLength = Math.PI * 2,\n } = {}) {\n super();\n\n this.geometry = new HillGeometry({\n radius,\n height,\n widthSegments,\n heightSegments,\n phiStart,\n phiLength,\n });\n\n this.material = new MeshStandardMaterial({ color: 0x00ff00, flatShading: true });\n }\n}\n","import { Mesh, MeshStandardMaterial } from \"three\";\nimport { MoundGeometry } from \"../../geometry/terrain/MoundGeometry.js\";\nimport { radiusFromCapWidth } from \"../../utils/SphericalGeometryUtils.js\";\n\n/**\n * Mound-like mesh with a flat top.\n *\n * To create a radius based on a desired width:\n * ```\n * const mound = new Mound({\n * radius: radiusFromCapWidth(5, Math.PI / 10),\n * }\n * ```\n *\n * To create a radius based on a desired height:\n * ```\n * const mound = new Mound({\n * radius: radiusFromCapHeight(5, Math.PI / 10),\n * }\n * ```\n */\nexport class Mound extends Mesh {\n constructor({\n radius = radiusFromCapWidth(5, Math.PI / 10), //\n widthSegments = 64,\n heightSegments = 32,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaLength = Math.PI / 10,\n } = {}) {\n super();\n\n this.geometry = new MoundGeometry({\n radius,\n widthSegments,\n heightSegments,\n phiStart,\n phiLength,\n thetaLength,\n });\n\n this.material = new MeshStandardMaterial({ color: 0x00ff00, flatShading: true });\n }\n}\n","/**\n * Utility function to add water-like vertex displacement to an existing Three.js material.\n * @param {Material} material - The material to mutate, e.g., MeshStandardMaterial.\n * @param {Object} options - Options for water wave modification.\n * @param {number} [options.time=0.0] - The time value for the wave function.\n * @param {number} [options.waveFrequency=0.2] - The frequency of the water waves.\n * @param {number} [options.waveAmplitude=0.5] - The amplitude of the water waves.\n */\nexport function addWaterDisplacement(material, { time = 0.0, waveFrequency = 0.2, waveAmplitude = 0.5 } = {}) {\n material.onBeforeCompile = (shader) => {\n // Add uniforms for time, wave frequency, and wave amplitude\n shader.uniforms.time = { value: time };\n shader.uniforms.waveFrequency = { value: waveFrequency };\n shader.uniforms.waveAmplitude = { value: waveAmplitude };\n\n // Inject the water-like wave displacement code in the vertex shader\n shader.vertexShader = `\n uniform float time;\n uniform float waveFrequency;\n uniform float waveAmplitude;\n\n vec3 waterDisplacement(vec3 position, vec3 normal) {\n vec3 displaced = position;\n\n // Displace along the normal direction instead of local y-axis\n displaced += normal * (sin(position.x * waveFrequency + time) * waveAmplitude);\n displaced += normal * (cos(position.z * waveFrequency + time) * waveAmplitude);\n\n return displaced;\n }\n ` + shader.vertexShader;\n\n // Replace the vertex transformation logic to add displacement based on the normal\n shader.vertexShader = shader.vertexShader.replace(\n `#include <begin_vertex>`,\n `\n vec3 transformed = waterDisplacement(position, normal);\n `\n );\n\n // Store shader reference in material for time updates\n material.userData.shader = shader;\n };\n}\n\n/**\n * Updates the time uniform of the material's shader to animate the water effect.\n * @param {Material} material - The material to update.\n * @param {number} deltaTime - The time increment to add.\n */\nexport function updateWaterDisplacementTime(material, deltaTime) {\n if (material.userData.shader) {\n material.userData.shader.uniforms.time.value += deltaTime;\n }\n}\n","import { Direction } from \"../constants/Direction.js\";\n\n/**\n * Utility function to add noise-based vertex displacement to an existing Three.js material.\n * @param {Material} material - The material to mutate, e.g., MeshStandardMaterial.\n * @param {Object} options - Options for noise modification.\n * @param {number} [options.time=0.0] - The time value for the noise function.\n * @param {number} [options.intensity=1.0] - The intensity of the displacement.\n * @param {Vector3} [options.direction=new Vector3(1, 1, 1)] - The direction of displacement.\n * @param {number} [options.scale=10.0] - The scale of the noise effect.\n */\nexport function addNoiseDisplacement(material, { time = 0.0, intensity = 1.0, direction = Direction.XYZ, scale = 10.0 } = {}) {\n material.onBeforeCompile = (shader) => {\n // Add uniforms for time, direction, intensity, and scale\n shader.uniforms.time = { value: time };\n shader.uniforms.direction = { value: direction };\n shader.uniforms.intensity = { value: intensity };\n shader.uniforms.scale = { value: scale };\n\n // Add noise function and modify the vertex shader to displace vertices\n shader.vertexShader = `\n uniform float time;\n uniform vec3 direction;\n uniform float intensity;\n uniform float scale;\n\n float mod289(float x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 perm(vec4 x) { return mod289(((x * 34.0) + 1.0) * x); }\n\n float noise(vec3 p) {\n vec3 a = floor(p);\n vec3 d = p - a;\n d = d * d * (3.0 - 2.0 * d);\n\n vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0);\n vec4 k1 = perm(b.xyxy);\n vec4 k2 = perm(k1.xyxy + b.zzww);\n\n vec4 c = k2 + a.zzzz;\n vec4 k3 = perm(c);\n vec4 k4 = perm(c + 1.0);\n\n vec4 o1 = fract(k3 * (1.0 / 41.0));\n vec4 o2 = fract(k4 * (1.0 / 41.0));\n\n vec4 o3 = o2 * d.z + o1 * (1.0 - d.z);\n vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);\n\n return o4.y * d.y + o4.x * (1.0 - d.y);\n }\n ` + shader.vertexShader;\n\n // Replace the vertex transformation logic to add noise-based displacement\n shader.vertexShader = shader.vertexShader.replace(\n `#include <begin_vertex>`,\n `\n vec3 transformed = vec3(position);\n float n = noise(transformed * scale + time);\n transformed += normalize(direction) * n * intensity;\n vec3 transformedNormal = normal;\n `\n );\n\n // Store shader reference in material for time updates\n material.userData.shader = shader;\n };\n}\n\n/**\n * Updates the time uniform of the material's shader to animate the noise effect.\n * @param {Material} material - The material to update.\n * @param {number} deltaTime - The time increment to add.\n */\nexport function updateNoiseDisplacementTime(material, deltaTime) {\n if (material.userData.shader) {\n material.userData.shader.uniforms.time.value += deltaTime;\n }\n}\n","export const daySkyShader = {\n uniforms: {\n },\n vertexShader: `\n varying vec3 vPosition;\n void main() {\n vPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n varying vec3 vPosition;\n void main() {\n float y = normalize(vPosition).y * 0.5 + 0.5; // Normalizing y to range 0 to 1\n vec3 topColor = vec3(0.5, 0.8, 1.0); // Light blue\n vec3 bottomColor = vec3(1.0, 1.0, 1.0); // Light white/gray for the horizon\n gl_FragColor = vec4(mix(bottomColor, topColor, y), 1.0);\n }\n `,\n};\n","// Shader for fade effect\nexport const fadeShader = {\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1.0 },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float opacity;\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n vec4 texel = texture2D(tDiffuse, vUv);\n gl_FragColor = opacity * texel;\n }\n `,\n};\n","import { Color } from \"three\";\n\nexport const nightSkyShader = {\n uniforms: {\n topColor: { value: new Color(0x000033) },\n bottomColor: { value: new Color(0x000011) },\n offset: { value: 33 },\n exponent: { value: 0.6 },\n },\n vertexShader: `\n varying vec3 vWorldPosition;\n void main() {\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform vec3 topColor;\n uniform vec3 bottomColor;\n uniform float offset;\n uniform float exponent;\n varying vec3 vWorldPosition;\n void main() {\n float h = normalize(vWorldPosition + offset).y;\n gl_FragColor = vec4(mix(bottomColor, topColor, max(pow(max(h, 0.0), exponent), 0.0)), 1.0);\n }\n `,\n};\n","import { BackSide, BoxGeometry, Mesh, ShaderMaterial } from \"three\";\nimport { daySkyShader } from \"../shaders/daySkyShader.js\";\n\nclass DaySkybox extends Mesh {\n constructor(size = 1000) {\n super();\n\n this.geometry = new BoxGeometry(size, size, size);\n\n this.material = new ShaderMaterial({\n vertexShader: daySkyShader.vertexShader,\n fragmentShader: daySkyShader.fragmentShader,\n side: BackSide,\n });\n }\n}\n\nexport { DaySkybox };\n","import { BackSide, Mesh, ShaderMaterial, SphereGeometry } from \"three\";\nimport { nightSkyShader } from \"../shaders/nightSkyShader.js\";\n\nclass NightSkybox extends Mesh {\n constructor(size = 1000) {\n super();\n\n this.geometry = new SphereGeometry(size, 32, 15);\n\n this.material = new ShaderMaterial({\n vertexShader: nightSkyShader.vertexShader,\n fragmentShader: nightSkyShader.fragmentShader,\n uniforms: nightSkyShader.uniforms,\n side: BackSide,\n });\n }\n}\n\nexport { NightSkybox };\n","import { Mesh, Vector3 } from \"three\";\nimport { Sky } from \"three/addons/objects/Sky.js\";\n\nclass TwilightSkybox extends Mesh {\n constructor(\n theta = Math.PI * 0.49, // Elevation angle (0 to PI)\n phi = 2 * Math.PI * 0.25, // Azimuth angle (0 to 2*PI)\n turbidity = 10,\n rayleigh = 2,\n mieCoefficient = 0.005,\n mieDirectionalG = 0.8,\n ) {\n super();\n\n const sky = new Sky();\n sky.scale.setScalar(450000);\n this.add(sky);\n\n const skyUniforms = sky.material.uniforms;\n skyUniforms[\"turbidity\"].value = turbidity;\n skyUniforms[\"rayleigh\"].value = rayleigh;\n skyUniforms[\"mieCoefficient\"].value = mieCoefficient;\n skyUniforms[\"mieDirectionalG\"].value = mieDirectionalG;\n\n this.skyUniforms = skyUniforms;\n\n this.sunPosition(theta, phi);\n }\n\n sunPosition(theta, phi) {\n const sun = new Vector3();\n const skyUniforms = this.skyUniforms;\n\n sun.setFromSphericalCoords(1, theta, phi);\n skyUniforms[\"sunPosition\"].value.copy(sun);\n }\n}\n\nexport { TwilightSkybox };\n","import { DataTexture, NearestFilter, RepeatWrapping, RGBAFormat, UnsignedByteType } from \"three\";\n\n/**\n * Create a checkerboard texture\n * @param size\n * @returns {DataTexture}\n *\n * @example\n * const material = new MeshStandardMaterial();\n * material.map = createCheckerboardTexture(8);\n */\nexport const checkerboardTexture = (size) => {\n const data = new Uint8Array(4 * size * size);\n for (let i = 0; i < size * size; i++) {\n const stride = i * 4;\n const color = (i % size ^ Math.floor(i / size)) & 1 ? 255 : 0;\n data[stride] = color; // red\n data[stride + 1] = color; // green\n data[stride + 2] = color; // blue\n data[stride + 3] = 255; // alpha\n }\n\n const texture = new DataTexture(data, size, size, RGBAFormat, UnsignedByteType);\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n texture.minFilter = NearestFilter;\n texture.needsUpdate = true;\n\n return texture;\n};\n","import { Box3, Vector3 } from \"three\";\n\nexport function centerGroup(group) {\n const box = new Box3().setFromObject(group);\n const center = new Vector3();\n box.getCenter(center);\n group.position.sub(center);\n}\n\nexport function centerGroupAtTarget(group, target = new Vector3(0, 0, 0)) {\n const box = new Box3().setFromObject(group);\n const currentCenter = new Vector3();\n box.getCenter(currentCenter);\n\n const offset = new Vector3().subVectors(target, currentCenter);\n group.position.add(offset);\n}\n","import { Vector3 } from \"three\";\n\nexport function centerInstancedMesh(mesh) {\n mesh.computeBoundingBox();\n const box = mesh.boundingBox;\n const center = box.getCenter(new Vector3());\n\n mesh.translateX(-center.x);\n mesh.translateY(-center.y);\n mesh.translateZ(-center.z);\n}\n","import { Vector2 } from \"three\";\n\n/**\n * Normalizes a time value between a minimum and maximum value.\n */\nfunction normalizeT(t, min, max) {\n return Math.max(0, Math.min(1, (t - min) / (max - min)));\n}\n\n/**\n * Generates an array of interpolated 2D points using an easing function.\n */\nexport function interpolateCurve(curveFunction, startRadius, endRadius, startHeight, endHeight, segments = 20, min = 0, max = 1) {\n const points = [];\n\n for (let i = 0; i <= segments; i++) {\n const t = i / segments; // Normalized value between 0 and 1\n const easedT = curveFunction(normalizeT(t, min, max));\n const x = startRadius + easedT * (endRadius - startRadius);\n const y = startHeight + t * (endHeight - startHeight);\n points.push(new Vector2(x, y));\n }\n return points;\n}\n","import { Box3, Vector3 } from \"three\";\n\n/**\n * Centers the given mesh at the origin (0, 0, 0) of the scene by adjusting its position.\n * The mesh is moved so that its bounding box center is placed at the origin.\n */\nexport function centerMesh(mesh) {\n const box = new Box3().setFromObject(mesh);\n const center = box.getCenter(new Vector3());\n\n mesh.translateX(-center.x);\n mesh.translateY(-center.y);\n mesh.translateZ(-center.z);\n mesh.updateMatrixWorld(true);\n}\n\n/**\n * Centers the geometry of the given mesh at the local origin (0, 0, 0) by modifying the geometry vertices.\n * This method moves the geometry itself so that its center is at the local origin,\n * without affecting the position, rotation, or scale of the mesh.\n */\nexport function centerMeshGeometry(mesh) {\n mesh.geometry.computeBoundingBox();\n const box = mesh.geometry.boundingBox;\n const center = box.getCenter(new Vector3());\n\n mesh.geometry.translate(-center.x, -center.y, -center.z);\n}\n","import { ParametricCurve } from \"../constants/ParametricCurve.js\";\nimport { Vector2 } from \"three\";\n\n/**\n * Function to create cubic Bezier curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createCubicCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the cubic curve\n * new THREE.Vector2(1.5, 3), // First control point (outward curve)\n * new THREE.Vector2(1.5, 4), // Second control point (outward curve)\n * new THREE.Vector2(0.5, 5), // End of the curve\n * 24, // Resolution of the quadratic curve\n * ),\n * ]\n * ```\n */\nexport const createCubicCurvePoints = (start, control1, control2, end, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.CUBIC(t, start.x, control1.x, control2.x, end.x);\n const y = ParametricCurve.CUBIC(t, start.y, control1.y, control2.y, end.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create damped curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createDampedCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the damped curve\n * new THREE.Vector2(1.5, 5), // End of the damped curve\n * 5, // Damping factor\n * 24, // Resolution of the damped curve\n * ),\n * ]\n * ```\n */\nexport const createDampedCurvePoints = (start, end, damping, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.DAMPED(t, damping) * (end.x - start.x) + start.x;\n const y = start.y + t * (end.y - start.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create exponential curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createExponentialCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the exponential curve\n * new THREE.Vector2(1.5, 5), // End of the exponential curve\n * 0.5, // Base of the exponential function\n * 2, // Exponential factor\n * 24 // Resolution of the exponential curve\n * ),\n * ]\n * ```\n */\nexport const createExponentialCurvePoints = (start, end, base, factor, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.EXPONENTIAL(t, base, factor) * (end.x - start.x) + start.x;\n const y = start.y + t * (end.y - start.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create logarithmic curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createLogarithmicCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the logarithmic curve\n * new THREE.Vector2(1.5, 5), // End of the logarithmic curve\n * 0.5, // Base of the logarithmic function\n * 10, // Logarithmic factor\n * 24, // Resolution of the logarithmic curve\n * ),\n * ]\n * ```\n */\nexport const createLogarithmicCurvePoints = (start, end, base, factor, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.LOGARITHMIC(t, base, factor) * (end.x - start.x) + start.x;\n const y = start.y + t * (end.y - start.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create parabolic curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createParabolicCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start point\n * new THREE.Vector2(0.5, 5), // End point\n * 1, // Coefficient for t^2 (controls curvature)\n * 0, // Coefficient for t (linear component)\n * 0, // Constant term (vertical offset)\n * 24, // Resolution\n * ),\n * ]\n * ```\n */\nexport const createParabolicCurvePoints = (start, end, a, b, c, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = a * t * t + b * t + c + start.x;\n const y = start.y + t * (end.y - start.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create quadratic Bezier curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createQuadraticCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the quadratic curve\n * new THREE.Vector2(1.5, 5), // Control point (outward curve)\n * new THREE.Vector2(0.5, 5), // End of the curve\n * 24, // Resolution of the quadratic curve\n * ),\n * ]\n * ```\n */\nexport const createQuadraticCurvePoints = (start, control, end, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.QUADRATIC(t, start.x, control.x, end.x);\n const y = ParametricCurve.QUADRATIC(t, start.y, control.y, end.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\n/**\n * Function to create sigmoid curve points\n *\n * Example:\n * ```\n * const points = [\n * ...ParametricCurveUtils.createSigmoidCurvePoints(\n * new THREE.Vector2(0.5, 2), // Start of the sigmoid curve\n * new THREE.Vector2(1.5, 5), // End of the sigmoid curve\n * 20, // Sigmoid steepness factor\n * 24, // Resolution of the sigmoid curve\n * ),\n * ]\n */\nexport const createSigmoidCurvePoints = (start, end, a, segments = 24) => {\n let curvePoints = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const x = ParametricCurve.SIGMOID(t, a) * (end.x - start.x) + start.x;\n const y = start.y + t * (end.y - start.y);\n curvePoints.push(new Vector2(x, y));\n }\n return curvePoints;\n};\n\nexport const ParametricCurveUtils = {\n createCubicCurvePoints,\n createDampedCurvePoints,\n createExponentialCurvePoints,\n createLogarithmicCurvePoints,\n createParabolicCurvePoints,\n createQuadraticCurvePoints,\n createSigmoidCurvePoints,\n};\n","import { EffectComposer } from \"three/addons/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/addons/postprocessing/RenderPass.js\";\nimport { ShaderPass } from \"three/addons/postprocessing/ShaderPass.js\";\nimport { fadeShader } from \"../shaders/fadeShader.js\";\n\nclass SceneUtils {\n static dispose(scene) {\n scene?.traverse((object) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) {\n if (Array.isArray(object.material)) {\n object.material.forEach((mat) => mat.dispose());\n } else {\n object.material.dispose();\n }\n }\n });\n }\n\n static fadeBetween(renderer, camera, scene1, scene2, duration = 1.0) {\n // Create composer and passes\n const composer = new EffectComposer(renderer);\n\n // Render pass for the initial scene\n const renderPass1 = new RenderPass(scene1, camera);\n composer.addPass(renderPass1);\n\n // Shader pass for fade effect\n const fadePass = new ShaderPass(fadeShader);\n fadePass.uniforms[\"opacity\"].value = 1.0;\n composer.addPass(fadePass);\n\n // Start fade out\n let startTime = null;\n\n function animateFadeOut(time) {\n if (!startTime) startTime = time;\n const elapsed = (time - startTime) / 1000;\n const progress = elapsed / duration;\n\n fadePass.uniforms[\"opacity\"].value = Math.max(1.0 - progress, 0.0);\n\n if (progress < 1.0) {\n composer.render();\n requestAnimationFrame(animateFadeOut);\n } else {\n // Switch to the new scene and start fade in\n composer.passes[0] = new RenderPass(scene2, camera);\n startTime = null;\n requestAnimationFrame(animateFadeIn);\n }\n }\n\n function animateFadeIn(time) {\n if (!startTime) startTime = time;\n const elapsed = (time - startTime) / 1000;\n const progress = elapsed / duration;\n\n fadePass.uniforms[\"opacity\"].value = Math.min(progress, 1.0);\n\n if (progress < 1.0) {\n composer.render();\n requestAnimationFrame(animateFadeIn);\n }\n }\n\n // Start the fade-out animation\n requestAnimationFrame(animateFadeOut);\n }\n}\n\nexport { SceneUtils };\n"],"names":["Direction","Vector3","Falloff","distance","radius","t","displacementBrush","geometry","position","strength","direction","falloffFn","positions","vertex","influence","flattenBrush","targetHeight","i","projectedHeight","delta","noiseBrush","falloff","noiseStrength","noise","MathUtils","smoothBrush","tempPosition","averagePosition","count","j","spikeBrush","inward","twistBrush","quaternion","Quaternion","angle","sineEaseIn","sineEaseOut","sineEaseInOut","quadraticEaseIn","quadraticEaseOut","quadraticEaseInOut","cubicEaseIn","cubicEaseOut","cubicEaseInOut","quarticEaseIn","quarticEaseOut","quarticEaseInOut","quinticEaseIn","quinticEaseOut","quinticEaseInOut","exponentialEaseIn","exponentialEaseOut","exponentialEaseInOut","circularEaseIn","circularEaseOut","circularEaseInOut","linear","smoothstep","concave","convex","logarithmic","squareRoot","inverse","gaussian","Easing","parabolicCurve","a","b","c","clampedT","dampedCurve","damping","clampedDamping","quadraticCurve","p0","p1","p2","oneMinusT","cubicCurve","p3","exponentialCurve","base","factor","logarithmicCurve","sigmoidCurve","ParametricCurve","Bubbling","Group","bubbles","bubbleCount","bubbleGeometry","SphereGeometry","bubbleMaterial","MeshStandardMaterial","bubble","Mesh","animateBubbles","animate","BookGeometry","BufferGeometry","width","height","depth","coverThickness","pageIndent","w","h","d","vertices","normals","u1","u2","uvs","indices","normalArray","uvArray","indexArray","coverGeometry","BufferAttribute","pagesGeometry","BoxGeometry","mergeGeometries","randomFloat","min","max","randomInteger","logarithmicRandomMax","exponent","logarithmicRandomMin","randomScale","scaleXMin","scaleXMax","scaleYMin","scaleYMax","scaleZMin","scaleZMax","rowOfBooksByScales","coverMaterial","pagesMaterial","scales","row","InstancedMesh","matrix","Matrix4","currentZ","scale","scaleMatrix","rowOfBooksByCount","rowOfBooksByLength","length","remainingZ","BifurcatedStaircaseGeometry","stepWidth","stepHeight","stepDepth","numStepsCentral","numStepsBranch","branchAngle","yBottom","yTop","zFront","zBack","baseIndex","landingY","landingZ","landingWidth","landingBaseIndex","xStart","zStart","xOffset","zOffset","xFrontLeft","xFrontRight","xBackLeft","xBackRight","Float32BufferAttribute","DioramaGeometry","wallThickness","LShapedStaircaseGeometry","numStepsPerFlight","landingDepth","xFront","xBack","SpiralStaircaseGeometry","numSteps","angleIncrement","currentAngle","xCenter","zCenter","StaircaseGeometry","stepBottomY","stepTopY","stepFrontZ","stepBackZ","CrossHeadstoneGeometry","verticalHeight","verticalGeometry","horizontalWidth","horizontalGeometry","ObeliskHeadstoneGeometry","totalHeight","baseWidth","baseHeight","lowerSegmentHeight","middleSegmentHeight","topSegmentHeight","currentHeight","baseGeometry","lowerSegmentGeometry","middleSegmentGeometry","topSegmentGeometry","pyramidGeometry","ConeGeometry","RoundedHeadstoneGeometry","topGeometry","CylinderGeometry","SquareHeadstoneGeometry","slabGeometry","FenceColumnGeometry","columnGeometry","capGeometry","WroughtIronBarGeometry","barHeight","barRadius","spikeHeight","spikeRadius","spikeScaleZ","radialSegments","barGeometry","spikeGeometry","WroughtIronFenceGeometry","spacing","railHeight","railDepth","railOffset","geometries","bar","rail","topRail","bottomRail","BookshelfGeometry","shelves","frameThickness","open","frameHeight","frameWidth","frameDepth","sidePanelGeometry","shelfGeometry","leftPanel","rightPanel","topPanel","bottomPanel","backPanel","shelfPanels","shelfSpacing","shelfPanel","SimpleLeafGeometry","size","leafPoints","x","y","positionAttribute","randomTransformVertices","minScale","maxScale","mergeVertices","displacement","RockGeometry","widthSegments","heightSegments","sphere","BoneGeometry","radiusTop","radiusBottom","cylinderGeometry","sphereGeometry","topSphere1","topSphere2","bottomSphere1","bottomSphere2","BeakerGeometry","tubeGeometry","ErlenmeyerFlaskGeometry","flaskRadius","neckRadius","neckHeight","points","Vector2","flaskGeometry","LatheGeometry","MortarGeometry","mortarPoints","mortarGeometry","baseDisk","CircleGeometry","StandGeometry","thickness","ringGeometry","TorusGeometry","legGeometry","legs","leg","TestTubeGeometry","segments","openEnded","bottomGeometry","WineBottleGeometry","bodyHeight","bodyGeometry","shoulderHeight","shoulderGeometry","neckGeometry","HillGeometry","phiStart","phiLength","radiusFromCapHeight","thetaLength","radiusFromCapWidth","capHeightFromRadius","capWidthFromRadius","sphericalToCartesian","theta","phi","cartesianToSpherical","z","MoundGeometry","TreeGeometry","trunkRadiusTop","trunkRadiusBottom","trunkHeight","trunkSegments","leafSize","leafCount","leafDetail","leafSpreadRadius","trunk","leafs","leaf","DodecahedronGeometry","Moon","moonGeometry","moonMaterial","ShaderMaterial","moon","Book","coverColor","pageColor","CrossHeadstone","Mausoleum","baseMaterial","baseMesh","buildingGeometry","buildingMaterial","buildingMesh","roofGeometry","roofMaterial","roofMesh","pillarGeometry","pillarMaterial","pillarMesh","archShape","Shape","extrudeSettings","archGeometry","ExtrudeGeometry","archMaterial","archMesh","ObeliskHeadstone","RoundedHeadstone","SquareHeadstone","FenceColumn","WroughtIronBar","WroughtIronFence","Bookshelf","Desk","surfaceGeometry","surfaceMaterial","deskSurface","legMaterial","Candle","candleGeometry","candleMaterial","flameGeometry","flameMaterial","MeshBasicMaterial","PointLight","flicker","Lantern","bodyMaterial","bodyMesh","handleGeometry","handleMaterial","handleMesh","light","MossyRocks","rockGeometry","rockMaterial","mossMaterial","rockMesh","mossMesh","Rock","Rocks","Beaker","beakerGeometry","glassMaterial","MeshPhysicalMaterial","DoubleSide","beaker","Bottle","bottlePoints","bottleGeometry","corkGeometry","liquidMaterial","corkMaterial","bottle","liquid","cork","potionBottle","BunsenBurner","tubeMaterial","tube","flame","ElectricPanel","panelGeometry","panelMaterial","switchGeometry","switchMaterial","dialGeometry","dialMaterial","panel","toggleSwitch","dial","lightGeometry","lightMaterial","flickerSpeed","flickerMaxIntensity","flickerMinIntensity","flickerIntensity","ErlenmeyerFlask","Flask","flaskPoints","flask","LeverPanel","leverPanelGeometry","leverPanelMaterial","leverPanel","leverBaseGeometry","leverHandleGeometry","leverMaterial","leverBase","leverHandle","Microscope","armGeometry","arm","eyepieceGeometry","eyepieceMaterial","eyepiece","stageGeometry","stageMaterial","stage","MortarAndPestle","pestleGeometry","mortarMaterial","pestleMaterial","mortar","pestle","SpiralTube","spiralLength","heightIncrement","curve","CatmullRomCurve3","_","TubeGeometry","multiSpiralTube","animateFluid","Stand","TeslaCoil","coilBaseGeometry","coilBaseMaterial","coilBase","coilGeometry","coilMaterial","coil","coilTopGeometry","coilTop","sparks","sparkMaterial","LineBasicMaterial","sparkGeometry","spark","Line","animateSparks","TestTube","TestTubeRack","colors","rackGeometry","rackMaterial","rack","testTubeGeometry","testTube","xPosition","liquidGeometry","liquidColor","WineBottle","wineBottle","bottleMaterial","BurstShape","sides","innerRadius","outerRadius","step","halfStep","qtrStep","n","cx","cy","dx","dy","Burst","shape","material","GearShape","holeSides","holeRadius","hole","Path","holeStep","Gear","HeartShape","tipDepth","Heart","StarShape","Star","Bone","Tree","trunkColor","leafColor","treeGeometry","trunkMaterial","leafMaterial","Hill","Mound","addWaterDisplacement","time","waveFrequency","waveAmplitude","shader","updateWaterDisplacementTime","deltaTime","addNoiseDisplacement","intensity","updateNoiseDisplacementTime","daySkyShader","fadeShader","nightSkyShader","Color","DaySkybox","BackSide","NightSkybox","TwilightSkybox","turbidity","rayleigh","mieCoefficient","mieDirectionalG","sky","Sky","skyUniforms","sun","checkerboardTexture","data","stride","color","texture","DataTexture","RGBAFormat","UnsignedByteType","RepeatWrapping","NearestFilter","centerGroup","group","box","Box3","center","centerGroupAtTarget","target","currentCenter","offset","centerInstancedMesh","mesh","normalizeT","interpolateCurve","curveFunction","startRadius","endRadius","startHeight","endHeight","easedT","centerMesh","centerMeshGeometry","createCubicCurvePoints","start","control1","control2","end","curvePoints","createDampedCurvePoints","createExponentialCurvePoints","createLogarithmicCurvePoints","createParabolicCurvePoints","createQuadraticCurvePoints","control","createSigmoidCurvePoints","ParametricCurveUtils","SceneUtils","scene","object","mat","renderer","camera","scene1","scene2","duration","composer","EffectComposer","renderPass1","RenderPass","fadePass","ShaderPass","startTime","animateFadeOut","progress","animateFadeIn"],"mappings":"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"}