/*** * * Copyright (C) 2002 The Wastes Project, All Rights Reserved. * * This product contains software technology licensed from Id * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. * All Rights Reserved. * * Use, distribution, and modification of this source code and/or resulting * object code is restricted to non-commercial enhancements to products from * The Wastes Project. All other use, distribution, or modification is prohibited * without written permission from The Wastes Project. * ***/ // // env_fog.cpp -> env_fog's are client side entities useful in manipulating // the fog code in HL for more useful purposes // #include "hud.h" #include "cl_util.h" #include "ParseBspEnt.h" #include "ParseBsp.h" #include "tri.h" #include using namespace std; #define VectorLength(a) sqrt((double) ((double)((a)[0] * (a)[0]) + (double)( (a)[1] * (a)[1]) + (double)( (a)[2] * (a)[2])) ) enum bsp_fogstate_e { FOGSTATE_OFF = 0, FOGSTATE_ON, FOGSTATE_MAPDEFAULT, }; vector g_EnvFogList; CBspEnvFog *g_pActiveEnvFog = NULL; extern cvar_t *cl_enablefog; /* ============================== EnvFog_RenderFog Return 0 to use worldspawn fog ============================== */ int EnvFog_RenderFog(CBspEnvFog *pActive) { if(pActive == NULL) return 0; if(pActive->iFogState == FOGSTATE_MAPDEFAULT) return 0; R_SetFog(pActive->flFogcolor_r, pActive->flFogcolor_g, pActive->flFogcolor_b, pActive->flFog_start, pActive->flFog_end, (cl_enablefog->value && pActive->iFogState == FOGSTATE_ON) ? 1 : 0); return 1; } /* ============================== EnvFog_SetFog ============================== */ int EnvFog_SetFog() { // Find the nearest valid env_fog for( int i = 0;i < g_EnvFogList.size();i++ ) { CBspEnvFog *pCurNode = &g_EnvFogList[i]; vec3_t location = pCurNode->flOrigin; int radius = pCurNode->iRadius; double dist = VectorLength(location - gEngfuncs.GetLocalPlayer()->origin); // The player is inside this env_fog, // So compare against the current active // env_fog to fight for priority if(radius && dist <= radius) { if(g_pActiveEnvFog == NULL) { g_pActiveEnvFog = pCurNode; return EnvFog_RenderFog(g_pActiveEnvFog); } else { vec3_t activeloc = g_pActiveEnvFog->flOrigin; double activedist = VectorLength(activeloc - gEngfuncs.GetLocalPlayer()->origin); // See if this env_fog is better than the current // active fog entity. if(activedist <= radius) { if(dist < activedist) { g_pActiveEnvFog = pCurNode; return EnvFog_RenderFog(g_pActiveEnvFog); } } else { g_pActiveEnvFog = pCurNode; return EnvFog_RenderFog(g_pActiveEnvFog); } } } } return EnvFog_RenderFog(g_pActiveEnvFog); }