Il Plasma (Lezione by The Dark Coder) In questo testo parleremo dell'effetto "plasma". In particolare vedremo come realizzare degli effetti plasma utilizzando tecniche impiegabili su tutti gli amiga. Al giorno d'oggi, infatti, grazie al chipset AGA e a processori 68020 e superiori si realizzano anche dei plasmi differenti, basati su tecniche "chunky pixel". Gli effetti di cui parleremo in questo testo, invece, sono impiegabili anche sul buon vecchio Amiga 500. La tecnica di base per realizzare un plasma e` costituita dall'utilizzo di una copperlist che cambia continuamente alcuni registri colore, mediante delle "copper moves" consecutive. Abbiamo gia` visto come costruire e utilizzare molte copperlists di questo tipo nella lezione 11. In particolare negli esempi lezione11g1.s, lezione11g2.s e lezione11g3.s abbiamo realizzato sfumatore di colori mediante copperlists che cambiavano il contenuto di COLOR00. Si tratta, pero`, di copperlists statiche. La differenza principale tra quegli esempi e un plasma e` proprio questa: in un effetto plasma si usa una copperlist strutturata in quel modo, ma dinamica, in modo che in ogni frame cambino i colori scritti nel registro COLOR00. Ogni "copper move" e` composta da 2 words: dc.w $180,COLORE ; struttura di una "copper move" La prima word contiene l'indirizzo di COLOR00 e la seconda il valore da scrivere in tale registro. Per ottenere l'effetto plasma dobbiamo far variare questo valore ad ogni frame, ovvero dobbiamo scrivere ogni volta un valore diverso nella seconda word che costituisce la "copper move". Il problema e` che dobbiamo ripetere questa operazione per tutte le "copper moves" che fanno parte della copperlist. Si tratta quindi di una gran quantita` di dati da modificare. Poiche` la copperlist si trova in CHIP-RAM possiamo usare il blitter per effettuare le modifiche. In conclusione, dunque l'effetto plasma e` realizzato mediante una routine che (usando il blitter) legge da una tabella i colori e li copia nella copperlist. Facendo variare ad ogni frame i colori copiati, il plasma e` fatto. Notate che questo effetto non richiede l'uso di bitplane, visto che si fa tutto modificando il colore di sfondo. Per questo lo si indica come plasma "a 0 bitplanes", in contrasto con altre varianti che vedremo successivamente. Un esempio di plasma 0-bitplanes e` plasm1.s. Un significativo miglioramento dell'effetto e` costituito dal plasma RGB. Esso si differenzia dal plasma normale, perche` i colori non vengono semplicemente copiati da una tabella, ma "calcolati" nel seguente modo: vengono lette separatamente (da 3 sorgenti diverse) le componenti R, G e B di un colore, e vengono poi unite insieme con un OR. In questo modo poiche` le componenti R,G B variano continuamente tra una "copper move" e l'altra si produrra` un maggior numero di colori. In pratica, invece di un'operazione di copia si utilizza una blittata che esegue un OR tra 3 sorgenti che contengono rispettivamente le componenti R, G e B. Un primo esempio di plasma RGB e` plasm2.s Per migliorare ulteriormente l'effetto, si cerca di rendere piu` vario il plasma. Un modo semplice per farlo e` rendere variabile la posizione di partenza di ogni riga del plasma. Cio` puo` essere fatto molto facilmente dato che la posizione di partenza e` determinata dall'istruzione WAIT che compare all'inizio di ogni riga della copperlist. Una variante del genere e` illustrata in plasm3.s. Purtroppo, pero` le posizioni orizzontali delle WAIT hanno una risoluzione di 4 pixel, il che vuol dire che e` possibile variare la posizione di partenza del plasma a "scatti" di 4 pixel. Variando opportunamente i parametri dell'esempio plasm3.s si puo` evidenziare tale fenomeno. per ottenere delle oscillazioni meno scattose useremo una tecnica diversa, che fa uso di un bitplane, e pertanto si chiama plasma "1-bitplane". La tecnica e` la seguente: si usa un bitplane "a strisce" verticali larghe 8 pixel. In questo modo l'immagine avra` 8 pixel colorati con COLOR00, poi 8 colorati con COLOR01, poi di nuovo 8 con COLOR00 e cosi` via. In corrispondenza usiamo una copperlist simile a quelle viste negli esempi precedenti, ma che alterna una "copper move" in COLOR00 con una in COLOR01. La situazione e` rappresentata dalla figura seguente: destinazione della "copper move": | COL.0 | COL.1 | COL.0 | COL.1 | COL.0 | COL.1 - - - linea del bitplane: 000000001111111100000000111111110000000011111111 - - - come vedete c'e` una corrispondenza esatta tra il colore visualizzato e il registro modificato dalla copperlist. Un registro colore mantiene costante il suo valore per uno spazio di 16 pixel, ma quel colore viene visualizzato per i soli 8 pixel del bitplane che lo selezionano (cioe` per i soli 8 pixel a 0 nel caso di COLOR00 e i soli pixel a 1 nel caso di COLOR01). Fin qui abbiamo utilizzato il nostro bitplane per fare esattamente la stessa cosa che prima facevamo senza. Ora pero` viene la novita`. Possiamo utilizzare lo scroll hardware per spostare il bitplane orizzontalmente. Notate che se il valore di scroll varia da 0 a 7, ogni gruppo di 8 pixel mantiene sempre lo stesso colore. Infatti il valore contenuto in un registro varia ogni 16 pixel. Con valori dello scroll da 0 a 7 noi spostiamo il gruppo di 8 pixel sempre all'interno di questa "fascia" di 16 pixel. Se invece usiamo valori maggiori, alcuni dei pixel del gruppo usciranno fuori dalla fascia, assumendo pertanto un nuovo colore. Guardiamo in dettaglio il fenomeno con l'ausilio di alcune figure. Potete notare come i registri colore mantengano costante il loro valore per fascie di 16 pixel. Le fasce dei 2 registri si sovrappongono: le fasce di COLOR01 iniziano e finiscono a meta` di quelle di COLOR00, e viceversa. Quando usiamo un valore di scroll pari a 0 si ha la seguente situazione: valore in COLOR01 | valore 1 | valore 2 | valore 3 | - - V V V scroll=0: 000000001111111100000000111111110000000011111111 - - - ^ ^ ^ ^ valore in | | | | COLOR00 | valore 1 | valore 2 | valore 3 | - - come vedete ogni gruppo di 8 pixel di valore 0 si trova in corrispondenza dei primi 8 pixel (cioe` quelli piu` a sinistra) di ogni fascia di 16 per i quali COLOR00 assume valore costante. Lo stesso discorso vale per i gruppi di 8 pixel settati a 1 in relazione con le fascie di 16 pixel per i quali COLOR01 rimane costante. All' aumentare del valore di scroll, i gruppi di 8 pixel si spostano verso i bordi destri delle fascie. Per es. ecco cosa accade quando lo scroll e` di 4 pixel: valore in COLOR01 | valore 1 | valore 2 | valore 3 | - - V V V scroll=4: 1111000000001111111100000000111111110000000011111111 - - - ^ ^ ^ ^ valore in | | | | COLOR00 | valore 1 | valore 2 | valore 3 | - - Quando lo scroll e` di 7 pixel, i gruppi di 8 pixel sono allineati con i bordi destri delle fascie (rispettivamente i pixel a 0 con le fascie di COLOR00 e i pixel a 1 con le fascie di COLOR01): valore in COLOR01 | valore 1 | valore 2 | valore 3 | - - V V V scroll=7: 1111111000000001111111100000000111111110000000011111111 - - - ^ ^ ^ ^ valore in | | | | COLOR00 | valore 1 | valore 2 | valore 3 | - - Non appena lo scroll supera il valore 8, i gruppi di 8 pixel superano i bordi delle fasce. Questo significa che gli 8 pixel del gruppo non avranno piu` lo stesso valore. La figura seguente rappresenta la situazione per uno scroll di 8 pixel. valore in COLOR01 | valore 1 | valore 2 | valore 3 | - - V V V scroll=8: 11111111000000001111111100000000111111110000000011111111 - - - ^ ^ ^ ^ valore in | | | | COLOR00 | valore 1 | valore 2 | valore 3 | - - In questa situazione i primi 7 pixel di ogni gruppo di 8 rientrano in una fascia e pertanto appaiono con il colore contenuto nel registro colore in questa fascia, mentre l'ultimo rientra nella fascia seguente e appare del colore assunto dal registro colore nella nuova fascia. Questo fenomeno crea dei bruschi cambi di colore che rendono poco gradevole il plasma, dato che questo effetto si basa sull'impressione di "mescolamento" dei colori. Nell'esempio plasm4.s viene applicata questa tecnica. L'utilizzo dei bitplane ci permette anche di usare delle maschere da sovrapporre al plasma. Un esempio e` in plasm5.s. La tecnica vista negli ultimi 2 esempi ha il limite che le oscillazioni orizzontali sono limitate ad un'ampiezza di 8 pixel. Cio` e` dovuto al fatto che ogni registro colore rimane costante in una fascia di 16 pixel, e che ogni gruppo di pixel e` largo 8 pixel: per questo motivo, il gruppo puo` spostarsi all'interno della fascia di 16-8=8 pixel. Per aumentare l'ampiezza delle oscillazioni e` necessario allargare le fascie, e per far questo e` necessario utilizzare piu` registri colore, dato che e` sempre necessario cambiare un registro ogni 8 pixel. In conclusione, quindi e` necessario usare un maggior numero di bitplanes. Notate che negli esempi precedenti abbiamo realizzato le oscillazioni con lo scroll hardware, che ci consente movimenti di massimo 16 pixel. Questa ulteriore limitazione e` superabile facendo oscillare i bitplanes con il blitter. Naturalmente in questo caso l'oscillzione richiede una routine molto piu` lenta, e si usano trucchi particolari per realizzarla. Nell'esempio plasm6.s, che conclude questa "monografia" sul plasma vedremo come realizzare un plasma con oscillazione orizzontale di 56 pixel. Tutti i plasmi che abbiamo visto possono essere resi piu` interessanti variando durante l'esecuzione i parametri che li contraddistinguono e le tabelle che contengono i colori (o le loro componenti).