Subversion Repositories Kolibri OS

Rev

Rev 6141 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6141 IgorA 1
;
2
; Опции для функций:
3
;
4
;INTERP_Z - использование Z буфера (всегда включено)
5
;INTERP_RGB - сглажевание цветов
6
;INTERP_ST - наложение текстуры в ортогональной проэкции
7
;INTERP_STZ - наложение текстуры в перспективной проэкции
8
;
9
; Функции рисования треугольников:
10
;
11
;ZB_fillTriangleFlat - треугольник одного цвета
12
;ZB_fillTriangleSmooth - треугольник с разными цветами вершин
13
;ZB_fillTriangleMapping - треугольник с текстурой в ортогональной проэкции
14
;ZB_fillTriangleMappingPerspective - треугольник с текстурой в перспективной проэкции
15
;
5153 IgorA 16
 
6141 IgorA 17
macro calc_d1d2 f, r1, r2
18
{
19
	fld dword[fdy2]
20
	fmul st0,st2
21
	fld dword[fdy1]
22
	fmul st0,st2
23
	fsubp
24
	f#stp dword[r1] ;r1 = (fdy2*d1 - fdy1*d2)
25
	fld dword[fdx1]
26
	fmulp
27
	fld dword[fdx2]
28
	fmul st0,st2
29
	fsubp
30
	f#stp dword[r2] ;r2 = (fdx1*d2 - fdx2*d1)
31
	ffree st0 ;d1
32
	fincstp
33
}
34
 
5153 IgorA 35
INTERP_Z equ 1
36
 
37
macro DRAW_INIT
38
{
39
if TGL_FEATURE_RENDER_BITS eq 24
40
	mov ecx,[p2]
41
	mov eax,[ecx+offs_zbup_r]
5208 IgorA 42
	mov [colorR],ah ;colorR=p2.r>>8
5153 IgorA 43
	mov eax,[ecx+offs_zbup_g]
5208 IgorA 44
	mov [colorG],ah ;colorG=p2.g>>8
5153 IgorA 45
	mov eax,[ecx+offs_zbup_b]
5208 IgorA 46
	mov [colorB],ah ;colorB=p2.b>>8
5187 IgorA 47
;else
6126 IgorA 48
;color=RGB_TO_PIXEL(p2.r,p2.g,p2.b)
5153 IgorA 49
end if
50
}
51
 
52
macro PUT_PIXEL _a
53
{
5175 IgorA 54
local .end_0
55
	mov eax,[z]
6126 IgorA 56
	shr eax,ZB_POINT_Z_FRAC_BITS
57
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5175 IgorA 58
	jl .end_0
59
		;edi = pp
6126 IgorA 60
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 61
if TGL_FEATURE_RENDER_BITS eq 24
6111 IgorA 62
		mov al,[colorR]
63
		mov ah,[colorG]
64
		mov word[edi+3*_a],ax
65
		mov al,[colorB]
66
		mov byte[edi+3*_a +2],al
5187 IgorA 67
;else
6126 IgorA 68
;pp[_a]=color
5153 IgorA 69
end if
5175 IgorA 70
	.end_0:
71
	mov eax,[dzdx]
72
	add [z],eax
5153 IgorA 73
}
74
 
6134 IgorA 75
align 16
5153 IgorA 76
proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
77
locals
78
if TGL_FEATURE_RENDER_BITS eq 24
79
	colorR db ?
80
	colorG db ?
81
	colorB db ? ;unsigned char
82
else
83
	color dd ? ;int
84
end if
85
include 'ztriangle.inc'
86
 
87
;
88
; Smooth filled triangle.
89
; The code below is very tricky :)
90
;
91
 
92
INTERP_Z equ 1
93
INTERP_RGB equ 1
94
 
95
macro DRAW_INIT
96
{
97
}
98
 
