GLTFMeshoptCompression constructor

GLTFMeshoptCompression(
  1. GLTFParser parser
)

Implementation

GLTFMeshoptCompression(this.parser) {
  name = gltfExtensions["EXT_MESHOPT_COMPRESSION"]!;
  loadBufferView = (index) async {
    Map<String, dynamic> json = parser.json;
    Map<String, dynamic> bufferView = json["bufferViews"][index];

    if (bufferView["extensions"] != null &&
        bufferView["extensions"][name] != null) {
      final extensionDef = bufferView["extensions"][name];

      final buffer =
          await parser.getDependency('buffer', extensionDef.buffer);
      final decoder = parser.options['meshoptDecoder'];

      if (!decoder || !decoder.supported) {
        if (json["extensionsRequired"] != null &&
            json["extensionsRequired"].indexOf(name) >= 0) {
          throw ('THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files');
        } else {
          // Assumes that the extension is optional and that fallback buffer data is present
          return null;
        }
      }

      final byteOffset = extensionDef.byteOffset ?? 0;
      final byteLength = extensionDef.byteLength ?? 0;

      final count = extensionDef.count;
      final stride = extensionDef.byteStride;

      final result = Uint8List(count * stride);
      final source = Uint8List.view(buffer, byteOffset, byteLength);

      decoder.decodeGltfBuffer(result, count, stride, source,
          extensionDef.mode, extensionDef.filter);
      return result;
    } else {
      return null;
    }
  };
}