loadSky method

Future<PreprocessedSky> loadSky(
  1. String sourcePath, {
  2. String? package,
  3. String? bundleName,
})

Loads the sky whose source is sourcePath as a PreprocessedSky.

Implementation

Future<PreprocessedSky> loadSky(
  String sourcePath, {
  String? package,
  String? bundleName,
}) async {
  final resolution = resolve(
    sourcePath,
    package: package,
    bundleName: bundleName,
  );
  final index = resolution.index;
  final shaderLibrary = _shaderLibraries[index.shaderBundleAssetKey] ??=
      await _loadShaderLibrary(index.shaderBundleAssetKey);
  final shader = shaderLibrary[resolution.entry.entryName];
  if (shader == null) {
    throw StateError(
      'Shader entry "${resolution.entry.entryName}" was missing from '
      '${index.shaderBundleAssetKey}.',
    );
  }
  final metadataByMaterial = _sidecars[index.sidecarAssetKey] ??=
      await _loadSidecar(index.sidecarAssetKey);
  final metadata = (metadataByMaterial[resolution.entry.entryName] as Map)
      .cast<String, Object?>();
  if (metadata['domain'] != 'sky') {
    throw StateError(
      '"$sourcePath" is not a sky .fmat (it has no `sky { }` block); load '
      'it with loadFmatMaterial instead.',
    );
  }
  final sky = PreprocessedSky(fragmentShader: shader, metadata: metadata);
  _fmatSourcePaths[sky] = sourcePath;
  HotReloadCoordinator.instance.registerFmat(
    sky,
    sidecarAssetKey: index.sidecarAssetKey,
    shaderBundleAssetKey: index.shaderBundleAssetKey,
    entryName: resolution.entry.entryName,
  );
  return sky;
}