examples/vr_crop/convex_geometry.js
function ConvexBufferGeometry(points) {
    THREE.BufferGeometry.call(this);

    this.type = 'ConvexBufferGeometry';

    // buffers

    var vertices = [];
    var normals = [];

    // execute QuickHull

    if (THREE.QuickHull === undefined) {
      console.error('THREE.ConvexBufferGeometry: ConvexBufferGeometry relies on THREE.QuickHull');
    }

    var quickHull = new THREE.QuickHull().setFromPoints(points);

    // generate vertices and normals

    var faces = quickHull.faces;

    for (var i = 0; i < faces.length; i++) {
      var face = faces[i];
      var edge = face.edge;

      // we move along a doubly-connected edge list to access all face points (see HalfEdge docs)

      do {
        var point = edge.head().point;

        vertices.push(point.x, point.y, point.z);
        normals.push(face.normal.x, face.normal.y, face.normal.z);

        edge = edge.next;
      } while (edge !== face.edge);
    }

    // build geometry

    this.addAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
  }
function ConvexBufferGeometry(points) {
    THREE.BufferGeometry.call(this);

    this.type = 'ConvexBufferGeometry';

    // buffers

    var vertices = [];
    var normals = [];

    // execute QuickHull

    if (THREE.QuickHull === undefined) {
      console.error('THREE.ConvexBufferGeometry: ConvexBufferGeometry relies on THREE.QuickHull');
    }

    var quickHull = new THREE.QuickHull().setFromPoints(points);

    // generate vertices and normals

    var faces = quickHull.faces;

    for (var i = 0; i < faces.length; i++) {
      var face = faces[i];
      var edge = face.edge;

      // we move along a doubly-connected edge list to access all face points (see HalfEdge docs)

      do {
        var point = edge.head().point;

        vertices.push(point.x, point.y, point.z);
        normals.push(face.normal.x, face.normal.y, face.normal.z);

        edge = edge.next;
      } while (edge !== face.edge);
    }

    // build geometry

    this.addAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
  }
ConvexBufferGeometry