Subversion Repositories Kolibri OS

Rev

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

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