Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 625 → Rev 661

/programs/demos/3DS/3DMATH.ASM
0,0 → 1,109
x3d equ 0
y3d equ 2
z3d equ 4
vec_x equ 0
vec_y equ 4
vec_z equ 8
; 3d point - triple integer word coordinate
; vector - triple float dword coordinate
;----------------------in: --------------------------------
;------------------------ esi - pointer to 1st 3d point ---
;------------------------ edi - pointer to 2nd 3d point ---
;------------------------ ebx - pointer to result vector --
;---------------------- out : none ------------------------
make_vector:
fninit
fild word[edi+x3d] ;edi+x3d
fisub word[esi+x3d] ;esi+x3d
fstp dword[ebx+vec_x]
 
fild word[edi+y3d]
fisub word[esi+y3d]
fstp dword[ebx+vec_y]
 
fild word[edi+z3d]
fisub word[esi+z3d]
fstp dword[ebx+vec_z]
 
ret
;---------------------- in: -------------------------------
;--------------------------- esi - pointer to 1st vector --
;--------------------------- edi - pointer to 2nd vector --
;--------------------------- ebx - pointer to result vector
;---------------------- out : none
cross_product:
fninit
fld dword [esi+vec_y]
fmul dword [edi+vec_z]
fld dword [esi+vec_z]
fmul dword [edi+vec_y]
fsubp ;st1 ,st
fstp dword [ebx+vec_x]
 
fld dword [esi+vec_z]
fmul dword [edi+vec_x]
fld dword [esi+vec_x]
fmul dword [edi+vec_z]
fsubp ;st1 ,st
fstp dword [ebx+vec_y]
 
fld dword [esi+vec_x]
fmul dword [edi+vec_y]
fld dword [esi+vec_y]
fmul dword [edi+vec_x]
fsubp ;st1 ,st
fstp dword [ebx+vec_z]
ret
;----------------------- in: ------------------------------
;---------------------------- edi - pointer to vector -----
;----------------------- out : none
normalize_vector:
fninit
fld dword [edi+vec_x]
fmul st, st
fld dword [edi+vec_y]
fmul st, st
fld dword [edi+vec_z]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
 
ftst
fstsw ax
sahf
jnz @f
 
fst dword [edi+vec_x]
fst dword [edi+vec_y]
fstp dword [edi+vec_z]
ret
@@:
fld st
fld st
fdivr dword [edi+vec_x]
fstp dword [edi+vec_x]
fdivr dword [edi+vec_y]
fstp dword [edi+vec_y]
fdivr dword [edi+vec_z]
fstp dword [edi+vec_z]
ret
;------------------in: -------------------------
;------------------ esi - pointer to 1st vector
;------------------ edi - pointer to 2nd vector
;------------------out: ------------------------
;------------------ st0 - dot-product
dot_product:
fninit
fld dword [esi+vec_x]
fmul dword [edi+vec_x]
fld dword [esi+vec_y]
fmul dword [edi+vec_y]
fld dword [esi+vec_z]
fmul dword [edi+vec_z]
faddp
faddp
ret
 
 
 
/programs/demos/3DS/3DSHEART.ASM
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 "tex3.asm"
include "flat_cat.asm"
include "grd_cat.asm"
include "3dmath.asm"
include "grd3.asm"
include "flat3.asm"
 
 
;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,0x04000000 ; 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 '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:
/programs/demos/3DS/3DSTPOT.ASM
0,0 → 1,1991
;
; application : Cruce - 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)
 
; Now the program uses window style Y=4 - 19.10.2007, by Ataualpa
 
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 "tex3.asm"
include "flat_cat.asm"
include "grd_cat.asm"
include "3dmath.asm"
include "grd3.asm"
include "flat3.asm"
 
 
;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,0x04000000 ; 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
 
; 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 33
max_color_g dw 255
max_color_b dw 110
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 2.0 ; real scale
vect_x dw 0
vect_y dw 0
vect_z dw 0
 
 
r_flag db 0
dr_flag db 0
speed_flag db 0
catmull_flag db 0
SourceFile file 'teapot.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 'AVE CRUCE SALUS MEA'
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:
/programs/demos/3DS/3dspiral.asm
0,0 → 1,440
;
; application : 3d shaking waved spiral
; compilator : fasm
; system : MenuetOS
; author : macgub
; email : macgub3@wp
 
timeout equ 3
maxx equ 600 ; window size
maxy equ 420
use32
 
org 0x0
 
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x100000 ; memory for app
dd 0xbffff ; 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_buf
mov ecx,maxx*maxy*3/4
xor eax,eax
cld
rep stosd
 
 
call calc_deg
mov [z],0
mov [sin_counter],0
finit
oopz:
mov [x],0
push [z]
call calc_sin_variable
oop:
push [x]
; call getcol ;(x,z)
call fun ; calculates y and y1
; call rotateY
mov eax,[sin_variable]
add eax,[vector_x] ; vector_x
add [x],eax
mov eax,[vector_y]
add [y],eax ; vector_y
add [y1],eax
call point_perspective
call draw_point_3d
pop [x]
inc [x]
mov eax,[x]
cmp eax,[loop_counter]
jne oop
inc [sin_counter]
pop [z]
inc [z]
cmp [z],200
jne oopz
 
mov eax,7
mov ebx,screen_buf
mov ecx,maxx*65536+maxy
mov edx,20*65536+20
int 0x40
 
call set_elipse_dim
call set_vectors
 
jmp still
;-----------------++++++PROCEDURES
getcol:
mov eax,[x_resolution]
mul [z]
add eax,[x]
mov ebx,eax
mov eax,35
int 0x40
mov [col],eax
ret
 
set_vectors:
cmp [vector_x],55
jne vec1
mov [vector_dir_x],1
vec1:
cmp [vector_x],250
jne vec2
mov [vector_dir_x],0
vec2:
cmp [vector_dir_x],1
jne vec3
inc [vector_x]
jmp end_x
vec3:
dec [vector_x]
end_x:
cmp [vector_y],195
jne vec4
mov [vector_dir_y],1
vec4:
cmp [vector_y],205
jne vec5
mov [vector_dir_y],0
vec5:
cmp [vector_dir_y],1
jne vec6
inc [vector_y]
ret
vec6:
dec [vector_y]
ret
set_elipse_dim:
cmp [b],60
jne go11
mov [elipse_dir],0
go11:
cmp [b],10
jne go12
mov [elipse_dir],1
go12:
cmp [elipse_dir],1
jne go13
inc [b]
dec [a]
mov eax,[a]
mov [xo],eax
shl eax,1
inc eax
mov [loop_counter],eax
ret
go13:
dec [b]
inc [a]
mov eax,[a]
mov [xo],eax
shl eax,1
inc eax
mov [loop_counter],eax
ret
 
calc_deg:
cmp [deg_counter], 360
jne go_deg
mov [deg_counter],0
go_deg:
fldpi
fidiv [deg_div]
fimul [deg_counter]
fstp [current_deg]
; fsincos
; fstp [cosbeta]
; fstp [sinbeta]
inc [deg_counter]
ret
 
;rotateY:
; mov eax,[z]
; sub eax,[zoo]
; mov [subz],eax
; mov eax,[x]
; sub eax,[xoo]
; mov [subx],eax
;
; fld [sinbeta]
; fimul [subz]
; fchs
; fld [cosbeta]
; fimul[subx]
; faddp
; fiadd [xoo]
; fistp [x]
 
; fld [sinbeta]
; fimul [subx]
; fld [cosbeta]
; fimul [subz]
; faddp
; fiadd [zoo]
; fistp [z]
; finit
 
; ret
 
point_perspective:
mov eax,[x]
sub eax,[xobs]
mov [xobssub],eax
mov eax,[z]
sub eax,[zobs]
mov [zobssub],eax
 
mov eax,[y]
sub eax,[yobs]
mov [yobssub],eax
mov eax,[y1]
sub eax,[yobs]
mov [y1obssub],eax
 
finit
fild [xobssub]
fidiv [zobssub]
fimul [zobs]
fchs
fiadd [xobs]
fistp [x]
fild [yobssub]
fidiv [zobssub]
fimul [zobs]
fchs
fiadd [yobs]
fistp [y]
 
; mov eax,[xobssub]
; idiv [zobssub]
;; mov eax,edx
; imul [zobs]
; neg eax
; add eax,[xobs]
; mov [x],eax
; mov eax,[yobssub]
; idiv [zobssub]
;; mov eax,edx
; imul [zobs]
; neg eax
; add eax,[yobs]
; mov [y],eax
 
fild [y1obssub]
fidiv [zobssub]
fimul [zobs]
fchs
fiadd [yobs]
fistp [y1]
ret
calc_sin_variable:
;calculate sinus variable
fldpi
fidiv [sin_gran]
fimul [sin_counter]
fadd [current_deg]
fsin
fimul [sin_mul]
fistp [sin_variable]
ret
 
