Skip to content

Commit

Permalink
Crab Synth projected light effect
Browse files Browse the repository at this point in the history
  • Loading branch information
Blixibon committed Oct 22, 2023
1 parent 648b29d commit 722dfa9
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 2 deletions.
1 change: 1 addition & 0 deletions sp/src/game/client/client_ez2.vpc
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ $Project "Client (Entropy Zero 2)"
$File "ez2\c_npc_base_husk.cpp"
$File "$SRCDIR\game\shared\ez2\npc_husk_base_shared.h"
$File "ez2\c_npc_crabsynth.cpp"
$File "ez2\c_npc_crabsynth.h"
$File "ez2\c_npc_wilson.cpp"
$File "ez2\c_npc_wilson.h"
$File "ez2\c_weapon_pulse_pistol.cpp"
Expand Down
146 changes: 144 additions & 2 deletions sp/src/game/client/ez2/c_npc_crabsynth.cpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,160 @@
//=============================================================================//
//
// Purpose: Clientside implementation of the Crab Synth NPC. Currently only
// used for the grenade's material proxy.
// Purpose: Clientside implementation of the Crab Synth NPC.
//
// Author: Blixibon
//
//=============================================================================//

#include "cbase.h"
#include "c_npc_crabsynth.h"
#include "basegrenade_shared.h"
#include "particle_parse.h"
#include "functionproxy.h"
#include "toolframework_client.h"

IMPLEMENT_CLIENTCLASS_DT( C_NPC_CrabSynth, DT_NPC_CrabSynth, CNPC_CrabSynth )
RecvPropBool( RECVINFO( m_bProjectedLightEnabled ) ),
RecvPropBool( RECVINFO( m_bProjectedLightShadowsEnabled ) ),
RecvPropFloat( RECVINFO( m_flProjectedLightBrightnessScale ) ),
RecvPropFloat( RECVINFO( m_flProjectedLightFOV ) ),
RecvPropFloat( RECVINFO( m_flProjectedLightHorzFOV ) ),
END_RECV_TABLE()

LINK_ENTITY_TO_CLASS( npc_crabsynth, C_NPC_CrabSynth )

C_NPC_CrabSynth::C_NPC_CrabSynth()
{
}

C_NPC_CrabSynth::~C_NPC_CrabSynth()
{
if (m_LightL)
{
// Turned off the flashlight; delete it.
delete m_LightL;
m_LightL = NULL;
}
if (m_LightR)
{
// Turned off the flashlight; delete it.
delete m_LightR;
m_LightR = NULL;
}
}

void C_NPC_CrabSynth::UpdateLight( CCrabSynthLightEffect **ppLight, int nAttachment )
{
CCrabSynthLightEffect *pLight = *ppLight;
if ( pLight == NULL )
{
// Turned on the headlight; create it.
*ppLight = new CCrabSynthLightEffect;
pLight = *ppLight;

if ( pLight == NULL )
return;

pLight->m_bShadowsEnabled = m_bProjectedLightShadowsEnabled;
pLight->m_flBrightnessScale = m_flProjectedLightBrightnessScale;
pLight->m_flFOV = m_flProjectedLightFOV;
pLight->m_flHorzFOV = m_flProjectedLightHorzFOV;

pLight->TurnOn();
}
else
{
if (pLight->m_flBrightnessScale != m_flProjectedLightBrightnessScale)
pLight->m_flBrightnessScale = FLerp( pLight->m_flBrightnessScale, m_flProjectedLightBrightnessScale, 0.1f );

if (pLight->m_bShadowsEnabled != m_bProjectedLightShadowsEnabled)
pLight->m_bShadowsEnabled = m_bProjectedLightShadowsEnabled;

if (pLight->m_flFOV != m_flProjectedLightFOV)
pLight->m_flFOV = m_flProjectedLightFOV;

if (pLight->m_flHorzFOV != m_flProjectedLightHorzFOV)
pLight->m_flHorzFOV = m_flProjectedLightHorzFOV;
}

if ( nAttachment != -1 )
{
matrix3x4_t matAttachment;
GetAttachment( nAttachment, matAttachment );

Vector vVector;
Vector vecForward, vecRight, vecUp;

MatrixGetColumn( matAttachment, 0, vecForward );
MatrixGetColumn( matAttachment, 1, vecRight );
MatrixGetColumn( matAttachment, 2, vecUp );
MatrixGetColumn( matAttachment, 3, vVector );

// Update the flashlight
pLight->UpdateLight( vVector, vecForward, vecRight, vecUp, 40 );
}
}

