20#ifndef _TGX_SHADERS_H_
21#define _TGX_SHADERS_H_
36 return ((v < 0) ? 0 : ((v > maxv) ? maxv : v));
44 template<
typename color_t,
typename ZBUFFER_t>
45 void shader_test(
const int32_t& offset,
const int32_t& lx,
const int32_t& ly,
46 const int32_t& dx1,
const int32_t& dy1, int32_t O1,
const tgx::RasterizerVec4& fP1,
47 const int32_t& dx2,
const int32_t& dy2, int32_t O2,
const tgx::RasterizerVec4& fP2,
48 const int32_t& dx3,
const int32_t& dy3, int32_t O3,
const tgx::RasterizerVec4& fP3,
49 const tgx::RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
52 color_t* buf = data.im->data() + offset;
53 const int32_t stride = data.im->stride();
54 for (
int y = 0; y < ly; y++)
56 for (
int x = 0; x < lx; x++)
58 const int32_t o1 = O1 + dx1 * x + dy1 * y;
59 const int32_t o2 = O2 + dx2 * x + dy2 * y;
60 const int32_t o3 = O3 + dx3 * x + dy3 * y;
61 if ((o1 >= 0) && (o2 >= 0) && (o3 >= 0))
63 buf[x + stride * y].
blend256(col, 128);
73 template<
typename color_t,
typename ZBUFFER_t>
74 void shader_Flat(
const int32_t& offset,
const int32_t& lx,
const int32_t& ly,
75 const int32_t& dx1,
const int32_t& dy1, int32_t O1,
const RasterizerVec4& fP1,
76 const int32_t& dx2,
const int32_t& dy2, int32_t O2,
const RasterizerVec4& fP2,
77 const int32_t& dx3,
const int32_t& dy3, int32_t O3,
const RasterizerVec4& fP3,
78 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
80 color_t col = (color_t)data.facecolor;
81 color_t* buf = data.im->data() + offset;
82 const int32_t stride = data.im->stride();
84 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
86 while ((uintptr_t)(buf) < end)
92 bx = (-O1 + dx1 - 1) / dx1;
99 const int32_t by = (-O2 + dy2 - 1) / dy2;
103 const int32_t offs = by * stride;
107 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
113 if (dy3 <= 0)
return;
114 const int32_t by = (-O3 + dy3 - 1) / dy3;
118 const int32_t offs = by * stride;
122 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
125 int32_t C2 = O2 + (dx2 * bx);
126 int32_t C3 = O3 + (dx3 * bx);
127 while ((bx < lx) && ((C2 | C3) >= 0))
148 template<
typename color_t,
typename ZBUFFER_t>
150 const int32_t& dx1,
const int32_t& dy1, int32_t O1,
const RasterizerVec4& fP1,
151 const int32_t& dx2,
const int32_t& dy2, int32_t O2,
const RasterizerVec4& fP2,
152 const int32_t& dx3,
const int32_t& dy3, int32_t O3,
const RasterizerVec4& fP3,
153 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
155 color_t* buf = data.im->data() + offset;
156 const int32_t stride = data.im->stride();
158 const color_t col1 = (color_t)fP1.color;
159 const color_t col2 = (color_t)fP2.color;
160 const color_t col3 = (color_t)fP3.color;
162 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
163 const int32_t pa = O1 + O2 + O3;
164 const int32_t E = ((pa == 0) ? 1 : 0);
165 const int32_t aera = pa + E;
166 const int shiftC = (aera > (1 << 22)) ? 10 : 0;
168 while ((uintptr_t)(buf) < end)
174 bx = (-O1 + dx1 - 1) / dx1;
180 if (dy2 <= 0)
return;
181 const int32_t by = (-O2 + dy2 - 1) / dy2;
185 const int32_t offs = by * stride;
189 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
195 if (dy3 <= 0)
return;
196 const int32_t by = (-O3 + dy3 - 1) / dy3;
200 const int32_t offs = by * stride;
204 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
207 int32_t C2 = O2 + (dx2 * bx);
208 int32_t C3 = O3 + (dx3 * bx);
209 while ((bx < lx) && ((C2 | C3) >= 0))
229 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
231 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
232 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
233 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
234 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
236 color_t* buf = data.im->data() + offset;
237 const int32_t stride = data.im->stride();
239 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
240 const int32_t pa = O1 + O2 + O3;
241 const int32_t E = ((pa == 0) ? 1 : 0);
242 const int32_t aera = pa + E;
245 const float invaera =
fast_inv((
float)aera);
246 const float fP1a = fP1.w * invaera;
247 const float fP2a = fP2.w * invaera;
248 const float fP3a = fP3.w * invaera;
250 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
252 const RGBf& cf = (
RGBf)data.facecolor;
253 const int fPR = (
int)(256 * cf.
R);
254 const int fPG = (int)(256 * cf.
G);
255 const int fPB = (int)(256 * cf.
B);
262 const color_t* tex = data.tex->data();
263 const int32_t texsize_x = data.tex->width();
264 const int32_t texsize_y = data.tex->height();
265 const int32_t texsize_x_mm = texsize_x - 1;
266 const int32_t texsize_y_mm = texsize_y - 1;
267 const int32_t texstride = data.tex->stride();
280 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
281 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
283 while ((uintptr_t)(buf) < end)
289 bx = (-O1 + dx1 - 1) / dx1;
295 if (dy2 <= 0)
return;
296 const int32_t by = (-O2 + dy2 - 1) / dy2;
300 const int32_t offs = by * stride;
304 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
310 if (dy3 <= 0)
return;
311 const int32_t by = (-O3 + dy3 - 1) / dy3;
315 const int32_t offs = by * stride;
319 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
322 int32_t C1 = O1 + (dx1 * bx) + E;
323 int32_t C2 = O2 + (dx2 * bx);
324 int32_t C3 = O3 + (dx3 * bx);
325 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
327 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
328 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
330 while ((bx < lx) && ((C2 | C3) >= 0))
335 if (TEXTURE_BILINEAR)
337 const float xx = tx * icw;
338 const float yy = ty * icw;
339 const int ttx = (int)floorf(xx);
340 const int tty = (int)floorf(yy);
341 const float ax = xx - ttx;
342 const float ay = yy - tty;
343 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
344 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
345 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm))*texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
346 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm))*texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
351 const int ttx = (TEXTURE_WRAP ? ((int)((tx * icw))) & (texsize_x_mm) :
shaderclip((
int)(tx * icw), texsize_x_mm));
352 const int tty = (TEXTURE_WRAP ? ((int)((ty * icw))) & (texsize_y_mm) :
shaderclip((
int)(ty * icw), texsize_y_mm));
353 col = tex[ttx + (tty)*texstride];
356 col.mult256(fPR, fPG, fPB);
381 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
383 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
384 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
385 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
386 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
389 color_t* buf = data.im->data() + offset;
390 const int32_t stride = data.im->stride();
392 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
393 const int32_t pa = O1 + O2 + O3;
394 const int32_t E = ((pa == 0) ? 1 : 0);
395 const int32_t aera = pa + E;
397 const float invaera =
fast_inv((
float)aera);
398 const float fP1a = fP1.w * invaera;
399 const float fP2a = fP2.w * invaera;
400 const float fP3a = fP3.w * invaera;
402 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
407 const int fP1R = (
int)(256 * cf1.
R);
408 const int fP1G = (int)(256 * cf1.
G);
409 const int fP1B = (int)(256 * cf1.
B);
410 const int fP21R = (int)(256 * (cf2.R - cf1.
R));
411 const int fP21G = (int)(256 * (cf2.G - cf1.
G));
412 const int fP21B = (int)(256 * (cf2.B - cf1.
B));
413 const int fP31R = (int)(256 * (cf3.
R - cf1.
R));
414 const int fP31G = (int)(256 * (cf3.
G - cf1.
G));
415 const int fP31B = (int)(256 * (cf3.
B - cf1.
B));
422 const color_t* tex = data.tex->data();
423 const int32_t texsize_x = data.tex->width();
424 const int32_t texsize_y = data.tex->height();
425 const int32_t texsize_x_mm = texsize_x - 1;
426 const int32_t texsize_y_mm = texsize_y - 1;
427 const int32_t texstride = data.tex->stride();
441 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
442 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
444 while ((uintptr_t)(buf) < end)
450 bx = (-O1 + dx1 - 1) / dx1;
456 if (dy2 <= 0)
return;
457 const int32_t by = (-O2 + dy2 - 1) / dy2;
461 const int32_t offs = by * stride;
465 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
471 if (dy3 <= 0)
return;
472 const int32_t by = (-O3 + dy3 - 1) / dy3;
476 const int32_t offs = by * stride;
480 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
483 int32_t C1 = O1 + (dx1 * bx) + E;
484 int32_t C2 = O2 + (dx2 * bx);
485 int32_t C3 = O3 + (dx3 * bx);
486 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
488 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
489 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
491 while ((bx < lx) && ((C2 | C3) >= 0))
496 if (TEXTURE_BILINEAR)
498 const float xx = tx * icw;
499 const float yy = ty * icw;
500 const int ttx = (int)floorf(xx);
501 const int tty = (int)floorf(yy);
502 const float ax = xx - ttx;
503 const float ay = yy - tty;
504 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
505 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
506 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
507 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
512 const int ttx = (TEXTURE_WRAP ? ((int)((tx * icw))) & (texsize_x_mm) :
shaderclip((
int)(tx * icw), texsize_x_mm));
513 const int tty = (TEXTURE_WRAP ? ((int)((ty * icw))) & (texsize_y_mm) :
shaderclip((
int)(ty * icw), texsize_y_mm));
514 col = tex[ttx + (tty)*texstride];
517 const int r = fP1R + ((C2 * fP21R + C3 * fP31R) / aera);
518 const int g = fP1G + ((C2 * fP21G + C3 * fP31G) / aera);
519 const int b = fP1B + ((C2 * fP21B + C3 * fP31B) / aera);
521 col.mult256(r, g, b);
546 template<
typename color_t,
typename ZBUFFER_t>
548 const int32_t& dx1,
const int32_t& dy1, int32_t O1,
const RasterizerVec4& fP1,
549 const int32_t& dx2,
const int32_t& dy2, int32_t O2,
const RasterizerVec4& fP2,
550 const int32_t& dx3,
const int32_t& dy3, int32_t O3,
const RasterizerVec4& fP3,
551 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
553 const color_t col = (color_t)data.facecolor;
554 color_t* buf = data.im->data() + offset;
555 ZBUFFER_t * zbuf = data.zbuf + offset;
557 const int32_t stride = data.im->stride();
558 const int32_t zstride = data.im->lx();
560 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
561 const int32_t pa = O1 + O2 + O3;
562 const int32_t E = ((pa == 0) ? 1 : 0);
563 const int32_t aera = pa + E;
565 const float wa = data.wa;
566 const float wb = data.wb;
567 const float invaera =
fast_inv((
float)aera);
568 const float invaera_wa = invaera * wa;
569 const float fP1a = fP1.w * invaera_wa;
570 const float fP2a = fP2.w * invaera_wa;
571 const float fP3a = fP3.w * invaera_wa;
572 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
574 while ((uintptr_t)(buf) < end)
580 bx = (-O1 + dx1 - 1) / dx1;
586 if (dy2 <= 0)
return;
587 const int32_t by = (-O2 + dy2 - 1) / dy2;
591 const int32_t offs = by * stride;
596 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
602 if (dy3 <= 0)
return;
603 const int32_t by = (-O3 + dy3 - 1) / dy3;
607 const int32_t offs = by * stride;
612 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
615 const int32_t C1 = O1 + (dx1 * bx) + E;
616 int32_t C2 = O2 + (dx2 * bx);
617 int32_t C3 = O3 + (dx3 * bx);
618 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a)) + wb;
620 while ((bx < lx) && ((C2 | C3) >= 0))
622 ZBUFFER_t& W = zbuf[bx];
623 const ZBUFFER_t aa = (ZBUFFER_t)(cw);
648 template<
typename color_t,
typename ZBUFFER_t,
int shiftC>
650 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
651 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
652 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
653 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
655 color_t* buf = data.im->data() + offset;
656 ZBUFFER_t* zbuf = data.zbuf + offset;
659 const int32_t stride = data.im->stride();
660 const int32_t zstride = data.im->lx();
662 const color_t col1 = (color_t)fP1.color;
663 const color_t col2 = (color_t)fP2.color;
664 const color_t col3 = (color_t)fP3.color;
666 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
667 const int32_t pa = O1 + O2 + O3;
668 const int32_t E = ((pa == 0) ? 1 : 0);
669 const int32_t aera = pa + E;
670 const int32_t aeraShifted = aera >> shiftC;
672 const float wa = data.wa;
673 const float wb = data.wb;
674 const float invaera =
fast_inv((
float)aera);
675 const float invaera_wa = invaera * wa;
676 const float fP1a = fP1.w * invaera_wa;
677 const float fP2a = fP2.w * invaera_wa;
678 const float fP3a = fP3.w * invaera_wa;
679 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
681 while ((uintptr_t)(buf) < end)
687 bx = (-O1 + dx1 - 1) / dx1;
693 if (dy2 <= 0)
return;
694 const int32_t by = (-O2 + dy2 - 1) / dy2;
698 const int32_t offs = by * stride;
703 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
709 if (dy3 <= 0)
return;
710 const int32_t by = (-O3 + dy3 - 1) / dy3;
714 const int32_t offs = by * stride;
719 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
722 const int32_t C1 = O1 + (dx1 * bx) + E;
723 int32_t C2 = O2 + (dx2 * bx);
724 int32_t C3 = O3 + (dx3 * bx);
725 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a)) + wb;
727 while ((bx < lx) && ((C2 | C3) >= 0))
729 ZBUFFER_t& W = zbuf[bx];
730 const ZBUFFER_t aa = (ZBUFFER_t)(cw);
753 template<
typename color_t,
typename ZBUFFER_t>
755 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
756 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
757 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
758 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
761 if (O1 + O2 + O3 > (1 << 24))
763 shader_Gouraud_Zbuffer_sub<color_t, ZBUFFER_t, 10>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
767 shader_Gouraud_Zbuffer_sub<color_t, ZBUFFER_t, 0>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
776 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
778 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
779 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
780 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
781 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
783 color_t* buf = data.im->data() + offset;
784 ZBUFFER_t* zbuf = data.zbuf + offset;
786 const float wa = data.wa;
787 const float wb = data.wb;
792 const int32_t stride = data.im->stride();
793 const int32_t zstride = data.im->lx();
795 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
796 const int32_t pa = O1 + O2 + O3;
797 const int32_t E = ((pa == 0) ? 1 : 0);
798 const int32_t aera = pa + E;
800 const float invaera =
fast_inv((
float)aera);
801 const float fP1a = fP1.w * invaera;
802 const float fP2a = fP2.w * invaera;
803 const float fP3a = fP3.w * invaera;
805 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
807 const RGBf& cf = (
RGBf)data.facecolor;
808 const int fPR = (
int)(256 * cf.
R);
809 const int fPG = (int)(256 * cf.
G);
810 const int fPB = (int)(256 * cf.
B);
817 const color_t* tex = data.tex->data();
818 const int32_t texsize_x = data.tex->width();
819 const int32_t texsize_y = data.tex->height();
820 const int32_t texsize_x_mm = texsize_x - 1;
821 const int32_t texsize_y_mm = texsize_y - 1;
822 const int32_t texstride = data.tex->stride();
835 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
836 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
838 while ((uintptr_t)(buf) < end)
844 bx = (-O1 + dx1 - 1) / dx1;
850 if (dy2 <= 0)
return;
851 const int32_t by = (-O2 + dy2 - 1) / dy2;
855 const int32_t offs = by * stride;
860 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
866 if (dy3 <= 0)
return;
867 const int32_t by = (-O3 + dy3 - 1) / dy3;
871 const int32_t offs = by * stride;
876 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
879 int32_t C1 = O1 + (dx1 * bx) + E;
880 int32_t C2 = O2 + (dx2 * bx);
881 int32_t C3 = O3 + (dx3 * bx);
882 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
884 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
885 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
887 while ((bx < lx) && ((C2 | C3) >= 0))
889 ZBUFFER_t& W = zbuf[bx];
890 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(cw * wa + wb)) : ((ZBUFFER_t)cw);
896 if (TEXTURE_BILINEAR)
898 const float xx = tx * icw;
899 const float yy = ty * icw;
900 const int ttx = (int)floorf(xx);
901 const int tty = (int)floorf(yy);
902 const float ax = xx - ttx;
903 const float ay = yy - tty;
904 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
905 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
906 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
907 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
912 const int ttx = (TEXTURE_WRAP ? ((int)((tx * icw))) & (texsize_x_mm) :
shaderclip((
int)(tx * icw), texsize_x_mm));
913 const int tty = (TEXTURE_WRAP ? ((int)((ty * icw))) & (texsize_y_mm) :
shaderclip((
int)(ty * icw), texsize_y_mm));
914 col = tex[ttx + (tty)*texstride];
917 col.mult256(fPR, fPG, fPB);
944 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
946 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
947 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
948 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
949 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
951 color_t* buf = data.im->data() + offset;
952 ZBUFFER_t* zbuf = data.zbuf + offset;
954 const float wa = data.wa;
955 const float wb = data.wb;
959 const int32_t stride = data.im->stride();
960 const int32_t zstride = data.im->lx();
962 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
963 const int32_t pa = O1 + O2 + O3;
964 const int32_t E = ((pa == 0) ? 1 : 0);
965 const int32_t aera = pa + E;
967 const float invaera =
fast_inv((
float)aera);
968 const float fP1a = fP1.w * invaera;
969 const float fP2a = fP2.w * invaera;
970 const float fP3a = fP3.w * invaera;
972 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
977 const int fP1R = (
int)(256 * cf1.
R);
978 const int fP1G = (int)(256 * cf1.
G);
979 const int fP1B = (int)(256 * cf1.
B);
980 const int fP21R = (int)(256 * (cf2.R - cf1.
R));
981 const int fP21G = (int)(256 * (cf2.G - cf1.
G));
982 const int fP21B = (int)(256 * (cf2.B - cf1.
B));
983 const int fP31R = (int)(256 * (cf3.
R - cf1.
R));
984 const int fP31G = (int)(256 * (cf3.
G - cf1.
G));
985 const int fP31B = (int)(256 * (cf3.
B - cf1.
B));
992 const color_t* tex = data.tex->data();
993 const int32_t texsize_x = data.tex->width();
994 const int32_t texsize_y = data.tex->height();
995 const int32_t texsize_x_mm = texsize_x - 1;
996 const int32_t texsize_y_mm = texsize_y - 1;
997 const int32_t texstride = data.tex->stride();
1010 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
1011 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
1013 while ((uintptr_t)(buf) < end)
1019 bx = (-O1 + dx1 - 1) / dx1;
1025 if (dy2 <= 0)
return;
1026 const int32_t by = (-O2 + dy2 - 1) / dy2;
1030 const int32_t offs = by * stride;
1035 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
1041 if (dy3 <= 0)
return;
1042 const int32_t by = (-O3 + dy3 - 1) / dy3;
1046 const int32_t offs = by * stride;
1051 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
1053 int32_t C1 = O1 + (dx1 * bx) + E;
1054 int32_t C2 = O2 + (dx2 * bx);
1055 int32_t C3 = O3 + (dx3 * bx);
1056 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
1058 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
1059 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
1061 while ((bx < lx) && ((C2 | C3) >= 0))
1063 ZBUFFER_t& W = zbuf[bx];
1064 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(cw * wa + wb)) : ((ZBUFFER_t)cw);
1071 if (TEXTURE_BILINEAR)
1073 const float xx = tx * icw;
1074 const float yy = ty * icw;
1075 const int ttx = (int)floorf(xx);
1076 const int tty = (int)floorf(yy);
1077 const float ax = xx - ttx;
1078 const float ay = yy - tty;
1079 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
1080 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
1081 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
1082 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
1087 const int ttx = (TEXTURE_WRAP ? ((int)((tx * icw))) & (texsize_x_mm) :
shaderclip((
int)(tx * icw), texsize_x_mm));
1088 const int tty = (TEXTURE_WRAP ? ((int)((ty * icw))) & (texsize_y_mm) :
shaderclip((
int)(ty * icw), texsize_y_mm));
1089 col = tex[ttx + (tty)*texstride];
1092 const int r = fP1R + ((C2 * fP21R + C3 * fP31R) / aera);
1093 const int g = fP1G + ((C2 * fP21G + C3 * fP31G) / aera);
1094 const int b = fP1B + ((C2 * fP21B + C3 * fP31B) / aera);
1095 col.mult256(r, g, b);
1122 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
1124 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1125 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1126 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1127 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
1129 color_t* buf = data.im->data() + offset;
1130 const int32_t stride = data.im->stride();
1132 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
1133 const int32_t pa = O1 + O2 + O3;
1134 const int32_t E = ((pa == 0) ? 1 : 0);
1135 const int32_t aera = pa + E;
1137 const float invaera =
fast_inv((
float)aera);
1139 const RGBf& cf = (
RGBf)data.facecolor;
1140 const int fPR = (
int)(256 * cf.
R);
1141 const int fPG = (int)(256 * cf.
G);
1142 const int fPB = (int)(256 * cf.
B);
1149 const color_t* tex = data.tex->data();
1150 const int32_t texsize_x = data.tex->width();
1151 const int32_t texsize_y = data.tex->height();
1152 const int32_t texsize_x_mm = texsize_x - 1;
1153 const int32_t texsize_y_mm = texsize_y - 1;
1154 const int32_t texstride = data.tex->stride();
1167 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
1168 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
1170 while ((uintptr_t)(buf) < end)
1176 bx = (-O1 + dx1 - 1) / dx1;
1182 if (dy2 <= 0)
return;
1183 const int32_t by = (-O2 + dy2 - 1) / dy2;
1187 const int32_t offs = by * stride;
1191 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
1197 if (dy3 <= 0)
return;
1198 const int32_t by = (-O3 + dy3 - 1) / dy3;
1202 const int32_t offs = by * stride;
1206 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
1208 int32_t C1 = O1 + (dx1 * bx) + E;
1209 int32_t C2 = O2 + (dx2 * bx);
1210 int32_t C3 = O3 + (dx3 * bx);
1212 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
1213 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
1215 while ((bx < lx) && ((C2 | C3) >= 0))
1219 if (TEXTURE_BILINEAR)
1221 const float xx = tx;
1222 const float yy = ty;
1223 const int ttx = (int)floorf(xx);
1224 const int tty = (int)floorf(yy);
1225 const float ax = xx - ttx;
1226 const float ay = yy - tty;
1227 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
1228 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
1229 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
1230 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
1235 const int ttx = (TEXTURE_WRAP ? ((int)((tx))) & (texsize_x_mm) :
shaderclip((
int)(tx), texsize_x_mm));
1236 const int tty = (TEXTURE_WRAP ? ((int)((ty))) & (texsize_y_mm) :
shaderclip((
int)(ty), texsize_y_mm));
1237 col = tex[ttx + (tty)*texstride];
1240 col.mult256(fPR, fPG, fPB);
1264 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
1266 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1267 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1268 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1269 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
1271 color_t* buf = data.im->data() + offset;
1272 const int32_t stride = data.im->stride();
1274 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
1275 const int32_t pa = O1 + O2 + O3;
1276 const int32_t E = ((pa == 0) ? 1 : 0);
1277 const int32_t aera = pa + E;
1279 const float invaera =
fast_inv((
float)aera);
1284 const int fP1R = (
int)(256 * cf1.
R);
1285 const int fP1G = (int)(256 * cf1.
G);
1286 const int fP1B = (int)(256 * cf1.
B);
1287 const int fP21R = (int)(256 * (cf2.R - cf1.
R));
1288 const int fP21G = (int)(256 * (cf2.G - cf1.
G));
1289 const int fP21B = (int)(256 * (cf2.B - cf1.
B));
1290 const int fP31R = (int)(256 * (cf3.
R - cf1.
R));
1291 const int fP31G = (int)(256 * (cf3.
G - cf1.
G));
1292 const int fP31B = (int)(256 * (cf3.
B - cf1.
B));
1299 const color_t* tex = data.tex->data();
1300 const int32_t texsize_x = data.tex->width();
1301 const int32_t texsize_y = data.tex->height();
1302 const int32_t texsize_x_mm = texsize_x - 1;
1303 const int32_t texsize_y_mm = texsize_y - 1;
1304 const int32_t texstride = data.tex->stride();
1317 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
1318 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
1320 while ((uintptr_t)(buf) < end)
1326 bx = (-O1 + dx1 - 1) / dx1;
1332 if (dy2 <= 0)
return;
1333 const int32_t by = (-O2 + dy2 - 1) / dy2;
1337 const int32_t offs = by * stride;
1341 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
1347 if (dy3 <= 0)
return;
1348 const int32_t by = (-O3 + dy3 - 1) / dy3;
1352 const int32_t offs = by * stride;
1356 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
1359 int32_t C1 = O1 + (dx1 * bx) + E;
1360 int32_t C2 = O2 + (dx2 * bx);
1361 int32_t C3 = O3 + (dx3 * bx);
1363 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
1364 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
1366 while ((bx < lx) && ((C2 | C3) >= 0))
1370 if (TEXTURE_BILINEAR)
1372 const float xx = tx;
1373 const float yy = ty;
1374 const int ttx = (int)floorf(xx);
1375 const int tty = (int)floorf(yy);
1376 const float ax = xx - ttx;
1377 const float ay = yy - tty;
1378 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
1379 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
1380 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
1381 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
1386 const int ttx = (TEXTURE_WRAP ? ((int)((tx))) & (texsize_x_mm) :
shaderclip((
int)(tx), texsize_x_mm));
1387 const int tty = (TEXTURE_WRAP ? ((int)((ty))) & (texsize_y_mm) :
shaderclip((
int)(ty), texsize_y_mm));
1388 col = tex[ttx + (tty)*texstride];
1391 const int r = fP1R + ((C2 * fP21R + C3 * fP31R) / aera);
1392 const int g = fP1G + ((C2 * fP21G + C3 * fP31G) / aera);
1393 const int b = fP1B + ((C2 * fP21B + C3 * fP31B) / aera);
1394 col.mult256(r, g, b);
1418 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
1420 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1421 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1422 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1423 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
1425 color_t* buf = data.im->data() + offset;
1426 ZBUFFER_t* zbuf = data.zbuf + offset;
1428 const float wa = data.wa;
1429 const float wb = data.wb;
1433 const int32_t stride = data.im->stride();
1434 const int32_t zstride = data.im->lx();
1436 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
1437 const int32_t pa = O1 + O2 + O3;
1438 const int32_t E = ((pa == 0) ? 1 : 0);
1439 const int32_t aera = pa + E;
1441 const float invaera =
fast_inv((
float)aera);
1442 const float fP1a = fP1.w * invaera;
1443 const float fP2a = fP2.w * invaera;
1444 const float fP3a = fP3.w * invaera;
1446 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
1448 const RGBf& cf = (
RGBf)data.facecolor;
1449 const int fPR = (
int)(256 * cf.
R);
1450 const int fPG = (int)(256 * cf.
G);
1451 const int fPB = (int)(256 * cf.
B);
1458 const color_t* tex = data.tex->data();
1459 const int32_t texsize_x = data.tex->width();
1460 const int32_t texsize_y = data.tex->height();
1461 const int32_t texsize_x_mm = texsize_x - 1;
1462 const int32_t texsize_y_mm = texsize_y - 1;
1463 const int32_t texstride = data.tex->stride();
1476 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
1477 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
1479 while ((uintptr_t)(buf) < end)
1485 bx = (-O1 + dx1 - 1) / dx1;
1491 if (dy2 <= 0)
return;
1492 const int32_t by = (-O2 + dy2 - 1) / dy2;
1496 const int32_t offs = by * stride;
1501 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
1507 if (dy3 <= 0)
return;
1508 const int32_t by = (-O3 + dy3 - 1) / dy3;
1512 const int32_t offs = by * stride;
1517 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
1520 int32_t C1 = O1 + (dx1 * bx) + E;
1521 int32_t C2 = O2 + (dx2 * bx);
1522 int32_t C3 = O3 + (dx3 * bx);
1523 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
1525 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
1526 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
1528 while ((bx < lx) && ((C2 | C3) >= 0))
1530 ZBUFFER_t& W = zbuf[bx];
1531 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(cw * wa + wb)) : ((ZBUFFER_t)cw);
1537 if (TEXTURE_BILINEAR)
1539 const float xx = tx;
1540 const float yy = ty;
1541 const int ttx = (int)floorf(xx);
1542 const int tty = (int)floorf(yy);
1543 const float ax = xx - ttx;
1544 const float ay = yy - tty;
1545 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
1546 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
1547 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
1548 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
1553 const int ttx = (TEXTURE_WRAP ? ((int)((tx))) & (texsize_x_mm) :
shaderclip((
int)(tx), texsize_x_mm));
1554 const int tty = (TEXTURE_WRAP ? ((int)((ty))) & (texsize_y_mm) :
shaderclip((
int)(ty), texsize_y_mm));
1555 col = tex[ttx + (tty)*texstride];
1558 col.mult256(fPR, fPG, fPB);
1585 template<
typename color_t,
typename ZBUFFER_t,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
1587 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1588 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1589 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1590 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
1592 color_t* buf = data.im->data() + offset;
1593 ZBUFFER_t* zbuf = data.zbuf + offset;
1595 const float wa = data.wa;
1596 const float wb = data.wb;
1600 const int32_t stride = data.im->stride();
1601 const int32_t zstride = data.im->lx();
1603 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
1604 const int32_t pa = O1 + O2 + O3;
1605 const int32_t E = ((pa == 0) ? 1 : 0);
1606 const int32_t aera = pa + E;
1608 const float invaera =
fast_inv((
float)aera);
1609 const float fP1a = fP1.w * invaera;
1610 const float fP2a = fP2.w * invaera;
1611 const float fP3a = fP3.w * invaera;
1613 const float dw = (dx1 * fP1a) + (dx2 * fP2a) + (dx3 * fP3a);
1618 const int fP1R = (
int)(256 * cf1.
R);
1619 const int fP1G = (int)(256 * cf1.
G);
1620 const int fP1B = (int)(256 * cf1.
B);
1621 const int fP21R = (int)(256 * (cf2.R - cf1.
R));
1622 const int fP21G = (int)(256 * (cf2.G - cf1.
G));
1623 const int fP21B = (int)(256 * (cf2.B - cf1.
B));
1624 const int fP31R = (int)(256 * (cf3.
R - cf1.
R));
1625 const int fP31G = (int)(256 * (cf3.
G - cf1.
G));
1626 const int fP31B = (int)(256 * (cf3.
B - cf1.
B));
1633 const color_t* tex = data.tex->data();
1634 const int32_t texsize_x = data.tex->width();
1635 const int32_t texsize_y = data.tex->height();
1636 const int32_t texsize_x_mm = texsize_x - 1;
1637 const int32_t texsize_y_mm = texsize_y - 1;
1638 const int32_t texstride = data.tex->stride();
1651 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
1652 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
1654 while ((uintptr_t)(buf) < end)
1660 bx = (-O1 + dx1 - 1) / dx1;
1666 if (dy2 <= 0)
return;
1667 const int32_t by = (-O2 + dy2 - 1) / dy2;
1671 const int32_t offs = by * stride;
1676 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
1682 if (dy3 <= 0)
return;
1683 const int32_t by = (-O3 + dy3 - 1) / dy3;
1687 const int32_t offs = by * stride;
1692 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
1695 int32_t C1 = O1 + (dx1 * bx) + E;
1696 int32_t C2 = O2 + (dx2 * bx);
1697 int32_t C3 = O3 + (dx3 * bx);
1698 float cw = ((C1 * fP1a) + (C2 * fP2a) + (C3 * fP3a));
1700 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3));
1701 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3));
1703 while ((bx < lx) && ((C2 | C3) >= 0))
1705 ZBUFFER_t& W = zbuf[bx];
1706 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(cw * wa + wb)) : ((ZBUFFER_t)cw);
1712 if (TEXTURE_BILINEAR)
1714 const float xx = tx;
1715 const float yy = ty;
1716 const int ttx = (int)floorf(xx);
1717 const int tty = (int)floorf(yy);
1718 const float ax = xx - ttx;
1719 const float ay = yy - tty;
1720 const int minx = (TEXTURE_WRAP ? (ttx & (texsize_x_mm)) :
shaderclip(ttx, texsize_x_mm));
1721 const int maxx = (TEXTURE_WRAP ? ((ttx + 1) & (texsize_x_mm)) :
shaderclip(ttx + 1, texsize_x_mm));
1722 const int miny = (TEXTURE_WRAP ? ((tty & (texsize_y_mm)) * texstride) :
shaderclip(tty, texsize_y_mm) * texstride);
1723 const int maxy = (TEXTURE_WRAP ? (((tty + 1) & (texsize_y_mm)) * texstride) :
shaderclip(tty + 1, texsize_y_mm) * texstride);
1728 const int ttx = (TEXTURE_WRAP ? ((int)((tx))) & (texsize_x_mm) :
shaderclip((
int)(tx), texsize_x_mm));
1729 const int tty = (TEXTURE_WRAP ? ((int)((ty))) & (texsize_y_mm) :
shaderclip((
int)(ty), texsize_y_mm));
1730 col = tex[ttx + (tty)*texstride];
1733 const int r = fP1R + ((C2 * fP21R + C3 * fP31R) / aera);
1734 const int g = fP1G + ((C2 * fP21G + C3 * fP31G) / aera);
1735 const int b = fP1B + ((C2 * fP21B + C3 * fP31B) / aera);
1737 col.mult256(r, g, b);
1766 template<
int SHADER_FLAGS_ENABLED,
typename color_t,
typename ZBUFFER_t>
void shader_select(
const int32_t& offset,
const int32_t& lx,
const int32_t& ly,
1767 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1768 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1769 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1770 const RasterizerParams<color_t, color_t, ZBUFFER_t> & data)
1772 int raster_type = data.shader_type;
1773 if (TGX_SHADER_HAS_ZBUFFER(SHADER_FLAGS_ENABLED) && (TGX_SHADER_HAS_ZBUFFER(raster_type)))
1775 if (TGX_SHADER_HAS_ORTHO(SHADER_FLAGS_ENABLED) && (TGX_SHADER_HAS_ORTHO(raster_type)))
1777 if (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type))
1779 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1781 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1783 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1784 shader_Gouraud_Texture_Zbuffer_Ortho<color_t,ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1785 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1786 shader_Gouraud_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, true, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1788 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1790 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1791 shader_Gouraud_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1792 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1793 shader_Gouraud_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1796 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1798 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1800 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1801 shader_Flat_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1802 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1803 shader_Flat_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, true,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1805 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1807 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1808 shader_Flat_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1809 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1810 shader_Flat_Texture_Zbuffer_Ortho<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1814 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1816 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1817 shader_Gouraud_Zbuffer<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1818 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1819 shader_Flat_Zbuffer<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1822 else if (TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED))
1824 if (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type))
1826 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1828 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1830 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1831 shader_Gouraud_Texture_Zbuffer<color_t, ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1832 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1833 shader_Gouraud_Texture_Zbuffer<color_t, ZBUFFER_t, true, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1835 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1837 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1838 shader_Gouraud_Texture_Zbuffer<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1839 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1840 shader_Gouraud_Texture_Zbuffer<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1843 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1845 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1847 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1848 shader_Flat_Texture_Zbuffer<color_t, ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1849 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1850 shader_Flat_Texture_Zbuffer<color_t, ZBUFFER_t, true,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1852 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1854 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1855 shader_Flat_Texture_Zbuffer<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1856 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1857 shader_Flat_Texture_Zbuffer<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1861 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1863 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1864 shader_Gouraud_Zbuffer<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1865 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1866 shader_Flat_Zbuffer<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1870 else if (TGX_SHADER_HAS_NOZBUFFER(SHADER_FLAGS_ENABLED))
1872 if (TGX_SHADER_HAS_ORTHO(SHADER_FLAGS_ENABLED) && (TGX_SHADER_HAS_ORTHO(raster_type)))
1874 if (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type))
1876 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1878 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1880 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1881 shader_Gouraud_Texture_Ortho<color_t, ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1882 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1883 shader_Gouraud_Texture_Ortho<color_t, ZBUFFER_t, true,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1885 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1887 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1888 shader_Gouraud_Texture_Ortho<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1889 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1890 shader_Gouraud_Texture_Ortho<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1893 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1895 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1897 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1898 shader_Flat_Texture_Ortho<color_t, ZBUFFER_t, true,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1899 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1900 shader_Flat_Texture_Ortho<color_t, ZBUFFER_t, true,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1902 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1904 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1905 shader_Flat_Texture_Ortho<color_t, ZBUFFER_t, false,false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1906 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1907 shader_Flat_Texture_Ortho<color_t, ZBUFFER_t, false,true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1911 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1913 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1914 shader_Gouraud<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1915 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1916 shader_Flat<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1919 else if (TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED))
1921 if (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type))
1923 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1925 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1927 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1928 shader_Gouraud_Texture<color_t, ZBUFFER_t, true, false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1929 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1930 shader_Gouraud_Texture<color_t, ZBUFFER_t, true, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1932 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1934 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1935 shader_Gouraud_Texture<color_t, ZBUFFER_t, false, false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1936 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1937 shader_Gouraud_Texture<color_t, ZBUFFER_t, false, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1940 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1942 if (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type))
1944 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1945 shader_Flat_Texture<color_t, ZBUFFER_t, true, false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1946 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1947 shader_Flat_Texture<color_t, ZBUFFER_t, true, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1949 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1951 if (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type))
1952 shader_Flat_Texture<color_t, ZBUFFER_t, false, false>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1953 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1954 shader_Flat_Texture<color_t, ZBUFFER_t, false, true>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1958 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1960 if (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type))
1961 shader_Gouraud<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1962 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1963 shader_Flat<color_t, ZBUFFER_t>(offset, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1976 template<
bool USE_BLENDING,
typename color_t_im>
1978 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1979 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1980 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1981 const RasterizerParams<color_t_im, color_t_im, float> & data)
1983 color_t_im * buf = data.im->data() + offset;
1984 const int32_t stride = data.im->stride();
1987 const RGB32 col1 =
RGB64(fP1.color.R, fP1.color.G, fP1.color.B, fP1.A);
1988 const RGB32 col2 =
RGB64(fP2.color.R, fP2.color.G, fP2.color.B, fP2.A);
1989 const RGB32 col3 =
RGB64(fP3.color.R, fP3.color.G, fP3.color.B, fP3.A);
1991 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
1992 const int32_t pa = O1 + O2 + O3;
1993 const int32_t E = ((pa == 0) ? 1 : 0);
1994 const int32_t aera = pa + E;
1995 const int shiftC = (aera > (1 << 22)) ? 10 : 0;
1997 while ((uintptr_t)(buf) < end)
2003 bx = (-O1 + dx1 - 1) / dx1;
2009 if (dy2 <= 0)
return;
2010 const int32_t by = (-O2 + dy2 - 1) / dy2;
2014 const int32_t offs = by * stride;
2018 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
2024 if (dy3 <= 0)
return;
2025 const int32_t by = (-O3 + dy3 - 1) / dy3;
2029 const int32_t offs = by * stride;
2033 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
2036 int32_t C2 = O2 + (dx2 * bx);
2037 int32_t C3 = O3 + (dx3 * bx);
2038 while ((bx < lx) && ((C2 | C3) >= 0))
2044 buf[bx] = color_t_im(c);
2067 template<
bool USE_BLENDING,
bool USE_MASKING,
bool USE_GRADIENT,
typename color_t_im,
typename color_t_tex>
2069 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
2070 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
2071 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
2072 const RasterizerParams<color_t_im, color_t_tex, float> & data)
2075 color_t_im * buf = data.im->data() + offset;
2076 const int32_t stride = data.im->stride();
2078 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
2079 const int32_t pa = O1 + O2 + O3;
2080 const int32_t E = ((pa == 0) ? 1 : 0);
2081 const int32_t aera = pa + E;
2083 const float invaera =
fast_inv((
float)aera);
2085 const color_t_tex mask_color = data.mask_color;
2096 const color_t_tex * tex = data.tex->data();
2097 const int32_t texsize_x = data.tex->width();
2098 const int32_t texsize_y = data.tex->height();
2099 const int32_t texsize_x_mm = data.tex->width() - 1;
2100 const int32_t texsize_y_mm = data.tex->height() - 1;
2101 const int32_t texstride = data.tex->stride();
2114 const float dtx = ((T1.x * dx1) + (T2.x * dx2) + (T3.x * dx3));
2115 const float dty = ((T1.y * dx1) + (T2.y * dx2) + (T3.y * dx3));
2117 while ((uintptr_t)(buf) < end)
2123 bx = (-O1 + dx1 - 1) / dx1;
2129 if (dy2 <= 0)
return;
2130 const int32_t by = (-O2 + dy2 - 1) / dy2;
2134 const int32_t offs = by * stride;
2138 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
2144 if (dy3 <= 0)
return;
2145 const int32_t by = (-O3 + dy3 - 1) / dy3;
2149 const int32_t offs = by * stride;
2153 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
2156 int32_t C1 = O1 + (dx1 * bx) + E;
2157 int32_t C2 = O2 + (dx2 * bx);
2158 int32_t C3 = O3 + (dx3 * bx);
2160 float tx = ((T1.x * C1) + (T2.x * C2) + (T3.x * C3)) - 0.5f;
2161 float ty = ((T1.y * C1) + (T2.y * C2) + (T3.y * C3)) - 0.5f;
2163 while ((bx < lx) && ((C2 | C3) >= 0))
2165 const float xx = tx;
2166 const float yy = ty;
2167 const int ttx = (int)floorf(xx);
2168 const int tty = (int)floorf(yy);
2169 const float ax = xx - ttx;
2170 const float ay = yy - tty;
2172 const int minx =
shaderclip(ttx, texsize_x_mm);
2173 const int maxx =
shaderclip(ttx + 1, texsize_x_mm);
2174 const int miny =
shaderclip(tty, texsize_y_mm) * texstride;
2175 const int maxy =
shaderclip(tty + 1, texsize_y_mm) * texstride;
2179 auto col00 = tex[minx + miny];
2182 auto col10 = tex[maxx + miny];
2185 auto col01 = tex[minx + maxy];
2188 auto col11 = tex[maxx + maxy];
2197 const int sC1 = aera - C3 - C2;
2198 const float m = 256.0f / aera;
2199 const int r = (int)((sC1 * cf1.
R + sC2 * cf2.R + sC3 * cf3.
R) * m);
2200 const int g = (int)((sC1 * cf1.
G + sC2 * cf2.G + sC3 * cf3.
G) * m);
2201 const int b = (int)((sC1 * cf1.
B + sC2 * cf2.B + sC3 * cf3.
B) * m);
2202 const int a = (int)((sC1 * fP1.A + sC2 * fP2.A + sC3 * fP3.A) * m);
2209 buf[bx] = color_t_im(c);
2213 buf[bx] = color_t_im(col);
2218 color_t_tex col =
interpolateColorsBilinear(tex[minx + miny], tex[maxx + miny], tex[minx + maxy], tex[maxx + maxy], ax, ay);
2223 const int sC1 = aera - C3 - C2;
2224 const float m = 256.0f / aera;
2225 const int r = (int)((sC1 * cf1.
R + sC2 * cf2.R + sC3 * cf3.
R) * m);
2226 const int g = (int)((sC1 * cf1.
G + sC2 * cf2.G + sC3 * cf3.
G) * m);
2227 const int b = (int)((sC1 * cf1.
B + sC2 * cf2.B + sC3 * cf3.
B) * m);
2228 const int a = (int)((sC1 * fP1.A + sC2 * fP2.A + sC3 * fP3.A) * m);
2229 col.mult256(r, g, b, a);
2233 color_t_tex c = color_t_tex(buf[bx]);
2234 c.blend(col, data.opacity);
2235 buf[bx] = color_t_im(c);
2239 buf[bx] = color_t_im(col);
2265 template<
typename BLEND_OP,
typename color_t_im,
typename color_t_tex>
2267 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
2268 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
2269 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
2270 const RasterizerParams<color_t_im, color_t_tex, float, BLEND_OP> & data)
2273 color_t_im * buf = data.im->data() + offset;
2274 const int32_t stride = data.im->stride();
2276 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
2277 const int32_t pa = O1 + O2 + O3;
2278 const int32_t E = ((pa == 0) ? 1 : 0);
2279 const int32_t aera = pa + E;
2281 const float invaera =
fast_inv((
float)aera);
2289 const color_t_tex * tex = data.tex->data();
2290 const int32_t texsize_x = data.tex->width();
2291 const int32_t texsize_y = data.tex->height();
2292 const int32_t texsize_x_mm = data.tex->width() - 1;
2293 const int32_t texsize_y_mm = data.tex->height() - 1;
2294 const int32_t texstride = data.tex->stride();
2307 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
2308 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
2310 while ((uintptr_t)(buf) < end)
2316 bx = (-O1 + dx1 - 1) / dx1;
2322 if (dy2 <= 0)
return;
2323 const int32_t by = (-O2 + dy2 - 1) / dy2;
2327 const int32_t offs = by * stride;
2331 bx =
max(bx, ((-O2 + dx2 - 1) / dx2));
2337 if (dy3 <= 0)
return;
2338 const int32_t by = (-O3 + dy3 - 1) / dy3;
2342 const int32_t offs = by * stride;
2346 bx =
max(bx, ((-O3 + dx3 - 1) / dx3));
2349 int32_t C1 = O1 + (dx1 * bx) + E;
2350 int32_t C2 = O2 + (dx2 * bx);
2351 int32_t C3 = O3 + (dx3 * bx);
2353 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3)) - 0.5f;
2354 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3)) - 0.5f;
2356 while ((bx < lx) && ((C2 | C3) >= 0))
2358 const float xx = tx;
2359 const float yy = ty;
2360 const int ttx = (int)floorf(xx);
2361 const int tty = (int)floorf(yy);
2362 const float ax = xx - ttx;
2363 const float ay = yy - tty;
2365 const int minx =
shaderclip(ttx, texsize_x_mm);
2366 const int maxx =
shaderclip(ttx + 1, texsize_x_mm);
2367 const int miny =
shaderclip(tty, texsize_y_mm) * texstride;
2368 const int maxy =
shaderclip(tty + 1, texsize_y_mm) * texstride;
2370 color_t_tex col =
interpolateColorsBilinear(tex[minx + miny], tex[maxx + miny], tex[minx + maxy], tex[maxx + maxy], ax, ay);
2372 buf[bx] = (color_t_im)((*data.p_blend_op)(col, buf[bx]));
const RGB32 RGB32_Red
Color red in RGB32 format.
RGB565 interpolateColorsBilinear(const RGB565 &C00, const RGB565 &C10, const RGB565 &C01, const RGB565 &C11, const float ax, const float ay)
Bilinear interpolation between 4 colors.
Definition: Color.h:621
RGB565 interpolateColorsTriangle(const RGB565 &col1, int32_t C1, const RGB565 &col2, int32_t C2, const RGB565 &col3, const int32_t totC)
Interpolate between 3 colors.
Definition: Color.h:591
TGX_INLINE T max(const T &a, const T &b)
Don't know why but much faster than fmaxf() for floats.
Definition: Misc.h:184
TGX_INLINE float fast_inv(float x)
Fast (approximate) computation of 1/x.
Definition: Misc.h:219
Triangle shader parameters.
void shader_test(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t &dx1, const int32_t &dy1, int32_t O1, const tgx::RasterizerVec4 &fP1, const int32_t &dx2, const int32_t &dy2, int32_t O2, const tgx::RasterizerVec4 &fP2, const int32_t &dx3, const int32_t &dy3, int32_t O3, const tgx::RasterizerVec4 &fP3, const tgx::RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
For test purposes...
Definition: Shaders.h:45
void shader_select(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
META-Shader THAT DISPATCH TO THE CORRECT Shader ABOVE (IF ENABLED).
Definition: Shaders.h:1766
void shader_Gouraud_Texture(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
TEXTURE + GOURAUD SHADING (NO ZBUFFER)
Definition: Shaders.h:382
void shader_2D_texture(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t_im, color_t_tex, float > &data)
2D shader (texture)
Definition: Shaders.h:2068
void shader_Flat(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t &dx1, const int32_t &dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t &dx2, const int32_t &dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t &dx3, const int32_t &dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
FLAT SHADING (NO ZBUFFER)
Definition: Shaders.h:74
void shader_Flat_Texture(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
TEXTURE + FLAT SHADING (NO ZBUFFER)
Definition: Shaders.h:230
void shader_Gouraud(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t &dx1, const int32_t &dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t &dx2, const int32_t &dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t &dx3, const int32_t &dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
GOURAUD SHADING (NO Z BUFFER)
Definition: Shaders.h:149
void shader_Flat_Texture_Zbuffer_Ortho(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + TEXTURE + FLAT SHADING + ORTHOGRAPHIC.
Definition: Shaders.h:1419
void shader_Gouraud_Texture_Ortho(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
TEXTURE + GOURAUD SHADING (NO ZBUFFER) + ORTHOGRAPHIC.
Definition: Shaders.h:1265
void shader_Flat_Texture_Zbuffer(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + TEXTURE + FLAT SHADING.
Definition: Shaders.h:777
void shader_Flat_Texture_Ortho(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
TEXTURE + FLAT SHADING (NO ZBUFFER) + ORTHOGRAPHIC.
Definition: Shaders.h:1123
void shader_Gouraud_Texture_Zbuffer_Ortho(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + TEXTURE + GOURAUD SHADING + ORTHOGRAPHIC.
Definition: Shaders.h:1586
void shader_Gouraud_Zbuffer(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + GOURAUD SHADING.
Definition: Shaders.h:754
void shader_2D_gradient(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t_im, color_t_im, float > &data)
2D shader (gradient)
Definition: Shaders.h:1977
TGX_INLINE int shaderclip(int v, int maxv)
for texture clamping
Definition: Shaders.h:34
void shader_Flat_Zbuffer(const int32_t offset, const int32_t &lx, const int32_t &ly, const int32_t &dx1, const int32_t &dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t &dx2, const int32_t &dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t &dx3, const int32_t &dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + FLAT SHADING.
Definition: Shaders.h:547
void shader_Gouraud_Zbuffer_sub(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + GOURAUD SHADING (sub-procedure, templated on shiftC)
Definition: Shaders.h:649
void shader_Gouraud_Texture_Zbuffer(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t, color_t, ZBUFFER_t > &data)
ZBUFFER + TEXTURE + GOURAUD SHADING.
Definition: Shaders.h:945
void shader_2D_texture_blend_op(const int32_t &offset, const int32_t &lx, const int32_t &ly, const int32_t dx1, const int32_t dy1, int32_t O1, const RasterizerVec4 &fP1, const int32_t dx2, const int32_t dy2, int32_t O2, const RasterizerVec4 &fP2, const int32_t dx3, const int32_t dy3, int32_t O3, const RasterizerVec4 &fP3, const RasterizerParams< color_t_im, color_t_tex, float, BLEND_OP > &data)
2D shader (texture with custom blending operator)
Definition: Shaders.h:2266
Color in R8/G8/B8/A8 format.
Definition: Color.h:1176
void mult256(int mr, int mg, int mb)
Multiply each color component by a given factor m/256 with m in [0,256] except the A component.
Definition: Color.h:1590
void blend256(const RGB32 &fg_col, uint32_t alpha)
alpha-blend fg_col over this one with a given opacity in the range 0.0f (fully transparent) to 1....
Definition: Color.h:1561
void blend(const RGB32 &fg_col, float alpha)
alpha-blend fg_col over this one with a given opacity in the range 0.0f (fully transparent) to 1....
Definition: Color.h:1546
float opacity() const
Return the opacity (alpha channel value) of this color in the range [0,1] (0=fully transparent,...
Definition: Color.h:1629
float opacity() const
Dummy function for compatibility with color types having an alpha channel.
Definition: Color.h:565
Color in R16/G16/B16/A16 format.
Definition: Color.h:1791
Color in R,G,B float format.
Definition: Color.h:2407
float R
Red channel.
Definition: Color.h:2420
float B
Blue channel.
Definition: Color.h:2422
float G
Green channel.
Definition: Color.h:2421
T x
'x' coordinate (first dimension)
Definition: Vec2.h:72
T y
'y' coordinate (second dimension)
Definition: Vec2.h:73