fun:
; finit
fild [x]
fisub [xo]
; fchs
; faddp
fild [a]
fdivp st1,st
fmul st,st0
fchs
fld1
faddp
fsqrt
fimul [b]
fld st
fchs
fiadd [yo]
fistp [y]
fiadd [yo]
fistp [y1]
ret
draw_point_3d:
mov eax,[z]
imul [sq]
shr eax,10
mov ebx,eax
neg eax
push eax
add eax,[y]
mov [y],eax
pop eax
add eax,[y1]
mov [y1],eax
mov eax,ebx
add eax,[x]
mov [x],eax
;mov eax,1
;mov ebx,[x]
;mov ecx,[y]
;mov edx,[col]
;int 0x40
;mov ecx,[y1]
;int 0x40
mov eax,maxx
mul [y]
add eax,[x]
mov ebx,eax
shl ebx,1
add eax,ebx
add eax,screen_buf
mov ebx,[col]
or [eax],ebx
mov eax,maxx
mul [y1]
add eax,[x]
mov ebx,eax
shl ebx,1
add eax,ebx
add eax,screen_buf
mov ebx,[col]
or [eax],ebx
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+maxx+25 ; [x start] *65536 + [x size]
mov ecx,100*65536+maxy+25 ; [y start] *65536 + [y size]
mov edx,0x04000000 ; 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,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
x_resolution dd 800
vector_x dd 200
vector_y dd 200
vector_dir_x db 1
vector_dir_y db 1
elipse_dir db 1
 
deg_counter dd ? ; rotation variables
deg_div dd 20
current_deg dd ?
;cosbeta dd ?
;sinbeta dd ?
;zoo dd 100 ; rotation axle
;xoo dd 40
;yoo dd 20
;subx dd ?
;suby dd ?
;subz dd ?
 
xobs dd maxx/2 ; 320 observer variables
yobs dd maxy/2 ; 175
zobs dd -200
xobssub dd ?
yobssub dd ?
y1obssub dd ?
zobssub dd ?
 
sin_variable dd ?
sin_mul dd 60
sin_gran dd 30
sin_counter dd 0
sq dd 724 ; round( (sqrt2)/2*1024 )
z dd ?
x dd ?
y dd ?
y1 dd ?
xo dd 70 ; center point , (loop counter-1)/2
yo dd 20
a dd 70 ; vertical half-axle
b dd 20 ; horizontal half-axle
loop_counter dd 141 ; axle granularity
col dd 0x00ffffff
 
labelt:
db ' 3D SHAKING WAVED SPIRAL'
labellen:
screen_buf:
 
I_END:
 
 
 
 
/programs/demos/3DS/FLAT3.ASM
0,0 → 1,188
draw_triangle:
;----------in - eax - x1 shl 16 + y1
;------------- -ebx - x2 shl 16 + y2
;---------------ecx - x3 shl 16 + y3
;---------------edx - color 0x00rrggbb
;---------------edi - pointer to screen buffer
@ch3:
cmp ax,bx
jg @ch1
@ch4: ; sort parameters
cmp bx,cx
jg @ch2
jle @chEnd
@ch1:
xchg eax,ebx
jmp @ch4
@ch2:
xchg ebx,ecx
jmp @ch3
@chEnd:
mov dword[@y1],eax ; ....and store to user friendly variables
mov dword[@y2],ebx
mov dword[@y3],ecx
mov [@col],edx
mov edx,eax ; eax,ebx,ecx are ORd together into edx which means that
or edx,ebx ; if any *one* of them is negative a sign flag is raised
or edx,ecx
test edx,80008000h ; Check both X&Y at once
jne @end_triangle
 
cmp [@x1],SIZE_X ; {
jg @end_triangle
cmp [@x2],SIZE_X ; This can be optimized with effort
jg @end_triangle
cmp [@x3],SIZE_X
jg @end_triangle ; }
 
shr eax,16
shr ebx,16
shr ecx,16
 
neg ax ; calculate delta 12
add ax,bx
cwde
shl eax,ROUND
cdq
mov bx,[@y2]
mov cx,[@y1]
sub bx,cx
;cmp ebx,0
jne @noZero1
mov [@dx12],0
jmp @yesZero1
@noZero1:
idiv ebx
mov [@dx12],eax
@yesZero1:
 
mov ax,[@x3] ; calculate delta 13
sub ax,[@x1]
cwde
shl eax,ROUND
cdq
mov bx,[@y3]
mov cx,[@y1]
sub bx,cx
;cmp ebx,0
jne @noZero2
mov [@dx13],0
jmp @yesZero2
@noZero2:
idiv ebx
mov [@dx13],eax
@yesZero2:
 
mov ax,[@x3] ; calculate delta 23 [dx23]
sub ax,[@x2]
cwde
shl eax,ROUND
cdq
mov bx,[@y3]
mov cx,[@y2]
sub bx,cx
;cmp ebx,0
jne @noZero3
mov [@dx23],0
jmp @yesZero3
@noZero3:
idiv ebx
mov [@dx23],eax
@yesZero3:
 
movzx eax,word[@x1] ; eax - xk1
shl eax,ROUND
mov ebx,eax ; ebx - xk2
movzx esi,word[@y1] ; esi - y
@next_line1:
mov ecx,eax ; ecx - x11
sar ecx,ROUND
mov edx,ebx ; edx - x12
sar edx,ROUND
cmp ecx,edx
jle @nochg
xchg ecx,edx
@nochg:
pusha
mov ebx,ecx
sub edx,ecx
mov ecx,edx
mov edx,esi
mov eax,[@col]
call @horizontal_line
popa
add eax,[@dx13]
add ebx,[@dx12]
inc esi
cmp si,[@y2]
jl @next_line1
 
movzx esi,word[@y2]
movzx ebx,word[@x2]
shl ebx,ROUND
@next_line2:
mov ecx,eax
sar ecx,ROUND
mov edx,ebx
sar edx,ROUND
cmp ecx,edx
jle @nochg1
xchg ecx,edx
@nochg1:
pusha
mov ebx,ecx
sub edx,ecx
mov ecx,edx
mov edx,esi
mov eax,[@col]
call @horizontal_line
popa
add eax,[@dx13]
add ebx,[@dx23]
inc esi
cmp si,[@y3]
jl @next_line2
@end_triangle:
ret
 
@horizontal_line:
;---------in
;---------eax - color of line, 0x00RRGGBB
;---------ebx - x1 - x position of line begin
;---------ecx - lenght of line
;---------edx - y position of line
;---------edi - pointer to buffer
jcxz @end_hor_l
; or edx,edx
; jl @end_hor_l
cmp edx,SIZE_Y
jg @end_hor_l
push eax
mov eax,SIZE_X*3
mul edx
add edi,eax ; calculate line begin adress
;add edi,ebx
;shl ebx,1
lea edi,[edi+ebx*2]
add edi,ebx
pop eax
cld
;mov dword[edi-3],0000FF00h
@ddraw: ; Drawing horizontally:
;push eax
stosd ; 4 bytes at a time
dec edi ; point to the 4th
;shr eax,16
;stosb
;pop eax
;pusha ; If you want to draw pixel-by-pixel
; mov eax,7 ; put image
; mov ebx,screen
; mov ecx,SIZE_X shl 16 + SIZE_Y
; mov edx,5 shl 16 + 20
; int 0x40
;popa
loop @ddraw
mov byte[edi],0 ; The last 4th will be reset
@end_hor_l:
ret
/programs/demos/3DS/FLATWAV.ASM
0,0 → 1,762
;
; application : Flag - Polonia in Tertio Millenium - wavy shading rotary area
; compiler : FASM
; system : MenuetOS
; author : macgub
; email : macgub3@wp.pl
; web : www.menuet.xt.pl
; Fell free to use this intro in your own distribution of MenuetOS.
SIZE_X equ 220
SIZE_Y equ 260
TIMEOUT equ 1
ROUND equ 12
points_count equ 50
triangles_count equ 54
 
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
; call generate_map
 
still:
 
mov eax,23 ; wait here for event with timeout
mov ebx,TIMEOUT
cmp [speed_flag],0xff
jne speed_skip
mov eax,11
speed_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 shad_button
mov eax,-1 ; close this program
int 0x40
shad_button:
cmp ah,2
jne speed_button
not [shad_flag] ; set shadow / flag mode
speed_button:
cmp ah,3
jne noclose
not [speed_flag]
noclose:
 
call calculate_angle ; calculates sinus and cosinus
call generate_map
call copy_points
call rotate_points
call translate_points ; translate from 3d to 2d
call clrscr ; clear the screen
call sort_triangles
call draw_triangles ; draw all triangles from the list
 
mov eax,7 ; put image
mov ebx,screen
mov ecx,SIZE_X shl 16 + SIZE_Y
mov edx,5 shl 16 + 20
int 0x40
 
jmp still
generate_map:
finit
mov edi,points
xor ebx,ebx ;z
again_gen1:
mov eax,70 ;x
again_gen:
mov word[edi],ax
mov word[edi+4],bx
fild word[edi]
fidiv [i20]
fadd [current_angle]
fsin
fimul [i20]
fiadd [i75]
fistp word [edi+2]
; fild word[edi] ;another map generation
; fisub [i100]
; fidiv [i75]
; fmul st,st0
; fild word[edi+4]
; fisub [i50]
; fidiv [i20]
; fmul st,st0
; faddp
; fsqrt
; fadd [current_angle]
; fsin
; fimul [i20]
; fiadd [i75]
; fistp word[edi+2]
 
add ax,10
add edi,6
cmp ax,170
jne again_gen
add bx,20
cmp bx,100
jne again_gen1
mov dword[edi],0xffffffff
ret
i20 dw 20
i50 dw 50
i75 dw 75
i100 dw 100
 
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
xor eax,eax
mov ax,word[esi]
shl eax,1
mov ebx,eax
shl eax,1
add eax,ebx
push ebp
add ebp,eax
xor ecx,ecx
mov cx,word[ebp+4]
pop ebp
 
