Panda3D
ztriangle_two.h
1 static void
2 FNAME(white_untextured) (ZBuffer *zb,
4 {
5 #define INTERP_Z
6 
7 #define EARLY_OUT() \
8  { \
9  }
10 
11 #define DRAW_INIT() \
12  { \
13  }
14 
15 #define PUT_PIXEL(_a) \
16  { \
17  zz=z >> ZB_POINT_Z_FRAC_BITS; \
18  if (ZCMP(pz[_a], zz)) { \
19  STORE_PIX(pp[_a], 0xffffffffUL, 0xffffUL, 0xffffUL, 0xffffUL, 0xffffUL); \
20  STORE_Z(pz[_a], zz); \
21  } \
22  z+=dzdx; \
23  }
24 
25 #define PIXEL_COUNT pixel_count_white_untextured
26 
27 #include "ztriangle.h"
28 }
29 
30 static void
31 FNAME(flat_untextured) (ZBuffer *zb,
33 {
34  int color;
35  int or0, og0, ob0, oa0;
36 
37 #define INTERP_Z
38 
39 #define EARLY_OUT() \
40  { \
41  }
42 
43 #define DRAW_INIT() \
44  { \
45  if (!ACMP(zb, p2->a)) { \
46  return; \
47  } \
48  or0 = p2->r; \
49  og0 = p2->g; \
50  ob0 = p2->b; \
51  oa0 = p2->a; \
52  color=RGBA_TO_PIXEL(or0, og0, ob0, oa0); \
53  }
54 
55 #define PUT_PIXEL(_a) \
56  { \
57  zz=z >> ZB_POINT_Z_FRAC_BITS; \
58  if (ZCMP(pz[_a], zz)) { \
59  STORE_PIX(pp[_a], color, or0, og0, ob0, oa0); \
60  STORE_Z(pz[_a], zz); \
61  } \
62  z+=dzdx; \
63  }
64 
65 #define PIXEL_COUNT pixel_count_flat_untextured
66 
67 #include "ztriangle.h"
68 }
69 
70 /*
71  * Smooth filled triangle.
72  * The code below is very tricky :)
73  */
74 
75 static void
76 FNAME(smooth_untextured) (ZBuffer *zb,
78 {
79 #define INTERP_Z
80 #define INTERP_RGB
81 
82 #define EARLY_OUT() \
83  { \
84  int c0, c1, c2; \
85  c0 = RGBA_TO_PIXEL(p0->r, p0->g, p0->b, p0->a); \
86  c1 = RGBA_TO_PIXEL(p1->r, p1->g, p1->b, p1->a); \
87  c2 = RGBA_TO_PIXEL(p2->r, p2->g, p2->b, p2->a); \
88  if (c0 == c1 && c0 == c2) { \
89  /* It's really a flat-shaded triangle. */ \
90  FNAME(flat_untextured)(zb, p0, p1, p2); \
91  return; \
92  } \
93  }
94 
95 #define DRAW_INIT() \
96  { \
97  }
98 
99 #define PUT_PIXEL(_a) \
100  { \
101  zz=z >> ZB_POINT_Z_FRAC_BITS; \
102  if (ZCMP(pz[_a], zz)) { \
103  if (ACMP(zb, oa1)) { \
104  STORE_PIX(pp[_a], RGBA_TO_PIXEL(or1, og1, ob1, oa1), or1, og1, ob1, oa1); \
105  STORE_Z(pz[_a], zz); \
106  } \
107  } \
108  z+=dzdx; \
109  og1+=dgdx; \
110  or1+=drdx; \
111  ob1+=dbdx; \
112  oa1+=dadx; \
113  }
114 
115 #define PIXEL_COUNT pixel_count_smooth_untextured
116 
117 #include "ztriangle.h"
118 }
119 
120 static void
121 FNAME(white_textured) (ZBuffer *zb,
123 {
124  ZTextureDef *texture_def;
125 
126 #define INTERP_Z
127 #define INTERP_ST
128 
129 #define EARLY_OUT() \
130  { \
131  }
132 
133 #define DRAW_INIT() \
134  { \
135  texture_def = &zb->current_textures[0]; \
136  }
137 
138 #define PUT_PIXEL(_a) \
139  { \
140  zz=z >> ZB_POINT_Z_FRAC_BITS; \
141  if (ZCMP(pz[_a], zz)) { \
142  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
143  if (ACMP(zb, PIXEL_A(tmp))) { \
144  STORE_PIX(pp[_a], tmp, PIXEL_R(tmp), PIXEL_G(tmp), PIXEL_B(tmp), PIXEL_A(tmp)); \
145  STORE_Z(pz[_a], zz); \
146  } \
147  } \
148  z+=dzdx; \
149  s+=dsdx; \
150  t+=dtdx; \
151  }
152 
153 #define PIXEL_COUNT pixel_count_white_textured
154 
155 #include "ztriangle.h"
156 }
157 
158 static void
159 FNAME(flat_textured) (ZBuffer *zb,
161 {
162  ZTextureDef *texture_def;
163  int or0, og0, ob0, oa0;
164 
165 #define INTERP_Z
166 #define INTERP_ST
167 
168 #define EARLY_OUT() \
169  { \
170  }
171 
172 #define DRAW_INIT() \
173  { \
174  if (p2->a == 0 && !ACMP(zb, p2->a)) { \
175  /* This alpha is zero, and we'll never get other than 0. */ \
176  return; \
177  } \
178  texture_def = &zb->current_textures[0]; \
179  or0 = p2->r; \
180  og0 = p2->g; \
181  ob0 = p2->b; \
182  oa0 = p2->a; \
183  }
184 
185 #define PUT_PIXEL(_a) \
186  { \
187  zz=z >> ZB_POINT_Z_FRAC_BITS; \
188  if (ZCMP(pz[_a], zz)) { \
189  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
190  int a = PALPHA_MULT(oa0, PIXEL_A(tmp)); \
191  if (ACMP(zb, a)) { \
192  STORE_PIX(pp[_a], \
193  RGBA_TO_PIXEL(PCOMPONENT_MULT(or0, PIXEL_R(tmp)), \
194  PCOMPONENT_MULT(og0, PIXEL_G(tmp)), \
195  PCOMPONENT_MULT(ob0, PIXEL_B(tmp)), \
196  a), \
197  PCOMPONENT_MULT(or0, PIXEL_R(tmp)), \
198  PCOMPONENT_MULT(og0, PIXEL_G(tmp)), \
199  PCOMPONENT_MULT(ob0, PIXEL_B(tmp)), \
200  a); \
201  STORE_Z(pz[_a], zz); \
202  } \
203  } \
204  z+=dzdx; \
205  s+=dsdx; \
206  t+=dtdx; \
207  }
208 
209 #define PIXEL_COUNT pixel_count_flat_textured
210 
211 #include "ztriangle.h"
212 }
213 
214 static void
215 FNAME(smooth_textured) (ZBuffer *zb,
217 {
218  ZTextureDef *texture_def;
219 
220 #define INTERP_Z
221 #define INTERP_ST
222 #define INTERP_RGB
223 
224 #define EARLY_OUT() \
225  { \
226  int c0, c1, c2; \
227  c0 = RGBA_TO_PIXEL(p0->r, p0->g, p0->b, p0->a); \
228  c1 = RGBA_TO_PIXEL(p1->r, p1->g, p1->b, p1->a); \
229  c2 = RGBA_TO_PIXEL(p2->r, p2->g, p2->b, p2->a); \
230  if (c0 == c1 && c0 == c2) { \
231  /* It's really a flat-shaded triangle. */ \
232  if (c0 == 0xffffffff) { \
233  /* Actually, it's a white triangle. */ \
234  FNAME(white_textured)(zb, p0, p1, p2); \
235  return; \
236  } \
237  FNAME(flat_textured)(zb, p0, p1, p2); \
238  return; \
239  } \
240  }
241 
242 #define DRAW_INIT() \
243  { \
244  texture_def = &zb->current_textures[0]; \
245  }
246 
247 #define PUT_PIXEL(_a) \
248  { \
249  zz=z >> ZB_POINT_Z_FRAC_BITS; \
250  if (ZCMP(pz[_a], zz)) { \
251  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
252  int a = PALPHA_MULT(oa1, PIXEL_A(tmp)); \
253  if (ACMP(zb, a)) { \
254  STORE_PIX(pp[_a], \
255  RGBA_TO_PIXEL(PCOMPONENT_MULT(or1, PIXEL_R(tmp)), \
256  PCOMPONENT_MULT(og1, PIXEL_G(tmp)), \
257  PCOMPONENT_MULT(ob1, PIXEL_B(tmp)), \
258  a), \
259  PCOMPONENT_MULT(or1, PIXEL_R(tmp)), \
260  PCOMPONENT_MULT(og1, PIXEL_G(tmp)), \
261  PCOMPONENT_MULT(ob1, PIXEL_B(tmp)), \
262  a); \
263  STORE_Z(pz[_a], zz); \
264  } \
265  } \
266  z+=dzdx; \
267  og1+=dgdx; \
268  or1+=drdx; \
269  ob1+=dbdx; \
270  oa1+=dadx; \
271  s+=dsdx; \
272  t+=dtdx; \
273  }
274 
275 #define PIXEL_COUNT pixel_count_smooth_textured
276 
277 #include "ztriangle.h"
278 }
279 
280 /*
281  * Texture mapping with perspective correction.
282  * We use the gradient method to make less divisions.
283  * TODO: pipeline the division
284  */
285 
286 static void
287 FNAME(white_perspective) (ZBuffer *zb,
289 {
290  ZTextureDef *texture_def;
291  PN_stdfloat fdzdx,fndzdx,ndszdx,ndtzdx;
292 
293 #define INTERP_Z
294 #define INTERP_STZ
295 
296 #define NB_INTERP 8
297 
298 #define EARLY_OUT() \
299  { \
300  }
301 
302 #define DRAW_INIT() \
303  { \
304  texture_def = &zb->current_textures[0]; \
305  fdzdx=(PN_stdfloat)dzdx; \
306  fndzdx=NB_INTERP * fdzdx; \
307  ndszdx=NB_INTERP * dszdx; \
308  ndtzdx=NB_INTERP * dtzdx; \
309  }
310 
311 
312 #define PUT_PIXEL(_a) \
313  { \
314  zz=z >> ZB_POINT_Z_FRAC_BITS; \
315  if (ZCMP(pz[_a], zz)) { \
316  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
317  if (ACMP(zb, PIXEL_A(tmp))) { \
318  STORE_PIX(pp[_a], tmp, PIXEL_R(tmp), PIXEL_G(tmp), PIXEL_B(tmp), PIXEL_A(tmp)); \
319  STORE_Z(pz[_a], zz); \
320  } \
321  } \
322  z+=dzdx; \
323  s+=dsdx; \
324  t+=dtdx; \
325  }
326 
327 #define DRAW_LINE() \
328  { \
329  ZPOINT *pz; \
330  PIXEL *pp; \
331  int s,t,z,zz; \
332  int n,dsdx,dtdx; \
333  PN_stdfloat sz,tz,fz,zinv; \
334  n=(x2>>16)-x1; \
335  fz=(PN_stdfloat)z1; \
336  zinv=1.0f / fz; \
337  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
338  pz=pz1+x1; \
339  z=z1; \
340  sz=sz1; \
341  tz=tz1; \
342  while (n>=(NB_INTERP-1)) { \
343  { \
344  PN_stdfloat ss,tt; \
345  ss=(sz * zinv); \
346  tt=(tz * zinv); \
347  s=(int) ss; \
348  t=(int) tt; \
349  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
350  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
351  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
352  fz+=fndzdx; \
353  zinv=1.0f / fz; \
354  } \
355  PUT_PIXEL(0); \
356  PUT_PIXEL(1); \
357  PUT_PIXEL(2); \
358  PUT_PIXEL(3); \
359  PUT_PIXEL(4); \
360  PUT_PIXEL(5); \
361  PUT_PIXEL(6); \
362  PUT_PIXEL(7); \
363  pz+=NB_INTERP; \
364  pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); \
365  n-=NB_INTERP; \
366  sz+=ndszdx; \
367  tz+=ndtzdx; \
368  } \
369  { \
370  PN_stdfloat ss,tt; \
371  ss=(sz * zinv); \
372  tt=(tz * zinv); \
373  s=(int) ss; \
374  t=(int) tt; \
375  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
376  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
377  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
378  } \
379  while (n>=0) { \
380  PUT_PIXEL(0); \
381  pz+=1; \
382  pp=(PIXEL *)((char *)pp + PSZB); \
383  n-=1; \
384  } \
385  }
386 
387 #define PIXEL_COUNT pixel_count_white_perspective
388 
389 #include "ztriangle.h"
390 }
391 
392 /*
393  * Flat shaded triangle, with perspective-correct mapping.
394  */
395 
396 static void
397 FNAME(flat_perspective) (ZBuffer *zb,
399 {
400  ZTextureDef *texture_def;
401  PN_stdfloat fdzdx,fndzdx,ndszdx,ndtzdx;
402  int or0, og0, ob0, oa0;
403 
404 #define INTERP_Z
405 #define INTERP_STZ
406 #define INTERP_RGB
407 
408 #define EARLY_OUT() \
409  { \
410  }
411 
412 #define DRAW_INIT() \
413  { \
414  if (p2->a == 0 && !ACMP(zb, p2->a)) { \
415  /* This alpha is zero, and we'll never get other than 0. */ \
416  return; \
417  } \
418  texture_def = &zb->current_textures[0]; \
419  fdzdx=(PN_stdfloat)dzdx; \
420  fndzdx=NB_INTERP * fdzdx; \
421  ndszdx=NB_INTERP * dszdx; \
422  ndtzdx=NB_INTERP * dtzdx; \
423  or0 = p2->r; \
424  og0 = p2->g; \
425  ob0 = p2->b; \
426  oa0 = p2->a; \
427  }
428 
429 #define PUT_PIXEL(_a) \
430  { \
431  zz=z >> ZB_POINT_Z_FRAC_BITS; \
432  if (ZCMP(pz[_a], zz)) { \
433  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
434  int a = PALPHA_MULT(oa0, PIXEL_A(tmp)); \
435  if (ACMP(zb, a)) { \
436  STORE_PIX(pp[_a], \
437  RGBA_TO_PIXEL(PCOMPONENT_MULT(or0, PIXEL_R(tmp)), \
438  PCOMPONENT_MULT(og0, PIXEL_G(tmp)), \
439  PCOMPONENT_MULT(ob0, PIXEL_B(tmp)), \
440  a), \
441  PCOMPONENT_MULT(or0, PIXEL_R(tmp)), \
442  PCOMPONENT_MULT(og0, PIXEL_G(tmp)), \
443  PCOMPONENT_MULT(ob0, PIXEL_B(tmp)), \
444  a); \
445  STORE_Z(pz[_a], zz); \
446  } \
447  } \
448  z+=dzdx; \
449  s+=dsdx; \
450  t+=dtdx; \
451  }
452 
453 #define DRAW_LINE() \
454  { \
455  ZPOINT *pz; \
456  PIXEL *pp; \
457  int s,t,z,zz; \
458  int n,dsdx,dtdx; \
459  int or1,og1,ob1,oa1; \
460  PN_stdfloat sz,tz,fz,zinv; \
461  n=(x2>>16)-x1; \
462  fz=(PN_stdfloat)z1; \
463  zinv=1.0f / fz; \
464  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
465  pz=pz1+x1; \
466  z=z1; \
467  sz=sz1; \
468  tz=tz1; \
469  or1 = r1; \
470  og1 = g1; \
471  ob1 = b1; \
472  oa1 = a1; \
473  while (n>=(NB_INTERP-1)) { \
474  { \
475  PN_stdfloat ss,tt; \
476  ss=(sz * zinv); \
477  tt=(tz * zinv); \
478  s=(int) ss; \
479  t=(int) tt; \
480  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
481  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
482  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
483  fz+=fndzdx; \
484  zinv=1.0f / fz; \
485  } \
486  PUT_PIXEL(0); \
487  PUT_PIXEL(1); \
488  PUT_PIXEL(2); \
489  PUT_PIXEL(3); \
490  PUT_PIXEL(4); \
491  PUT_PIXEL(5); \
492  PUT_PIXEL(6); \
493  PUT_PIXEL(7); \
494  pz+=NB_INTERP; \
495  pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); \
496  n-=NB_INTERP; \
497  sz+=ndszdx; \
498  tz+=ndtzdx; \
499  } \
500  { \
501  PN_stdfloat ss,tt; \
502  ss=(sz * zinv); \
503  tt=(tz * zinv); \
504  s=(int) ss; \
505  t=(int) tt; \
506  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
507  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
508  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
509  } \
510  while (n>=0) { \
511  PUT_PIXEL(0); \
512  pz+=1; \
513  pp=(PIXEL *)((char *)pp + PSZB); \
514  n-=1; \
515  } \
516  }
517 
518 #define PIXEL_COUNT pixel_count_flat_perspective
519 
520 #include "ztriangle.h"
521 }
522 
523 /*
524  * Smooth filled triangle, with perspective-correct mapping.
525  */
526 
527 static void
528 FNAME(smooth_perspective) (ZBuffer *zb,
530 {
531  ZTextureDef *texture_def;
532  PN_stdfloat fdzdx,fndzdx,ndszdx,ndtzdx;
533 
534 #define INTERP_Z
535 #define INTERP_STZ
536 #define INTERP_RGB
537 
538 #define EARLY_OUT() \
539  { \
540  int c0, c1, c2; \
541  c0 = RGBA_TO_PIXEL(p0->r, p0->g, p0->b, p0->a); \
542  c1 = RGBA_TO_PIXEL(p1->r, p1->g, p1->b, p1->a); \
543  c2 = RGBA_TO_PIXEL(p2->r, p2->g, p2->b, p2->a); \
544  if (c0 == c1 && c0 == c2) { \
545  /* It's really a flat-shaded triangle. */ \
546  if (c0 == 0xffffffff) { \
547  /* Actually, it's a white triangle. */ \
548  FNAME(white_perspective)(zb, p0, p1, p2); \
549  return; \
550  } \
551  FNAME(flat_perspective)(zb, p0, p1, p2); \
552  return; \
553  } \
554  }
555 
556 #define DRAW_INIT() \
557  { \
558  texture_def = &zb->current_textures[0]; \
559  fdzdx=(PN_stdfloat)dzdx; \
560  fndzdx=NB_INTERP * fdzdx; \
561  ndszdx=NB_INTERP * dszdx; \
562  ndtzdx=NB_INTERP * dtzdx; \
563  }
564 
565 #define PUT_PIXEL(_a) \
566  { \
567  zz=z >> ZB_POINT_Z_FRAC_BITS; \
568  if (ZCMP(pz[_a], zz)) { \
569  tmp = ZB_LOOKUP_TEXTURE(texture_def, s, t, mipmap_level, mipmap_dx); \
570  int a = PALPHA_MULT(oa1, PIXEL_A(tmp)); \
571  if (ACMP(zb, a)) { \
572  STORE_PIX(pp[_a], \
573  RGBA_TO_PIXEL(PCOMPONENT_MULT(or1, PIXEL_R(tmp)), \
574  PCOMPONENT_MULT(og1, PIXEL_G(tmp)), \
575  PCOMPONENT_MULT(ob1, PIXEL_B(tmp)), \
576  a), \
577  PCOMPONENT_MULT(or1, PIXEL_R(tmp)), \
578  PCOMPONENT_MULT(og1, PIXEL_G(tmp)), \
579  PCOMPONENT_MULT(ob1, PIXEL_B(tmp)), \
580  a); \
581  STORE_Z(pz[_a], zz); \
582  } \
583  } \
584  z+=dzdx; \
585  og1+=dgdx; \
586  or1+=drdx; \
587  ob1+=dbdx; \
588  oa1+=dadx; \
589  s+=dsdx; \
590  t+=dtdx; \
591  }
592 
593 #define DRAW_LINE() \
594  { \
595  ZPOINT *pz; \
596  PIXEL *pp; \
597  int s,t,z,zz; \
598  int n,dsdx,dtdx; \
599  int or1,og1,ob1,oa1; \
600  PN_stdfloat sz,tz,fz,zinv; \
601  n=(x2>>16)-x1; \
602  fz=(PN_stdfloat)z1; \
603  zinv=1.0f / fz; \
604  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
605  pz=pz1+x1; \
606  z=z1; \
607  sz=sz1; \
608  tz=tz1; \
609  or1 = r1; \
610  og1 = g1; \
611  ob1 = b1; \
612  oa1 = a1; \
613  while (n>=(NB_INTERP-1)) { \
614  { \
615  PN_stdfloat ss,tt; \
616  ss=(sz * zinv); \
617  tt=(tz * zinv); \
618  s=(int) ss; \
619  t=(int) tt; \
620  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
621  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
622  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
623  fz+=fndzdx; \
624  zinv=1.0f / fz; \
625  } \
626  PUT_PIXEL(0); \
627  PUT_PIXEL(1); \
628  PUT_PIXEL(2); \
629  PUT_PIXEL(3); \
630  PUT_PIXEL(4); \
631  PUT_PIXEL(5); \
632  PUT_PIXEL(6); \
633  PUT_PIXEL(7); \
634  pz+=NB_INTERP; \
635  pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); \
636  n-=NB_INTERP; \
637  sz+=ndszdx; \
638  tz+=ndtzdx; \
639  } \
640  { \
641  PN_stdfloat ss,tt; \
642  ss=(sz * zinv); \
643  tt=(tz * zinv); \
644  s=(int) ss; \
645  t=(int) tt; \
646  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
647  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
648  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
649  } \
650  while (n>=0) { \
651  PUT_PIXEL(0); \
652  pz+=1; \
653  pp=(PIXEL *)((char *)pp + PSZB); \
654  n-=1; \
655  } \
656  }
657 
658 #define PIXEL_COUNT pixel_count_smooth_perspective
659 
660 #include "ztriangle.h"
661 }
662 
663 /*
664  * Smooth filled triangle, with perspective-correct mapping, on two
665  * stages of multitexture.
666  */
667 
668 static void
669 FNAME(smooth_multitex2) (ZBuffer *zb,
671 {
672  PN_stdfloat fdzdx,fndzdx,ndszdx,ndtzdx,ndszadx,ndtzadx;
673 
674 #define INTERP_Z
675 #define INTERP_STZ
676 #define INTERP_STZA
677 #define INTERP_RGB
678 
679 #define EARLY_OUT() \
680  { \
681  }
682 
683 #define DRAW_INIT() \
684  { \
685  fdzdx=(PN_stdfloat)dzdx; \
686  fndzdx=NB_INTERP * fdzdx; \
687  ndszdx=NB_INTERP * dszdx; \
688  ndtzdx=NB_INTERP * dtzdx; \
689  ndszadx=NB_INTERP * dszadx; \
690  ndtzadx=NB_INTERP * dtzadx; \
691  }
692 
693 #define PUT_PIXEL(_a) \
694  { \
695  zz=z >> ZB_POINT_Z_FRAC_BITS; \
696  if (ZCMP(pz[_a], zz)) { \
697  tmp = ZB_LOOKUP_TEXTURE(&zb->current_textures[0], s, t, mipmap_level, mipmap_dx); \
698  int a = PALPHA_MULT(oa1, PIXEL_A(tmp)); \
699  if (ACMP(zb, a)) { \
700  int tmpa = ZB_LOOKUP_TEXTURE(&zb->current_textures[1], sa, ta, mipmap_levela, mipmap_dxa); \
701  STORE_PIX(pp[_a], \
702  RGBA_TO_PIXEL(PCOMPONENT_MULT3(or1, PIXEL_R(tmp), PIXEL_R(tmpa)), \
703  PCOMPONENT_MULT3(og1, PIXEL_G(tmp), PIXEL_G(tmpa)), \
704  PCOMPONENT_MULT3(ob1, PIXEL_B(tmp), PIXEL_B(tmpa)), \
705  a), \
706  PCOMPONENT_MULT3(or1, PIXEL_R(tmp), PIXEL_R(tmpa)), \
707  PCOMPONENT_MULT3(og1, PIXEL_G(tmp), PIXEL_G(tmpa)), \
708  PCOMPONENT_MULT3(ob1, PIXEL_B(tmp), PIXEL_B(tmpa)), \
709  a); \
710  STORE_Z(pz[_a], zz); \
711  } \
712  } \
713  z+=dzdx; \
714  og1+=dgdx; \
715  or1+=drdx; \
716  ob1+=dbdx; \
717  oa1+=dadx; \
718  s+=dsdx; \
719  t+=dtdx; \
720  sa+=dsadx; \
721  ta+=dtadx; \
722  }
723 
724 #define DRAW_LINE() \
725  { \
726  ZPOINT *pz; \
727  PIXEL *pp; \
728  int s,t,sa,ta,z,zz; \
729  int n,dsdx,dtdx,dsadx,dtadx; \
730  int or1,og1,ob1,oa1; \
731  PN_stdfloat sz,tz,sza,tza,fz,zinv; \
732  n=(x2>>16)-x1; \
733  fz=(PN_stdfloat)z1; \
734  zinv=1.0f / fz; \
735  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
736  pz=pz1+x1; \
737  z=z1; \
738  sz=sz1; \
739  tz=tz1; \
740  sza=sza1; \
741  tza=tza1; \
742  or1 = r1; \
743  og1 = g1; \
744  ob1 = b1; \
745  oa1 = a1; \
746  while (n>=(NB_INTERP-1)) { \
747  { \
748  PN_stdfloat ss,tt; \
749  ss=(sz * zinv); \
750  tt=(tz * zinv); \
751  s=(int) ss; \
752  t=(int) tt; \
753  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
754  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
755  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
756  } \
757  { \
758  PN_stdfloat ssa,tta; \
759  ssa=(sza * zinv); \
760  tta=(tza * zinv); \
761  sa=(int) ssa; \
762  ta=(int) tta; \
763  dsadx= (int)( (dszadx - ssa*fdzdx)*zinv ); \
764  dtadx= (int)( (dtzadx - tta*fdzdx)*zinv ); \
765  CALC_MIPMAP_LEVEL(mipmap_levela, mipmap_dxa, dsadx, dtadx); \
766  } \
767  fz+=fndzdx; \
768  zinv=1.0f / fz; \
769  PUT_PIXEL(0); \
770  PUT_PIXEL(1); \
771  PUT_PIXEL(2); \
772  PUT_PIXEL(3); \
773  PUT_PIXEL(4); \
774  PUT_PIXEL(5); \
775  PUT_PIXEL(6); \
776  PUT_PIXEL(7); \
777  pz+=NB_INTERP; \
778  pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); \
779  n-=NB_INTERP; \
780  sz+=ndszdx; \
781  tz+=ndtzdx; \
782  sza+=ndszadx; \
783  tza+=ndtzadx; \
784  } \
785  { \
786  PN_stdfloat ss,tt; \
787  ss=(sz * zinv); \
788  tt=(tz * zinv); \
789  s=(int) ss; \
790  t=(int) tt; \
791  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
792  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
793  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
794  } \
795  { \
796  PN_stdfloat ssa,tta; \
797  ssa=(sza * zinv); \
798  tta=(tza * zinv); \
799  sa=(int) ssa; \
800  ta=(int) tta; \
801  dsadx= (int)( (dszadx - ssa*fdzdx)*zinv ); \
802  dtadx= (int)( (dtzadx - tta*fdzdx)*zinv ); \
803  CALC_MIPMAP_LEVEL(mipmap_levela, mipmap_dxa, dsadx, dtadx); \
804  } \
805  while (n>=0) { \
806  PUT_PIXEL(0); \
807  pz+=1; \
808  pp=(PIXEL *)((char *)pp + PSZB); \
809  n-=1; \
810  } \
811  }
812 
813 #define PIXEL_COUNT pixel_count_smooth_multitex2
814 
815 #include "ztriangle.h"
816 }
817 
818 /*
819  * Smooth filled triangle, with perspective-correct mapping, on three
820  * stages of multitexture.
821  */
822 
823 static void
824 FNAME(smooth_multitex3) (ZBuffer *zb,
826 {
827  PN_stdfloat fdzdx,fndzdx,ndszdx,ndtzdx,ndszadx,ndtzadx,ndszbdx,ndtzbdx;
828 
829 #define INTERP_Z
830 #define INTERP_STZ
831 #define INTERP_STZA
832 #define INTERP_STZB
833 #define INTERP_RGB
834 
835 #define EARLY_OUT() \
836  { \
837  }
838 
839 #define DRAW_INIT() \
840  { \
841  fdzdx=(PN_stdfloat)dzdx; \
842  fndzdx=NB_INTERP * fdzdx; \
843  ndszdx=NB_INTERP * dszdx; \
844  ndtzdx=NB_INTERP * dtzdx; \
845  ndszadx=NB_INTERP * dszadx; \
846  ndtzadx=NB_INTERP * dtzadx; \
847  ndszbdx=NB_INTERP * dszbdx; \
848  ndtzbdx=NB_INTERP * dtzbdx; \
849  }
850 
851 #define PUT_PIXEL(_a) \
852  { \
853  zz=z >> ZB_POINT_Z_FRAC_BITS; \
854  if (ZCMP(pz[_a], zz)) { \
855  tmp = ZB_LOOKUP_TEXTURE(&zb->current_textures[0], s, t, mipmap_level, mipmap_dx); \
856  int a = PALPHA_MULT(oa1, PIXEL_A(tmp)); \
857  if (ACMP(zb, a)) { \
858  int tmpa = ZB_LOOKUP_TEXTURE(&zb->current_textures[1], sa, ta, mipmap_levela, mipmap_dxa); \
859  int tmpb = ZB_LOOKUP_TEXTURE(&zb->current_textures[2], sb, tb, mipmap_levelb, mipmap_dxb); \
860  STORE_PIX(pp[_a], \
861  RGBA_TO_PIXEL(PCOMPONENT_MULT4(or1, PIXEL_R(tmp), PIXEL_R(tmpa), PIXEL_R(tmpb)), \
862  PCOMPONENT_MULT4(og1, PIXEL_G(tmp), PIXEL_G(tmpa), PIXEL_G(tmpb)), \
863  PCOMPONENT_MULT4(ob1, PIXEL_B(tmp), PIXEL_B(tmpa), PIXEL_B(tmpb)), \
864  a), \
865  PCOMPONENT_MULT4(or1, PIXEL_R(tmp), PIXEL_R(tmpa), PIXEL_R(tmpb)), \
866  PCOMPONENT_MULT4(og1, PIXEL_G(tmp), PIXEL_G(tmpa), PIXEL_G(tmpb)), \
867  PCOMPONENT_MULT4(ob1, PIXEL_B(tmp), PIXEL_B(tmpa), PIXEL_B(tmpb)), \
868  a); \
869  STORE_Z(pz[_a], zz); \
870  } \
871  } \
872  z+=dzdx; \
873  og1+=dgdx; \
874  or1+=drdx; \
875  ob1+=dbdx; \
876  oa1+=dadx; \
877  s+=dsdx; \
878  t+=dtdx; \
879  sa+=dsadx; \
880  ta+=dtadx; \
881  sb+=dsbdx; \
882  tb+=dtbdx; \
883  }
884 
885 #define DRAW_LINE() \
886  { \
887  ZPOINT *pz; \
888  PIXEL *pp; \
889  int s,t,sa,ta,sb,tb,z,zz; \
890  int n,dsdx,dtdx,dsadx,dtadx,dsbdx,dtbdx; \
891  int or1,og1,ob1,oa1; \
892  PN_stdfloat sz,tz,sza,tza,szb,tzb,fz,zinv; \
893  n=(x2>>16)-x1; \
894  fz=(PN_stdfloat)z1; \
895  zinv=1.0f / fz; \
896  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
897  pz=pz1+x1; \
898  z=z1; \
899  sz=sz1; \
900  tz=tz1; \
901  sza=sza1; \
902  tza=tza1; \
903  szb=szb1; \
904  tzb=tzb1; \
905  or1 = r1; \
906  og1 = g1; \
907  ob1 = b1; \
908  oa1 = a1; \
909  while (n>=(NB_INTERP-1)) { \
910  { \
911  PN_stdfloat ss,tt; \
912  ss=(sz * zinv); \
913  tt=(tz * zinv); \
914  s=(int) ss; \
915  t=(int) tt; \
916  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
917  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
918  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
919  } \
920  { \
921  PN_stdfloat ssa,tta; \
922  ssa=(sza * zinv); \
923  tta=(tza * zinv); \
924  sa=(int) ssa; \
925  ta=(int) tta; \
926  dsadx= (int)( (dszadx - ssa*fdzdx)*zinv ); \
927  dtadx= (int)( (dtzadx - tta*fdzdx)*zinv ); \
928  CALC_MIPMAP_LEVEL(mipmap_levela, mipmap_dxa, dsadx, dtadx); \
929  } \
930  { \
931  PN_stdfloat ssb,ttb; \
932  ssb=(szb * zinv); \
933  ttb=(tzb * zinv); \
934  sb=(int) ssb; \
935  tb=(int) ttb; \
936  dsbdx= (int)( (dszbdx - ssb*fdzdx)*zinv ); \
937  dtbdx= (int)( (dtzbdx - ttb*fdzdx)*zinv ); \
938  CALC_MIPMAP_LEVEL(mipmap_levelb, mipmap_dxb, dsbdx, dtbdx); \
939  } \
940  fz+=fndzdx; \
941  zinv=1.0f / fz; \
942  PUT_PIXEL(0); \
943  PUT_PIXEL(1); \
944  PUT_PIXEL(2); \
945  PUT_PIXEL(3); \
946  PUT_PIXEL(4); \
947  PUT_PIXEL(5); \
948  PUT_PIXEL(6); \
949  PUT_PIXEL(7); \
950  pz+=NB_INTERP; \
951  pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); \
952  n-=NB_INTERP; \
953  sz+=ndszdx; \
954  tz+=ndtzdx; \
955  sza+=ndszadx; \
956  tza+=ndtzadx; \
957  szb+=ndszbdx; \
958  tzb+=ndtzbdx; \
959  } \
960  { \
961  PN_stdfloat ss,tt; \
962  ss=(sz * zinv); \
963  tt=(tz * zinv); \
964  s=(int) ss; \
965  t=(int) tt; \
966  dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); \
967  dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); \
968  CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx); \
969  } \
970  { \
971  PN_stdfloat ssa,tta; \
972  ssa=(sza * zinv); \
973  tta=(tza * zinv); \
974  sa=(int) ssa; \
975  ta=(int) tta; \
976  dsadx= (int)( (dszadx - ssa*fdzdx)*zinv ); \
977  dtadx= (int)( (dtzadx - tta*fdzdx)*zinv ); \
978  CALC_MIPMAP_LEVEL(mipmap_levela, mipmap_dxa, dsadx, dtadx); \
979  } \
980  { \
981  PN_stdfloat ssb,ttb; \
982  ssb=(szb * zinv); \
983  ttb=(tzb * zinv); \
984  sb=(int) ssb; \
985  tb=(int) ttb; \
986  dsbdx= (int)( (dszbdx - ssb*fdzdx)*zinv ); \
987  dtbdx= (int)( (dtzbdx - ttb*fdzdx)*zinv ); \
988  CALC_MIPMAP_LEVEL(mipmap_levelb, mipmap_dxb, dsbdx, dtbdx); \
989  } \
990  while (n>=0) { \
991  PUT_PIXEL(0); \
992  pz+=1; \
993  pp=(PIXEL *)((char *)pp + PSZB); \
994  n-=1; \
995  } \
996  }
997 
998 #define PIXEL_COUNT pixel_count_smooth_multitex3
999 
1000 #include "ztriangle.h"
1001 }
1002 
1003 #undef ACMP
1004 #undef ZCMP
1005 #undef STORE_PIX
1006 #undef STORE_Z
1007 #undef FNAME
1008 #undef INTERP_MIPMAP
1009 #undef CALC_MIPMAP_LEVEL
1010 #undef ZB_LOOKUP_TEXTURE