Subversion Repositories Kolibri OS

Rev

Rev 6243 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6243 Rev 8069
Line 36... Line 36...
36
 
36
 
37
macro DRAW_INIT
37
macro DRAW_INIT
38
{
38
{
39
if TGL_FEATURE_RENDER_BITS eq 24
39
if TGL_FEATURE_RENDER_BITS eq 24
40
	mov ecx,[p2]
40
	mov ecx,[p2]
41
	mov eax,[ecx+offs_zbup_r]
41
	mov eax,[ecx+ZBufferPoint.r]
42
	mov [colorR],ah ;colorR=p2.r>>8
42
	mov [colorB],ah ;colorB=p2.r>>8
43
	mov eax,[ecx+offs_zbup_g]
43
	mov eax,[ecx+ZBufferPoint.g]
44
	mov [colorG],ah ;colorG=p2.g>>8
44
	mov [colorG],ah ;colorG=p2.g>>8
45
	mov eax,[ecx+offs_zbup_b]
45
	mov eax,[ecx+ZBufferPoint.b]
46
	mov [colorB],ah ;colorB=p2.b>>8
46
	mov [colorR],ah ;colorR=p2.b>>8
47
;else
47
;else
48
;color=RGB_TO_PIXEL(p2.r,p2.g,p2.b)
48
;color=RGB_TO_PIXEL(p2.r,p2.g,p2.b)
49
end if
49
end if
Line 50... Line 50...
50
}
50
}
51
 
51
 
52
macro PUT_PIXEL _a
52
macro PUT_PIXEL _a
-
 
53
{
-
 
54
local .end_0
-
 
55
if _a eq 0
53
{
56
	mov ebx,[dzdx]
54
local .end_0
57
end if
55
	mov eax,[z]
58
	mov eax,[z]
56
	shr eax,ZB_POINT_Z_FRAC_BITS
59
	shr eax,ZB_POINT_Z_FRAC_BITS
57
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
60
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
58
	jl .end_0
61
	jl .end_0
59
		;edi = pp
62
		;edi = pp
60
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
-
 
61
if TGL_FEATURE_RENDER_BITS eq 24
63
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
62
		mov al,[colorR]
64
if TGL_FEATURE_RENDER_BITS eq 24
63
		mov ah,[colorG]
65
		mov ax,word[colorB] ;сохраняем colorB и colorG
64
		mov word[edi+3*_a],ax
66
		mov word[edi+3*_a],ax
65
		mov al,[colorB]
67
		mov al,[colorR]
66
		mov byte[edi+3*_a +2],al
68
		mov byte[edi+3*_a +2],al
67
;else
69
;else
68
;pp[_a]=color
70
;pp[_a]=color
69
end if
-
 
70
	.end_0:
71
end if
71
	mov eax,[dzdx]
72
	.end_0:
Line 72... Line 73...
72
	add [z],eax
73
	add [z],ebx
73
}
74
}
74
 
75
 
75
align 16
76
align 16
76
proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
77
proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
77
locals
78
locals
78
if TGL_FEATURE_RENDER_BITS eq 24
79
if TGL_FEATURE_RENDER_BITS eq 24
79
	colorR db ?
80
	colorB db ?
80
	colorG db ?
81
	colorG db ?
81
	colorB db ? ;unsigned char
82
	colorR db ? ;unsigned char
82
else
83
else
Line 104... Line 105...
104
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
105
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
105
	jl .end_0
106
	jl .end_0
106
		;edi = pp
107
		;edi = pp
107
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
108
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
108
if TGL_FEATURE_RENDER_BITS eq 24
109
if TGL_FEATURE_RENDER_BITS eq 24
109
		mov ebx,[or1]
-
 
110
		mov eax,[og1]
110
		mov eax,[og1]
111
		mov al,bh
111
		mov al,byte[or1+1]
112
		mov word[edi+3*_a],ax
112
		mov word[edi+3*_a],ax
113
		mov eax,[ob1]
113
		mov eax,[ob1]
114
		mov byte[edi+3*_a +2],ah
114
		mov byte[edi+3*_a +2],ah
115
end if
115
end if
116
;if TGL_FEATURE_RENDER_BITS eq 32
116
;if TGL_FEATURE_RENDER_BITS eq 32
117
;pp[_a] = RGB_TO_PIXEL(or1, og1, ob1)
117
;pp[_a] = RGB_TO_PIXEL(or1, og1, ob1)
118
;end if
118
;end if
119
	.end_0:
119
	.end_0:
-
 
120
if _a eq 0
120
	mov eax,[dzdx]
121
	mov ebx,[dzdx]
121
	add [z],eax
122
	mov ecx,[dgdx]
122
	mov eax,[dgdx]
123
	mov edx,[drdx]
-
 
124
end if
123
	add [og1],eax
125
	add [z],ebx
124
	mov eax,[drdx]
126
	add [og1],ecx
125
	add [or1],eax
127
	add [or1],edx
126
	mov eax,[dbdx]
128
	mov eax,[dbdx]
127
	add [ob1],eax
129
	add [ob1],eax
128
}
130
}
Line 129... Line 131...
129
 
131
 
Line 135... Line 137...
135
align 16
137
align 16
136
proc ZB_setTexture uses eax ebx, zb:dword, texture:dword,\
138
proc ZB_setTexture uses eax ebx, zb:dword, texture:dword,\
137
	s_bound:dword, t_bound:dword, s_log2:dword
139
	s_bound:dword, t_bound:dword, s_log2:dword
138
	mov eax,[zb]
140
	mov eax,[zb]
