0,0 → 1,216 |
; |
; application : Tiny ray tracer |
; compilator : Fasm |
; system : MenuetOS64/KolibriOS |
; author : Maciej Guba aka macgub |
; email : macgub3@wp.pl |
; web : http://macgub.hekko.pl |
|
include "../../macros.inc" |
|
timeout equ 3 |
XRES equ 500 ; window size |
YRES equ 500 |
maxx = XRES |
maxy = YRES |
use32 |
|
org 0x0 |
|
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd I_END ; memory for app |
dd I_END ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
|
START: ; start of execution |
|
call draw_window |
|
still: |
|
mov eax,23 ; wait here for event |
mov ebx,timeout |
int 0x40 |
; mov eax,11 ; check for event no wait |
; int 0x40 |
|
cmp eax,1 ; redraw request ? |
je red |
cmp eax,2 ; key in buffer ? |
je key |
cmp eax,3 ; button in buffer ? |
je button |
|
jmp noclose |
|
red: ; redraw |
call draw_window |
jmp still |
|
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
jmp still |
|
button: ; button |
mov eax,17 ; get id |
int 0x40 |
|
cmp ah,1 ; button id=1 ? |
jne noclose |
|
mov eax,-1 ; close this program |
int 0x40 |
noclose: |
|
; mov eax,13 |
; mov ebx,20*65536+maxx-25 |
; mov ecx,20*65536+maxy-25 |
; xor edx,edx |
; int 0x40 |
|
mov edi,screen |
mov ecx,maxx*maxy*3/4 |
xor eax,eax |
cld |
rep stosd |
|
add [deg_counter],1 |
cmp [deg_counter],360 |
jne @f |
mov [deg_counter],0 |
@@: |
fninit |
fld [one_deg] |
fimul [deg_counter] |
fsincos |
fstp [sin] |
fstp [cos] |
|
mov ecx,MAX_SPHERES ;MAX_LIGHTS |
mov esi,non_rot_sphere ;light |
mov edi,sphere |
|
.rotary: |
|
|
fld dword[esi] |
fsub [xo] |
fmul [cos] |
fld dword[esi+8] |
fsub [zo] |
fmul [sin] |
fchs |
faddp |
fadd [xo] ; top of stack - new 'x' |
fstp dword[edi] |
|
fld dword[esi+8] |
fsub [zo] |
fmul [cos] |
fld dword[esi] |
fsub dword[xo] |
fmul [sin] |
faddp |
fadd [zo] |
fstp dword[edi+8] |
; fld dword[esi+4] |
; fstp dword[edi+4] |
push dword[esi+4] |
pop dword[edi+4] |
mov dword[edi+12],0.0 |
|
add esi,12 |
add edi,16 |
sub ecx,1 |
jnz .rotary |
|
mov ecx,MAX_LIGHTS |
mov esi,non_rot_light |
mov edi,light |
|
.rotary_lights: |
|
|
fld dword[esi] |
fsub [xo] |
fmul [cos] |
fld dword[esi+4] |
fsub [yo] |
fmul [sin] |
fchs |
faddp |
fadd [xo] ; top of stack - new 'x' |
fstp dword[edi] |
|
fld dword[esi] |
fsub [xo] |
fmul [sin] |
fchs |
fld dword[esi+4] |
fsub dword[yo] |
fmul [cos] |
faddp |
fadd [yo] |
fstp dword[edi+4] |
; fld dword[esi+8] |
; fstp dword[edi+8] |
push dword[esi+8] |
pop dword[edi+8] |
mov dword[edi+12],0.0 |
|
add esi,12 |
add edi,16 |
sub ecx,1 |
jnz .rotary_lights |
|
|
|
call main_loop |
|
mcall 7,screen,<maxx,maxy>,<0,0> |
|
|
|
jmp still |
|
|
|
include 'RAY.INC' |
|
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
draw_window: |
|
mcall 12,1 |
|
mcall 48,4 ; get skin height |
lea ecx,[eax + (100 shl 16) + maxy+4] |
mov edi,title |
mcall 0,<100,maxx+9>,,0x74000000 |
|
mcall 12,2 |
|
ret |
|
title db 'Ray tracing',0 |
xo dd 0.5 |
yo dd 0.5 |
zo dd 0.1 |
deg_counter dw 0 |
one_deg dd 0.017453 |
include 'dataray.inc' |
sin dd ? |
cos dd ? |
screen rb XRES * YRES * 3 |
mem_stack: |
rb 65536 |
I_END: |
|
|
|
|