void C_NPC_CrabSynth::Simulate( void )
{
// The dim light is the flashlight.
if ( m_bProjectedLightEnabled )
{
if (m_LightL == NULL || m_LightL->m_flBrightnessScale > 0.0f)
{
if (m_nAttachmentLightL == -1)
m_nAttachmentLightL = LookupAttachment( "eye_l" );

UpdateLight( &m_LightL, m_nAttachmentLightL );
}
else if (m_LightL)
{
// Turned off the flashlight; delete it.
delete m_LightL;
m_LightL = NULL;
}

if (m_LightR == NULL || m_LightR->m_flBrightnessScale > 0.0f)
{
if (m_nAttachmentLightR == -1)
m_nAttachmentLightR = LookupAttachment( "eye_r" );

UpdateLight( &m_LightR, m_nAttachmentLightR );
}
else if (m_LightR)
{
// Turned off the flashlight; delete it.
delete m_LightR;
m_LightR = NULL;
}
}
else
{
if (m_LightL)
{
// Turned off the flashlight; delete it.
delete m_LightL;
m_LightL = NULL;
}
if (m_LightR)
{
// Turned off the flashlight; delete it.
delete m_LightR;
m_LightR = NULL;
}
}

BaseClass::Simulate();
}

void C_NPC_CrabSynth::OnDataChanged( DataUpdateType_t type )
{
BaseClass::OnDataChanged( type );
}

