UpdateSpotLightVisualizer function

void UpdateSpotLightVisualizer(
  1. MeshData md,
  2. Vector3 pos,
  3. Vector3 dir,
  4. double range,
  5. double angle,
)

Implementation

void UpdateSpotLightVisualizer(
    MeshData md, VM.Vector3 pos, VM.Vector3 dir, double range, double angle) {
  final int kSpines = 8;
  VM.Vector3 center = pos + dir.normalized() * range;
  List<VM.Vector3> points = [pos, center];
  VM.Vector3 ortho = GetOrthogonalVector3(dir)
    ..normalize()
    ..scale(Math.tan(angle) * range);
  for (int i = 0; i < kSpines; i++) {
    VM.Vector3 p = ortho.clone()
      ..applyAxisAngle(dir, i * 2.0 * Math.pi / kSpines)
      ..add(center);
    points.add(p);
  }
  List<int> faces = [];
  for (int i = 1; i < points.length; ++i) {
    faces.add(0);
    faces.add(i);
  }

  // funnel
  for (int i = 3; i < points.length; ++i) {
    faces.add(i - 1);
    faces.add(i);
  }
  faces.add(points.length - 1);
  faces.add(2);

  // cross
  for (int i = 2; i < points.length; ++i) {
    if (i % 2 == 0) {
      faces.add(1);
      faces.add(i);
    }
  }
  md.ChangeVertexData(FlattenVector3List(points));
  md.ChangeFaces(faces);
}