Rotozoom 2D
by Mika Kemppainen
Demokilpailun voittajademossa oli taustalla ihan hieno efekti, joten päätin väsätä sellaisen itsekin. Elikkäs jokin toistuva kuvio, jota pyöritellään ja zoomaillaan. Tein tästä aluksi C/SDL version, mutta päätin kääntää sen lopulta assemblyksi.
Muuten olen ihan tyytyväinen, mutta kuvio pyörii jokseenkin liikaa toisella kulmalla. Tärkeimmät muuttujat ovat angle ja zoom. Kulmaa (anglea) lisätään muuttujan ang_d arvolla, joten siitä voi säätää nopeutta.
En ole tätä liiemmin testaillut, vain omalla koneellani (700Mhz). MoSlo:a tms. voi käyttää, jos toimii liian nopeasti.
Assemblointi tapahtuu ihan tavallisesti Dos-linkkerin kanssa:
ml /Cp /c /nologo roto.asm
link /nologo /tiny roto.obj, roto.com,,,,
roto.asm
; RotoZoom 1.0
; by Mika Kemppainen 2005
;
; Assemblointi tapahtuu seuraavasti DOS-linkkerin kanssa
;
; ml /Cp /c /nologo roto.asm
; link /nologo /tiny roto.obj, roto.com,,,,
.model tiny, stdcall
.386
.code
option casemap:none
org 100h
alku:
mov ax, 0013h
int 10h
mov cx, 0FFh ; 256 värisävyä
;=== Asetetaan paletti ===;
pal_1:
mov al, cl
mov dx, 3C8h
out dx, al
inc dx
mov tmp, ax
fild tmp
fmul JAKO ; Jaetaan, jotta saadaan
fistp tmp ; tasainen väriliuku 0-255
mov ax, tmp
out dx, al ;r ; Punainen paletti
xor ax, ax
out dx, al ;g
out dx, al ;b
loop pal_1
mov ax, 0A000h
mov es, ax
;=== Ohjelman pääsilmukka ===;
piirto:
finit
fld angle ; Liikutetllaan hieman "origoa"
fcos ; (alkux, alkuy)
mov tmp, 188
fimul tmp
fstp alkux
fld angle
fsin
fimul tmp
fstp alkuy
fld zoom ; Lisätään kulmaa ja muutetaan zoomia
fld angle
fadd ang_d
fst angle
fsin
fmul n_0_01
fadd
fstp zoom ; zoom += sin(angle) * n_0_01
fld angle
fcos
fdiv zoom
fstp du ; du = cos(angle)/zoom
fld angle
fsin
fdiv zoom
fstp dv ; dv = sin(angle)/zoom
xor di, di ; Asetetaan DI piirron alkuun
xor bx, bx
new_y3: ; Käydään jokainen näytön pikseli
xor ax, ax ; läpi.
fld alkux ; Koordinaatit "tekstuurissa" alkuun
fstp tu
fld alkuy
fstp tv
new_x3:
fld tu ; Pikselin väri tekstuurin
fistp x ; x-, ja y-kohdan mukaan.
fld tv
fistp y
mov cx, x
xor cx, y ; väri = xor tu, tv
mov es:[di], cl ; Kopioidaan näytölle
inc di
fld tu ; Siirrytään "tekstuurissa"
fadd du
fstp tu
fld tv
fsub dv
fstp tv
inc ax ; Lisätään x-koordinaattia
cmp ax, 320
jb new_x3 ; Käydään läpi rivi kerrallaan
fld alkux ; Liikutaan taas "tekstuurissa"
fld dv ; oikeaan kohtaan
fsub
fstp alkux
fld alkuy
fsub du
fstp alkuy
inc bx ; Lisätään y-koordinaattia
cmp bx, 200
jb new_y3
push ax ; Onko painettu ESC?
in al, 60h
dec al
pop ax
jnz piirto
;=== Ohjelman lopetus ===;
mov ax, 0003h ; Palautetaan näyttötila
int 10h
int 20h ; Lopetetaan ohjelma
;=== Muuttujat ja vakiot ===;
tmp word 0
x word 0
y word 0
n_0_01 real4 0.0025
alkux real4 0.00
alkuy real4 0.00
tv real4 0.00
tu real4 0.00
ang_d real4 0.005
du real4 0.00
dv real4 0.00
angle real4 0.00
zoom real4 0.25
JAKO real4 0.247
end alkuAi niin, ja käännetty ohjelma:
http://koti.mbnet.fi/~mikakem/Roto.zip
Mukana on sekä sinisellä että punaisella paletilla olevat versiot.
Vinkki: nopeutta saat ku käytät fixedpointteja <3
Mutta joo, ihan tavallinen xor-rotozoomerihan tää vaan on. Ei tässä imo ole mitään ihmeellistä ;o
Vau! Nätti tosiaan!
Pirun hienoo työtä!
Ihan ihq <3
Vau, mite joku osaa tommosta asmilla o_O Ois kiva itekin opetella niin mäki olisin leet <3
No ei, mut hieno. :)
Jooh.. itse asiassa tein tuon lähinnä mahdollisimman selkeäksi. Tarvittaessa saisi varmaan hyvinkin pienennettyä vielä.
Hieno on. Tuossa paketissa missä on noi valmiiksi käännetyt sininen tuntui menevän nopeammin :)
Mistäkähän saisin ilmaiseksi tuollaisen DOS-linkkerin?
Jostain syystä tuo linkki ei toiminut, mutta tämä taaseen toimi:
http://koti.mbnet.fi/mikakem/Roto.zip
Eli ilman tuota vänkyrää.
Helvetin pieneen tilaan oot kyl saanu noi exet :o
Aihe on jo aika vanha, joten et voi enää vastata siihen.