kolibrios-gitea/programs/demos/3DS/B_PROCS.INC
Kirill Lipatov (Leency) 4b8e0542e3 View 3DS 0.69 by macgub:
1. 32bit vertices indexes and ability to load whole RAM limited objects. (Above 65535 vertices and triangles).
2. I switch off painters algotithm mode (depth sorting). In app impelementetion it has limited vertices count and produce less quality image than Z buffer Catmull algo. In addition this switch off reduces app size.

git-svn-id: svn://kolibrios.org@8014 a494cfbc-eb01-0410-851d-a64ba20cac60
2020-06-01 15:44:39 +00:00

1287 lines
34 KiB
Plaintext

;init_envmap_cub2:
; mov esi,envmap
; mov edi,envmap_cub ;take cubic env. map from
; xor eax,eax ;spherical env. map
; @@:
; add esi,eax
; movsd
; dec edi
; dec esi
; add esi,511*3
; add eax,3
; cmp eax,511*3
; jl @b
;ret
init_envmap_cub: ; create 512x512 env map
.temp equ word [ebp-2]
push ebp
mov ebp,esp
sub esp,2
mov edi,envmap_cub
fninit
mov cx,-256
.ie_hor:
mov .temp,cx
fild .temp
fabs
; fmul st,st0
; fsqrt
mov .temp,255
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,255
jle .ie_ok2
mov ax,255
.ie_ok2:
stosb
stosb
stosb
inc cx
cmp cx,256
jne .ie_hor
mov esp,ebp
pop ebp
ret
calc_one_col:
; procedure don't save registers !!!
; in - st - dot_product
; stack - other parameters
; out - eax - 0x00rrggbb
.dot_prd equ dword[ebp+4] ; dot product - cos x - not now
.min_col_r equ word[ebp+8] ; minimum color - ambient
.min_col_g equ word[ebp+10]
.min_col_b equ word[ebp+12]
.max_col_r equ word[ebp+14] ; maximum color - specular
.max_col_g equ word[ebp+16]
.max_col_b equ word[ebp+18]
.org_col_r equ word[ebp+20] ; orginal color - diffuse
.org_col_g equ word[ebp+22]
.org_col_b equ word[ebp+24]
.n equ word[ebp+26] ; shines - not implemented
.temp equ word[ebp-2]
.color_sum_r equ dword[ebp-6]
.color_sum_g equ dword[ebp-10]
.color_sum_b equ dword[ebp-14]
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
mov ebp,esp
sub esp,14
mov ax,.min_col_r
add ax,.max_col_r
add ax,.org_col_r
cwde
mov .color_sum_r,eax
mov ax,.min_col_g
add ax,.max_col_g
add ax,.org_col_g
cwde
mov .color_sum_g,eax
mov ax,.min_col_b
add ax,.max_col_b
add ax,.org_col_b
cwde
mov .color_sum_b,eax
; fld .dot_prd
; fild .n
; fxch st1
; fabs
; fyl2x ;
; f2xm1
; fld1
; faddp ; st = dot_product ^ n
fld st ; copy dot pr
fmul st,st0
fmul st,st0
fmul st,st0
cmp .n,255 ; .n = 255 -> spot light
jne @f
fmul st,st0
fmul st,st0
fmul st,st0
@@:
fld st ; st0=st1=dot_pr^n, st2=dot_pr
fimul .max_col_b
fild .org_col_b
fmul st,st3
faddp ; st0=first piece of col, st1=dot_pr^n..
fiadd .min_col_b
fimul .max_col_b
fidiv .color_sum_b
fistp .temp
movzx eax,.temp
shl eax,16
fld st
fimul .max_col_g
fild .org_col_g
fmul st,st3
faddp
fiadd .min_col_g
fimul .max_col_g
fidiv .color_sum_g
fistp .temp
mov ax,.temp
mov ah,al
shl eax,8
fimul .max_col_r
fild .org_col_r
fmulp st2,st
faddp
fiadd .min_col_r
fimul .max_col_r
fidiv .color_sum_r
fistp .temp
mov ax,.temp ;eax - 0xbbgg00rr
; mov ah,al
ror eax,16
xchg al,ah ; eax - 0x00rrggbb
mov esp,ebp
ret 24
calc_bumpmap: ; calculate random bumpmap
;--------------in edi _ pointer to TEX_X x TEX_Y bumpmap
push edi
cmp [bumps_flag],0
je .random_bump_map
; else bumps according to texture
mov esi,texmap
mov ecx,TEXTURE_SIZE
@@:
movzx ax,byte[esi]
movzx bx,byte[esi+1]
movzx dx,byte[esi+2]
add ax,bx
add ax,dx
cwd
div [i3]
stosb
add esi,3
loop @b
jmp .blur_map
; push ecx
; mov eax,0x88888888
; mov ecx,16/4
; rep stosd
; mov eax,0xffffffff
; mov ecx,16/4
; rep stosd
; pop ecx
; loop @b
.random_bump_map:
mov ecx,TEXTURE_SIZE
@@:
push ecx
xor ecx,ecx
mov edx,255
call random
stosb
pop ecx
loop @b
.blur_map:
pop edi
movzx ecx,[bumps_deep_flag]
inc cx
.blur:
xor esi,esi
mov edx,TEXTURE_SIZE
xor eax,eax
xor ebx,ebx
@@:
mov ebp,esi
dec ebp
and ebp,TEXTURE_SIZE
mov al,byte[ebp+edi]
mov ebp,esi
inc ebp
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
mov ebp,esi
sub ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
mov ebp,esi
add ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
shr eax,2
mov byte[esi+edi],al
inc esi
dec edx
jnz @b
loop .blur
ret
random:
; in - ecx - min
; edx - max
; out - eax - random number
mov bx,[rand_seed]
add bx,0x9248
ror bx,3
mov [rand_seed],bx
mov ax,dx
sub ax,cx
mul bx
mov ax,dx
add ax,cx
cwde
ret
optimize_object1: ; setting point (0,0,0) in center of object
; recalculate all coords , scale object,
;the coords in <-1.0,1.0>
;in : real_points - table filled of real float dd coordinates (x,y,z), end mark dd -1
; _ global variable
; points_count_var - dw integer variable with exactly points count
; - global variable
; SIZE_X, SIZE_Y must be defined
.max equ dword[ebp-4]
.min equ dword[ebp-8]
.maxxx equ dword[ebp-12]
.center equ dword[ebp-16]
mov ebp,esp
sub esp,16
fninit
mov .maxxx,0
mov ecx,3
xor ebx,ebx ; ebx - x,y,z coord in real_points list
.next_c: ; max/min/center x,y,z
mov edi,[points_ptr] ; in real_point list minimum two points
mov edx,[points_count_var]
fld dword[edi+ebx]
fst .max
fstp .min
add edi,12
dec edx
.next_coord: ; next coord from real_points list
fld dword [edi+ebx] ; real_points -> x,y,z
fcom .max ; max_x,y,z
fstsw ax
sahf
jbe @f ; jmp less equal
fstp .max ; new max_x,y,z
jmp .end_coords
@@:
fcom .min ; min_x,y,z
fstsw ax
sahf
jnbe @f ; jmp greater
fst .min ; new min_x
@@:
ffree st
.end_coords:
add edi,12
; cmp dword[edi],-1 ; cmp with end mark
dec edx
jnz .next_coord
; ok after this we found max_coord and min_coord
fld .max ; find center point
fadd .min
fld1
fld1
faddp
fdivp st1,st ; st0 - center coord
fstp .center
fld .max
fsub .center ; st = .max - .center
fcom .maxxx ; maximum of all .max
fstsw ax
sahf
jbe @f ; jmp lower
fst .maxxx ; new maxx
@@:
ffree st
mov edi,[points_ptr]
mov edx,[points_count_var] ; substraction all coords - center point
@@:
fld dword[edi+ebx]
fsub .center
fstp dword[edi+ebx]
add edi,12
; cmp dword[edi],-1
; jne @b
dec edx
jnz @b
add ebx,4 ; ebx - x,y,z cooficientes in list real_points
dec ecx
jnz .next_c
fld .maxxx
mov edi,[points_ptr] ; create all coords in <-1.0,1.0>
mov ecx,[points_count_var]
@@:
fld dword[edi]
fdiv .maxxx
fstp dword[edi]
fld dword[edi+4]
fdiv .maxxx
fstp dword[edi+4]
fld dword[edi+8]
fdiv .maxxx
fstp dword[edi+8]
add edi,12
loop @b
; cmp dword[edi],-1
; jne @b
mov esp,ebp
ret
generate_object: ; generate node
.N equ 32
.x equ word[ebp-2]
.Ndiv2 equ word[ebp-10]
.MthickSqr equ dword[ebp-14] ; diameter^2
.temp equ dword[ebp-18] ; variable for x <-1;1>
.Hthick equ dword[ebp-22]
.cos_temp equ dword[ebp-26]
.next_const equ dword[ebp-30]
.a equ dword[ebp-34]
.Pi2 equ ebp-38
mov ebp,esp
sub esp,42
mov .Ndiv2,.N/2
fninit
fldpi
fadd st,st
fst dword[.Pi2]
fidiv .Ndiv2
fst .a ; .Ndiv2*.a=2Pi => .a=2pi/.Ndiv2
fld [.Mthick] ; inside diameter, (outside daiameter = 1)
fmul st,st0
fstp .MthickSqr
fld1
fsub [.Mthick]
fst .Hthick ; Hthick = 1 - Mthick
fld st
fadd st,st
faddp
fstp .next_const ; next_const = Hthick * 3
;init triangles list
mov edi,[triangles_ptr]
xor esi,esi
xor eax,eax
mov ebx,.N+1
mov ecx,(.N*2)+2 ;--
mov edx,(.N*3)+3 ;---
mov [triangles_count_var],0
.again_tri:
stosd ; main wave
mov dword[edi],ebx
inc eax
add edi,4
stosd
stosd
mov dword[edi],ebx
inc ebx
mov dword[edi+4],ebx
add edi,8
mov dword[edi],ecx ;---- ; n2+2 ; xor ax,ax
inc ecx ; n2+3 ; mov bx,.N+1
mov dword[edi+4],edx ; ; mov cx,(.N*2)+2 ;--
mov dword[edi+8],ecx ; n3+3 ; mov dx,(.N*3)+3 ;---
mov dword[edi+12],edx ; n3+3 ;
inc edx ; ;
mov dword[edi+16],edx ; n2+3 ;
mov dword[edi+20],ecx ; n3+4
add edi,24 ;----
dec eax ; border of wave
dec ebx
dec ecx
dec edx
stosd ; first border
inc eax
stosd
mov dword[edi],edx
add edi,4
mov dword[edi],edx
add edi,4
stosd
inc edx
mov dword[edi],edx
mov dword[edi+4],ebx ; second border
mov dword[edi+8],ecx
inc ebx
mov dword[edi+12],ebx
mov dword[edi+16],ebx
mov dword[edi+20],ecx
inc ecx
mov dword[edi+24],ecx
add edi,28
add [triangles_count_var],8 ;10
inc esi
cmp esi,.N
jne .again_tri
add eax,((.N+1)*3)+1
add ebx,((.N+1)*3)+1
add ecx,((.N+1)*3)+1
add edx,((.N+1)*3)+1
xor esi,esi
cmp eax,(.N*13)+13 ;;;(.N*23)+23 ; ax,(.N*13)+13
jl .again_tri
; mov dword[edi],-1 ; <--- end mark not always in use
; init real points list
mov .x,-(.N/2)
mov edi,[points_ptr]
lea esi,[edi+(12*(.N+1))]
mov eax,[points_ptr]
mov ebx,eax
add eax,2*12*(.N+1) ;---
add ebx,3*12*(.N+1) ;---
mov [points_count_var],0
.R_P4 equ edi+(4*12*(.N+1))
.R_P5 equ edi+(5*12*(.N+1))
.R_P6 equ edi+(6*12*(.N+1))
.R_P7 equ edi+(7*12*(.N+1))
.R_P8 equ edi+(8*12*(.N+1))
.R_P9 equ edi+(9*12*(.N+1))
.R_P10 equ edi+(10*12*(.N+1))
.R_P11 equ edi+(11*12*(.N+1))
.R_P12 equ edi+(12*12*(.N+1))
.R_P13 equ edi+(13*12*(.N+1))
.R_P14 equ edi+(14*12*(.N+1))
.R_P15 equ edi+(15*12*(.N+1))
@@:
; x coordinate
fild .x
fld st
;; fmul .a ; st = <-2pi;2pi> when mul .a
fidiv .Ndiv2
fst .temp ; temporary x in <-1.0;1.0>
fst dword[edi] ;x coordinate of point
fst dword[esi]
fst dword[eax] ;--
fst dword[.R_P4]
fst dword[.R_P5]
fst dword[.R_P6]
fst dword[.R_P7]
fst dword[.R_P8]
fst dword[.R_P9]
fst dword[.R_P10]
fst dword[.R_P11]
fst dword[.R_P12]
fst dword[.R_P13]
fst dword[.R_P14]
fst dword[.R_P15]
fstp dword[ebx] ;pop
;*******y coord dword[offset + 4]
fmul .a ; st = <-2pi;2pi>
fsincos
fmul .next_const
fst dword[edi+4] ; y coordinate of point
fst dword[esi+4]
fst dword[.R_P4+4]
fst dword[.R_P5+4]
fld .Hthick
faddp
fst dword[.R_P6+4]
fst dword[.R_P7+4]
fst dword[eax+4]
fst dword[ebx+4]
fchs
fst dword[.R_P10+4]
fst dword[.R_P11+4]
fst dword[.R_P14+4]
fst dword[.R_P15+4]
fadd .Hthick
fadd .Hthick
fst dword[.R_P8+4]
fst dword[.R_P9+4]
fst dword[.R_P12+4]
fstp dword[.R_P13+4]
fmul .Hthick
fmul .next_const
fstp .cos_temp ; cos_temp = Hthick^2 * 3
;***************z coord
fld .temp
fld st
fmul st,st0 ; z coords
fchs
fld1
faddp
fabs
fsqrt
; fld st
; fsub
fld st
fsub .cos_temp
fst dword[esi+8]
fstp dword[eax+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P9+8]
fstp dword[.R_P10+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P6+8]
fstp dword[.R_P5+8]
fadd .cos_temp
fst dword[.R_P13+8]
fstp dword[.R_P14+8]
fmul [.Mthick]
fmul st,st0
fchs
fld .MthickSqr
faddp
fabs
fsqrt
fld st
fsub .cos_temp
fst dword[edi+8] ; z coordinate
fstp dword[ebx+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P8+8]
fstp dword[.R_P11+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P7+8]
fstp dword[.R_P4+8]
fadd .cos_temp
fst dword[.R_P12+8]
fstp dword[.R_P15+8]
add edi,12
add esi,12
add eax,12 ;--
add ebx,12 ;---
add [points_count_var],24 ;16
inc .x
cmp .x,.N/2
jng @b
; mov dword[esi],-1 ; <-- end mark
mov [culling_flag],0
mov esp,ebp
ret
.Mthick dd 0.85 ; size-thickness
make_random_lights:
.temp1 equ ebp-4
.temp2 equ ebp-8 ; - light vector generate variables
.temp3 equ ebp-12
.max equ 800
RDTSC
mov [rand_seed],ax
push ebp
mov ebp,esp
sub esp,12
mov edi,lights
fninit
mov dword[.temp2],.max
mov dword[.temp3],.max/2
.again:
xor esi,esi
@@:
mov edx,.max
xor ecx,ecx
call random
sub eax,.max/2
mov dword[.temp1],eax
fild dword[.temp1]
fidiv dword[.temp3]
fstp dword[edi+esi*4]
inc esi
cmp esi,2
jne @b
.max1 equ 1000
mov dword[.temp2],.max1/2
mov edx,.max1
xor ecx,ecx
call random
mov dword[.temp1],eax
fild dword[.temp1]
fchs
fidiv dword[.temp2]
fstp dword[edi+8]
xor esi,esi
@@:
mov ecx,220 ; max colors and shine , ecx = 200 - more bright shading
mov edx,255
call random
mov byte[edi+18+esi],al
inc esi
cmp esi,4
jne @b
xor esi,esi
@@:
mov ecx,100 ; orginal colors
movzx edx,byte[edi+18+esi]
call random
mov byte[edi+12+esi],al
inc esi
cmp esi,3
jne @b
xor esi,esi
@@:
mov ecx,1 ; min cols
movzx edx,byte[edi+12+esi]
call random
mov byte[edi+15+esi],al
inc esi
cmp esi,3
jne @b
add edi,LIGHT_SIZE ;22
cmp edi,lightsend ; see file View3ds,asm
jne .again
mov esp,ebp
pop ebp
ret
generate_texture2:
.const equ 32
mov edi,texmap
xor bx,bx
.next_line:
xor dx,dx
.next2stripes:
mov eax,-1
mov ecx,(TEX_X/.const)*3/4
rep stosd
mov eax,0x00ff0000
mov ecx,(TEX_X/.const)
@@:
stosd
dec edi
loop @b
inc dx
cmp dx,.const/2
jl .next2stripes
inc bx
cmp bx,TEX_Y
jl .next_line
ret
blur_screen: ;blur n times ; blur or fire
;in - ecx times count
;.counter equ dword[esp-4]
.counter1 equ dword[esp-8]
if Ext>=SSE2
push ebp
mov ebp,esp
push dword 0x01010101
movss xmm5,[esp]
shufps xmm5,xmm5,0
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
lea ecx,[ecx*3+1]
shr ecx,2
; mov ecx,SIZE_X*3/4
xor eax,eax
rep stosd
if 1
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
lea ecx,[ecx*3]
shr ecx,4
lea ebx,[ebx*3]
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16
.blr:
@@:
push ecx
movups xmm0,[edi+ebx]
mov ecx,edi
sub ecx,ebx
movups xmm1,[ecx]
movups xmm2,[edi-3]
movups xmm3,[edi+3]
pavgb xmm0,xmm1
pavgb xmm2,xmm3
pavgb xmm0,xmm2
psubusb xmm0,xmm5 ; importand if fire
movups [edi],xmm0
add edi,16
add esi,16
pop ecx
loop .blr
end if
xor eax,eax
movzx ecx,word[size_x_var]
lea ecx,[ecx*3]
shr ecx,2
; mov ecx,SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
if Ext=SSE
emms
push ebp
mov ebp,esp
push dword 0x01010101
push dword 0x01010101
movq mm4,[esp]
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
lea ecx,[ecx*3]
shr ecx,2
; pxor mm5,mm5
xor eax,eax
rep stosd
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
lea ecx,[ecx*3]
shr ecx,3
lea ebx,[ebx*3]
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/8
.blr:
@@:
movq mm0,[edi+ebx]
movq mm1,[edi-ebx]
movq mm2,[edi-3]
movq mm3,[edi+3]
pavgb mm0,mm1
pavgb mm2,mm3
pavgb mm0,mm2
psubusb mm0,mm4 ; importand if fire
movq [edi],mm0
add edi,8
add esi,8
loop .blr
xor eax,eax
mov ecx,[size_x_var]
lea ecx,[ecx*3]
shr ecx,2
; SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
if Ext=MMX
emms
push ebp
mov ebp,esp
push dword 0x0
push dword 0x01010101
.again_blur:
push ecx
mov edi,[screen_ptr]
mov ecx,SIZE_X*3/4
pxor mm5,mm5
xor eax,eax
rep stosd
mov ecx,(SIZE_X*(SIZE_Y-3))*3/4
.blr:
@@:
movd mm0,[edi+SIZE_X*3]
movd mm1,[edi-SIZE_X*3]
movd mm2,[edi-3]
movd mm3,[edi+3]
punpcklbw mm0,mm5
punpcklbw mm1,mm5
punpcklbw mm2,mm5
punpcklbw mm3,mm5
paddw mm0,mm1
paddw mm0,mm2
paddw mm0,mm3
psrlw mm0,2
packuswb mm0,mm5
psubusb mm0,qword[esp] ; importand if fire
movd eax,mm0
stosd
loop .blr
xor eax,eax
mov ecx,SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
if Ext=NON
.blur:
push ecx
xor ecx,ecx
.next_col_coof:
xor esi,esi
xor eax,eax
xor ebx,ebx
mov edi,SIZE_X*SIZE_Y
.next:
mov ebp,esi
dec ebp
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov al,byte[edx+ecx]
mov ebp,esi
inc ebp
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
mov ebp,esi
sub ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
mov ebp,esi
add ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
shr eax,2
lea edx,[esi*3+screen]
or al,al
jz @f
dec al ; not importand if fire
mov byte[edx+ecx],al
@@:
inc esi
dec edi
jnz .next
inc ecx
cmp ecx,3
jne .next_col_coof
pop ecx
dec ecx
jnz .blur
end if
ret
mirror: ; mirror effect - loseless operation
; in ah - button id = 11, 12, 13
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit
mov ecx,[points_count_var]
cmp ah,11
je @f
cmp ah,12
je .yn
cmp ah,13
je .zn
@@: ; neg x
fld dword[edi] ;x
fchs
fstp dword[edi] ;x
fld dword[esi]
fchs
fstp dword[esi]
add edi,12
add esi,12
loop @b
ret
.yn:
fld dword[edi+4] ;y
fchs
fstp dword[edi+4] ;y
fld dword[esi+4]
fchs
fstp dword[esi+4]
add edi,12
add esi,12
loop .yn
ret
.zn:
fld dword[edi+8] ;z
fchs
fstp dword[edi+8] ;z
fld dword[esi+8]
fchs
fstp dword[esi+8]
add edi,12
add esi,12
loop .zn
ret
exchange: ; exchange some coords - loseless operation
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit ; exchange both points and normal vactors coords/coofics
mov ecx,[points_count_var]
cmp [xchg_flag],1
je @f
cmp [xchg_flag],2
je .zx
cmp [xchg_flag],3
je .yz
@@:
fld dword[edi] ;x
fld dword[edi+4] ;y
fstp dword[edi] ;x
fstp dword[edi+4] ;y
fld dword[esi] ;x
fld dword[esi+4] ;y
fstp dword[esi] ;x
fstp dword[esi+4] ;y
add esi,12
add edi,12
loop @b
ret
.zx:
fld dword[edi] ;x
fld dword[edi+8] ;z
fstp dword[edi] ;x
fstp dword[edi+8] ;z
fld dword[esi] ;x
fld dword[esi+8] ;y
fstp dword[esi] ;x
fstp dword[esi+8] ;y
add esi,12
add edi,12
loop .zx
ret
.yz:
fld dword[edi+8] ;z
fld dword[edi+4] ;y
fstp dword[edi+8] ;z
fstp dword[edi+4] ;y
fld dword[esi+8] ;x
fld dword[esi+4] ;y
fstp dword[esi+8] ;x
fstp dword[esi+4] ;y
add edi,12
add esi,12
loop .yz
ret
;#\\\\\\\\\\\\\\\\\\\\\\\\\comented///////////////////////////////
if 0
calc_attenuation_light: ;; calculate point to spot_light distance
; spot light with attenuation ;; and vector, normalize vector,
;; calc dot_pr and unlinear color according
;; to dot_product, write to color buff
.distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem
.temp_col equ word[ebp-6]
.vector equ [ebp-20]
.spot_light_ptr equ dword [ebp-24]
mov ebp,esp
sub esp,24
mov edi,rotated_points_r ;points_rotated
mov edx,point_normals_rotated
mov ecx,bumpmap ; mem area with temp points color list
xor ax,ax ; counter
mov esi,spot_light_params
mov .spot_light_ptr,esi
.again_color:
push eax
lea ebx,.vector
mov esi,.spot_light_ptr ; calc vector fom light to every point
call make_vector_r
; ebx - ptr to result vector
fld dword [ebx]
fmul st, st
fld dword [ebx+4]
fmul st, st
fld dword [ebx+8]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
fstp .distance
push edi
mov edi,ebx
call normalize_vector
; edi - normalized distance vector
mov esi,edx
call dot_product ; esi first vector, edi second vector
; st0 - dot product
fabs ; why not ? - think about it
pop edi
fldz
fcomip st1
jbe @f ; st1>0
mov dword[ecx],0
mov word[ecx+4],0
add ecx,6
ffree st0
jmp .update_counters
@@:
; pop edi
; calc color(with atenuation), write to buff
; buff - color of points list
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
push edx
push edi
push ecx
push ebp
; mov eax,spot_light_params
mov eax,.spot_light_ptr
movzx dx,byte[eax+15]
push dx ; shines
movzx dx,byte[eax+8] ; b
push dx ; orginal col
movzx dx,byte[eax+7] ; g
push dx
movzx dx,byte[eax+6] ; r
push dx
movzx dx,byte[eax+14] ; max col
push dx
movzx dx,byte[eax+13]
push dx
movzx dx,byte[eax+12]
push dx
movzx dx,byte[eax+11] ; min col
push dx
movzx dx,byte[eax+10]
push dx
movzx dx,byte[eax+9]
push dx
push eax ; dot pr. (in st0)
call calc_one_col
; eax - 0x00rrggbb
; brightness = 1 - (distance/light.fadezero)^fogness
; if brightness < 0, then brightness = 0
; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect
; color = color * brightness ; fogness = <0.5,2.0>
pop ebp
pop ecx
fld .distance
mov esi,.spot_light_ptr
; fidiv word[spot_light_params+16] ; fadezero
fidiv word[esi+16] ; fadezero
; fmul st,st0 ; fogness = 2
fabs ; to be sure
fchs
fld1
faddp
fld1
fcomip st1
jnbe @f
ffree st0
fld1
@@:
fld st ; st - brightness
ror eax,16
movzx bx,al ; al - r
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jge @f
mov word[ecx],0
@@:
; mov edx,dword[spot_light_params+12] ; max colors
mov edx,dword[esi+12] ; max colors
movzx bx,dl ; r max
cmp word[ecx],bx ; choose the brightest for r, g, b
jl @f
mov word[ecx],bx
@@:
add ecx,2
fld st
ror eax,16
movzx bx,ah ; g
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
movzx bx,dh ; g max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
add ecx,2
movzx bx,al ; b
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
shr edx,16
movzx bx,dl ; b max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
add ecx,2
;end if
; ror eax,16
; movzx bx,al
; mov word[ecx],bx
; ror eax,16
; movzx bx,ah
; mov word[ecx+2],bx
; xor ah,ah
; mov word[ecx+4],ax
; add ecx,6
pop edi
pop edx
.update_counters:
add edx,12 ; normal_size
add edi,12 ;6 ; 3d point_coord_size
pop eax
inc ax
cmp ax,[points_count_var]
jne .again_color
add .spot_light_ptr,18
cmp .spot_light_ptr,spot_l_end
jl .again_color
mov esp,ebp
ret
end if
;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////