TINYGL: Fix ARGBST scaling.

I based ARGB scaling on ST scaling without giving it enough thought.
It accidentally uncovered an older bug in glopClear, which made me recheck
these formulas.
ST scaling maps [0.0, 1.0] to [0x01.0000, 0xff.0000], meaning the first and
last texture rows and columns are never shown.
Treating s and t as proportions of ST_MAX fixes this by mapping to
[0x00.0000, 0xff.fffc] (last two fractional bits being off-precision, as
there are only 14 bits), covering the whole available range.
This commit is contained in:
Vincent Pelletier 2017-05-01 08:28:55 +00:00
parent 8c1954359e
commit 4bcc95f217
3 changed files with 15 additions and 24 deletions

View file

@ -82,10 +82,10 @@ void tglColor4f(float r, float g, float b, float a) {
p[3].f = b; p[3].f = b;
p[4].f = a; p[4].f = a;
// direct convertion to integer to go faster if no shading // direct convertion to integer to go faster if no shading
p[5].ui = (unsigned int)(r * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) + ZB_POINT_RED_MIN); p[5].ui = (unsigned int)(r * ZB_POINT_RED_MAX);
p[6].ui = (unsigned int)(g * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) + ZB_POINT_GREEN_MIN); p[6].ui = (unsigned int)(g * ZB_POINT_GREEN_MAX);
p[7].ui = (unsigned int)(b * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + ZB_POINT_BLUE_MIN); p[7].ui = (unsigned int)(b * ZB_POINT_BLUE_MAX);
p[8].ui = (unsigned int)(a * (ZB_POINT_ALPHA_MAX - ZB_POINT_ALPHA_MIN) + ZB_POINT_ALPHA_MIN); p[8].ui = (unsigned int)(a * ZB_POINT_ALPHA_MAX);
gl_add_op(p); gl_add_op(p);
} }

View file

@ -50,14 +50,10 @@ void gl_transform_to_viewport(GLContext *c, GLVertex *v) {
v->zp.z = (int)(v->pc.Z * winv * c->viewport.scale.Z + c->viewport.trans.Z); v->zp.z = (int)(v->pc.Z * winv * c->viewport.scale.Z + c->viewport.trans.Z);
// color // color
if (c->lighting_enabled) { if (c->lighting_enabled) {
v->zp.r = (int)(v->color.X * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) v->zp.r = (int)(v->color.X * ZB_POINT_RED_MAX);
+ ZB_POINT_RED_MIN); v->zp.g = (int)(v->color.Y * ZB_POINT_GREEN_MAX);
v->zp.g = (int)(v->color.Y * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) v->zp.b = (int)(v->color.Z * ZB_POINT_BLUE_MAX);
+ ZB_POINT_GREEN_MIN); v->zp.a = (int)(v->color.W * ZB_POINT_ALPHA_MAX);
v->zp.b = (int)(v->color.Z * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN)
+ ZB_POINT_BLUE_MIN);
v->zp.a = (int)(v->color.W * (ZB_POINT_ALPHA_MAX - ZB_POINT_ALPHA_MIN)
+ ZB_POINT_ALPHA_MIN);
} else { } else {
// no need to convert to integer if no lighting : take current color // no need to convert to integer if no lighting : take current color
v->zp.r = c->longcurrent_color[0]; v->zp.r = c->longcurrent_color[0];
@ -68,8 +64,8 @@ void gl_transform_to_viewport(GLContext *c, GLVertex *v) {
// texture // texture
if (c->texture_2d_enabled) { if (c->texture_2d_enabled) {
v->zp.s = (int)(v->tex_coord.X * (ZB_POINT_ST_MAX - ZB_POINT_ST_MIN) + ZB_POINT_ST_MIN); v->zp.s = (int)(v->tex_coord.X * ZB_POINT_ST_MAX);
v->zp.t = (int)(v->tex_coord.Y * (ZB_POINT_ST_MAX - ZB_POINT_ST_MIN) + ZB_POINT_ST_MIN); v->zp.t = (int)(v->tex_coord.Y * ZB_POINT_ST_MAX);
} }
} }

View file

