source-engine/game/client/glow_overlay.h

130 lines
3.1 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef GLOW_OVERLAY_H
#define GLOW_OVERLAY_H
#ifdef _WIN32
#pragma once
#endif
#include "mathlib/vector.h"
#include "materialsystem/imaterial.h"
#include "sun_shared.h"
#include "c_pixel_visibility.h"
#ifdef PORTAL
#include "c_prop_portal.h" //MAX_PORTAL_RECURSIVE_VIEWS
#endif
extern float g_flOverlayRange;
class CGlowSprite
{
public:
Vector m_vColor; // 0-1
float m_flHorzSize; // Horizontal and vertical sizes.
float m_flVertSize; // 1 = size of the sun
IMaterial *m_pMaterial; // Material to use
};
class CGlowOverlay
{
public:
CGlowOverlay();
virtual ~CGlowOverlay();
// Return false to remove (and delete) the overlay.
virtual bool Update();
// Data the creator should fill in.
public:
// Position of the light source. If m_bDirectional is set, then it ignores
// this and uses m_vDirection as the direction of the light source.
Vector m_vPos;
// Optional direction. Used for really far away things like the sun.
// The direction should point AT the light source.
bool m_bDirectional;
Vector m_vDirection;
// If this is set, then the overlay is only visible if the ray to it hits the sky.
bool m_bInSky;
float m_skyObstructionScale;
#ifdef PORTAL
float m_skyObstructionScaleBackups[MAX_PORTAL_RECURSIVE_VIEWS]; //used in portal mod during stencil rendering to maintain obstructions while rendering recursive views
#endif
CGlowSprite m_Sprites[MAX_SUN_LAYERS];
int m_nSprites;
float m_flProxyRadius;
float m_flHDRColorScale;
public:
// After creating the overlay, call this to add it to the active list.
// You can also call Activate and Deactivate as many times as you want.
void Activate();
void Deactivate();
// Render all the active overlays.
static void DrawOverlays( bool bCacheFullSceneState );
static void UpdateSkyOverlays( float zFar, bool bCacheFullSceneState );
#ifdef PORTAL
static void BackupSkyOverlayData( int iBackupToSlot );
static void RestoreSkyOverlayData( int iRestoreFromSlot );
#endif
protected:
void UpdateGlowObstruction( const Vector &vToGlow, bool bCacheFullSceneState );
void UpdateSkyGlowObstruction( float zFar, bool bCacheFullSceneState );
virtual void CalcSpriteColorAndSize(
float flDot,
CGlowSprite *pSprite,
float *flHorzSize,
float *flVertSize,
Vector *vColor );
virtual void CalcBasis(
const Vector &vToGlow,
float flHorzSize,
float flVertSize,
Vector &vBasePt,
Vector &vUp,
Vector &vRight );
virtual void Draw( bool bCacheFullSceneState );
float CalcGlowAspect();
float m_flGlowObstructionScale;
bool m_bCacheGlowObstruction; // Flags to cache obstruction scales
bool m_bCacheSkyObstruction; // Used in IFM poster rendering
private:
short m_bActivated;
unsigned short m_ListIndex; // index into s_GlowOverlays.
pixelvis_handle_t m_queryHandle;
};
//Override for warping
class CWarpOverlay : public CGlowOverlay
{
protected:
virtual void Draw( bool bCacheFullSceneState );
};
#endif // GLOW_OVERLAY_H