xor eax,eax
mov ax,word[esi+2]
shl eax,1
mov ebx,eax
shl eax,1
add eax,ebx
push ebp
add ebp,eax
add cx,word[ebp+4]
pop ebp
 
xor eax,eax
mov ax,word[esi+4]
shl eax,1
mov ebx,eax
shl eax,1
add eax,ebx
push ebp
add ebp,eax
add cx,word[ebp+4]
pop ebp
 
mov ax,cx
cwd
idiv [i3]
cld
movsd ; store vertex coordinates
movsw
stosw ; middle vertex coordinate 'z' in triangles_with_z list
cmp dword[esi],0xffffffff
jne make_triangle_with_z
movsd ; copy end mark
 
;macro sort
 
mov [sort_flag],1
next_booble:
mov esi,triangles_with_z ;sort list triangles_with_z booble metod
cmp [sort_flag],0
je end_sort
mov [sort_flag],0
check_and_check:
; cmp dword[esi],0xffffffff
; je next_booble
cmp dword[esi+8],0xffffffff
je next_booble
mov ax,word[esi+6]
cmp ax,word[esi+14]
jge no_chg_pos
mov eax,dword[esi]
mov ebx,dword[esi+4]
xchg eax,dword[esi+8]
xchg ebx,dword[esi+12]
mov dword[esi],eax
mov dword[esi+4],ebx ; sort_flag=1 if change occured
mov [sort_flag],1
no_chg_pos:
add esi,8
jmp check_and_check ;check end mark end if greater
end_sort:
 
; translate triangles_with_z to sorted_triangles
mov esi,triangles_with_z
mov edi,sorted_triangles
again_copy:
movsd
movsw
add esi,2
cmp dword[esi],0xffffffff
jne again_copy
movsd ; copy end mark too
ret
sort_flag db 0
clrscr:
mov edi,screen
mov ecx,SIZE_X*SIZE_Y*3/4
xor eax,eax
cld
rep stosd
ret
calculate_angle:
finit
fldpi
fidiv [i180]
fimul [angle_counter]
fst [current_angle]
fld st
fidiv [i2]
fsincos
fstp [singamma]
fstp [cosgamma]
fsincos
fstp [sinbeta]
fstp [cosbeta]
inc [angle_counter]
cmp [angle_counter],360
jne end_calc_angle
mov [angle_counter],0
end_calc_angle:
ret
i180 dw 90
i2 dw 2
rotate_points:
finit ; y axle rotate
mov ebx,points_rotated
again_r:
mov ax,word[ebx] ;x
sub ax,[xo]
mov [xsub],ax
mov ax,word[ebx+4] ;z
sub ax,[zo]
mov [zsub],ax
fld [sinbeta]
fimul [zsub]
fchs
fld [cosbeta]
fimul [xsub]
faddp
fiadd [xo]
fistp word[ebx] ;x
fld [sinbeta]
fimul [xsub]
;fchs
fld [cosbeta]
fimul [zsub]
faddp
fiadd [zo]
fistp word[ebx+4] ;z
 
mov ax,word[ebx+2] ;y ; z axle rotate
sub ax,[yo]
mov [ysub],ax
mov ax,word[ebx] ;x
sub ax,[xo]
mov [xsub],ax
fld [singamma]
fimul[ysub]
fld [cosgamma]
fimul [xsub]
faddp
fiadd [xo]
fistp word[ebx] ;x
fld [cosgamma]
fimul [ysub]
fld [singamma]
fimul [xsub]
fchs
faddp
fiadd [yo]
fistp word[ebx+2] ;y
 
add ebx,6
cmp dword[ebx],0xffffffff
jne again_r
ret
xsub dw ?
ysub dw ?
zsub dw ?
draw_triangles:
mov [tr_counter],1
mov ebp,points_rotated
; mov esi,triangles
mov esi,sorted_triangles
again_dts:
xor eax,eax
mov ax,word[esi]
shl eax,1
mov [dtpom],eax
shl eax,1
add eax,[dtpom]
push ebp
add ebp,eax
mov ax,word[ebp]
mov [xx1],ax
mov ax,word[ebp+2]
mov [yy1],ax
mov ax,word[ebp+4]
mov [zz1],ax
pop ebp
 
xor eax,eax
mov ax,word[esi+2]
shl eax,1
mov [dtpom],eax
shl eax,1
add eax,[dtpom]
push ebp
add ebp,eax
mov ax,word[ebp]
mov [xx2],ax
mov ax,word[ebp+2]
mov [yy2],ax
mov ax,word[ebp+4]
mov [zz2],ax
pop ebp
 
xor eax,eax
mov ax,word[esi+4]
shl eax,1
mov [dtpom],eax
shl eax,1
add eax,[dtpom]
push ebp
add ebp,eax
mov ax,word[ebp]
mov [xx3],ax
mov ax,word[ebp+2]
mov [yy3],ax
mov ax,word[ebp+4]
mov [zz3],ax
pop ebp
push ebp
push esi
 
macro set_flag
{
mov edx,0x00ffffff
inc [tr_counter]
cmp [tr_counter],triangles_count/2
jl skip_red
set_red:
mov edx,0x00ff0000
skip_red:
}
 
mov ax,[zz1]
add ax,[zz2]
add ax,[zz3]
cwd
idiv [i3]
sub ax,100 ;77
; shl ax,1
neg al
xor edx,edx
mov dh,al ;set color according to z position
mov dl,al
; push dx
; shl edx,8
; pop dx
 
cmp [shad_flag],0
je skip_col
set_flag
skip_col:
mov ax,[xx1]
shl eax,16
mov ax,[yy1]
mov bx,[xx2]
shl ebx,16
mov bx,[yy2]
mov cx,[xx3]
shl ecx,16
mov cx,[yy3]
mov edi,screen
call draw_triangle
pop esi
pop ebp
 
add esi,6
cmp dword[esi],0xffffffff
jne again_dts
ret
i3 dw 3
tr_counter dw 0
dtpom dd ?
xx1 dw ?
yy1 dw ?
zz1 dw ?
xx2 dw ?
yy2 dw ?
zz2 dw ?
xx3 dw ?
yy3 dw ?
zz3 dw ?
translate_points:
finit
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],0xffffffff
jne again_trans
ret
copy_points:
mov esi,points
mov edi,points_rotated
mov ecx,points_count*3+2
cld
rep movsw
ret
 
draw_triangle:
;----------in - eax - x1 shl 16 + y1
;------------- -ebx - x2 shl 16 + y2
;---------------ecx - x3 shl 16 + y3
;---------------edx - color 0x00rrggbb
;---------------edi - pointer to screen buffer
@ch3:
cmp ax,bx
jg @ch1
@ch4: ; sort parameters
cmp bx,cx
jg @ch2
jle @chEnd
@ch1:
xchg eax,ebx
jmp @ch4
@ch2:
xchg ebx,ecx
jmp @ch3
@chEnd:
mov [@y1],ax ; ....and store to user friendly variables
mov [@y2],bx
mov [@y3],cx
shr eax,16
shr ebx,16
shr ecx,16
mov [@x1],ax
mov [@x2],bx
mov [@x3],cx
mov [@col],edx
 
cmp [@y1],0
jl @end_triangle
cmp [@y2],0
jl @end_triangle
cmp [@y3],0
jl @end_triangle
cmp [@x1],0
jl @end_triangle
cmp [@x2],0
jl @end_triangle
cmp [@x3],0
jl @end_triangle
cmp [@y1],SIZE_Y
jg @end_triangle
cmp [@y2],SIZE_Y
jg @end_triangle
cmp [@y3],SIZE_Y
jg @end_triangle
cmp [@x1],SIZE_X
jg @end_triangle
cmp [@x2],SIZE_X
jg @end_triangle
cmp [@x3],SIZE_X
jg @end_triangle
 
neg ax ; calculate delta 12
add ax,bx
cwde
shl eax,ROUND
cdq
mov bx,[@y2]
mov cx,[@y1]
sub ebx,ecx
cmp ebx,0
jne @noZero1
mov [@dx12],0
jmp @yesZero1
@noZero1:
idiv ebx
mov [@dx12],eax
@yesZero1:
 
mov ax,[@x3] ; calculate delta 13
sub ax,[@x1]
cwde
shl eax,ROUND
cdq
xor ebx,ebx
xor ecx,ecx
or bx,[@y3]
or cx,[@y1]
sub ebx,ecx
cmp ebx,0
jne @noZero2
mov [@dx13],0
jmp @yesZero2
@noZero2:
idiv ebx
mov [@dx13],eax
@yesZero2:
 
mov ax,[@x3] ; calculate delta 23 [dx23]
sub ax,[@x2]
cwde
shl eax,ROUND
cdq
xor ebx,ebx
xor ecx,ecx
or bx,[@y3]
or cx,[@y2]
sub ebx,ecx
cmp ebx,0
jne @noZero3
mov [@dx23],0
jmp @yesZero3
@noZero3:
idiv ebx
mov [@dx23],eax
@yesZero3:
 
 
xor eax,eax ;eax - xk1
or ax,[@x1]
shl eax,ROUND
mov ebx,eax ; ebx - xk2
xor esi,esi ; esi - y
or si,[@y1]
@next_line1:
mov ecx,eax ; ecx - x11
sar ecx,ROUND
mov edx,ebx ;edx - x12
sar edx,ROUND
cmp ecx,edx
jle @nochg
xchg ecx,edx
@nochg:
pusha
mov ebx,ecx
sub edx,ecx
mov ecx,edx
mov edx,esi
mov eax,[@col]
call @horizontal_line
popa
add eax,[@dx13]
add ebx,[@dx12]
inc esi
cmp si,[@y2]
jl @next_line1
 
