GenerateAveragedNormalsAssumingTriangleMode method

void GenerateAveragedNormalsAssumingTriangleMode()

Implementation

void GenerateAveragedNormalsAssumingTriangleMode() {
  Map<VM.Vector3, VM.Vector3> avg = <VM.Vector3, VM.Vector3>{};
  //Map<VM.Vector3, double> cnt = {};
  VM.Vector3 temp = VM.Vector3.zero();
  VM.Vector3 norm = VM.Vector3.zero();

  void add(int index, VM.Vector3 n) {
    VM.Vector3 v = vertices[index];
    if (avg.containsKey(v)) {
      avg[v] = avg[n]! + n;
      //cnt[v]++;
    } else {
      avg[v] = n;
      //cnt[v] = 1;
    }
  }

  for (Face3 f3 in faces3) {
    NormalFromPoints(
        vertices[f3.a], vertices[f3.b], vertices[f3.c], temp, norm);
    VM.Vector3 n = norm.clone();
    add(f3.a, n);
    add(f3.b, n);
    add(f3.c, n);
  }

  for (Face4 f4 in faces4) {
    NormalFromPoints(
        vertices[f4.a], vertices[f4.b], vertices[f4.c], temp, norm);
    VM.Vector3 n = norm.clone()..scale(2.0);
    add(f4.a, n);
    add(f4.b, n);
    add(f4.c, n);
    add(f4.d, n);
  }

  for (VM.Vector3 key in avg.keys) {
    avg[key] = avg[key]!..normalize();
  }
  List<VM.Vector3> normals =
      List.generate(vertices.length, (i) => avg[vertices[i]]!);

  attributes[aNormal] = normals;
}