{"version":3,"file":"index.umd.cjs","sources":["../src/LoopSubdivision.js"],"sourcesContent":["/**\n * @description Loop Subdivision Surface\n * @about       Smooth subdivision surface modifier for use with three.js BufferGeometry.\n * @author      Stephens Nunnally <@stevinz>\n * @license     MIT - Copyright (c) 2022 Stephens Nunnally\n * @source      https://github.com/stevinz/three-subdivide\n */\n/////////////////////////////////////////////////////////////////////////////////////\n//\n//  Functions\n//      modify              Applies Loop subdivision to BufferGeometry, returns new BufferGeometry\n//      edgeSplit           Splits all triangles at edges shared by coplanar triangles\n//      flat                One iteration of Loop subdivision, without point averaging\n//      smooth              One iteration of Loop subdivision, with point averaging\n//\n//  Info\n//      This modifier uses the Loop (Charles Loop, 1987) subdivision surface algorithm to smooth\n//      modern three.js BufferGeometry.\n//\n//      At one point, three.js included a subdivision surface modifier in the extended examples (see bottom\n//      of file for links), it was removed in r125. The modifier was originally based on the Catmull-Clark\n//      algorithm, which works best for geometry with convex coplanar n-gon faces. In three.js r60 the modifier\n//      was changed to utilize the Loop algorithm. The Loop algorithm was designed to work better with triangle\n//      based meshes.\n//\n//      The Loop algorithm, however, doesn't always provide uniform results as the vertices are\n//      skewed toward the most used vertex positions. A triangle based box (e.g. BoxGeometry for example) will\n//      tend to favor the corners. To alleviate this issue, this implementation includes an initial pass to split\n//      coplanar faces at their shared edges. It starts by splitting along the longest shared edge first, and then\n//      from that midpoint it splits to any remaining coplanar shared edges.\n//\n//      Also by default, this implementation inserts new uv coordinates, but does not average them using the Loop\n//      algorithm. In some cases (often in flat geometries) this will produce undesired results, a\n//      noticeable tearing will occur. In such cases, try passing 'uvSmooth' as true to enable uv averaging.\n//\n//  Note(s)\n//      - This modifier returns a new BufferGeometry instance, it does not dispose() of the old geometry.\n//\n//      - This modifier returns a NonIndexed geometry. An Indexed geometry can be created by using the\n//        BufferGeometryUtils.mergeVertices() function, see:\n//        https://threejs.org/docs/?q=buffer#examples/en/utils/BufferGeometryUtils.mergeVertices\n//\n//      - This modifier works best with geometry whose triangles share edges AND edge vertices. See diagram below.\n//\n//          OKAY          NOT OKAY\n//            O              O\n//           /|\\            / \\\n//          / | \\          /   \\\n//         /  |  \\        /     \\\n//        O---O---O      O---O---O\n//         \\  |  /        \\  |  /\n//          \\ | /          \\ | /\n//           \\|/            \\|/\n//            O              O\n//\n//  Reference(s)\n//      - Subdivision Surfaces\n//          https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/thesis-10.pdf\n//          https://en.wikipedia.org/wiki/Loop_subdivision_surface\n//          https://cseweb.ucsd.edu/~alchern/teaching/cse167_fa21/6-3Surfaces.pdf\n//\n//      - Original three.js SubdivisionModifier, r124 (Loop)\n//          https://github.com/mrdoob/three.js/blob/r124/examples/jsm/modifiers/SubdivisionModifier.js\n//\n//      - Original three.js SubdivisionModifier, r59 (Catmull-Clark)\n//          https://github.com/mrdoob/three.js/blob/r59/examples/js/modifiers/SubdivisionModifier.js\n//\n/////////////////////////////////////////////////////////////////////////////////////\n\nimport * as THREE from 'three';\n\n///// Constants\n\nconst POSITION_DECIMALS = 2;\n\n///// Local Variables\n\nconst _average = new THREE.Vector3();\nconst _center = new THREE.Vector3();\nconst _midpoint = new THREE.Vector3();\nconst _normal = new THREE.Vector3();\nconst _temp = new THREE.Vector3();\n\nconst _vector0 = new THREE.Vector3(); // .Vector4();\nconst _vector1 = new THREE.Vector3(); // .Vector4();\nconst _vector2 = new THREE.Vector3(); // .Vector4();\nconst _vec0to1 = new THREE.Vector3();\nconst _vec1to2 = new THREE.Vector3();\nconst _vec2to0 = new THREE.Vector3();\n\nconst _position = [\n    new THREE.Vector3(),\n    new THREE.Vector3(),\n    new THREE.Vector3(),\n];\n\nconst _vertex = [\n    new THREE.Vector3(),\n    new THREE.Vector3(),\n    new THREE.Vector3(),\n];\n\nconst _triangle = new THREE.Triangle();\n\n/////////////////////////////////////////////////////////////////////////////////////\n/////   Loop Subdivision Surface\n/////////////////////////////////////////////////////////////////////////////////////\n\n/** Loop subdivision surface modifier for use with modern three.js BufferGeometry */\nexport class LoopSubdivision {\n\n    /////////////////////////////////////////////////////////////////////////////////////\n    /////   Modify\n    ////////////////////\n\n    /**\n     * Applies Loop subdivision modifier to geometry\n     *\n     * @param {Object} bufferGeometry - Three.js geometry to be subdivided\n     * @param {Number} iterations - How many times to run subdividion\n     * @param {Object} params - Optional parameters object, see below\n     * @returns {Object} Returns new, subdivided, three.js BufferGeometry object\n     *\n     * Optional Parameters Object\n     * @param {Boolean} split - Should coplanar faces be divided along shared edges before running Loop subdivision?\n     * @param {Boolean} uvSmooth - Should UV values be averaged during subdivision?\n     * @param {Boolean} preserveEdges - Should edges / breaks in geometry be ignored during subdivision?\n     * @param {Boolean} flatOnly - If true, subdivision generates triangles, but does not modify positions\n     * @param {Number} maxTriangles - If geometry contains more than this many triangles, subdivision will not continue\n     * @param {Number} weight - How much to weigh favoring heavy corners vs favoring Loop's formula\n     */\n    static modify(bufferGeometry, iterations = 1, params = {}) {\n        if (arguments.length > 3) console.warn(`LoopSubdivision.modify() now uses a parameter object. See readme for more info!`);\n\n        if (typeof params !== 'object') params = {};\n\n        ///// Parameters\n        if (params.split === undefined) params.split = true;\n        if (params.uvSmooth === undefined) params.uvSmooth = false;\n        if (params.preserveEdges === undefined) params.preserveEdges = false;\n        if (params.flatOnly === undefined) params.flatOnly = false;\n        if (params.maxTriangles === undefined) params.maxTriangles = Infinity;\n        if (params.weight === undefined) params.weight = 1;\n        if (isNaN(params.weight) || !isFinite(params.weight)) params.weight = 1;\n        params.weight = Math.max(0, (Math.min(1, params.weight)));\n\n        ///// Geometries\n        if (! verifyGeometry(bufferGeometry)) return bufferGeometry;\n        let modifiedGeometry = bufferGeometry.clone();\n\n        ///// Presplit\n        if (params.split) {\n            const splitGeometry = LoopSubdivision.edgeSplit(modifiedGeometry)\n            modifiedGeometry.dispose();\n            modifiedGeometry = splitGeometry;\n        }\n\n        ///// Apply Subdivision\n        for (let i = 0; i < iterations; i++) {\n            let currentTriangles = modifiedGeometry.attributes.position.count / 3;\n            if (currentTriangles < params.maxTriangles) {\n                let subdividedGeometry;\n\n                // Subdivide\n                if (params.flatOnly) {\n                    subdividedGeometry = LoopSubdivision.flat(modifiedGeometry, params);\n                } else {\n                    subdividedGeometry = LoopSubdivision.smooth(modifiedGeometry, params);\n                }\n\n                // Copy and Resize Groups\n                modifiedGeometry.groups.forEach((group) => {\n                    subdividedGeometry.addGroup(group.start * 4, group.count * 4, group.materialIndex);\n                });\n\n                // Clean Up\n                modifiedGeometry.dispose();\n                modifiedGeometry = subdividedGeometry;\n            }\n        }\n\n        ///// Return New Geometry\n        return modifiedGeometry;\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////\n    /////   Split Hypotenuse\n    ////////////////////\n\n    /**\n     * Applies one iteration of split subdivision. Splits all triangles at edges shared by coplanar triangles.\n     * Starts by splitting at longest shared edge, followed by splitting from that new center edge point to the\n     * center of any other shared edges.\n     */\n    static edgeSplit(geometry) {\n\n        ///// Geometries\n        if (! verifyGeometry(geometry)) return geometry;\n        const existing = (geometry.index !== null) ? geometry.toNonIndexed() : geometry.clone();\n        const split = new THREE.BufferGeometry();\n\n        ///// Attributes\n        const attributeList = gatherAttributes(existing);\n        const vertexCount = existing.attributes.position.count;\n        const posAttribute = existing.getAttribute('position');\n        const norAttribute = existing.getAttribute('normal');\n        const edgeHashToTriangle = {};\n        const triangleEdgeHashes = [];\n        const edgeLength = {};\n        const triangleExist = [];\n\n        ///// Edges\n        for (let i = 0; i < vertexCount; i += 3) {\n\n            // Positions\n            _vector0.fromBufferAttribute(posAttribute, i + 0);\n            _vector1.fromBufferAttribute(posAttribute, i + 1);\n            _vector2.fromBufferAttribute(posAttribute, i + 2);\n            _normal.fromBufferAttribute(norAttribute, i);\n            const vecHash0 = hashFromVector(_vector0);\n            const vecHash1 = hashFromVector(_vector1);\n            const vecHash2 = hashFromVector(_vector2);\n\n            // Verify Area\n            const triangleSize = _triangle.set(_vector0, _vector1, _vector2).getArea();\n            triangleExist.push(! fuzzy(triangleSize, 0));\n            if (! triangleExist[i / 3]) {\n                triangleEdgeHashes.push([]);\n                continue;\n            }\n\n            // Calculate Normals\n            calcNormal(_normal, _vector0, _vector1, _vector2);\n            const normalHash = hashFromVector(_normal);\n\n            // Vertex Hashes\n            const hashes = [\n                `${vecHash0}_${vecHash1}_${normalHash}`, // [0]: 0to1\n                `${vecHash1}_${vecHash0}_${normalHash}`, // [1]: 1to0\n                `${vecHash1}_${vecHash2}_${normalHash}`, // [2]: 1to2\n                `${vecHash2}_${vecHash1}_${normalHash}`, // [3]: 2to1\n                `${vecHash2}_${vecHash0}_${normalHash}`, // [4]: 2to0\n                `${vecHash0}_${vecHash2}_${normalHash}`, // [5]: 0to2\n            ];\n\n            // Store Edge Hashes\n            const index = i / 3;\n            for (let j = 0; j < hashes.length; j++) {\n                // Attach Triangle Index to Edge Hash\n                if (! edgeHashToTriangle[hashes[j]]) edgeHashToTriangle[hashes[j]] = [];\n                edgeHashToTriangle[hashes[j]].push(index);\n\n                // Edge Length\n                if (! edgeLength[hashes[j]]) {\n                    if (j === 0 || j === 1) edgeLength[hashes[j]] = _vector0.distanceTo(_vector1);\n                    if (j === 2 || j === 3) edgeLength[hashes[j]] = _vector1.distanceTo(_vector2);\n                    if (j === 4 || j === 5) edgeLength[hashes[j]] = _vector2.distanceTo(_vector0);\n                }\n            }\n\n            // Triangle Edge Reference\n            triangleEdgeHashes.push([ hashes[0], hashes[2], hashes[4] ]);\n        }\n\n        ///// Build Geometry, Set Attributes\n        attributeList.forEach((attributeName) => {\n            const attribute = existing.getAttribute(attributeName);\n            if (! attribute) return;\n            const floatArray = splitAttribute(attribute, attributeName);\n            split.setAttribute(attributeName, new THREE.BufferAttribute(floatArray, attribute.itemSize));\n        });\n\n        ///// Morph Attributes\n        const morphAttributes = existing.morphAttributes;\n        for (const attributeName in morphAttributes) {\n            const array = [];\n            const morphAttribute = morphAttributes[attributeName];\n\n            // Process Array of Float32BufferAttributes\n            for (let i = 0, l = morphAttribute.length; i < l; i++) {\n                if (morphAttribute[i].count !== vertexCount) continue;\n                const floatArray = splitAttribute(morphAttribute[i], attributeName, true);\n                array.push(new THREE.BufferAttribute(floatArray, morphAttribute[i].itemSize));\n            }\n            split.morphAttributes[attributeName] = array;\n        }\n        split.morphTargetsRelative = existing.morphTargetsRelative;\n\n        // Clean Up, Return New Geometry\n        existing.dispose();\n        return split;\n\n        // Loop Subdivide Function\n        function splitAttribute(attribute, attributeName, morph = false) {\n            const newTriangles = 4; /* maximum number of new triangles */\n            const arrayLength = (vertexCount * attribute.itemSize) * newTriangles;\n            const floatArray = new attribute.array.constructor(arrayLength);\n\n            const processGroups = (attributeName === 'position' && ! morph && existing.groups.length > 0);\n            let groupStart = undefined, groupMaterial = undefined;\n\n            let index = 0;\n            let skipped = 0;\n            let step = attribute.itemSize;\n            for (let i = 0; i < vertexCount; i += 3) {\n\n                // Verify Triangle is Valid\n                if (! triangleExist[i / 3]) {\n                    skipped += 3;\n                    continue;\n                }\n\n                // Get Triangle Points\n                _vector0.fromBufferAttribute(attribute, i + 0);\n                _vector1.fromBufferAttribute(attribute, i + 1);\n                _vector2.fromBufferAttribute(attribute, i + 2);\n\n                // Check for Shared Edges\n                const existingIndex = i / 3;\n                const edgeHash0to1 = triangleEdgeHashes[existingIndex][0];\n                const edgeHash1to2 = triangleEdgeHashes[existingIndex][1];\n                const edgeHash2to0 = triangleEdgeHashes[existingIndex][2];\n\n                const edgeCount0to1 = edgeHashToTriangle[edgeHash0to1].length;\n                const edgeCount1to2 = edgeHashToTriangle[edgeHash1to2].length;\n                const edgeCount2to0 = edgeHashToTriangle[edgeHash2to0].length;\n                const sharedCount = (edgeCount0to1 + edgeCount1to2 + edgeCount2to0) - 3;\n\n                // New Index (Before New Triangles, used for Groups)\n                const loopStartIndex = ((index * 3) / step) / 3;\n\n                // No Shared Edges\n                if (sharedCount === 0) {\n                    setTriangle(floatArray, index, step, _vector0, _vector1, _vector2); index += (step * 3);\n\n                // Shared Edges\n                } else {\n                    const length0to1 = edgeLength[edgeHash0to1];\n                    const length1to2 = edgeLength[edgeHash1to2];\n                    const length2to0 = edgeLength[edgeHash2to0];\n\n                    // Add New Triangle Positions\n                    if ((length0to1 > length1to2 || edgeCount1to2 <= 1) &&\n                        (length0to1 > length2to0 || edgeCount2to0 <= 1) && edgeCount0to1 > 1) {\n                        _center.copy(_vector0).add(_vector1).divideScalar(2.0);\n                        if (edgeCount2to0 > 1) {\n                            _midpoint.copy(_vector2).add(_vector0).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _vector0, _center, _midpoint); index += (step * 3);\n                            setTriangle(floatArray, index, step, _center, _vector2, _midpoint); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector0, _center, _vector2); index += (step * 3);\n                        }\n                        if (edgeCount1to2 > 1) {\n                            _midpoint.copy(_vector1).add(_vector2).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _center, _vector1, _midpoint); index += (step * 3);\n                            setTriangle(floatArray, index, step, _midpoint, _vector2, _center); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector1, _vector2, _center); index += (step * 3);\n                        }\n\n                    } else if ((length1to2 > length2to0 || edgeCount2to0 <= 1) && edgeCount1to2 > 1) {\n                        _center.copy(_vector1).add(_vector2).divideScalar(2.0);\n                        if (edgeCount0to1 > 1) {\n                            _midpoint.copy(_vector0).add(_vector1).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _center, _midpoint, _vector1); index += (step * 3);\n                            setTriangle(floatArray, index, step, _midpoint, _center, _vector0); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector1, _center, _vector0); index += (step * 3);\n                        }\n                        if (edgeCount2to0 > 1) {\n                            _midpoint.copy(_vector2).add(_vector0).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _center, _vector2, _midpoint); index += (step * 3);\n                            setTriangle(floatArray, index, step, _midpoint, _vector0, _center); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector2, _vector0, _center); index += (step * 3);\n                        }\n\n                    } else if (edgeCount2to0 > 1) {\n                        _center.copy(_vector2).add(_vector0).divideScalar(2.0);\n                        if (edgeCount1to2 > 1) {\n                            _midpoint.copy(_vector1).add(_vector2).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _vector2, _center, _midpoint); index += (step * 3);\n                            setTriangle(floatArray, index, step, _center, _vector1, _midpoint); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector2, _center, _vector1); index += (step * 3);\n                        }\n                        if (edgeCount0to1 > 1) {\n                            _midpoint.copy(_vector0).add(_vector1).divideScalar(2.0);\n                            setTriangle(floatArray, index, step, _vector0, _midpoint, _center); index += (step * 3);\n                            setTriangle(floatArray, index, step, _midpoint, _vector1, _center); index += (step * 3);\n                        } else {\n                            setTriangle(floatArray, index, step, _vector0, _vector1, _center); index += (step * 3);\n                        }\n\n                    } else {\n                        setTriangle(floatArray, index, step, _vector0, _vector1, _vector2); index += (step * 3);\n                    }\n                }\n\n                // Process Groups\n                if (processGroups) {\n                    existing.groups.forEach((group) => {\n                        if (group.start === (i - skipped)) {\n                            if (groupStart !== undefined && groupMaterial !== undefined) {\n                                split.addGroup(groupStart, loopStartIndex - groupStart, groupMaterial);\n                            }\n                            groupStart = loopStartIndex;\n                            groupMaterial = group.materialIndex;\n                        }\n                    });\n                }\n\n                // Reset Skipped Triangle Counter\n                skipped = 0;\n            }\n\n            // Resize Array\n            const reducedCount = (index * 3) / step;\n            const reducedArray = new attribute.array.constructor(reducedCount);\n            for (let i = 0; i < reducedCount; i++) {\n                reducedArray[i] = floatArray[i];\n            }\n\n            // Final Group\n            if (processGroups && groupStart !== undefined && groupMaterial !== undefined) {\n                split.addGroup(groupStart, (((index * 3) / step) / 3) - groupStart, groupMaterial);\n            }\n\n            return reducedArray;\n        }\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////\n    /////   Flat\n    ////////////////////\n\n    /** Applies one iteration of Loop (flat) subdivision (1 triangle split into 4 triangles) */\n    static flat(geometry, params = {}) {\n\n        ///// Geometries\n        if (! verifyGeometry(geometry)) return geometry;\n        const existing = (geometry.index !== null) ? geometry.toNonIndexed() : geometry.clone();\n        const loop = new THREE.BufferGeometry();\n\n        ///// Attributes\n        const attributeList = gatherAttributes(existing);\n        const vertexCount = existing.attributes.position.count;\n\n        ///// Build Geometry\n        attributeList.forEach((attributeName) => {\n            const attribute = existing.getAttribute(attributeName);\n            if (! attribute) return;\n\n            loop.setAttribute(attributeName, LoopSubdivision.flatAttribute(attribute, vertexCount, params));\n        });\n\n        ///// Morph Attributes\n        const morphAttributes = existing.morphAttributes;\n        for (const attributeName in morphAttributes) {\n            const array = [];\n            const morphAttribute = morphAttributes[attributeName];\n\n            // Process Array of Float32BufferAttributes\n\t\t\tfor (let i = 0, l = morphAttribute.length; i < l; i++) {\n                if (morphAttribute[i].count !== vertexCount) continue;\n                array.push(LoopSubdivision.flatAttribute(morphAttribute[i], vertexCount, params));\n            }\n            loop.morphAttributes[attributeName] = array;\n        }\n        loop.morphTargetsRelative = existing.morphTargetsRelative;\n\n        ///// Clean Up\n        existing.dispose();\n        return loop;\n    }\n\n    static flatAttribute(attribute, vertexCount, params = {}) {\n        const newTriangles = 4;\n        const arrayLength = (vertexCount * attribute.itemSize) * newTriangles;\n        const floatArray = new attribute.array.constructor(arrayLength);\n\n        let index = 0;\n        let step = attribute.itemSize;\n        for (let i = 0; i < vertexCount; i += 3) {\n\n            // Original Vertices\n            _vector0.fromBufferAttribute(attribute, i + 0);\n            _vector1.fromBufferAttribute(attribute, i + 1);\n            _vector2.fromBufferAttribute(attribute, i + 2);\n\n            // Midpoints\n            _vec0to1.copy(_vector0).add(_vector1).divideScalar(2.0);\n            _vec1to2.copy(_vector1).add(_vector2).divideScalar(2.0);\n            _vec2to0.copy(_vector2).add(_vector0).divideScalar(2.0);\n\n            // Add New Triangle Positions\n            setTriangle(floatArray, index, step, _vector0, _vec0to1, _vec2to0); index += (step * 3);\n            setTriangle(floatArray, index, step, _vector1, _vec1to2, _vec0to1); index += (step * 3);\n            setTriangle(floatArray, index, step, _vector2, _vec2to0, _vec1to2); index += (step * 3);\n            setTriangle(floatArray, index, step, _vec0to1, _vec1to2, _vec2to0); index += (step * 3);\n        }\n\n        return new THREE.BufferAttribute(floatArray, attribute.itemSize);\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////\n    /////   Smooth\n    ////////////////////\n\n    /** Applies one iteration of Loop (smooth) subdivision (1 triangle split into 4 triangles) */\n    static smooth(geometry, params = {}) {\n\n        if (typeof params !== 'object') params = {};\n\n        ///// Parameters\n        if (params.uvSmooth === undefined) params.uvSmooth = false;\n        if (params.preserveEdges === undefined) params.preserveEdges = false;\n\n        ///// Geometries\n        if (! verifyGeometry(geometry)) return geometry;\n        const existing = (geometry.index !== null) ? geometry.toNonIndexed() : geometry.clone();\n        const flat = LoopSubdivision.flat(existing, params);\n        const loop = new THREE.BufferGeometry();\n\n        ///// Attributes\n        const attributeList = gatherAttributes(existing);\n        const vertexCount = existing.attributes.position.count;\n        const posAttribute = existing.getAttribute('position');\n        const flatPosition = flat.getAttribute('position');\n        const hashToIndex = {};             // Position hash mapped to index values of same position\n        const existingNeighbors = {};       // Position hash mapped to existing vertex neighbors\n        const flatOpposites = {};           // Position hash mapped to new edge point opposites\n        const existingEdges = {};\n\n        function addNeighbor(posHash, neighborHash, index) {\n            if (! existingNeighbors[posHash]) existingNeighbors[posHash] = {};\n            if (! existingNeighbors[posHash][neighborHash]) existingNeighbors[posHash][neighborHash] = [];\n            existingNeighbors[posHash][neighborHash].push(index);\n        }\n\n        function addOpposite(posHash, index) {\n            if (! flatOpposites[posHash]) flatOpposites[posHash] = [];\n            flatOpposites[posHash].push(index);\n        }\n\n        function addEdgePoint(posHash, edgeHash) {\n            if (! existingEdges[posHash]) existingEdges[posHash] = new Set();\n            existingEdges[posHash].add(edgeHash);\n        }\n\n        ///// Existing Vertex Hashes\n        for (let i = 0; i < vertexCount; i += 3) {\n            const posHash0 = hashFromVector(_vertex[0].fromBufferAttribute(posAttribute, i + 0));\n            const posHash1 = hashFromVector(_vertex[1].fromBufferAttribute(posAttribute, i + 1));\n            const posHash2 = hashFromVector(_vertex[2].fromBufferAttribute(posAttribute, i + 2));\n\n            // Neighbors (of Existing Geometry)\n            addNeighbor(posHash0, posHash1, i + 1);\n            addNeighbor(posHash0, posHash2, i + 2);\n            addNeighbor(posHash1, posHash0, i + 0);\n            addNeighbor(posHash1, posHash2, i + 2);\n            addNeighbor(posHash2, posHash0, i + 0);\n            addNeighbor(posHash2, posHash1, i + 1);\n\n            // Opposites (of new FlatSubdivided vertices)\n            _vec0to1.copy(_vertex[0]).add(_vertex[1]).divideScalar(2.0);\n            _vec1to2.copy(_vertex[1]).add(_vertex[2]).divideScalar(2.0);\n            _vec2to0.copy(_vertex[2]).add(_vertex[0]).divideScalar(2.0);\n            const hash0to1 = hashFromVector(_vec0to1);\n            const hash1to2 = hashFromVector(_vec1to2);\n            const hash2to0 = hashFromVector(_vec2to0);\n            addOpposite(hash0to1, i + 2);\n            addOpposite(hash1to2, i + 0);\n            addOpposite(hash2to0, i + 1);\n\n            // Track Edges for 'edgePreserve'\n            addEdgePoint(posHash0, hash0to1);\n            addEdgePoint(posHash0, hash2to0);\n            addEdgePoint(posHash1, hash0to1);\n            addEdgePoint(posHash1, hash1to2);\n            addEdgePoint(posHash2, hash1to2);\n            addEdgePoint(posHash2, hash2to0);\n        }\n\n        ///// Flat Position to Index Map\n        for (let i = 0; i < flat.attributes.position.count; i++) {\n            const posHash = hashFromVector(_temp.fromBufferAttribute(flatPosition, i));\n            if (! hashToIndex[posHash]) hashToIndex[posHash] = [];\n            hashToIndex[posHash].push(i);\n        }\n\n        ///// Build Geometry, Set Attributes\n        attributeList.forEach((attributeName) => {\n            const existingAttribute = existing.getAttribute(attributeName);\n            const flattenedAttribute = flat.getAttribute(attributeName);\n            if (existingAttribute === undefined || flattenedAttribute === undefined) return;\n\n            const floatArray = subdivideAttribute(attributeName, existingAttribute, flattenedAttribute);\n            loop.setAttribute(attributeName, new THREE.BufferAttribute(floatArray, flattenedAttribute.itemSize));\n        });\n\n        ///// Morph Attributes\n        const morphAttributes = existing.morphAttributes;\n        for (const attributeName in morphAttributes) {\n            const array = [];\n            const morphAttribute = morphAttributes[attributeName];\n\n            // Process Array of Float32BufferAttributes\n            for (let i = 0, l = morphAttribute.length; i < l; i++) {\n                if (morphAttribute[i].count !== vertexCount) continue;\n                const existingAttribute = morphAttribute[i];\n                const flattenedAttribute = LoopSubdivision.flatAttribute(morphAttribute[i], morphAttribute[i].count, params)\n\n                const floatArray = subdivideAttribute(attributeName, existingAttribute, flattenedAttribute);\n                array.push(new THREE.BufferAttribute(floatArray, flattenedAttribute.itemSize));\n            }\n            loop.morphAttributes[attributeName] = array;\n        }\n        loop.morphTargetsRelative = existing.morphTargetsRelative;\n\n        ///// Clean Up\n        flat.dispose();\n        existing.dispose();\n        return loop;\n\n        //////////\n\n        // Loop Subdivide Function\n        function subdivideAttribute(attributeName, existingAttribute, flattenedAttribute) {\n            const arrayLength = (flat.attributes.position.count * flattenedAttribute.itemSize);\n            const floatArray = new existingAttribute.array.constructor(arrayLength);\n\n            // Process Triangles\n            let index = 0;\n            for (let i = 0; i < flat.attributes.position.count; i += 3) {\n\n                // Process Triangle Points\n                for (let v = 0; v < 3; v++) {\n\n                    if (attributeName === 'uv' && ! params.uvSmooth) {\n\n                        _vertex[v].fromBufferAttribute(flattenedAttribute, i + v);\n\n                    } else if (attributeName === 'normal') { // && params.normalSmooth) {\n\n                        _position[v].fromBufferAttribute(flatPosition, i + v);\n                        const positionHash = hashFromVector(_position[v]);\n                        const positions = hashToIndex[positionHash];\n\n                        const k = Object.keys(positions).length;\n                        const beta = 0.75 / k;\n                        const startWeight = 1.0 - (beta * k);\n\n                        _vertex[v].fromBufferAttribute(flattenedAttribute, i + v);\n                        _vertex[v].multiplyScalar(startWeight);\n\n                        positions.forEach(positionIndex => {\n                            _average.fromBufferAttribute(flattenedAttribute, positionIndex);\n                            _average.multiplyScalar(beta);\n                            _vertex[v].add(_average);\n                        });\n\n\n                    } else { // 'position', 'color', etc...\n\n                        _vertex[v].fromBufferAttribute(flattenedAttribute, i + v);\n                        _position[v].fromBufferAttribute(flatPosition, i + v);\n\n                        const positionHash = hashFromVector(_position[v]);\n                        const neighbors = existingNeighbors[positionHash];\n                        const opposites = flatOpposites[positionHash];\n\n                        ///// Adjust Source Vertex\n                        if (neighbors) {\n\n                            // Check Edges have even Opposite Points\n                            if (params.preserveEdges) {\n                                const edgeSet = existingEdges[positionHash];\n                                let hasPair = true;\n                                for (const edgeHash of edgeSet) {\n                                    if (flatOpposites[edgeHash].length % 2 !== 0) hasPair = false;\n                                }\n                                if (! hasPair) continue;\n                            }\n\n                            // Number of Neighbors\n                            const k = Object.keys(neighbors).length;\n\n                            ///// Loop's Formula\n                            const beta = 1 / k * ((5/8) - Math.pow((3/8) + (1/4) * Math.cos(2 * Math.PI / k), 2));\n\n                            ///// Warren's Formula\n                            // const beta = (k > 3) ? 3 / (8 * k) : ((k === 3) ? 3 / 16 : 0);\n\n                            ///// Stevinz' Formula\n                            // const beta = 0.5 / k;\n\n                            ///// Corners\n                            const heavy = (1 / k) / k;\n\n                            ///// Interpolate Beta -> Heavy\n                            const weight = lerp(heavy, beta, params.weight);\n\n                            ///// Average with Neighbors\n                            const startWeight = 1.0 - (weight * k);\n                            _vertex[v].multiplyScalar(startWeight);\n\n                            for (let neighborHash in neighbors) {\n                                const neighborIndices = neighbors[neighborHash];\n\n                                _average.set(0, 0, 0);\n                                for (let j = 0; j < neighborIndices.length; j++) {\n                                    _average.add(_temp.fromBufferAttribute(existingAttribute, neighborIndices[j]));\n                                }\n                                _average.divideScalar(neighborIndices.length);\n\n                                _average.multiplyScalar(weight);\n                                _vertex[v].add(_average);\n                            }\n\n                        ///// Newly Added Edge Vertex\n                        } else if (opposites && opposites.length === 2) {\n                            const k = opposites.length;\n                            const beta = 0.125; /* 1/8 */\n                            const startWeight = 1.0 - (beta * k);\n                            _vertex[v].multiplyScalar(startWeight);\n\n                            opposites.forEach(oppositeIndex => {\n                                _average.fromBufferAttribute(existingAttribute, oppositeIndex);\n                                _average.multiplyScalar(beta);\n                                _vertex[v].add(_average);\n                            });\n                        }\n                    }\n                }\n\n                // Add New Triangle Position\n                setTriangle(floatArray, index, flattenedAttribute.itemSize, _vertex[0], _vertex[1], _vertex[2]);\n                index += (flattenedAttribute.itemSize * 3);\n            }\n\n            return floatArray;\n        }\n\n    }\n\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n/////   Local Functions, Hash\n/////////////////////////////////////////////////////////////////////////////////////\n\nconst _positionShift = Math.pow(10, POSITION_DECIMALS);\n\n/** Compares two numbers to see if they're almost the same */\nfunction fuzzy(a, b, tolerance = 0.00001) {\n    return ((a < (b + tolerance)) && (a > (b - tolerance)));\n}\n\n/** Generates hash strong from Number */\nfunction hashFromNumber(num, shift = _positionShift) {\n    let roundedNumber = round(num * shift);\n    if (roundedNumber == 0) roundedNumber = 0; /* prevent -0 (signed 0 can effect Math.atan2(), etc.) */\n    return `${roundedNumber}`;\n}\n\n/** Generates hash strong from Vector3 */\nfunction hashFromVector(vector, shift = _positionShift) {\n    return `${hashFromNumber(vector.x, shift)},${hashFromNumber(vector.y, shift)},${hashFromNumber(vector.z, shift)}`;\n}\n\nfunction lerp(x, y, t) {\n    return (1 - t) * x + t * y;\n}\n\nfunction round(x) {\n    return (x + ((x > 0) ? 0.5 : -0.5)) << 0;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n/////   Local Functions, Geometry\n/////////////////////////////////////////////////////////////////////////////////////\n\nfunction calcNormal(target, vec1, vec2, vec3) {\n    _temp.subVectors(vec1, vec2);\n    target.subVectors(vec2, vec3);\n    target.cross(_temp).normalize();\n}\n\nfunction gatherAttributes(geometry) {\n    const desired = [ 'position', 'normal', 'uv' ];\n    const contains = Object.keys(geometry.attributes);\n    const attributeList = Array.from(new Set(desired.concat(contains)));\n    return attributeList;\n}\n\nfunction setTriangle(positions, index, step, vec0, vec1, vec2) {\n    if (step >= 1) {\n        positions[index + 0 + (step * 0)] = vec0.x;\n        positions[index + 0 + (step * 1)] = vec1.x;\n        positions[index + 0 + (step * 2)] = vec2.x;\n    }\n    if (step >= 2) {\n        positions[index + 1 + (step * 0)] = vec0.y;\n        positions[index + 1 + (step * 1)] = vec1.y;\n        positions[index + 1 + (step * 2)] = vec2.y;\n    }\n    if (step >= 3) {\n        positions[index + 2 + (step * 0)] = vec0.z;\n        positions[index + 2 + (step * 1)] = vec1.z;\n        positions[index + 2 + (step * 2)] = vec2.z;\n    }\n    if (step >= 4) {\n        positions[index + 3 + (step * 0)] = vec0.w;\n        positions[index + 3 + (step * 1)] = vec1.w;\n        positions[index + 3 + (step * 2)] = vec2.w;\n    }\n}\n\nfunction verifyGeometry(geometry) {\n    if (geometry === undefined) {\n        console.warn(`LoopSubdivision: Geometry provided is undefined`);\n        return false;\n    }\n\n    if (! geometry.isBufferGeometry) {\n        console.warn(`LoopSubdivision: Geometry provided is not 'BufferGeometry' type`);\n        return false;\n    }\n\n    if (geometry.attributes.position === undefined) {\n        console.warn(`LoopSubdivision: Geometry provided missing required 'position' attribute`);\n        return false;\n    }\n\n    if (geometry.attributes.normal === undefined) {\n        geometry.computeVertexNormals();\n    }\n    return true;\n}\n"],"names":["THREE"],"mappings":"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"}