Subversion Repositories Kolibri OS

Rev

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