loadGeometries method

dynamic loadGeometries(
  1. dynamic primitives
)

Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry

Creates BufferGeometries from primitives.

@param {Array<GLTF.Primitive>} primitives @return {Promise<Array

Implementation

loadGeometries(primitives) async {
  var parser = this;
  var extensions = this.extensions;
  var cache = this.primitiveCache;

  Function createDracoPrimitive = (primitive) async {
    var geometry = await extensions[EXTENSIONS["KHR_DRACO_MESH_COMPRESSION"]]
        .decodePrimitive(primitive, parser);
    return await addPrimitiveAttributes(geometry, primitive, parser);
  };

  List<BufferGeometry> pending = [];

  for (var i = 0, il = primitives.length; i < il; i++) {
    Map<String, dynamic> primitive = primitives[i];
    var cacheKey = createPrimitiveKey(primitive);

    // See if we've already created this geometry
    var cached = cache[cacheKey];

    if (cached != null) {
      // Use the cached geometry if it exists
      pending.add(cached.promise);
    } else {
      var geometryPromise;

      if (primitive["extensions"] != null &&
          primitive["extensions"][EXTENSIONS["KHR_DRACO_MESH_COMPRESSION"]] !=
              null) {
        // Use DRACO geometry if available
        geometryPromise = await createDracoPrimitive(primitive);
      } else {
        // Otherwise create a new geometry
        geometryPromise = await addPrimitiveAttributes(
            new BufferGeometry(), primitive, parser);
      }

      // Cache this geometry
      cache[cacheKey] = {"primitive": primitive, "promise": geometryPromise};

      pending.add(geometryPromise);
    }
  }

  return pending;
}