aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/clientleafsystem.h
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/clientleafsystem.h
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/clientleafsystem.h')
-rw-r--r--mp/src/game/client/clientleafsystem.h217
1 files changed, 217 insertions, 0 deletions
diff --git a/mp/src/game/client/clientleafsystem.h b/mp/src/game/client/clientleafsystem.h
new file mode 100644
index 00000000..8363ffc8
--- /dev/null
+++ b/mp/src/game/client/clientleafsystem.h
@@ -0,0 +1,217 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Revision: $
+// $NoKeywords: $
+//
+// This file contains code to allow us to associate client data with bsp leaves.
+//
+//===========================================================================//
+
+#if !defined( CLIENTLEAFSYSTEM_H )
+#define CLIENTLEAFSYSTEM_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "igamesystem.h"
+#include "engine/IClientLeafSystem.h"
+#include "cdll_int.h"
+#include "ivrenderview.h"
+#include "tier1/mempool.h"
+#include "tier1/refcount.h"
+
+
+//-----------------------------------------------------------------------------
+// Forward declarations
+//-----------------------------------------------------------------------------
+struct WorldListInfo_t;
+class IClientRenderable;
+class Vector;
+class CGameTrace;
+typedef CGameTrace trace_t;
+struct Ray_t;
+class Vector2D;
+class CStaticProp;
+
+
+//-----------------------------------------------------------------------------
+// Handle to an renderables in the client leaf system
+//-----------------------------------------------------------------------------
+enum
+{
+ DETAIL_PROP_RENDER_HANDLE = (ClientRenderHandle_t)0xfffe
+};
+
+
+class CClientRenderablesList : public CRefCounted<>
+{
+ DECLARE_FIXEDSIZE_ALLOCATOR( CClientRenderablesList );
+
+public:
+ enum
+ {
+ MAX_GROUP_ENTITIES = 4096
+ };
+
+ struct CEntry
+ {
+ IClientRenderable *m_pRenderable;
+ unsigned short m_iWorldListInfoLeaf; // NOTE: this indexes WorldListInfo_t's leaf list.
+ unsigned short m_TwoPass;
+ ClientRenderHandle_t m_RenderHandle;
+ };
+
+ // The leaves for the entries are in the order of the leaves you call CollateRenderablesInLeaf in.
+ CEntry m_RenderGroups[RENDER_GROUP_COUNT][MAX_GROUP_ENTITIES];
+ int m_RenderGroupCounts[RENDER_GROUP_COUNT];
+};
+
+
+//-----------------------------------------------------------------------------
+// Used by CollateRenderablesInLeaf
+//-----------------------------------------------------------------------------
+struct SetupRenderInfo_t
+{
+ WorldListInfo_t *m_pWorldListInfo;
+ CClientRenderablesList *m_pRenderList;
+ Vector m_vecRenderOrigin;
+ Vector m_vecRenderForward;
+ int m_nRenderFrame;
+ int m_nDetailBuildFrame; // The "render frame" for detail objects
+ float m_flRenderDistSq;
+ bool m_bDrawDetailObjects : 1;
+ bool m_bDrawTranslucentObjects : 1;
+
+ SetupRenderInfo_t()
+ {
+ m_bDrawDetailObjects = true;
+ m_bDrawTranslucentObjects = true;
+ }
+};
+
+
+//-----------------------------------------------------------------------------
+// A handle associated with shadows managed by the client leaf system
+//-----------------------------------------------------------------------------
+typedef unsigned short ClientLeafShadowHandle_t;
+enum
+{
+ CLIENT_LEAF_SHADOW_INVALID_HANDLE = (ClientLeafShadowHandle_t)~0
+};
+
+
+//-----------------------------------------------------------------------------
+// The client leaf system
+//-----------------------------------------------------------------------------
+abstract_class IClientLeafShadowEnum
+{
+public:
+ // The user ID is the id passed into CreateShadow
+ virtual void EnumShadow( ClientShadowHandle_t userId ) = 0;
+};
+
+
+// subclassed by things which wish to add per-leaf data managed by the client leafsystem
+class CClientLeafSubSystemData
+{
+public:
+ virtual ~CClientLeafSubSystemData( void )
+ {
+ }
+};
+
+
+// defines for subsystem ids. each subsystem id uses up one pointer in each leaf
+#define CLSUBSYSTEM_DETAILOBJECTS 0
+#define N_CLSUBSYSTEMS 1
+
+
+
+//-----------------------------------------------------------------------------
+// The client leaf system
+//-----------------------------------------------------------------------------
+abstract_class IClientLeafSystem : public IClientLeafSystemEngine, public IGameSystemPerFrame
+{
+public:
+ // Adds and removes renderables from the leaf lists
+ virtual void AddRenderable( IClientRenderable* pRenderable, RenderGroup_t group ) = 0;
+
+ // This tells if the renderable is in the current PVS. It assumes you've updated the renderable
+ // with RenderableChanged() calls
+ virtual bool IsRenderableInPVS( IClientRenderable *pRenderable ) = 0;
+
+ virtual void SetSubSystemDataInLeaf( int leaf, int nSubSystemIdx, CClientLeafSubSystemData *pData ) =0;
+ virtual CClientLeafSubSystemData *GetSubSystemDataInLeaf( int leaf, int nSubSystemIdx ) =0;
+
+
+ virtual void SetDetailObjectsInLeaf( int leaf, int firstDetailObject, int detailObjectCount ) = 0;
+ virtual void GetDetailObjectsInLeaf( int leaf, int& firstDetailObject, int& detailObjectCount ) = 0;
+
+ // Indicates which leaves detail objects should be rendered from, returns the detais objects in the leaf
+ virtual void DrawDetailObjectsInLeaf( int leaf, int frameNumber, int& firstDetailObject, int& detailObjectCount ) = 0;
+
+ // Should we draw detail objects (sprites or models) in this leaf (because it's close enough to the view)
+ // *and* are there any objects in the leaf?
+ virtual bool ShouldDrawDetailObjectsInLeaf( int leaf, int frameNumber ) = 0;
+
+ // Call this when a renderable origin/angles/bbox parameters has changed
+ virtual void RenderableChanged( ClientRenderHandle_t handle ) = 0;
+
+ // Set a render group
+ virtual void SetRenderGroup( ClientRenderHandle_t handle, RenderGroup_t group ) = 0;
+
+ // Computes which leaf translucent objects should be rendered in
+ virtual void ComputeTranslucentRenderLeaf( int count, const LeafIndex_t *pLeafList, const LeafFogVolume_t *pLeafFogVolumeList, int frameNumber, int viewID ) = 0;
+
+ // Put renderables into their appropriate lists.
+ virtual void BuildRenderablesList( const SetupRenderInfo_t &info ) = 0;
+
+ // Put renderables in the leaf into their appropriate lists.
+ virtual void CollateViewModelRenderables( CUtlVector< IClientRenderable * >& opaqueList, CUtlVector< IClientRenderable * >& translucentList ) = 0;
+
+ // Call this to deactivate static prop rendering..
+ virtual void DrawStaticProps( bool enable ) = 0;
+
+ // Call this to deactivate small object rendering
+ virtual void DrawSmallEntities( bool enable ) = 0;
+
+ // The following methods are related to shadows...
+ virtual ClientLeafShadowHandle_t AddShadow( ClientShadowHandle_t userId, unsigned short flags ) = 0;
+ virtual void RemoveShadow( ClientLeafShadowHandle_t h ) = 0;
+
+ // Project a shadow
+ virtual void ProjectShadow( ClientLeafShadowHandle_t handle, int nLeafCount, const int *pLeafList ) = 0;
+
+ // Project a projected texture spotlight
+ virtual void ProjectFlashlight( ClientLeafShadowHandle_t handle, int nLeafCount, const int *pLeafList ) = 0;
+
+ // Find all shadow casters in a set of leaves
+ virtual void EnumerateShadowsInLeaves( int leafCount, LeafIndex_t* pLeaves, IClientLeafShadowEnum* pEnum ) = 0;
+
+ // Fill in a list of the leaves this renderable is in.
+ // Returns -1 if the handle is invalid.
+ virtual int GetRenderableLeaves( ClientRenderHandle_t handle, int leaves[128] ) = 0;
+
+ // Get leaves this renderable is in
+ virtual bool GetRenderableLeaf ( ClientRenderHandle_t handle, int* pOutLeaf, const int* pInIterator = 0, int* pOutIterator = 0 ) = 0;
+
+ // Use alternate translucent sorting algorithm (draw translucent objects in the furthest leaf they lie in)
+ virtual void EnableAlternateSorting( ClientRenderHandle_t handle, bool bEnable ) = 0;
+};
+
+
+//-----------------------------------------------------------------------------
+// Singleton accessor
+//-----------------------------------------------------------------------------
+extern IClientLeafSystem *g_pClientLeafSystem;
+inline IClientLeafSystem* ClientLeafSystem()
+{
+ return g_pClientLeafSystem;
+}
+
+
+#endif // CLIENTLEAFSYSTEM_H
+
+