xor esi,esi
or si,[@y2]
xor ebx,ebx
mov bx,[@x2]
shl ebx,ROUND
@next_line2:
mov ecx,eax
sar ecx,ROUND
mov edx,ebx
sar edx,ROUND
cmp ecx,edx
jle @nochg1
xchg ecx,edx
@nochg1:
pusha
mov eax,[@col]
mov ebx,ecx
sub edx,ecx
mov ecx,edx
mov edx,esi
call @horizontal_line
popa
add eax,[@dx13]
add ebx,[@dx23]
inc esi
cmp si,[@y3]
jl @next_line2
@end_triangle:
ret
@col dd ?
@y1 dw ?
@x1 dw ?
@y2 dw ?
@x2 dw ?
@y3 dw ?
@x3 dw ?
@dx12 dd ?
@dx13 dd ?
@dx23 dd ?
 
@horizontal_line:
;---------in
;---------eax - color of line, 0x00RRGGBB
;---------ebx - x1 - x position of line begin
;---------ecx - lenght of line
;---------edx - y position of line
;---------edi - pointer to buffer
jcxz @end_hor_l
push eax
mov eax,SIZE_X*3
mul edx
add edi,eax ; calculate line begin adress
add edi,ebx
shl ebx,1
add edi,ebx
pop eax
cld
@ddraw:
push eax
stosw
shr eax,16
stosb
pop eax
loop @ddraw
@end_hor_l:
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+20 ; [x start] *65536 + [x size]
mov ecx,100*65536+SIZE_Y+30 ; [y start] *65536 + [y size]
mov edx,0x04000000 ; 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
 
; flag color button
mov eax,8 ; function 8 : define and draw button
mov ebx,(SIZE_X-35)*65536+12 ; [x start] *65536 + [x size]
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,2 ; button id
mov esi,0x64504A ; button color RRGGBB
int 0x40
 
; speed button
mov eax,8 ; function 8 : define and draw button
mov ebx,(SIZE_X-53)*65536+12 ; [x start] *65536 + [x size]
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,3 ; button id
mov esi,0x64504A ; button color RRGGBB
int 0x40
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
 
; DATA AREA
angle_counter dw 0
sq dd 0.707
xo dw 110 ;87
zo dw 0
yo dw 125
shad_flag db 0
speed_flag db 0
 
triangles:
dw 0,1,10, 10,11,1, 1,2,11, 11,12,2, 2,3,12, 12,13,3, 3,4,13, 13,14,4, 4,5,14
dw 14,15,5, 5,6,15, 15,16,6, 6,7,16, 16,17,7, 7,8,17, 17,18,8, 8,9,18, 18,19,9
dw 10,11,20, 20,21,11, 11,12,21, 21,22,12, 12,13,22, 22,23,13, 13,14,23
dw 23,24,14, 14,15,24, 24,25,15, 15,16,25, 25,26,16, 16,17,26, 26,27,17
dw 17,18,27, 27,28,18, 18,19,28, 28,29,19, 20,21,30, 30,31,21, 21,22,31
dw 31,32,22, 22,23,32, 32,33,23, 23,24,33, 33,34,24, 24,25,34, 34,35,25
dw 25,26,35, 35,36,26, 26,27,36, 36,37,27, 27,28,37, 37,38,28, 28,29,38
dw 38,39,29
dd 0xffffffff ;<- end marker
 
 
 
labelt:
db '3d wavy rotaring area'
labellen:
sinbeta rd 1
cosbeta rd 1
singamma rd 1
cosgamma rd 1
current_angle rd 1
 
points rw points_count*3 + 2
points_rotated rw points_count*3 + 2
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
sorted_triangles rw triangles_count*3 + 2
screen rb SIZE_X * SIZE_Y * 3 ; screen buffer
memStack rb 1000 ;memory area for stack
I_END:
 
 
 
 
/programs/demos/3DS/FLAT_CAT.ASM
0,0 → 1,342
CATMULL_SHIFT equ 16
fill_Z_buffer:
mov eax,0x70000000
mov edi,Z_buffer
mov ecx,SIZE_X*SIZE_Y
rep stosd
ret
flat_triangle_z:
; procedure drawing triangle with Z cordinate interpolation ------
; (Catmull alghoritm)--------------------------------------------
; ----------------in - eax - x1 shl 16 + y1 ----------------------
; -------------------- ebx - x2 shl 16 + y2 ----------------------
; -------------------- ecx - x3 shl 16 + y3 ----------------------
; -------------------- edx - color 0x00RRGGBB --------------------
; -------------------- esi - pointer to Z-buffer -----------------
; -------------------- edi - pointer to screen buffer-------------
; -------------------- stack : z coordinates
; -------------------- Z-buffer : each z variable as dword
; -------------------- (Z coor. as word) shl CATMULL_SHIFT
.z1 equ word[ebp+4]
.z2 equ word[ebp+6] ; each z coordinate as word integer
.z3 equ word[ebp+8]
 
.col equ dword[ebp-4]
.x1 equ word[ebp-6]
.y1 equ word[ebp-8]
.x2 equ word[ebp-10]
.y2 equ word[ebp-12]
.x3 equ word[ebp-14]
.y3 equ word[ebp-16]
 
.dx12 equ dword[ebp-20]
.dz12 equ dword[ebp-24]
.dx13 equ dword[ebp-28]
.dz13 equ dword[ebp-32]
.dx23 equ dword[ebp-36]
.dz23 equ dword[ebp-40]
.zz1 equ dword[ebp-44]
.zz2 equ dword[ebp-48]
 
mov ebp,esp
push edx ; store edx in variable .col
.sort2:
cmp ax,bx
jle .sort1
xchg eax,ebx
mov dx,.z1
xchg dx,.z2
mov .z1,dx
.sort1:
cmp bx,cx
jle .sort3
xchg ebx,ecx
mov dx,.z2
xchg dx,.z3
mov .z2,dx
jmp .sort2
.sort3:
push eax ; store triangle coordinates in user friendly variables
push ebx
push ecx
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
and edx,ebx ; if *all* of them are negative a sign flag is raised
and edx,ecx
and edx,eax
test edx,80008000h ; Check both X&Y at once
jne .ft_loop2_end
; cmp ax,SIZE_Y
; jle @f
; cmp bx,SIZE_Y
; jle @f
; cmp cx,SIZE_Y
; jge @f
; ror eax,16
; ror ebx,16
; ror ecx,16
; cmp ax,SIZE_X
; jle @f
; cmp bx,SIZE_X
; jle @f
; cmp cx,SIZE_X
; jle @f
; jmp .ft_loop2_end
;@@:
sub esp,32
 
mov bx,.y2 ; calc delta 12
sub bx,.y1
jnz .ft_dx12_make
mov .dx12,0
mov .dz12,0
jmp .ft_dx12_done
.ft_dx12_make:
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx12,eax
 
mov ax,.z2
sub ax,.z1
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
mov .dz12,eax
.ft_dx12_done:
mov bx,.y3 ; calc delta 13
sub bx,.y1
jnz .ft_dx13_make
mov .dx13,0
mov .dz13,0
jmp .ft_dx13_done
.ft_dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx13,eax
 
mov ax,.z3
sub ax,.z1
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
mov .dz13,eax
.ft_dx13_done:
mov bx,.y3 ; calc delta 23
sub bx,.y2
jnz .gt_dx23_make
mov .dx23,0
mov .dz23,0
jmp .gt_dx23_done
.gt_dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx23,eax
 
mov ax,.z3
sub ax,.z2
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
mov .dz23,eax
.gt_dx23_done:
 
movsx edx,.z1
shl edx,CATMULL_SHIFT
mov .zz1,edx
mov .zz2,edx
movsx eax,.x1
shl eax,ROUND ; eax - x1
mov ebx,eax ; ebx - x2
mov cx,.y1
cmp cx,.y2
jge .ft_loop1_end
.ft_loop1:
 
pushad
 
push .col
push cx ; y
sar ebx,ROUND
push bx ; x2
sar eax,ROUND
push ax ; x1
push .zz2 ; z2 shl CATMULL_SHIFT
push .zz1 ; z1 shl CATMULL_SHIFT
call flat_line_z
 
popad
 
add eax,.dx13
add ebx,.dx12
mov edx,.dz13
add .zz1,edx
mov edx,.dz12
add .zz2,edx
inc cx
cmp cx,.y2
jl .ft_loop1
.ft_loop1_end:
 
movsx edx,.z2
shl edx,CATMULL_SHIFT
mov .zz2,edx
movsx ebx,.x2
shl ebx,ROUND
mov cx,.y2
cmp cx,.y3
jge .ft_loop2_end
.ft_loop2:
pushad
 
push .col
push cx
sar ebx,ROUND
push bx
sar eax,ROUND
push ax ; x1
push .zz2 ; z2 shl CATMULL_SHIFT
push .zz1 ; z1 shl CATMULL_SHIFT
call flat_line_z
 
popad
 
add eax,.dx13
add ebx,.dx23
mov edx,.dz13
add .zz1,edx
mov edx,.dz23
add .zz2,edx
inc cx
cmp cx,.y3
jl .ft_loop2
.ft_loop2_end:
 
mov esp,ebp
ret 6
 
