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 oox,
const int32_t ooy,
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 const int32_t stride = data.im->stride();
53 color_t* buf = data.im->data() + oox + (ooy * stride);
55 for (
int y = 0; y < ly; y++)
57 for (
int x = 0; x < lx; x++)
59 const int32_t o1 = O1 + dx1 * x + dy1 * y;
60 const int32_t o2 = O2 + dx2 * x + dy2 * y;
61 const int32_t o3 = O3 + dx3 * x + dy3 * y;
62 if ((o1 >= 0) && (o2 >= 0) && (o3 >= 0))
64 buf[x + stride * y].
blend256(col, 128);
73TGX_INLINE
inline int tgx_clamp_i32(
const int x,
const int lo,
const int hi)
75 return (x < lo) ? lo : ((x > hi) ? hi : x);
79TGX_INLINE
inline uint16_t tgx_rgb565_pack_raw_u16(
const int r,
const int g,
const int b)
81 #if TGX_SHADER_RGB565_FAST_CLAMP
82 const uint32_t rr = (uint32_t)tgx_clamp_i32(r, 0, 31);
83 const uint32_t gg = (uint32_t)tgx_clamp_i32(g, 0, 63);
84 const uint32_t bb = (uint32_t)tgx_clamp_i32(b, 0, 31);
85 #if TGX_RGB565_ORDER_BGR
86 return (uint16_t)((rr << 11) | (gg << 5) | bb);
88 return (uint16_t)((bb << 11) | (gg << 5) | rr);
91 #if TGX_RGB565_ORDER_BGR
92 return (uint16_t)(((uint32_t)r << 11) | ((uint32_t)g << 5) | (uint32_t)b);
94 return (uint16_t)(((uint32_t)b << 11) | ((uint32_t)g << 5) | (uint32_t)r);
100TGX_INLINE
inline int tgx_rgb565_r5(
const RGB565 c)
102 #if TGX_RGB565_ORDER_BGR
103 return (
int)((c.val >> 11) & 31u);
105 return (
int)(c.val & 31u);
110TGX_INLINE
inline int tgx_rgb565_g6(
const RGB565 c)
112 return (
int)((c.val >> 5) & 63u);
116TGX_INLINE
inline int tgx_rgb565_b5(
const RGB565 c)
118 #if TGX_RGB565_ORDER_BGR
119 return (
int)(c.val & 31u);
121 return (
int)((c.val >> 11) & 31u);
126TGX_INLINE
inline RGB565 tgx_rgb565_modulate256(
const RGB565 c,
const int mr,
const int mg,
const int mb)
128 const int r = (tgx_rgb565_r5(c) * mr) >> 8;
129 const int g = (tgx_rgb565_g6(c) * mg) >> 8;
130 const int b = (tgx_rgb565_b5(c) * mb) >> 8;
131 return RGB565(tgx_rgb565_pack_raw_u16(r, g, b));
135TGX_INLINE
inline RGB565 tgx_rgb565_bilinear_fast(
const RGB565& C00,
const RGB565& C10,
const RGB565& C01,
const RGB565& C11,
const float ax,
const float ay)
137 const int iax = (int)(ax * 256);
138 const int iay = (int)(ay * 256);
139 const int rax = 256 - iax;
140 const int ray = 256 - iay;
141 const int R = rax * (ray * tgx_rgb565_r5(C00) + iay * tgx_rgb565_r5(C01)) + iax * (ray * tgx_rgb565_r5(C10) + iay * tgx_rgb565_r5(C11));
142 const int G = rax * (ray * tgx_rgb565_g6(C00) + iay * tgx_rgb565_g6(C01)) + iax * (ray * tgx_rgb565_g6(C10) + iay * tgx_rgb565_g6(C11));
143 const int B = rax * (ray * tgx_rgb565_b5(C00) + iay * tgx_rgb565_b5(C01)) + iax * (ray * tgx_rgb565_b5(C10) + iay * tgx_rgb565_b5(C11));
144 return RGB565(tgx_rgb565_pack_raw_u16(R >> 16, G >> 16, B >> 16));
148TGX_INLINE
inline RGB565 tgx_rgb565_bilinear_modulate256(
const RGB565& C00,
const RGB565& C10,
const RGB565& C01,
const RGB565& C11,
const float ax,
const float ay,
const int mr,
const int mg,
const int mb)
150 const int iax = (int)(ax * 256);
151 const int iay = (int)(ay * 256);
152 const int rax = 256 - iax;
153 const int ray = 256 - iay;
154 const int R = rax * (ray * tgx_rgb565_r5(C00) + iay * tgx_rgb565_r5(C01)) + iax * (ray * tgx_rgb565_r5(C10) + iay * tgx_rgb565_r5(C11));
155 const int G = rax * (ray * tgx_rgb565_g6(C00) + iay * tgx_rgb565_g6(C01)) + iax * (ray * tgx_rgb565_g6(C10) + iay * tgx_rgb565_g6(C11));
156 const int B = rax * (ray * tgx_rgb565_b5(C00) + iay * tgx_rgb565_b5(C01)) + iax * (ray * tgx_rgb565_b5(C10) + iay * tgx_rgb565_b5(C11));
157 const int r = (R * mr) >> 24;
158 const int g = (G * mg) >> 24;
159 const int b = (B * mb) >> 24;
160 return RGB565(tgx_rgb565_pack_raw_u16(r, g, b));
164TGX_INLINE
inline RGB565 tgx_make_rgb565_from_raw(
const int r,
const int g,
const int b)
166 return RGB565(tgx_rgb565_pack_raw_u16(r, g, b));
177 template<
typename color_t,
typename ZBUFFER_t,
178 bool USE_ZBUFFER,
bool USE_GOURAUD,
bool USE_TEXTURE,
179 bool USE_ORTHO,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP,
180 bool USE_UNLIT,
bool USE_TEXTURE_AFFINE>
181 TGX_UBER_SHADER_INLINE
inline void uber_shader_inline(
const int32_t oox,
const int32_t ooy,
const int32_t lx,
const int32_t ly,
182 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
183 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
184 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
185 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
187 static_assert(!(USE_GOURAUD && USE_UNLIT),
"UNLIT and GOURAUD shader variants are mutually exclusive.");
188 static_assert((!USE_UNLIT) || USE_TEXTURE,
"The dedicated UNLIT shader variant is only useful for textured rendering.");
189 constexpr bool USE_PERSPECTIVE_TEXTURE = USE_TEXTURE && !USE_ORTHO && !USE_TEXTURE_AFFINE;
192 const int32_t stride = data.im->stride();
193 color_t* buf = data.im->data() + oox + (ooy * stride);
195 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
196 const int32_t pa = O1 + O2 + O3;
197 const int32_t E = ((pa == 0) ? 1 : 0);
198 const int32_t aera = pa + E;
199 const float faera = (float)aera;
202 ZBUFFER_t* zbuf =
nullptr;
204 float wa = 0.0f, wb = 0.0f;
205 float fP1a_z = 0.0f, fP2a_z = 0.0f, fP3a_z = 0.0f;
206 float fP1a_z_aera = 0.0f;
207 float fP21a_z = 0.0f, fP31a_z = 0.0f;
210 float invaera = 0.0f;
211 if constexpr (USE_ZBUFFER || USE_TEXTURE)
215#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
216 else if constexpr (USE_GOURAUD && !USE_TEXTURE && std::is_same<color_t, RGB565>::value)
222 if constexpr (USE_ZBUFFER)
224 zstride = data.im->lx();
225 zbuf = data.zbuf + oox + (ooy * zstride);
229 if constexpr (!USE_PERSPECTIVE_TEXTURE)
239 const float invaera_wa_factor = USE_ORTHO ? 1.0f : wa;
241 fP1a_z = fP1.w * invaera * invaera_wa_factor;
242 fP2a_z = fP2.w * invaera * invaera_wa_factor;
243 fP3a_z = fP3.w * invaera * invaera_wa_factor;
245 fP21a_z = fP2a_z - fP1a_z;
246 fP31a_z = fP3a_z - fP1a_z;
247 fP1a_z_aera = fP1a_z * faera;
249 dw_z = (dx2 * fP21a_z) + (dx3 * fP31a_z);
255 color_t col1_g, col2_g, col3_g;
256 int shiftC = 0, aeraShifted = 0;
257 int fPR = 0, fPG = 0, fPB = 0;
258 int fP1R = 0, fP1G = 0, fP1B = 0;
259 int fP21R = 0, fP21G = 0, fP21B = 0;
260 int fP31R = 0, fP31G = 0, fP31B = 0;
262#if TGX_SHADER_GOURAUD_TEXTURE_FLOAT_INCREMENTAL
263 float fP21Rf = 0.0f, fP21Gf = 0.0f, fP21Bf = 0.0f;
264 float fP31Rf = 0.0f, fP31Gf = 0.0f, fP31Bf = 0.0f;
265 float dGR = 0.0f, dGG = 0.0f, dGB = 0.0f;
268#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
269 float g565P1R = 0.0f, g565P1G = 0.0f, g565P1B = 0.0f;
270 float g565P21R = 0.0f, g565P21G = 0.0f, g565P21B = 0.0f;
271 float g565P31R = 0.0f, g565P31G = 0.0f, g565P31B = 0.0f;
272 float g565dR = 0.0f, g565dG = 0.0f, g565dB = 0.0f;
275 float invaera_persp = 0.0f;
276 float fP1a_p = 0.0f, fP2a_p = 0.0f, fP3a_p = 0.0f;
279 const color_t* tex =
nullptr;
280 int32_t texsize_x_mm = 0, texsize_y_mm = 0, texstride = 0;
281 float dtx = 0.0f, dty = 0.0f;
284 float T1x_aera = 0.0f, T1y_aera = 0.0f;
285 float T21x = 0.0f, T31x = 0.0f;
286 float T21y = 0.0f, T31y = 0.0f;
288 float fP1a_p_aera = 0.0f;
289 float fP21a_p = 0.0f, fP31a_p = 0.0f;
291 if constexpr (USE_GOURAUD)
293 if constexpr (USE_TEXTURE)
295 const RGBf& cf1 = fP1.color;
296 const RGBf& cf2 = fP2.color;
297 const RGBf& cf3 = fP3.color;
299 fP1R = (int)(256 * cf1.
R); fP1G = (int)(256 * cf1.
G); fP1B = (int)(256 * cf1.
B);
300 fP21R = (int)(256 * (cf2.
R - cf1.
R)); fP21G = (int)(256 * (cf2.
G - cf1.
G)); fP21B = (int)(256 * (cf2.
B - cf1.
B));
301 fP31R = (int)(256 * (cf3.
R - cf1.
R)); fP31G = (int)(256 * (cf3.
G - cf1.
G)); fP31B = (int)(256 * (cf3.
B - cf1.
B));
303 shiftC = (aera > (1 << 22)) ? 10 : 0;
304 aeraShifted = aera >> shiftC;
306#if TGX_SHADER_GOURAUD_TEXTURE_FLOAT_INCREMENTAL
307 fP21Rf = (float)fP21R; fP21Gf = (float)fP21G; fP21Bf = (float)fP21B;
308 fP31Rf = (float)fP31R; fP31Gf = (float)fP31G; fP31Bf = (float)fP31B;
310 dGR = ((dx2 * fP21Rf) + (dx3 * fP31Rf)) * invaera;
311 dGG = ((dx2 * fP21Gf) + (dx3 * fP31Gf)) * invaera;
312 dGB = ((dx2 * fP21Bf) + (dx3 * fP31Bf)) * invaera;
317#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
318 if constexpr (std::is_same<color_t, RGB565>::value)
320 const RGBf& cf1 = fP1.color;
321 const RGBf& cf2 = fP2.color;
322 const RGBf& cf3 = fP3.color;
324 g565P1R = 31.0f * cf1.
R;
325 g565P1G = 63.0f * cf1.
G;
326 g565P1B = 31.0f * cf1.
B;
328 g565P21R = 31.0f * (cf2.
R - cf1.
R);
329 g565P21G = 63.0f * (cf2.
G - cf1.
G);
330 g565P21B = 31.0f * (cf2.
B - cf1.
B);
332 g565P31R = 31.0f * (cf3.
R - cf1.
R);
333 g565P31G = 63.0f * (cf3.
G - cf1.
G);
334 g565P31B = 31.0f * (cf3.
B - cf1.
B);
336 g565dR = ((dx2 * g565P21R) + (dx3 * g565P31R)) * invaera;
337 g565dG = ((dx2 * g565P21G) + (dx3 * g565P31G)) * invaera;
338 g565dB = ((dx2 * g565P21B) + (dx3 * g565P31B)) * invaera;
343 col1_g = (color_t)fP1.color;
344 col2_g = (color_t)fP2.color;
345 col3_g = (color_t)fP3.color;
346 shiftC = (aera > (1 << 22)) ? 10 : 0;
347 aeraShifted = aera >> shiftC;
353 if constexpr (!USE_TEXTURE)
355 flat_color = (color_t)data.facecolor;
357 else if constexpr (!USE_UNLIT)
359 const RGBf& cf = data.facecolor;
360 fPR = (int)(256 * cf.
R); fPG = (int)(256 * cf.
G); fPB = (int)(256 * cf.
B);
364 if constexpr (USE_TEXTURE)
366 tex = data.tex->data();
367 const int32_t texsize_x = data.tex->width();
368 const int32_t texsize_y = data.tex->height();
369 texsize_x_mm = texsize_x - 1;
370 texsize_y_mm = texsize_y - 1;
371 texstride = data.tex->stride();
373 T1 = fP1.T; T2 = fP2.T; T3 = fP3.T;
375 if constexpr (!USE_PERSPECTIVE_TEXTURE)
377 T1 *= invaera; T2 *= invaera; T3 *= invaera;
381 invaera_persp = invaera;
382 fP1a_p = fP1.w * invaera_persp;
383 fP2a_p = fP2.w * invaera_persp;
384 fP3a_p = fP3.w * invaera_persp;
385 T1 *= fP1a_p; T2 *= fP2a_p; T3 *= fP3a_p;
388 T1.
x *= texsize_x; T2.
x *= texsize_x; T3.
x *= texsize_x;
389 T1.
y *= texsize_y; T2.
y *= texsize_y; T3.
y *= texsize_y;
396 T1x_aera = T1.
x * faera;
397 T1y_aera = T1.
y * faera;
399 dtx = (T21x * dx2) + (T31x * dx3);
400 dty = (T21y * dx2) + (T31y * dx3);
402 if constexpr (USE_PERSPECTIVE_TEXTURE)
404 fP21a_p = fP2a_p - fP1a_p;
405 fP31a_p = fP3a_p - fP1a_p;
406 fP1a_p_aera = fP1a_p * faera;
408 dw_p = (fP21a_p * dx2) + (fP31a_p * dx3);
409 if constexpr (USE_ZBUFFER) { dw_z = dw_p * wa; }
414 while ((uintptr_t)(buf) < end)
420 bx = (-O1 + dx1 - 1u) / dx1;
426 if (dy2 <= 0)
return;
427 const int32_t by = (-O2 + dy2 - 1u) / dy2;
428 O1 += (by * dy1); O2 += (by * dy2); O3 += (by * dy3);
430 if constexpr (USE_ZBUFFER) zbuf += by * zstride;
433 bx =
max(bx, (int32_t)((-O2 + dx2 - 1u) / dx2));
439 if (dy3 <= 0)
return;
440 const int32_t by = (-O3 + dy3 - 1u) / dy3;
441 O1 += (by * dy1); O2 += (by * dy2); O3 += (by * dy3);
443 if constexpr (USE_ZBUFFER) zbuf += by * zstride;
446 bx =
max(bx, (int32_t)((-O3 + dx3 - 1u) / dx3));
450 int32_t C2 = O2 + (dx2 * bx);
451 int32_t C3 = O3 + (dx3 * bx);
455 float tx = 0.0f, ty = 0.0f;
457#if TGX_SHADER_GOURAUD_TEXTURE_FLOAT_INCREMENTAL
458 float gR = 0.0f, gG = 0.0f, gB = 0.0f;
460 if constexpr (USE_GOURAUD && USE_TEXTURE)
462 gR = (float)fP1R + (((
float)C2 * fP21Rf) + ((
float)C3 * fP31Rf)) * invaera;
463 gG = (float)fP1G + (((
float)C2 * fP21Gf) + ((
float)C3 * fP31Gf)) * invaera;
464 gB = (float)fP1B + (((
float)C2 * fP21Bf) + ((
float)C3 * fP31Bf)) * invaera;
468#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
469 float g565R = 0.0f, g565G = 0.0f, g565B = 0.0f;
471 if constexpr (USE_GOURAUD && !USE_TEXTURE && std::is_same<color_t, RGB565>::value)
473 g565R = g565P1R + (((float)C2 * g565P21R) + ((float)C3 * g565P31R)) * invaera;
474 g565G = g565P1G + (((float)C2 * g565P21G) + ((float)C3 * g565P31G)) * invaera;
475 g565B = g565P1B + (((float)C2 * g565P21B) + ((float)C3 * g565P31B)) * invaera;
479 if constexpr (USE_TEXTURE)
481 tx = T1x_aera + (T21x * C2) + (T31x * C3);
482 ty = T1y_aera + (T21y * C2) + (T31y * C3);
484 if constexpr (USE_PERSPECTIVE_TEXTURE)
486 cw_p = fP1a_p_aera + (fP21a_p * C2) + (fP31a_p * C3);
487 if constexpr (USE_ZBUFFER)
489 cw_z = (cw_p * wa) + wb;
494 if constexpr (USE_ZBUFFER)
496 if constexpr (!USE_PERSPECTIVE_TEXTURE)
498 cw_z = fP1a_z_aera + (C2 * fP21a_z) + (C3 * fP31a_z);
499 if constexpr (!USE_ORTHO) { cw_z += wb; }
504#if TGX_SHADER_USE_INCREMENTAL_PIXEL_POINTERS
505 color_t* pix = buf + bx;
506 ZBUFFER_t* zpix =
nullptr;
507 if constexpr (USE_ZBUFFER)
512 while ((bx < lx) && ((C2 | C3) >= 0))
515 if constexpr (USE_ZBUFFER)
517#if TGX_SHADER_USE_INCREMENTAL_PIXEL_POINTERS
518 ZBUFFER_t& W = *zpix;
520 ZBUFFER_t& W = zbuf[bx];
524 if constexpr (std::is_same<ZBUFFER_t, uint16_t>::value)
526 current_z = (USE_ORTHO) ? ((ZBUFFER_t)(cw_z * wa + wb)) : ((ZBUFFER_t)cw_z);
530 current_z = (ZBUFFER_t)cw_z;
547 if constexpr (USE_TEXTURE)
550 if constexpr (USE_PERSPECTIVE_TEXTURE)
566 if constexpr (USE_GOURAUD)
568#if TGX_SHADER_GOURAUD_TEXTURE_FLOAT_INCREMENTAL
573 const int32_t C2s = C2 >> shiftC;
574 const int32_t C3s = C3 >> shiftC;
575 modR = fP1R + ((C2s * fP21R + C3s * fP31R) / aeraShifted);
576 modG = fP1G + ((C2s * fP21G + C3s * fP31G) / aeraShifted);
577 modB = fP1B + ((C2s * fP21B + C3s * fP31B) / aeraShifted);
580 else if constexpr (!USE_UNLIT)
587#if TGX_SHADER_RGB565_FAST_TEXTURE_MODULATE
588 if constexpr (std::is_same<color_t, RGB565>::value)
590 if constexpr (TEXTURE_BILINEAR)
594 const float ax = xx - ttx;
595 const float ay = yy - tty;
597 const int minx = TEXTURE_WRAP ? (ttx & texsize_x_mm) :
shaderclip(ttx, texsize_x_mm);
598 const int maxx = TEXTURE_WRAP ? ((ttx + 1) & texsize_x_mm) :
shaderclip(ttx + 1, texsize_x_mm);
599 const int miny = (TEXTURE_WRAP ? (tty & texsize_y_mm) :
shaderclip(tty, texsize_y_mm)) * texstride;
600 const int maxy = (TEXTURE_WRAP ? ((tty + 1) & texsize_y_mm) :
shaderclip(tty + 1, texsize_y_mm)) * texstride;
602 if constexpr (USE_UNLIT)
604#if TGX_SHADER_RGB565_FAST_BILINEAR
605 final_color = tgx_rgb565_bilinear_fast(
624 final_color = tgx_rgb565_bilinear_modulate256(
638 const int ttx = TEXTURE_WRAP ? ((int)(xx)) & texsize_x_mm :
shaderclip((
int)(xx), texsize_x_mm);
639 const int tty = TEXTURE_WRAP ? ((int)(yy)) & texsize_y_mm :
shaderclip((
int)(yy), texsize_y_mm);
641 if constexpr (USE_UNLIT)
643 final_color = tex[ttx + tty * texstride];
647 final_color = tgx_rgb565_modulate256(tex[ttx + tty * texstride], modR, modG, modB);
654 if constexpr (TEXTURE_BILINEAR)
658 const float ax = xx - ttx;
659 const float ay = yy - tty;
661 const int minx = TEXTURE_WRAP ? (ttx & texsize_x_mm) :
shaderclip(ttx, texsize_x_mm);
662 const int maxx = TEXTURE_WRAP ? ((ttx + 1) & texsize_x_mm) :
shaderclip(ttx + 1, texsize_x_mm);
663 const int miny = (TEXTURE_WRAP ? (tty & texsize_y_mm) :
shaderclip(tty, texsize_y_mm)) * texstride;
664 const int maxy = (TEXTURE_WRAP ? ((tty + 1) & texsize_y_mm) :
shaderclip(tty + 1, texsize_y_mm)) * texstride;
666#if TGX_SHADER_RGB565_FAST_BILINEAR
667 if constexpr (std::is_same<color_t, RGB565>::value)
669 final_color = tgx_rgb565_bilinear_fast(
691 const int ttx = TEXTURE_WRAP ? ((int)(xx)) & texsize_x_mm :
shaderclip((
int)(xx), texsize_x_mm);
692 const int tty = TEXTURE_WRAP ? ((int)(yy)) & texsize_y_mm :
shaderclip((
int)(yy), texsize_y_mm);
693 final_color = tex[ttx + tty * texstride];
696 if constexpr (USE_GOURAUD)
698 final_color.mult256(modR, modG, modB);
700 else if constexpr (!USE_UNLIT)
702 final_color.mult256(modR, modG, modB);
708 if constexpr (USE_GOURAUD)
710#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
711 if constexpr (std::is_same<color_t, RGB565>::value)
713 final_color = tgx_make_rgb565_from_raw((
int)g565R, (
int)g565G, (
int)g565B);
723 final_color = flat_color;
727#if TGX_SHADER_USE_INCREMENTAL_PIXEL_POINTERS
730 buf[bx] = final_color;
738#if TGX_SHADER_GOURAUD_TEXTURE_FLOAT_INCREMENTAL
739 if constexpr (USE_GOURAUD && USE_TEXTURE)
747#if TGX_SHADER_GOURAUD_RGB565_FLOAT_INCREMENTAL
748 if constexpr (USE_GOURAUD && !USE_TEXTURE && std::is_same<color_t, RGB565>::value)
758#if TGX_SHADER_USE_INCREMENTAL_PIXEL_POINTERS
762 if constexpr (USE_ZBUFFER) cw_z += dw_z;
764#if TGX_SHADER_USE_INCREMENTAL_PIXEL_POINTERS
765 if constexpr (USE_ZBUFFER) zpix++;
768 if constexpr (USE_TEXTURE)
772 if constexpr (USE_PERSPECTIVE_TEXTURE) cw_p += dw_p;
781 if constexpr (USE_ZBUFFER) zbuf += zstride;
1560 template<
typename color_t,
typename ZBUFFER_t,
1561 bool USE_ZBUFFER,
bool USE_GOURAUD,
bool USE_TEXTURE,
1562 bool USE_ORTHO,
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP,
1563 bool USE_UNLIT,
bool USE_TEXTURE_AFFINE>
1564 void uber_shader(
const int32_t oox,
const int32_t ooy,
const int32_t lx,
const int32_t ly,
1565 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1566 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1567 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1568 const RasterizerParams<color_t, color_t, ZBUFFER_t>& data)
1570 uber_shader_inline<color_t, ZBUFFER_t, USE_ZBUFFER, USE_GOURAUD, USE_TEXTURE, USE_ORTHO, TEXTURE_BILINEAR, TEXTURE_WRAP, USE_UNLIT, USE_TEXTURE_AFFINE>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1578 template<
int SHADER_FLAGS_ENABLED,
typename color_t,
typename ZBUFFER_t>
1579 inline TGX_SHADER_SELECT_INLINE
void shader_select(
const int32_t oox,
const int32_t ooy,
const int32_t lx,
const int32_t ly,
1580 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
1581 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
1582 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
1583 const RasterizerParams<color_t, color_t, ZBUFFER_t> & data)
1585 int raster_type = data.shader_type;
1586 if ((!TGX_SHADER_HAS_NOZBUFFER(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_ZBUFFER(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_ZBUFFER(raster_type)))
1588 if ((!TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_ORTHO(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_ORTHO(raster_type)))
1590 if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type)))
1592 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1594 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1596 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1597 uber_shader<color_t, ZBUFFER_t, true, true, true, true, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1598 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1599 uber_shader<color_t, ZBUFFER_t, true, true, true, true, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1601 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1603 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1604 uber_shader<color_t, ZBUFFER_t, true, true, true, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1605 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1606 uber_shader<color_t, ZBUFFER_t, true, true, true, true, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1609 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1611 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1613 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1614 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1615 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1616 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1618 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1620 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1621 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1622 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1623 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1626 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1628 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1630 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1631 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1632 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1633 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1635 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1637 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1638 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1639 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1640 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1644 else if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_AFFINE(raster_type)))
1646 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1648 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1650 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1651 uber_shader<color_t, ZBUFFER_t, true, true, true, true, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1652 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1653 uber_shader<color_t, ZBUFFER_t, true, true, true, true, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1655 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1657 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1658 uber_shader<color_t, ZBUFFER_t, true, true, true, true, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1659 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1660 uber_shader<color_t, ZBUFFER_t, true, true, true, true, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1663 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1665 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1667 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1668 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1669 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1670 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1672 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1674 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1675 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1676 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1677 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1680 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1682 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1684 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1685 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1686 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1687 uber_shader<color_t, ZBUFFER_t, true, false, true, true, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1689 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1691 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1692 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1693 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1694 uber_shader<color_t, ZBUFFER_t, true, false, true, true, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1698 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1700 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1701 uber_shader<color_t, ZBUFFER_t, true, true, false, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1703 uber_shader<color_t, ZBUFFER_t, true, false, false, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1706 else if (TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED))
1708 if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type)))
1710 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1712 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1714 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1715 uber_shader<color_t, ZBUFFER_t, true, true, true, false, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1716 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1717 uber_shader<color_t, ZBUFFER_t, true, true, true, false, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1719 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1721 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1722 uber_shader<color_t, ZBUFFER_t, true, true, true, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1723 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1724 uber_shader<color_t, ZBUFFER_t, true, true, true, false, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1727 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1729 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1731 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1732 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1733 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1734 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1736 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1738 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1739 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1740 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1741 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1744 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1746 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1748 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1749 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1750 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1751 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1753 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1755 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1756 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1757 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1758 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1762 else if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_AFFINE(raster_type)))
1764 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1766 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1768 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1769 uber_shader<color_t, ZBUFFER_t, true, true, true, false, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1770 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1771 uber_shader<color_t, ZBUFFER_t, true, true, true, false, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1773 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1775 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1776 uber_shader<color_t, ZBUFFER_t, true, true, true, false, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1777 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1778 uber_shader<color_t, ZBUFFER_t, true, true, true, false, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1781 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1783 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1785 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1786 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1787 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1788 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1790 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1792 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1793 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1794 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1795 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1798 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1800 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1802 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1803 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1804 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1805 uber_shader<color_t, ZBUFFER_t, true, false, true, false, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1807 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1809 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1810 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1811 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1812 uber_shader<color_t, ZBUFFER_t, true, false, true, false, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1816 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1818 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1819 uber_shader<color_t, ZBUFFER_t, true, true, false, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1821 uber_shader<color_t, ZBUFFER_t, true, false, false, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1825 else if (TGX_SHADER_HAS_NOZBUFFER(SHADER_FLAGS_ENABLED))
1827 if ((!TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_ORTHO(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_ORTHO(raster_type)))
1829 if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type)))
1831 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1833 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1835 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1836 uber_shader<color_t, ZBUFFER_t, false, true, true, true, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1837 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1838 uber_shader<color_t, ZBUFFER_t, false, true, true, true, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1840 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1842 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1843 uber_shader<color_t, ZBUFFER_t, false, true, true, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1844 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1845 uber_shader<color_t, ZBUFFER_t, false, true, true, true, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1848 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1850 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1852 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1853 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1854 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1855 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1857 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1859 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1860 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1861 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1862 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, true, true, false>(oox, ooy, 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))
1867 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1869 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1870 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1871 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1872 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1874 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1876 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1877 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1878 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1879 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1883 else if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_AFFINE(raster_type)))
1885 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1887 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1889 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1890 uber_shader<color_t, ZBUFFER_t, false, true, true, true, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1891 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1892 uber_shader<color_t, ZBUFFER_t, false, true, true, true, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1894 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1896 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1897 uber_shader<color_t, ZBUFFER_t, false, true, true, true, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1898 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1899 uber_shader<color_t, ZBUFFER_t, false, true, true, true, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1902 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1904 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1906 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1907 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1908 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1909 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1911 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1913 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1914 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1915 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1916 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1919 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1921 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1923 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1924 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1925 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1926 uber_shader<color_t, ZBUFFER_t, false, false, true, true, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1928 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1930 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1931 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1932 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1933 uber_shader<color_t, ZBUFFER_t, false, false, true, true, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1937 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
1939 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1940 uber_shader<color_t, ZBUFFER_t, false, true, false, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1942 uber_shader<color_t, ZBUFFER_t, false, false, false, true, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1945 else if (TGX_SHADER_HAS_PERSPECTIVE(SHADER_FLAGS_ENABLED))
1947 if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE(raster_type)))
1949 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
1951 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1953 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1954 uber_shader<color_t, ZBUFFER_t, false, true, true, false, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1955 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1956 uber_shader<color_t, ZBUFFER_t, false, true, true, false, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1958 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1960 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1961 uber_shader<color_t, ZBUFFER_t, false, true, true, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1962 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1963 uber_shader<color_t, ZBUFFER_t, false, true, true, false, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1966 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
1968 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1970 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1971 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1972 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1973 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1975 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1977 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1978 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, false, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1979 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1980 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, true, true, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1983 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
1985 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
1987 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1988 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1989 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1990 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1992 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
1994 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
1995 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
1996 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
1997 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, true, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2001 else if (((!TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_TEXTURE(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_TEXTURE_AFFINE(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_AFFINE(raster_type)))
2003 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
2005 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
2007 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2008 uber_shader<color_t, ZBUFFER_t, false, true, true, false, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2009 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2010 uber_shader<color_t, ZBUFFER_t, false, true, true, false, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2012 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
2014 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2015 uber_shader<color_t, ZBUFFER_t, false, true, true, false, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2016 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2017 uber_shader<color_t, ZBUFFER_t, false, true, true, false, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2020 else if (((!TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_UNLIT(raster_type)))
2022 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
2024 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2025 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2026 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2027 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2029 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
2031 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2032 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, false, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2033 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2034 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, true, true, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2037 else if (TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED))
2039 if ((!TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_BILINEAR(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_BILINEAR(raster_type)))
2041 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2042 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2043 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2044 uber_shader<color_t, ZBUFFER_t, false, false, true, false, true, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2046 else if (TGX_SHADER_HAS_TEXTURE_NEAREST(SHADER_FLAGS_ENABLED))
2048 if ((!TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED)) || (TGX_SHADER_HAS_TEXTURE_CLAMP(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_TEXTURE_CLAMP(raster_type)))
2049 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, false, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2050 else if (TGX_SHADER_HAS_TEXTURE_WRAP_POW2(SHADER_FLAGS_ENABLED))
2051 uber_shader<color_t, ZBUFFER_t, false, false, true, false, false, true, false, true>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2055 else if (TGX_SHADER_HAS_NOTEXTURE(SHADER_FLAGS_ENABLED))
2057 if (((!TGX_SHADER_HAS_FLAT(SHADER_FLAGS_ENABLED)) && (!TGX_SHADER_HAS_UNLIT(SHADER_FLAGS_ENABLED))) || (TGX_SHADER_HAS_GOURAUD(SHADER_FLAGS_ENABLED) && TGX_SHADER_HAS_GOURAUD(raster_type)))
2058 uber_shader<color_t, ZBUFFER_t, false, true, false, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2060 uber_shader<color_t, ZBUFFER_t, false, false, false, false, false, false, false, false>(oox, ooy, lx, ly, dx1, dy1, O1, fP1, dx2, dy2, O2, fP2, dx3, dy3, O3, fP3, data);
2073 template<
bool USE_BLENDING,
typename color_t_im>
2075 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
2076 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
2077 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
2078 const RasterizerParams<color_t_im, color_t_im, float> & data)
2080 const int32_t stride = data.im->stride();
2081 color_t_im * buf = data.im->data() + oox + (ooy * stride);
2084 const RGB32 col1 =
RGB64(fP1.color.R, fP1.color.G, fP1.color.B, fP1.A);
2085 const RGB32 col2 =
RGB64(fP2.color.R, fP2.color.G, fP2.color.B, fP2.A);
2086 const RGB32 col3 =
RGB64(fP3.color.R, fP3.color.G, fP3.color.B, fP3.A);
2088 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
2089 const int32_t pa = O1 + O2 + O3;
2090 const int32_t E = ((pa == 0) ? 1 : 0);
2091 const int32_t aera = pa + E;
2092 const int shiftC = (aera > (1 << 22)) ? 10 : 0;
2094 while ((uintptr_t)(buf) < end)
2100 bx = (-O1 + dx1 - 1u) / dx1;
2106 if (dy2 <= 0)
return;
2107 const int32_t by = (-O2 + dy2 - 1u) / dy2;
2111 const int32_t offs = by * stride;
2115 const int32_t bx2 = (-O2 + dx2 - 1u) / dx2;
2122 if (dy3 <= 0)
return;
2123 const int32_t by = (-O3 + dy3 - 1u) / dy3;
2127 const int32_t offs = by * stride;
2131 const int32_t bx3 = (-O3 + dx3 - 1u) / dx3;
2135 int32_t C2 = O2 + (dx2 * bx);
2136 int32_t C3 = O3 + (dx3 * bx);
2137 while ((bx < lx) && ((C2 | C3) >= 0))
2143 buf[bx] = color_t_im(c);
2166 template<
bool USE_BLENDING,
bool USE_MASKING,
bool USE_GRADIENT,
typename color_t_im,
typename color_t_tex>
2168 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
2169 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
2170 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
2171 const RasterizerParams<color_t_im, color_t_tex, float> & data)
2174 const int32_t stride = data.im->stride();
2175 color_t_im* buf = data.im->data() + oox + (ooy * stride);
2177 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
2178 const int32_t pa = O1 + O2 + O3;
2179 const int32_t E = ((pa == 0) ? 1 : 0);
2180 const int32_t aera = pa + E;
2182 const float invaera =
fast_inv((
float)aera);
2184 const color_t_tex mask_color = data.mask_color;
2186 const RGBf& cf1 = fP1.color;
2187 const RGBf& cf2 = fP2.color;
2188 const RGBf& cf3 = fP3.color;
2195 const color_t_tex * tex = data.tex->data();
2196 const int32_t texsize_x = data.tex->width();
2197 const int32_t texsize_y = data.tex->height();
2198 const int32_t texsize_x_mm = data.tex->width() - 1;
2199 const int32_t texsize_y_mm = data.tex->height() - 1;
2200 const int32_t texstride = data.tex->stride();
2213 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
2214 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
2216 while ((uintptr_t)(buf) < end)
2222 bx = (-O1 + dx1 - 1u) / dx1;
2228 if (dy2 <= 0)
return;
2229 const int32_t by = (-O2 + dy2 - 1u) / dy2;
2233 const int32_t offs = by * stride;
2237 const int32_t bx2 = (-O2 + dx2 - 1u) / dx2;
2244 if (dy3 <= 0)
return;
2245 const int32_t by = (-O3 + dy3 - 1u) / dy3;
2249 const int32_t offs = by * stride;
2253 const int32_t bx3 = (-O3 + dx3 - 1u) / dx3;
2257 int32_t C1 = O1 + (dx1 * bx) + E;
2258 int32_t C2 = O2 + (dx2 * bx);
2259 int32_t C3 = O3 + (dx3 * bx);
2261 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3)) - 0.5f;
2262 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3)) - 0.5f;
2264 while ((bx < lx) && ((C2 | C3) >= 0))
2266 const float xx = tx;
2267 const float yy = ty;
2270 const float ax = xx - ttx;
2271 const float ay = yy - tty;
2273 const int minx =
shaderclip(ttx, texsize_x_mm);
2274 const int maxx =
shaderclip(ttx + 1, texsize_x_mm);
2275 const int miny =
shaderclip(tty, texsize_y_mm) * texstride;
2276 const int maxy =
shaderclip(tty + 1, texsize_y_mm) * texstride;
2280 auto col00 = tex[minx + miny];
2281 auto col10 = tex[maxx + miny];
2282 auto col01 = tex[minx + maxy];
2283 auto col11 = tex[maxx + maxy];
2285 if ((col00 != mask_color) && (col10 != mask_color) && (col01 != mask_color) && (col11 != mask_color))
2292 const int sC1 = aera - C3 - C2;
2293 const float m = 256.0f / aera;
2294 const int r = (int)((sC1 * cf1.
R + sC2 * cf2.
R + sC3 * cf3.
R) * m);
2295 const int g = (int)((sC1 * cf1.
G + sC2 * cf2.
G + sC3 * cf3.
G) * m);
2296 const int b = (int)((sC1 * cf1.
B + sC2 * cf2.
B + sC3 * cf3.
B) * m);
2297 const int a = (int)((sC1 * fP1.A + sC2 * fP2.A + sC3 * fP3.A) * m);
2298 col.mult256(r, g, b, a);
2302 color_t_tex c = color_t_tex(buf[bx]);
2303 c.blend(col, data.opacity);
2304 buf[bx] = color_t_im(c);
2308 buf[bx] = color_t_im(col);
2324 const int sC1 = aera - C3 - C2;
2325 const float m = 256.0f / aera;
2326 const int r = (int)((sC1 * cf1.
R + sC2 * cf2.
R + sC3 * cf3.
R) * m);
2327 const int g = (int)((sC1 * cf1.
G + sC2 * cf2.
G + sC3 * cf3.
G) * m);
2328 const int b = (int)((sC1 * cf1.
B + sC2 * cf2.
B + sC3 * cf3.
B) * m);
2329 const int a = (int)((sC1 * fP1.A + sC2 * fP2.A + sC3 * fP3.A) * m);
2336 buf[bx] = color_t_im(c);
2342 buf[bx] = color_t_im(col);
2348 buf[bx] = color_t_im(c);
2355 color_t_tex col =
interpolateColorsBilinear(tex[minx + miny], tex[maxx + miny], tex[minx + maxy], tex[maxx + maxy], ax, ay);
2360 const int sC1 = aera - C3 - C2;
2361 const float m = 256.0f / aera;
2362 const int r = (int)((sC1 * cf1.
R + sC2 * cf2.
R + sC3 * cf3.
R) * m);
2363 const int g = (int)((sC1 * cf1.
G + sC2 * cf2.
G + sC3 * cf3.
G) * m);
2364 const int b = (int)((sC1 * cf1.
B + sC2 * cf2.
B + sC3 * cf3.
B) * m);
2365 const int a = (int)((sC1 * fP1.A + sC2 * fP2.A + sC3 * fP3.A) * m);
2366 col.mult256(r, g, b, a);
2370 color_t_tex c = color_t_tex(buf[bx]);
2371 c.blend(col, data.opacity);
2372 buf[bx] = color_t_im(c);
2376 buf[bx] = color_t_im(col);
2402 template<
typename BLEND_OP,
typename color_t_im,
typename color_t_tex>
2404 const int32_t dx1,
const int32_t dy1, int32_t O1,
const RasterizerVec4& fP1,
2405 const int32_t dx2,
const int32_t dy2, int32_t O2,
const RasterizerVec4& fP2,
2406 const int32_t dx3,
const int32_t dy3, int32_t O3,
const RasterizerVec4& fP3,
2407 const RasterizerParams<color_t_im, color_t_tex, float, BLEND_OP> & data)
2410 const int32_t stride = data.im->stride();
2411 color_t_im * buf = data.im->data() + oox + (ooy * stride);
2413 const uintptr_t end = (uintptr_t)(buf + (ly * stride));
2414 const int32_t pa = O1 + O2 + O3;
2415 const int32_t E = ((pa == 0) ? 1 : 0);
2416 const int32_t aera = pa + E;
2418 const float invaera =
fast_inv((
float)aera);
2426 const color_t_tex * tex = data.tex->data();
2427 const int32_t texsize_x = data.tex->width();
2428 const int32_t texsize_y = data.tex->height();
2429 const int32_t texsize_x_mm = data.tex->width() - 1;
2430 const int32_t texsize_y_mm = data.tex->height() - 1;
2431 const int32_t texstride = data.tex->stride();
2444 const float dtx = ((T1.
x * dx1) + (T2.
x * dx2) + (T3.
x * dx3));
2445 const float dty = ((T1.
y * dx1) + (T2.
y * dx2) + (T3.
y * dx3));
2447 while ((uintptr_t)(buf) < end)
2453 bx = (-O1 + dx1 - 1u) / dx1;
2459 if (dy2 <= 0)
return;
2460 const int32_t by = (-O2 + dy2 - 1u) / dy2;
2464 const int32_t offs = by * stride;
2468 const int32_t bx2 = (-O2 + dx2 - 1u) / dx2;
2475 if (dy3 <= 0)
return;
2476 const int32_t by = (-O3 + dy3 - 1u) / dy3;
2480 const int32_t offs = by * stride;
2484 const int32_t bx3 = (-O3 + dx3 - 1u) / dx3;
2488 int32_t C1 = O1 + (dx1 * bx) + E;
2489 int32_t C2 = O2 + (dx2 * bx);
2490 int32_t C3 = O3 + (dx3 * bx);
2492 float tx = ((T1.
x * C1) + (T2.
x * C2) + (T3.
x * C3)) - 0.5f;
2493 float ty = ((T1.
y * C1) + (T2.
y * C2) + (T3.
y * C3)) - 0.5f;
2495 while ((bx < lx) && ((C2 | C3) >= 0))
2497 const float xx = tx;
2498 const float yy = ty;
2501 const float ax = xx - ttx;
2502 const float ay = yy - tty;
2504 const int minx =
shaderclip(ttx, texsize_x_mm);
2505 const int maxx =
shaderclip(ttx + 1, texsize_x_mm);
2506 const int miny =
shaderclip(tty, texsize_y_mm) * texstride;
2507 const int maxy =
shaderclip(tty + 1, texsize_y_mm) * texstride;
2509 color_t_tex col =
interpolateColorsBilinear(tex[minx + miny], tex[maxx + miny], tex[minx + maxy], tex[maxx + maxy], ax, ay);
2511 buf[bx] = (color_t_im)((*data.p_blend_op)(col, buf[bx]));
TGX_INLINE 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
const RGB32 RGB32_Red
Color red in RGB32 format.
TGX_INLINE 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 int32_t lfloorf(float x)
Compute (int32_t)floorf(x).
Definition: Misc.h:441
TGX_INLINE T max(T a, T b)
Don't know why but much faster than fmaxf() for floats.
Definition: Misc.h:153
TGX_INLINE float fast_inv(float x)
Fast (approximate) computation of 1/x.
Definition: Misc.h:197
TGX_INLINE float fast_inv_approx(float x)
Fast (very approximate) computation of 1/x.
Definition: Misc.h:243
Triangle shader parameters.
#define TGX_SHADER_CAN_USE_FLAT_OR_UNLIT(enabled_shader_type, shader_type)
True when a shader configuration can use either flat shading or unlit shading.
Definition: ShaderParams.h:113
TGX_UBER_SHADER_INLINE void uber_shader_inline(const int32_t oox, const int32_t ooy, 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)
UBER-SHADER for all 3D rendering variants.
Definition: Shaders.h:181
void shader_2D_texture(const int32_t oox, const int32_t ooy, 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:2167
void shader_2D_gradient(const int32_t oox, const int32_t ooy, 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:2074
void shader_test(const int32_t oox, const int32_t ooy, 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_2D_texture_blend_op(const int32_t oox, const int32_t ooy, 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:2403
TGX_SHADER_SELECT_INLINE void shader_select(const int32_t oox, const int32_t ooy, 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:1579
TGX_INLINE int shaderclip(int v, int maxv)
for texture clamping
Definition: Shaders.h:34
void uber_shader(const int32_t oox, const int32_t ooy, 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)
UBER-SHADER for all 3D rendering variants.
Definition: Shaders.h:1564
Color in R8/G8/B8/A8 format.
Definition: Color.h:1174
TGX_INLINE 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:1588
uint8_t A
Alpha channel (8bits)
Definition: Color.h:1195
TGX_INLINE float opacity() const
Return the opacity (alpha channel value) of this color in the range [0,1] (0=fully transparent,...
Definition: Color.h:1627
TGX_INLINE 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:1544
TGX_INLINE 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:1559
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:1789
Color in R,G,B float format.
Definition: Color.h:2405
float R
Red channel.
Definition: Color.h:2418
float B
Blue channel.
Definition: Color.h:2420
float G
Green channel.
Definition: Color.h:2419
T x
'x' coordinate (first dimension)
Definition: Vec2.h:72
T y
'y' coordinate (second dimension)
Definition: Vec2.h:73