bool CEnvProjectedTexture::KeyValue( const char *szKeyName, const char *szValue ) { if ( FStrEq( szKeyName, "lightcolor" ) ) { float tmp[4]; UTIL_StringToFloatArray( tmp, 4, szValue ); m_LightColor.SetR( tmp[0] ); m_LightColor.SetG( tmp[1] ); m_LightColor.SetB( tmp[2] ); m_LightColor.SetA( tmp[3] ); } else if ( FStrEq( szKeyName, "texturename" ) ) { #if defined( _X360 ) if ( Q_strcmp( szValue, "effects/flashlight001" ) == 0 ) { // Use this as the default for Xbox Q_strcpy( m_SpotlightTextureName.GetForModify(), "effects/flashlight_border" ); } else { Q_strcpy( m_SpotlightTextureName.GetForModify(), szValue ); } #else Q_strcpy( m_SpotlightTextureName.GetForModify(), szValue ); #endif } else { return BaseClass::KeyValue( szKeyName, szValue ); } return true; }
void UTIL_ColorStringToLinearFloatColor( Vector &color, const char *pString ) { float tmp[4]; UTIL_StringToFloatArray( tmp, 4, pString ); if( tmp[3] <= 0.0f ) { tmp[3] = 255.0f; } tmp[3] *= ( 1.0f / 255.0f ); color.x = GammaToLinear( tmp[0] * ( 1.0f / 255.0f ) ) * tmp[3]; color.y = GammaToLinear( tmp[1] * ( 1.0f / 255.0f ) ) * tmp[3]; color.z = GammaToLinear( tmp[2] * ( 1.0f / 255.0f ) ) * tmp[3]; }
bool CGlobalLight::KeyValue( const char *szKeyName, const char *szValue ) { if ( FStrEq( szKeyName, "color" ) ) { float tmp[4]; UTIL_StringToFloatArray( tmp, 4, szValue ); m_LightColor.SetR( tmp[0] ); m_LightColor.SetG( tmp[1] ); m_LightColor.SetB( tmp[2] ); m_LightColor.SetA( tmp[3] ); } else if ( FStrEq( szKeyName, "angles" ) ) { QAngle angles; UTIL_StringToVector( angles.Base(), szValue ); if (angles == vec3_angle) { angles.Init( 80, 30, 0 ); } Vector vForward; AngleVectors( angles, &vForward ); m_shadowDirection = vForward; return true; } else if ( FStrEq( szKeyName, "texturename" ) ) { #if defined( _X360 ) if ( Q_strcmp( szValue, "effects/flashlight001" ) == 0 ) { // Use this as the default for Xbox Q_strcpy( m_TextureName.GetForModify(), "effects/flashlight_border" ); } else { Q_strcpy( m_TextureName.GetForModify(), szValue ); } #else Q_strcpy( m_TextureName.GetForModify(), szValue ); #endif } return BaseClass::KeyValue( szKeyName, szValue ); }
bool CEnvProjectedTexture::KeyValue( const char *szKeyName, const char *szValue ) { if ( FStrEq( szKeyName, "lightcolor" ) ) { float tmp[4]; UTIL_StringToFloatArray( tmp, 4, szValue ); m_LightColor.SetR( tmp[0] ); m_LightColor.SetG( tmp[1] ); m_LightColor.SetB( tmp[2] ); m_LightColor.SetA( tmp[3] ); } else if ( FStrEq(szKeyName, "texturename" ) ) { Q_strcpy( m_SpotlightTextureName.GetForModify(), szValue ); } else { return BaseClass::KeyValue( szKeyName, szValue ); } return true; }
void UTIL_StringToVector( float *pVector, const char *pString ) { UTIL_StringToFloatArray( pVector, 3, pString ); }
//----------------------------------------------------------------------------- // Purpose: iterates through a typedescript data block, so it can insert key/value data into the block // Input : *pObject - pointer to the struct or class the data is to be insterted into // *pFields - description of the data // iNumFields - number of fields contained in pFields // char *szKeyName - name of the variable to look for // char *szValue - value to set the variable to // Output : Returns true if the variable is found and set, false if the key is not found. //----------------------------------------------------------------------------- bool ParseKeyvalue( void *pObject, typedescription_t *pFields, int iNumFields, const char *szKeyName, const char *szValue ) { int i; typedescription_t *pField; for ( i = 0; i < iNumFields; i++ ) { pField = &pFields[i]; int fieldOffset = pField->fieldOffset[ TD_OFFSET_NORMAL ]; // Check the nested classes, but only if they aren't in array form. if ((pField->fieldType == FIELD_EMBEDDED) && (pField->fieldSize == 1)) { for ( datamap_t *dmap = pField->td; dmap != NULL; dmap = dmap->baseMap ) { void *pEmbeddedObject = (void*)((char*)pObject + fieldOffset); if ( ParseKeyvalue( pEmbeddedObject, dmap->dataDesc, dmap->dataNumFields, szKeyName, szValue) ) return true; } } if ( (pField->flags & FTYPEDESC_KEY) && !stricmp(pField->externalName, szKeyName) ) { switch( pField->fieldType ) { case FIELD_MODELNAME: case FIELD_SOUNDNAME: case FIELD_STRING: (*(string_t *)((char *)pObject + fieldOffset)) = AllocPooledString( szValue ); return true; case FIELD_TIME: case FIELD_FLOAT: (*(float *)((char *)pObject + fieldOffset)) = atof( szValue ); return true; case FIELD_BOOLEAN: (*(bool *)((char *)pObject + fieldOffset)) = (bool)(atoi( szValue ) != 0); return true; case FIELD_CHARACTER: (*(char *)((char *)pObject + fieldOffset)) = (char)atoi( szValue ); return true; case FIELD_SHORT: (*(short *)((char *)pObject + fieldOffset)) = (short)atoi( szValue ); return true; case FIELD_INTEGER: case FIELD_TICK: (*(int *)((char *)pObject + fieldOffset)) = atoi( szValue ); return true; case FIELD_POSITION_VECTOR: case FIELD_VECTOR: UTIL_StringToVector( (float *)((char *)pObject + fieldOffset), szValue ); return true; case FIELD_VMATRIX: case FIELD_VMATRIX_WORLDSPACE: UTIL_StringToFloatArray( (float *)((char *)pObject + fieldOffset), 16, szValue ); return true; case FIELD_MATRIX3X4_WORLDSPACE: UTIL_StringToFloatArray( (float *)((char *)pObject + fieldOffset), 12, szValue ); return true; case FIELD_COLOR32: UTIL_StringToColor32( (color32 *) ((char *)pObject + fieldOffset), szValue ); return true; case FIELD_CUSTOM: { SaveRestoreFieldInfo_t fieldInfo = { (char *)pObject + fieldOffset, pObject, pField }; pField->pSaveRestoreOps->Parse( fieldInfo, szValue ); return true; } default: case FIELD_INTERVAL: // Fixme, could write this if needed case FIELD_CLASSPTR: case FIELD_MODELINDEX: case FIELD_MATERIALINDEX: case FIELD_EDICT: Warning( "Bad field in entity!!\n" ); Assert(0); break; } } } return false; }