Subversion Repositories Kolibri OS

Rev

Rev 5175 | Rev 5208 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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