99
macro PUT_PIXEL _a
100
{
5187 IgorA 101
local .end_0
5175 IgorA 102
	mov eax,[z]
103
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 104
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 105
	jl .end_0
106
		;edi = pp
6126 IgorA 107
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 108
if TGL_FEATURE_RENDER_BITS eq 24
6111 IgorA 109
		mov ebx,[or1]
110
		mov eax,[og1]
111
		mov al,bh
112
		mov word[edi+3*_a],ax
5187 IgorA 113
		mov eax,[ob1]
114
		mov byte[edi+3*_a +2],ah
115
end if
6111 IgorA 116
;if TGL_FEATURE_RENDER_BITS eq 32
6126 IgorA 117
;pp[_a] = RGB_TO_PIXEL(or1, og1, ob1)
6111 IgorA 118
;end if
5187 IgorA 119
	.end_0:
5175 IgorA 120
	mov eax,[dzdx]
121
	add [z],eax
5187 IgorA 122
	mov eax,[dgdx]
123
	add [og1],eax
124
	mov eax,[drdx]
125
	add [or1],eax
126
	mov eax,[dbdx]
127
	add [ob1],eax
5153 IgorA 128
}
129
 
6134 IgorA 130
align 16
5153 IgorA 131
proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword
132
locals
133
include 'ztriangle.inc'
134
 
6134 IgorA 135
align 16
6243 IgorA 136
proc ZB_setTexture uses eax ebx, zb:dword, texture:dword,\
137
	s_bound:dword, t_bound:dword, s_log2:dword
5153 IgorA 138
	mov eax,[zb]
139
	mov ebx,[texture]
140
	mov dword[eax+offs_zbuf_current_texture],ebx
6243 IgorA 141
	mov ebx,[s_log2]
142
	mov dword[eax+offs_zbuf_s_log2],ebx
143
	mov ebx,[s_bound]
144
	mov dword[eax+offs_zbuf_s_bound],ebx
145
	mov ebx,[t_bound]
146
	mov dword[eax+offs_zbuf_t_bound],ebx
5153 IgorA 147
	ret
148
endp
149
 
150
INTERP_Z equ 1
151
INTERP_ST equ 1
152
 
153
macro DRAW_INIT
154
{
5187 IgorA 155
	mov eax,[zb]
6243 IgorA 156
	mov ebx,[eax+offs_zbuf_current_texture]
157
	mov [texture],ebx
158
	mov ebx,[eax+offs_zbuf_s_log2]
159
	mov [s_log2],ebx ;s_log2 = zb.s_log2
160
	mov ebx,[eax+offs_zbuf_s_bound]
161
	mov [s_bound],ebx ;s_bound = zb.s_bound
162
	mov ebx,[eax+offs_zbuf_t_bound]
163
	mov [t_bound],ebx ;t_bound = zb.t_bound
5153 IgorA 164
}
165
 
166
macro PUT_PIXEL _a
167
{
5187 IgorA 168
local .end_0
169
	mov eax,[z]
170
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 171
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 172
	jl .end_0
5922 IgorA 173
		;edi = pp
6126 IgorA 174
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 175
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 176
		mov ebx,[t]
6243 IgorA 177
		and ebx,[t_bound]
178
		mov ecx,[s_log2]
179
		shr ebx,cl ;(t & t_bound) >> s_log2
6141 IgorA 180
		mov eax,[s]
6243 IgorA 181
		and eax,[s_bound]
182
		shr eax,ZB_POINT_TEXEL_SIZE
6141 IgorA 183
		or ebx,eax
6108 IgorA 184
		imul ebx,3
185
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
186
		mov ax,word[ebx]
187
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
188
		mov al,byte[ebx+2]
189
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
5153 IgorA 190
else
6126 IgorA 191
;pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]
5153 IgorA 192
end if
5187 IgorA 193
	.end_0:
5175 IgorA 194
	mov eax,[dzdx]
195
	add [z],eax
196
	mov eax,[dsdx]
197
	add [s],eax
198
	mov eax,[dtdx]
199
	add [t],eax
5153 IgorA 200
}
201
 
6134 IgorA 202
align 16
5153 IgorA 203
proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
204
locals
205
	texture dd ? ;PIXEL*
