toTrianglesDrawMode top-level property
@param {BufferGeometry} geometry @param {Number} drawMode @return {BufferGeometry}
Implementation
Function toTrianglesDrawMode = (BufferGeometry geometry, num drawMode) {
BufferAttribute? index = geometry.getIndex();
// generate index if not present
if (index == null) {
final indices = [];
final position = geometry.getAttributeFromString('position');
if (position != null) {
for (int i = 0; i < position.count; i++) {
indices.add(i);
}
geometry.setIndex(indices);
index = geometry.getIndex();
}
else {
console.warning('GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.');
return geometry;
}
}
//
final numberOfTriangles = index!.count - 2;
final newIndices = [];
if (drawMode == TriangleFanDrawMode) {
// gl.TRIANGLE_FAN
for (int i = 1; i <= numberOfTriangles; i++) {
newIndices.add(index.getX(0));
newIndices.add(index.getX(i));
newIndices.add(index.getX(i + 1));
}
} else {
// gl.TRIANGLE_STRIP
for (int i = 0; i < numberOfTriangles; i++) {
if (i % 2 == 0) {
newIndices.add(index.getX(i));
newIndices.add(index.getX(i + 1));
newIndices.add(index.getX(i + 2));
} else {
newIndices.add(index.getX(i + 2));
newIndices.add(index.getX(i + 1));
newIndices.add(index.getX(i));
}
}
}
if ((newIndices.length / 3) != numberOfTriangles) {
console.warning('GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.');
}
// build final geometry
final newGeometry = geometry.clone();
newGeometry.setIndex(newIndices);
return newGeometry;
};