manage color-to-byte conversions

This commit is contained in:
Garux 2021-03-05 13:37:56 +03:00
parent bee749118f
commit 293fab0ffb
12 changed files with 57 additions and 59 deletions

View File

@ -113,6 +113,18 @@ struct Color4___ : public BasicVector4<T>
using Color4f = Color4___<float>; using Color4f = Color4___<float>;
using Color4b = Color4___<byte>; using Color4b = Color4___<byte>;
using Vector3b = BasicVector3<byte>;
inline byte color_to_byte( float color ){
return std::clamp( color, 0.f, 255.f );
}
inline Vector3b color_to_byte( const Vector3& color ){
return Vector3b( color_to_byte( color.x() ), color_to_byte( color.y() ), color_to_byte( color.z() ) );
}
inline Color4b color_to_byte( const Color4f& color ){
return Color4b( color_to_byte( color.rgb() ), color_to_byte( color.alpha() ) );
}

View File

@ -578,7 +578,7 @@ static void ProjectDecalOntoWinding( decalProjector_t *dp, mapDrawSurface_t *ds,
/* set alpha */ /* set alpha */
const float d = plane3_distance_to_point( dp->planes[ 0 ], w->p[ i ] ); const float d = plane3_distance_to_point( dp->planes[ 0 ], w->p[ i ] );
const float d2 = plane3_distance_to_point( dp->planes[ 1 ], w->p[ i ] ); const float d2 = plane3_distance_to_point( dp->planes[ 1 ], w->p[ i ] );
const float alpha = std::clamp( 255.0f * d2 / ( d + d2 ), 0.f, 255.f ); const float alpha = 255.0f * d2 / ( d + d2 );
/* set misc */ /* set misc */
dv->xyz = w->p[ i ] - entityOrigin; dv->xyz = w->p[ i ] - entityOrigin;
@ -589,7 +589,7 @@ static void ProjectDecalOntoWinding( decalProjector_t *dp, mapDrawSurface_t *ds,
/* set color */ /* set color */
for ( j = 0; j < MAX_LIGHTMAPS; j++ ) for ( j = 0; j < MAX_LIGHTMAPS; j++ )
{ {
dv->color[ j ] = { 255, 255, 255, alpha }; dv->color[ j ] = { 255, 255, 255, color_to_byte( alpha ) };
} }
} }
} }

View File

@ -1621,8 +1621,8 @@ void TraceGrid( int num ){
value_maximize( color[ j ], minGridLight[ j ] ); value_maximize( color[ j ], minGridLight[ j ] );
/* vortex: apply gridscale and gridambientscale here */ /* vortex: apply gridscale and gridambientscale here */
ColorToBytes( color, bgp->ambient[ i ], gridScale * gridAmbientScale ); bgp->ambient[ i ] = ColorToBytes( color, gridScale * gridAmbientScale );
ColorToBytes( gp->directed[ i ], bgp->directed[ i ], gridScale ); bgp->directed[ i ] = ColorToBytes( gp->directed[ i ], gridScale );
/* /*
* HACK: if there's a non-zero directed component, this * HACK: if there's a non-zero directed component, this
* lightgrid cell is useful. However, q3 skips grid * lightgrid cell is useful. However, q3 skips grid

View File

@ -39,7 +39,7 @@
ydnar: moved to here 2001-02-04 ydnar: moved to here 2001-02-04
*/ */
void ColorToBytes( const Vector3& color, Vector3b& colorBytes, float scale ){ Vector3b ColorToBytes( const Vector3& color, float scale ){
int i; int i;
float max, gamma; float max, gamma;
float inv, dif; float inv, dif;
@ -118,7 +118,7 @@ void ColorToBytes( const Vector3& color, Vector3b& colorBytes, float scale ){
} }
/* store it off */ /* store it off */
colorBytes = sample; return sample;
} }
@ -2794,7 +2794,7 @@ void IlluminateVertexes( int num ){
vertLuxel += radVertLuxel; vertLuxel += radVertLuxel;
} }
if ( !info->si->noVertexLight ) { if ( !info->si->noVertexLight ) {
ColorToBytes( vertLuxel, verts[ i ].color[ lightmapNum ].rgb(), info->si->vertexScale ); verts[ i ].color[ lightmapNum ].rgb() = ColorToBytes( vertLuxel, info->si->vertexScale );
} }
} }
} }
@ -2908,7 +2908,7 @@ void IlluminateVertexes( int num ){
/* store into bytes (for vertex approximation) */ /* store into bytes (for vertex approximation) */
if ( !info->si->noVertexLight ) { if ( !info->si->noVertexLight ) {
ColorToBytes( vertLuxel, verts[ i ].color[ lightmapNum ].rgb(), 1.0f ); verts[ i ].color[ lightmapNum ].rgb() = ColorToBytes( vertLuxel, 1.0f );
} }
} }
} }