//-----------------------------------------------------------------------------
// Crab Grenade
//-----------------------------------------------------------------------------
class C_CrabGrenade : public C_BaseGrenade
{
public:
Expand Down
39 changes: 39 additions & 0 deletions sp/src/game/client/ez2/c_npc_crabsynth.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#ifndef C_NPC_CrabSynth_H
#define C_NPC_CrabSynth_H
#ifdef _WIN32
#pragma once
#endif

#include "c_ai_basenpc.h"
#include "flashlighteffect.h"

//-----------------------------------------------------------------------------
// Crab Synth
//-----------------------------------------------------------------------------
class C_NPC_CrabSynth : public C_AI_BaseNPC
{
public:
DECLARE_CLASS( C_NPC_CrabSynth, C_AI_BaseNPC );
DECLARE_CLIENTCLASS();

C_NPC_CrabSynth();
~C_NPC_CrabSynth();

void OnDataChanged( DataUpdateType_t type );
void UpdateLight( CCrabSynthLightEffect **ppLight, int nAttachment );
void Simulate( void );

int m_nAttachmentLightL = -1;
int m_nAttachmentLightR = -1;

bool m_bProjectedLightEnabled;
bool m_bProjectedLightShadowsEnabled;
float m_flProjectedLightBrightnessScale;
float m_flProjectedLightFOV;
float m_flProjectedLightHorzFOV;

CCrabSynthLightEffect *m_LightL;
CCrabSynthLightEffect *m_LightR;
};

#endif // C_NPC_CrabSynth_H
77 changes: 77 additions & 0 deletions sp/src/game/client/flashlighteffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -739,4 +739,81 @@ void CTurretLightEffect::UpdateLight( const Vector &vecPos, const Vector &vecDir

g_pClientShadowMgr->UpdateProjectedTexture( GetFlashlightHandle(), true );
}

//-----------------------------------------------------------------------------
// Crab Synth light effect
//-----------------------------------------------------------------------------
static ConVar r_crabsynthlightbrightness( "r_crabsynthlightbrightness", "255.0", FCVAR_CHEAT );
static ConVar r_crabsynthlightfar( "r_crabsynthlightfar", "400", FCVAR_CHEAT );
static ConVar r_crabsynthlightnear( "r_crabsynthlightnear", "2.0", FCVAR_CHEAT );
static ConVar r_crabsynthlightconstant( "r_crabsynthlightconstant", "0.0", FCVAR_CHEAT );
static ConVar r_crabsynthlightlinear( "r_crabsynthlightlinear", "0.0", FCVAR_CHEAT );
static ConVar r_crabsynthlightquadratic( "r_crabsynthlightquadratic", "100.0", FCVAR_CHEAT );
static ConVar r_crabsynthlightshadowatten( "r_crabsynthlightshadowatten", "1.0", FCVAR_CHEAT );
static ConVar r_crabsynthlighttexture( "r_crabsynthlighttexture", "effects/crabsynthlight", FCVAR_CHEAT );

CCrabSynthLightEffect::CCrabSynthLightEffect()
{
m_FlashlightTexture.Init( r_crabsynthlighttexture.GetString(), TEXTURE_GROUP_OTHER, true );
m_flBrightnessScale = 1.0f;

m_Color[0] = 1.0f;
m_Color[1] = 1.0f;
m_Color[2] = 1.0f;
}

CCrabSynthLightEffect::~CCrabSynthLightEffect()
{
}

void CCrabSynthLightEffect::UpdateLight( const Vector &vecPos, const Vector &vecDir, const Vector &vecRight, const Vector &vecUp, int nDistance )
{
if ( IsOn() == false )
return;

FlashlightState_t state;
Vector basisX, basisY, basisZ;
basisX = vecDir;
basisY = vecRight;
basisZ = vecUp;
VectorNormalize(basisX);
VectorNormalize(basisY);
VectorNormalize(basisZ);

BasisToQuaternion( basisX, basisY, basisZ, state.m_quatOrientation );

state.m_vecLightOrigin = vecPos;

state.m_fHorizontalFOVDegrees = m_flHorzFOV;
state.m_fVerticalFOVDegrees = m_flFOV;
state.m_fQuadraticAtten = r_crabsynthlightquadratic.GetFloat();
state.m_fLinearAtten = r_crabsynthlightlinear.GetFloat();
state.m_fConstantAtten = r_crabsynthlightconstant.GetFloat();
state.m_Color[0] = m_Color[0] * (m_flBrightnessScale != 1.0f ? r_crabsynthlightbrightness.GetFloat() * m_flBrightnessScale : r_crabsynthlightbrightness.GetFloat());
state.m_Color[1] = m_Color[1] * (m_flBrightnessScale != 1.0f ? r_crabsynthlightbrightness.GetFloat() * m_flBrightnessScale : r_crabsynthlightbrightness.GetFloat());
state.m_Color[2] = m_Color[2] * (m_flBrightnessScale != 1.0f ? r_crabsynthlightbrightness.GetFloat() * m_flBrightnessScale : r_crabsynthlightbrightness.GetFloat());
state.m_Color[3] = r_flashlightambient.GetFloat();

state.m_NearZ = r_crabsynthlightnear.GetFloat();
state.m_FarZ = r_crabsynthlightfar.GetFloat();

state.m_bEnableShadows = m_bShadowsEnabled;
state.m_pSpotlightTexture = m_FlashlightTexture;
state.m_nSpotlightTextureFrame = 0;

state.m_flShadowAtten = r_crabsynthlightshadowatten.GetFloat();
state.m_flShadowSlopeScaleDepthBias = mat_slopescaledepthbias_shadowmap.GetFloat();
state.m_flShadowDepthBias = mat_depthbias_shadowmap.GetFloat();

if( GetFlashlightHandle() == CLIENTSHADOW_INVALID_HANDLE )
{
SetFlashlightHandle( g_pClientShadowMgr->CreateFlashlight( state ) );
}
else
{
g_pClientShadowMgr->UpdateFlashlightState( GetFlashlightHandle(), state );
}

g_pClientShadowMgr->UpdateProjectedTexture( GetFlashlightHandle(), true );
}
#endif
16 changes: 16 additions & 0 deletions sp/src/game/client/flashlighteffect.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,22 @@ class CTurretLightEffect : public CFlashlightEffect
float m_flFarZ;
float m_flFOV;
};

