130 lines
3.1 KiB
C++
130 lines
3.1 KiB
C++
//========= 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
|