diff --git a/tools/quake3/q3map2/map.cpp b/tools/quake3/q3map2/map.cpp index 3ebdef9d..86990bbb 100644 --- a/tools/quake3/q3map2/map.cpp +++ b/tools/quake3/q3map2/map.cpp @@ -836,9 +836,9 @@ static void FinishBrush( bool noCollapseGroups, entity_t& mapEnt ){ b.original = &b; /* link colorMod volume brushes to the entity directly */ - if ( b.contentShader != nullptr && - b.contentShader->colorMod != nullptr && - b.contentShader->colorMod->type == EColorMod::Volume ) { + if ( b.contentShader != nullptr + && !b.contentShader->colorMod.empty() + && b.contentShader->colorMod.front().type == EColorMod::Volume ) { mapEnt.colorModBrushes.push_back( &b ); } } diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 6629a067..cdc7dc3d 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -483,7 +483,6 @@ enum class EColorMod struct colorMod_t { - colorMod_t *next; EColorMod type; float data[ 16 ]; }; @@ -542,7 +541,7 @@ struct shaderInfo_t_data Vector3 vecs[ 2 ]; /* ydnar: explicit texture vectors for [0,1] texture space */ tcMod_t mod; /* ydnar: q3map_tcMod matrix for djbob :) */ Vector3 lightmapAxis{ 0 }; /* ydnar: explicit lightmap axis projection */ - colorMod_t *colorMod; /* ydnar: q3map_rgb/color/alpha/Set/Mod support */ + std::forward_list colorMod; /* ydnar: q3map_rgb/color/alpha/Set/Mod support */ int furNumLayers; /* ydnar: number of fur layers */ float furOffset; /* ydnar: offset of each layer */ @@ -1715,7 +1714,7 @@ const image_t *ImageLoad( const char *name ); /* shaders.c */ -void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVerts ); +void ColorMod( const std::forward_list& colormod, int numVerts, bspDrawVert_t *drawVerts ); void TCMod( const tcMod_t& mod, Vector2& st ); diff --git a/tools/quake3/q3map2/shaders.cpp b/tools/quake3/q3map2/shaders.cpp index a710058a..a6d5c482 100644 --- a/tools/quake3/q3map2/shaders.cpp +++ b/tools/quake3/q3map2/shaders.cpp @@ -45,9 +45,9 @@ static int numCustSurfaceParms; routines for dealing with vertex color/alpha modification */ -void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVerts ){ +void ColorMod( const std::forward_list& colormod, int numVerts, bspDrawVert_t *drawVerts ){ /* dummy check */ - if ( colormod == nullptr || numVerts < 1 || drawVerts == nullptr ) { + if ( colormod.empty() || numVerts < 1 || drawVerts == nullptr ) { return; } @@ -56,16 +56,16 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert for ( bspDrawVert_t& dv : Span( drawVerts, numVerts ) ) { /* walk colorMod list */ - for ( const colorMod_t *cm = colormod; cm != nullptr; cm = cm->next ) + for ( const colorMod_t& cm : colormod ) { float c; /* default */ Color4f mult( 1, 1, 1, 1 ); Color4f add( 0, 0, 0, 0 ); - const Vector3 cm_vec3 = vector3_from_array( cm->data ); + const Vector3 cm_vec3 = vector3_from_array( cm.data ); /* switch on type */ - switch ( cm->type ) + switch ( cm.type ) { case EColorMod::ColorSet: mult.rgb().set( 0 ); @@ -74,7 +74,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert case EColorMod::AlphaSet: mult.alpha() = 0; - add.alpha() = cm->data[ 0 ] * 255.0f; + add.alpha() = cm.data[ 0 ] * 255.0f; break; case EColorMod::ColorScale: @@ -82,7 +82,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert break; case EColorMod::AlphaScale: - mult.alpha() = cm->data[ 0 ]; + mult.alpha() = cm.data[ 0 ]; break; case EColorMod::ColorDotProduct: @@ -92,7 +92,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert case EColorMod::ColorDotProductScale: c = vector3_dot( dv.normal, cm_vec3 ); - c = ( c - cm->data[3] ) / ( cm->data[4] - cm->data[3] ); + c = ( c - cm.data[3] ) / ( cm.data[4] - cm.data[3] ); mult.rgb().set( c ); break; @@ -102,7 +102,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert case EColorMod::AlphaDotProductScale: c = vector3_dot( dv.normal, cm_vec3 ); - c = ( c - cm->data[3] ) / ( cm->data[4] - cm->data[3] ); + c = ( c - cm.data[3] ) / ( cm.data[4] - cm.data[3] ); mult.alpha() = c; break; @@ -115,7 +115,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert case EColorMod::ColorDotProduct2Scale: c = vector3_dot( dv.normal, cm_vec3 ); c *= c; - c = ( c - cm->data[3] ) / ( cm->data[4] - cm->data[3] ); + c = ( c - cm.data[3] ) / ( cm.data[4] - cm.data[3] ); mult.rgb().set( c ); break; @@ -127,7 +127,7 @@ void ColorMod( const colorMod_t *colormod, int numVerts, bspDrawVert_t *drawVert case EColorMod::AlphaDotProduct2Scale: c = vector3_dot( dv.normal, cm_vec3 ); c *= c; - c = ( c - cm->data[3] ) / ( cm->data[4] - cm->data[3] ); + c = ( c - cm.data[3] ) / ( cm.data[4] - cm.data[3] ); mult.alpha() = c; break; @@ -1471,29 +1471,13 @@ static void ParseShaderFile( const char *filename ){ else if ( striEqual( token, "q3map_colorGen" ) || striEqual( token, "q3map_colorMod" ) || striEqual( token, "q3map_rgbGen" ) || striEqual( token, "q3map_rgbMod" ) || striEqual( token, "q3map_alphaGen" ) || striEqual( token, "q3map_alphaMod" ) ) { - colorMod_t *cm, *cm2; - - /* alphamods are colormod + 1 */ const bool alpha = striEqual( token, "q3map_alphaGen" ) || striEqual( token, "q3map_alphaMod" ); /* allocate new colormod */ - cm = safe_calloc( sizeof( *cm ) ); - - /* attach to shader */ - if ( si.colorMod == nullptr ) { - si.colorMod = cm; - } - else - { - for ( cm2 = si.colorMod; cm2 != nullptr; cm2 = cm2->next ) - { - if ( cm2->next == nullptr ) { - cm2->next = cm; - break; - } - } - } + auto cm = si.colorMod.before_begin(); + while( std::next( cm ) != si.colorMod.end() ) ++cm; + cm = si.colorMod.emplace_after( cm ); /* get type */ text.GetToken( false );