loadShaders method

Future<void> loadShaders()

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