@ -43,32 +43,27 @@ namespace TinyGL {
#define ZB_POINT_ST_FRAC_BITS 14 #define ZB_POINT_ST_FRAC_BITS 14
#define ZB_POINT_ST_FRAC_SHIFT (ZB_POINT_ST_FRAC_BITS - 1) #define ZB_POINT_ST_FRAC_SHIFT (ZB_POINT_ST_FRAC_BITS - 1)
#define ZB_POINT_ST_MIN ( (1 << ZB_POINT_ST_FRAC_SHIFT) ) #define ZB_POINT_ST_MAX ( (c->_textureSize << ZB_POINT_ST_FRAC_BITS) - 1 )
#define ZB_POINT_ST_MAX ( (c->_textureSize << ZB_POINT_ST_FRAC_BITS) - (1 << ZB_POINT_ST_FRAC_SHIFT) )
#define ZB_POINT_RED_BITS 16 #define ZB_POINT_RED_BITS 16
#define ZB_POINT_RED_FRAC_BITS 8 #define ZB_POINT_RED_FRAC_BITS 8
#define ZB_POINT_RED_FRAC_SHIFT (ZB_POINT_RED_FRAC_BITS - 1) #define ZB_POINT_RED_FRAC_SHIFT (ZB_POINT_RED_FRAC_BITS - 1)
#define ZB_POINT_RED_MIN ( (1 << ZB_POINT_RED_FRAC_SHIFT) ) #define ZB_POINT_RED_MAX ( (1 << ZB_POINT_RED_BITS) - 1 )
#define ZB_POINT_RED_MAX ( (1 << ZB_POINT_RED_BITS) - (1 << ZB_POINT_RED_FRAC_SHIFT) )
#define ZB_POINT_GREEN_BITS 16 #define ZB_POINT_GREEN_BITS 16
#define ZB_POINT_GREEN_FRAC_BITS 8 #define ZB_POINT_GREEN_FRAC_BITS 8
#define ZB_POINT_GREEN_FRAC_SHIFT (ZB_POINT_GREEN_FRAC_BITS - 1) #define ZB_POINT_GREEN_FRAC_SHIFT (ZB_POINT_GREEN_FRAC_BITS - 1)
#define ZB_POINT_GREEN_MIN ( (1 << ZB_POINT_GREEN_FRAC_SHIFT) ) #define ZB_POINT_GREEN_MAX ( (1 << ZB_POINT_GREEN_BITS) - 1 )
#define ZB_POINT_GREEN_MAX ( (1 << ZB_POINT_GREEN_BITS) - (1 << ZB_POINT_GREEN_FRAC_SHIFT) )
#define ZB_POINT_BLUE_BITS 16 #define ZB_POINT_BLUE_BITS 16
#define ZB_POINT_BLUE_FRAC_BITS 8 #define ZB_POINT_BLUE_FRAC_BITS 8
#define ZB_POINT_BLUE_FRAC_SHIFT (ZB_POINT_BLUE_FRAC_BITS - 1) #define ZB_POINT_BLUE_FRAC_SHIFT (ZB_POINT_BLUE_FRAC_BITS - 1)
#define ZB_POINT_BLUE_MIN ( (1 << ZB_POINT_BLUE_FRAC_SHIFT) ) #define ZB_POINT_BLUE_MAX ( (1 << ZB_POINT_BLUE_BITS) - 1 )
#define ZB_POINT_BLUE_MAX ( (1 << ZB_POINT_BLUE_BITS) - (1 << ZB_POINT_BLUE_FRAC_SHIFT) )
#define ZB_POINT_ALPHA_BITS 16 #define ZB_POINT_ALPHA_BITS 16
#define ZB_POINT_ALPHA_FRAC_BITS 8 #define ZB_POINT_ALPHA_FRAC_BITS 8
#define ZB_POINT_ALPHA_FRAC_SHIFT (ZB_POINT_ALPHA_FRAC_BITS - 1) #define ZB_POINT_ALPHA_FRAC_SHIFT (ZB_POINT_ALPHA_FRAC_BITS - 1)
#define ZB_POINT_ALPHA_MIN ( (1 << ZB_POINT_ALPHA_FRAC_SHIFT) ) #define ZB_POINT_ALPHA_MAX ( (1 << ZB_POINT_ALPHA_BITS) - 1 )
#define ZB_POINT_ALPHA_MAX ( (1 << ZB_POINT_ALPHA_BITS) - (1 << ZB_POINT_ALPHA_FRAC_SHIFT) )
#define RGB_TO_PIXEL(r, g, b) cmode.ARGBToColor(255, r, g, b) // Default to 255 alpha aka solid colour. #define RGB_TO_PIXEL(r, g, b) cmode.ARGBToColor(255, r, g, b) // Default to 255 alpha aka solid colour.