raycast method

  1. @override
void raycast(
  1. Raycaster raycaster,
  2. List<Intersection> intersects
)
override

Implementation

@override
void raycast(Raycaster raycaster, List<Intersection> intersects) {
  var geometry = this.geometry!;
  var matrixWorld = this.matrixWorld;
  var threshold = raycaster.params["Points"].threshold;
  var drawRange = geometry.drawRange;

  // Checking boundingSphere distance to ray

  if (geometry.boundingSphere == null) geometry.computeBoundingSphere();

  _pointssphere.copy(geometry.boundingSphere!);
  _pointssphere.applyMatrix4(matrixWorld);
  _pointssphere.radius += threshold;

  if (raycaster.ray.intersectsSphere(_pointssphere) == false) return;

  //

  _pointsinverseMatrix.copy(matrixWorld).invert();
  _pointsray.copy(raycaster.ray).applyMatrix4(_pointsinverseMatrix);

  var localThreshold = threshold / ((scale.x + scale.y + scale.z) / 3);
  var localThresholdSq = localThreshold * localThreshold;

  var index = geometry.index;
  var attributes = geometry.attributes;
  var positionAttribute = attributes["position"];

  if (index != null) {
    var start = Math.max(0, drawRange["start"]!);
    var end = Math.min(index.count, (drawRange["start"]! + drawRange["count"]!));

    for (var i = start, il = end; i < il; i++) {
      var a = index.getX(i)!;

      _position.fromBufferAttribute(positionAttribute, a.toInt());

      testPoint(_position, a, localThresholdSq, matrixWorld, raycaster, intersects, this);
    }
  } else {
    var start = Math.max(0, drawRange["start"]!);
    var end = Math.min<int>(positionAttribute.count, (drawRange["start"]! + drawRange["count"]!));

    for (var i = start, l = end; i < l; i++) {
      _position.fromBufferAttribute(positionAttribute, i);

      testPoint(_position, i, localThresholdSq, matrixWorld, raycaster, intersects, this);
    }
  }
}