View File

@ -1558,9 +1558,8 @@ static bool ApproximateLuxel( rawLightmap_t *lm, bspDrawVert_t *dv ){
} }
/* set to bytes */ /* set to bytes */
Color4b cb, vcb; Color4b cb( ColorToBytes( color, 1.0f ), 0 );
ColorToBytes( color, cb.rgb(), 1.0f ); Color4b vcb( ColorToBytes( vertexColor, 1.0f ), 0 );
ColorToBytes( vertexColor, vcb.rgb(), 1.0f );
/* compare */ /* compare */
for ( int i = 0; i < 3; i++ ) for ( int i = 0; i < 3; i++ )
@ -2190,7 +2189,7 @@ static void FindOutLightmaps( rawLightmap_t *lm, bool fastAllocate ){
olm->freeLuxels--; olm->freeLuxels--;
/* store color */ /* store color */
ColorToBytes( color, olm->bspLightBytes[ oy * olm->customWidth + ox], lm->brightness ); olm->bspLightBytes[ oy * olm->customWidth + ox] = ColorToBytes( color, lm->brightness );
/* store direction */ /* store direction */
if ( deluxemap ) { if ( deluxemap ) {
@ -3238,7 +3237,7 @@ void StoreSurfaceLightmaps( bool fastAllocate ){
/* store to bytes */ /* store to bytes */
if ( !info->si->noVertexLight ) { if ( !info->si->noVertexLight ) {
ColorToBytes( color, dv[ j ].color[ lightmapNum ].rgb(), info->si->vertexScale ); dv[ j ].color[ lightmapNum ].rgb() = ColorToBytes( color, info->si->vertexScale );
} }
} }
} }

View File

