Subversion Repositories Kolibri OS

Rev

Rev 6100 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6100 Rev 6101
Line 6... Line 6...
6
proc calc_buf uses ebx ecx, buf:dword, shininess:dword
6
proc calc_buf uses ebx ecx, buf:dword, shininess:dword
7
locals
7
locals
8
	val dd ? ;float
8
	val dd ? ;float
9
	f_inc dd ? ;float
9
	f_inc dd ? ;float
10
endl
10
endl
11
	mov dword[val],0.0f
-
 
12
	mov dword[f_inc],SPECULAR_BUFFER_SIZE
11
	mov dword[f_inc],SPECULAR_BUFFER_SIZE
13
	fld1
-
 
14
	fidiv dword[f_inc]
-
 
15
	fstp dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
-
 
16
	mov ebx,[buf]
12
	mov ebx,[buf]
17
	add ebx,offs_spec_buf
13
	add ebx,offs_spec_buf
-
 
14
	mov dword[ebx],0.0 ;buf.buf[0] = 0.0
18
	xor ecx,ecx
15
	xor ecx,ecx
-
 
16
	inc ecx
-
 
17
	fld dword[shininess] ;сначала берем y
-
 
18
	fld1
-
 
19
	fidiv dword[f_inc]
-
 
20
	fst dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
-
 
21
	fst dword[val]
19
align 4
22
align 4
20
	.cycle_0: ;for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++)
23
	.cycle_0: ;for (i = 1; i <= SPECULAR_BUFFER_SIZE; i++)
21
	cmp ecx,SPECULAR_BUFFER_SIZE
24
	cmp ecx,SPECULAR_BUFFER_SIZE
22
	jg @f
25
	jg @f
23
		;Вычисляем x^y
26
		;Вычисляем x^y
24
		fld dword[val] ;сначала берем y
-
 
25
		fld dword[shininess] ;а потом x
-
 
-
 
27
 
26
		fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x):
28
		fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x):
27
		;Теперь считаем 2**z:
29
		;Теперь считаем 2**z:
28
		fld st0 ;Создаем еще одну копию z
30
		fld st0 ;Создаем еще одну копию z
29
		frndint ;Округляем
31
		frndint ;Округляем
30
		fsubr st0,st1  ;st1=z, st0=z-trunc(z)
32
		fsubr st0,st1  ;st1=z, st0=z-trunc(z)
Line 33... Line 35...
33
		faddp  ;st1=z, st0=2**(z-trunc(z))
35
		faddp  ;st1=z, st0=2**(z-trunc(z))
34
		fscale ;st1=z, st0=(2**trunc(z))*(2**(z-trunc(z)))=2**t
36
		fscale ;st1=z, st0=(2**trunc(z))*(2**(z-trunc(z)))=2**t
35
		fxch st1
37
		fxch st1
36
		fstp st ;Результат остается на вершине стека st0
38
		fstp st ;Результат остается на вершине стека st0
Line 37... Line -...
37
 
-
 
38
		fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
39
 
-
 
40
		add ebx,4
-
 
41
		fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
-
 
42
		ffree st0 ;испорченный shininess
Line -... Line 43...
-
 
43
		fincstp
39
		add ebx,4
44
 
40
 
45
		fld dword[shininess] ;сначала берем y
41
		fld dword[val]
46
		fld dword[val]
42
		fadd dword[f_inc]
47
		fadd dword[f_inc]
43
		fstp dword[val] ;val += f_inc
48
		fst dword[val] ;val += f_inc
44
	inc ecx
49
	inc ecx
-
 
50
	jmp .cycle_0
-
 
51
	@@:
-
 
52
	ffree st0 ;val
-
 
53
	fincstp
45
	jmp .cycle_0
54
	ffree st0 ;shininess
46
	@@:
55
	fincstp
Line 47... Line 56...
47
	ret
56
	ret
48
endp
57
endp