forked from KolibriOS/kolibrios
b654a4e928
git-svn-id: svn://kolibrios.org@9237 a494cfbc-eb01-0410-851d-a64ba20cac60
3642 lines
95 KiB
NASM
3642 lines
95 KiB
NASM
|
|
; application : View3ds ver. 0.074 - tiny .3ds and .asc files viewer
|
|
; with a few graphics effects demonstration.
|
|
; compiler : FASM
|
|
; system : KolibriOS
|
|
; author : Macgub aka Maciej Guba
|
|
; email : macgub3@wp.pl
|
|
; web : http://macgub.co.pl, http://macgub.j.pl
|
|
; Fell free to use this intro in your own distribution of KolibriOS.
|
|
; Special greetings to KolibriOS team .
|
|
; I hope because my demos 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 not exist
|
|
|
|
|
|
SIZE_X equ 512
|
|
SIZE_Y equ 512 ; ///// I want definitely
|
|
TIMEOUT equ 10 ; ------ say:
|
|
ROUND equ 10 ; \ @ @/ keep smiling every
|
|
TEX_X equ 512 ; texture width ; \ ./ / day.
|
|
TEX_Y equ 512 ; height ; \/ /
|
|
TEX_SHIFT equ 9 ; texture width shifting ; __||__ /
|
|
TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 ; /| |
|
|
TEX equ SHIFTING ; TEX={SHIFTING | FLUENTLY} ; / \ /
|
|
FLUENTLY = 0 ; / | |
|
|
SHIFTING = 1 ; ------
|
|
CATMULL_SHIFT equ 8 ; | |
|
|
LIGHT_SIZE equ 22 ; | |
|
|
NON = 0 ; -/ \-
|
|
MMX = 1
|
|
SSE = 2
|
|
SSE2 = 3
|
|
SSE3 = 4
|
|
Ext = SSE3 ;Ext={ NON | MMX | SSE | SSE2 | SSE3 }
|
|
; For now correct only SSE2 and SSE3 versions. if you have older CPU
|
|
; use older versions of app. Probably ver 005 will be OK but it need
|
|
; re-edit to support new Kolibri features.
|
|
|
|
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
|
|
USE_LFN = 1 ; App is Kolibri only now.
|
|
|
|
use32
|
|
org 0x0
|
|
db 'MENUET01' ; 8 byte id
|
|
dd 0x01 ; header version
|
|
dd START ; start of code
|
|
dd I_END ; size of image
|
|
dd MEM_END ; memory for app
|
|
dd MEM_END ; esp
|
|
dd I_Param ; I_Param
|
|
dd 0x0 ; I_Icon
|
|
|
|
START: ; start of execution
|
|
rdtsc
|
|
mov [rand_seed],ax
|
|
cld
|
|
push dword (SIZE_Y shr 3) * 3
|
|
fninit
|
|
fild dword[esp]
|
|
fstp [rsscale]
|
|
pop ebx
|
|
|
|
call alloc_buffer_mem
|
|
call read_param
|
|
call read_from_disk ; read, if all is ok eax = 0
|
|
cmp eax,0
|
|
jne .gen
|
|
mov esi,[fptr]
|
|
cmp [esi],word 4D4Dh
|
|
jne .asc
|
|
call read_tp_variables ; init points and triangles count variables
|
|
cmp eax,0
|
|
je .gen
|
|
jmp .malloc
|
|
.gen:
|
|
call generate_object
|
|
jmp .opt
|
|
.asc:
|
|
mov [triangles_count_var],10000 ; to do: read asc header
|
|
mov [points_count_var],10000
|
|
call alloc_mem_for_tp
|
|
call read_asc
|
|
jmp .opt
|
|
.malloc:
|
|
call alloc_mem_for_tp
|
|
call read_from_file
|
|
.opt:
|
|
call optimize_object1 ; proc in file b_procs.asm
|
|
; set point(0,0,0) in center and calc all coords
|
|
; to be in <-1.0,1.0>
|
|
call normalize_all_light_vectors
|
|
call copy_lights ; to aligned float
|
|
call init_triangles_normals2
|
|
call init_point_normals
|
|
call init_envmap2
|
|
call init_envmap_cub
|
|
call generate_texture2
|
|
call init_sincos_tab
|
|
call do_color_buffer ; intit color_map
|
|
if Ext >= SSE3
|
|
call init_point_lights
|
|
mov [fire_flag],0 ; proteza
|
|
end if
|
|
mov edi,bumpmap
|
|
call calc_bumpmap
|
|
call calc_bumpmap_coords ; bump and texture mapping
|
|
call do_edges_list
|
|
call draw_window
|
|
if Ext > SSE2
|
|
mov eax,1
|
|
cpuid
|
|
bt ecx,0 ; is sse3 on board?
|
|
jc @f
|
|
mov [max_dr_flg],12
|
|
mov [isSSE3],0
|
|
@@:
|
|
end if
|
|
|
|
still:
|
|
cmp [edit_flag],1
|
|
jne @f
|
|
mov eax,40 ; set events mask
|
|
mov ebx,1100000000000000000000000100111b
|
|
jmp .int
|
|
@@:
|
|
mov eax,40 ; set events mask
|
|
mov ebx,111b
|
|
.int:
|
|
int 0x40
|
|
if Ext > SSE2
|
|
cmp [ray_shd_flag],1
|
|
jne @f
|
|
cmp [isSSE3],1
|
|
jne @f
|
|
mov eax,10
|
|
jmp .intt
|
|
end if
|
|
|
|
@@:
|
|
mov eax,23
|
|
mov ebx,TIMEOUT
|
|
cmp [speed_flag],0
|
|
je .skip
|
|
mov eax,11
|
|
.skip:
|
|
cmp [edit_flag],1
|
|
jne @f
|
|
mov eax,10
|
|
|
|
@@:
|
|
.intt:
|
|
int 0x40
|
|
|
|
cmp eax,1 ; redraw event ?
|
|
je red
|
|
cmp eax,2 ; key event ?
|
|
je key
|
|
cmp eax,3 ; button event ?
|
|
je button
|
|
cmp eax,6 ; mouse event ?
|
|
jne @f
|
|
cmp [edit_flag],1 ; handle mouse only when edit is active
|
|
jne @f
|
|
|
|
mov eax,37
|
|
mov ebx,7 ; get mouse scroll
|
|
int 0x40
|
|
and eax, 0xFFFF ; check only vertial
|
|
cmp eax, 65535
|
|
je button.zoom_in
|
|
cmp eax, 1
|
|
je button.zoom_out
|
|
|
|
mov eax,37
|
|
mov ebx,3 ;read mouse state
|
|
int 0x40
|
|
mov [mouse_state],eax
|
|
call edit
|
|
@@:
|
|
jmp noclose
|
|
|
|
red: ; redraw
|
|
mov eax,9 ; get process info
|
|
mov ebx,procinfo
|
|
mov ecx,-1
|
|
int 0x40
|
|
mov eax,[procinfo+42] ; read params of window
|
|
sub eax,225
|
|
mov [size_x_var],ax
|
|
shr ax,1
|
|
mov [vect_x],ax
|
|
;
|
|
mov eax,[procinfo+46]
|
|
sub eax,30
|
|
mov [size_y_var],ax
|
|
shr ax,1
|
|
mov [vect_y],ax
|
|
|
|
mov eax,[procinfo+34]
|
|
mov [x_start],ax
|
|
mov eax,[procinfo+38]
|
|
mov [y_start],ax
|
|
call alloc_buffer_mem ;realloc mem for scr & z buffs
|
|
call draw_window
|
|
|
|
jmp noclose
|
|
|
|
key: ; key
|
|
mov eax,2 ; just read it and ignore
|
|
int 0x40
|
|
|
|
cmp ah, '+'
|
|
je button.zoom_in
|
|
cmp ah, '='
|
|
je button.zoom_in
|
|
cmp ah, '-'
|
|
je button.zoom_out
|
|
cmp ah, 176 ;left
|
|
je add_vec_buttons.x_minus
|
|
cmp ah, 179 ;right
|
|
je add_vec_buttons.x_plus
|
|
cmp ah, 178 ;up
|
|
je add_vec_buttons.y_minus
|
|
cmp ah, 177 ;down
|
|
je add_vec_buttons.y_plus
|
|
|
|
jmp noclose
|
|
|
|
button: ; button
|
|
mov eax,17 ; get id
|
|
int 0x40
|
|
|
|
cmp ah,1 ; button id=1 ?
|
|
jne @f
|
|
|
|
mov eax,-1 ; close this program
|
|
int 0x40
|
|
@@:
|
|
cmp ah,30
|
|
jge add_vec_buttons
|
|
call update_flags ; update flags and write labels of flags
|
|
|
|
; do other operations according to flag
|
|
cmp ah,3 ; ah = 3 -> shading model
|
|
jne .next_m6
|
|
cmp [dr_flag],2
|
|
jne @f
|
|
; call init_envmap2 ; <----! this don't works in env mode
|
|
; and more than ~18 kb objects
|
|
; call init_envmap_cub2
|
|
@@:
|
|
cmp [dr_flag],4
|
|
jne @f
|
|
call generate_texture2
|
|
|
|
@@:
|
|
.next_m6:
|
|
; ah = 5 -> scale-
|
|
cmp ah,5
|
|
jne @f
|
|
.zoom_out:
|
|
mov dword[scale],0.7
|
|
fninit
|
|
fld [rsscale]
|
|
fmul [scale]
|
|
fstp [rsscale]
|
|
@@:
|
|
cmp ah,6 ; ah = 6 -> scale+
|
|
jne @f
|
|
.zoom_in:
|
|
mov dword[scale],1.3
|
|
fninit
|
|
fld [rsscale]
|
|
fmul [scale]
|
|
fstp [rsscale]
|
|
@@:
|
|
cmp ah,9 ; lights random ; 'flat' 0
|
|
jne .next_m5 ; 'grd ' 1
|
|
call make_random_lights ; 'env ' 2
|
|
call normalize_all_light_vectors ; 'bump' 3
|
|
call copy_lights
|
|
if Ext >= SSE3
|
|
call init_point_lights ; for ex. ray casting
|
|
end if
|
|
call do_color_buffer ; intit color_map ; 'tex ' 4
|
|
|
|
call init_envmap2 ; update env map if shading model = environment or bump
|
|
.next_m5:
|
|
cmp ah,11
|
|
je @f
|
|
cmp ah,12
|
|
je @f
|
|
cmp ah,13
|
|
jne .next_m4
|
|
@@:
|
|
call mirror
|
|
.next_m4:
|
|
cmp ah,14
|
|
jne @f
|
|
call exchange
|
|
@@:
|
|
cmp ah,15
|
|
jne @f
|
|
cmp [emboss_flag],1
|
|
; call init_envmap2
|
|
call do_emboss
|
|
@@:
|
|
; cmp ah,17
|
|
; jne .next_m
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; call draw_window ; redraw other labels to navigation buttons
|
|
; @@:
|
|
; cmp [move_flag],0
|
|
; jne .next_m
|
|
; call draw_window ; redraw other labels to navigation buttons
|
|
.next_m:
|
|
cmp ah,18
|
|
jne .next_m2
|
|
|
|
mov [re_alloc_flag],1 ; reallocate memory
|
|
mov [triangles_count_var],20000
|
|
mov [points_count_var],20000
|
|
call alloc_mem_for_tp
|
|
mov [re_alloc_flag],0
|
|
|
|
mov bl,[generator_flag]
|
|
; or bl,bl
|
|
; jz .next_m2
|
|
cmp bl,1
|
|
jne @f
|
|
call generate_object
|
|
jmp .calc_norm
|
|
@@:
|
|
cmp bl,4
|
|
jg @f
|
|
movzx eax,bl ; eax < - object number
|
|
call generate_object2
|
|
jmp .calc_norm
|
|
@@:
|
|
call generate_object3
|
|
.calc_norm:
|
|
call optimize_object1
|
|
call init_triangles_normals2
|
|
call init_point_normals
|
|
call calc_bumpmap_coords ; bump and texture mapping
|
|
call do_edges_list
|
|
call write_info
|
|
.next_m2:
|
|
cmp ah,19
|
|
je @f
|
|
cmp ah,20
|
|
jne .next_m3
|
|
@@:
|
|
mov edi,bumpmap
|
|
call calc_bumpmap
|
|
.next_m3:
|
|
cmp ah,21 ; re map bumps, texture coordinates
|
|
jne @f
|
|
call calc_bumpmap_coords
|
|
@@:
|
|
jmp noclose
|
|
|
|
|
|
; there are 6 navigation buttons each
|
|
add_vec_buttons: ; can move: object, camera,.. list is open
|
|
;
|
|
cmp ah,30
|
|
jne .next
|
|
cmp [move_flag],0
|
|
jne @f
|
|
; cmp [move_flag],2
|
|
; je .set_light1
|
|
.y_minus:
|
|
sub [vect_y],10
|
|
jmp .next
|
|
@@:
|
|
cmp [move_flag],1
|
|
jne @f
|
|
sub [yobs],10 ; observator = camera position
|
|
jmp .next
|
|
@@:
|
|
sub [sin_amplitude],10
|
|
;--------------------------------------------------
|
|
; .set_light1: ; r -
|
|
; movzx ebx,[light_no_flag] ; * 22
|
|
; mov ecx,ebx
|
|
; shl ebx,4
|
|
; shl ecx,1
|
|
; add ebx,ecx
|
|
; shl ecx,1
|
|
; add ebx,ecx
|
|
; add ebx,lights+6 ; 6 -> light vector size
|
|
;
|
|
; movzx ecx,[light_comp_flag]
|
|
; lea ecx,[ecx*3}
|
|
; add ebx,ecx ; ebx -> color to set
|
|
|
|
;---------------------------------------------------
|
|
.next:
|
|
cmp ah,31
|
|
jne .next1
|
|
cmp [move_flag],1
|
|
je @f
|
|
add [vect_z],10
|
|
jmp .next1
|
|
@@:
|
|
add [zobs],10 ; observator = camera position
|
|
.next1:
|
|
cmp ah,33
|
|
jne .next2
|
|
cmp [move_flag],0
|
|
jne @f
|
|
.x_minus:
|
|
sub word[vect_x],10
|
|
jmp .next2
|
|
@@:
|
|
cmp [move_flag],1
|
|
jne @f
|
|
sub [xobs],10 ; observator = camera position
|
|
jmp .next2
|
|
@@:
|
|
fninit
|
|
fld [sin_frq]
|
|
fsub [sin_delta]
|
|
fstp [sin_frq]
|
|
.next2:
|
|
cmp ah,32
|
|
jne .next3
|
|
cmp [move_flag],0
|
|
jne @f
|
|
.x_plus:
|
|
add word[vect_x],10
|
|
jmp .next3
|
|
@@:
|
|
cmp [move_flag],1
|
|
jne @f
|
|
add [xobs],10 ; observator = camera position
|
|
jmp .next3
|
|
@@:
|
|
fninit
|
|
fld [sin_frq] ; change wave effect frequency
|
|
fadd [sin_delta]
|
|
fstp [sin_frq]
|
|
.next3:
|
|
cmp ah,34
|
|
jne .next4
|
|
cmp [move_flag],1
|
|
je @f
|
|
|
|
sub [vect_z],10
|
|
jmp .next4
|
|
@@:
|
|
sub [zobs],10 ; observator = camera position
|
|
.next4:
|
|
cmp ah,35
|
|
jne .next5
|
|
cmp [move_flag],0
|
|
jne @f
|
|
; call add_vector
|
|
.y_plus:
|
|
add [vect_y],10
|
|
jmp .next5
|
|
@@:
|
|
cmp [move_flag],1
|
|
jne @f
|
|
add [yobs],10 ; observator = camera position
|
|
jmp .next5
|
|
@@:
|
|
add [sin_amplitude],10
|
|
.next5:
|
|
|
|
|
|
|
|
noclose:
|
|
|
|
cmp [edit_flag],1
|
|
jz .end_rot
|
|
cmp [r_flag],2
|
|
jne .no_x
|
|
inc [angle_x]
|
|
and [angle_x],0xff
|
|
mov [angle_z],0
|
|
jmp .end_rot
|
|
|
|
.no_x:
|
|
cmp [r_flag],0
|
|
jne .no_y
|
|
inc [angle_y]
|
|
and [angle_y],0xff
|
|
mov [angle_z],0
|
|
jmp .end_rot
|
|
|
|
.no_y:
|
|
cmp [r_flag],1
|
|
jne .end_rot
|
|
mov cx,[angle_x]
|
|
inc cx
|
|
and cx,0xff
|
|
mov [angle_z],0
|
|
mov [angle_y],cx
|
|
mov [angle_x],cx
|
|
.end_rot:
|
|
|
|
mov esi,angle_x
|
|
mov edi,matrix
|
|
call make_rotation_matrix
|
|
RDTSC
|
|
push eax
|
|
mov esi,[points_normals_ptr]
|
|
mov edi,[points_normals_rot_ptr]
|
|
mov ebx,matrix
|
|
mov ecx,[points_count_var]
|
|
call rotary
|
|
|
|
mov esi,matrix
|
|
call add_scale_to_matrix
|
|
|
|
mov esi,[points_ptr]
|
|
mov edi,[points_rotated_ptr]
|
|
mov ebx,matrix
|
|
mov ecx,[points_count_var]
|
|
call rotary
|
|
|
|
|
|
mov esi,[points_rotated_ptr]
|
|
mov edi,[points_translated_ptr]
|
|
mov ecx,[points_count_var]
|
|
call translate_points
|
|
|
|
cmp [fire_flag],0
|
|
jne @f
|
|
call clrscr ; clear the screen
|
|
@@:
|
|
; cmp [catmull_flag],1 ;non sort if Catmull = on
|
|
; je .no_sort
|
|
; 64 indexes call sort_triangles
|
|
.no_sort:
|
|
cmp [dr_flag],7 ; fill if 2tex and texgrd
|
|
jge @f
|
|
cmp [dr_flag],6 ; non fill if dots
|
|
je .non_f
|
|
@@:
|
|
call fill_Z_buffer ; make background
|
|
.non_f:
|
|
cmp [dr_flag],6
|
|
jne @f
|
|
call draw_dots
|
|
jmp .blurrr
|
|
@@:
|
|
if Ext > SSE2
|
|
cmp [ray_shd_flag],1 ;non fill if Catmull = off
|
|
jne @f
|
|
cmp [isSSE3],1
|
|
jne @f
|
|
mov ax,100
|
|
jmp .dr
|
|
@@:
|
|
end if
|
|
|
|
movzx ax,[dr_flag]
|
|
.dr:
|
|
call draw_triangles ; draw all triangles from the list
|
|
cmp [edit_flag],0
|
|
jz .no_edit
|
|
call clear_vertices_index
|
|
movzx eax,[dr_flag]
|
|
movzx ebx,[ray_shd_flag]
|
|
shl ebx,10
|
|
or eax,ebx
|
|
call draw_handlers
|
|
; call edit
|
|
|
|
|
|
|
|
.no_edit:
|
|
|
|
.blurrr:
|
|
movzx eax,[dr_flag]
|
|
movzx ebx,[ray_shd_flag]
|
|
shl ebx,10
|
|
or eax,ebx
|
|
cmp [sinus_flag],0
|
|
je .no_sin
|
|
movzx eax,[dr_flag]
|
|
movzx ebx,[ray_shd_flag]
|
|
shl ebx,10
|
|
or eax,ebx
|
|
call do_sinus
|
|
; jmp .finito
|
|
.no_sin:
|
|
@@:
|
|
movzx ecx,[fire_flag]
|
|
cmp [fire_flag],1
|
|
je @f
|
|
cmp [blur_flag],0
|
|
je .no_blur ; no blur, no fire
|
|
movzx ecx,[blur_flag]
|
|
@@:
|
|
movzx eax,[dr_flag]
|
|
movzx ebx,[ray_shd_flag]
|
|
shl ebx,10
|
|
or eax,ebx
|
|
call blur_screen ; blur and fire
|
|
; jmp .finito
|
|
|
|
.no_blur: ; no blur, no fire
|
|
cmp [emboss_flag],0
|
|
je @f
|
|
movzx eax,[dr_flag]
|
|
movzx ebx,[ray_shd_flag]
|
|
shl ebx,10
|
|
or eax,ebx
|
|
call do_emboss
|
|
.finito:
|
|
@@:
|
|
|
|
|
|
cmp [inc_bright_flag],0 ; increase brightness
|
|
je .no_inc_bright
|
|
movzx ebx,[inc_bright_flag]
|
|
shl ebx,4
|
|
mov esi,[screen_ptr]
|
|
movzx ecx,word[size_y_var]
|
|
movzx eax,word[size_x_var]
|
|
mul ecx
|
|
lea ecx,[eax*4]
|
|
|
|
if (Ext = MMX)|(Ext = SSE)
|
|
mov bh,bl
|
|
push bx
|
|
shl ebx,16
|
|
pop bx
|
|
push ebx
|
|
push ebx
|
|
movq mm0,[esp]
|
|
add esp,8
|
|
else if Ext >= SSE2
|
|
mov bh,bl
|
|
push bx
|
|
shl ebx,16
|
|
pop bx
|
|
movd xmm0,ebx
|
|
shufps xmm0,xmm0,0
|
|
end if
|
|
.oop:
|
|
if Ext=NON
|
|
lodsb
|
|
add al,bl
|
|
jnc @f
|
|
mov byte[esi-1],255
|
|
loop .oop
|
|
@@:
|
|
mov [esi-1],al
|
|
loop .oop
|
|
else if (Ext=MMX)|(Ext=SSE)
|
|
movq mm1,[esi]
|
|
movq mm2,[esi+8]
|
|
paddusb mm1,mm0
|
|
paddusb mm2,mm0
|
|
movq [esi],mm1
|
|
movq [esi+8],mm2
|
|
add esi,16
|
|
sub ecx,16
|
|
jnz .oop
|
|
else
|
|
movaps xmm1,[esi]
|
|
paddusb xmm1,xmm0
|
|
movaps [esi],xmm1
|
|
add esi,16
|
|
sub ecx,16
|
|
jnc .oop
|
|
end if
|
|
|
|
.no_inc_bright:
|
|
|
|
|
|
cmp [dec_bright_flag],0
|
|
je .no_dec_bright
|
|
movzx ebx,[dec_bright_flag]
|
|
shl ebx,4
|
|
mov esi,[screen_ptr]
|
|
movzx eax,word[size_x_var]
|
|
movzx ecx,word[size_y_var]
|
|
mul ecx
|
|
lea ecx,[eax*4]
|
|
if (Ext = MMX)|(Ext = SSE)
|
|
mov bh,bl
|
|
push bx
|
|
shl ebx,16
|
|
pop bx
|
|
push ebx
|
|
push ebx
|
|
movq mm0,[esp]
|
|
add esp,8
|
|
else if Ext >=SSE2
|
|
mov bh,bl
|
|
push bx
|
|
shl ebx,16
|
|
pop bx
|
|
movd xmm0,ebx
|
|
shufps xmm0,xmm0,0
|
|
end if
|
|
.oop1:
|
|
if Ext=NON
|
|
lodsb
|
|
sub al,bl
|
|
jb @f
|
|
mov [esi-1],al
|
|
loop .oop1
|
|
@@:
|
|
mov byte[esi-1],0
|
|
loop .oop1
|
|
else if (Ext = MMX)|(Ext=SSE)
|
|
movq mm1,[esi]
|
|
psubusb mm1,mm0
|
|
movq [esi],mm1
|
|
add esi,8
|
|
sub ecx,8
|
|
jnz .oop1
|
|
else
|
|
movaps xmm1,[esi]
|
|
psubusb xmm1,xmm0
|
|
movaps [esi],xmm1
|
|
add esi,16
|
|
sub ecx,16
|
|
jnc .oop1
|
|
end if
|
|
.no_dec_bright:
|
|
|
|
|
|
RDTSC
|
|
sub eax,[esp]
|
|
sub eax,41
|
|
; pop eax
|
|
|
|
mov ecx,10
|
|
.dc:
|
|
xor edx,edx
|
|
mov edi,10
|
|
div edi
|
|
add dl,30h
|
|
mov [STRdata+ecx-1],dl
|
|
loop .dc
|
|
pop eax
|
|
|
|
|
|
mov eax,7 ; put image
|
|
mov ebx,[screen_ptr]
|
|
mov ecx,[size_y_var]
|
|
mov edx,[offset_y]
|
|
cmp [ray_shd_flag],1
|
|
jge .ff
|
|
cmp [dr_flag],11
|
|
jge .ff
|
|
int 0x40
|
|
jmp .f
|
|
.ff:
|
|
mov eax,65
|
|
mov esi,32
|
|
xor ebp,ebp
|
|
int 0x40
|
|
.f:
|
|
mov eax,13
|
|
mov bx,[size_x_var]
|
|
add ebx,18
|
|
shl ebx,16
|
|
mov bx,60
|
|
mov cx,[size_y_var]
|
|
sub cx,2
|
|
shl ecx,16
|
|
mov cx,9
|
|
xor edx,edx
|
|
int 40h
|
|
|
|
mov eax,4 ; function 4 : write text to window
|
|
mov bx,[size_x_var]
|
|
add ebx,18
|
|
shl ebx,16
|
|
mov bx,[size_y_var]
|
|
sub bx,2 ; [x start] *65536 + [y start]
|
|
mov ecx,0x00888888
|
|
mov edx,STRdata ; pointer to text beginning
|
|
mov esi,10 ; text length
|
|
int 40h
|
|
|
|
|
|
|
|
jmp still
|
|
|
|
;--------------------------------------------------------------------------------
|
|
;-------------------------PROCEDURES---------------------------------------------
|
|
;--------------------------------------------------------------------------------
|
|
include "flat_cat.inc"
|
|
include "tex_cat.inc"
|
|
include "bump_cat.inc"
|
|
include "3dmath.inc"
|
|
include "grd_line.inc"
|
|
include "b_procs.inc"
|
|
include "a_procs.inc"
|
|
include "grd_cat.inc"
|
|
include "bump_tex.inc"
|
|
include "grd_tex.inc"
|
|
include "two_tex.inc"
|
|
include "asc.inc"
|
|
if Ext >= SSE3
|
|
include "3r_phg.inc"
|
|
include '3stencil.inc'
|
|
include '3glass.inc'
|
|
include '3glass_tex.inc'
|
|
include '3ray_shd.inc'
|
|
end if
|
|
clear_vertices_index:
|
|
mov edi,[vertices_index_ptr]
|
|
movzx eax,word[size_x_var]
|
|
movzx ecx,word[size_y_var]
|
|
imul ecx,eax
|
|
xor eax,eax
|
|
shr ecx,1
|
|
rep stosd
|
|
ret
|
|
edit: ; mmx required, edit mesh by vertex
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,128
|
|
|
|
.y_coord equ ebp-2
|
|
.x_coord equ ebp-4
|
|
.points_translated equ ebp-10
|
|
.points equ ebp-22
|
|
.points_rotated equ ebp-34
|
|
.mx equ ebp-70
|
|
|
|
macro check_bar
|
|
{
|
|
movzx ebx,word[.x_coord]
|
|
movzx ecx,word[.y_coord]
|
|
movzx edx,word[size_x_var]
|
|
imul edx,ecx
|
|
add ebx,edx
|
|
push ebx
|
|
lea ecx,[ebx*2]
|
|
lea ebx,[ebx*3]
|
|
|
|
cmp [dr_flag],12
|
|
jl @f
|
|
add ebx,[esp]
|
|
@@:
|
|
add esp,4
|
|
add ebx,[screen_ptr]
|
|
mov ebx,[ebx]
|
|
and ebx,0x00ffffff
|
|
cmp ebx,0x00ff0000 ; is handle bar ?
|
|
}
|
|
|
|
emms
|
|
mov eax,37 ; get mouse state
|
|
mov ebx,1 ; x = 5, y = 25 - offsets
|
|
int 0x40
|
|
|
|
mov ebx,[offset_y] ;5 shl 16 + 25
|
|
movd mm0,ebx
|
|
movd mm1,eax
|
|
movd mm3,[size_y_var]
|
|
pcmpgtw mm0,mm1
|
|
pcmpgtw mm3,mm1
|
|
pxor mm3,mm0
|
|
movd eax,mm3
|
|
mov cx,ax
|
|
shr eax,16
|
|
and ax,cx
|
|
or ax,ax
|
|
jz .no_edit
|
|
|
|
|
|
movd mm0,ebx
|
|
psubw mm1,mm0
|
|
movd eax,mm1
|
|
|
|
; store both x and y coordinates
|
|
ror eax,16
|
|
; push eax
|
|
; sub esp,256
|
|
mov [.x_coord],eax
|
|
test word[mouse_state],100000000b
|
|
jz .not_press ; check if left mouse button press
|
|
|
|
; left button pressed
|
|
|
|
|
|
check_bar
|
|
jne .no_edit
|
|
add ecx,[vertices_index_ptr]
|
|
mov cx,word[ecx]
|
|
inc cx
|
|
|
|
|
|
mov [vertex_edit_no],cx ;if vert_edit_no = 0, no vertex selected
|
|
|
|
mov eax,dword[.x_coord]
|
|
mov dword[edit_end_x],eax
|
|
mov dword[edit_start_x],eax
|
|
jmp .end
|
|
.not_press:
|
|
test byte[mouse_state],1b ; check if left button is held
|
|
jz .not_held
|
|
; check_bar
|
|
; jne .no_edit
|
|
; add ecx,[vertices_index_ptr]
|
|
; mov cx,[ecx]
|
|
; inc cx
|
|
cmp [vertex_edit_no],0 ; cx ; vertex number
|
|
je .end
|
|
push dword[.x_coord]
|
|
pop dword[edit_end_x]
|
|
jmp .end
|
|
.not_held:
|
|
shr [mouse_state],16
|
|
test byte[mouse_state],1b ; test if left button released
|
|
jz .end
|
|
check_bar
|
|
jne .end
|
|
|
|
movzx esi,[vertex_edit_no]
|
|
dec esi
|
|
lea esi,[esi*3]
|
|
add esi,esi
|
|
add esi,[points_translated_ptr]
|
|
emms
|
|
|
|
movd mm1,dword[esi]
|
|
paddw mm1,mm0
|
|
psubw mm1,qword[vect_x]
|
|
movd dword[esi],mm1
|
|
|
|
lea edi,[.points]
|
|
; detranslate
|
|
fninit
|
|
fild word[esi+4]
|
|
fstp dword[edi+8]
|
|
fild word[esi+2]
|
|
fisub word[offset_x]
|
|
fstp dword[edi+4]
|
|
fild word[esi]
|
|
fisub word[offset_y] ; proteza
|
|
fstp dword[edi]
|
|
|
|
mov esi,matrix
|
|
lea edi,[.mx]
|
|
call reverse_mx_3x3
|
|
|
|
lea esi,[.points]
|
|
lea edi,[.points_rotated]
|
|
lea ebx,[.mx]
|
|
mov ecx,1
|
|
call rotary
|
|
|
|
; inject into vertex list
|
|
movzx edi,[vertex_edit_no]
|
|
dec edi
|
|
lea edi,[edi*3]
|
|
shl edi,2
|
|
add edi,[points_ptr]
|
|
lea esi,[.points_rotated]
|
|
cld
|
|
movsd
|
|
movsd
|
|
movsd
|
|
; mov ecx,3
|
|
; cld
|
|
; rep movsd
|
|
|
|
|
|
mov dword[edit_end_x],0
|
|
mov [vertex_edit_no],0
|
|
|
|
.no_edit:
|
|
.end:
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
|
|
alloc_buffer_mem:
|
|
push ebp
|
|
mov ebp,esp
|
|
.temp equ ebp-4
|
|
push dword 0
|
|
|
|
mov eax, 68
|
|
mov ebx, 11
|
|
int 0x40 ; -> create heap, to be sure
|
|
|
|
|
|
movzx ecx,word[size_x_var]
|
|
movzx eax,word[size_y_var]
|
|
mul ecx
|
|
|
|
mov [.temp],eax
|
|
lea ecx,[eax*4] ; more mem for r_phg cause
|
|
add ecx,256
|
|
mov eax,68
|
|
mov ebx,20
|
|
mov edx,[screen_ptr]
|
|
int 0x40
|
|
mov [screen_ptr],eax
|
|
|
|
mov ecx,[.temp]
|
|
shl ecx,2
|
|
add ecx,256
|
|
mov eax,68
|
|
mov ebx,20
|
|
mov edx,[Zbuffer_ptr]
|
|
int 0x40
|
|
mov [Zbuffer_ptr],eax
|
|
|
|
|
|
mov ecx,[.temp]
|
|
add ecx,ecx
|
|
add ecx,256
|
|
mov eax,68
|
|
mov ebx,20
|
|
mov edx,[vertices_index_ptr]
|
|
int 0x40
|
|
mov [vertices_index_ptr],eax
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
|
|
|
|
|
|
|
|
update_flags:
|
|
; updates flags and writing flag description
|
|
; in ah - button number
|
|
push ax
|
|
mov edi,menu
|
|
.ch_another:
|
|
cmp ah,byte[edi] ; ah = button id
|
|
jne @f
|
|
mov bl,byte[edi+11] ; max_flag + 1
|
|
cmp bl,255
|
|
je .no_write
|
|
inc byte[edi+12] ; flag
|
|
cmp byte[edi+12],bl
|
|
jne .write
|
|
mov byte[edi+12],0
|
|
jmp .write
|
|
@@:
|
|
add edi,17
|
|
cmp byte[edi],-1
|
|
jne .ch_another
|
|
jmp .no_write
|
|
.write:
|
|
; clreol {pascal never dies}
|
|
; * eax = 13 - function number
|
|
; * ebx = [coordinate on axis x]*65536 + [size on axis x]
|
|
; * ecx = [coordinate on axis y]*65536 + [size on axis y]
|
|
; * edx = color 0xRRGGBB or 0x80RRGGBB for gradient fill
|
|
|
|
mov eax,13 ; function 13 write rectangle
|
|
movzx ecx,byte[edi]
|
|
sub cl,2
|
|
lea ecx,[ecx*3]
|
|
lea ecx,[ecx*5]
|
|
add ecx,28
|
|
shl ecx,16
|
|
add ecx,14 ; ecx = [coord y]*65536 + [size y]
|
|
mov bx,[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(12+70)*65536+25 ; [x start] *65536 + [size x]
|
|
mov edx,0x00000000 ; color 0x00RRGGBB
|
|
int 0x40
|
|
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,byte[edi]
|
|
sub bl,2
|
|
lea ebx,[ebx*3]
|
|
lea ebx,[ebx*5]
|
|
mov cx,[size_x_var]
|
|
shl ecx,16
|
|
add ebx,ecx
|
|
add ebx,(12+70)*65536+28 ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
movzx edx,byte[edi+12] ; current flag
|
|
shl edx,2 ; * 4 = text length
|
|
add edx,dword[edi+13] ; pointer to text beginning
|
|
mov esi,4 ; text length -
|
|
; flag description 4 characters
|
|
int 0x40
|
|
|
|
.no_write:
|
|
pop ax
|
|
ret
|
|
normalize_all_light_vectors:
|
|
mov edi,lights
|
|
@@:
|
|
call normalize_vector ; 3dmath.inc
|
|
add edi,LIGHT_SIZE
|
|
cmp edi,lightsend ;ecx
|
|
jl @b
|
|
ret
|
|
|
|
calc_bumpmap_coords: ; map texture, bump
|
|
;macro .comment222
|
|
; ; planar mapping
|
|
; mov esi,points
|
|
; mov edi,tex_points
|
|
; @@:
|
|
; add esi,2
|
|
; movsd
|
|
; cmp dword[esi],dword -1
|
|
; jne @b
|
|
|
|
; .Pi2 equ dword[ebp-4]
|
|
|
|
; mov ebp,esp
|
|
; sub esp,4
|
|
|
|
fninit
|
|
fldpi
|
|
fadd st,st
|
|
mov esi,[points_ptr]
|
|
mov edi,[tex_points_ptr]
|
|
mov ecx,[points_count_var]
|
|
inc ecx
|
|
; cmp [map_tex_flag],1
|
|
; jne .cylindric
|
|
; spherical mapping around y axle
|
|
|
|
@@:
|
|
fld dword[esi] ; x coord
|
|
fld dword[esi+8] ; z coord
|
|
fpatan ; arctg(st1/st)
|
|
; fdiv .Pi2
|
|
fdiv st0,st1
|
|
fimul [tex_x_div2]
|
|
fiadd [tex_x_div2]
|
|
fistp word[edi] ; x
|
|
|
|
fld dword[esi+4] ; y coord
|
|
fld dword[esi] ; x
|
|
fmul st,st0
|
|
fld dword[esi+4] ; y
|
|
fmul st,st0
|
|
fld dword[esi+8] ; z
|
|
fmul st,st0
|
|
faddp
|
|
faddp
|
|
fsqrt
|
|
fpatan
|
|
fldpi
|
|
fdivp
|
|
fimul [tex_y_div2]
|
|
fiadd [tex_y_div2]
|
|
fistp word[edi+2] ; y
|
|
|
|
add esi,12
|
|
add edi,4
|
|
loop @b
|
|
ffree st0
|
|
; jmp .end_map
|
|
; .cylindric:
|
|
; fld dword[esi] ; around y axle
|
|
; fld dword[esi+8]
|
|
; fpatan
|
|
; fdiv st0,st1
|
|
; fimul [tex_x_div2]
|
|
; fiadd [tex_x_div2]
|
|
; fistp word[edi]
|
|
|
|
; fld dword[esi+4]
|
|
; fimul [tex_y_div2]
|
|
; fiadd [tex_y_div2]
|
|
; fistp word[edi+2]
|
|
|
|
; add esi,12
|
|
; add edi,4
|
|
; loop .cylindric
|
|
; ffree st0
|
|
;; mov esp,ebp
|
|
; .end_map:
|
|
ret
|
|
|
|
|
|
init_envmap2: ; do env_map using many light sources
|
|
;env_map 512 x 512 x 3 bytes
|
|
.temp equ word [ebp-2]
|
|
.nEy equ word [ebp-4]
|
|
.nEx equ word [ebp-6]
|
|
.col_r equ [ebp-8]
|
|
.col_g equ [ebp-9]
|
|
.col_b equ [ebp-10]
|
|
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,20
|
|
mov edi,envmap
|
|
fninit
|
|
|
|
mov dx,- TEX_Y / 2 ;256 ; dx - vertical coordinate = y
|
|
.ie_ver:
|
|
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
|
|
.ie_hor:
|
|
xor ebx,ebx
|
|
mov dword .col_b, 0
|
|
.light:
|
|
lea esi,[lights+ebx]
|
|
fld dword[esi] ; light vector x cooficient
|
|
fimul [tex_x_div2] ;[i256]
|
|
mov .temp,cx
|
|
fisubr .temp
|
|
fistp .nEx
|
|
fld dword[esi+4] ; light vector y cooficient
|
|
fimul [tex_y_div2] ;[i256]
|
|
mov .temp,dx
|
|
fisubr .temp
|
|
fistp .nEy
|
|
|
|
cmp .nEx,- TEX_X / 2 ;256
|
|
jl .update_counters
|
|
cmp .nEy,- TEX_Y / 2 ;256
|
|
jl .update_counters
|
|
cmp .nEx,TEX_X / 2 ;256
|
|
jg .update_counters
|
|
cmp .nEy,TEX_Y / 2 ;256
|
|
jg .update_counters
|
|
|
|
fild .nEx
|
|
fmul st,st0
|
|
fild .nEy
|
|
fmul st,st0
|
|
faddp
|
|
fsqrt
|
|
fisubr [i256]
|
|
fmul [env_const]
|
|
fidiv [i256] ; st - 'virtual' dot product
|
|
|
|
fcom [dot_max]
|
|
fstsw ax
|
|
sahf
|
|
jb @f
|
|
ffree st
|
|
fld1 ;[dot_max]
|
|
@@:
|
|
fcom [dot_min]
|
|
fstsw ax
|
|
sahf
|
|
ja @f
|
|
ffree st
|
|
fldz ;[dot_min]
|
|
@@:
|
|
push ebp
|
|
movzx ax,byte[esi+21]
|
|
push ax ;- shines
|
|
mov al,byte[esi+14] ; b orginal color
|
|
push ax
|
|
mov al,byte[esi+13] ; g
|
|
push ax
|
|
mov al,byte[esi+12] ; r
|
|
push ax
|
|
mov al,byte[esi+20] ; b max color
|
|
push ax
|
|
mov al,byte[esi+19] ; g
|
|
push ax
|
|
mov al,byte[esi+18] ; r
|
|
push ax
|
|
mov al,byte[esi+17] ; b min col
|
|
push ax
|
|
mov al,byte[esi+16] ; g
|
|
push ax
|
|
mov al,byte[esi+15] ; r
|
|
push ax
|
|
push eax ; earlier - dot pr
|
|
; fstp .dot_product
|
|
; push .dot_product
|
|
call calc_one_col
|
|
pop ebp
|
|
; eax-0x00rrggbb
|
|
cmp al,.col_b
|
|
jbe @f
|
|
mov .col_b,al
|
|
@@: ; eax - ggbb00rr
|
|
shr ax,8
|
|
cmp al,.col_g
|
|
jbe @f
|
|
mov .col_g,al
|
|
@@: ; eax - bb0000gg
|
|
shr eax,16
|
|
cmp al,.col_r
|
|
jbe @f
|
|
mov .col_r,al
|
|
@@:
|
|
.update_counters: ; update and jump when neccesery
|
|
add ebx,LIGHT_SIZE
|
|
cmp bx,[all_lights_size]
|
|
jl .light ; next_light
|
|
mov eax,dword .col_b
|
|
stosd
|
|
dec edi
|
|
|
|
inc cx
|
|
cmp cx,TEX_X / 2 ;256
|
|
jne .ie_hor
|
|
|
|
inc dx
|
|
cmp dx,TEX_Y / 2 ;256
|
|
jne .ie_ver
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
do_color_buffer: ; do color buffer for Gouraud, flat shading
|
|
;env_map 512 x 512 x 3 bytes ; many lights using
|
|
.temp equ word [ebp-2]
|
|
.nz equ dword [ebp-6] ; dword
|
|
.ny equ dword [ebp-10]
|
|
.nx equ dword [ebp-14]
|
|
.col_r equ [ebp-16]
|
|
.col_g equ [ebp-17]
|
|
.col_b equ [ebp-18]
|
|
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,20
|
|
mov edi,color_map
|
|
fninit
|
|
|
|
mov dx,- TEX_Y / 2 ;-256 ; dx - vertical coordinate = y
|
|
.ie_ver:
|
|
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
|
|
.ie_hor:
|
|
mov .temp,cx
|
|
fild .temp
|
|
fidiv [i256] ;st = Nx - vector normal x cooficient
|
|
fst .nx
|
|
fmul st,st0
|
|
mov .temp,dx
|
|
fild .temp
|
|
fidiv [i256] ; st = Ny - vector normal y coeficient
|
|
fst .ny
|
|
fmul st,st0
|
|
faddp
|
|
fld1
|
|
fchs
|
|
faddp
|
|
fabs
|
|
fsqrt
|
|
fchs
|
|
fstp .nz ; st - Nz - vect normal z coeficient
|
|
xor ebx,ebx
|
|
mov dword .col_b, 0
|
|
.light:
|
|
push edi ;env_map
|
|
lea esi,[lights+ebx]
|
|
lea edi,.nx
|
|
call dot_product
|
|
pop edi
|
|
fcom [dot_min]
|
|
fstsw ax
|
|
sahf
|
|
ja .env_ok1 ;compare with dot_max
|
|
ffree st
|
|
|
|
jmp .update_counters
|
|
.env_ok1:
|
|
fcom [dot_max]
|
|
fstsw ax
|
|
sahf
|
|
jb .env_ok2 ; calc col
|
|
ffree st
|
|
jmp .update_counters
|
|
.env_ok2: ;calc col
|
|
push ebp
|
|
movzx ax,byte[esi+21]
|
|
push ax ;- shines
|
|
mov al,byte[esi+14] ; b orginal color
|
|
push ax
|
|
mov al,byte[esi+13] ; g
|
|
push ax
|
|
mov al,byte[esi+12] ; r
|
|
push ax
|
|
mov al,byte[esi+20] ; b max color
|
|
push ax
|
|
mov al,byte[esi+19] ; g
|
|
push ax
|
|
mov al,byte[esi+18] ; r
|
|
push ax
|
|
mov al,byte[esi+17] ; b min col
|
|
push ax
|
|
mov al,byte[esi+16] ; g
|
|
push ax
|
|
mov al,byte[esi+15] ; r
|
|
push ax
|
|
push eax ; earlier - dot pr
|
|
; fstp .dot_product
|
|
; push .dot_product
|
|
call calc_one_col
|
|
pop ebp
|
|
; eax-0x00rrggbb
|
|
cmp al,.col_b
|
|
jbe @f
|
|
mov .col_b,al
|
|
@@:
|
|
shr ax,8
|
|
cmp al,.col_g
|
|
jbe @f
|
|
mov .col_g,al
|
|
@@:
|
|
shr eax,16
|
|
cmp al,.col_r
|
|
jbe @f
|
|
mov .col_r,al
|
|
@@:
|
|
.update_counters: ; update and jump when neccesery
|
|
add ebx,LIGHT_SIZE
|
|
cmp bx,[all_lights_size]
|
|
jl .light ; next_light
|
|
mov eax,dword .col_b
|
|
stosd
|
|
dec edi
|
|
|
|
inc cx
|
|
cmp cx,TEX_X / 2 ;256
|
|
jne .ie_hor
|
|
|
|
inc dx
|
|
cmp dx,TEX_X / 2 ;256
|
|
jne .ie_ver
|
|
|
|
.env_done:
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
|
|
if Ext >= SSE2
|
|
init_point_normals:
|
|
.z equ dword [ebp-8]
|
|
.y equ dword [ebp-12]
|
|
.x equ [ebp-16]
|
|
.point_number equ dword [ebp-28]
|
|
.hit_faces equ dword [ebp-32]
|
|
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,64
|
|
and ebp,-16
|
|
mov edi,[points_normals_ptr]
|
|
mov .point_number,0
|
|
.ipn_loop:
|
|
movd xmm0,.point_number
|
|
pshufd xmm0,xmm0,0
|
|
mov .hit_faces,0
|
|
mov .x,dword 0
|
|
mov .y,0
|
|
mov .z,0
|
|
mov esi,[triangles_ptr]
|
|
xor ecx,ecx ; ecx - triangle number
|
|
.ipn_check_face:
|
|
movdqu xmm1,[esi]
|
|
pcmpeqd xmm1,xmm0
|
|
pmovmskb eax,xmm1
|
|
and eax,0xfff
|
|
or eax,eax
|
|
jz .ipn_next_face
|
|
push esi
|
|
mov esi,ecx
|
|
lea esi,[esi*3]
|
|
shl esi,2
|
|
add esi,[triangles_normals_ptr]
|
|
movups xmm7,[esi]
|
|
addps xmm7,.x
|
|
movaps .x,xmm7
|
|
pop esi
|
|
inc .hit_faces
|
|
|
|
.ipn_next_face:
|
|
add esi,12
|
|
inc ecx
|
|
cmp ecx,[triangles_count_var]
|
|
jne .ipn_check_face
|
|
cvtsi2ss xmm6,.hit_faces
|
|
movaps xmm7,.x
|
|
|
|
rcpss xmm6,xmm6
|
|
shufps xmm6,xmm6,11000000b
|
|
mulps xmm7,xmm6
|
|
movlps [edi],xmm7
|
|
movhlps xmm7,xmm7
|
|
movss [edi+8],xmm7
|
|
call normalize_vector
|
|
; movaps xmm6,xmm7
|
|
; mulps xmm6,xmm6
|
|
; andps xmm6,[zero_hgst_dd]
|
|
; haddps xmm6,xmm6
|
|
; haddps xmm6,xmm6
|
|
; rsqrtps xmm6,xmm6
|
|
; mulps xmm7,xmm6
|
|
; movlps [edi],xmm7
|
|
; movhlps xmm7,xmm7
|
|
; movss [edi+8],xmm7
|
|
|
|
add edi,12
|
|
inc .point_number
|
|
mov edx,.point_number
|
|
cmp edx,[points_count_var]
|
|
jne .ipn_loop
|
|
|
|
add esp,64
|
|
pop ebp
|
|
ret
|
|
else
|
|
init_point_normals:
|
|
.x equ dword [ebp-4]
|
|
.y equ dword [ebp-8]
|
|
.z equ dword [ebp-12]
|
|
.point_number equ dword [ebp-28]
|
|
.hit_faces equ dword [ebp-32]
|
|
|
|
fninit
|
|
mov ebp,esp
|
|
sub esp,32
|
|
mov edi,[points_normals_ptr]
|
|
mov .point_number,0
|
|
.ipn_loop:
|
|
mov .hit_faces,0
|
|
mov .x,0
|
|
mov .y,0
|
|
mov .z,0
|
|
mov esi,[triangles_ptr]
|
|
xor ecx,ecx ; ecx - triangle number
|
|
.ipn_check_face:
|
|
xor ebx,ebx ; ebx - 'position' in one triangle
|
|
.ipn_check_vertex:
|
|
mov eax,dword[esi+ebx] ; eax - point_number
|
|
cmp eax,.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_ptr]
|
|
|
|
fld .x
|
|
fadd dword[esi+vec_x] ; vec_x this defined in 3dmath.asm - x cooficient
|
|
fstp .x ; of normal vactor
|
|
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,4
|
|
cmp ebx,12
|
|
jne .ipn_check_vertex
|
|
.ipn_next_face:
|
|
add esi,12
|
|
inc ecx
|
|
cmp ecx,[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 edx,.point_number
|
|
cmp edx,[points_count_var]
|
|
jne .ipn_loop
|
|
|
|
mov esp,ebp
|
|
ret
|
|
;===============================================================
|
|
end if
|
|
init_triangles_normals2:
|
|
mov ebx,[triangles_normals_ptr]
|
|
mov ebp,[triangles_ptr]
|
|
mov ecx,[triangles_count_var]
|
|
@@:
|
|
push ecx
|
|
push ebx
|
|
mov ebx,vectors
|
|
mov esi,dword[ebp] ; first point index
|
|
lea esi,[esi*3]
|
|
; lea esi,[points+esi*2] ; esi - pointer to 1st 3d point
|
|
shl esi,2
|
|
add esi,[points_ptr]
|
|
mov edi,dword[ebp+4] ; first point index
|
|
lea edi,[edi*3]
|
|
shl edi,2
|
|
add edi,[points_ptr]
|
|
; 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_r
|
|
add ebx,12
|
|
mov esi,edi
|
|
mov edi,dword[ebp+8] ; third point index
|
|
lea edi,[edi*3]
|
|
shl edi,2
|
|
add edi,[points_ptr]
|
|
; lea edi,[points+edi*2]
|
|
call make_vector_r
|
|
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,12
|
|
add ebx,12
|
|
pop ecx
|
|
sub ecx,1
|
|
jnz @b
|
|
ret
|
|
|
|
|
|
copy_lights: ; after normalising !
|
|
mov esi,lights
|
|
mov edi,lights_aligned
|
|
mov ecx,3
|
|
.again:
|
|
push ecx
|
|
mov ecx,3
|
|
cld
|
|
rep movsd
|
|
xor eax,eax
|
|
stosd
|
|
mov ecx,3
|
|
.b:
|
|
push ecx
|
|
mov ecx,3
|
|
@@:
|
|
movzx ebx,byte[esi]
|
|
cvtsi2ss xmm0,ebx
|
|
movss [edi],xmm0
|
|
inc esi
|
|
add edi,4
|
|
loop @b
|
|
stosd
|
|
pop ecx
|
|
loop .b
|
|
inc esi ; skip shiness
|
|
pop ecx
|
|
loop .again
|
|
ret
|
|
|
|
|
|
clrscr:
|
|
mov edi,[screen_ptr]
|
|
movzx ecx,word[size_x_var]
|
|
movzx eax,word[size_y_var]
|
|
imul ecx,eax
|
|
|
|
|
|
xor eax,eax
|
|
if Ext=NON
|
|
rep stosd
|
|
else if Ext = MMX
|
|
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
|
|
else
|
|
push ecx
|
|
mov ecx,edi
|
|
and ecx,0x0000000f
|
|
rep stosb
|
|
pop ecx
|
|
and ecx,0xfffffff0
|
|
xorps xmm0,xmm0
|
|
@@:
|
|
movaps [edi],xmm0
|
|
movaps [edi+16],xmm0
|
|
movaps [edi+32],xmm0
|
|
movaps [edi+48],xmm0
|
|
add edi,64
|
|
sub ecx,16
|
|
jnz @b
|
|
end if
|
|
|
|
ret
|
|
|
|
|
|
draw_triangles:
|
|
; in: eax - render draw model
|
|
.tri_no equ dword[ebp-60]
|
|
.point_index3 equ [ebp-8]
|
|
.point_index2 equ [ebp-12]
|
|
.point_index1 equ [ebp-16]
|
|
.yy3 equ [ebp-18]
|
|
.xx3 equ [ebp-20]
|
|
.yy2 equ [ebp-22]
|
|
.xx2 equ [ebp-24]
|
|
.yy1 equ [ebp-26]
|
|
.xx1 equ [ebp-28]
|
|
|
|
.zz3 equ [ebp-30]
|
|
.zz2 equ [ebp-32]
|
|
.zz1 equ [ebp-34]
|
|
.index3x12 equ [ebp-38]
|
|
.index2x12 equ [ebp-42]
|
|
.index1x12 equ [ebp-46]
|
|
.temp1 equ dword[ebp-50]
|
|
.temp2 equ dword[ebp-54]
|
|
.dr_flag equ word[ebp-56]
|
|
|
|
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,60
|
|
|
|
; movzx ax,[dr_flag]
|
|
mov .dr_flag,ax
|
|
|
|
|
|
emms
|
|
; update translated list MMX required
|
|
cmp [vertex_edit_no],0
|
|
je @f
|
|
movzx eax,[vertex_edit_no]
|
|
dec eax
|
|
movd mm0,[edit_end_x]
|
|
psubw mm0,[edit_start_x]
|
|
lea eax,[eax*3]
|
|
add eax,eax
|
|
add eax,[points_translated_ptr]
|
|
movd mm1,dword[eax]
|
|
paddw mm1,mm0
|
|
movd dword[eax],mm1
|
|
@@:
|
|
if Ext >= SSE3
|
|
|
|
cmp .dr_flag,13
|
|
jnge .no_stencil
|
|
mov esi,[triangles_ptr]
|
|
mov ecx,[triangles_count_var]
|
|
@@:
|
|
push esi
|
|
push ecx
|
|
|
|
mov eax,[esi]
|
|
mov ebx,[esi+4]
|
|
mov ecx,[esi+8]
|
|
imul eax,[i12]
|
|
imul ebx,[i12]
|
|
imul ecx,[i12]
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
add ecx,[points_rotated_ptr]
|
|
push dword[ecx+8]
|
|
push dword[ebx+8]
|
|
push dword[eax+8]
|
|
movups xmm0,[esp]
|
|
add esp,12
|
|
andps xmm0,[zero_hgst_dd]
|
|
|
|
|
|
mov eax,[esi]
|
|
mov ebx,[esi+4]
|
|
mov ecx,[esi+8]
|
|
shl eax,1
|
|
shl ebx,1
|
|
shl ecx,1
|
|
lea eax,[eax*3]
|
|
lea ebx,[ebx*3]
|
|
lea ecx,[ecx*3]
|
|
add eax,[points_translated_ptr]
|
|
add ebx,[points_translated_ptr]
|
|
add ecx,[points_translated_ptr]
|
|
mov eax,[eax]
|
|
mov ebx,[ebx]
|
|
mov ecx,[ecx]
|
|
ror eax,16
|
|
ror ebx,16
|
|
ror ecx,16
|
|
|
|
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call stencil_tri
|
|
|
|
pop ecx
|
|
pop esi
|
|
add esi,12
|
|
dec ecx
|
|
jnz @b
|
|
|
|
.no_stencil:
|
|
end if
|
|
|
|
|
|
cmp [dr_flag],11
|
|
je .draw_smooth_line
|
|
|
|
mov esi,[triangles_ptr]
|
|
xor ecx,ecx ;mov ecx,[triangles_count_var]
|
|
.again_dts:
|
|
; push ebp
|
|
push esi
|
|
push ecx
|
|
mov .tri_no,ecx
|
|
|
|
mov eax,[esi]
|
|
mov ebx,[esi+4]
|
|
mov ecx,[esi+8]
|
|
|
|
mov .point_index1,eax
|
|
mov .point_index2,ebx
|
|
mov .point_index3,ecx
|
|
imul eax,[i12]
|
|
imul ebx,[i12]
|
|
imul ecx,[i12]
|
|
mov .index1x12,eax
|
|
mov .index2x12,ebx
|
|
mov .index3x12,ecx
|
|
|
|
shr eax,1
|
|
shr ebx,1
|
|
shr ecx,1
|
|
add eax,[points_translated_ptr]
|
|
add ebx,[points_translated_ptr]
|
|
add ecx,[points_translated_ptr]
|
|
push word[eax+4]
|
|
push word[ebx+4]
|
|
push word[ecx+4]
|
|
pop word .zz3
|
|
pop word .zz2
|
|
pop word .zz1
|
|
|
|
mov eax,[eax]
|
|
mov ebx,[ebx]
|
|
mov ecx,[ecx]
|
|
ror eax,16
|
|
ror ebx,16
|
|
ror ecx,16
|
|
mov .xx1,eax
|
|
mov .xx2,ebx
|
|
mov .xx3,ecx
|
|
|
|
|
|
|
|
; push esi
|
|
fninit ; DO culling AT FIRST
|
|
cmp [culling_flag],1 ; (if culling_flag = 1)
|
|
jne .no_culling
|
|
lea esi,.point_index1 ; *********************************
|
|
mov ecx,3 ;
|
|
@@:
|
|
mov eax,dword[esi]
|
|
lea eax,[eax*3]
|
|
shl eax,2
|
|
add eax,[points_normals_rot_ptr]
|
|
mov eax,[eax+8]
|
|
bt eax,31
|
|
jc @f
|
|
; *****************************
|
|
; CHECKING OF Z COOFICIENT OF
|
|
; NORMAL VECTOR
|
|
add esi,4
|
|
loop @b
|
|
jmp .end_draw ; non visable
|
|
@@:
|
|
|
|
.no_culling:
|
|
cmp .dr_flag,0 ; draw type flag
|
|
je .flat_draw
|
|
cmp .dr_flag,2
|
|
je .env_mapping
|
|
cmp .dr_flag,3
|
|
je .bump_mapping
|
|
cmp .dr_flag,4
|
|
je .tex_mapping
|
|
cmp .dr_flag,5
|
|
je .rainbow
|
|
cmp .dr_flag,7
|
|
je .grd_tex
|
|
cmp .dr_flag,8
|
|
je .two_tex
|
|
cmp .dr_flag,9
|
|
je .bump_tex
|
|
cmp .dr_flag,10
|
|
je .cubic_env_mapping
|
|
cmp .dr_flag,11
|
|
je .draw_smooth_line
|
|
if Ext >= SSE3
|
|
cmp .dr_flag,12
|
|
je .r_phg
|
|
cmp .dr_flag,13
|
|
je .glass
|
|
cmp .dr_flag,14
|
|
je .glass_tex
|
|
cmp .dr_flag,100
|
|
je .ray_shd
|
|
|
|
end if
|
|
|
|
push ebp ; ****************
|
|
lea esi,.index3x12 ; do Gouraud shading
|
|
lea edi,.zz3
|
|
mov ecx,3
|
|
.again_grd_draw:
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr]
|
|
; texture x=(rotated point normal -> x * 255)+255
|
|
fld dword[eax] ; x cooficient of normal vector
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp1
|
|
; texture y=(rotated point normal -> y * 255)+255
|
|
fld dword[eax+4] ; y cooficient
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp2
|
|
|
|
mov eax,.temp2
|
|
mov ebx,.temp1
|
|
and ebx,0xfffffff
|
|
shl eax,TEX_SHIFT
|
|
add eax,ebx
|
|
lea eax,[eax*3+color_map]
|
|
mov eax,dword[eax]
|
|
push word[edi] ; zz1 ,2 ,3
|
|
|
|
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
|
|
xor ah,ah
|
|
push ax ;r
|
|
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
|
|
xor ah,ah
|
|
push ax ;g
|
|
shr eax,24
|
|
push ax ;b
|
|
|
|
sub esi,4
|
|
sub edi,2
|
|
dec cx
|
|
jnz .again_grd_draw
|
|
jmp .both_draw
|
|
|
|
.rainbow:
|
|
push ebp
|
|
push word .zz3
|
|
|
|
mov eax, .xx3
|
|
ror eax,16
|
|
mov ebx,0x00ff00ff
|
|
and eax,ebx
|
|
push eax
|
|
neg al
|
|
push ax
|
|
push word .zz2
|
|
|
|
mov eax, .xx2
|
|
ror eax,16
|
|
and eax,ebx
|
|
push eax
|
|
neg al
|
|
push ax
|
|
push word .zz1
|
|
|
|
mov eax, .xx1
|
|
ror eax,16
|
|
and eax,ebx
|
|
push eax
|
|
neg al
|
|
push ax
|
|
.both_draw:
|
|
mov eax, .xx1
|
|
mov ebx, .xx2
|
|
mov ecx, .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,[Zbuffer_ptr]
|
|
call gouraud_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
.flat_draw: ;**************************
|
|
fninit ; FLAT DRAWING
|
|
mov eax,.index1x12
|
|
mov ebx,.index2x12
|
|
mov ecx,.index3x12
|
|
add eax,[points_normals_rot_ptr]
|
|
add ebx,[points_normals_rot_ptr]
|
|
add ecx,[points_normals_rot_ptr]
|
|
fld dword[eax] ; x cooficient of normal vector
|
|
fadd dword[ebx]
|
|
fadd dword[ecx]
|
|
fidiv [i3]
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp1 ;dword[esp-4] ; x temp variables
|
|
fld dword[eax+4] ; y cooficient of normal vector
|
|
fadd dword[ebx+4]
|
|
fadd dword[ecx+4]
|
|
fidiv [i3]
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp2 ;dword[esp-8] ; y
|
|
mov edx,.temp2 ;dword[esp-8]
|
|
and edx,0xfffffff
|
|
and .temp1,0xfffffff
|
|
shl edx,TEX_SHIFT
|
|
add edx,.temp1 ;dword[esp-4]
|
|
|
|
lea eax,[3*edx]
|
|
add eax,color_map
|
|
mov edx,dword[eax]
|
|
|
|
and edx,0x00ffffff ; edx = 0x00rrggbb
|
|
|
|
|
|
|
|
; 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
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
|
|
mov esi,[Zbuffer_ptr]
|
|
push ebp
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
call flat_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
.env_mapping:
|
|
push ebp
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
|
|
lea esi, .index1x12
|
|
sub esp,12
|
|
mov edi,esp
|
|
mov ecx,3
|
|
@@:
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr] ;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,4
|
|
loop @b
|
|
|
|
mov eax, .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,envmap
|
|
|
|
mov edx,[Zbuffer_ptr]
|
|
call tex_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
.cubic_env_mapping:
|
|
push ebp
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
|
|
lea esi,.index1x12
|
|
sub esp,12
|
|
mov edi,esp
|
|
mov ecx,3
|
|
@@:
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr]
|
|
|
|
fld dword[eax]
|
|
fmul dword[eax+4]
|
|
fld1
|
|
fld1
|
|
faddp
|
|
fmulp
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp word[edi]
|
|
mov word[edi+2],0
|
|
; fistp word[edi+2]
|
|
; # last change
|
|
; ; 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]
|
|
; # end of last ch.
|
|
add edi,4
|
|
add esi,4
|
|
loop @b
|
|
|
|
mov eax, .xx1
|
|
mov ebx, .xx2
|
|
mov ecx, .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,envmap_cub
|
|
mov edx,[Zbuffer_ptr]
|
|
|
|
call tex_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
.bump_mapping:
|
|
push ebp
|
|
push [Zbuffer_ptr]
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
|
|
lea esi,.index1x12
|
|
sub esp,12
|
|
mov edi,esp
|
|
mov ecx,3
|
|
@@:
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr] ;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,4
|
|
loop @b
|
|
|
|
mov esi, .point_index3 ; bump map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,envmap
|
|
mov edx,bumpmap ;BUMP_MAPPING
|
|
|
|
call bump_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
.tex_mapping:
|
|
push ebp
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
; @@:
|
|
mov esi, .point_index3 ; tex map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,texmap
|
|
mov edx,[Zbuffer_ptr]
|
|
|
|
call tex_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
; .ray:
|
|
; grd_triangle according to points index
|
|
; cmp [catmull_flag],0
|
|
; je @f
|
|
; push [zz3] ; spot light with attenuation
|
|
; @@:
|
|
; movzx eax,[point_index3] ; env_map - points color list
|
|
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
|
|
; lea eax,[3*eax+bumpmap]
|
|
; push word[eax]
|
|
; push word[eax+2]
|
|
; push word[eax+4]
|
|
; cmp [catmull_flag],0
|
|
; je @f
|
|
; push [zz2]
|
|
; @@:
|
|
; movzx eax,[point_index2] ; env_map - points color list
|
|
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
|
|
; lea eax,[eax*3+bumpmap]
|
|
; push word[eax]
|
|
; push word[eax+2]
|
|
; push word[eax+4]
|
|
; cmp [catmull_flag],0
|
|
; je @f
|
|
; push [zz1]
|
|
; @@:
|
|
; movzx eax,[point_index1] ; env_map - points color list
|
|
; shl eax,1 ; each color as word, 0xrr00gg00bb00..
|
|
; lea eax,[eax*3+bumpmap]
|
|
; push word[eax]
|
|
; push word[eax+2]
|
|
; push word[eax+4]
|
|
; jmp .both_draw
|
|
|
|
.grd_tex: ; smooth shading + texture
|
|
push ebp
|
|
|
|
mov esi, .point_index3 ; tex map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi] ; texture coords as first
|
|
mov esi, .point_index2 ; group of parameters
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
lea esi, .index3x12
|
|
lea edi, .zz3
|
|
mov ecx,3
|
|
.aagain_grd_draw:
|
|
|
|
push word[edi] ; zz1 ,2 ,3
|
|
fninit
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr]
|
|
; texture x=(rotated point normal -> x * 255)+255
|
|
fld dword[eax] ; x cooficient of normal vector
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp1 ;word[ebp-2]
|
|
; texture y=(rotated point normal -> y * 255)+255
|
|
fld dword[eax+4] ; y cooficient
|
|
fimul [correct_tex]
|
|
fiadd [correct_tex]
|
|
fistp .temp2 ;word[ebp-4]
|
|
|
|
mov eax,.temp2
|
|
mov ebx,.temp1
|
|
and ebx,0xfffffff ; some onjects need this 'and'
|
|
shl eax,TEX_SHIFT
|
|
add eax,ebx
|
|
lea eax,[eax*3]
|
|
add eax,color_map
|
|
mov eax,dword[eax]
|
|
|
|
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
|
|
xor ah,ah
|
|
push ax ;r
|
|
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
|
|
xor ah,ah
|
|
push ax ;g
|
|
shr eax,24
|
|
push ax ;b
|
|
sub edi,2
|
|
sub esi,4
|
|
dec cx
|
|
jnz .aagain_grd_draw
|
|
|
|
mov eax, .xx1
|
|
mov ebx, .xx2
|
|
mov ecx, .xx3
|
|
mov edi,[screen_ptr]
|
|
mov edx,texmap
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call tex_plus_grd_triangle
|
|
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
.two_tex:
|
|
push ebp
|
|
push [Zbuffer_ptr]
|
|
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
|
|
mov esi, .point_index3 ; tex map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
lea esi, .point_index1 ; env coords
|
|
sub esp,12
|
|
mov edi,esp
|
|
mov ecx,3
|
|
@@:
|
|
mov eax,dword[esi]
|
|
lea eax,[eax*3]
|
|
shl eax,2
|
|
add eax,[points_normals_rot_ptr]
|
|
; 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]
|
|
and word[edi+2],0x7fff ; some objects need it
|
|
add edi,4
|
|
add esi,4
|
|
loop @b
|
|
|
|
mov eax, .xx1
|
|
mov ebx, .xx2
|
|
mov ecx, .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,texmap
|
|
mov edx,envmap
|
|
|
|
call two_tex_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
.bump_tex:
|
|
push ebp
|
|
mov esi, .point_index3 ; tex map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
push dword texmap
|
|
|
|
push [Zbuffer_ptr]
|
|
|
|
push word .zz3
|
|
push word .zz2
|
|
push word .zz1
|
|
|
|
lea esi, .index1x12 ; env coords
|
|
sub esp,12
|
|
mov edi,esp
|
|
mov ecx,3
|
|
@@:
|
|
mov eax,dword[esi]
|
|
add eax,[points_normals_rot_ptr]
|
|
; 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,4
|
|
loop @b
|
|
|
|
mov esi, .point_index3 ; bump map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi, .point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,envmap
|
|
mov edx,bumpmap
|
|
|
|
call bump_tex_triangle_z
|
|
pop ebp
|
|
jmp .end_draw
|
|
|
|
|
|
if Ext >= SSE3
|
|
.r_phg:
|
|
|
|
|
|
movd xmm5,[size_y_var]
|
|
punpcklwd xmm5,[the_zero]
|
|
pshufd xmm5,xmm5,01110011b
|
|
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_normals_rot_ptr]
|
|
add ebx,[points_normals_rot_ptr]
|
|
add ecx,[points_normals_rot_ptr]
|
|
movups xmm0,[eax]
|
|
movups xmm1,[ebx]
|
|
movups xmm2,[ecx]
|
|
andps xmm0,[zero_hgst_dd]
|
|
andps xmm1,[zero_hgst_dd]
|
|
andps xmm2,[zero_hgst_dd]
|
|
xorps xmm3,xmm3
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
add ecx,[points_rotated_ptr]
|
|
push dword[ecx+8]
|
|
push dword[ebx+8]
|
|
push dword[eax+8]
|
|
movups xmm4,[esp]
|
|
add esp,12
|
|
andps xmm4,[zero_hgst_dd]
|
|
|
|
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edi,[screen_ptr]
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call real_phong_tri_z
|
|
|
|
jmp .end_draw
|
|
|
|
.glass:
|
|
movd xmm5,[size_y_var]
|
|
punpcklwd xmm5,[the_zero]
|
|
pshufd xmm5,xmm5,01110011b
|
|
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_normals_rot_ptr]
|
|
add ebx,[points_normals_rot_ptr]
|
|
add ecx,[points_normals_rot_ptr]
|
|
movups xmm0,[eax]
|
|
movups xmm1,[ebx]
|
|
movups xmm2,[ecx]
|
|
andps xmm0,[zero_hgst_dd]
|
|
andps xmm1,[zero_hgst_dd]
|
|
andps xmm2,[zero_hgst_dd]
|
|
xorps xmm3,xmm3
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
add ecx,[points_rotated_ptr]
|
|
push dword[ecx+8]
|
|
push dword[ebx+8]
|
|
push dword[eax+8]
|
|
movups xmm4,[esp]
|
|
add esp,12
|
|
andps xmm4,[zero_hgst_dd]
|
|
|
|
|
|
|
|
mov eax, .xx1
|
|
mov ebx, .xx2
|
|
mov ecx, .xx3
|
|
mov edi,[screen_ptr]
|
|
mov edx,[Zbuffer_ptr]
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call glass_tri
|
|
jmp .end_draw
|
|
|
|
|
|
.glass_tex:
|
|
movd xmm5,[size_y_var]
|
|
punpcklwd xmm5,[the_zero]
|
|
pshufd xmm5,xmm5,01110011b
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_normals_rot_ptr]
|
|
add ebx,[points_normals_rot_ptr]
|
|
add ecx,[points_normals_rot_ptr]
|
|
movups xmm0,[eax]
|
|
movups xmm1,[ebx]
|
|
movups xmm2,[ecx]
|
|
andps xmm0,[zero_hgst_dd]
|
|
andps xmm1,[zero_hgst_dd]
|
|
andps xmm2,[zero_hgst_dd]
|
|
xorps xmm3,xmm3
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
add ecx,[points_rotated_ptr]
|
|
push dword[ecx+8]
|
|
push dword[ebx+8]
|
|
push dword[eax+8]
|
|
movups xmm4,[esp]
|
|
add esp,12
|
|
andps xmm4,[zero_hgst_dd]
|
|
|
|
mov esi,.point_index3 ; tex map coords
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi,.point_index2
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
mov esi,.point_index1
|
|
shl esi,2
|
|
add esi,[tex_points_ptr]
|
|
push dword[esi]
|
|
movups xmm6,[esp]
|
|
add esp,12
|
|
; pshuflw xmm6,xmm6,10110001b
|
|
; pshufhw xmm6,xmm6,10110001b
|
|
|
|
movzx eax,word[size_x_var]
|
|
andps xmm6,[zero_hgst_dd]
|
|
movd xmm7,eax
|
|
pslldq xmm7,12
|
|
por xmm6,xmm7
|
|
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edx,texmap
|
|
mov edi,[screen_ptr]
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call glass_tex_tri
|
|
jmp .end_draw
|
|
|
|
.ray_shd:
|
|
emms
|
|
movd xmm5,[size_y_var]
|
|
punpcklwd xmm5,[the_zero]
|
|
pshufd xmm5,xmm5,01110011b
|
|
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_normals_rot_ptr]
|
|
add ebx,[points_normals_rot_ptr]
|
|
add ecx,[points_normals_rot_ptr]
|
|
movups xmm0,[eax]
|
|
movups xmm1,[ebx]
|
|
movups xmm2,[ecx]
|
|
andps xmm0,[zero_hgst_dd]
|
|
andps xmm1,[zero_hgst_dd]
|
|
andps xmm2,[zero_hgst_dd]
|
|
xorps xmm3,xmm3
|
|
|
|
; mov ebx,.tri_no
|
|
; cmp ebx,0
|
|
; je @f
|
|
; int3
|
|
; @@:
|
|
mov eax, .index1x12
|
|
mov ebx, .index2x12
|
|
mov ecx, .index3x12
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
add ecx,[points_rotated_ptr]
|
|
push dword[ecx+8]
|
|
push dword[ebx+8]
|
|
push dword[eax+8]
|
|
movups xmm4,[esp]
|
|
add esp,12
|
|
andps xmm4,[zero_hgst_dd]
|
|
|
|
movd mm7,.tri_no
|
|
|
|
; mm7 - intialised
|
|
|
|
|
|
mov eax,dword .xx1
|
|
mov ebx,dword .xx2
|
|
mov ecx,dword .xx3
|
|
mov edx,texmap
|
|
mov edi,[screen_ptr]
|
|
mov esi,[Zbuffer_ptr]
|
|
|
|
call ray_shad
|
|
|
|
|
|
|
|
end if
|
|
|
|
.end_draw:
|
|
; pop ebp
|
|
pop ecx
|
|
pop esi
|
|
|
|
add esi,12
|
|
inc ecx
|
|
cmp ecx,[triangles_count_var]
|
|
jnz .again_dts
|
|
|
|
jmp .eend
|
|
|
|
|
|
|
|
.draw_smooth_line:
|
|
mov esi,[edges_ptr]
|
|
xor ecx,ecx
|
|
.again_s_line:
|
|
push ecx
|
|
push esi
|
|
|
|
mov ecx,2
|
|
.aga_n:
|
|
mov eax,[esi]
|
|
shl eax,2
|
|
lea eax,[eax*3]
|
|
add eax,[points_normals_rot_ptr]
|
|
movups xmm0,[eax]
|
|
xorps xmm1,xmm1
|
|
mov edx,lights_aligned
|
|
.again_cc:
|
|
movaps xmm3,xmm0 ;.cnv
|
|
mulps xmm3,[edx]
|
|
andps xmm3,[zero_hgst_dd]
|
|
; haddps xmm3,xmm3
|
|
; haddps xmm3,xmm3 ; xmm3 - dot pr
|
|
movhlps xmm2,xmm3
|
|
addps xmm3,xmm2
|
|
movdqa xmm2,xmm3
|
|
shufps xmm2,xmm2,01010101b
|
|
addps xmm3,xmm2
|
|
shufps xmm3,xmm3,0
|
|
movaps xmm6,xmm3 ;xmm7
|
|
mulps xmm6,xmm6
|
|
mulps xmm6,xmm6
|
|
mulps xmm6,xmm6
|
|
mulps xmm6,xmm6
|
|
mulps xmm6,xmm6
|
|
mulps xmm6,[edx+48]
|
|
movaps xmm7,xmm3
|
|
mulps xmm7,[edx+16]
|
|
addps xmm7,xmm6
|
|
addps xmm7,[edx+32]
|
|
minps xmm7,[mask_255f] ; global
|
|
|
|
maxps xmm1,xmm7
|
|
add edx,64 ; size of one light in aligned list
|
|
cmp edx,lights_aligned_end
|
|
jl .again_cc
|
|
sub esp,16
|
|
movups [esp],xmm1
|
|
add esi,4
|
|
dec ecx
|
|
jnz .aga_n
|
|
|
|
movups xmm0,[esp]
|
|
movups xmm1,[esp+16]
|
|
add esp,32
|
|
sub esi,8
|
|
|
|
mov ecx,[esi]
|
|
mov edx,[esi+4]
|
|
imul ecx,[i6]
|
|
imul edx,[i6]
|
|
add ecx,[points_translated_ptr]
|
|
add edx,[points_translated_ptr]
|
|
|
|
movd xmm7,[ecx]
|
|
movhps xmm7,[edx]
|
|
pshufd xmm7,xmm7,11101000b
|
|
movdqa xmm6,xmm7
|
|
movdqa xmm3,xmm7
|
|
movdqa xmm4,xmm7
|
|
movd xmm5,[size_y_var]
|
|
pshuflw xmm5,xmm5,00010001b
|
|
pcmpeqw xmm3,xmm5
|
|
pcmpeqw xmm4,[the_zero]
|
|
pcmpgtw xmm7,xmm5
|
|
pcmpgtw xmm6,[the_zero]
|
|
pxor xmm7,xmm6
|
|
pxor xmm3,xmm4
|
|
pxor xmm7,xmm3
|
|
pmovmskb eax,xmm7
|
|
cmp al,-1
|
|
jnz .skp
|
|
|
|
|
|
|
|
|
|
mov eax,[esi]
|
|
mov ebx,[esi+4]
|
|
imul eax,[i12]
|
|
imul ebx,[i12]
|
|
add eax,[points_rotated_ptr]
|
|
add ebx,[points_rotated_ptr]
|
|
movss xmm2,[eax+8]
|
|
movss xmm3,[ebx+8]
|
|
|
|
|
|
movzx eax,word[ecx]
|
|
movzx ebx,word[ecx+2]
|
|
movzx ecx,word[edx]
|
|
movzx edx,word[edx+2]
|
|
|
|
emms
|
|
movd mm1,[screen_ptr]
|
|
movd mm0,[Zbuffer_ptr]
|
|
movzx esi,word[size_x_var]
|
|
movd mm2,esi
|
|
|
|
push ebp
|
|
call line_grd
|
|
pop ebp
|
|
.skp:
|
|
pop esi
|
|
pop ecx
|
|
add esi,8
|
|
inc ecx
|
|
cmp ecx,[edges_count]
|
|
jnz .again_s_line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.eend:
|
|
add esp,60
|
|
pop ebp
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
draw_handlers:
|
|
; in eax - render model
|
|
push ebp
|
|
mov ebp,esp
|
|
|
|
.counter equ ebp-16
|
|
.xres3m18 equ ebp-8
|
|
.xres2m12 equ ebp-12
|
|
.dr_model equ dword[ebp-4]
|
|
|
|
|
|
; init counter
|
|
sub esp,12
|
|
push dword 0
|
|
mov .dr_model,eax
|
|
movzx eax,word[size_x_var]
|
|
cmp .dr_model,12
|
|
jge @f
|
|
lea ebx,[eax*3]
|
|
sub ebx,18
|
|
add eax,eax
|
|
sub eax,12
|
|
mov [.xres3m18],ebx
|
|
mov [.xres2m12],eax
|
|
jmp .f
|
|
@@:
|
|
lea ebx,[eax*4]
|
|
sub ebx,4*6
|
|
add eax,eax
|
|
sub eax,3*4
|
|
mov [.xres3m18],ebx
|
|
mov [.xres2m12],eax
|
|
.f:
|
|
|
|
|
|
|
|
mov esi,[points_translated_ptr]
|
|
.loop:
|
|
push esi
|
|
; DO culling AT FIRST
|
|
cmp [culling_flag],1 ; (if culling_flag = 1)
|
|
jne .no_culling
|
|
mov edi,[.counter] ; *********************************
|
|
lea edi,[edi*3]
|
|
shl edi,2
|
|
add edi,[points_normals_rot_ptr]
|
|
mov eax,[edi+8] ; check sign of z coof
|
|
shr eax,31
|
|
cmp eax,1
|
|
jnz .skip
|
|
.no_culling:
|
|
mov eax,[esi]
|
|
movzx ebx,ax ; ebx - x
|
|
shr eax,16 ; eax - y
|
|
cmp eax,4 ; check if markers not exceedes screen
|
|
jle .skip
|
|
cmp ebx,4
|
|
jle .skip
|
|
movzx edx,word[size_x_var]
|
|
sub edx,4
|
|
movzx ecx,word[size_y_var]
|
|
sub ecx,4
|
|
cmp ebx,edx
|
|
jge .skip
|
|
cmp eax,ecx
|
|
jge .skip
|
|
|
|
movzx edx,word[size_x_var]
|
|
; sub ebx,3
|
|
; sub eax,3
|
|
imul eax,edx
|
|
add eax,ebx
|
|
push eax
|
|
lea edi,[eax*3]
|
|
cmp .dr_model,12
|
|
jl @f
|
|
add edi,[esp]
|
|
@@:
|
|
add esp,4
|
|
lea eax,[eax*2]
|
|
; draw bar 6x6
|
|
add edi,[screen_ptr]
|
|
add eax,dword[vertices_index_ptr]
|
|
|
|
|
|
|
|
|
|
mov edx,[.counter]
|
|
mov ecx,6
|
|
|
|
.oop:
|
|
push ecx
|
|
mov ecx,6
|
|
|
|
.do:
|
|
mov word[edi],0x0000 ;ax
|
|
mov byte[edi+2],0xff ;al
|
|
mov word[eax],dx
|
|
add eax,2
|
|
cmp .dr_model,12
|
|
jl @f
|
|
add edi,4
|
|
loop .do
|
|
jmp .ad
|
|
@@:
|
|
add edi,3
|
|
loop .do
|
|
.ad:
|
|
add edi,[.xres3m18]
|
|
add eax,[.xres2m12]
|
|
pop ecx
|
|
loop .oop
|
|
|
|
.skip:
|
|
pop esi
|
|
add esi,6
|
|
inc dword[.counter]
|
|
mov ecx,[.counter]
|
|
cmp ecx,[points_count_var]
|
|
jng .loop
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
|
|
ret
|
|
|
|
|
|
fill_Z_buffer:
|
|
mov eax,0x70000000
|
|
cmp [dr_flag],11
|
|
jl @f
|
|
mov eax,60000.1
|
|
@@:
|
|
mov edi,[Zbuffer_ptr]
|
|
movzx ecx,word[size_x_var]
|
|
movzx ebx,word[size_y_var]
|
|
imul ecx,ebx
|
|
if Ext>=SSE2
|
|
movd xmm0,eax
|
|
shufps xmm0,xmm0,0
|
|
push ecx
|
|
mov ecx,edi
|
|
and edi,0xffffff00
|
|
and ecx,0x000000ff
|
|
mov edx,ecx
|
|
rep stosd
|
|
pop ecx
|
|
sub ecx,edx
|
|
@@:
|
|
movaps [edi],xmm0
|
|
movaps [edi+16],xmm0
|
|
movaps [edi+32],xmm0
|
|
movaps [edi+48],xmm0
|
|
add edi,64
|
|
sub ecx,16
|
|
jnc @b
|
|
else
|
|
rep stosd
|
|
end if
|
|
ret
|
|
|
|
read_tp_variables: ; read [triangles_count_var] and [points_count_var]
|
|
; and allocate memory
|
|
xor ebx,ebx
|
|
xor ebp,ebp
|
|
mov [points_count_var],ebx
|
|
mov [triangles_count_var],ebx
|
|
if USE_LFN = 0
|
|
mov esi,SourceFile
|
|
else
|
|
mov esi,[fptr]
|
|
end if
|
|
|
|
cmp [esi],word 4D4Dh
|
|
je @f ;Must be legal .3DS file
|
|
xor eax,eax
|
|
ret
|
|
@@:
|
|
mov eax,dword[esi+2]
|
|
cmp eax,[fsize] ;This must tell the length
|
|
je @f
|
|
xor eax,eax
|
|
ret
|
|
@@:
|
|
add eax,esi
|
|
mov [EndFile],eax ;
|
|
|
|
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]
|
|
add [points_count_var],ecx
|
|
|
|
mov edx,ecx
|
|
add esi,8
|
|
@@:
|
|
|
|
add ebx,6
|
|
add esi,12
|
|
; dec ecx
|
|
loop @b
|
|
@@:
|
|
|
|
@@:
|
|
cmp [esi],word 4120h
|
|
je @f
|
|
add esi,[esi+2]
|
|
jmp @b
|
|
@@:
|
|
movzx ecx,word[esi+6]
|
|
add [triangles_count_var],ecx
|
|
add esi,8
|
|
|
|
@@:
|
|
add esi,8
|
|
dec ecx
|
|
jnz @b
|
|
; xor ecx,ecx
|
|
add ebp,edx
|
|
jmp .find4k
|
|
mov eax,-1 ;<---mark if OK
|
|
.exit:
|
|
ret
|
|
|
|
read_from_file:
|
|
fninit
|
|
mov edi,[triangles_ptr]
|
|
xor ebx,ebx
|
|
xor ebp,ebp
|
|
mov [points_count_var],0
|
|
mov [triangles_count_var],0
|
|
mov esi,[fptr]
|
|
cmp [esi],word 4D4Dh
|
|
jne .exit ;Must be legal .3DS file
|
|
; cmp dword[esi+2],EndFile-SourceFile
|
|
; jne .exit ;This must tell the length
|
|
mov eax,dword[esi+2]
|
|
; cmp eax,[fsize]
|
|
; jne .exit
|
|
|
|
add eax,esi
|
|
mov [EndFile],eax ;
|
|
|
|
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]
|
|
add [points_count_var],ecx
|
|
|
|
mov edx,ecx
|
|
add esi,8
|
|
@@:
|
|
push edi
|
|
mov edi,[points_ptr]
|
|
push dword[esi+0]
|
|
pop dword[edi+ebx*2+0]
|
|
push dword[esi+4]
|
|
pop dword[edi+ebx*2+4]
|
|
push dword[esi+8]
|
|
pop dword[edi+ebx*2+8]
|
|
pop edi
|
|
|
|
add ebx,6
|
|
add esi,12
|
|
dec ecx
|
|
jnz @b
|
|
@@:
|
|
; mov dword[points+ebx],-1
|
|
push edi
|
|
mov edi,[points_ptr]
|
|
mov dword[edi+ebx*2],-1 ; end mark (not always in use)
|
|
pop edi
|
|
@@:
|
|
cmp [esi],word 4120h
|
|
je @f
|
|
add esi,[esi+2]
|
|
jmp @b
|
|
@@:
|
|
movzx ecx,word[esi+6]
|
|
add [triangles_count_var],ecx
|
|
add esi,8
|
|
;mov edi,triangles
|
|
@@:
|
|
movzx eax,word[esi]
|
|
stosd
|
|
movzx eax,word[esi+2]
|
|
stosd
|
|
movzx eax,word[esi+4]
|
|
stosd
|
|
add dword[edi-12],ebp
|
|
add dword[edi-8],ebp
|
|
add dword[edi-4],ebp
|
|
add esi,8
|
|
dec ecx
|
|
jnz @b
|
|
add ebp,edx
|
|
jmp .find4k
|
|
mov eax,-1 ;<---mark if OK
|
|
.exit:
|
|
mov dword[edi],-1
|
|
ret
|
|
alloc_mem_for_tp:
|
|
mov eax, 68
|
|
cmp [re_alloc_flag],1
|
|
jz @f
|
|
mov ebx, 12
|
|
jmp .alloc
|
|
@@:
|
|
mov ebx,20
|
|
.alloc:
|
|
|
|
mov ecx,[triangles_count_var]
|
|
add ecx,20
|
|
lea ecx, [ecx*3]
|
|
shl ecx,2
|
|
mov edx,[triangles_ptr]
|
|
int 0x40 ; -> allocate memory to triangles
|
|
mov [triangles_ptr], eax ; -> eax = pointer to allocated mem
|
|
|
|
mov eax, 68
|
|
mov ecx,[triangles_count_var]
|
|
imul ecx,[i36]
|
|
mov edx,[edges_ptr]
|
|
int 0x40 ; -> allocate memory to triangles
|
|
mov [edges_ptr], eax ; -> eax = pointer to allocated mem
|
|
|
|
|
|
; ststic memory
|
|
|
|
mov eax, 68
|
|
mov ecx, [triangles_count_var]
|
|
lea ecx, [3+ecx*3]
|
|
shl ecx, 2
|
|
mov edx,[triangles_normals_ptr]
|
|
int 0x40 ; -> allocate memory for triangles normals
|
|
mov [triangles_normals_ptr], eax ; -> eax = pointer to allocated mem
|
|
|
|
|
|
mov eax, 68
|
|
mov ecx, [points_count_var]
|
|
lea ecx,[3+ecx*3]
|
|
shl ecx, 2
|
|
mov edx,[points_normals_ptr]
|
|
int 0x40
|
|
mov [points_normals_ptr], eax
|
|
|
|
|
|
mov eax, 68
|
|
; mov ebx, 12
|
|
mov ecx, [points_count_var]
|
|
lea ecx,[3+ecx*3]
|
|
shl ecx, 2
|
|
mov edx,[points_normals_rot_ptr]
|
|
int 0x40
|
|
mov [points_normals_rot_ptr], eax
|
|
|
|
mov eax, 68
|
|
mov edx,[points_ptr]
|
|
int 0x40
|
|
mov [points_ptr], eax
|
|
|
|
mov eax, 68
|
|
mov edx,[points_rotated_ptr]
|
|
int 0x40
|
|
mov [points_rotated_ptr], eax
|
|
|
|
mov eax, 68
|
|
mov ebx, 12
|
|
mov ecx, [points_count_var]
|
|
shl ecx,2
|
|
mov edx,[tex_points_ptr]
|
|
int 0x40
|
|
mov [tex_points_ptr], eax
|
|
|
|
mov eax, 68
|
|
mov ecx, [points_count_var]
|
|
inc ecx
|
|
shl ecx, 3
|
|
mov edx,[points_translated_ptr]
|
|
int 0x40
|
|
mov [points_translated_ptr], eax
|
|
ret
|
|
|
|
|
|
read_from_disk:
|
|
mov eax, 68
|
|
mov ebx, 11
|
|
int 0x40 ; -> create heap
|
|
|
|
;load kpacked files by Leency
|
|
mov eax,68
|
|
mov ebx,27
|
|
mov ecx,file_name
|
|
int 0x40
|
|
|
|
mov [fsize],edx
|
|
mov [file_info+16],eax
|
|
|
|
test eax,eax
|
|
jnz .open_opened_well
|
|
mov eax,6 ;otherwise => failed
|
|
jmp @f
|
|
.open_opened_well:
|
|
xor eax,eax
|
|
@@:
|
|
; eax = 0 -> ok file loaded
|
|
ret
|
|
read_param:
|
|
mov esi,I_Param
|
|
cmp dword[esi],0
|
|
je .end
|
|
cmp byte[esi],'/'
|
|
je .copy
|
|
mov edi,esi
|
|
mov ecx,25 ; 25 - would be enought
|
|
repe scasb
|
|
jne .end
|
|
dec edi
|
|
mov esi,edi
|
|
.copy:
|
|
mov edi,file_name
|
|
mov ecx,50
|
|
rep movsd
|
|
.end:
|
|
ret
|
|
buttons: ; draw some buttons (all but navigation and close )
|
|
mov edi,menu
|
|
.again:
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(10)*65536+62 ; [x start] *65536 + [x size]
|
|
movzx ecx,byte[edi] ; button id = position+2
|
|
sub ecx,2
|
|
lea ecx,[ecx*5]
|
|
lea ecx,[ecx*3]
|
|
add ecx,25
|
|
shl ecx,16
|
|
add ecx,12
|
|
movzx edx,byte[edi] ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
; BUTTON LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,byte[edi]
|
|
sub ebx,2 ; button id, according to position
|
|
lea ebx,[ebx*3]
|
|
lea ebx,[ebx*5]
|
|
movzx ecx,word[size_x_var]
|
|
shl ecx,16
|
|
add ebx,ecx
|
|
add ebx,(12)*65536+28 ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
lea edx,[edi+1] ; pointer to text beginning
|
|
mov esi,10 ; text length
|
|
int 0x40
|
|
cmp byte[edi+11],255 ; if max_flag=255
|
|
je @f ; skip
|
|
; flag description
|
|
; mov eax,4 ; function 4 : write text to window
|
|
; movzx ebx,byte[edi]
|
|
; sub bl,2
|
|
; lea ebx,[ebx*3]
|
|
; lea ebx,[ebx*5]
|
|
; add ebx,(SIZE_X+12+70)*65536+28 ; [x start] *65536 + [y start]
|
|
add ebx,70*65536
|
|
; mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
movzx edx,byte[edi+12] ; current flag
|
|
shl edx,2 ; * 4 = text length
|
|
add edx,dword[edi+13] ; pointer to text beginning
|
|
mov esi,4 ; text length
|
|
int 0x40
|
|
|
|
@@:
|
|
add edi,17
|
|
cmp byte[edi],-1
|
|
jnz .again
|
|
ret
|
|
write_info:
|
|
mov eax,13
|
|
mov bx,[size_x_var]
|
|
shl ebx,16
|
|
add ebx,120*65536+70 ; [x start] *65536 + [y start]
|
|
mov ecx,30 shl 16 + 100
|
|
xor edx,edx
|
|
int 0x40
|
|
|
|
|
|
xor esi,esi
|
|
emms
|
|
movd mm7,esi
|
|
.nxxx:
|
|
push esi
|
|
movd mm7,esi
|
|
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,120*65536 ; [x start] *65536 + [y start]
|
|
mov bx,si
|
|
shl bx,3
|
|
add ebx,30
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
movd edx,mm7
|
|
shl edx,2
|
|
add edx,lab_vert ; pointer to text beginning
|
|
mov esi,lab_vert_end-lab_vert ; text length
|
|
int 0x40
|
|
|
|
movd esi,mm7
|
|
mov eax,[points_count_var+esi]
|
|
mov ecx,10
|
|
.dc:
|
|
xor edx,edx
|
|
mov edi,10
|
|
div edi
|
|
add dl,30h
|
|
mov [STRdata+ecx-1],dl
|
|
loop .dc
|
|
|
|
mov eax,4 ; function 4 : write text to window
|
|
mov bx,[size_x_var]
|
|
add ebx,120
|
|
shl ebx,16
|
|
mov bx,si ; [x start] *65536 + [y start]
|
|
shl bx,3
|
|
add bx,45
|
|
mov ecx,0x00ddeeff
|
|
mov edx,STRdata ; pointer to text beginning
|
|
mov esi,10 ; text length
|
|
int 40h
|
|
pop esi
|
|
add esi,4
|
|
cmp esi,12
|
|
jnz .nxxx
|
|
ret
|
|
; *********************************************
|
|
; ******* WINDOW DEFINITIONS AND DRAW ********
|
|
; *********************************************
|
|
draw_window:
|
|
movzx eax,[fire_flag]
|
|
push eax
|
|
; int3
|
|
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 bx,[x_start]
|
|
shl ebx,16
|
|
mov cx,[y_start]
|
|
shl ecx,16
|
|
;ebx - [x start] *65536 + [x size]
|
|
;ecx - [y start] *65536 + [y size]
|
|
mov bx,[size_x_var]
|
|
add bx,225
|
|
mov cx,[size_y_var]
|
|
add cx,30
|
|
; @@:
|
|
mov edx,0x13000000 ; color of work area RRGGBB,8->color gl
|
|
mov edi,labelt ; WINDOW LABEL
|
|
int 0x40
|
|
|
|
call buttons ; more buttons
|
|
|
|
.Y_ADD equ 2 ;-> offset of 'add vector' buttons
|
|
|
|
; mov eax,47
|
|
; mov ebx,0000000000111000000000000000b
|
|
; mov ecx,[points_count_var]
|
|
; movzx edx,word[size_x_var]
|
|
; shl edx,16
|
|
; add edx,130*65536+60 ; [x start] *65536 + [y start]
|
|
; mov esi,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
; int 0x40
|
|
|
|
call write_info
|
|
|
|
; ADD VECTOR LABEL ; add vector buttons - 30 ++
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(12)*65536+(168+15*(13+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelvector ; pointer to text beginning
|
|
mov esi,labelvectorend-labelvector ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
; VECTOR Y- BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,30*65536+20 ; [x start] *65536 + [x size]
|
|
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,30 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR Y- LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(32)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelyminus ; pointer to text beginning
|
|
mov esi,labelyminusend-labelyminus ; text length
|
|
cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
; VECTOR Z+ BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
|
|
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,31 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR Z+ LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(53)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelzplus ; pointer to text beginning
|
|
mov esi,labelzplusend-labelzplus ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
|
|
int 0x40
|
|
; VECTOR x- BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(10)*65536+21 ; [x start] *65536 + [x size]
|
|
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,32 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR x- LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(12)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelxminus ; pointer to text beginning
|
|
mov esi,labelxminusend-labelxminus ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
; VECTOR x+ BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
|
|
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,33 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR x+ LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(53)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelxplus ; pointer to text beginning
|
|
mov esi,labelxplusend-labelxplus ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
; VECTOR z- BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(10)*65536+62-41 ; [x start] *65536 + [x size]
|
|
mov ecx,(25+140+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,34 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR z- LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(12)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelzminus ; pointer to text beginning
|
|
mov esi,labelzminusend-labelzminus ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
;VECTOR Y+ BUTTON
|
|
mov eax,8 ; function 8 : define and draw button
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(10+20)*65536+20 ; [x start] *65536 + [x size]
|
|
mov ecx,(165+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
|
|
mov edx,35 ; button id
|
|
mov esi,0x6688dd ; button color RRGGBB
|
|
int 0x40
|
|
;VECTOR Y+ LABEL
|
|
mov eax,4 ; function 4 : write text to window
|
|
movzx ebx,word[size_x_var]
|
|
shl ebx,16
|
|
add ebx,(32)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
|
|
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
|
mov edx,labelyplus ; pointer to text beginning
|
|
mov esi,labelyplusend-labelyplus ; text length
|
|
; cmp [move_flag],2
|
|
; jne @f
|
|
; add edx,navigation_size
|
|
; @@:
|
|
int 0x40
|
|
|
|
mov eax,12 ; function 12:tell os about windowdraw
|
|
mov ebx,2 ; 2, end of draw
|
|
int 0x40
|
|
pop eax
|
|
mov [fire_flag],al
|
|
ret
|
|
|
|
|
|
; DATA AREA ************************************
|
|
|
|
include 'data.inc'
|
|
align 16
|
|
MEM_END:
|