manage color-to-byte conversions
This commit is contained in:
parent
bee749118f
commit
293fab0ffb
|
|
@ -113,6 +113,18 @@ struct Color4___ : public BasicVector4<T>
|
|||
|
||||
using Color4f = Color4___<float>;
|
||||
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() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -578,7 +578,7 @@ static void ProjectDecalOntoWinding( decalProjector_t *dp, mapDrawSurface_t *ds,
|
|||
/* set alpha */
|
||||
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 alpha = std::clamp( 255.0f * d2 / ( d + d2 ), 0.f, 255.f );
|
||||
const float alpha = 255.0f * d2 / ( d + d2 );
|
||||
|
||||
/* set misc */
|
||||
dv->xyz = w->p[ i ] - entityOrigin;
|
||||
|
|
@ -589,7 +589,7 @@ static void ProjectDecalOntoWinding( decalProjector_t *dp, mapDrawSurface_t *ds,
|
|||
/* set color */
|
||||
for ( j = 0; j < MAX_LIGHTMAPS; j++ )
|
||||
{
|
||||
dv->color[ j ] = { 255, 255, 255, alpha };
|
||||
dv->color[ j ] = { 255, 255, 255, color_to_byte( alpha ) };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1621,8 +1621,8 @@ void TraceGrid( int num ){
|
|||
value_maximize( color[ j ], minGridLight[ j ] );
|
||||
|
||||
/* vortex: apply gridscale and gridambientscale here */
|
||||
ColorToBytes( color, bgp->ambient[ i ], gridScale * gridAmbientScale );
|
||||
ColorToBytes( gp->directed[ i ], bgp->directed[ i ], gridScale );
|
||||
bgp->ambient[ i ] = ColorToBytes( color, gridScale * gridAmbientScale );
|
||||
bgp->directed[ i ] = ColorToBytes( gp->directed[ i ], gridScale );
|
||||
/*
|
||||
* HACK: if there's a non-zero directed component, this
|
||||
* lightgrid cell is useful. However, q3 skips grid
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
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;
|
||||
float max, gamma;
|
||||
float inv, dif;
|
||||
|
|
@ -118,7 +118,7 @@ void ColorToBytes( const Vector3& color, Vector3b& colorBytes, float scale ){
|
|||
}
|
||||
|
||||
/* store it off */
|
||||
colorBytes = sample;
|
||||
return sample;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2794,7 +2794,7 @@ void IlluminateVertexes( int num ){
|
|||
vertLuxel += radVertLuxel;
|
||||
}
|
||||
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) */
|
||||
if ( !info->si->noVertexLight ) {
|
||||
ColorToBytes( vertLuxel, verts[ i ].color[ lightmapNum ].rgb(), 1.0f );
|
||||
verts[ i ].color[ lightmapNum ].rgb() = ColorToBytes( vertLuxel, 1.0f );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1558,9 +1558,8 @@ static bool ApproximateLuxel( rawLightmap_t *lm, bspDrawVert_t *dv ){
|
|||
}
|
||||
|
||||
/* set to bytes */
|
||||
Color4b cb, vcb;
|
||||
ColorToBytes( color, cb.rgb(), 1.0f );
|
||||
ColorToBytes( vertexColor, vcb.rgb(), 1.0f );
|
||||
Color4b cb( ColorToBytes( color, 1.0f ), 0 );
|
||||
Color4b vcb( ColorToBytes( vertexColor, 1.0f ), 0 );
|
||||
|
||||
/* compare */
|
||||
for ( int i = 0; i < 3; i++ )
|
||||
|
|
@ -2190,7 +2189,7 @@ static void FindOutLightmaps( rawLightmap_t *lm, bool fastAllocate ){
|
|||
olm->freeLuxels--;
|
||||
|
||||
/* store color */
|
||||
ColorToBytes( color, olm->bspLightBytes[ oy * olm->customWidth + ox], lm->brightness );
|
||||
olm->bspLightBytes[ oy * olm->customWidth + ox] = ColorToBytes( color, lm->brightness );
|
||||
|
||||
/* store direction */
|
||||
if ( deluxemap ) {
|
||||
|
|
@ -3238,7 +3237,7 @@ void StoreSurfaceLightmaps( bool fastAllocate ){
|
|||
|
||||
/* store to bytes */
|
||||
if ( !info->si->noVertexLight ) {
|
||||
ColorToBytes( color, dv[ j ].color[ lightmapNum ].rgb(), info->si->vertexScale );
|
||||
dv[ j ].color[ lightmapNum ].rgb() = ColorToBytes( color, info->si->vertexScale );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -456,7 +456,7 @@ void InsertModel( const char *name, int skin, int frame, const Matrix4& transfor
|
|||
{
|
||||
dv.lightmap[ j ] = { 0, 0 };
|
||||
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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -275,8 +275,6 @@ enum class EBrushType
|
|||
#define LIGHTMAP_HEIGHT 128
|
||||
|
||||
|
||||
using Vector3b = BasicVector3<byte>;
|
||||
|
||||
|
||||
typedef void ( *bspFunc )( const char * );
|
||||
|
||||
|
|
@ -1812,7 +1810,7 @@ void RadFreeLights();
|
|||
|
||||
|
||||
/* light_ydnar.c */
|
||||
void ColorToBytes( const Vector3& color, Vector3b& colorBytes, float scale );
|
||||
Vector3b ColorToBytes( const Vector3& color, float scale );
|
||||
void SmoothNormals( void );
|
||||
|
||||
void MapRawLightmap( int num );
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
*/
|
||||
|
||||
void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
|
||||
int i, j, k;
|
||||
int i, j;
|
||||
float c;
|
||||
Vector4 mult, add;
|
||||
Color4f mult, add;
|
||||
bspDrawVert_t *dv;
|
||||
colorMod_t *cm2;
|
||||
|
||||
|
|
@ -65,72 +65,72 @@ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
|
|||
mult.set( 1 );
|
||||
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 ( cm2->type )
|
||||
{
|
||||
case EColorMod::ColorSet:
|
||||
mult.vec3().set( 0 );
|
||||
add.vec3() = cm2_data * 255.0f;
|
||||
mult.rgb().set( 0 );
|
||||
add.rgb() = cm2_vec3 * 255.0f;
|
||||
break;
|
||||
|
||||
case EColorMod::AlphaSet:
|
||||
mult[ 3 ] = 0.0f;
|
||||
add[ 3 ] = cm2->data[ 0 ] * 255.0f;
|
||||
mult.alpha() = 0.0f;
|
||||
add.alpha() = cm2->data[ 0 ] * 255.0f;
|
||||
break;
|
||||
|
||||
case EColorMod::ColorScale:
|
||||
mult.vec3() = cm2_data;
|
||||
mult.rgb() = cm2_vec3;
|
||||
break;
|
||||
|
||||
case EColorMod::AlphaScale:
|
||||
mult[ 3 ] = cm2->data[ 0 ];
|
||||
mult.alpha() = cm2->data[ 0 ];
|
||||
break;
|
||||
|
||||
case EColorMod::ColorDotProduct:
|
||||
c = vector3_dot( dv->normal, cm2_data );
|
||||
mult.vec3().set( c );
|
||||
c = vector3_dot( dv->normal, cm2_vec3 );
|
||||
mult.rgb().set( c );
|
||||
break;
|
||||
|
||||
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] );
|
||||
mult.vec3().set( c );
|
||||
mult.rgb().set( c );
|
||||
break;
|
||||
|
||||
case EColorMod::AlphaDotProduct:
|
||||
mult[ 3 ] = vector3_dot( dv->normal, cm2_data );
|
||||
mult.alpha() = vector3_dot( dv->normal, cm2_vec3 );
|
||||
break;
|
||||
|
||||
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] );
|
||||
mult[ 3 ] = c;
|
||||
mult.alpha() = c;
|
||||
break;
|
||||
|
||||
case EColorMod::ColorDotProduct2:
|
||||
c = vector3_dot( dv->normal, cm2_data );
|
||||
c = vector3_dot( dv->normal, cm2_vec3 );
|
||||
c *= c;
|
||||
mult.vec3().set( c );
|
||||
mult.rgb().set( c );
|
||||
break;
|
||||
|
||||
case EColorMod::ColorDotProduct2Scale:
|
||||
c = vector3_dot( dv->normal, cm2_data );
|
||||
c = vector3_dot( dv->normal, cm2_vec3 );
|
||||
c *= c;
|
||||
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
|
||||
mult.vec3().set( c );
|
||||
mult.rgb().set( c );
|
||||
break;
|
||||
|
||||
case EColorMod::AlphaDotProduct2:
|
||||
mult[ 3 ] = vector3_dot( dv->normal, cm2_data );
|
||||
mult[ 3 ] *= mult[ 3 ];
|
||||
mult.alpha() = vector3_dot( dv->normal, cm2_vec3 );
|
||||
mult.alpha() *= mult.alpha();
|
||||
break;
|
||||
|
||||
case EColorMod::AlphaDotProduct2Scale:
|
||||
c = vector3_dot( dv->normal, cm2_data );
|
||||
c = vector3_dot( dv->normal, cm2_vec3 );
|
||||
c *= c;
|
||||
c = ( c - cm2->data[3] ) / ( cm2->data[4] - cm2->data[3] );
|
||||
mult[ 3 ] = c;
|
||||
mult.alpha() = c;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -140,10 +140,7 @@ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
|
|||
/* apply mod */
|
||||
for ( j = 0; j < MAX_LIGHTMAPS; j++ )
|
||||
{
|
||||
for ( k = 0; k < 4; k++ )
|
||||
{
|
||||
dv->color[ j ][ k ] = std::clamp( mult[ k ] * dv->color[ j ][ k ] + add[ k ], 0.f, 255.f );
|
||||
}
|
||||
dv->color[ j ] = color_to_byte( mult * static_cast<BasicVector4<byte>>( dv->color[ j ] ) + add );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3110,11 +3110,7 @@ int AddSurfaceModels( mapDrawSurface_t *ds ){
|
|||
centroid.normal = ds->verts[ 0 ].normal;
|
||||
}
|
||||
centroid.st /= ds->numVerts;
|
||||
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 );
|
||||
centroid.color[ 0 ] = { 255, 255, 255, color_to_byte( alpha / ds->numVerts ) };
|
||||
|
||||
/* head vert is centroid */
|
||||
tri[ 0 ] = ¢roid;
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ void Fur( mapDrawSurface_t *ds ){
|
|||
for ( k = 0; k < MAX_LIGHTMAPS; k++ )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -580,8 +580,8 @@ void MaxAreaFaceSurface( mapDrawSurface_t *ds ){
|
|||
*/
|
||||
|
||||
void FanFaceSurface( mapDrawSurface_t *ds ){
|
||||
int i, j, k, a, b, c;
|
||||
BasicVector4<int> color[ MAX_LIGHTMAPS ];
|
||||
int i, k, a, b, c;
|
||||
Color4f color[ MAX_LIGHTMAPS ];
|
||||
for ( k = 0; k < MAX_LIGHTMAPS; k++ )
|
||||
color[k].set( 0 );
|
||||
bspDrawVert_t *verts, *centroid, *dv;
|
||||
|
|
@ -622,11 +622,7 @@ void FanFaceSurface( mapDrawSurface_t *ds ){
|
|||
centroid->st *= iv;
|
||||
for ( k = 0; k < MAX_LIGHTMAPS; k++ ){
|
||||
centroid->lightmap[ k ] *= iv;
|
||||
for ( j = 0; j < 4; j++ )
|
||||
{
|
||||
color[ k ][ j ] /= ds->numVerts;
|
||||
centroid->color[ k ][ j ] = ( color[ k ][ j ] < 255 ? color[ k ][ j ] : 255 );
|
||||
}
|
||||
centroid->color[ k ] = color_to_byte( color[ k ] / ds->numVerts );
|
||||
}
|
||||
|
||||
/* add to vert count */
|
||||
|
|
|
|||
|
|
@ -390,7 +390,7 @@ void FixSurfaceJunctions( mapDrawSurface_t *ds ) {
|
|||
for ( j = 0; j < 4; 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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user