loadShaders method
Load fragment shader programs from assets. Each unique .frag file is loaded once and shared across fractal types.
Implementation
Future<void> loadShaders() async {
if (_shadersLoaded) return;
final shaderAssets = <NeomFractalType, String>{
NeomFractalType.mandelbrot: 'packages/neom_generator/shaders/mandelbrot.frag',
NeomFractalType.mandelbrotDeep: 'packages/neom_generator/shaders/mandelbrot.frag',
NeomFractalType.julia: 'packages/neom_generator/shaders/julia.frag',
NeomFractalType.newton: 'packages/neom_generator/shaders/newton.frag',
NeomFractalType.burningShip: 'packages/neom_generator/shaders/burning_ship.frag',
NeomFractalType.multibrot: 'packages/neom_generator/shaders/multibrot.frag',
};
int loaded = 0;
for (final entry in shaderAssets.entries) {
try {
// Reuse program if same asset was already loaded
ui.FragmentProgram? program = _programCache[entry.value];
if (program == null) {
program = await ui.FragmentProgram.fromAsset(entry.value);
_programCache[entry.value] = program;
}
_shaders[entry.key] = program.fragmentShader();
loaded++;
} catch (e) {
debugPrint('NeomFractalEngine: Failed to load ${entry.value}: $e');
}
}
_shadersLoaded = loaded > 0;
_shadersFailed = loaded == 0;
notifyListeners();
}