loadMaterial method
Loads the material whose source is sourcePath as a PreprocessedMaterial.
Implementation
Future<PreprocessedMaterial> loadMaterial(
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 a sky .fmat; load it with loadFmatSky instead.',
);
}
final material = PreprocessedMaterial(
fragmentShader: shader,
metadata: metadata,
);
_fmatSourcePaths[material] = sourcePath;
// Track for in-place hot reload: a `.fmat` edit refreshes this material
// from its regenerated sidecar without rebuilding the scene. Debug-only.
HotReloadCoordinator.instance.registerFmat(
material,
sidecarAssetKey: index.sidecarAssetKey,
shaderBundleAssetKey: index.shaderBundleAssetKey,
entryName: resolution.entry.entryName,
);
return material;
}