toTrianglesDrawMode top-level property

Function toTrianglesDrawMode
getter/setter pair

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