Demokoodaus Linuxilla, tapaus Eternity Tuomo Sipola tuomo.sipola@iki.fi Linkin lanit 9.4.2010 Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 1 / 17
Sisältö 1 Johdanto 2 Kääntäminen 3 Koodista 4 Yhteenveto Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 2 / 17
Mikä Eternity? Linux-demo Tavoitteena pieni koko Linkin Lanit II 19. 21.10.2007 Koodattu viikonlopun aikana laneilla Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 3 / 17
Kuvia Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 4 / 17
Kuvia Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 4 / 17
Kuvia Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 4 / 17
Mistä demo koostuu Alusta: Ohjelmointikieli: Graikka: Musiikki: Säveltäminen: Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 5 / 17
Mistä demo koostuu Alusta: Linux Ohjelmointikieli: Graikka: Musiikki: Säveltäminen: Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 5 / 17
Mistä demo koostuu Alusta: Linux Ohjelmointikieli: C Graikka: Musiikki: Säveltäminen: Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 5 / 17
Mistä demo koostuu Alusta: Linux Ohjelmointikieli: C Graikka: SDL & OpenGL Musiikki: Säveltäminen: Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 5 / 17
Mistä demo koostuu Alusta: Linux Ohjelmointikieli: C Graikka: SDL & OpenGL Musiikki: SDL & wav-tiedosto Säveltäminen: Seq24, ZynAddSubFX, Specimen, Jack Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 5 / 17
Kääntäminen gcc $(CFLAGS) tiedosto.c Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 6 / 17
Kääntäminen CFLAGS = -ffast-math -fomit-frame-pointer -fshort-double -fno-inline -fno-strict-aliasing -fpeephole2 -fexpensive-optimizations -Os gcc $(CFLAGS) tiedosto.c Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 6 / 17
Linkitys ld $(LDFLAGS) tiedosto.o $(LDLIBS) -o eternity Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 7 / 17
Linkitys LDFLAGS = -dynamic-linker /lib/ld-linux.so.2 LDLIBS = /usr/lib/libsdl.so /usr/lib/libgl.so /usr/lib/libsdl_mixer.so ld $(LDFLAGS) tiedosto.o $(LDLIBS) -o eternity Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 7 / 17
Kutistaminen Poistetaan turhat otsakkeet strip -s -R.comment -R.gnu.version eternity sstrip eternity Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 8 / 17
Kutistaminen Poistetaan turhat otsakkeet strip -s -R.comment -R.gnu.version eternity sstrip eternity Pakataan ohjelma ja laitetaan purkukäsky ohjelman alkuun gzip best -n -f eternity cat unpack.header eternity.gz > eternity Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 8 / 17
Yksinkertaistettu pääohjelma Alustetaan graikka, äänet ja demoon liittyvät asiat Laitetaan kello kuntoon Toistetaan graikanlaskentaa, kunnes nappia painetaan tai on kulunut tarpeeksi kauan aikaa Siivotaan jäljet Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 9 / 17
Yksinkertaistettu pääohjelma Alustetaan graikka, äänet ja demoon liittyvät asiat Laitetaan kello kuntoon Toistetaan graikanlaskentaa, kunnes nappia painetaan tai on kulunut tarpeeksi kauan aikaa Siivotaan jäljet _start ja mystinen assembly-koodi säästävät tilaa Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 9 / 17
int gfx(int t) Saa ajan pääohjelmasta parametrina Sekvensseri, joka käskee efektien piirtää ajallaan Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 10 / 17
int gfx(int t) Saa ajan pääohjelmasta parametrina Sekvensseri, joka käskee efektien piirtää ajallaan if (0 <= t && t < BEGIN_FLASH) { intro(t); } if (BEGIN_FLASH <= t && t < BEGIN_ZAP) { flash(); } Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 10 / 17
int gfx(int t) Joka kerta suoritetaan seuraava glclearcolor(0, 0, 0, 1); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // kutsu efektien piirto tässä välissä SDL_GL_SwapBuffers(); Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 11 / 17
Efektin runko Kutsuttava efekti koostuu piirtämisestä ja pyörittelystä glbegin(gl_line_strip); glvertex3f(zaps[i][j][0], zaps[i][j][1], zaps[i][j][2]); glend(); Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 12 / 17
Efektin runko Kutsuttava efekti koostuu piirtämisestä ja pyörittelystä glbegin(gl_line_strip); glvertex3f(zaps[i][j][0], zaps[i][j][1], zaps[i][j][2]); glend(); glmatrixmode(gl_modelview); glloadidentity(); glrotatef((t/30)%360, 0.2, 0.2, 0.1); Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 12 / 17
Efektin data Tieto viivoista generoidaan alussa ja tallennetaan taulukkoon static float zaps[zap_lines][zap_continue][3]; Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 13 / 17
Efektin data Tieto viivoista generoidaan alussa ja tallennetaan taulukkoon Pisteellä tietenkin kolme ulottuvuutta static float zaps[zap_lines][zap_continue][3]; Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 13 / 17
Efektin data Tieto viivoista generoidaan alussa ja tallennetaan taulukkoon Pisteellä tietenkin kolme ulottuvuutta Montako viivaa lähtee keskeltä static float zaps[zap_lines][zap_continue][3]; Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 13 / 17
Efektin data Tieto viivoista generoidaan alussa ja tallennetaan taulukkoon Pisteellä tietenkin kolme ulottuvuutta Montako viivaa lähtee keskeltä Kuinka monesta osasta viiva koostuu static float zaps[zap_lines][zap_continue][3]; Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 13 / 17
Efekteistä Tuosta datasta piirretään OpenGL-käskyillä viivat Ajastettua pyörittelyn muutosta Sama data myös toisessa efektissä, viivojen sijaan kolmioita! Myös tähtitaivasefekti Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 14 / 17
Yhteenveto Pieneen tilaan on mahdollista koodata Linuxilla Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 15 / 17
Yhteenveto Pieneen tilaan on mahdollista koodata Linuxilla Ei se niin vaikeaa ollut Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 15 / 17
Yhteenveto Pieneen tilaan on mahdollista koodata Linuxilla Ei se niin vaikeaa ollut Hauska koodata välillä likaisesti Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 15 / 17
Yhteenveto Pieneen tilaan on mahdollista koodata Linuxilla Ei se niin vaikeaa ollut Hauska koodata välillä likaisesti Tulevaisuudessa äänisynteesi, assembly? Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 15 / 17
Kiitos! Lähdekoodi löytyy osoitteesta http://www.iki.fi/tuomo.sipola/demoscene/eternity/ Kiitokset: Markku "marq" Reunanen Linux-taika Tommi "Teistiz" Teistelä OpenGL Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 16 / 17
Bonus Miten Gnomessa saa otettua kuvakaappauksia OpenGL-ohjelmasta? while sleep 15; do gnome-screenshot -w -B -e shadow -d 5; done Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 17 / 17