#pragma once class Surface; namespace Effects { // Distorsió sinusoidal horitzontal de cada fila: dx(y) = // amplitude · sin(2π·y/wavelength + phase). La phase avança al // ritme marcat per `speed_hz` (cicles per segon). Es pinta sobre // qualsevol Surface — habitualment un fons de canvas — i manté el // seu propi estat temporal, així dues instàncies poden tenir // paràmetres i fases independents. // // `render()` fa dos passos: primer un blit pla de tota la Surface // (perquè els marges no quedin descoberts pel desplaçament) i // després el re-blit fila a fila amb el sin. La costura és // invisible en fons amb gradient continu i pràcticament invisible // en altres si l'amplitud és moderada. class HeatHaze { public: struct Params { float amplitude_px; float wavelength_px; float speed_hz; }; explicit HeatHaze(Params params); void tick(int delta_ms); void render(const Surface& src, int x, int y) const; private: Params params_; float phase_{0.0F}; }; } // namespace Effects