loadMaterial method

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

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