{"version":3,"file":"ConvexObjectBreaker.cjs","sources":["../../src/misc/ConvexObjectBreaker.js"],"sourcesContent":["import { Line3, Mesh, Plane, Vector3 } from 'three'\nimport { ConvexGeometry } from '../geometries/ConvexGeometry'\n\n/**\n * @fileoverview This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Usage:\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n *\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane)\n *\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n *\n *  - Mesh object must have a buffer geometry and a material\n *\n *  - Vertex normals must be planar (not smoothed)\n *\n *  - The geometry must be convex (this is not checked in the library). You can create convex\n *  geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives\n *  can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @param {double} minSizeForBreak Min size a debris can have to break.\n * @param {double} smallDelta Max distance to consider that a point belongs to a plane.\n *\n */\n\nconst _v1 = /* @__PURE__ */ new Vector3()\n\nconst ConvexObjectBreaker = /* @__PURE__ */ (() => {\n  class ConvexObjectBreaker {\n    constructor(minSizeForBreak = 1.4, smallDelta = 0.0001) {\n      this.minSizeForBreak = minSizeForBreak\n      this.smallDelta = smallDelta\n\n      this.tempLine1 = new Line3()\n      this.tempPlane1 = new Plane()\n      this.tempPlane2 = new Plane()\n      this.tempPlane_Cut = new Plane()\n      this.tempCM1 = new Vector3()\n      this.tempCM2 = new Vector3()\n      this.tempVector3 = new Vector3()\n      this.tempVector3_2 = new Vector3()\n      this.tempVector3_3 = new Vector3()\n      this.tempVector3_P0 = new Vector3()\n      this.tempVector3_P1 = new Vector3()\n      this.tempVector3_P2 = new Vector3()\n      this.tempVector3_N0 = new Vector3()\n      this.tempVector3_N1 = new Vector3()\n      this.tempVector3_AB = new Vector3()\n      this.tempVector3_CB = new Vector3()\n      this.tempResultObjects = { object1: null, object2: null }\n\n      this.segments = []\n      const n = 30 * 30\n      for (let i = 0; i < n; i++) this.segments[i] = false\n    }\n\n    prepareBreakableObject(object, mass, velocity, angularVelocity, breakable) {\n      // object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n      // Its material property is propagated to its children (sub-pieces)\n      // mass must be > 0\n\n      const userData = object.userData\n      userData.mass = mass\n      userData.velocity = velocity.clone()\n      userData.angularVelocity = angularVelocity.clone()\n      userData.breakable = breakable\n    }\n\n    /*\n     * @param {int} maxRadialIterations Iterations for radial cuts.\n     * @param {int} maxRandomIterations Max random iterations for not-radial cuts\n     *\n     * Returns the array of pieces\n     */\n    subdivideByImpact(object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations) {\n      const debris = []\n\n      const tempPlane1 = this.tempPlane1\n      const tempPlane2 = this.tempPlane2\n\n      this.tempVector3.addVectors(pointOfImpact, normal)\n      tempPlane1.setFromCoplanarPoints(pointOfImpact, object.position, this.tempVector3)\n\n      const maxTotalIterations = maxRandomIterations + maxRadialIterations\n\n      const scope = this\n\n      function subdivideRadial(subObject, startAngle, endAngle, numIterations) {\n        if (Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations) {\n          debris.push(subObject)\n\n          return\n        }\n\n        let angle = Math.PI\n\n        if (numIterations === 0) {\n          tempPlane2.normal.copy(tempPlane1.normal)\n          tempPlane2.constant = tempPlane1.constant\n        } else {\n          if (numIterations <= maxRadialIterations) {\n            angle = (endAngle - startAngle) * (0.2 + 0.6 * Math.random()) + startAngle\n\n            // Rotate tempPlane2 at impact point around normal axis and the angle\n            scope.tempVector3_2\n              .copy(object.position)\n              .sub(pointOfImpact)\n              .applyAxisAngle(normal, angle)\n              .add(pointOfImpact)\n            tempPlane2.setFromCoplanarPoints(pointOfImpact, scope.tempVector3, scope.tempVector3_2)\n          } else {\n            angle = (0.5 * (numIterations & 1) + 0.2 * (2 - Math.random())) * Math.PI\n\n            // Rotate tempPlane2 at object position around normal axis and the angle\n            scope.tempVector3_2\n              .copy(pointOfImpact)\n              .sub(subObject.position)\n              .applyAxisAngle(normal, angle)\n              .add(subObject.position)\n            scope.tempVector3_3.copy(normal).add(subObject.position)\n            tempPlane2.setFromCoplanarPoints(subObject.position, scope.tempVector3_3, scope.tempVector3_2)\n          }\n        }\n\n        // Perform the cut\n        scope.cutByPlane(subObject, tempPlane2, scope.tempResultObjects)\n\n        const obj1 = scope.tempResultObjects.object1\n        const obj2 = scope.tempResultObjects.object2\n\n        if (obj1) {\n          subdivideRadial(obj1, startAngle, angle, numIterations + 1)\n        }\n\n        if (obj2) {\n          subdivideRadial(obj2, angle, endAngle, numIterations + 1)\n        }\n      }\n\n      subdivideRadial(object, 0, 2 * Math.PI, 0)\n\n      return debris\n    }\n\n    cutByPlane(object, plane, output) {\n      // Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n      // object2 can be null if the plane doesn't cut the object.\n      // object1 can be null only in case of internal error\n      // Returned value is number of pieces, 0 for error.\n\n      const geometry = object.geometry\n      const coords = geometry.attributes.position.array\n      const normals = geometry.attributes.normal.array\n\n      const numPoints = coords.length / 3\n      let numFaces = numPoints / 3\n\n      let indices = geometry.getIndex()\n\n      if (indices) {\n        indices = indices.array\n        numFaces = indices.length / 3\n      }\n\n      function getVertexIndex(faceIdx, vert) {\n        // vert = 0, 1 or 2.\n\n        const idx = faceIdx * 3 + vert\n\n        return indices ? indices[idx] : idx\n      }\n\n      const points1 = []\n      const points2 = []\n\n      const delta = this.smallDelta\n\n      // Reset segments mark\n      const numPointPairs = numPoints * numPoints\n      for (let i = 0; i < numPointPairs; i++) this.segments[i] = false\n\n      const p0 = this.tempVector3_P0\n      const p1 = this.tempVector3_P1\n      const n0 = this.tempVector3_N0\n      const n1 = this.tempVector3_N1\n\n      // Iterate through the faces to mark edges shared by coplanar faces\n      for (let i = 0; i < numFaces - 1; i++) {\n        const a1 = getVertexIndex(i, 0)\n        const b1 = getVertexIndex(i, 1)\n        const c1 = getVertexIndex(i, 2)\n\n        // Assuming all 3 vertices have the same normal\n        n0.set(normals[a1], normals[a1] + 1, normals[a1] + 2)\n\n        for (let j = i + 1; j < numFaces; j++) {\n          const a2 = getVertexIndex(j, 0)\n          const b2 = getVertexIndex(j, 1)\n          const c2 = getVertexIndex(j, 2)\n\n          // Assuming all 3 vertices have the same normal\n          n1.set(normals[a2], normals[a2] + 1, normals[a2] + 2)\n\n          const coplanar = 1 - n0.dot(n1) < delta\n\n          if (coplanar) {\n            if (a1 === a2 || a1 === b2 || a1 === c2) {\n              if (b1 === a2 || b1 === b2 || b1 === c2) {\n                this.segments[a1 * numPoints + b1] = true\n                this.segments[b1 * numPoints + a1] = true\n              } else {\n                this.segments[c1 * numPoints + a1] = true\n                this.segments[a1 * numPoints + c1] = true\n              }\n            } else if (b1 === a2 || b1 === b2 || b1 === c2) {\n              this.segments[c1 * numPoints + b1] = true\n              this.segments[b1 * numPoints + c1] = true\n            }\n          }\n        }\n      }\n\n      // Transform the plane to object local space\n      const localPlane = this.tempPlane_Cut\n      object.updateMatrix()\n      ConvexObjectBreaker.transformPlaneToLocalSpace(plane, object.matrix, localPlane)\n\n      // Iterate through the faces adding points to both pieces\n      for (let i = 0; i < numFaces; i++) {\n        const va = getVertexIndex(i, 0)\n        const vb = getVertexIndex(i, 1)\n        const vc = getVertexIndex(i, 2)\n\n        for (let segment = 0; segment < 3; segment++) {\n          const i0 = segment === 0 ? va : segment === 1 ? vb : vc\n          const i1 = segment === 0 ? vb : segment === 1 ? vc : va\n\n          const segmentState = this.segments[i0 * numPoints + i1]\n\n          if (segmentState) continue // The segment already has been processed in another face\n\n          // Mark segment as processed (also inverted segment)\n          this.segments[i0 * numPoints + i1] = true\n          this.segments[i1 * numPoints + i0] = true\n\n          p0.set(coords[3 * i0], coords[3 * i0 + 1], coords[3 * i0 + 2])\n          p1.set(coords[3 * i1], coords[3 * i1 + 1], coords[3 * i1 + 2])\n\n          // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n          let mark0 = 0\n\n          let d = localPlane.distanceToPoint(p0)\n\n          if (d > delta) {\n            mark0 = 2\n            points2.push(p0.clone())\n          } else if (d < -delta) {\n            mark0 = 1\n            points1.push(p0.clone())\n          } else {\n            mark0 = 3\n            points1.push(p0.clone())\n            points2.push(p0.clone())\n          }\n\n          // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n          let mark1 = 0\n\n          d = localPlane.distanceToPoint(p1)\n\n          if (d > delta) {\n            mark1 = 2\n            points2.push(p1.clone())\n          } else if (d < -delta) {\n            mark1 = 1\n            points1.push(p1.clone())\n          } else {\n            mark1 = 3\n            points1.push(p1.clone())\n            points2.push(p1.clone())\n          }\n\n          if ((mark0 === 1 && mark1 === 2) || (mark0 === 2 && mark1 === 1)) {\n            // Intersection of segment with the plane\n\n            this.tempLine1.start.copy(p0)\n            this.tempLine1.end.copy(p1)\n\n            let intersection = new Vector3()\n            intersection = localPlane.intersectLine(this.tempLine1, intersection)\n\n            if (intersection === null) {\n              // Shouldn't happen\n              console.error('Internal error: segment does not intersect plane.')\n              output.segmentedObject1 = null\n              output.segmentedObject2 = null\n              return 0\n            }\n\n            points1.push(intersection)\n            points2.push(intersection.clone())\n          }\n        }\n      }\n\n      // Calculate debris mass (very fast and imprecise):\n      const newMass = object.userData.mass * 0.5\n\n      // Calculate debris Center of Mass (again fast and imprecise)\n      this.tempCM1.set(0, 0, 0)\n      let radius1 = 0\n      const numPoints1 = points1.length\n\n      if (numPoints1 > 0) {\n        for (let i = 0; i < numPoints1; i++) this.tempCM1.add(points1[i])\n\n        this.tempCM1.divideScalar(numPoints1)\n        for (let i = 0; i < numPoints1; i++) {\n          const p = points1[i]\n          p.sub(this.tempCM1)\n          radius1 = Math.max(radius1, p.x, p.y, p.z)\n        }\n\n        this.tempCM1.add(object.position)\n      }\n\n      this.tempCM2.set(0, 0, 0)\n      let radius2 = 0\n      const numPoints2 = points2.length\n      if (numPoints2 > 0) {\n        for (let i = 0; i < numPoints2; i++) this.tempCM2.add(points2[i])\n\n        this.tempCM2.divideScalar(numPoints2)\n        for (let i = 0; i < numPoints2; i++) {\n          const p = points2[i]\n          p.sub(this.tempCM2)\n          radius2 = Math.max(radius2, p.x, p.y, p.z)\n        }\n\n        this.tempCM2.add(object.position)\n      }\n\n      let object1 = null\n      let object2 = null\n\n      let numObjects = 0\n\n      if (numPoints1 > 4) {\n        object1 = new Mesh(new ConvexGeometry(points1), object.material)\n        object1.position.copy(this.tempCM1)\n        object1.quaternion.copy(object.quaternion)\n\n        this.prepareBreakableObject(\n          object1,\n          newMass,\n          object.userData.velocity,\n          object.userData.angularVelocity,\n          2 * radius1 > this.minSizeForBreak,\n        )\n\n        numObjects++\n      }\n\n      if (numPoints2 > 4) {\n        object2 = new Mesh(new ConvexGeometry(points2), object.material)\n        object2.position.copy(this.tempCM2)\n        object2.quaternion.copy(object.quaternion)\n\n        this.prepareBreakableObject(\n          object2,\n          newMass,\n          object.userData.velocity,\n          object.userData.angularVelocity,\n          2 * radius2 > this.minSizeForBreak,\n        )\n\n        numObjects++\n      }\n\n      output.object1 = object1\n      output.object2 = object2\n\n      return numObjects\n    }\n\n    static transformFreeVector(v, m) {\n      // input:\n      // vector interpreted as a free vector\n      // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n      const x = v.x,\n        y = v.y,\n        z = v.z\n      const e = m.elements\n\n      v.x = e[0] * x + e[4] * y + e[8] * z\n      v.y = e[1] * x + e[5] * y + e[9] * z\n      v.z = e[2] * x + e[6] * y + e[10] * z\n\n      return v\n    }\n\n    static transformFreeVectorInverse(v, m) {\n      // input:\n      // vector interpreted as a free vector\n      // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n      const x = v.x,\n        y = v.y,\n        z = v.z\n      const e = m.elements\n\n      v.x = e[0] * x + e[1] * y + e[2] * z\n      v.y = e[4] * x + e[5] * y + e[6] * z\n      v.z = e[8] * x + e[9] * y + e[10] * z\n\n      return v\n    }\n\n    static transformTiedVectorInverse(v, m) {\n      // input:\n      // vector interpreted as a tied (ordinary) vector\n      // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n      const x = v.x,\n        y = v.y,\n        z = v.z\n      const e = m.elements\n\n      v.x = e[0] * x + e[1] * y + e[2] * z - e[12]\n      v.y = e[4] * x + e[5] * y + e[6] * z - e[13]\n      v.z = e[8] * x + e[9] * y + e[10] * z - e[14]\n\n      return v\n    }\n\n    static transformPlaneToLocalSpace(plane, m, resultPlane) {\n      resultPlane.normal.copy(plane.normal)\n      resultPlane.constant = plane.constant\n\n      const referencePoint = ConvexObjectBreaker.transformTiedVectorInverse(plane.coplanarPoint(_v1), m)\n\n      ConvexObjectBreaker.transformFreeVectorInverse(resultPlane.normal, m)\n\n      // recalculate constant (like in setFromNormalAndCoplanarPoint)\n      resultPlane.constant = -referencePoint.dot(resultPlane.normal)\n    }\n  }\n\n  return ConvexObjectBreaker\n})()\n\nexport { ConvexObjectBreaker }\n"],"names":["Vector3","ConvexObjectBreaker","Line3","Plane","Mesh","ConvexGeometry"],"mappings":"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"}