2D Bumpmap on aika vanha efekti, jota on joskus aina näkynyt demoissa tms. Piti päästä välillä koodailemaan jotakin opiskelujen lomassa.
Tehty toimimaan 700 Mhz koneella. Jos ohjelma toimii liian nopeasti tai hitaasti, voi kokeilla muuttaa koodista n_speed muuttujaa tai sitten ajaa ohjelmaa jonkun hidastusohjelman kanssa.
Ohjelman tarvistee kuvan "bymp.raw" ja tähän käy myös mikä tahansa 64000 tavun (320 x 200 x 8bpp) raw kuva. Sen voi piirtää esim Paint Shop Prolla.
Ei varmasti mikään kaikista lyhin, nopein tai paras ja toimivin toteutus, mutta sain kuitenkin toimimaan. En tiedä kuinka monella muulla tämä lähtee käyntiin. Muistimalli on huge, kun ei tinyllä alkanut pelittää. Saattaa myös olla, että koodissa on myös virheitä.
Jos ei ala ensimmäisenä toimia, niin säädä ohjelman muistia windowsista ja vaihda koodissa tiedostonimen paikalle koko polku.
Assemblointi tapahtuu seuraavasti MASM:lla DOS-linkkerin kera.
ml /Cp /c /nologo bump.asm
link /nologo /tiny bump.obj, bump.com,,,,
Valmiin binäärin muutaman kuvan kanssa voi ladata osoitteesta:
http://koti.mbnet.fi/~mikakem/bumpasm.zip
Edit: Poistin vielä pari turhaa, tarkistuksessa huomaamatta jäänyttä, kohtaa.
bump.asm
; 2d Bumpmap-efekti esimerkki ; © by Mika Kemppainen 2004 ; ; Assemblointi tapahtuu seuraavasti DOS-linkkerin kanssa ; ; ml /Cp /c /nologo bump.asm ; link /nologo /tiny bump.obj, bump.com,,,, .model huge, stdcall .386 .code option casemap:none org 100h alku: ;=== Varataan muistia ===; mov ah, 4Ah ; Muutetaan lohkon kokoa. mov bx, 4096h int 21h jc virhe1 mov ah, 48h mov bx, 4000 int 21h ; Varataan muistia kuvalle 320 x 200 tavua. jc virhe2 mov [bmap], ax ; Napataan segmentti talteen. mov ah, 48h ; Varataan muistia environment mapille 256 x 256 tavua. mov bx, 4096 int 21h jc virhe2 mov [lmap], ax ; Napataan segmentti talteen. mov ax, 0013h ; Vaihdetaan näyttötilaa int 10h xor cx, cx ;=== Asetetaan paletti ===; pal_1: ; Asetellaan paletti mustasta, sinisen kautta, valkoiseksi mov al, cl mov dx, 3C8h out dx, al inc dx xor ax, ax out dx, al ; r out dx, al ; g mov tmp, cx fild tmp mov tmp, 63 fild tmp fmul mov tmp, 192 fild tmp fdiv fistp tmp mov ax, tmp out dx, al ;b inc cx cmp cx, 192 jb pal_1 pal_2: mov al, cl mov dx, 3C8h out dx, al inc dx mov ax, cx sub ax, 192 out dx, al out dx, al mov al, 63 out dx, al inc cx cmp cx, 256 jb pal_2 ;=== Luodaan environment-map ===; mov ax, [lmap] mov es, ax xor di, di xor ax, ax xor bx, bx jmp new_x new_y: xor bx, bx add si, 320 - 256 new_x: finit mov tmp, ax sub tmp, 128 fild tmp mov tmp, 128 fidiv tmp fstp nY mov tmp, bx sub tmp, 128 fild tmp mov tmp, 128 fidiv tmp fstp nX fld1 fld nX fmul st, st fld nY fmul st, st fadd fsqrt fsub push ax ftst fnstsw ax sahf pop ax ja @f mov tmp, 0 jmp draw @@: fst n_tmp mov tmp, 141 fimul tmp fld n_tmp fmul st, st mov tmp, 100 fimul tmp fadd fistp tmp cmp tmp, 255 jb draw mov tmp, 255 draw: push ax mov ax, tmp mov es:[di], al ; Tallennetaan muistiin pop ax inc di inc bx cmp bx, 256 jb new_x inc ax cmp ax, 256 jb new_y ;=== Tiedoston luku (taustakuvan lataus) ===; mov ax, 3D00h mov dx, offset kuva int 21h jc virhe3 ; Ei onnistu, tulostetaan virheilmoitus ja lopetetaan mov bx, ax ; Handle bx:ään. push ds push [bmap] pop ds mov ax, 3f00h mov cx, 320*200 xor dx, dx int 21h pop ds ;=== Pääohjelma ===; push fs push es push gs push [bmap] pop fs mov ax, 0A000h mov es, ax push [lmap] pop gs fldz fstp n_angle piirto: ; Piirto-looppi fld n_angle fadd n_speed fst n_angle fcos mov tmp, 80 fimul tmp fistp [x] fld n_angle fsin mov tmp, 50 fimul tmp fistp [y] add [x], 160 add [y], 100 add [x], 128 add [y], 128 xor ax, ax xor bx, bx mov di, 320 new_y2: xor bx, bx new_x2: xor cx, cx xor dx, dx mov cl, fs:[di+1] push bx xor bx, bx mov bl, fs:[di-1] sub cx, bx pop bx mov dl, fs:[di+320] push bx xor bx, bx mov bl, fs:[di-320] sub dx, bx pop bx sub cx, bx add cx, [x] sub dx, ax add dx, [y] cmp cx, 32767 jbe @f mov cx, 255 @@: cmp cx, 255 jbe @f mov cx, 255 @@: cmp dx, 32767 jbe @f mov dx, 255 @@: cmp dx, 255 jbe @f mov dx, 255 @@: mov si, dx shl si, 8 add si, cx push ax mov al, gs:[si] mov es:[di], al pop ax inc di inc bx cmp bx, 320 jb new_x2 inc ax cmp ax, 199 jb new_y2 push ax in al, 60h dec al pop ax jnz piirto pop gs pop es pop fs mov ah, 49h ; Vapautetaan varatut muistit push [lmap] pop es int 21h mov ah, 49h push [bmap] pop es int 21h mov dx, offset noprob jmp ok ; Lopetetaan ohjelma ;=== Virheistä ilmoitus ja lopetus ===; virhe1: mov dx, offset prob1 jmp ok virhe2: mov dx, offset prob2 jmp ok virhe3: mov dx, offset prob3 jmp ok ok: mov ax, 0003h int 10h mov ah, 09h int 21h int 20h ;=== Muuttujat ja vakiot ===; tmp word 0 n_tmp real4 0.00 n_angle real4 0.00 nX real4 0.00 nY real4 0.00 nZ real4 0.00 n_0_00 real4 0.00 n_255_00 real4 255.00 n_speed real4 0.03 x word 160 y word 100 lmap word 0 bmap word 0 noprob db "OK.", "$" prob1 db "Virhe muistilohkon kokoa muutettaessa.", "$" prob2 db "Virhe muistia varattaessa.", "$" prob3 db "Kuvan avaus ei onnistunut.$", "$" kuva db "bymp.raw$", 0, "$" end alku
wowou. Vähänkö on hieno!
OOH. Eppatyyppi! Mäkin haluan osata tehdä tollaisen :D
tää on kyllä mahtava! virheitä en itse ainaskaan havainnut nopean testaamisen jälkeen :)
On HIENO
Todella tissi.
On kyllä hieno, koodista en osaa sanoa mitään kun en assya osaa.
Mihin ihmeeseen sinä tarvitset 2d-bumpmappauksessa floatteja? Eihän siinä tarvitse kuin yhteenlaskua piirtoluupissa, ja senkin voi tehdä neljä pikseliä rinnakkain ilman että mitään virheitä näkyy :)
Ks. esim. http://www.pelulamu.net/vizaddy.com - sorsia ei kyllä ole enää missään tallessa, mutta halukkaat voivat toki disassembloida, ei ole paljoa koodia :)
hieano
Aihe on jo aika vanha, joten et voi enää vastata siihen.