source: trunk/sys/TinyGL/src/ztriangle.c @ 412

Last change on this file since 412 was 1, checked in by alain, 8 years ago

First import

File size: 7.8 KB
RevLine 
[1]1#include <stdlib.h>
2#include "zbuffer.h"
3
4#define ZCMP(z,zpix) ((z) >= (zpix))
5
6void 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
64void 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<<n))
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
174void ZB_setTexture(ZBuffer *zb,PIXEL *texture)
175{
176    zb->current_texture=texture;
177}
178
179void 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
236void 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
360void 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
Note: See TracBrowser for help on using the repository browser.