# Projekt: Produkcja demoscenowa
## Konspekt zajęć
### Warsztaty 1: Konfiguracja środowiska pracy
**8 października 2021**
Na zajęcia należy przygotować środwisko z system Debian Linux/GNU 11. Środowisko może pracować na innych dystrybucjach i systemie macOS, ale na pewno **nie działa** pod Windowsem włączając w to WSL.
* kompilator, linker, asembler, debugger i emulator fs-uae
* budowanie, uruchamianie i debugowanie efektu
* struktura efektu
* drukowanie komunikatów diagnostycznych
* system budowania
* konwertery danych i inne narzędzia [tools](https://github.com/cahirwpz/demoscene/tree/master/tools)
#### Zadanie domowe
1. Przygotuj środowisko pracy, zmodyfikuj jakiś efekt i uruchom go. Sprawdź czy jesteś go w stanie debugować. Prześlij zrzut ekranu z działającym efektem i `gdb-dashboard`.
2. Przyjrzyj się światu dookoła, znajdź w nim ciekawe zjawisko lub rzecz, która może służyć za inspirację na efekt. Dostarcz zdjęcie lub krótki filmik.
### Warsztaty 2: Optymalizacja pod M68000
**15 października 2021**
* omówienie modelu programowania (rejestry, stos, instrukcje)
* podglądanie kodu wynikowego
* zliczanie cykli instrukcji
* profilowanie fragmentów kodu
* zastępowanie kosztownych operacji
* rozwijanie pętli
* generowanie kodu - procedura [MakeUVMapRenderCode](https://github.com/cahirwpz/demoscene/blob/master/effects/uvmap/uvmap.c#L55)
* wstawki asemblerowe
* tablicowanie wyników
* obliczenia fixed-point
* szybkie generowanie liczb pseudolosowych
* łączenie C z asemblerem i konwencja wołania procedur
* zasady wyrównywania adresów i rejestr SP
* omówienie pętli głównej efektu [uvmap](https://github.com/cahirwpz/demoscene/blob/master/effects/uvmap)
#### Zadanie domowe:
Praca domowa 2 (termin 22.10.2021)
1. Zainstaluj środowisko `Processing` i uruchom jeden z prototypów w katalogu `prototypes`. Prześlij zrzut ekranu z działającym prototypem efektu.
2. Zmodyfikuj prototyp efektu `uvmap`. Dopisz nowy generator mapy w `generators.pde` i podczep go do tablicy generators w pliku `distortions.pde`. Prześlij krótki filmik z działania efektu. Za to zadanie można dostać punkty bonusowe!
<!---
1. Policz ile cykli procesora per piksel zaoszczędziło generowanie kodu w `uvmap`.
--->
### Warsztaty 3: Układy specjalizowane, raster i copper
**22 października 2021**
* specyfikacja komputera Amiga 500
* omówienie funkcji układów specjalizowanych Amigi
* pamięć CHIP vs FAST
* czym jest raster?
* pozycja promienia rastra (color clock)
* timingi dla sygnału PAL (v-blank, h-blank)
* instrukcje coppera MOVE, WAIT i SKIP
* copper lista: tworzenie, modyfikacja, terminacja
* włączanie i wyłączanie coppera (DMA)
* obchodzenie ograniczeń instrukcji coppera (linie ≤ 256)
* podwójne buforowanie
* najczęstsze scenariusze użycia coppera
* omówienie wyświetlania grafiki w efekcie [stripes](https://github.com/cahirwpz/demoscene/blob/master/effects/stripes/stripes.c)
#### Zadanie domowe:
**TODO**
### Warsztaty 4: Grafika bitmapowa
**29 października 2021**
* reprezentacja grafiki bitmapowej w pamięci
* reprezentacja przepleciona (_interleaved_)
* konfiguracja okna wyświetlania
* konfiguracja układu pobierającego bitplany: start, stop, modulo
* przypisywanie kolorów do wartości pikseli
* scrolling poziomy i pionowy
* tryb _hold-and-modify_ i _extra-halfbrite_
* split-screen na przykładzie [blurred](https://github.com/cahirwpz/demoscene/blob/master/effects/blurred/blurred.c) i [highway](https://github.com/cahirwpz/demoscene/blob/master/effects/highway/highway.c)
* tryb _dual playfield_ – efekt [credits](https://github.com/cahirwpz/demoscene/blob/master/effects/credits/credits.c)
* lustrzane odbicie – efekt [blurred3d](https://github.com/cahirwpz/demoscene/blob/master/effects/blurred3d/blurred3d.c)
* przygotowanie palety – efekt aberracji chromatycznej [glitch](https://github.com/cahirwpz/demoscene/blob/master/effects/glitch/glitch.c) i przezroczystości [transparency](https://github.com/cahirwpz/demoscene/blob/master/effects/transparency/transparency.c)
* symulacja ruchu przy pomocy rotacji palety – efekt [neons](https://github.com/cahirwpz/demoscene/blob/master/effects/neons/neons.c)
* wyświetlanie grafiki większej niż ekran – efekt [tiles16](https://github.com/cahirwpz/demoscene/blob/master/effects/tiles16/tiles16.c)
#### Zadanie domowe:
**TODO**
### Warsztaty 5: Blitter
**5 listopada 2021**
* najczęstsze scenariusze użycia blittera
* reprezentacja danych dla blittera
* projektowanie funkcji blittera przy użyciu mintermów
* właściwości i konfiguracja kanałów blittera
* maski i przesunięcia
* tryby pracy: w przód i w tył
* wystartowanie operacji i oczekiwanie na zakończenie
* [diagram](http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node02DD.html) architektury blittera
* kopiowanie obszarów [BlitterCopy](https://github.com/cahirwpz/demoscene/blob/master/lib/libblit/BlitterCopy.c)
* cookie-cut [BlitterCopyMasked](https://github.com/cahirwpz/demoscene/blob/master/lib/libblit/BlitterCopyMasked.c)
* rysowanie krawędzi i linii [BlitterLine](https://github.com/cahirwpz/demoscene/blob/master/lib/libblit/BlitterLine.c)
* wypełnianie obszarów [BlitterFillArea](https://github.com/cahirwpz/demoscene/blob/master/lib/libblit/BlitterFillArea.c) – efekt [anim](https://github.com/cahirwpz/demoscene/blob/master/effects/anim/anim.c)
<small>Można przypomnieć [algorytm Bresenhama](https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm) służący do rysowania linii.</small>
#### Zadanie domowe:
**TODO**
**UWAGA!!!** To jest dobry moment, żeby studenci zaczęli szperać za inspiracjami do efektów!
### Warsztaty 6: Duszki aka sprajty
**19 listopada 2021**
* rozmiar i kolory sprajtów
* reprezentacja sprajtów w pamięci
* priorytety wyświetlania warstw
* programowanie kanałów DMA sprajtów
* zmiana pozycji sprajta
* ponowne używanie kanału DMA sprajta
* tryb ręczny i zwielokrotnianie sprajta
* wykrywanie kolizji między sprajtami i playfield'em
* rendering do sprajtów – efekt [ball](https://github.com/cahirwpz/demoscene/blob/master/effects/ball/ball.c)
#### Zadanie domowe:
**TODO**
### Warsztaty 7: Zaawansowane techniki renderingu
**26 listopada 2021**
* copper-chunky: skoki i pętle w programie copper'a – efekt [plasma](https://github.com/cahirwpz/demoscene/blob/master/effects/plasma/plasma.c) i [tiles8](https://github.com/cahirwpz/demoscene/blob/master/effects/tiles8/tiles8.c)
* copper: generowanie przerwań i czekanie na blittera
* wyświetlanie w trybie HAM6 – efekt [bumpmap-rgb](https://github.com/cahirwpz/demoscene/blob/master/effects/bumpmap-rgb/bumpmap-rgb.c)
* wymiana kolorów co linię rastra – efekt [showpchg](https://github.com/cahirwpz/demoscene/blob/master/effects/showpchg/showpchg.c)
* symulacja [motion blur](https://en.wikipedia.org/wiki/Motion_blur) na podstawie efektu [anim](https://github.com/cahirwpz/demoscene/blob/master/effects/anim/anim.c) i [shapes](https://github.com/cahirwpz/demoscene/blob/master/effects/shapes/shapes.c)
* składanie rastra z prerenderowanych linii – efekt [prisms](https://github.com/cahirwpz/demoscene/blob/master/effects/prisms/prisms.c) i [twister-rgb](https://github.com/cahirwpz/demoscene/blob/master/effects/twister-rgb/twister-rgb.c)
* kolorowanie semi-statycznych obrazów – efekt [floor](https://github.com/cahirwpz/demoscene/blob/master/effects/floor/floor.c), [multipipe](https://github.com/cahirwpz/demoscene/blob/master/effects/multipipe/multipipe.c), [butterfly-gears](https://github.com/cahirwpz/demoscene/blob/master/effects/butterfly-gears/butterfly-gears.c)
#### Zadanie domowe:
**TODO**
### Warsztaty 8: Zaawansowane użycia blittera
**3 grudnia 2021**
* chunky to planar:
* naiwne rozwiązanie
* metoda dziel i zwyciężaj
* implementacja przy użyciu procesora [c2p_1x1_4.asm](https://github.com/cahirwpz/demoscene/blob/master/lib/libgfx/c2p_1x1_4.asm)
* implementacja przy użyciu blittera
* unikanie obliczeń dzięki bit-scrambling
* omówienie implementacji w efekcie [uvmap](https://github.com/cahirwpz/demoscene/blob/master/effects/uvmap/uvmap.c#L80)
* dodawanie z nasyceniem:
* sumator z przeniesieniami szeregowymi
* obsłużenie nasycenia
* omówienie implementacji na blitter [BitmapAddSaturated](https://github.com/cahirwpz/demoscene/blob/master/lib/libblit/BitmapAddSaturated.c)
* omówienie efektu [metaballs](https://github.com/cahirwpz/demoscene/blob/master/effects/metaballs/metaballs.c) i [highway](https://github.com/cahirwpz/demoscene/blob/master/effects/highway/highway.c)
* mapa przepływu:
* generowanie mapy przesunięć
* przesunięcia kafli
* rozmywanie przez zaszumianie
* omówienie efektu [tilezoomer](https://github.com/cahirwpz/demoscene/blob/master/effects/tilezoomer/tilezoomer.c)
#### Zadanie domowe:
1. Poeksperymentować z mapą przesunięć kafli.
2. **TODO**
### Warsztaty 9: Rysowanie grafiki wektorowej
**10 grudnia 2021**
* grafika 2D
* reprezentacja obiektów 2D w pamięci
* właściwości przekształceń geometrycznych
* rotacja, skalowanie, przesunięcie w 2D
* obcinanie odcinków do okna wyświetlania – algorytm [Lianga-Barsky'ego](https://en.wikipedia.org/wiki/Liang%E2%80%93Barsky_algorithm)
* obcinanie wielokątów – procedura [ClipPolygon2D](https://github.com/cahirwpz/demoscene/blob/master/lib/lib2d/ClipPolygon2D.c)
* rasteryzacja wielokątów przy użyciu Blittera
* omówienie efektu [shapes](https://github.com/cahirwpz/demoscene/blob/master/effects/shapes/shapes.c)
* grafika 3D
* potok graficzny
* współrzędne obiektu, świata, kamery i ekranu
* transformacje i projekcja
* obcinanie do [bryły widzenia](https://en.wikipedia.org/wiki/Viewing_frustum)
* [odrzucanie tylnych ścian](https://en.wikipedia.org/wiki/Back-face_culling)
* rasteryzacja: algorytm [malarza](https://en.wikipedia.org/wiki/Painter%27s_algorithm), [przeglądania linii](https://en.wikipedia.org/wiki/Scanline_rendering)
* omówienie efektu [flatshade](https://github.com/cahirwpz/demoscene/blob/master/effects/flatshade/flatshade.c) (i jego nieintuicyjnych optymalizacji)
#### Zadanie domowe:
**TODO**
### Warsztaty 10: Dźwięk i muzyka
**17 grudnia 2021**
* reprezentacja instrumentu w pamięci
* właściwości kanałów dźwiekowych Amigi
* zmiana głośności kanału
* programowanie kanałów dźwiękowych [audio.h](https://github.com/cahirwpz/demoscene/blob/master/include/audio.h)
* muzyka [tracker](https://en.wikipedia.org/wiki/Music_tracker)-owa
* reprezentacja zapisu nutowego, efekty i polecenia odtwarzacza muzyki
* obsługa odtwarzaczy najpopularniejszych formatów [ahx](https://github.com/cahirwpz/demoscene/blob/master/effects/playahx/playahx.c), [cinter](https://github.com/cahirwpz/demoscene/blob/master/effects/playctr/playctr.c) i [the player 6.1](https://github.com/cahirwpz/demoscene/blob/master/effects/playp61/playp61.c)
* efekty bazujące na bieżąco odtwarzanym dźwięku
#### Zadanie domowe:
**TODO**
### Warsztaty 11: Studenci prezentują prototypy efektów
**7 stycznia 2022**
**TODO**
### Warsztaty 12: Infrastruktura do uruchamiania efektów
**14 stycznia 2022**
* architektura dema
* procedury obsługi przerwań i ich rejestracja [interrupt.h](https://github.com/cahirwpz/demoscene/blob/master/include/interrupt.h)
* sterowanie efektem przy pomocy klatek kluczowych [sync.h](https://github.com/cahirwpz/demoscene/blob/master/loader/sync.h)
* abstrakcja pliku [file.h](https://github.com/cahirwpz/demoscene/blob/master/include/file.h)
* doładowywanie danych z dysku [filesys.h](https://github.com/cahirwpz/demoscene/blob/master/include/filesys.h)
* doładowywanie efektów z dysku [amigahunk.h](https://github.com/cahirwpz/demoscene/blob/master/include/amigahunk.h)
* dynamiczny przydział pamięci [memory.h](https://github.com/cahirwpz/demoscene/blob/master/include/memory.h)
* obsługa zadań i synchronizacja [task.h](https://github.com/cahirwpz/demoscene/blob/master/include/task.h)
* interakcja przy pomocy myszki i klawiatury: [event.h](https://github.com/cahirwpz/demoscene/blob/master/include/event.h), [keyboard.h](https://github.com/cahirwpz/demoscene/blob/master/include/keyboard.h) i [mouse.h](https://github.com/cahirwpz/demoscene/blob/master/include/mouse.h)
### Warsztaty 13: Wykorzystanie przepustowości pamięci
**21 stycznia 2022**
* klasyfikacja cykli pamięci CHIP – według [diagramu](http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node02D4.html)
* raport wykorzystania cykli pamięci z emulatora fs-uae
* priorytety kanałów DMA
* liczba bitplanów, a copper i sprajty
* cykle pamięciowe blittera – według [diagramu](http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0127.html)
* ustalanie priorytetu Blittera nad procesorem
### Warsztaty 14: Prowadzący pomaga w optymalizacji efektów
**28 stycznia 2022**
**TODO**
### Podsumowanie: Prezentacja efektów do dema
**4 lutego 2022**
**Pomysł!** Czy tutaj zaprosić "lożę szyderców" do oceny efektów?
## Zadania domowe
### Lista produkcji do obejrzenia
Jako zadanie domowe studenci będą mieli za zadanie wspólnie dokonać analizę dema pod względem estetycznym i technicznym (z naciskiem na to drugie).
1. [Sushi Boyz](https://www.pouet.net/prod.php?which=65405) by Ghostown (PL)
2. [Sunglasses at Night](https://www.pouet.net/prod.php?which=64106) by Ghostown & Whelpz (PL)
3. [Zener Drive](https://www.pouet.net/prod.php?which=71996) by Altair (PL)
4. [Rule 30](https://www.pouet.net/prod.php?which=89365) by Andromeda
5. [Fisherhawk Dr.](https://www.pouet.net/prod.php?which=88651) by Melon Dezign
6. [Eon](https://www.pouet.net/prod.php?which=81094) by The Black Lotus
7. [Rink a Dink: REDUX](https://www.pouet.net/prod.php?which=61182) by Lemon
8. [The Fall](https://www.pouet.net/prod.php?which=75773) by The Deadliners & Lemon
9. [Boogietown](https://www.pouet.net/prod.php?which=59144) by Ghostown
10. [Superoriginal](https://www.pouet.net/prod.php?which=54388) by Supergroup
11. [Gagrakacka Mind Zones](https://www.pouet.net/prod.php?which=65778) by Disaster Area
12. [Emperor of the North Pole](https://www.pouet.net/prod.php?which=63769) by Spaceballs
13. [Lemonade](https://www.pouet.net/prod.php?which=78514) by Lemon
14. [e255](https://www.pouet.net/prod.php?which=67956) by Bomb & Sanity & Dreamdealers
15. [Chillobits](https://www.pouet.net/prod.php?which=85300) by Offence
16. [15 Years of Fame](https://www.pouet.net/prod.php?which=61034) by Up Rough
17. [Abstractica](https://www.pouet.net/prod.php?which=88628) by Nah-Kolor
18. [Way Too Rude](https://www.pouet.net/prod.php?which=85248) by Logicoma & Loonies
19. ...