Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
#include 
2
#include "zbuffer.h"
3
 
4
#define ZCMP(z,zpix) ((z) >= (zpix))
5
 
6
void ZB_fillTriangleFlat(ZBuffer *zb,
7
			 ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
8
{
9
#if TGL_FEATURE_RENDER_BITS == 24
10
    unsigned char colorR, colorG, colorB;
11
#else
12
    int color;
13
#endif
14
 
15
#define INTERP_Z
16
 
17
#if TGL_FEATURE_RENDER_BITS == 24
18
 
19
#define DRAW_INIT()				\
20
{						\
21
  colorR=p2->r>>8; \
22
  colorG=p2->g>>8; \
23
  colorB=p2->b>>8; \
24
}
25
 
26
#define PUT_PIXEL(_a)		\
27
{						\
28
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
29
    if (ZCMP(zz,pz[_a])) {				\
30
      pp[3 * _a]=colorR;\
31
      pp[3 * _a + 1]=colorG;\
32
      pp[3 * _a + 2]=colorB;\
33
      pz[_a]=zz;				\
34
    }\
35
    z+=dzdx;					\
36
}
37
 
38
#else
39
 
40
#define DRAW_INIT()				\
41
{						\
42
  color=RGB_TO_PIXEL(p2->r,p2->g,p2->b);	\
43
}
44
 
45
#define PUT_PIXEL(_a)				\
46
{						\
47
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
48
    if (ZCMP(zz,pz[_a])) {				\
49
      pp[_a]=color;				\
50
      pz[_a]=zz;				\
51
    }						\
52
    z+=dzdx;					\
53
}
54
#endif /* TGL_FEATURE_RENDER_BITS == 24 */
55
 
56
#include "ztriangle.h"
57
}
58
 
59
/*
60
 * Smooth filled triangle.
61
 * The code below is very tricky :)
62
 */
63
 
64
void ZB_fillTriangleSmooth(ZBuffer *zb,
65
			   ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
66
{
67
#if TGL_FEATURE_RENDER_BITS == 16
68
        int _drgbdx;
69
#endif
70
 
71
#define INTERP_Z
72
#define INTERP_RGB
73
 
74
#define SAR_RND_TO_ZERO(v,n) (v / (1<
75
 
76
#if TGL_FEATURE_RENDER_BITS == 24
77
 
78
#define DRAW_INIT() 				\
79
{						\
80
}
81
 
82
#define PUT_PIXEL(_a)				\
83
{						\
84
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
85
    if (ZCMP(zz,pz[_a])) {				\
86
      pp[3 * _a]=or1 >> 8;\
87
      pp[3 * _a + 1]=og1 >> 8;\
88
      pp[3 * _a + 2]=ob1 >> 8;\
89
      pz[_a]=zz;				\
90
    }\
91
    z+=dzdx;					\
92
    og1+=dgdx;					\
93
    or1+=drdx;					\
94
    ob1+=dbdx;					\
95
}
96
 
97
#elif TGL_FEATURE_RENDER_BITS == 16
98
 
99
#define DRAW_INIT() 				\
100
{						\
101
  _drgbdx=(SAR_RND_TO_ZERO(drdx,6) << 22) & 0xFFC00000;		\
102
  _drgbdx|=SAR_RND_TO_ZERO(dgdx,5) & 0x000007FF;		\
103
  _drgbdx|=(SAR_RND_TO_ZERO(dbdx,7) << 12) & 0x001FF000; 	\
104
}
105
 
106
 
107
#define PUT_PIXEL(_a)				\
108
{						\
109
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
110
    if (ZCMP(zz,pz[_a])) {				\
111
      tmp=rgb & 0xF81F07E0;			\
112
      pp[_a]=tmp | (tmp >> 16);			\
113
      pz[_a]=zz;				\
114
    }						\
115
    z+=dzdx;					\
116
    rgb=(rgb+drgbdx) & ( ~ 0x00200800);		\
117
}
118
 
119
#define DRAW_LINE()							   \
120
{									   \
121
  register unsigned short *pz;					   \
122
  register PIXEL *pp;					   \
123
  register unsigned int tmp,z,zz,rgb,drgbdx;				   \
124
  register int n;							   \
125
  n=(x2 >> 16) - x1;							   \
126
  pp=pp1+x1;								   \
127
  pz=pz1+x1;								   \
128
  z=z1;									   \
129
  rgb=(r1 << 16) & 0xFFC00000;						   \
130
  rgb|=(g1 >> 5) & 0x000007FF;						   \
131
  rgb|=(b1 << 5) & 0x001FF000;						   \
132
  drgbdx=_drgbdx;							   \
133
  while (n>=3) {							   \
134
    PUT_PIXEL(0);							   \
135
    PUT_PIXEL(1);							   \
136
    PUT_PIXEL(2);							   \
137
    PUT_PIXEL(3);							   \
138
    pz+=4;								   \
139
    pp+=4;								   \
140
    n-=4;								   \
141
  }									   \
142
  while (n>=0) {							   \
143
    PUT_PIXEL(0);							   \
144
    pz+=1;								   \
145
    pp+=1;								   \
146
    n-=1;								   \
147
  }									   \
148
}
149
 
150
#else
151
 
152
#define DRAW_INIT() 				\
153
{						\
154
}
155
 
156
#define PUT_PIXEL(_a)				\
157
{						\
158
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
159
    if (ZCMP(zz,pz[_a])) {				\
160
      pp[_a] = RGB_TO_PIXEL(or1, og1, ob1);\
161
      pz[_a]=zz;				\
162
    }\
163
    z+=dzdx;					\
164
    og1+=dgdx;					\
165
    or1+=drdx;					\
166
    ob1+=dbdx;					\
167
}
168
 
169
#endif /* TGL_FEATURE_RENDER_BITS */
170
 
171
#include "ztriangle.h"
172
}
173
 
174
void ZB_setTexture(ZBuffer *zb,PIXEL *texture)
175
{
176
    zb->current_texture=texture;
177
}
178
 
179
void ZB_fillTriangleMapping(ZBuffer *zb,
180
			    ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
181
{
182
    PIXEL *texture;
183
 
184
#define INTERP_Z
185
#define INTERP_ST
186
 
187
#define DRAW_INIT()				\
188
{						\
189
  texture=zb->current_texture;			\
190
}
191
 
192
#if TGL_FEATURE_RENDER_BITS == 24
193
 
194
#define PUT_PIXEL(_a)				\
195
{						\
196
   unsigned char *ptr;\
197
   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
198
     if (ZCMP(zz,pz[_a])) {				\
199
       ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; \
200
       pp[3 * _a]= ptr[0];\
201
       pp[3 * _a + 1]= ptr[1];\
202
       pp[3 * _a + 2]= ptr[2];\
203
       pz[_a]=zz;				\
204
    }						\
205
    z+=dzdx;					\
206
    s+=dsdx;					\
207
    t+=dtdx;					\
208
}
209
 
210
#else
211
 
212
#define PUT_PIXEL(_a)				\
213
{						\
214
   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
215
     if (ZCMP(zz,pz[_a])) {				\
216
       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];	\
217
       pz[_a]=zz;				\
218
    }						\
219
    z+=dzdx;					\
220
    s+=dsdx;					\
221
    t+=dtdx;					\
222
}
223
 
224
#endif
225
 
226
#include "ztriangle.h"
227
}
228
 
229
/*
230
 * Texture mapping with perspective correction.
231
 * We use the gradient method to make less divisions.
232
 * TODO: pipeline the division
233
 */
234
#if 1
235
 
236
void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
237
                            ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
238
{
239
    PIXEL *texture;
240
    float fdzdx,fndzdx,ndszdx,ndtzdx;
241
 
242
#define INTERP_Z
243
#define INTERP_STZ
244
 
245
#define NB_INTERP 8
246
 
247
#define DRAW_INIT()				\
248
{						\
249
  texture=zb->current_texture;\
250
  fdzdx=(float)dzdx;\
251
  fndzdx=NB_INTERP * fdzdx;\
252
  ndszdx=NB_INTERP * dszdx;\
253
  ndtzdx=NB_INTERP * dtzdx;\
254
}
255
 
256
 
257
#if TGL_FEATURE_RENDER_BITS == 24
258
 
259
#define PUT_PIXEL(_a)				\
260
{						\
261
   unsigned char *ptr;\
262
   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
263
     if (ZCMP(zz,pz[_a])) {				\
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
       pz[_a]=zz;				\
269
    }						\
270
    z+=dzdx;					\
271
    s+=dsdx;					\
272
    t+=dtdx;					\
273
}
274
 
275
#else
276
 
277
#define PUT_PIXEL(_a)				\
278
{						\
279
   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
280
     if (ZCMP(zz,pz[_a])) {				\
281
       pp[_a]=*(PIXEL *)((char *)texture+ \
282
               (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));\
283
       pz[_a]=zz;				\
284
    }						\
285
    z+=dzdx;					\
286
    s+=dsdx;					\
287
    t+=dtdx;					\
288
}
289
 
290
#endif
291
 
292
#define DRAW_LINE()				\
293
{						\
294
  register unsigned short *pz;		\
295
  register PIXEL *pp;		\
296
  register unsigned int s,t,z,zz;	\
297
  register int n,dsdx,dtdx;		\
298
  float sz,tz,fz,zinv; \
299
  n=(x2>>16)-x1;                             \
300
  fz=(float)z1;\
301
  zinv=1.0 / fz;\
302
  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
303
  pz=pz1+x1;					\
304
  z=z1;						\
305
  sz=sz1;\
306
  tz=tz1;\
307
  while (n>=(NB_INTERP-1)) {						   \
308
    {\
309
      float ss,tt;\
310
      ss=(sz * zinv);\
311
      tt=(tz * zinv);\
312
      s=(int) ss;\
313
      t=(int) tt;\
314
      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\
315
      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\
316
      fz+=fndzdx;\
317
      zinv=1.0 / fz;\
318
    }\
319
    PUT_PIXEL(0);							   \
320
    PUT_PIXEL(1);							   \
321
    PUT_PIXEL(2);							   \
322
    PUT_PIXEL(3);							   \
323
    PUT_PIXEL(4);							   \
324
    PUT_PIXEL(5);							   \
325
    PUT_PIXEL(6);							   \
326
    PUT_PIXEL(7);							   \
327
    pz+=NB_INTERP;							   \
328
    pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);\
329
    n-=NB_INTERP;							   \
330
    sz+=ndszdx;\
331
    tz+=ndtzdx;\
332
  }									   \
333
    {\
334
      float ss,tt;\
335
      ss=(sz * zinv);\
336
      tt=(tz * zinv);\
337
      s=(int) ss;\
338
      t=(int) tt;\
339
      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\
340
      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\
341
    }\
342
  while (n>=0) {							   \
343
    PUT_PIXEL(0);							   \
344
    pz+=1;								   \
345
    pp=(PIXEL *)((char *)pp + PSZB);\
346
    n-=1;								   \
347
  }									   \
348
}
349
 
350
#include "ztriangle.h"
351
}
352
 
353
#endif
354
 
355
#if 0
356
 
357
/* slow but exact version (only there for reference, incorrect for 24
358
   bits) */
359
 
360
void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
361
                            ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
362
{
363
    PIXEL *texture;
364
 
365
#define INTERP_Z
366
#define INTERP_STZ
367
 
368
#define DRAW_INIT()				\
369
{						\
370
  texture=zb->current_texture;			\
371
}
372
 
373
#define PUT_PIXEL(_a)				\
374
{						\
375
   float zinv; \
376
   int s,t; \
377
   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
378
     if (ZCMP(zz,pz[_a])) {				\
379
       zinv= 1.0 / (float) z; \
380
       s= (int) (sz * zinv); \
381
       t= (int) (tz * zinv); \
382
       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];	\
383
       pz[_a]=zz;				\
384
    }						\
385
    z+=dzdx;					\
386
    sz+=dszdx;					\
387
    tz+=dtzdx;					\
388
}
389
 
390
#include "ztriangle.h"
391
}
392
 
393
 
394
#endif