flat_line_z:
;----------------
;-------------in edi - pointer to screen buffer ----------------------------------
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
.z1 equ dword [ebp+4]
.z2 equ dword [ebp+8]
.x1 equ word [ebp+12]
.x2 equ word [ebp+14]
.y equ word [ebp+16]
.col equ dword [ebp+18]
 
.dz equ dword [ebp-4]
 
mov ebp,esp
;; sub esp,4
mov ax,.y
or ax,ax
jl .fl_quit
cmp ax,SIZE_Y-1
jg .fl_quit
 
; cmp .x1,0
; jge .fl_ok1
; cmp .x2,0
; jl .fl_quit
; .fl_ok1:
; cmp .x1,SIZE_X
; jle .fl_ok2
; cmp .x2,SIZE_X
; jg .fl_quit
; .fl_ok2:
mov ax,.x1
cmp ax,.x2
je .fl_quit
jl .fl_ok
 
xchg ax,.x2
mov .x1,ax
mov edx,.z1
xchg edx,.z2
mov .z1,edx
.fl_ok:
cmp .x1,SIZE_X-1
jg .fl_quit
cmp .x2,0
jle .fl_quit
 
mov eax,.z2
sub eax,.z1
cdq
mov bx,.x2
sub bx,.x1
movsx ebx,bx
idiv ebx
;; mov .dz,eax ; calculated delta - shifted .dz
push eax
 
cmp .x1,0
jge @f
movsx ebx,.x1
neg ebx
imul ebx
add .z1,eax
mov .x1,0
@@:
cmp .x2,SIZE_X
jl @f
mov .x2,SIZE_X
@@:
mov edx,SIZE_X
movsx eax,.y
mul edx ; edi = edi + (SIZE_X * y + x1)*3
movsx edx,.x1
add eax,edx
push eax
lea eax,[eax*3]
add edi,eax ; esi = esi + (SIZE_X * y + x1)*4
pop eax
shl eax,2
add esi,eax
 
mov cx,.x2
sub cx,.x1
movzx ecx,cx
 
mov eax,.col
mov ebx,.z1 ; ebx : curr. z
mov edx,.dz
.ddraw:
;pushad
;show
;popad
cmp ebx,dword[esi]
jge .skip
stosd
dec edi
mov dword[esi],ebx
jmp .no_skip
.skip:
add edi,3
.no_skip:
add esi,4
add ebx,edx
loop .ddraw
 
.fl_quit:
mov esp,ebp
ret 18
/programs/demos/3DS/GRD3.ASM
0,0 → 1,481
gouraud_triangle:
;------------------in - eax - x1 shl 16 + y1 ---------
;---------------------- ebx - x2 shl 16 + y2 ---------
;---------------------- ecx - x3 shl 16 + y3 ---------
;---------------------- edi - pointer to screen buffer
;---------------------- stack : colors----------------
;----------------- procedure don't save registers !!--
.col1r equ ebp+4 ; each color as word
.col1g equ ebp+6
.col1b equ ebp+8
.col2r equ ebp+10
.col2g equ ebp+12
.col2b equ ebp+14
.col3r equ ebp+16
.col3g equ ebp+18
.col3b equ ebp+20
 
.x1 equ word[ebp-2]
.y1 equ word[ebp-4]
.x2 equ word[ebp-6]
.y2 equ word[ebp-8]
.x3 equ word[ebp-10]
.y3 equ word[ebp-12]
 
.dc12r equ dword[ebp-16]
.dc12g equ dword[ebp-20]
.dc12b equ dword[ebp-24]
.dc13r equ dword[ebp-28]
.dc13g equ dword[ebp-32]
.dc13b equ dword[ebp-36]
.dc23r equ dword[ebp-40]
.dc23g equ dword[ebp-44]
.dc23b equ dword[ebp-48]
 
.c1r equ dword[ebp-52]
.c1g equ dword[ebp-56]
.c1b equ dword[ebp-60]
.c2r equ dword[ebp-64]
.c2g equ dword[ebp-68]
.c2b equ dword[ebp-72]
 
.dx12 equ dword[ebp-76]
.dx13 equ dword[ebp-80]
.dx23 equ dword[ebp-84]
 
 
 
mov ebp,esp
; sub esp,72
 
.sort3: ; sort triangle coordinates...
cmp ax,bx
jle .sort1
xchg eax,ebx
mov edx,dword[.col1r]
xchg edx,dword[.col2r]
mov dword[.col1r],edx
mov dx,word[.col1b]
xchg dx,word[.col2b]
mov word[.col1b],dx
.sort1:
cmp bx,cx
jle .sort2
xchg ebx,ecx
mov edx,dword[.col2r]
xchg edx,dword[.col3r]
mov dword[.col2r],edx
mov dx,word[.col2b]
xchg dx,word[.col3b]
mov word[.col2b],dx
jmp .sort3
.sort2:
push eax ;store triangle coordinates in user friendly variables
push ebx
push ecx
sub esp,72 ; set correctly value of esp
 
mov edx,eax ; check only X triangle coordinate
or edx,ebx
or edx,ecx
test edx,80000000h
jne .gt_loop2_end
shr eax,16
cmp ax,SIZE_X-1
jg .gt_loop2_end
shr ebx,16
cmp bx,SIZE_X-1
jg .gt_loop2_end
shr ecx,16
cmp cx,SIZE_X-1
jg .gt_loop2_end
 
 
mov bx,.y2 ; calc deltas
sub bx,.y1
jnz .gt_dx12_make
mov .dx12,0
mov .dc12r,0
mov .dc12g,0
mov .dc12b,0
jmp .gt_dx12_done
.gt_dx12_make:
 
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx12,eax
 
mov ax,word[.col2r]
sub ax,word[.col1r]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc12r,eax
mov ax,word[.col2g]
sub ax,word[.col1g]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc12g,eax
mov ax,word[.col2b]
sub ax,word[.col1b]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc12b,eax
.gt_dx12_done:
 
mov bx,.y3
sub bx,.y1
jnz .gt_dx13_make
mov .dx13,0
mov .dc13r,0
mov .dc13g,0
mov .dc13b,0
jmp .gt_dx13_done
.gt_dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx13,eax
 
mov ax,word[.col3r]
sub ax,word[.col1r]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc13r,eax
mov ax,word[.col3g]
sub ax,word[.col1g]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc13g,eax
mov ax,word[.col3b]
sub ax,word[.col1b]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc13b,eax
.gt_dx13_done:
 
mov bx,.y3
sub bx,.y2
jnz .gt_dx23_make
mov .dx23,0
mov .dc23r,0
mov .dc23g,0
mov .dc23b,0
jmp .gt_dx23_done
.gt_dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
mov .dx23,eax
 
mov ax,word[.col3r]
sub ax,word[.col2r]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc23r,eax
mov ax,word[.col3g]
sub ax,word[.col2g]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc23g,eax
mov ax,word[.col3b]
sub ax,word[.col2b]
cwde
shl eax,ROUND
cdq
idiv ebx
mov .dc23b,eax
.gt_dx23_done:
 
movsx eax,.x1
shl eax,ROUND
mov ebx,eax
movsx edx,word[.col1r]
shl edx,ROUND
mov .c1r,edx
mov .c2r,edx
movsx edx,word[.col1g]
shl edx,ROUND
mov .c1g,edx
mov .c2g,edx
movsx edx,word[.col1b]
shl edx,ROUND
mov .c1b,edx
mov .c2b,edx
mov cx,.y1
cmp cx,.y2
jge .gt_loop1_end
.gt_loop1:
push eax ; eax - cur x1
push ebx ; ebx - cur x2
push cx ; cx - cur y
push edi
push ebp
 
mov edx,.c2r ; c2r,c2g,c2b,c1r,c1g,c1b - current colors
sar edx,ROUND
push dx
mov edx,.c2g
sar edx,ROUND
push dx
mov edx,.c2b
sar edx,ROUND
push dx
mov edx,.c1r
sar edx,ROUND
push dx
mov edx,.c1g
sar edx,ROUND
push dx
mov edx,.c1b
sar edx,ROUND
push dx
push cx
sar ebx,ROUND
push bx
sar eax,ROUND
push ax
call gouraud_line
 
pop ebp
pop edi
pop cx
pop ebx
pop eax
 
mov edx,.dc13r
add .c1r,edx
mov edx,.dc13g
add .c1g,edx
mov edx,.dc13b
add .c1b,edx
mov edx,.dc12r
add .c2r,edx
mov edx,.dc12g
add .c2g,edx
mov edx,.dc12b
add .c2b,edx
 
add eax,.dx13
add ebx,.dx12
inc cx
cmp cx,.y2
jl .gt_loop1
.gt_loop1_end:
 
mov cx,.y2
cmp cx,.y3
jge .gt_loop2_end
movsx ebx,.x2
shl ebx,ROUND
 
movsx edx,word[.col2r]
shl edx,ROUND
mov .c2r,edx
movsx edx,word[.col2g]
shl edx,ROUND
mov .c2g,edx
movsx edx,word[.col2b]
shl edx,ROUND
mov .c2b,edx
.gt_loop2:
push eax ; eax - cur x1
push ebx ; ebx - cur x2
push cx
push edi
push ebp
 
mov edx,.c2r
sar edx,ROUND
push dx
mov edx,.c2g
sar edx,ROUND
push dx
mov edx,.c2b
sar edx,ROUND
push dx
mov edx,.c1r
sar edx,ROUND
push dx
mov edx,.c1g
sar edx,ROUND
push dx
mov edx,.c1b
sar edx,ROUND
push dx
push cx
sar ebx,ROUND
push bx
sar eax,ROUND
push ax
call gouraud_line
 
