mirror of
https://github.com/Garux/netradiant-custom.git
synced 2026-09-28 00:00:03 +02:00
std::forward_list<colorMod_t>
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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_t> 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_t>& colormod, int numVerts, bspDrawVert_t *drawVerts );
|
||||
|
||||
void TCMod( const tcMod_t& mod, Vector2& st );
|
||||
|
||||
|
||||
@@ -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_t>& 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 );
|
||||
|
||||
Reference in New Issue
Block a user