1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
//========= 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
|