pop ebp
pop edi
pop cx
pop ebx
pop eax
 
mov edx,.dc13r
add .c1r,edx
mov edx,.dc13g
add .c1g,edx
mov edx,.dc13b
add .c1b,edx
mov edx,.dc23r
add .c2r,edx
mov edx,.dc23g
add .c2g,edx
mov edx,.dc23b
add .c2b,edx
 
add eax,.dx13
add ebx,.dx23
inc cx
cmp cx,.y3
jl .gt_loop2
.gt_loop2_end:
 
; add esp,84
mov esp,ebp
ret 18
gouraud_line:
;-------------in - edi - pointer to screen buffer
;----------------- stack - another parameters
.x1 equ word [ebp+4]
.x2 equ word [ebp+6]
.y equ word [ebp+8]
.col1b equ ebp+10
.col1g equ ebp+12
.col1r equ ebp+14
.col2b equ ebp+16
.col2g equ ebp+18
.col2r equ ebp+20
.dc_r equ dword[ebp-4]
.dc_g equ dword[ebp-8]
.dc_b equ dword[ebp-12]
mov ebp,esp
 
mov ax,.y
or ax,ax
jl .gl_quit
cmp ax,SIZE_Y-1
jg .gl_quit
 
mov ax,.x1
cmp ax,.x2
je .gl_quit
jl .gl_ok
 
xchg ax,.x2
mov .x1,ax
mov eax,dword[.col1b]
xchg eax,dword[.col2b]
mov dword[.col1b],eax
mov ax,word[.col1r]
xchg ax,word[.col2r]
mov word[.col1r],ax
.gl_ok:
; cmp .x1,SIZE_X-1 ;check
; jg .gl_quit
; cmp .x2,SIZE_X-1
; jl @f
; mov .x2,SIZE_X-1
; @@:
; cmp .x1,0
; jg @f
; mov .x1,0
; @@:
; cmp .x2,0
; jl .gl_quit
 
movsx ecx,.y
mov eax,SIZE_X*3
mul ecx
movsx ebx,.x1
lea ecx,[ebx*2+eax]
add edi,ecx
add edi,ebx
 
mov ax,word[.col2r]
sub ax,word[.col1r]
cwde
shl eax,ROUND
cdq
mov cx,.x2
sub cx,.x1
movsx ecx,cx
idiv ecx
;mov .dc_r,eax ;first delta
push eax
 
mov ax,word[.col2g]
sub ax,word[.col1g]
cwde
shl eax,ROUND
cdq
idiv ecx
;mov .dc_g,eax
push eax
 
mov ax,word[.col2b]
sub ax,word[.col1b]
cwde
shl eax,ROUND
cdq
idiv ecx
; mov .dc_b,eax
push eax
 
movsx ebx,word[.col1r]
shl ebx,ROUND
movsx edx,word[.col1g]
shl edx,ROUND
movsx esi,word[.col1b]
shl esi,ROUND
.gl_draw:
mov eax,ebx
sar eax,ROUND
stosb
mov eax,edx
sar eax,ROUND
stosb
mov eax,esi
sar eax,ROUND
stosb
add ebx,.dc_r
add edx,.dc_g
add esi,.dc_b
loop .gl_draw
.gl_quit:
; add esp,12
mov esp,ebp
ret 18
/programs/demos/3DS/GRD_CAT.ASM
0,0 → 1,598
ROUND equ 8
CATMULL_SHIFT equ 8
gouraud_triangle_z:
;----procedure drawing gouraud triangle with z coordinate
;----interpolation ( Catmull alghoritm )-----------------
;------------------in - eax - x1 shl 16 + y1 ------------
;---------------------- ebx - x2 shl 16 + y2 ------------
;---------------------- ecx - x3 shl 16 + y3 ------------
;---------------------- esi - pointer to Z-buffer--------
;---------------------- Z-buffer filled with dd variables
;---------------------- shifted CATMULL_SHIFT------------
;---------------------- edi - pointer to screen buffer---
;---------------------- stack : colors-------------------
;----------------- procedure don't save registers !!-----
.col1r equ ebp+4 ; each color as word
.col1g equ ebp+6 ; each z coordinate as word
.col1b equ ebp+8
.z1 equ ebp+10
.col2r equ ebp+12
.col2g equ ebp+14
.col2b equ ebp+16
.z2 equ ebp+18
.col3r equ ebp+20
.col3g equ ebp+22
.col3b equ ebp+24
.z3 equ ebp+26
 
.x1 equ word[ebp-2]
.y1 equ word[ebp-4]
.x2 equ word[ebp-6]
.y2 equ word[ebp-8]
.x3 equ word[ebp-10]
.y3 equ word[ebp-12]
 
.dx12 equ dword[ebp-16]
.dz12 equ dword[ebp-20]
.dc12r equ dword[ebp-24]
.dc12g equ dword[ebp-28]
.dc12b equ dword[ebp-32]
 
.dx13 equ dword[ebp-36]
.dz13 equ dword[ebp-40]
.dc13r equ dword[ebp-44]
.dc13g equ dword[ebp-48]
.dc13b equ dword[ebp-52]
 
.dx23 equ dword[ebp-56]
.dz23 equ dword[ebp-60]
.dc23r equ dword[ebp-64]
.dc23g equ dword[ebp-68]
.dc23b equ dword[ebp-72]
 
.c1r equ dword[ebp-76]
.c1g equ dword[ebp-80]
.c1b equ dword[ebp-84]
.c2r equ dword[ebp-88]
.c2g equ dword[ebp-92]
.c2b equ dword[ebp-96]
.zz1 equ dword[ebp-100]
.zz2 equ dword[ebp-104]
 
mov ebp,esp
; sub esp,84
.sort3: ; sort triangle coordinates...
cmp ax,bx
jle .sort1
xchg eax,ebx
mov edx,dword[.col1r]
xchg edx,dword[.col2r]
mov dword[.col1r],edx
mov edx,dword[.col1b]
xchg edx,dword[.col2b]
mov dword[.col1b],edx
.sort1:
cmp bx,cx
jle .sort2
xchg ebx,ecx
mov edx,dword[.col2r]
xchg edx,dword[.col3r]
mov dword[.col2r],edx
mov edx,dword[.col2b]
xchg edx,dword[.col3b]
mov dword[.col2b],edx
jmp .sort3
.sort2:
push eax ; store in variables
push ebx
push ecx
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
and edx,ebx ; if *all* of them are negative a sign flag is raised
and edx,ecx
and edx,eax
test edx,80008000h ; Check both X&Y at once
jne .gt_loop2_end
 
mov bx,.y2 ; calc deltas
sub bx,.y1
jnz .gt_dx12_make
; mov .dx12,0
; mov .dz12,0
; mov .dc12r,0
; mov .dc12g,0
; mov .dc12b,0
mov ecx,5
@@:
push dword 0
loop @b
jmp .gt_dx12_done
.gt_dx12_make:
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
; mov .dx12,eax
push eax
 
mov ax,word[.z2]
sub ax,word[.z1]
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
push eax
 
mov ax,word[.col2r]
sub ax,word[.col1r]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc12r,eax
push eax
mov ax,word[.col2g]
sub ax,word[.col1g]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc12g,eax
push eax
mov ax,word[.col2b]
sub ax,word[.col1b]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc12b,eax
push eax
.gt_dx12_done:
 
mov bx,.y3 ; calc deltas
sub bx,.y1
jnz .gt_dx13_make
; mov .dx13,0
; mov .dz13,0
; mov .dc13r,0
; mov .dc13g,0
; mov .dc13b,0
mov ecx,5
@@:
push dword 0
loop @b
jmp .gt_dx13_done
.gt_dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
; mov .dx13,eax
push eax
 
mov ax,word[.z3]
sub ax,word[.z1]
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
push eax
 
mov ax,word[.col3r]
sub ax,word[.col1r]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc13r,eax
push eax
mov ax,word[.col3g]
sub ax,word[.col1g]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc13g,eax
push eax
mov ax,word[.col3b]
sub ax,word[.col1b]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc13b,eax
push eax
.gt_dx13_done:
 
mov bx,.y3 ; calc deltas
sub bx,.y2
jnz .gt_dx23_make
; mov .dx23,0
; mov .dz23,0
; mov .dc23r,0
; mov .dc23g,0
; mov .dc23b,0
mov ecx,5
@@:
push dword 0
loop @b
jmp .gt_dx23_done
.gt_dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND
cdq
idiv ebx
; mov .dx23,eax
push eax
 
mov ax,word[.z3]
sub ax,word[.z2]
cwde
shl eax,CATMULL_SHIFT
cdq
idiv ebx
push eax
 
mov ax,word[.col3r]
sub ax,word[.col2r]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc23r,eax
push eax
mov ax,word[.col3g]
sub ax,word[.col2g]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc23g,eax
push eax
mov ax,word[.col3b]
sub ax,word[.col2b]
cwde
shl eax,ROUND
cdq
idiv ebx
; mov .dc23b,eax
push eax
.gt_dx23_done:
sub esp,32
 
