0,0 → 1,1984 |
; |
; application : Deus Caritas Est - app shows three models shading |
; compiler : FASM 1.65.13 |
; system : KolibriOS/MenuetOS |
; author : macgub |
; email : macgub3@wp.pl |
; web : www.menuet.xt.pl |
; Fell free to use this intro in your own distribution of KolibriOS/MenuetOS. |
; Special greetings to all MenuetOS maniax in the world. |
; I hope because my intros Christian Belive will be near to each of You. |
|
|
; Some adjustments made by Madis Kalme |
; madis.kalme@mail.ee |
; I tried optimizing it a bit, but don't know if it was successful. The objects |
; can be: |
; 1) Read from a file (*.3DS standard) |
; 2) Written in manually (at the end of the code) |
SIZE_X equ 250 |
SIZE_Y equ 250 |
TIMEOUT equ 4 |
ROUND equ 10 |
TEX_X equ 512 ; texture width |
TEX_Y equ 512 ; height |
TEX_SHIFT equ 9 ; texture widith shifting |
TEX equ SHIFTING ; TEX={SHIFTING | FLUENTLY} |
FLUENTLY = 0 |
SHIFTING = 1 |
;CATMULL_SHIFT equ 8 |
NON = 0 |
MMX = 1 |
|
Ext = MMX ;Ext={ NON | MMX} |
|
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 |
cld |
; call alloc_buffer_mem |
call read_from_file |
call init_triangles_normals |
call init_point_normals |
call init_envmap |
call draw_window |
|
|
still: |
mov eax,23 ; wait here for event with timeout |
mov ebx,TIMEOUT |
cmp [speed_flag],1 |
jne .skip |
mov eax,11 |
.skip: |
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 noclose |
|
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
jmp noclose |
|
button: ; button |
mov eax,17 ; get id |
int 0x40 |
|
cmp ah,1 ; button id=1 ? |
jne .ch_another |
|
mov eax,-1 ; close this program |
int 0x40 |
.ch_another: |
cmp ah,2 |
jne .ch_another1 |
inc [r_flag] |
cmp [r_flag],3 |
jne noclose |
mov [r_flag],0 |
.ch_another1: |
cmp ah,3 |
jne .ch_another2 |
inc [dr_flag] |
cmp [dr_flag],3 |
jne noclose |
mov [dr_flag],0 |
.ch_another2: |
cmp ah,4 ; toggle speed |
jne @f |
inc [speed_flag] |
cmp [speed_flag],2 |
jne noclose |
mov [speed_flag],0 |
@@: |
cmp ah,5 |
jne @f ;scale- |
mov [scale],0.7 |
fninit |
fld [sscale] |
fmul [scale] |
fstp [sscale] |
call read_from_file |
mov ax,[vect_x] ;-- last change |
mov bx,[vect_y] |
mov cx,[vect_z] |
call add_vector |
; call do_scale |
@@: |
cmp ah,6 |
jne @f ; scale+ |
mov [scale],1.3 |
fninit |
fld [sscale] |
fmul [scale] |
fstp [sscale] |
call read_from_file |
mov ax,[vect_x] |
mov bx,[vect_y] |
mov cx,[vect_z] |
call add_vector |
call init_triangles_normals |
call init_point_normals |
@@: |
cmp ah,7 |
jne @f |
xor ax,ax ;add vector to object and rotary point |
mov bx,-10 |
xor cx,cx |
call add_vector |
sub [vect_y],10 |
sub [yo],10 |
@@: |
cmp ah,8 |
jne @f |
xor ax,ax |
xor bx,bx |
mov cx,10 |
call add_vector |
add [vect_z],10 |
add [zo],10 |
@@: |
cmp ah,9 |
jne @f |
mov ax,-10 |
xor bx,bx |
xor cx,cx |
call add_vector |
sub [vect_x],10 |
sub [xo],10 |
@@: |
cmp ah,10 |
jne @f |
mov ax,10 |
xor bx,bx |
xor cx,cx |
call add_vector |
add [vect_x],10 |
add [xo],10 |
@@: |
cmp ah,11 |
jne @f |
xor ax,ax |
xor bx,bx |
mov cx,-10 |
call add_vector |
sub [vect_z],10 |
sub [zo],10 |
@@: |
cmp ah,12 |
jne @f |
xor ax,ax |
mov bx,10 |
xor cx,cx |
call add_vector |
add [vect_y],10 |
add [yo],10 |
@@: |
cmp ah,13 ; change main color - |
jne @f ; - lead color setting |
cmp [max_color_r],245 |
jge @f |
add [max_color_r],10 |
call init_envmap |
@@: |
cmp ah,14 |
jne @f |
cmp [max_color_g],245 |
jge @f |
add [max_color_g],10 |
call init_envmap |
@@: |
cmp ah,15 |
jne @f |
cmp [max_color_b],245 |
jge @f |
add [max_color_b],10 |
call init_envmap |
@@: |
cmp ah,16 ; change main color |
jne @f |
cmp [max_color_r],10 |
jle @f |
sub [max_color_r],10 |
call init_envmap |
@@: |
cmp ah,17 |
jne @f |
cmp [max_color_g],10 |
jle @f |
sub [max_color_g],10 |
call init_envmap |
@@: |
cmp ah,18 |
jne @f |
cmp [max_color_b],10 |
jle @f |
sub [max_color_b],10 |
call init_envmap |
@@: |
cmp ah,19 |
jne @f |
inc [catmull_flag] |
cmp [catmull_flag],2 |
jne @f |
mov [catmull_flag],0 |
@@: |
noclose: |
|
call calculate_angle ; calculates sinus and cosinus |
call copy_point_normals |
; copy normals and rotate the copy using sin/cosbeta - best way |
call rotate_point_normals |
call calculate_colors |
call copy_points |
call rotate_points |
call translate_perspective_points; translate from 3d to 2d |
call clrscr ; clear the screen |
cmp [dr_flag],2 |
je @f |
cmp [catmull_flag],1 ;if env_mapping sort faces |
je @f |
@@: |
call sort_triangles |
@@: |
call fill_Z_buffer |
|
RDTSC |
push eax |
call draw_triangles ; draw all triangles from the list |
|
RDTSC |
sub eax,[esp] |
sub eax,41 |
; lea esi,[debug_points] |
; lea edi,[debug_points+6] |
; lea ebx,[debug_vector1] |
; call make_vector |
; fninit |
; fld [sinbeta_one] |
; fimul [debug_dwd] |
; fistp [debug_dd] |
; movzx eax,[debug_dd] |
|
|
mov ecx,10 |
.dc: |
xor edx,edx |
mov edi,10 |
div edi |
add dl,30h |
mov [STRdata+ecx-1],dl |
loop .dc |
pop eax |
macro show |
{ |
mov eax,7 ; put image |
mov ebx,screen |
mov ecx,SIZE_X shl 16 + SIZE_Y |
mov edx,5 shl 16 + 20 |
int 0x40 |
} |
show |
mov eax,4 ; function 4 : write text to window |
mov ebx,5*65536+23 ; [x start] *65536 + [y start] |
mov ecx,-1 |
mov edx,STRdata ; pointer to text beginning |
mov esi,10 ; text length |
int 40h |
|
|
|
jmp still |
|
;-------------------------------------------------------------------------------- |
;-------------------------PROCEDURES--------------------------------------------- |
;-------------------------------------------------------------------------------- |
include "../../3DS/TEX3.INC" |
include "../../3DS/FLAT_CAT.INC" |
include "../../3DS/GRD_CAT.INC" |
include "../../3DS/3DMATH.INC" |
include "../../3DS/GRD3.INC" |
include "../../3DS/FLAT3.INC" |
|
|
;alloc_buffer_mem: |
; mov eax,68 |
; mov ebx,5 |
; mov ecx,SIZE_X*SIZE_Y*3 |
; int 0x40 |
; mov [screen],eax |
;ret |
init_envmap: |
|
.temp equ word [ebp-2] |
push ebp |
mov ebp,esp |
sub esp,2 |
mov edi,envmap |
fninit |
|
mov dx,-256 |
.ie_ver: |
mov cx,-256 |
.ie_hor: |
mov .temp,cx |
fild .temp |
fmul st,st0 |
mov .temp,dx |
fild .temp |
fmul st,st0 |
faddp |
fsqrt |
mov .temp,254 |
fisubr .temp |
fmul [env_const] |
fistp .temp |
mov ax,.temp |
|
or ax,ax |
jge .ie_ok1 |
xor ax,ax |
jmp .ie_ok2 |
.ie_ok1: |
cmp ax,254 |
jle .ie_ok2 |
mov ax,254 |
.ie_ok2: |
push dx |
mov bx,ax |
mul [max_color_b] |
shr ax,8 |
stosb |
mov ax,bx |
mul [max_color_g] |
shr ax,8 |
stosb |
mov ax,bx |
mul [max_color_r] |
shr ax,8 |
stosb |
pop dx |
|
inc cx |
cmp cx,256 |
jne .ie_hor |
|
inc dx |
cmp dx,256 |
jne .ie_ver |
|
mov esp,ebp |
pop ebp |
macro debug |
{ |
mov edi,envmap |
mov ecx,512*512*3/4 |
mov eax,0xffffffff |
rep stosd |
} |
ret |
calculate_colors: |
fninit |
xor ebx,ebx |
movzx ecx,[points_count_var] |
lea ecx,[ecx*3] |
add ecx,ecx |
.cc_again: |
mov esi,light_vector |
lea edi,[point_normals_rotated+ebx*2] |
call dot_product |
fcom [dot_min] |
fstsw ax |
sahf |
ja .cc_ok1 |
ffree st |
mov dword[points_color+ebx],0 |
mov word[points_color+ebx+4],0 |
add ebx,6 |
cmp ebx,ecx |
jne .cc_again |
jmp .cc_done |
.cc_ok1: |
fcom [dot_max] |
fstsw ax |
sahf |
jb .cc_ok2 |
ffree st |
mov dword[points_color+ebx],0 ; clear r,g,b |
mov word[points_color+ebx+4],0 |
add ebx,6 |
cmp ebx,ecx |
jne .cc_again |
jmp .cc_done |
.cc_ok2: |
fld st |
fld st |
fimul [max_color_r] |
fistp word[points_color+ebx] ;each color as word |
fimul [max_color_g] |
fistp word[points_color+ebx+2] |
fimul [max_color_b] |
fistp word[points_color+ebx+4] |
add ebx,6 |
cmp ebx,ecx |
jne .cc_again |
.cc_done: |
ret |
copy_point_normals: |
movzx ecx,[points_count_var] |
shl ecx,2 |
inc ecx |
mov esi,point_normals |
mov edi,point_normals_rotated |
rep movsd |
ret |
rotate_point_normals: |
movzx ecx,[points_count_var] |
mov ebx,point_normals_rotated |
fninit ; for now only rotate around Z axle |
.again_r: |
cmp [r_flag],1 |
je .z_rot |
cmp [r_flag],2 |
je .x_rot |
|
.y_rot: |
fld dword[ebx] ; x |
fld [sinbeta] |
fmul dword[ebx+8] ; z * sinbeta |
fchs |
fld [cosbeta] |
fmul dword[ebx] ; x * cosbeta |
faddp |
fstp dword[ebx] ; new x |
fmul [sinbeta] ; old x * sinbeta |
fld [cosbeta] |
fmul dword[ebx+8] ; z * cosbeta |
faddp |
fstp dword[ebx+8] ; new z |
add ebx,12 |
loop .y_rot |
jmp .end_rot |
.z_rot: |
fld dword[ebx] ;x |
fld [sinbeta] |
fmul dword[ebx+4] ;y |
fld [cosbeta] |
fmul dword[ebx] ;x |
faddp |
fstp dword[ebx] ;new x |
fmul [sinbeta] ; sinbeta * old x |
fchs |
fld [cosbeta] |
fmul dword[ebx+4] ; cosbeta * y |
faddp |
fstp dword[ebx+4] ; new y |
add ebx,12 |
loop .z_rot |
jmp .end_rot |
.x_rot: |
fld dword[ebx+4] ;y |
fld [sinbeta] |
fmul dword[ebx+8] ;z |
fld [cosbeta] |
fmul dword[ebx+4] ;y |
faddp |
fstp dword[ebx+4] ; new y |
fmul [sinbeta] ; sinbeta * old y |
fchs |
fld [cosbeta] |
fmul dword[ebx+8] |
faddp |
fstp dword[ebx+8] |
add ebx,12 |
loop .x_rot |
.end_rot: |
ret |
init_triangles_normals: |
mov ebx,triangles_normals |
mov ebp,triangles |
@@: |
push ebx |
mov ebx,vectors |
movzx esi,word[ebp] ; first point index |
lea esi,[esi*3] |
lea esi,[points+esi*2] ; esi - pointer to 1st 3d point |
movzx edi,word[ebp+2] ; second point index |
lea edi,[edi*3] |
lea edi,[points+edi*2] ; edi - pointer to 2nd 3d point |
call make_vector |
add ebx,12 |
mov esi,edi |
movzx edi,word[ebp+4] ; third point index |
lea edi,[edi*3] |
lea edi,[points+edi*2] |
call make_vector |
mov edi,ebx ; edi - pointer to 2nd vector |
mov esi,ebx |
sub esi,12 ; esi - pointer to 1st vector |
pop ebx |
call cross_product |
mov edi,ebx |
call normalize_vector |
add ebp,6 |
add ebx,12 |
cmp dword[ebp],-1 |
jne @b |
ret |
|
init_point_normals: |
.x equ dword [ebp-4] |
.y equ dword [ebp-8] |
.z equ dword [ebp-12] |
.point_number equ word [ebp-26] |
.hit_faces equ word [ebp-28] |
|
fninit |
mov ebp,esp |
sub esp,28 |
mov edi,point_normals |
mov .point_number,0 |
.ipn_loop: |
mov .hit_faces,0 |
mov .x,0 |
mov .y,0 |
mov .z,0 |
mov esi,triangles |
xor ecx,ecx ; ecx - triangle number |
.ipn_check_face: |
xor ebx,ebx ; ebx - 'position' in one triangle |
.ipn_check_vertex: |
movzx eax,word[esi+ebx] ; eax - point_number |
cmp ax,.point_number |
jne .ipn_next_vertex |
push esi |
mov esi,ecx |
lea esi,[esi*3] |
lea esi,[triangles_normals+esi*4] |
; shl esi,2 |
; add esi,triangles_normals |
|
fld .x |
fadd dword[esi+vec_x] |
fstp .x |
fld .y |
fadd dword[esi+vec_y] |
fstp .y |
fld .z |
fadd dword[esi+vec_z] |
fstp .z |
pop esi |
inc .hit_faces |
jmp .ipn_next_face |
.ipn_next_vertex: |
add ebx,2 |
cmp ebx,6 |
jne .ipn_check_vertex |
.ipn_next_face: |
add esi,6 |
inc ecx |
cmp cx,[triangles_count_var] |
jne .ipn_check_face |
|
fld .x |
fidiv .hit_faces |
fstp dword[edi+vec_x] |
fld .y |
fidiv .hit_faces |
fstp dword[edi+vec_y] |
fld .z |
fidiv .hit_faces |
fstp dword[edi+vec_z] |
call normalize_vector |
add edi,12 ;type vector 3d |
inc .point_number |
mov dx,.point_number |
cmp dx,[points_count_var] |
jne .ipn_loop |
|
mov esp,ebp |
ret |
|
add_vector: |
mov ebp,points |
@@: |
add word[ebp],ax |
add word[ebp+2],bx |
add word[ebp+4],cx |
add ebp,6 |
cmp dword[ebp],-1 |
jne @b |
ret |
;do_scale: |
; fninit |
; mov ebp,points |
; .next_sc: |
; fld1 |
; fsub [scale] |
; fld st |
; fimul [xo] |
; fld [scale] |
; fimul word[ebp] ;x |
; faddp |
; fistp word[ebp] |
; fld st |
; fimul [yo] |
; fld [scale] |
; fimul word[ebp+2] |
; faddp |
; fistp word[ebp+2] |
; fimul [zo] |
; fld [scale] |
; fimul word[ebp+4] |
; faddp |
; fistp word[ebp+4] |
; add ebp,6 |
; cmp dword[ebp],-1 |
; jne .next_sc |
;ret |
sort_triangles: |
mov esi,triangles |
mov edi,triangles_with_z |
mov ebp,points_rotated |
|
make_triangle_with_z: ;makes list with triangles and z position |
movzx eax,word[esi] |
lea eax,[eax*3] |
movzx ecx,word[ebp+eax*2+4] |
|
movzx eax,word[esi+2] |
lea eax,[eax*3] |
add cx,word[ebp+eax*2+4] |
|
movzx eax,word[esi+4] |
lea eax,[eax*3] |
add cx,word[ebp+eax*2+4] |
|
mov ax,cx |
; cwd |
; idiv word[i3] |
movsd ; store vertex coordinates |
movsw |
stosw ; middle vertex coordinate 'z' in triangles_with_z list |
cmp dword[esi],-1 |
jne make_triangle_with_z |
movsd ; copy end mark |
mov eax,4 |
lea edx,[edi-8-trizdd] |
mov [high],edx |
call quicksort |
mov eax,4 |
mov edx,[high] |
call insertsort |
jmp end_sort |
|
quicksort: |
mov ecx,edx |
sub ecx,eax |
cmp ecx,32 |
jc .exit |
lea ecx,[eax+edx] |
shr ecx,4 |
lea ecx,[ecx*8-4]; i |
mov ebx,[trizdd+eax]; trizdd[l] |
mov esi,[trizdd+ecx]; trizdd[i] |
mov edi,[trizdd+edx]; trizdd[h] |
cmp ebx,esi |
jg @f ; direction NB! you need to negate these to invert the order |
if Ext=NON |
mov [trizdd+eax],esi |
mov [trizdd+ecx],ebx |
mov ebx,[trizdd+eax-4] |
mov esi,[trizdd+ecx-4] |
mov [trizdd+eax-4],esi |
mov [trizdd+ecx-4],ebx |
mov ebx,[trizdd+eax] |
mov esi,[trizdd+ecx] |
else |
movq mm0,[trizdq+eax-4] |
movq mm1,[trizdq+ecx-4] |
movq [trizdq+ecx-4],mm0 |
movq [trizdq+eax-4],mm1 |
xchg ebx,esi |
end if |
@@: |
cmp ebx,edi |
jg @f ; direction |
if Ext=NON |
mov [trizdd+eax],edi |
mov [trizdd+edx],ebx |
mov ebx,[trizdd+eax-4] |
mov edi,[trizdd+edx-4] |
mov [trizdd+eax-4],edi |
mov [trizdd+edx-4],ebx |
mov ebx,[trizdd+eax] |
mov edi,[trizdd+edx] |
else |
movq mm0,[trizdq+eax-4] |
movq mm1,[trizdq+edx-4] |
movq [trizdq+edx-4],mm0 |
movq [trizdq+eax-4],mm1 |
xchg ebx,edi |
end if |
@@: |
cmp esi,edi |
jg @f ; direction |
if Ext=NON |
mov [trizdd+ecx],edi |
mov [trizdd+edx],esi |
mov esi,[trizdd+ecx-4] |
mov edi,[trizdd+edx-4] |
mov [trizdd+ecx-4],edi |
mov [trizdd+edx-4],esi |
else |
movq mm0,[trizdq+ecx-4] |
movq mm1,[trizdq+edx-4] |
movq [trizdq+edx-4],mm0 |
movq [trizdq+ecx-4],mm1 |
; xchg ebx,esi |
end if |
@@: |
mov ebp,eax ; direction |
add ebp,8 ; j |
if Ext=NON |
mov esi,[trizdd+ebp] |
mov edi,[trizdd+ecx] |
mov [trizdd+ebp],edi |
mov [trizdd+ecx],esi |
mov esi,[trizdd+ebp-4] |
mov edi,[trizdd+ecx-4] |
mov [trizdd+ecx-4],esi |
mov [trizdd+ebp-4],edi |
else |
movq mm0,[trizdq+ebp-4] |
movq mm1,[trizdq+ecx-4] |
movq [trizdq+ecx-4],mm0 |
movq [trizdq+ebp-4],mm1 |
end if |
mov ecx,edx ; i; direction |
mov ebx,[trizdd+ebp]; trizdd[j] |
.loop: |
sub ecx,8 ; direction |
cmp [trizdd+ecx],ebx |
jl .loop ; direction |
@@: |
add ebp,8 ; direction |
cmp [trizdd+ebp],ebx |
jg @b ; direction |
cmp ebp,ecx |
jge @f ; direction |
if Ext=NON |
mov esi,[trizdd+ecx] |
mov edi,[trizdd+ebp] |
mov [trizdd+ebp],esi |
mov [trizdd+ecx],edi |
mov edi,[trizdd+ecx-4] |
mov esi,[trizdd+ebp-4] |
mov [trizdd+ebp-4],edi |
mov [trizdd+ecx-4],esi |
else |
movq mm0,[trizdq+ecx-4] |
movq mm1,[trizdq+ebp-4] |
movq [trizdq+ebp-4],mm0 |
movq [trizdq+ecx-4],mm1 |
end if |
jmp .loop |
@@: |
if Ext=NON |
mov esi,[trizdd+ecx] |
mov edi,[trizdd+eax+8] |
mov [trizdd+eax+8],esi |
mov [trizdd+ecx],edi |
mov edi,[trizdd+ecx-4] |
mov esi,[trizdd+eax+4] |
mov [trizdd+eax+4],edi |
mov [trizdd+ecx-4],esi |
else |
movq mm0,[trizdq+ecx-4] |
movq mm1,[trizdq+eax+4]; dir |
movq [trizdq+eax+4],mm0; dir |
movq [trizdq+ecx-4],mm1 |
end if |
add ecx,8 |
push ecx edx |
mov edx,ebp |
call quicksort |
pop edx eax |
call quicksort |
.exit: |
ret |
insertsort: |
mov esi,eax |
.start: |
add esi,8 |
cmp esi,edx |
ja .exit |
mov ebx,[trizdd+esi] |
if Ext=NON |
mov ecx,[trizdd+esi-4] |
else |
movq mm1,[trizdq+esi-4] |
end if |
mov edi,esi |
@@: |
cmp edi,eax |
jna @f |
cmp [trizdd+edi-8],ebx |
jg @f ; direction |
if Ext=NON |
mov ebp,[trizdd+edi-8] |
mov [trizdd+edi],ebp |
mov ebp,[trizdd+edi-12] |
mov [trizdd+edi-4],ebp |
else |
movq mm0,[trizdq+edi-12] |
movq [trizdq+edi-4],mm0 |
end if |
sub edi,8 |
jmp @b |
@@: |
if Ext=NON |
mov [trizdd+edi],ebx |
mov [trizdd+edi-4],ecx |
else |
movq [trizdq+edi-4],mm1 |
end if |
jmp .start |
.exit: |
ret |
end_sort: |
; translate triangles_with_z to sorted_triangles |
mov esi,triangles_with_z |
; mov edi,sorted_triangles |
mov edi,triangles |
again_copy: |
if Ext=NON |
movsd |
movsw |
add esi,2 |
else |
movq mm0,[esi] |
movq [edi],mm0 |
add esi,8 |
add edi,6 |
end if |
cmp dword[esi],-1 |
jne again_copy |
; if Ext=MMX |
; emms |
; end if |
movsd ; copy end mark too |
ret |
|
clrscr: |
mov edi,screen |
mov ecx,SIZE_X*SIZE_Y*3/4 |
xor eax,eax |
if Ext=NON |
rep stosd |
else |
pxor mm0,mm0 |
@@: |
movq [edi+00],mm0 |
movq [edi+08],mm0 |
movq [edi+16],mm0 |
movq [edi+24],mm0 |
add edi,32 |
sub ecx,8 |
jnc @b |
end if |
ret |
|
calculate_angle: |
fninit |
; fldpi |
; fidiv [i180] |
fld [piD180] |
fimul [angle_counter] |
fsincos |
fstp [sinbeta] |
fstp [cosbeta] |
inc [angle_counter] |
cmp [angle_counter],360 |
jne end_calc_angle |
mov [angle_counter],0 |
end_calc_angle: |
ret |
|
rotate_points: |
fninit |
mov ebx,points_rotated |
again_r: |
cmp [r_flag],1 |
je .z_rot |
cmp [r_flag],2 |
je .x_rot |
.y_rot: |
mov eax,[ebx+2] ;z |
mov ax,word[ebx] ;x |
sub eax,dword[xo] |
mov dword[xsub],eax |
fld [sinbeta] |
fimul [zsub] |
fchs |
fld [cosbeta] |
fimul [xsub] |
faddp |
fiadd [xo] |
fistp word[ebx] ;x |
fld [sinbeta] |
fimul [xsub] |
fld [cosbeta] |
fimul [zsub] |
faddp |
fiadd [zo] |
fistp word[ebx+4] ;z |
jmp .end_rot |
.z_rot: |
mov ax,word[ebx] |
sub ax,word[xo] ;need optimization |
mov [xsub],ax |
mov ax,word[ebx+2] |
sub ax,word[yo] |
mov [ysub],ax |
fld [sinbeta] |
fimul [ysub] |
fld [cosbeta] |
fimul [xsub] |
faddp |
fiadd [xo] |
fistp word[ebx] |
fld [cosbeta] |
fimul [ysub] |
fld [sinbeta] |
fimul [xsub] |
fchs |
faddp |
fiadd [yo] |
fistp word[ebx+2] |
jmp .end_rot |
.x_rot: |
mov ax,word[ebx+2] |
sub ax,[yo] |
mov [ysub],ax |
mov ax,word[ebx+4] |
sub ax,word[zo] |
mov [zsub],ax |
fld [sinbeta] |
fimul [zsub] |
fld [cosbeta] |
fimul [ysub] |
faddp |
fiadd [yo] |
fistp word[ebx+2];y |
fld [cosbeta] |
fimul [zsub] |
fld [sinbeta] |
fimul [ysub] |
fchs |
faddp |
fiadd [zo] |
fistp word[ebx+4] |
.end_rot: |
add ebx,6 |
cmp dword[ebx],-1 |
jne again_r |
ret |
|
draw_triangles: |
mov esi,triangles |
.again_dts: |
mov ebp,points_rotated |
if Ext=NON |
movzx eax,word[esi] |
mov [point_index1],ax |
lea eax,[eax*3] |
add eax,eax |
push ebp |
add ebp,eax |
mov eax,[ebp] |
mov dword[xx1],eax |
mov eax,[ebp+4] |
mov [zz1],ax |
pop ebp |
|
|
movzx eax,word[esi+2] |
mov [point_index2],ax |
lea eax,[eax*3] |
add eax,eax |
push ebp |
add ebp,eax |
mov eax,[ebp] |
mov dword[xx2],eax |
mov eax,[ebp+4] |
mov [zz2],ax |
pop ebp |
|
|
movzx eax,word[esi+4] ; xyz3 = [ebp+[esi+4]*6] |
mov [point_index3],ax |
lea eax,[eax*3] |
add eax,eax |
; push ebp |
add ebp,eax |
mov eax,[ebp] |
mov dword[xx3],eax |
mov eax,[ebp+4] |
mov [zz3],ax |
else |
mov eax,dword[esi] ; don't know MMX |
mov dword[point_index1],eax |
; shr eax,16 |
; mov [point_index2],ax |
mov ax,word[esi+4] |
mov [point_index3],ax |
movq mm0,[esi] |
pmullw mm0,qword[const6] |
movd eax,mm0 |
psrlq mm0,16 |
movd ebx,mm0 |
psrlq mm0,16 |
movd ecx,mm0 |
and eax,0FFFFh |
and ebx,0FFFFh |
and ecx,0FFFFh |
movq mm0,[ebp+eax] |
movq mm1,[ebp+ebx] |
movq mm2,[ebp+ecx] |
movq qword[xx1],mm0 |
movq qword[xx2],mm1 |
movq qword[xx3],mm2 |
; emms |
end if |
push esi |
; culling |
fninit |
mov esi,point_index1 |
mov ecx,3 |
@@: |
movzx eax,word[esi] |
lea eax,[eax*3] |
shl eax,2 |
lea eax,[eax+point_normals_rotated] |
fld dword[eax+8] |
ftst |
fstsw ax |
sahf |
jb @f |
ffree st |
loop @b |
jmp .end_draw |
@@: |
ffree st ;is visable |
|
cmp [dr_flag],0 ; draw type flag |
je .flat_draw |
cmp [dr_flag],2 |
je .env_mapping |
|
movzx edi,[point_index3] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
cmp [catmull_flag],0 |
je @f |
push [zz3] |
@@: |
push word[edi] |
push word[edi+2] |
push word[edi+4] |
movzx edi,[point_index2] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
cmp [catmull_flag],0 |
je @f |
push [zz2] |
@@: |
push word[edi] |
push word[edi+2] |
push word[edi+4] |
movzx edi,[point_index1] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
cmp [catmull_flag],0 |
je @f |
push [zz1] |
@@: |
push word[edi] |
push word[edi+2] |
push word[edi+4] |
|
; movzx edi,[point_index3] ;gouraud shading according to light vector |
; lea edi,[edi*3] |
; lea edi,[4*edi+point_normals_rotated] ; edi - normal |
; mov esi,light_vector |
; call dot_product |
; fabs |
; fimul [max_color_r] |
; fistp [temp_col] |
; and [temp_col],0x00ff |
; push [temp_col] |
; push [temp_col] |
; push [temp_col] |
|
; movzx edi,[point_index2] |
; lea edi,[edi*3] |
; lea edi,[4*edi+point_normals_rotated] ; edi - normal |
; mov esi,light_vector |
; call dot_product |
; fabs |
; fimul [max_color_r] |
; fistp [temp_col] |
; and [temp_col],0x00ff |
; push [temp_col] |
; push [temp_col] |
; push [temp_col] |
|
; movzx edi,[point_index1] |
; lea edi,[edi*3] |
; lea edi,[4*edi+point_normals_rotated] ; edi - normal |
; mov esi,light_vector |
; call dot_product |
; fabs |
; fimul [max_color_r] |
; fistp [temp_col] |
; and [temp_col],0x00ff |
; push [temp_col] |
; push [temp_col] |
; push [temp_col] |
|
; xor edx,edx ; draw acording to position |
; mov ax,[zz3] |
; add ax,128 |
; neg al |
; and ax,0x00ff |
; push ax |
; neg al |
; push ax |
; mov dx,[yy3] |
; and dx,0x00ff |
; push dx |
; mov ax,[zz2] |
; add ax,128 |
; neg al |
; and ax,0x00ff |
; push ax |
; neg al |
; push ax |
; mov dx,[yy2] |
; and dx,0x00ff |
; push dx |
; mov ax,[zz1] |
; add ax,128 |
; neg al |
; and ax,0x00ff |
; push ax |
; neg al |
; push ax |
; mov dx,[yy1] |
; and dx,0x00ff |
; push dx |
mov eax,dword[xx1] |
ror eax,16 |
mov ebx,dword[xx2] |
ror ebx,16 |
mov ecx,dword[xx3] |
ror ecx,16 |
lea edi,[screen] |
cmp [catmull_flag],0 |
je @f |
lea esi,[Z_buffer] |
call gouraud_triangle_z |
jmp .end_draw |
@@: |
call gouraud_triangle |
jmp .end_draw |
.flat_draw: |
|
movzx edi,[point_index3] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
movzx eax,word[edi] |
movzx ebx,word[edi+2] |
movzx ecx,word[edi+4] |
movzx edi,[point_index2] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
add ax,word[edi] |
add bx,word[edi+2] |
add cx,word[edi+4] |
movzx edi,[point_index1] |
lea edi,[edi*3] |
lea edi,[points_color+edi*2] |
add ax,word[edi] |
add bx,word[edi+2] |
add cx,word[edi+4] |
cwd |
idiv [i3] |
mov di,ax |
shl edi,16 |
mov ax,bx |
cwd |
idiv [i3] |
mov di,ax |
shl di,8 |
mov ax,cx |
cwd |
idiv [i3] |
mov edx,edi |
mov dl,al |
and edx,0x00ffffff |
|
|
; mov ax,[zz1] ; z position depend draw |
; add ax,[zz2] |
; add ax,[zz3] |
; cwd |
; idiv [i3] ; = -((a+b+c)/3+130) |
; add ax,130 |
; neg al |
; xor edx,edx |
; mov ah,al ;set color according to z position |
; shl eax,8 |
; mov edx,eax |
|
mov eax,dword[xx1] |
ror eax,16 |
mov ebx,dword[xx2] |
ror ebx,16 |
mov ecx,dword[xx3] |
ror ecx,16 |
; mov edi,screen |
lea edi,[screen] |
cmp [catmull_flag],0 |
je @f |
lea esi,[Z_buffer] |
push word[zz3] |
push word[zz2] |
push word[zz1] |
call flat_triangle_z |
jmp .end_draw |
@@: |
call draw_triangle |
jmp .end_draw |
.env_mapping: |
; fninit |
mov esi,point_index1 |
sub esp,12 |
mov edi,esp |
mov ecx,3 |
@@: |
movzx eax,word[esi] |
lea eax,[eax*3] |
shl eax,2 |
add eax,point_normals_rotated |
; texture x=(rotated point normal -> x * 255)+255 |
fld dword[eax] |
fimul [correct_tex] |
fiadd [correct_tex] |
fistp word[edi] |
; texture y=(rotated point normal -> y * 255)+255 |
fld dword[eax+4] |
fimul [correct_tex] |
fiadd [correct_tex] |
fistp word[edi+2] |
|
add edi,4 |
add esi,2 |
loop @b |
|
mov eax,dword[xx1] |
ror eax,16 |
mov ebx,dword[xx2] |
ror ebx,16 |
mov ecx,dword[xx3] |
ror ecx,16 |
mov edi,screen |
mov esi,envmap |
call tex_triangle |
|
.end_draw: |
pop esi |
add esi,6 |
cmp dword[esi],-1 |
jne .again_dts |
ret |
translate_points: |
; fninit |
; mov ebx,points_rotated |
; again_trans: |
; fild word[ebx+4] ;z1 |
; fmul [sq] |
; fld st |
; fiadd word[ebx] ;x1 |
; fistp word[ebx] |
; fchs |
; fiadd word[ebx+2] ;y1 |
; fistp word[ebx+2] ;y1 |
|
; add ebx,6 |
; cmp dword[ebx],-1 |
; jne again_trans |
;ret |
translate_perspective_points: ;translate points from 3d to 2d using |
fninit ;perspective equations |
mov ebx,points_rotated |
.again_trans: |
fild word[ebx] |
fisub [xobs] |
fimul [zobs] |
fild word[ebx+4] |
fisub [zobs] |
fdivp |
fiadd [xobs] |
fistp word[ebx] |
fild word[ebx+2] |
fisub [yobs] |
fimul [zobs] |
fild word[ebx+4] |
fisub [zobs] |
fdivp |
fchs |
fiadd [yobs] |
fistp word[ebx+2] |
add ebx,6 |
cmp dword[ebx],-1 |
jne .again_trans |
ret |
|
|
copy_points: |
mov esi,points |
mov edi,points_rotated |
mov ecx,points_count*3+2 |
rep movsw |
ret |
|
|
|
read_from_file: |
mov edi,triangles |
xor ebx,ebx |
xor ebp,ebp |
mov esi,SourceFile |
cmp [esi],word 4D4Dh |
jne .exit ;Must be legal .3DS file |
cmp dword[esi+2],EndFile-SourceFile |
jne .exit ;This must tell the length |
add esi,6 |
@@: |
cmp [esi],word 3D3Dh |
je @f |
add esi,[esi+2] |
jmp @b |
@@: |
add esi,6 |
.find4k: |
cmp [esi],word 4000h |
je @f |
add esi,[esi+2] |
cmp esi,EndFile |
jc .find4k |
jmp .exit |
@@: |
add esi,6 |
@@: |
cmp [esi],byte 0 |
je @f |
inc esi |
jmp @b |
@@: |
inc esi |
@@: |
cmp [esi],word 4100h |
je @f |
add esi,[esi+2] |
jmp @b |
@@: |
add esi,6 |
@@: |
cmp [esi],word 4110h |
je @f |
add esi,[esi+2] |
jmp @b |
@@: |
movzx ecx,word[esi+6] |
mov [points_count_var],cx |
mov edx,ecx |
add esi,8 |
@@: |
fld dword[esi+4] |
fmul [sscale] |
fadd [xoffset] |
fld dword[esi+8] |
fchs |
fmul [sscale] |
fadd [yoffset] |
fld dword[esi+0] |
fchs |
fmul [sscale] |
fistp word[points+ebx+4] |
fistp word[points+ebx+2] |
fistp word[points+ebx+0] |
add ebx,6 |
add esi,12 |
dec ecx |
jnz @b |
@@: |
mov dword[points+ebx],-1 |
@@: |
cmp [esi],word 4120h |
je @f |
add esi,[esi+2] |
jmp @b |
@@: |
movzx ecx,word[esi+6] |
mov [triangles_count_var],cx |
add esi,8 |
;mov edi,triangles |
@@: |
movsd |
movsw |
add word[edi-6],bp |
add word[edi-4],bp |
add word[edi-2],bp |
add esi,2 |
dec ecx |
jnz @b |
add ebp,edx |
jmp .find4k |
|
.exit: |
mov dword[edi],-1 |
ret |
|
|
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
draw_window: |
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
int 0x40 |
|
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,100*65536+SIZE_X+80 ; [x start] *65536 + [x size] |
mov ecx,100*65536+SIZE_Y+30 ; [y start] *65536 + [y size] |
mov edx,0x02000000 ; color of work area RRGGBB,8->color gl |
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl |
mov edi,0x005080d0 ; color of frames RRGGBB |
int 0x40 |
|
; WINDOW LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,8*65536+8 ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelt ; pointer to text beginning |
mov esi,labellen-labelt ; text length |
int 0x40 |
|
; CLOSE BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+80-19)*65536+12 ; [x start] *65536 + [x size] |
mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
mov edx,1 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
|
; ROTARY BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,25*65536+12 ; [y start] *65536 + [y size] |
mov edx,2 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; ROTARY LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+28 ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelrot ; pointer to text beginning |
mov esi,labelrotend-labelrot ; text length |
int 0x40 |
|
; DRAW MODE BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,(25+15)*65536+12 ; [y start] *65536 + [y size] |
mov edx,3 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; DRAW MODE LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+28+15 ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labeldrmod ; pointer to text beginning |
mov esi,labeldrmodend-labeldrmod ; text length |
int 0x40 |
|
; SPEED BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,(25+15*2)*65536+12 ; [y start] *65536 + [y size] |
mov edx,4 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; SPEED MODE LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*2) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelspeedmod ; pointer to text beginning |
mov esi,labelspeedmodend-labelspeedmod ; text length |
int 0x40 |
|
; SCALE- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,(25+15*3)*65536+12 ; [y start] *65536 + [y size] |
mov edx,5 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; SCALE- MODE LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*3) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzoomout ; pointer to text beginning |
mov esi,labelzoomoutend-labelzoomout ; text length |
int 0x40 |
|
; SCALE+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,(25+15*4)*65536+12 ; [y start] *65536 + [y size] |
mov edx,6 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; SCALE+ MODE LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*4) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzoomin ; pointer to text beginning |
mov esi,labelzoominend-labelzoomin ; text length |
int 0x40 |
; ADD VECTOR LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*5) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelvector ; pointer to text beginning |
mov esi,labelvectorend-labelvector ; text length |
int 0x40 |
; VECTOR Y- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] |
mov ecx,(25+15*6)*65536+12 ; [y start] *65536 + [y size] |
mov edx,7 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR Y- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+20)*65536+(28+15*6) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelyminus ; pointer to text beginning |
mov esi,labelyminusend-labelyminus ; text length |
int 0x40 |
; VECTOR Z+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*6)*65536+12 ; [y start] *65536 + [y size] |
mov edx,8 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR Z+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+41)*65536+(28+15*6) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzplus ; pointer to text beginning |
mov esi,labelzplusend-labelzplus ; text length |
int 0x40 |
; VECTOR x- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*7)*65536+12 ; [y start] *65536 + [y size] |
mov edx,9 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR x- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*7) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelxminus ; pointer to text beginning |
mov esi,labelxminusend-labelxminus ; text length |
int 0x40 |
; VECTOR x+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*7)*65536+12 ; [y start] *65536 + [y size] |
mov edx,10 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR x+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+41)*65536+(28+15*7) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelxplus ; pointer to text beginning |
mov esi,labelxplusend-labelxplus ; text length |
int 0x40 |
; VECTOR z- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*8)*65536+12 ; [y start] *65536 + [y size] |
mov edx,11 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR z- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*8) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzminus ; pointer to text beginning |
mov esi,labelzminusend-labelzminus ; text length |
int 0x40 |
;VECTOR Y+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] |
mov ecx,(25+15*8)*65536+12 ; [y start] *65536 + [y size] |
mov edx,12 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;VECTOR Y+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+20)*65536+(28+15*8) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelyplus ; pointer to text beginning |
mov esi,labelyplusend-labelyplus ; text length |
int 0x40 |
; LEAD COLOR LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*9) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelmaincolor ; pointer to text beginning |
mov esi,labelmaincolorend-labelmaincolor ; text length |
int 0x40 |
|
;RED+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] |
mov edx,13 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;RED+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*10) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelredplus ; pointer to text beginning |
mov esi,labelredplusend-labelredplus ; text length |
int 0x40 |
;GREEN+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] |
mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] |
mov edx,14 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;GREEN+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+20)*65536+(28+15*10) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelgreenplus ; pointer to text beginning |
mov esi,labelgreenplusend-labelgreenplus ; text length |
int 0x40 |
;BLUE+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] |
mov edx,15 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;BLUE+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+41)*65536+(28+15*10) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelblueplus ; pointer to text beginning |
mov esi,labelblueplusend-labelblueplus ; text length |
int 0x40 |
;RED- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] |
mov edx,16 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;RED- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*11) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelredminus ; pointer to text beginning |
mov esi,labelredminusend-labelredminus ; text length |
int 0x40 |
;GREEN- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] |
mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] |
mov edx,17 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;GREEN- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+20)*65536+(28+15*11) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelgreenminus ; pointer to text beginning |
mov esi,labelgreenminusend-labelgreenminus ; text length |
int 0x40 |
;BLUE- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] |
mov edx,18 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
;BLUE- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12+41)*65536+(28+15*11) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelblueminus ; pointer to text beginning |
mov esi,labelblueminusend-labelblueminus ; text length |
int 0x40 |
; Catmull LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*12) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelcatmullmod ; pointer to text beginning |
mov esi,labelcatmullmodend-labelcatmullmod ; text length |
int 0x40 |
; on/off BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov ecx,(25+15*13)*65536+12 ; [y start] *65536 + [y size] |
mov edx,19 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; on/off LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(28+15*13) ; [x start] *65536 + [y start] |
mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelonoff ; pointer to text beginning |
mov esi,labelonoffend-labelonoff ; text length |
int 0x40 |
|
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
|
ret |
|
|
; DATA AREA |
i3 dw 3 |
light_vector dd 0.0,0.0,-1.0 |
; debug_vector dd 0.0,2.0,2.0 ;--debug |
; debug_vector1 dd 0.0,0.0,0.0 |
; debug_points dw 1,1,1,3,4,20 |
; debug_dd dw ? |
; debug_dwd dd 65535 |
; debug_counter dw 0 |
dot_max dd 1.0 |
dot_min dd 0.0 |
env_const dd 1.2 |
correct_tex dw 255 |
max_color_r dw 255 |
max_color_g dw 25 |
max_color_b dw 35 |
xobs dw SIZE_X / 2 ;200 ;observer |
yobs dw SIZE_Y / 2 ;200 ;coordinates |
zobs dw -500 |
|
|
angle_counter dw 0 |
piD180 dd 0.017453292519943295769236907684886 |
; sq dd 0.70710678118654752440084436210485 |
const6 dw 6,6,6,6 |
xo dw 130;87 |
zo dw 0 |
yo dw 100 |
xoffset dd 130.0 |
yoffset dd 150.0 |
sscale dd 6.0 ; real scale |
vect_x dw 0 |
vect_y dw 0 |
vect_z dw 0 |
|
|
r_flag db 0 |
dr_flag db 2 |
speed_flag db 0 |
catmull_flag db 0 |
SourceFile file '../../3DS/HRT.3DS' |
EndFile: |
labelrot: |
db 'rot. mode' |
labelrotend: |
labeldrmod: |
db 'shd. mode' |
labeldrmodend: |
labelspeedmod: |
db 'spd. mode' |
labelspeedmodend: |
labelzoomout: |
db 'zoom out' |
labelzoomoutend: |
labelzoomin: |
db 'zoom in' |
labelzoominend: |
labelvector: |
db 'add vector' |
labelvectorend: |
labelyminus: |
db 'y -' |
labelyminusend: |
labelzplus: |
db 'z +' |
labelzplusend: |
labelxminus: |
db 'x -' |
labelxminusend: |
labelxplus: |
db 'x +' |
labelxplusend: |
labelzminus: |
db 'z -' |
labelzminusend: |
labelyplus: |
db 'y +' |
labelyplusend: |
labelmaincolor: |
db 'main color' |
labelmaincolorend: |
labelredplus: |
db 'r +' |
labelredplusend: |
labelgreenplus: |
db 'g +' |
labelgreenplusend: |
labelblueplus: |
db 'b +' |
labelblueplusend: |
labelredminus: |
db 'r -' |
labelredminusend: |
labelgreenminus: |
db 'g -' |
labelgreenminusend: |
labelblueminus: |
db 'b -' |
labelblueminusend: |
labelcatmullmod: |
db 'catmull' |
labelcatmullmodend: |
labelonoff: |
db 'on/off' |
labelonoffend: |
labelt: |
db 'DEUS CARITAS EST' |
if Ext=MMX |
db ' (MMX)' |
end if |
labellen: |
STRdata db '-1 ' |
align 8 |
@col dd ? |
@y1 dw ? |
@x1 dw ?;+8 |
@y2 dw ? |
@x2 dw ? |
@y3 dw ? |
@x3 dw ?;+16 |
|
@dx12 dd ? |
@dx13 dd ?;+24 |
@dx23 dd ? |
|
sinbeta dd ?;+32 |
cosbeta dd ? |
|
xsub dw ? |
zsub dw ?;+40 |
ysub dw ? |
|
xx1 dw ? |
yy1 dw ? |
zz1 dw ?;+48 |
xx2 dw ? |
yy2 dw ? |
zz2 dw ? |
xx3 dw ?;+56 |
yy3 dw ? |
zz3 dw ? |
scale dd ? ; help scale variable |
;screen dd ? ;pointer to screen buffer |
triangles_count_var dw ? |
points_count_var dw ? |
|
|
point_index1 dw ? ;-\ |
point_index2 dw ? ; } don't change order |
point_index3 dw ? ;-/ |
temp_col dw ? |
high dd ? |
align 8 |
buffer dq ? |
|
err dd ? |
drr dd ? |
xx dd ? |
yy dd ? |
xst dd ? |
yst dd ? |
align 16 |
points: |
rw (EndFile-SourceFile)/12*3 |
points_count = ($-points)/6 |
triangles: |
rw (EndFile-SourceFile)/12*3 |
triangles_count = ($-triangles)/6 |
|
align 16 |
points_rotated rw points_count*3 + 2 |
align 16 |
label trizdd dword |
label trizdq qword |
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position |
align 16 |
triangles_normals rb triangles_count * 12 ; |
point_normals rb points_count * 12 ;one 3dvector - triple float dword x,y,z |
align 16 |
point_normals_rotated rb points_count * 12 |
align 16 |
vectors rb 24 |
points_color rb 6*points_count ; each color as word |
; sorted_triangles rw triangles_count*3 + 2 |
;align 16 |
screen rb SIZE_X * SIZE_Y * 3 ; screen buffer |
Z_buffer rb SIZE_X * SIZE_Y * 4 |
envmap rb 512*512*3 |
memStack rb 1000 ;memory area for stack |
I_END: |