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 alku
Ai 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.