movsx eax,.x1 ; eax - cur x1
shl eax,ROUND ; ebx - cur x2
mov ebx,eax
movsx edx,word[.z1]
shl edx,CATMULL_SHIFT
mov .zz1,edx
mov .zz2,edx
movzx edx,word[.col1r]
shl edx,ROUND
mov .c1r,edx
mov .c2r,edx
movzx edx,word[.col1g]
shl edx,ROUND
mov .c1g,edx
mov .c2g,edx
movzx edx,word[.col1b]
shl edx,ROUND
mov .c1b,edx
mov .c2b,edx
mov cx,.y1
cmp cx,.y2
jge .gt_loop1_end
 
.gt_loop1:
pushad
; macro .debug
 
mov edx,.c2r ; c2r,c2g,c2b,c1r,c1g,c1b - current colors
sar edx,ROUND
push dx
mov edx,.c2g
sar edx,ROUND
push dx
mov edx,.c2b
sar edx,ROUND
push dx
sar ebx,ROUND ; x2
push bx
mov edx,.c1r
sar edx,ROUND
push dx
mov edx,.c1g
sar edx,ROUND
push dx
mov edx,.c1b
sar edx,ROUND
push dx
sar eax,ROUND
push ax ; x1
push cx ; y
push .zz2
push .zz1
call gouraud_line_z
 
popad
 
mov edx,.dc13r
add .c1r,edx
mov edx,.dc13g
add .c1g,edx
mov edx,.dc13b
add .c1b,edx
mov edx,.dc12r
add .c2r,edx
mov edx,.dc12g
add .c2g,edx
mov edx,.dc12b
add .c2b,edx
mov edx,.dz13
add .zz1,edx
mov edx,.dz12
add .zz2,edx
 
add eax,.dx13
add ebx,.dx12
inc cx
cmp cx,.y2
jl .gt_loop1
 
.gt_loop1_end:
mov cx,.y2
cmp cx,.y3
jge .gt_loop2_end
 
movsx ebx,.x2 ; eax - cur x1
shl ebx,ROUND ; ebx - cur x2
movsx edx,word[.z2]
shl edx,CATMULL_SHIFT
mov .zz2,edx
movzx edx,word[.col2r]
shl edx,ROUND
mov .c2r,edx
movzx edx,word[.col2g]
shl edx,ROUND
mov .c2g,edx
movzx edx,word[.col2b]
shl edx,ROUND
mov .c2b,edx
 
.gt_loop2:
pushad
; macro .debug
 
mov edx,.c2r ; c2r,c2g,c2b,c1r,c1g,c1b - current colors
sar edx,ROUND
push dx
mov edx,.c2g
sar edx,ROUND
push dx
mov edx,.c2b
sar edx,ROUND
push dx
sar ebx,ROUND ; x2
push bx
mov edx,.c1r
sar edx,ROUND
push dx
mov edx,.c1g
sar edx,ROUND
push dx
mov edx,.c1b
sar edx,ROUND
push dx
sar eax,ROUND
push ax ; x1
push cx ; y
push .zz2
push .zz1
call gouraud_line_z
 
popad
 
mov edx,.dc13r
add .c1r,edx
mov edx,.dc13g
add .c1g,edx
mov edx,.dc13b
add .c1b,edx
mov edx,.dc23r
add .c2r,edx
mov edx,.dc23g
add .c2g,edx
mov edx,.dc23b
add .c2b,edx
mov edx,.dz13
add .zz1,edx
mov edx,.dz23
add .zz2,edx
 
add eax,.dx13
add ebx,.dx23
inc cx
cmp cx,.y3
jl .gt_loop2
.gt_loop2_end:
 
mov esp,ebp
ret 24
gouraud_line_z:
;----------------- procedure drawing gouraud line
;----------------- with z coordinate interpolation
;----------------- esi - pointer to Z_buffer
;----------------- edi - pointer to screen buffer
;----------------- stack:
.z1 equ dword[ebp+4] ; z coordiunate shifted left CATMULL_SHIFT
.z2 equ dword[ebp+8]
.y equ word[ebp+12]
.x1 equ ebp+14
.c1b equ ebp+16
.c1g equ ebp+18
.c1r equ ebp+20
.x2 equ ebp+22
.c2b equ ebp+24
.c2g equ ebp+26
.c2r equ ebp+28
.dz equ dword[ebp-4]
.dc_r equ dword[ebp-8]
.dc_g equ dword[ebp-12]
.dc_b equ dword[ebp-14]
.cr equ dword[ebp-18]
.cg equ dword[ebp-22]
.cb equ dword[ebp-26]
mov ebp,esp
 
mov ax,.y
or ax,ax
jl .gl_quit
cmp ax,SIZE_Y
jge .gl_quit
 
mov eax,dword[.x1]
cmp ax,word[.x2]
je .gl_quit
jl @f
 
xchg eax,dword[.x2]
mov dword[.x1],eax
mov eax,dword[.c1g]
xchg eax,dword[.c2g]
mov dword[.c1g],eax
mov eax,.z1
xchg eax,.z2
mov .z1,eax
@@:
cmp word[.x1],SIZE_X
jge .gl_quit
cmp word[.x2],0
jle .gl_quit
 
mov eax,.z2
sub eax,.z1
cdq
mov bx,word[.x2] ; dz = z2-z1/x2-x1
sub bx,word[.x1]
movsx ebx,bx
idiv ebx
push eax
 
mov ax,word[.c2r]
sub ax,word[.c1r]
cwde
shl eax,ROUND ; dc_r = c2r-c1r/x2-x1
cdq
idiv ebx
push eax
 
mov ax,word[.c2g]
sub ax,word[.c1g]
cwde
shl eax,ROUND
cdq
idiv ebx
push eax
 
mov ax,word[.c2b]
sub ax,word[.c1b]
cwde
shl eax,ROUND
cdq
idiv ebx
push eax
 
cmp word[.x1],0
jg @f
mov eax,.dz
movsx ebx,word[.x1]
neg ebx
imul ebx
add .z1,eax
mov word[.x1],0
 
mov eax,.dc_r
imul ebx
sar eax,ROUND
add word[.c1r],ax
 
mov eax,.dc_g
imul ebx
sar eax,ROUND
add word[.c1g],ax
 
mov eax,.dc_b
imul ebx
sar eax,ROUND
add word[.c1b],ax
 
@@:
cmp word[.x2],SIZE_X
jl @f
mov word[.x2],SIZE_X
@@:
sub esp,12 ; calculate memory begin
mov edx,SIZE_X ; in buffers
movzx eax,.y
mul edx
movzx edx,word[.x1]
add eax,edx
push eax
lea eax,[eax*3]
add edi,eax
pop eax
shl eax,2
add esi,eax
 
mov cx,word[.x2]
sub cx,word[.x1]
movzx ecx,cx
mov ebx,.z1 ; ebx - currrent z shl CATMULL_SIFT
mov edx,.dz ; edx - delta z
movzx eax,word[.c1r]
shl eax,ROUND
mov .cr,eax
movzx eax,word[.c1g]
shl eax,ROUND
mov .cg,eax
movzx eax,word[.c1b]
shl eax,ROUND
mov .cb,eax
.ddraw:
cmp ebx,dword[esi]
jge .skip
mov eax,.cr
sar eax,ROUND
stosb
mov eax,.cg
sar eax,ROUND
stosb
mov eax,.cb
sar eax,ROUND
stosb
mov dword[esi],ebx
jmp .no_skip
.skip:
add edi,3
.no_skip:
add esi,4
add ebx,edx
mov eax,.dc_r
add .cr,eax
mov eax,.dc_g
add .cg,eax
mov eax,.dc_b
add .cb,eax
loop .ddraw
 
.gl_quit:
mov esp,ebp
ret 26
/programs/demos/3DS/HRT.3DS
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/demos/3DS/TEAPOT.3DS
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/demos/3DS/TEX3.ASM
0,0 → 1,507
;---------------------------------------------------------------------
;--------------------textured triangle procedure----------------------
;---------------------------------------------------------------------
tex_triangle:
;----------in - eax - x1 shl 16 + y1
;-------------- ebx - x2 shl 16 + y2
;---------------ecx - x3 shl 16 + y3
;---------------edx - nothing
;---------------esi - pointer to texture buffer
;---------------edi - pointer to screen buffer
;-------------stack - texture coordinates
.tex_x1 equ ebp+4
.tex_y1 equ ebp+6
.tex_x2 equ ebp+8
.tex_y2 equ ebp+10
.tex_x3 equ ebp+12
.tex_y3 equ ebp+14
mov ebp,esp
 
mov edx,dword[.tex_x1] ; check all parameters
or dx,dx
jl .tt_end
cmp dx,TEX_X-1
jg .tt_end
shr edx,16
or dx,dx
jl .tt_end
cmp dx,TEX_Y-1
jg .tt_end
 
mov edx,dword[.tex_x2]
or dx,dx
jl .tt_end
cmp dx,TEX_X-1
jg .tt_end
shr edx,16
or dx,dx
jl .tt_end
cmp dx,TEX_Y-1
jg .tt_end
 
mov edx,dword[.tex_x3]
or dx,dx
jl .tt_end
cmp dx,TEX_X-1
jg .tt_end
shr edx,16
cmp dx,TEX_Y-1
jg .tt_end
or dx,dx
jl .tt_end
 
mov edx,eax ; check X&Y triangle coordinate
or edx,ebx
or edx,ecx
test edx,80008000h
jne .tt_end
 
; or ax,ax
; jl .tt_end
cmp ax,SIZE_Y
jg .tt_end
ror eax,16
; or ax,ax
; jl .tt_end
cmp ax,SIZE_X
jg .tt_end
rol eax,16
 