@ -456,7 +456,7 @@ void InsertModel( const char *name, int skin, int frame, const Matrix4& transfor
{ {
dv.lightmap[ j ] = { 0, 0 }; dv.lightmap[ j ] = { 0, 0 };
if ( spawnFlags & 32 ) { // spawnflag 32: model color -> alpha hack if ( spawnFlags & 32 ) { // spawnflag 32: model color -> alpha hack
dv.color[ j ] = { 255, 255, 255, RGBTOGRAY( color ) }; dv.color[ j ] = { 255, 255, 255, color_to_byte( RGBTOGRAY( color ) ) };
} }
else else
{ {

View File

@ -275,8 +275,6 @@ enum class EBrushType
#define LIGHTMAP_HEIGHT 128 #define LIGHTMAP_HEIGHT 128
using Vector3b = BasicVector3<byte>;
typedef void ( *bspFunc )( const char * ); typedef void ( *bspFunc )( const char * );
@ -1812,7 +1810,7 @@ void RadFreeLights();
/* light_ydnar.c */ /* light_ydnar.c */
void ColorToBytes( const Vector3& color, Vector3b& colorBytes, float scale ); Vector3b ColorToBytes( const Vector3& color, float scale );
void SmoothNormals( void ); void SmoothNormals( void );
void MapRawLightmap( int num ); void MapRawLightmap( int num );

View File

@ -39,9 +39,9 @@
*/ */
void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
int i, j, k; int i, j;
float c; float c;
Vector4 mult, add; Color4f mult, add;
bspDrawVert_t *dv; bspDrawVert_t *dv;
colorMod_t *cm2; colorMod_t *cm2;
@ -65,72 +65,72 @@ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
mult.set( 1 ); mult.set( 1 );
add.set( 0 ); add.set( 0 );
const Vector3 cm2_data = vector3_from_array( cm2->data ); const Vector3 cm2_vec3 = vector3_from_array( cm2->data );
/* switch on type */ /* switch on type */
switch ( cm2->type ) switch ( cm2->type )
{ {
case EColorMod::ColorSet: case EColorMod::ColorSet:
mult.vec3().set( 0 ); mult.rgb().set( 0 );
add.vec3() = cm2_data * 255.0f; add.rgb() = cm2_vec3 * 255.0f;
break; break;
case EColorMod::AlphaSet: case EColorMod::AlphaSet:
mult[ 3 ] = 0.0f; mult.alpha() = 0.0f;
add[ 3 ] = cm2->data[ 0 ] * 255.0f; add.alpha() = cm2->data[ 0 ] * 255.0f;
break; break;
case EColorMod::ColorScale: case EColorMod::ColorScale:
mult.vec3() = cm2_data; mult.rgb() = cm2_vec3;
break; break;
case EColorMod::AlphaScale: case EColorMod::AlphaScale:
mult[ 3 ] = cm2->data[ 0 ]; mult.alpha() = cm2->data[ 0 ];
break; break;
case EColorMod::ColorDotProduct: case EColorMod::ColorDotProduct:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
mult.vec3().set( c ); mult.rgb().set( c );
break; break;
case EColorMod::ColorDotProductScale: case EColorMod::ColorDotProductScale:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] ); c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
mult.vec3().set( c ); mult.rgb().set( c );
break; break;
case EColorMod::AlphaDotProduct: case EColorMod::AlphaDotProduct:
mult[ 3 ] = vector3_dot( dv->normal, cm2_data ); mult.alpha() = vector3_dot( dv->normal, cm2_vec3 );
break; break;
case EColorMod::AlphaDotProductScale: case EColorMod::AlphaDotProductScale:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] ); c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
mult[ 3 ] = c; mult.alpha() = c;
break; break;
case EColorMod::ColorDotProduct2: case EColorMod::ColorDotProduct2:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
c *= c; c *= c;
mult.vec3().set( c ); mult.rgb().set( c );
break; break;
case EColorMod::ColorDotProduct2Scale: case EColorMod::ColorDotProduct2Scale:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
c *= c; c *= c;
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] ); c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
mult.vec3().set( c ); mult.rgb().set( c );
break; break;
case EColorMod::AlphaDotProduct2: case EColorMod::AlphaDotProduct2:
mult[ 3 ] = vector3_dot( dv->normal, cm2_data ); mult.alpha() = vector3_dot( dv->normal, cm2_vec3 );
mult[ 3 ] *= mult[ 3 ]; mult.alpha() *= mult.alpha();
break; break;
case EColorMod::AlphaDotProduct2Scale: case EColorMod::AlphaDotProduct2Scale:
c = vector3_dot( dv->normal, cm2_data ); c = vector3_dot( dv->normal, cm2_vec3 );
c *= c; c *= c;
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] ); c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
mult[ 3 ] = c; mult.alpha() = c;
break; break;
default: default:
@ -140,10 +140,7 @@ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
/* apply mod */ /* apply mod */
for ( j = 0; j < MAX_LIGHTMAPS; j++ ) for ( j = 0; j < MAX_LIGHTMAPS; j++ )
{ {
for ( k = 0; k < 4; k++ ) dv->color[ j ] = color_to_byte( mult * static_cast<BasicVector4<byte>>( dv->color[ j ] ) + add );
{
dv->color[ j ][ k ] = std::clamp( mult[ k ] * dv->color[ j ][ k ] + add[ k ], 0.f, 255.f );
}
} }
} }
} }

