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;
}