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 alkuwowou. 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.