You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.7 KiB
166 lines
4.7 KiB
//========= 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 );
|
|
|