       .invert()
     new ThreeBSP us.build(them.allPolygons()), @matrix
 
-  intersect: (other) =>
+  intersect: (other) => @options.timer.doTask => other.withTimer @options.timer, =>
     [us, them] = [@tree.clone(), other.tree.clone()]
     them
       .clipTo(us.invert())

      .invert()
    new ThreeBSP us.build(them.allPolygons()).invert(), @matrix, @options

  union: (other) =>
    [us, them] = [@tree.clone(), other.tree.clone()]
    us.clipTo them
    them

    new ThreeBSP.Node polygons, @options

  # Converters/Exporters
  toMesh: (material=new THREE.MeshNormalMaterial()) => @options.timer.doTask =>
    geometry = @toGeometry()
    returning (mesh = new THREE.Mesh geometry, material), =>
      mesh.position.getPositionFromMatrix @matrix
      mesh.rotation.setEulerFromRotationMatrix @matrix

  toGeometry: () => @options.timer.doTask =>
    matrix = new THREE.Matrix4().getInverse @matrix

    returning (geometry = new THREE.Geometry()), =>
      for polygon in @tree.allPolygons()
        @options.timer.doTask =>
          polyVerts = (v.clone().applyMatrix4(matrix) for v in polygon.vertices)
          for idx in [2...polyVerts.length]
            verts = [polyVerts[0], polyVerts[idx-1], polyVerts[idx]]
            vertUvs = (new THREE.Vector2(v.uv?.x, v.uv?.y) for v in verts)

            face = new THREE.Face3 (geometry.vertices.push(v) - 1 for v in verts)..., polygon.normal.clone()
            geometry.faces.push face
            geometry.faceVertexUvs[0].push vertUvs

  # CSG Operations
  subtract: (other) => @options.timer.doTask => other.withTimer @options.timer, =>
