source-engine/engine/r_efx.cpp

167 lines
4.7 KiB
C++
Raw Normal View History

2020-04-23 00:56:21 +08:00
//========= 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 );