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 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() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 ) };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 ] = ¢roid;
|
tri[ 0 ] = ¢roid;
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user