diff --git a/tools/quake3/common/qmath.h b/tools/quake3/common/qmath.h index eeb8c9db..687effcb 100644 --- a/tools/quake3/common/qmath.h +++ b/tools/quake3/common/qmath.h @@ -113,6 +113,18 @@ struct Color4___ : public BasicVector4 using Color4f = Color4___; using Color4b = Color4___; +using Vector3b = BasicVector3; + + +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() ) ); +} diff --git a/tools/quake3/q3map2/decals.cpp b/tools/quake3/q3map2/decals.cpp index 7bc3bef9..671be516 100644 --- a/tools/quake3/q3map2/decals.cpp +++ b/tools/quake3/q3map2/decals.cpp @@ -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 ) }; } } } diff --git a/tools/quake3/q3map2/light.cpp b/tools/quake3/q3map2/light.cpp index 01da3bdd..b9838264 100644 --- a/tools/quake3/q3map2/light.cpp +++ b/tools/quake3/q3map2/light.cpp @@ -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 diff --git a/tools/quake3/q3map2/light_ydnar.cpp b/tools/quake3/q3map2/light_ydnar.cpp index b0499c63..9ace44b1 100644 --- a/tools/quake3/q3map2/light_ydnar.cpp +++ b/tools/quake3/q3map2/light_ydnar.cpp @@ -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 ); } } } diff --git a/tools/quake3/q3map2/lightmaps_ydnar.cpp b/tools/quake3/q3map2/lightmaps_ydnar.cpp index 11051266..1bbef358 100644 --- a/tools/quake3/q3map2/lightmaps_ydnar.cpp +++ b/tools/quake3/q3map2/lightmaps_ydnar.cpp @@ -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 ); } } } diff --git a/tools/quake3/q3map2/model.cpp b/tools/quake3/q3map2/model.cpp index b6813378..7a8cb7b6 100644 --- a/tools/quake3/q3map2/model.cpp +++ b/tools/quake3/q3map2/model.cpp @@ -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 { diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 268b9430..8e4b51ca 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -275,8 +275,6 @@ enum class EBrushType #define LIGHTMAP_HEIGHT 128 -using Vector3b = BasicVector3; - 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 ); diff --git a/tools/quake3/q3map2/shaders.cpp b/tools/quake3/q3map2/shaders.cpp index c75f3762..f1227328 100644 --- a/tools/quake3/q3map2/shaders.cpp +++ b/tools/quake3/q3map2/shaders.cpp @@ -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>( dv->color[ j ] ) + add ); } } } diff --git a/tools/quake3/q3map2/surface.cpp b/tools/quake3/q3map2/surface.cpp index f4ecd5bf..fb8ee02e 100644 --- a/tools/quake3/q3map2/surface.cpp +++ b/tools/quake3/q3map2/surface.cpp @@ -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; diff --git a/tools/quake3/q3map2/surface_fur.cpp b/tools/quake3/q3map2/surface_fur.cpp index 13b38715..1ac1f23a 100644 --- a/tools/quake3/q3map2/surface_fur.cpp +++ b/tools/quake3/q3map2/surface_fur.cpp @@ -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 ); } } } diff --git a/tools/quake3/q3map2/surface_meta.cpp b/tools/quake3/q3map2/surface_meta.cpp index bee09cb0..e6911c7c 100644 --- a/tools/quake3/q3map2/surface_meta.cpp +++ b/tools/quake3/q3map2/surface_meta.cpp @@ -580,8 +580,8 @@ void MaxAreaFaceSurface( mapDrawSurface_t *ds ){ */ void FanFaceSurface( mapDrawSurface_t *ds ){ - int i, j, k, a, b, c; - BasicVector4 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 */ diff --git a/tools/quake3/q3map2/tjunction.cpp b/tools/quake3/q3map2/tjunction.cpp index 000d63cb..fbcf3652 100644 --- a/tools/quake3/q3map2/tjunction.cpp +++ b/tools/quake3/q3map2/tjunction.cpp @@ -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 ); } }