139
	mov ebx,[texture]
141
	mov ebx,[texture]
140
	mov dword[eax+offs_zbuf_current_texture],ebx
142
	mov dword[eax+ZBuffer.current_texture],ebx
141
	mov ebx,[s_log2]
143
	mov ebx,[s_log2]
142
	mov dword[eax+offs_zbuf_s_log2],ebx
144
	mov dword[eax+ZBuffer.s_log2],ebx
143
	mov ebx,[s_bound]
145
	mov ebx,[s_bound]
144
	mov dword[eax+offs_zbuf_s_bound],ebx
146
	mov dword[eax+ZBuffer.s_bound],ebx
145
	mov ebx,[t_bound]
147
	mov ebx,[t_bound]
146
	mov dword[eax+offs_zbuf_t_bound],ebx
148
	mov dword[eax+ZBuffer.t_bound],ebx
147
	ret
149
	ret
148
endp
150
endp
Line 149... Line 151...
149
 
151
 
150
INTERP_Z equ 1
152
INTERP_Z equ 1
Line 151... Line 153...
151
INTERP_ST equ 1
153
INTERP_ST equ 1
152
 
154
 
153
macro DRAW_INIT
155
macro DRAW_INIT
154
{
156
{
155
	mov eax,[zb]
157
	mov eax,[zb]
156
	mov ebx,[eax+offs_zbuf_current_texture]
158
	mov ebx,[eax+ZBuffer.current_texture]
157
	mov [texture],ebx
159
	mov [texture],ebx
158
	mov ebx,[eax+offs_zbuf_s_log2]
160
	mov ebx,[eax+ZBuffer.s_log2]
159
	mov [s_log2],ebx ;s_log2 = zb.s_log2
161
	mov [s_log2],ebx ;s_log2 = zb.s_log2
160
	mov ebx,[eax+offs_zbuf_s_bound]
162
	mov ebx,[eax+ZBuffer.s_bound]
161
	mov [s_bound],ebx ;s_bound = zb.s_bound
163
	mov [s_bound],ebx ;s_bound = zb.s_bound
162
	mov ebx,[eax+offs_zbuf_t_bound]
164
	mov ebx,[eax+ZBuffer.t_bound]
Line 163... Line 165...
163
	mov [t_bound],ebx ;t_bound = zb.t_bound
165
	mov [t_bound],ebx ;t_bound = zb.t_bound
164
}
166
}
Line 179... Line 181...
179
		shr ebx,cl ;(t & t_bound) >> s_log2
181
		shr ebx,cl ;(t & t_bound) >> s_log2
180
		mov eax,[s]
182
		mov eax,[s]
181
		and eax,[s_bound]
183
		and eax,[s_bound]
182
		shr eax,ZB_POINT_TEXEL_SIZE
184
		shr eax,ZB_POINT_TEXEL_SIZE
183
		or ebx,eax
185
		or ebx,eax
184
		imul ebx,3
186
		lea ebx,[ebx+2*ebx]
185
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
187
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
186
		mov ax,word[ebx]
188
		mov ax,word[ebx]
187
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
189
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
188
		mov al,byte[ebx+2]
190
		mov al,byte[ebx+2]
189
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
191
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
Line 220... Line 222...
220
NB_INTERP equ 8
222
NB_INTERP equ 8
Line 221... Line 223...
221
 
223
 
222
macro DRAW_INIT
224
macro DRAW_INIT
223
{
225
{
224
	mov eax,[zb]
226
	mov eax,[zb]
225
	mov ebx,[eax+offs_zbuf_current_texture]
227
	mov ebx,[eax+ZBuffer.current_texture]
226
	mov [texture],ebx
228
	mov [texture],ebx
227
	mov ebx,[eax+offs_zbuf_s_log2]
229
	mov ebx,[eax+ZBuffer.s_log2]
228
	mov [s_log2],ebx ;s_log2 = zb.s_log2
230
	mov [s_log2],ebx ;s_log2 = zb.s_log2
229
	mov ebx,[eax+offs_zbuf_s_bound]
231
	mov ebx,[eax+ZBuffer.s_bound]
230
	mov [s_bound],ebx ;s_bound = zb.s_bound
232
	mov [s_bound],ebx ;s_bound = zb.s_bound
231
	mov ebx,[eax+offs_zbuf_t_bound]
233
	mov ebx,[eax+ZBuffer.t_bound]
232
	mov [t_bound],ebx ;t_bound = zb.t_bound
234
	mov [t_bound],ebx ;t_bound = zb.t_bound
233
	mov dword[esp-4],NB_INTERP
235
	mov dword[esp-4],NB_INTERP
234
	fild dword[esp-4]
236
	fild dword[esp-4]
235
	fild dword[dzdx]
237
	fild dword[dzdx]
Line 259... Line 261...
259
		shr ebx,cl ;(t & t_bound) >> s_log2
261
		shr ebx,cl ;(t & t_bound) >> s_log2
260
		mov eax,[s]
262
		mov eax,[s]
261
		and eax,[s_bound]
263
		and eax,[s_bound]
262
		shr eax,ZB_POINT_TEXEL_SIZE
264
		shr eax,ZB_POINT_TEXEL_SIZE
263
		or ebx,eax
265
		or ebx,eax
264
		imul ebx,3
266
		lea ebx,[ebx+2*ebx]
265
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
267
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
266
		mov ax,word[ebx]
268
		mov ax,word[ebx]
267
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
269
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
268
		mov al,byte[ebx+2]
270
		mov al,byte[ebx+2]
269
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
271
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]