diff options
Diffstat (limited to 'engine/r_efx.cpp')
| -rw-r--r-- | engine/r_efx.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/engine/r_efx.cpp b/engine/r_efx.cpp new file mode 100644 index 0000000..3d13f29 --- /dev/null +++ b/engine/r_efx.cpp @@ -0,0 +1,166 @@ +//========= Copyright 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) +{ + color32 white = {255,255,255,255}; + DecalColorShoot( textureIndex, entity, model, model_origin, model_angles, position, saxis, flags, white ); +} + +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) +{ + 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, NULL ); +} + +//----------------------------------------------------------------------------- +// 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 ) +{ + 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 ); +} + +//----------------------------------------------------------------------------- +// 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 > cl.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 ); |