diff --git a/client/c_env_cascade_light.cpp b/client/c_env_cascade_light.cpp index 84392ca..11b3528 100644 --- a/client/c_env_cascade_light.cpp +++ b/client/c_env_cascade_light.cpp @@ -21,6 +21,7 @@ static ConVarRef mat_slopescaledepthbias_shadowmap("mat_slopescaledepthbias_shadowmap"); static ConVarRef mat_depthbias_shadowmap("mat_depthbias_shadowmap"); static ConVar scissor("r_flashlightscissor", "0"); +ConVar csm_enable("csm_enable", "1"); #ifdef MAPBASE //static ConVar csm_ortho("csm_ortho","0", 0, "Turn light into ortho. Im lazy right now to make this works fine"); @@ -141,6 +142,7 @@ END_RECV_TABLE() C_EnvCascadeLight::C_EnvCascadeLight( void ) { + m_LightHandle = CLIENTSHADOW_INVALID_HANDLE; } @@ -152,10 +154,9 @@ C_EnvCascadeLight::~C_EnvCascadeLight( void ) void C_EnvCascadeLight::ShutDownLightHandle( void ) { - // Clear out the light - if( m_LightHandle != CLIENTSHADOW_INVALID_HANDLE ) + if (m_LightHandle != CLIENTSHADOW_INVALID_HANDLE) { - g_pClientShadowMgr->DestroyFlashlight( m_LightHandle ); + g_pClientShadowMgr->DestroyFlashlight(m_LightHandle); m_LightHandle = CLIENTSHADOW_INVALID_HANDLE; } } @@ -178,11 +179,8 @@ void C_EnvCascadeLight::UpdateLight( bool bForceUpdate ) if (m_bState == false) { - if (m_LightHandle != CLIENTSHADOW_INVALID_HANDLE) - { - ShutDownLightHandle(); - } - + if(m_LightHandle!=CLIENTSHADOW_INVALID_HANDLE) + ShutDownLightHandle(); return; } @@ -344,7 +342,8 @@ void C_EnvCascadeLight::UpdateLight( bool bForceUpdate ) void C_EnvCascadeLight::Simulate( void ) { - UpdateLight( true ); + m_bState = csm_enable.GetBool(); + UpdateLight(true); BaseClass::Simulate(); } @@ -435,7 +434,6 @@ C_EnvCascadeLightSecond::~C_EnvCascadeLightSecond(void) void C_EnvCascadeLightSecond::ShutDownLightHandle(void) { - // Clear out the light if (m_LightHandle != CLIENTSHADOW_INVALID_HANDLE) { g_pClientShadowMgr->DestroyFlashlight(m_LightHandle); @@ -454,11 +452,11 @@ void C_EnvCascadeLightSecond::UpdateLight(bool bForceUpdate) if (m_bState == false) { - if (m_LightHandle != CLIENTSHADOW_INVALID_HANDLE) - { - ShutDownLightHandle(); - } - + + if(m_LightHandle!=CLIENTSHADOW_INVALID_HANDLE) + ShutDownLightHandle(); + + return; } @@ -601,6 +599,7 @@ void C_EnvCascadeLightSecond::UpdateLight(bool bForceUpdate) } */ #endif + if (m_LightHandle == CLIENTSHADOW_INVALID_HANDLE) { @@ -643,14 +642,12 @@ void C_EnvCascadeLightSecond::UpdateLight(bool bForceUpdate) //mat_slopescaledepthbias_shadowmap.SetValue("4"); //mat_depthbias_shadowmap.SetValue("0.00001"); scissor.SetValue("0"); - - - } void C_EnvCascadeLightSecond::Simulate(void) { + m_bState = csm_enable.GetBool(); UpdateLight(true); BaseClass::Simulate(); } diff --git a/server/env_cascade_light.cpp b/server/env_cascade_light.cpp index 135d394..61803e7 100644 --- a/server/env_cascade_light.cpp +++ b/server/env_cascade_light.cpp @@ -7,10 +7,13 @@ #include "cbase.h" #include "shareddefs.h" #include "lights.h" +#include "tier1/utlstring.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" + + #define ENV_CASCADE_STARTON (1<<0) static ConVar defdist("csm_default_distance", "1000", FCVAR_DEVELOPMENTONLY, "Default Z distance. Used for some fov calculations. Please dont change"); @@ -18,6 +21,7 @@ static ConVar curdist("csm_current_distance","14000", 0, "Current Z distance. Yo static ConVar defFOV("csm_default_fov","15", FCVAR_DEVELOPMENTONLY, "Default FOV. Used for some fov calculations. Please dont change"); static ConVar curFOV("csm_current_fov","15", 0, "Current FOV. You can change it"); static ConVar csm_second_fov("csm_second_fov", "26", FCVAR_NONE ,"FOV of the second csm."); +ConVar csm_enable("csm_enable", "1"); class CLightOrigin : public CPointEntity { @@ -65,7 +69,7 @@ void CLightOrigin::Spawn() CEnvLight* pEnv = dynamic_cast(pEntity); QAngle bb = pEnv->GetAbsAngles(); - bb.x = bb.x; + //bb.x = bb.x; SetAbsAngles(bb); ConColorMsg(Color(0,230,0), "light_environment Founded!\n"); @@ -171,7 +175,7 @@ CEnvCascadeLightSecond::CEnvCascadeLightSecond(void) #else m_LightColor.Init(255, 255, 255, 1); #endif - m_bState = true; + m_bState = csm_enable.GetBool(); m_flLightFOV = 45.0f; m_bEnableShadows = true; m_bLightOnlyTarget = false; @@ -232,6 +236,7 @@ void CEnvCascadeLightSecond::Activate(void) void CEnvCascadeLightSecond::InitialThink(void) { + m_bState = csm_enable.GetBool(); float bibigon = defdist.GetFloat() / curdist.GetFloat(); m_flLightFOV = csm_second_fov.GetFloat() * bibigon; m_hTargetEntity = gEntList.FindEntityByName(NULL, m_target); @@ -263,21 +268,26 @@ public: void Spawn(); void Preparation(); + //Inputs void InputTurnOn(inputdata_t& inputdata); void InputTurnOff(inputdata_t& inputdata); void InputSetEnableShadows(inputdata_t& inputdata); void InputSetLightColor( inputdata_t &inputdata ); void InputSetSpotlightTexture(inputdata_t& inputdata); void InputSetAmbient(inputdata_t& inputdata); - void InputSetAngles(inputdata_t& inputdata); + void InputAddAngles(inputdata_t& inputdata); + void InputResetAngles(inputdata_t& inputdata); + void InitialThink(void); + + CNetworkHandle(CBaseEntity, m_hTargetEntity); private: CNetworkColor32(m_LightColor); - CLightOrigin* pEnv; + CLightOrigin* csm_origin; CEnvCascadeLightSecond* SecondCSM; CNetworkVar(bool, m_bState); CNetworkVar(float, m_flLightFOV); @@ -294,6 +304,8 @@ private: CNetworkVar(float, m_flFarZ); CNetworkVar(int, m_nShadowQuality); + QAngle DefaultAngle = QAngle(0, 0, 0); + QAngle CurrentAngle = QAngle(0, 0, 0); }; LINK_ENTITY_TO_CLASS(env_cascade_light, CEnvCascadeLight); @@ -314,16 +326,18 @@ DEFINE_KEYFIELD(m_nShadowQuality, FIELD_INTEGER, "shadowquality"), DEFINE_FIELD(m_LinearFloatLightColor, FIELD_VECTOR), DEFINE_KEYFIELD(EnableAngleFromEnv, FIELD_BOOLEAN, "uselightenvangles"), + +//Inputs DEFINE_INPUTFUNC(FIELD_VOID, "Enable", InputTurnOn), DEFINE_INPUTFUNC(FIELD_VOID, "Disable", InputTurnOff), DEFINE_INPUTFUNC(FIELD_BOOLEAN, "EnableShadows", InputSetEnableShadows), -// this is broken . . need to be able to set color and intensity like light_dynamic -// DEFINE_INPUTFUNC( FIELD_COLOR32, "LightColor", InputSetLightColor ), - DEFINE_INPUTFUNC(FIELD_COLOR32, "LightColor", InputSetLightColor), DEFINE_INPUTFUNC(FIELD_FLOAT, "Ambient", InputSetAmbient), DEFINE_INPUTFUNC(FIELD_STRING, "Texture", InputSetSpotlightTexture), DEFINE_INPUTFUNC(FIELD_STRING, "SetAngles", InputSetAngles), +DEFINE_INPUTFUNC(FIELD_STRING, "AddAngles", InputAddAngles), +DEFINE_INPUTFUNC(FIELD_VOID, "ResetAngles", InputResetAngles), + DEFINE_THINKFUNC(InitialThink), END_DATADESC() @@ -357,7 +371,7 @@ CEnvCascadeLight::CEnvCascadeLight(void) #else m_LightColor.Init(255, 255, 255, 1); #endif - m_bState = true; + m_bState = csm_enable.GetBool(); m_flLightFOV = 45.0f; m_bEnableShadows = true; m_bLightOnlyTarget = false; @@ -372,8 +386,11 @@ CEnvCascadeLight::CEnvCascadeLight(void) m_flNearZ = 8000.0f; m_flFarZ = 16000.0f; m_nShadowQuality = 0; + + } ConVar csm_second_intensity("csm_second_intensity", "2"); + void CEnvCascadeLight::Preparation() { CreateEntityByName("csmorigin"); @@ -383,17 +400,18 @@ void CEnvCascadeLight::Preparation() CBaseEntity* CSMSecond = NULL; CSMOrigin = gEntList.FindEntityByClassname(CSMOrigin, "csmorigin"); + CSMSecond = gEntList.FindEntityByClassname(CSMSecond, "second_csm"); //if origin is exist if (CSMOrigin) { - pEnv = dynamic_cast(CSMOrigin); - - - CSMSecond = gEntList.FindEntityByClassname(CSMSecond, "second_csm"); + csm_origin = dynamic_cast(CSMOrigin); //if second csm is exist if (CSMSecond) { + //if (GetBaseEntity()->GetEntityNameAsCStr() != NULL) + //CSMSecond->SetNameAsCStr(GetBaseEntity()->GetEntityNameAsCStr() + '_' + 's' + 'e' + 'c' + 'o' + 'n' + 'd'); + SecondCSM = dynamic_cast(CSMSecond); SecondCSM->SetAbsAngles(GetAbsAngles()); SecondCSM->SetAbsOrigin(GetAbsOrigin()); @@ -404,25 +422,33 @@ void CEnvCascadeLight::Preparation() DispatchSpawn(SecondCSM); } - SetParent(pEnv, 1); - SetAbsOrigin(Vector(pEnv->GetAbsOrigin().x, pEnv->GetAbsOrigin().y, pEnv->GetAbsOrigin().z + curdist.GetInt())); + SetParent(csm_origin, 1); + SetAbsOrigin(Vector(csm_origin->GetAbsOrigin().x, csm_origin->GetAbsOrigin().y, csm_origin->GetAbsOrigin().z + curdist.GetInt())); if (EnableAngleFromEnv) { - pEnv->angFEnv = true; + csm_origin->angFEnv = true; SetLocalAngles(QAngle(90, 0, 0)); - } else { - pEnv->SetAbsAngles(QAngle((GetLocalAngles().x - 90), GetLocalAngles().y, -GetLocalAngles().z)); - - Msg("pEnv local angle = %f %f %f \n", pEnv->GetLocalAngles().x, pEnv->GetLocalAngles().y, pEnv->GetLocalAngles().z); - + csm_origin->SetAbsAngles(QAngle((GetLocalAngles().x - 90), GetLocalAngles().y, -GetLocalAngles().z)); + //Msg("pEnv local angle = %f %f %f \n", pEnv->GetLocalAngles().x, pEnv->GetLocalAngles().y, pEnv->GetLocalAngles().z); SetLocalAngles(QAngle(90, 0, 0)); DevMsg("CSM using light_environment \n"); } - //DispatchSpawn(CSMSecond); + + //const char* bebra = GetBaseEntity()->GetEntityNameAsCStr(); + //bebra += '_' + 'o' + 'r' + 'i' + 'g' + 'i' + 'n'; + + //CSMOrigin->SetNameAsCStr(bebra); + + //ConColorMsg(Color(255,0,0), "CSMOrigin name is " + bebra); + + DefaultAngle = csm_origin->GetAbsAngles(); + CurrentAngle = csm_origin->GetAbsAngles(); + + DispatchSpawn(CSMOrigin); } else @@ -502,7 +528,6 @@ void CEnvCascadeLight::Activate(void) { m_bState = true; } - SetThink(&CEnvCascadeLight::InitialThink); SetNextThink(gpGlobals->curtime + 0.1f); @@ -511,12 +536,14 @@ void CEnvCascadeLight::Activate(void) void CEnvCascadeLight::InitialThink(void) { + m_bState = csm_enable.GetBool(); m_hTargetEntity = gEntList.FindEntityByName(NULL, m_target); float bibigon = defdist.GetFloat() / curdist.GetFloat(); curFOV.SetValue(defFOV.GetFloat() * bibigon); m_flLightFOV = curFOV.GetFloat(); } + void CEnvCascadeLight::InputSetAngles(inputdata_t& inputdata) { const char* pAngles = inputdata.value.String(); @@ -524,8 +551,25 @@ void CEnvCascadeLight::InputSetAngles(inputdata_t& inputdata) QAngle angles; UTIL_StringToVector(angles.Base(), pAngles); - pEnv->SetAbsAngles(angles); - + CurrentAngle = angles; + csm_origin->SetAbsAngles(CurrentAngle); +} + +void CEnvCascadeLight::InputAddAngles(inputdata_t& inputdata) +{ + const char* pAngles = inputdata.value.String(); + + QAngle angles; + UTIL_StringToVector(angles.Base(), pAngles); + + CurrentAngle = CurrentAngle + angles; + csm_origin->SetAbsAngles(CurrentAngle); +} + +void CEnvCascadeLight::InputResetAngles(inputdata_t& inputdata) +{ + CurrentAngle = DefaultAngle; + csm_origin->SetAbsAngles(CurrentAngle); } void CEnvCascadeLight::InputSetLightColor(inputdata_t& inputdata)