createIndex method

IndexedVertices createIndex()

Creates an optimized version of vertexPoints where the points are deduplicated via an index buffer.

Implementation

IndexedVertices createIndex() {
  final Map<Point, int> pointMap = <Point, int>{};
  int index = 0;
  final List<int> indices = <int>[];
  for (final Point point in vertexPoints) {
    indices.add(pointMap.putIfAbsent(point, () => index++));
  }

  Float32List pointsToFloat32List(List<Point> points) {
    final Float32List vertices = Float32List(points.length * 2);
    int vertexIndex = 0;
    for (final Point point in points) {
      vertices[vertexIndex++] = point.x;
      vertices[vertexIndex++] = point.y;
    }
    return vertices;
  }

  final List<Point> compressedPoints = pointMap.keys.toList();
  if (compressedPoints.length * 2 + indices.length >
      vertexPoints.length * 2) {
    return IndexedVertices(pointsToFloat32List(vertexPoints), null);
  }

  return IndexedVertices(
    pointsToFloat32List(compressedPoints),
    Uint16List.fromList(indices),
  );
}