; or bx,bx
; jl .tt_end
cmp bx,SIZE_Y
jg .tt_end
ror ebx,16
; or bx,bx
; jl .tt_end
cmp bx,SIZE_X
jg .tt_end
rol ebx,16
 
; or cx,cx
; jl .tt_end
cmp cx,SIZE_Y
jg .tt_end
ror ecx,16
; or cx,cx
; jl .tt_end
cmp cx,SIZE_X
jg .tt_end
rol ecx,16 ; uff.. parameters was checked
 
cmp ax,bx ;sort all parameters
jle .tt_sort1
xchg eax,ebx
mov edx,dword [.tex_x1]
xchg edx,dword [.tex_x2]
mov dword[.tex_x1],edx
.tt_sort1:
cmp ax,cx
jle .tt_sort2
xchg eax,ecx
mov edx,dword [.tex_x1]
xchg edx,dword [.tex_x3]
mov dword [.tex_x1],edx
.tt_sort2:
cmp bx,cx
jle .tt_sort3
xchg ebx,ecx
mov edx,dword [.tex_x2]
xchg edx,dword [.tex_x3]
mov dword [.tex_x2],edx
.tt_sort3:
mov [.y1],ax ; and store to user friendly variables
shr eax,16
mov [.x1],ax
mov [.y2],bx
shr ebx,16
mov [.x2],bx
mov [.y3],cx
shr ecx,16
mov [.x3],cx
mov [.tex_ptr],esi
 
movsx ebx,word[.y2]
sub bx,[.y1]
jnz .tt_dx12_make
 
mov [.dx12],0
mov [.tex_dx12],0
mov [.tex_dy12],0
jmp .tt_dx12_done
.tt_dx12_make:
mov ax,[.x2]
sub ax,[.x1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dx12],eax ; dx12 = (x2-x1)/(y2-y1)
 
mov ax,word[.tex_x2]
sub ax,word[.tex_x1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dx12],eax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
 
mov ax,word[.tex_y2]
sub ax,word[.tex_y1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dy12],eax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
.tt_dx12_done:
 
movsx ebx,[.y3]
sub bx,[.y1]
jnz .tt_dx13_make
 
mov [.dx13],0
mov [.tex_dx13],0
mov [.tex_dy13],0
jmp .tt_dx13_done
.tt_dx13_make:
mov ax,[.x3]
sub ax,[.x1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dx13],eax ; dx13 = (x3-x1)/(y3-y1)
 
mov ax,word[.tex_x3]
sub ax,word[.tex_x1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dx13],eax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
 
mov ax,word[.tex_y3]
sub ax,word[.tex_y1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dy13],eax ; tex_dy13 = (tex_y3-tex_y1)/(y3-y1)
.tt_dx13_done:
 
movsx ebx,[.y3]
sub bx,[.y2]
jnz .tt_dx23_make
 
mov [.dx23],0
mov [.tex_dx23],0
mov [.tex_dy23],0
jmp .tt_dx23_done
.tt_dx23_make:
mov ax,[.x3]
sub ax,[.x2]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dx23],eax ; dx23 = (x3-x2)/(y3-y2)
 
mov ax,word[.tex_x3]
sub ax,word[.tex_x2]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dx23],eax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
 
mov ax,word[.tex_y3]
sub ax,word[.tex_y2]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.tex_dy23],eax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
.tt_dx23_done:
 
movsx eax,[.x1]
shl eax,ROUND
mov ebx,eax
 
movsx edx, word[.tex_x1]
shl edx,ROUND
mov [.scan_x1],edx
mov [.scan_x2],edx
movsx edx, word[.tex_y1]
shl edx,ROUND
mov [.scan_y1],edx
mov [.scan_y2],edx
 
mov cx,[.y1]
cmp cx, [.y2]
jge .tt_loop1_end
.tt_loop1:
push edi
push eax
push ebx
push cx
push ebp
 
mov edx, [.scan_y2]
sar edx, ROUND
push dx
mov edx, [.scan_x2]
sar edx, ROUND
push dx
mov edx, [.scan_y1]
sar edx, ROUND
push dx
mov edx, [.scan_x1]
sar edx, ROUND
push dx
push [.tex_ptr]
 
push cx
mov edx,ebx
sar edx,ROUND
push dx
mov edx,eax
sar edx,ROUND
push dx
call textured_line
 
pop ebp
pop cx
pop ebx
pop eax
pop edi
 
mov edx, [.tex_dx13]
add [.scan_x1], edx
mov edx, [.tex_dx12]
add [.scan_x2], edx
mov edx, [.tex_dy13]
add [.scan_y1], edx
mov edx, [.tex_dy12]
add [.scan_y2], edx
 
add eax, [.dx13]
add ebx, [.dx12]
inc cx
cmp cx,[.y2]
jl .tt_loop1
.tt_loop1_end:
 
 
mov cx,[.y2]
cmp cx, [.y3]
jge .tt_loop2_end
 
movsx ebx,[.x2]
shl ebx,ROUND
 
movsx edx, word[.tex_x2]
shl edx,ROUND
mov [.scan_x2],edx
movsx edx, word[.tex_y2]
shl edx,ROUND
mov [.scan_y2],edx
 
.tt_loop2:
push edi
push eax
push ebx
push cx
push ebp
 
mov edx, [.scan_y2]
sar edx, ROUND
push dx
mov edx, [.scan_x2]
sar edx, ROUND
push dx
mov edx, [.scan_y1]
sar edx, ROUND
push dx
mov edx, [.scan_x1]
sar edx, ROUND
push dx
push [.tex_ptr]
 
push cx
mov edx,ebx
sar edx,ROUND
push dx
mov edx,eax
sar edx,ROUND
push dx
call textured_line
 
pop ebp
pop cx
pop ebx
pop eax
pop edi
 
mov edx, [.tex_dx13]
add [.scan_x1], edx
mov edx, [.tex_dx23]
add [.scan_x2], edx
mov edx, [.tex_dy13]
add [.scan_y1], edx
mov edx, [.tex_dy23]
add [.scan_y2], edx
 
add eax, [.dx13]
add ebx, [.dx23]
inc cx
cmp cx,[.y3]
jl .tt_loop2
.tt_loop2_end:
 
.tt_end:
mov esp,ebp
ret 12
.x1 dw ?
.y1 dw ?
.x2 dw ?
.y2 dw ?
.x3 dw ?
.y3 dw ?
.dx12 dd ?
.dx13 dd ?
.dx23 dd ?
.tex_dx12 dd ?
.tex_dy12 dd ?
.tex_dx13 dd ?
.tex_dy13 dd ?
.tex_dx23 dd ?
.tex_dy23 dd ?
.tex_ptr dd ?
 
.scan_x1 dd ?
.scan_y1 dd ?
.scan_x2 dd ?
.scan_y2 dd ?
 
 
textured_line:
;-----in -edi screen buffer pointer
;------------ stack:
.x1 equ word [ebp+4]
.x2 equ word [ebp+6]
.y equ word [ebp+8]
 
.tex_ptr equ dword [ebp+10]
.tex_x1 equ word [ebp+14]
.tex_y1 equ word [ebp+16]
.tex_x2 equ word [ebp+18]
.tex_y2 equ word [ebp+20]
 
mov ebp,esp
 
mov ax,.y
or ax,ax
jl .tl_quit
cmp ax,SIZE_Y
jg .tl_quit
 
mov ax,.x1
cmp ax,.x2
je .tl_quit
jl .tl_ok
 
xchg ax,.x2
mov .x1,ax
 
mov ax,.tex_x1
xchg ax,.tex_x2
mov .tex_x1,ax
 
mov ax,.tex_y1
xchg ax,.tex_y2
mov .tex_y1,ax
 
.tl_ok:
mov ebx,edi
movsx edi,.y
mov eax,SIZE_X*3
mul edi
mov edi,eax
movsx eax,.x1
add edi,eax
shl eax,1
add edi,eax
add edi,ebx
 
mov cx,.x2
sub cx,.x1
movsx ecx,cx
 
mov ax,.tex_x2
sub ax,.tex_x1
cwde
shl eax,ROUND
cdq
idiv ecx
mov [.tex_dx],eax ; tex_dx=(tex_x2-tex_x1)/(x2-x1)
 
mov ax,.tex_y2
sub ax,.tex_y1
cwde
shl eax,ROUND
cdq
idiv ecx
mov [.tex_dy],eax ; tex_dy = (tex_y2-tex_y1)/(x2-x1)
 
movsx eax,.tex_x1
shl eax,ROUND
movsx ebx,.tex_y1
shl ebx,ROUND
cld
.tl_loop:
mov edx,eax
mov esi,ebx
sar edx,ROUND
sar esi,ROUND
macro .fluent
{
push eax
push edx
mov eax,TEX_X*3
mul esi
mov esi,eax
pop edx
pop eax
}
macro .shift
{
shl esi,TEX_SHIFT
lea esi,[esi*3]
;push edx
;mov edx,esi
;shl esi,1
;add esi,edx
;pop edx
}
if TEX = FLUENTLY
.fluent
end if
if TEX = SHIFTING
.shift
end if
lea edx,[edx*3]
add esi,edx
; shl edx,1
; add esi,edx
add esi,.tex_ptr
movsd
dec edi
add eax,[.tex_dx]
add ebx,[.tex_dy]
loop .tl_loop
 
.tl_quit:
mov esp,ebp
ret 18
.tex_dx dd ?
.tex_dy dd ?