Subversion Repositories Kolibri OS

Rev

Rev 6134 | Rev 6243 | 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
5153 IgorA 136
proc ZB_setTexture uses eax ebx, zb:dword, texture:dword
137
	mov eax,[zb]
138
	mov ebx,[texture]
139
	mov dword[eax+offs_zbuf_current_texture],ebx
140
	ret
141
endp
142
 
143
INTERP_Z equ 1
144
INTERP_ST equ 1
145
 
146
macro DRAW_INIT
147
{
5187 IgorA 148
	mov eax,[zb]
149
	mov eax,[eax+offs_zbuf_current_texture]
150
	mov [texture],eax
5153 IgorA 151
}
152
 
153
macro PUT_PIXEL _a
154
{
5187 IgorA 155
local .end_0
156
	mov eax,[z]
157
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 158
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 159
	jl .end_0
5922 IgorA 160
		;edi = pp
6126 IgorA 161
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 162
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 163
		mov ebx,[t]
164
		and ebx,0x3fc00000
6141 IgorA 165
		mov eax,[s]
166
		and eax,0x003fc000
167
		or ebx,eax
6108 IgorA 168
		shr ebx,14
169
		imul ebx,3
170
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
171
		mov ax,word[ebx]
172
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
173
		mov al,byte[ebx+2]
174
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
5153 IgorA 175
else
6126 IgorA 176
;pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]
5153 IgorA 177
end if
5187 IgorA 178
	.end_0:
5175 IgorA 179
	mov eax,[dzdx]
180
	add [z],eax
181
	mov eax,[dsdx]
182
	add [s],eax
183
	mov eax,[dtdx]
184
	add [t],eax
5153 IgorA 185
}
186
 
6134 IgorA 187
align 16
5153 IgorA 188
proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
189
locals
190
	texture dd ? ;PIXEL*
191
include 'ztriangle.inc'
192
 
193
;
194
; Texture mapping with perspective correction.
195
; We use the gradient method to make less divisions.
196
; TODO: pipeline the division
197
;
198
if 1
199
 
200
INTERP_Z equ 1
201
INTERP_STZ equ 1
202
 
203
NB_INTERP equ 8
204
 
205
macro DRAW_INIT
206
{
5187 IgorA 207
	mov eax,[zb]
208
	mov eax,[eax+offs_zbuf_current_texture]
209
	mov [texture],eax
6108 IgorA 210
	mov dword[esp-4],NB_INTERP
211
	fild dword[esp-4]
5187 IgorA 212
	fild dword[dzdx]
6108 IgorA 213
	fst dword[fdzdx] ;fdzdx = (float)dzdx
214
	fmul st0,st1
215
	fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
216
	fld dword[fdzdx]
217
	fmul st0,st1
218
	fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
219
	fmul dword[dtzdx]
220
	fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
5153 IgorA 221
}
222
 
