struct material mtl;
int width, height;
- uint32_t *pixels;
+ g3d_pixel *pixels;
int vport[4];
if(st->opt & G3D_BLEND) {
int r, g, b;
int inv_alpha = 255 - pv[0].a;
- uint32_t *dest = st->pixels + (pv[0].y >> 8) * st->width + (pv[0].x >> 8);
- r = ((int)pv[0].r * pv[0].a + UNPACK_R32(*dest) * inv_alpha) >> 8;
- g = ((int)pv[0].g * pv[0].a + UNPACK_G32(*dest) * inv_alpha) >> 8;
- b = ((int)pv[0].b * pv[0].a + UNPACK_B32(*dest) * inv_alpha) >> 8;
- *dest++ = PACK_RGB16(r, g, b);
+ g3d_pixel *dest = st->pixels + (pv[0].y >> 8) * st->width + (pv[0].x >> 8);
+ r = ((int)pv[0].r * pv[0].a + G3D_UNPACK_R(*dest) * inv_alpha) >> 8;
+ g = ((int)pv[0].g * pv[0].a + G3D_UNPACK_G(*dest) * inv_alpha) >> 8;
+ b = ((int)pv[0].b * pv[0].a + G3D_UNPACK_B(*dest) * inv_alpha) >> 8;
+ *dest++ = G3D_PACK_RGB(r, g, b);
} else {
- uint32_t *dest = st->pixels + (pv[0].y >> 8) * st->width + (pv[0].x >> 8);
- *dest = PACK_RGB32(pv[0].r, pv[0].g, pv[0].b);
+ g3d_pixel *dest = st->pixels + (pv[0].y >> 8) * st->width + (pv[0].x >> 8);
+ *dest = G3D_PACK_RGB(pv[0].r, pv[0].g, pv[0].b);
}
break;
case 2:
{
- uint32_t col = PACK_RGB32(pv[0].r, pv[0].g, pv[0].b);
+ g3d_pixel col = G3D_PACK_RGB(pv[0].r, pv[0].g, pv[0].b);
draw_line(pv[0].x >> 8, pv[0].y >> 8, pv[1].x >> 8, pv[1].y >> 8, col);
}
break;
st->imm_curv.nz = z;
}
+#define CLAMP(x, a, b) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x)))
+
void g3d_color3b(unsigned char r, unsigned char g, unsigned char b)
{
- st->imm_curv.r = r;
- st->imm_curv.g = g;
- st->imm_curv.b = b;
+ st->imm_curv.r = CLAMP(r, 0, 255);
+ st->imm_curv.g = CLAMP(g, 0, 255);
+ st->imm_curv.b = CLAMP(b, 0, 255);
st->imm_curv.a = 255;
}
void g3d_color4b(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
{
- st->imm_curv.r = r;
- st->imm_curv.g = g;
- st->imm_curv.b = b;
- st->imm_curv.a = a;
+ st->imm_curv.r = CLAMP(r, 0, 255);
+ st->imm_curv.g = CLAMP(g, 0, 255);
+ st->imm_curv.b = CLAMP(b, 0, 255);
+ st->imm_curv.a = CLAMP(a, 0, 255);
}
void g3d_color3f(float r, float g, float b)
int ir = r * 255.0f;
int ig = g * 255.0f;
int ib = b * 255.0f;
- st->imm_curv.r = ir > 255 ? 255 : ir;
- st->imm_curv.g = ig > 255 ? 255 : ig;
- st->imm_curv.b = ib > 255 ? 255 : ib;
+ st->imm_curv.r = CLAMP(ir, 0, 255);
+ st->imm_curv.g = CLAMP(ig, 0, 255);
+ st->imm_curv.b = CLAMP(ib, 0, 255);
st->imm_curv.a = 255;
}
int ig = g * 255.0f;
int ib = b * 255.0f;
int ia = a * 255.0f;
- st->imm_curv.r = ir > 255 ? 255 : ir;
- st->imm_curv.g = ig > 255 ? 255 : ig;
- st->imm_curv.b = ib > 255 ? 255 : ib;
- st->imm_curv.a = ia > 255 ? 255 : ia;
+ st->imm_curv.r = CLAMP(ir, 0, 255);
+ st->imm_curv.g = CLAMP(ig, 0, 255);
+ st->imm_curv.b = CLAMP(ib, 0, 255);
+ st->imm_curv.a = CLAMP(ia, 0, 255);
}
void g3d_texcoord(float u, float v)