loadSky method
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;
}