6243 IgorA 206
	s_log2 dd ? ;unsigned int
207
	s_bound dd ? ;unsigned int
208
	t_bound dd ? ;unsigned int
5153 IgorA 209
include 'ztriangle.inc'
210
 
211
;
212
; Texture mapping with perspective correction.
213
; We use the gradient method to make less divisions.
214
; TODO: pipeline the division
215
;
216
 
217
INTERP_Z equ 1
218
INTERP_STZ equ 1
219
 
220
NB_INTERP equ 8
221
 
222
macro DRAW_INIT
223
{
5187 IgorA 224
	mov eax,[zb]
6243 IgorA 225
	mov ebx,[eax+offs_zbuf_current_texture]
226
	mov [texture],ebx
227
	mov ebx,[eax+offs_zbuf_s_log2]
228
	mov [s_log2],ebx ;s_log2 = zb.s_log2
229
	mov ebx,[eax+offs_zbuf_s_bound]
230
	mov [s_bound],ebx ;s_bound = zb.s_bound
231
	mov ebx,[eax+offs_zbuf_t_bound]
232
	mov [t_bound],ebx ;t_bound = zb.t_bound
6108 IgorA 233
	mov dword[esp-4],NB_INTERP
234
	fild dword[esp-4]
5187 IgorA 235
	fild dword[dzdx]
6108 IgorA 236
	fst dword[fdzdx] ;fdzdx = (float)dzdx
237
	fmul st0,st1
238
	fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
239
	fld dword[fdzdx]
240
	fmul st0,st1
241
	fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
242
	fmul dword[dtzdx]
243
	fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
5153 IgorA 244
}
245
 