View File

@ -3110,11 +3110,7 @@ int AddSurfaceModels( mapDrawSurface_t *ds ){
centroid.normal = ds->verts[ 0 ].normal; centroid.normal = ds->verts[ 0 ].normal;
} }
centroid.st /= ds->numVerts; centroid.st /= ds->numVerts;
alpha /= ds->numVerts; centroid.color[ 0 ] = { 255, 255, 255, color_to_byte( alpha / ds->numVerts ) };
centroid.color[ 0 ][ 0 ] = 0xFF;
centroid.color[ 0 ][ 1 ] = 0xFF;
//centroid.color[ 0 ][ 2 ] = 0xFF;
centroid.color[ 0 ][ 2 ] = ( alpha > 255.0f ? 0xFF : alpha );
/* head vert is centroid */ /* head vert is centroid */
tri[ 0 ] = &centroid; tri[ 0 ] = &centroid;

View File

@ -110,7 +110,7 @@ void Fur( mapDrawSurface_t *ds ){
for ( k = 0; k < MAX_LIGHTMAPS; k++ ) for ( k = 0; k < MAX_LIGHTMAPS; k++ )
{ {
a = (float) dv->color[ k ].alpha() - fade; a = (float) dv->color[ k ].alpha() - fade;
dv->color[ k ].alpha() = ( a > 255.0f )? 255 : ( a < 0 )? 0 : a; dv->color[ k ].alpha() = color_to_byte( a );
} }
} }
} }

View File

@ -580,8 +580,8 @@ void MaxAreaFaceSurface( mapDrawSurface_t *ds ){
*/ */
void FanFaceSurface( mapDrawSurface_t *ds ){ void FanFaceSurface( mapDrawSurface_t *ds ){
int i, j, k, a, b, c; int i, k, a, b, c;
BasicVector4<int> color[ MAX_LIGHTMAPS ]; Color4f color[ MAX_LIGHTMAPS ];
for ( k = 0; k < MAX_LIGHTMAPS; k++ ) for ( k = 0; k < MAX_LIGHTMAPS; k++ )
color[k].set( 0 ); color[k].set( 0 );
bspDrawVert_t *verts, *centroid, *dv; bspDrawVert_t *verts, *centroid, *dv;
@ -622,11 +622,7 @@ void FanFaceSurface( mapDrawSurface_t *ds ){
centroid->st *= iv; centroid->st *= iv;
for ( k = 0; k < MAX_LIGHTMAPS; k++ ){ for ( k = 0; k < MAX_LIGHTMAPS; k++ ){
centroid->lightmap[ k ] *= iv; centroid->lightmap[ k ] *= iv;
for ( j = 0; j < 4; j++ ) centroid->color[ k ] = color_to_byte( color[ k ] / ds->numVerts );
{
color[ k ][ j ] /= ds->numVerts;
centroid->color[ k ][ j ] = ( color[ k ][ j ] < 255 ? color[ k ][ j ] : 255 );
}
} }
/* add to vert count */ /* add to vert count */

View File

@ -390,7 +390,7 @@ void FixSurfaceJunctions( mapDrawSurface_t *ds ) {
for ( j = 0; j < 4; j++ ) for ( j = 0; j < 4; j++ )
{ {
c = (float) v1->color[ k ][ j ] + frac * ( (float) v2->color[ k ][ j ] - (float) v1->color[ k ][ j ] ); c = (float) v1->color[ k ][ j ] + frac * ( (float) v2->color[ k ][ j ] - (float) v1->color[ k ][ j ] );
verts[ numVerts ].color[ k ][ j ] = (byte) ( c < 255.0f ? c : 255 ); verts[ numVerts ].color[ k ][ j ] = color_to_byte( c );
} }
} }