class CCrabSynthLightEffect : public CFlashlightEffect
{
public:

CCrabSynthLightEffect();
~CCrabSynthLightEffect();

virtual void UpdateLight( const Vector &vecPos, const Vector &vecDir, const Vector &vecRight, const Vector &vecUp, int nDistance );

bool m_bShadowsEnabled;
float m_flBrightnessScale;
float m_flFOV;
float m_flHorzFOV;
float m_Color[3];
};
#endif

#endif // FLASHLIGHTEFFECT_H
29 changes: 29 additions & 0 deletions sp/src/game/server/ez2/npc_crabsynth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,11 @@ enum SquadSlot_T
CNPC_CrabSynth::CNPC_CrabSynth( void )
{
m_iNumGrenades = 5;
m_bProjectedLightEnabled = false;
m_bProjectedLightShadowsEnabled = false;
m_flProjectedLightBrightnessScale = 1.0f;
m_flProjectedLightFOV = 90.0f;
m_flProjectedLightHorzFOV = 120.0f;
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -192,6 +197,12 @@ BEGIN_DATADESC( CNPC_CrabSynth )
DEFINE_FIELD( m_bIsBleeding, FIELD_BOOLEAN ),
DEFINE_FIELD( m_bLastDamageBelow, FIELD_BOOLEAN ),

DEFINE_KEYFIELD( m_bProjectedLightEnabled, FIELD_BOOLEAN, "ProjectedLightEnabled" ),
DEFINE_KEYFIELD( m_bProjectedLightShadowsEnabled, FIELD_BOOLEAN, "ProjectedLightShadowsEnabled" ),
DEFINE_KEYFIELD( m_flProjectedLightBrightnessScale, FIELD_FLOAT, "ProjectedLightBrightnessScale" ),
DEFINE_KEYFIELD( m_flProjectedLightFOV, FIELD_FLOAT, "ProjectedLightFOV" ),
DEFINE_KEYFIELD( m_flProjectedLightHorzFOV, FIELD_FLOAT, "ProjectedLightHorzFOV" ),

DEFINE_KEYFIELD( m_bDisableBoneFollowers, FIELD_BOOLEAN, "disablephysics" ),
DEFINE_EMBEDDED( m_BoneFollowerManager ),

Expand All @@ -202,10 +213,28 @@ BEGIN_DATADESC( CNPC_CrabSynth )
DEFINE_INPUTFUNC( FIELD_STRING, "SetChargeTarget", InputSetChargeTarget ),
DEFINE_INPUTFUNC( FIELD_VOID, "ClearChargeTarget", InputClearChargeTarget ),

DEFINE_INPUTFUNC( FIELD_VOID, "TurnOnProjectedLights", InputTurnOnProjectedLights ),
DEFINE_INPUTFUNC( FIELD_VOID, "TurnOffProjectedLights", InputTurnOffProjectedLights ),
DEFINE_INPUTFUNC( FIELD_BOOLEAN, "SetProjectedLightEnableShadows", InputSetProjectedLightEnableShadows ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetProjectedLightBrightnessScale", InputSetProjectedLightBrightnessScale ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetProjectedLightFOV", InputSetProjectedLightFOV ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetProjectedLightHorzFOV", InputSetProjectedLightHorzFOV ),

DEFINE_AIGRENADE_DATADESC()

END_DATADESC()

//---------------------------------------------------------
// Custom Client entity
//---------------------------------------------------------
IMPLEMENT_SERVERCLASS_ST( CNPC_CrabSynth, DT_NPC_CrabSynth )
SendPropBool( SENDINFO( m_bProjectedLightEnabled ) ),
SendPropBool( SENDINFO( m_bProjectedLightShadowsEnabled ) ),
SendPropFloat( SENDINFO( m_flProjectedLightBrightnessScale ) ),
SendPropFloat( SENDINFO( m_flProjectedLightFOV ) ),
SendPropFloat( SENDINFO( m_flProjectedLightHorzFOV ) ),
END_SEND_TABLE()

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
Expand Down
Loading

0 comments on commit 722dfa9

Please sign in to comment.