You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef R_AREAPORTAL_H |
|
#define R_AREAPORTAL_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "utlvector.h" |
|
#include "gl_model_private.h" |
|
|
|
|
|
class Frustum_t; |
|
|
|
|
|
// Used to clip area portals. The coordinates here are in normalized |
|
// view space (-1,-1) - (1,1) |
|
// BUGBUG: NOTE!!!: These are left->right, and bottom->top, so a full rect is left=-1,top=1,right=1,bottom=-1 |
|
class CPortalRect |
|
{ |
|
public: |
|
float left, top, right, bottom; |
|
}; |
|
|
|
|
|
// ---------------------------------------------------------------------------- // |
|
// Functions. |
|
// ---------------------------------------------------------------------------- // |
|
|
|
// Copies cl.pAreaBits, finds the area the viewer is in, and figures out what |
|
// other areas are visible. The new bits are placed in g_RenderAreaBits. |
|
void R_SetupAreaBits( int iForceViewLeaf = -1, const VisOverrideData_t* pVisData = NULL, float *pWaterReflectionHeight = NULL ); |
|
|
|
// Ask if an area is visible to the renderer. |
|
unsigned char R_IsAreaVisible( int area ); |
|
|
|
void R_Areaportal_LevelInit(); |
|
void R_Areaportal_LevelShutdown(); |
|
|
|
// Decides if the node can be seen through the area portals (ie: if you're |
|
// looking out a window with an areaportal in it, this will clip out the |
|
// stuff to the sides). |
|
enum |
|
{ |
|
FRUSTUM_CLIP_RIGHT = (1 << FRUSTUM_RIGHT), |
|
FRUSTUM_CLIP_LEFT = (1 << FRUSTUM_LEFT), |
|
FRUSTUM_CLIP_TOP = (1 << FRUSTUM_TOP), |
|
FRUSTUM_CLIP_BOTTOM = (1 << FRUSTUM_BOTTOM), |
|
|
|
FRUSTUM_CLIP_MASK = FRUSTUM_CLIP_RIGHT | FRUSTUM_CLIP_LEFT | FRUSTUM_CLIP_TOP | FRUSTUM_CLIP_BOTTOM, |
|
|
|
// This mask is used to reset the clip flags when we first enter an area |
|
FRUSTUM_CLIP_IN_AREA = 0x80000000, |
|
|
|
// Set the clipmask to this to cause it to clip against all frustum planes |
|
FRUSTUM_CLIP_ALL = FRUSTUM_CLIP_MASK, |
|
|
|
// Set the clipmask to this to suppress all future clipping |
|
FRUSTUM_SUPPRESS_CLIPPING = FRUSTUM_CLIP_IN_AREA, |
|
}; |
|
|
|
|
|
bool R_CullNode( Frustum_t *pAreaFrustum, mnode_t *pNode, int &nClipMask ); |
|
|
|
const Frustum_t* GetAreaFrustum( int area ); |
|
|
|
|
|
// ---------------------------------------------------------------------------- // |
|
// Globals. |
|
// ---------------------------------------------------------------------------- // |
|
|
|
extern ConVar r_DrawPortals; |
|
|
|
// Used when r_DrawPortals is on. Draws the screen space rects for each portal. |
|
extern CUtlVector<CPortalRect> g_PortalRects; |
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------- // |
|
// Inlines. |
|
// ---------------------------------------------------------------------------- // |
|
|
|
inline unsigned char R_IsAreaVisible( int area ) |
|
{ |
|
extern unsigned char g_RenderAreaBits[32]; |
|
return g_RenderAreaBits[area>>3] & (1 << (area&7)); |
|
} |
|
|
|
|
|
#endif // R_AREAPORTAL_H
|
|
|