Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: 2D Bumpmap

Sivun loppuun

KemXy [24.09.2004 17:09:47]

#

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

rndprogy [25.09.2004 11:04:46]

#

wowou. Vähänkö on hieno!

sooda [25.09.2004 11:13:27]

#

OOH. Eppatyyppi! Mäkin haluan osata tehdä tollaisen :D

nomic [25.09.2004 12:37:23]

#

tää on kyllä mahtava! virheitä en itse ainaskaan havainnut nopean testaamisen jälkeen :)

Bill Keltanen [25.09.2004 14:53:53]

#

On HIENO

mankeli [25.09.2004 19:25:53]

#

Todella tissi.

firebug [25.09.2004 20:48:45]

#

On kyllä hieno, koodista en osaa sanoa mitään kun en assya osaa.

viznut [14.10.2004 23:27:14]

#

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 :)

moptim [11.11.2006 13:51:20]

#

hieano


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta