//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: Implements the Effects API // Created: YWB 9/5/2000 // //===========================================================================// #include "quakedef.h" #include "r_efx.h" #include "r_efxextern.h" #include "r_local.h" #include "cl_main.h" #include "decal.h" #include "client.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" // Effects API object. static CVEfx efx; // Engine internal accessor to effects api ( see cl_parsetent.cpp, etc. ) CVEfx *g_pEfx = &efx; extern CClientState cl; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CVEfx::Draw_DecalIndexFromName( char *name ) { bool found = false; return ::Draw_DecalIndexFromName( name, &found ); } //----------------------------------------------------------------------------- // Retrieve decal texture name from decal by index //----------------------------------------------------------------------------- const char *CVEfx::Draw_DecalNameFromIndex( int nIndex ) { return ::Draw_DecalNameFromIndex( nIndex ); } //----------------------------------------------------------------------------- // Purpose: // Input : textureIndex - // entity - // modelIndex - // position - // flags - //----------------------------------------------------------------------------- void CVEfx::DecalShoot( int textureIndex, int entity, const model_t *model, const Vector& model_origin, const QAngle& model_angles, const Vector& position, const Vector *saxis, int flags, const Vector *pNormal, int nAdditionalDecalFlags ) { color32 white = {255,255,255,255}; DecalColorShoot( textureIndex, entity, model, model_origin, model_angles, position, saxis, flags, white, pNormal, nAdditionalDecalFlags ); } void CVEfx::DecalColorShoot( int textureIndex, int entity, const model_t *model, const Vector& model_origin, const QAngle& model_angles, const Vector& position, const Vector *saxis, int flags, const color32 &rgbaColor, const Vector *pNormal, int nAdditionalDecalFlags ) { Vector localPosition = position; if ( entity ) // Not world? { matrix3x4_t matrix; AngleMatrix( model_angles, model_origin, matrix ); VectorITransform( position, matrix, localPosition ); } ::R_DecalShoot( textureIndex, entity, model, localPosition, saxis, flags, rgbaColor, pNormal, nAdditionalDecalFlags ); } //----------------------------------------------------------------------------- // Purpose: // Input : *material - // userdata - // entity - // *model - // position - // *saxis - // flags - // &rgbaColor - //----------------------------------------------------------------------------- void CVEfx::PlayerDecalShoot( IMaterial *material, void *userdata, int entity, const model_t *model, const Vector& model_origin, const QAngle& model_angles, const Vector& position, const Vector *saxis, int flags, const color32 &rgbaColor, int nAdditionalDecalFlags ) { Vector localPosition = position; if ( entity ) // Not world? { matrix3x4_t matrix; AngleMatrix( model_angles, model_origin, matrix ); VectorITransform( position, matrix, localPosition ); } R_PlayerDecalShoot( material, userdata, entity, model, position, saxis, flags, rgbaColor, nAdditionalDecalFlags ); } //----------------------------------------------------------------------------- // Purpose: // Input : key - // Output : dlight_t //----------------------------------------------------------------------------- dlight_t *CVEfx::CL_AllocDlight( int key ) { return ::CL_AllocDlight( key ); } int CVEfx::CL_GetActiveDLights( dlight_t *pList[MAX_DLIGHTS] ) { int nOut = 0; if ( g_bActiveDlights ) { for ( int i=0; i < MAX_DLIGHTS; i++ ) { if ( r_dlightactive & (1 << i) ) { pList[nOut++] = &cl_dlights[i]; } } } return nOut; } //----------------------------------------------------------------------------- // Purpose: // Input : key - // Output : dlight_t //----------------------------------------------------------------------------- dlight_t *CVEfx::CL_AllocElight( int key ) { return ::CL_AllocElight( key ); } // Given an elight key, find it. Does not search ordinary dlights. May return NULL. dlight_t *CVEfx::GetElightByKey( int key ) { if ( g_bActiveElights ) { for ( unsigned int i = 0 ; i < MAX_ELIGHTS ; ++i ) { // if the keys match... if (cl_elights[i].key == key) { // then if the light is active, return it. If it's died, // return NULL. if ( cl_elights[i].die > GetBaseLocalClient().GetTime() ) { return cl_elights + i; } else { return NULL; } } } } // if we are down here, we found nothing, or no lights were active return NULL; } // Expose it to the client .dll EXPOSE_SINGLE_INTERFACE( CVEfx, IVEfx, VENGINE_EFFECTS_INTERFACE_VERSION );