246
macro PUT_PIXEL _a
247
{
5187 IgorA 248
local .end_0
249
	mov eax,[z]
250
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 251
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 252
	jl .end_0
5922 IgorA 253
		;edi = pp
6126 IgorA 254
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 255
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 256
		mov ebx,[t]
6243 IgorA 257
		and ebx,[t_bound]
258
		mov ecx,[s_log2]
259
		shr ebx,cl ;(t & t_bound) >> s_log2
6108 IgorA 260
		mov eax,[s]
6243 IgorA 261
		and eax,[s_bound]
262
		shr eax,ZB_POINT_TEXEL_SIZE
6108 IgorA 263
		or ebx,eax
264
		imul ebx,3
265
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
266
		mov ax,word[ebx]
267
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
268
		mov al,byte[ebx+2]
269
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
5153 IgorA 270
else
271
;       pp[_a]=*(PIXEL *)((char *)texture+
5187 IgorA 272
;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
5153 IgorA 273
end if
5187 IgorA 274
	.end_0:
5175 IgorA 275
	mov eax,[dzdx]
276
	add [z],eax
277
	mov eax,[dsdx]
278
	add [s],eax
279
	mov eax,[dtdx]
280
	add [t],eax
5153 IgorA 281
}
282
 
5175 IgorA 283
DRAW_LINE_M equ 1
284
 
6113 IgorA 285
macro DRAW_LINE
5175 IgorA 286
{
287
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 288
	mov eax,[x2]
289
	sar eax,16
6113 IgorA 290
	mov edi,[x1]
291
	sub eax,edi
6111 IgorA 292
	mov [n],eax ;n = (x2 >> 16) - x1
6134 IgorA 293
	fld1
6108 IgorA 294
	fild dword[z1]
6113 IgorA 295
	fst dword[f_z] ;fz = (float)z1
6108 IgorA 296
	fdivp
297
	fstp dword[zinv] ;zinv = 1.0 / fz
298
	imul edi,PSZB
299
	add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
6126 IgorA 300
	mov esi,[x1]
301
	shl esi,1
302
	add esi,[pz1] ;pz = pz1 + x1
6108 IgorA 303
	mov eax,[z1]
304
	mov [z],eax ;z = z1
305
	mov eax,[sz1]
306
	mov [s_z],eax ;sz = sz1
307
	mov eax,[tz1]
308
	mov [t_z],eax ;tz = tz1
309
align 4
6111 IgorA 310
	.cycle_2: ;while (n>=(NB_INTERP-1))
311
	cmp dword[n],NB_INTERP-1
6108 IgorA 312
	jl .cycle_2_end
313
		fld dword[zinv]
314
		fld st0
315
		fmul dword[s_z] ;ss = (sz * zinv)
316
		fist dword[s] ;s = (int) ss
317
		fmul dword[fdzdx]
318
		fchs
319
		fadd dword[dszdx]
320
		fmul dword[zinv]
321
		fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
322
		fmul dword[t_z] ;tt = (tz * zinv)
323
		fist dword[t] ;t = (int) tt
324
		fmul dword[fdzdx]
325
		fchs
326
		fadd dword[dtzdx]
327
		fmul dword[zinv]
328
		fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
6134 IgorA 329
		fld1
6113 IgorA 330
		fld dword[f_z]
6108 IgorA 331
		fadd dword[fndzdx]
6113 IgorA 332
		fst dword[f_z] ;fz += fndzdx
6108 IgorA 333
		fdivp
334
		fstp dword[zinv] ;zinv = 1.0 / fz
335
		PUT_PIXEL 0
336
		PUT_PIXEL 1
337
		PUT_PIXEL 2
338
		PUT_PIXEL 3
339
		PUT_PIXEL 4
340
		PUT_PIXEL 5
341
		PUT_PIXEL 6
342
		PUT_PIXEL 7
6126 IgorA 343
		add esi,2*NB_INTERP ;pz += NB_INTERP
6108 IgorA 344
		add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
6111 IgorA 345
		sub dword[n],NB_INTERP ;n -= NB_INTERP
6108 IgorA 346
		fld dword[ndszdx]
347
		fadd dword[s_z]
6111 IgorA 348
		fstp dword[s_z] ;sz += ndszdx
6108 IgorA 349
		fld dword[ndtzdx]
350
		fadd dword[t_z]
351
		fstp dword[t_z] ;tz += ndtzdx
352
		jmp .cycle_2
6134 IgorA 353
align 4
6108 IgorA 354
	.cycle_2_end:
355
	fld dword[zinv]
356
	fld st0
357
	fmul dword[s_z] ;ss = (sz * zinv)
358
	fist dword[s] ;s = (int) ss
359
	fmul dword[fdzdx]
360
	fchs
361
	fadd dword[dszdx]
362
	fmul dword[zinv]
363
	fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
364
	fmul dword[t_z] ;tt = (tz * zinv)
365
	fist dword[t] ;t = (int) tt
366
	fmul dword[fdzdx]
367
	fchs
368
	fadd dword[dtzdx]
369
	fmul dword[zinv]
370
	fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
371
align 4
6111 IgorA 372
	.cycle_3: ;while (n>=0)
373
	cmp dword[n],0
6108 IgorA 374
	jl .cycle_3_end
375
		PUT_PIXEL 0
6126 IgorA 376
		add esi,2 ;pz += 1
6108 IgorA 377
		add edi,PSZB ;pp += PSZB
6111 IgorA 378
		dec dword[n]
6108 IgorA 379
		jmp .cycle_3
6134 IgorA 380
align 4
6108 IgorA 381
	.cycle_3_end:
5175 IgorA 382
end if
383
}
384
 
6134 IgorA 385
align 16
5153 IgorA 386
proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
387
locals
5175 IgorA 388
	texture dd ? ;PIXEL *
389
	fdzdx dd ? ;float
5187 IgorA 390
	fndzdx dd ? ;float
391
	ndszdx dd ? ;float
392
	ndtzdx dd ? ;float
6113 IgorA 393
	zinv dd ? ;float
394
	f_z dd ? ;float - переменная отвечающая за геометрию текстуры
6243 IgorA 395
	s_log2 dd ? ;unsigned int
396
	s_bound dd ? ;unsigned int
397
	t_bound dd ? ;unsigned int
5153 IgorA 398
include 'ztriangle.inc'