//========= 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 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