Narsil č. 14

Sedma uvádí . . . Plazma

↑

Tento článek je sice bez háčků a čárek, ale zato od jednoho z nejlepších kóderů v ČR a SR dohromady, proto osobně doufám, že vám jeho slovenština nebude vadit ;-).

PLAZMA DEMO

-----------

Vzdy som obdivoval tieto triky v demach a tuzil som vediet ako sa to koduje. Az kym som nenarazil na jeden algoritmus, ktory bol zhodou okolnosti pre PC. Akonahle som pochopil ako to funguje, hned som to prepisal pre ST. Prve pokusy boli velmi pomale a aj emulacia VGA ( 256 farieb ) na ST zabera velmi vela casu. Po niekolkych optimalizaciach sa to konecne zacalo hybat rychlejsie.

Aky je princip ratania ?

Na ST som zvolil len maly raster 28*40 aby som to stihol aj zobrazit. ( Cize ratam 1120 bodov. ) Farbu kazdeho bodu urcuje konecna amplituda po scitani styroch funkcii kosinus v danom bode s roznym ofsetom ( fazovym uhlom ), s roznou "vlnovou dlzkou" i roznou rychlostou zmeny fazy, pricom dve funkcie kosinus ratame v horizontalnom a dve vo vertikalnom smere. Vysledny sucet ( amplituda ) urcuje farbu. Vsetko je to v 8-bitovej aritmetike, cize vysledna amplituda (0-255) urcuje jednu z 256 farieb ktore su usporiadane za sebou vo farebnych prechodoch. Farebne prechody musia nadvazovat "do kruhu" co znamena ze do akej farby je uskutocneny posledny prechod ( farba c.255 ), z takej farby musi prvy prechod zacinat ( farba c.0 ). Rychlost posuvu fazy kazdej funkcie kosinus sa po kazdej snimke nahodne meni o jeden krok, bud rychlejsie alebo pomalsie. To sposobuje efekt nahodneho pohybu a zmeny farieb. Vyratane farby sa ukladaju po riadkoch za sebou do bufra, uz v tvare ....rRRRgGGGbBBB ( 1 word ) pre STe register palety. Na ST nie su farebne prechody take jemne ako na STE. Na ST som tento program nevidel a ani neviem iste ci vobec funguje spravne. Ak by niekto spravil krajsie farebne prechody nech da vediet. Tie moje su vymyslene velmi narychlo. Velmi pekny vysledok by sa dosiahol, ak by sa zapojila technika interlace.

Aky je princip zobrazovania ?

Zabera omnoho viac casu ako vlastne vypocitanie. Najprv nastavim zobrazovaciu plochu na jednu farbu. Napriklad na farbu ktoru urcuje paletovy register cislo 15. Zosynchronizujem sa casovo na to miesto, kedy elektronovy luc obrazovky zacina vykreslovat obdlznik aktivnej obrazovky ( 320x200 ). V tom okamihu zacnem rychlo menit tento paletovy register c.15 farbami plazmy z nasho bufra. Pouzivam seriu instrukcii move.w (A0)+,(A1), kde A0 je pozicia v bufri a A1 je adresa paletoveho registra c.15. Za jeden riadok ( dlhy 320 pixlov ) to stihnem 28 krat. Da sa stihnut zmenit to aj viac krat ( tym padom mam viac farieb a jemnejsi raster v x suradnici ), ale je nutne pouzit blitter, alebo zafarbit obrazovku na vertikalne pasy susednych farieb ( napr. c.14 a c.15 ) a potom instrukciou move.l (A0)+,(A1) zmenime obe farby naraz co je rychlejsie. Verzia z blittrom vyzera najlepsie ale nefunguje na ST. Cas ked luc je mimo obdlznika vyplnujem instrukciami nop tak aby sa nestratila synchronizacia. Jeden riadok plazmy zobrazujem na piatych obrazovych riadkoch, pricom nasledujuci zaciatok riadku vzdy posunie o maly kusok vpravo pridanim jednej instrukcie nop. Po vykresleni 5 riadkov sa zacina vykreslovat na povodnom mieste.

Zdrojovy kod je prilozeny a ciastocne okomentovany. Nie je to asi nic pre zaciatocnikov, ale hadam moje sialene myslenie pochopia ti, ktori uz maju nejaky ten program v assemblery za sebou. Da sa s tym pekne pohrat, zmenit parametre rychlosti zmeny fazy, vlnove dlzky jednotlivych kosinus zloziek ci farebne prechody. Snazil som sa spravit to co najviac "system friendly", nemalo by to padat pri spusteni ci navrate do GEM-u. Vela stastia pri pokusoch zela

Sedma.

P.S.

Pri tomto algoritme a sposobe zobrazovania neostane cas robit nic ine, moze tak hrat akurat nejaka yamaha hudba. Samozrejme, ziadny koder nepusti to najlepsie co ma, podarilo sa mi urobit jednoduchsiu a rychlejsiu verziu, ktora necha asi 20% volneho casu pri rovnakej velkosti zobrazovanej plazmy !