223
macro PUT_PIXEL _a
224
{
5187 IgorA 225
local .end_0
226
	mov eax,[z]
227
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 228
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 229
	jl .end_0
5922 IgorA 230
		;edi = pp
6126 IgorA 231
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5153 IgorA 232
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 233
		mov ebx,[t]
234
		and ebx,0x3fc00000
235
		mov eax,[s]
236
		and eax,0x003fc000
237
		or ebx,eax
238
		shr ebx,14
239
		imul ebx,3
240
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
241
		mov ax,word[ebx]
242
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
243
		mov al,byte[ebx+2]
244
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
5153 IgorA 245
else
246
;       pp[_a]=*(PIXEL *)((char *)texture+
5187 IgorA 247
;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
5153 IgorA 248
end if
5187 IgorA 249
	.end_0:
5175 IgorA 250
	mov eax,[dzdx]
251
	add [z],eax
252
	mov eax,[dsdx]
253
	add [s],eax
254
	mov eax,[dtdx]
255
	add [t],eax
5153 IgorA 256
}
257
 
5175 IgorA 258
DRAW_LINE_M equ 1
259
 
6113 IgorA 260
macro DRAW_LINE
5175 IgorA 261
{
262
if TGL_FEATURE_RENDER_BITS eq 24
6108 IgorA 263
	mov eax,[x2]
264
	sar eax,16
6113 IgorA 265
	mov edi,[x1]
266
	sub eax,edi
6111 IgorA 267
	mov [n],eax ;n = (x2 >> 16) - x1
6134 IgorA 268
	fld1
6108 IgorA 269
	fild dword[z1]
6113 IgorA 270
	fst dword[f_z] ;fz = (float)z1
6108 IgorA 271
	fdivp
272
	fstp dword[zinv] ;zinv = 1.0 / fz
273
	imul edi,PSZB
274
	add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
6126 IgorA 275
	mov esi,[x1]
276
	shl esi,1
277
	add esi,[pz1] ;pz = pz1 + x1
6108 IgorA 278
	mov eax,[z1]
279
	mov [z],eax ;z = z1
280
	mov eax,[sz1]
281
	mov [s_z],eax ;sz = sz1
282
	mov eax,[tz1]
283
	mov [t_z],eax ;tz = tz1
284
align 4
6111 IgorA 285
	.cycle_2: ;while (n>=(NB_INTERP-1))
286
	cmp dword[n],NB_INTERP-1
6108 IgorA 287
	jl .cycle_2_end
288
		fld dword[zinv]
289
		fld st0
290
		fmul dword[s_z] ;ss = (sz * zinv)
291
		fist dword[s] ;s = (int) ss
292
		fmul dword[fdzdx]
293
		fchs
294
		fadd dword[dszdx]
295
		fmul dword[zinv]
296
		fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
297
		fmul dword[t_z] ;tt = (tz * zinv)
298
		fist dword[t] ;t = (int) tt
299
		fmul dword[fdzdx]
300
		fchs
301
		fadd dword[dtzdx]
302
		fmul dword[zinv]
303
		fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
6134 IgorA 304
		fld1
6113 IgorA 305
		fld dword[f_z]
6108 IgorA 306
		fadd dword[fndzdx]
6113 IgorA 307
		fst dword[f_z] ;fz += fndzdx
6108 IgorA 308
		fdivp
309
		fstp dword[zinv] ;zinv = 1.0 / fz
310
		PUT_PIXEL 0
311
		PUT_PIXEL 1
312
		PUT_PIXEL 2
313
		PUT_PIXEL 3
314
		PUT_PIXEL 4
315
		PUT_PIXEL 5
316
		PUT_PIXEL 6
317
		PUT_PIXEL 7
6126 IgorA 318
		add esi,2*NB_INTERP ;pz += NB_INTERP
6108 IgorA 319
		add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
6111 IgorA 320
		sub dword[n],NB_INTERP ;n -= NB_INTERP
6108 IgorA 321
		fld dword[ndszdx]
322
		fadd dword[s_z]
6111 IgorA 323
		fstp dword[s_z] ;sz += ndszdx
6108 IgorA 324
		fld dword[ndtzdx]
325
		fadd dword[t_z]
326
		fstp dword[t_z] ;tz += ndtzdx
327
		jmp .cycle_2
6134 IgorA 328
align 4
6108 IgorA 329
	.cycle_2_end:
330
	fld dword[zinv]
331
	fld st0
332
	fmul dword[s_z] ;ss = (sz * zinv)
333
	fist dword[s] ;s = (int) ss
334
	fmul dword[fdzdx]
335
	fchs
336
	fadd dword[dszdx]
337
	fmul dword[zinv]
338
	fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
339
	fmul dword[t_z] ;tt = (tz * zinv)
340
	fist dword[t] ;t = (int) tt
341
	fmul dword[fdzdx]
342
	fchs
343
	fadd dword[dtzdx]
344
	fmul dword[zinv]
345
	fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
346
align 4
6111 IgorA 347
	.cycle_3: ;while (n>=0)
348
	cmp dword[n],0
6108 IgorA 349
	jl .cycle_3_end
350
		PUT_PIXEL 0
6126 IgorA 351
		add esi,2 ;pz += 1
6108 IgorA 352
		add edi,PSZB ;pp += PSZB
6111 IgorA 353
		dec dword[n]
6108 IgorA 354
		jmp .cycle_3
6134 IgorA 355
align 4
6108 IgorA 356
	.cycle_3_end:
5175 IgorA 357
end if
358
}
359
 
6134 IgorA 360
align 16
5153 IgorA 361
proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
362
locals
5175 IgorA 363
	texture dd ? ;PIXEL *
364
	fdzdx dd ? ;float
5187 IgorA 365
	fndzdx dd ? ;float
366
	ndszdx dd ? ;float
367
	ndtzdx dd ? ;float
6113 IgorA 368
	zinv dd ? ;float
369
	f_z dd ? ;float - переменная отвечающая за геометрию текстуры
5153 IgorA 370
include 'ztriangle.inc'
371
 
372
end if
373
 
374
if 0
375
 
376
; slow but exact version (only there for reference, incorrect for 24
377
; bits)
378
 
379
INTERP_Z equ 1
380
INTERP_STZ equ 1
381
 
382
macro DRAW_INIT
383
{
5187 IgorA 384
	mov eax,[zb]
385
	mov eax,[eax+offs_zbuf_current_texture]
386
	mov [texture],eax
5153 IgorA 387
}
388
 
389
macro PUT_PIXEL _a
390
{
5187 IgorA 391
local .end_0
392
	mov eax,[z]
393
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 394
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
5187 IgorA 395
	jl .end_0
5922 IgorA 396
		;edi = pp
6126 IgorA 397
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
5187 IgorA 398
		fild dword[z]
399
		fld dword[s_z]
400
		fdiv st0,st1
6111 IgorA 401
		fistp dword[esp-4] ;s = (int) (s_z / (float) z)
402
		fld dword[t_z]
403
		fdiv st0,st1
404
		fistp dword[esp-8] ;t = (int) (t_z / (float) z)
405
		mov eax,dword[esp-8]
406
		and eax,0x3FC00000
407
		or eax,dword[esp-4]
408
		shr eax,12 ;14
409
		add eax,[texture]
410
		mov eax,[eax]
411
		stosd ;pp[_a] = texture[((t & 0x3FC00000) | s) >> 14]
412
		sub edi,4
5187 IgorA 413
	.end_0:
5175 IgorA 414
	mov eax,[dzdx]
415
	add [z],eax
5187 IgorA 416
	fld dword[dszdx]
417
	fadd dword[s_z]
418
	fstp dword[s_z]
419
	fld dword,[dtzdx]
420
	fadd dword[t_z]
421
	fstp dword[t_z]
5153 IgorA 422
}
423
 
6134 IgorA 424
align 16
5153 IgorA 425
proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
426
locals
427
	texture dd ? ;PIXEL*
428
include 'ztriangle.inc'
429
 
430
end if