From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/shared/querycache.h | 99 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 mp/src/game/shared/querycache.h (limited to 'mp/src/game/shared/querycache.h') diff --git a/mp/src/game/shared/querycache.h b/mp/src/game/shared/querycache.h new file mode 100644 index 00000000..73c71944 --- /dev/null +++ b/mp/src/game/shared/querycache.h @@ -0,0 +1,99 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#ifndef QUERYCACHE_H +#define QUERYCACHE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier0/platform.h" +#include "mathlib/vector.h" + +// this system provides several piece of functionality to ai or other systems which wish to do +// traces and other trace-like queries. + +// a. By maintaining a set of incrementally updated trace results, it makes it simple to have ai +// code use hyteresis on traces as an optimization method. + +// b. By updating the cache entries outside of the entity think functions, the update is done in a +// fully multi-threaded fashion + + +enum EQueryType_t +{ + EQUERY_INVALID = 0, // an invalid or unused entry + EQUERY_TRACELINE, + EQUERY_ENTITY_LOS_CHECK, + +}; + +enum EEntityOffsetMode_t +{ + EOFFSET_MODE_WORLDSPACE_CENTER, + EOFFSET_MODE_EYEPOSITION, + EOFFSET_MODE_NONE, // nop +}; + + +#define QCACHE_MAXPNTS 3 // maximum number of points/entities + // involved in a query + +struct QueryCacheKey_t +{ + EQueryType_t m_Type; + int m_nNumValidPoints; + Vector m_Points[QCACHE_MAXPNTS]; + EHANDLE m_pEntities[QCACHE_MAXPNTS]; + EEntityOffsetMode_t m_nOffsetMode[QCACHE_MAXPNTS]; + unsigned int m_nTraceMask; + unsigned int m_nHashIdx; + int m_nCollisionGroup; + ShouldHitFunc_t m_pTraceFilterFunction; + + float m_flMinimumUpdateInterval; + + void ComputeHashIndex( void ); + + bool Matches( QueryCacheKey_t const *pNode ) const ; +}; + +struct QueryCacheEntry_t +{ + QueryCacheEntry_t *m_pNext; + QueryCacheEntry_t *m_pPrev; + QueryCacheKey_t m_QueryParams; + float m_flLastUpdateTime; + bool m_bUsedSinceUpdated; // was this cell referenced? + bool m_bSpeculativelyDone; + bool m_bResult; // for queries with a boolean result + + void IssueQuery( void ); + +}; + + + +bool IsLineOfSightBetweenTwoEntitiesClear( CBaseEntity *pSrcEntity, + EEntityOffsetMode_t nSrcOffsetMode, + CBaseEntity *pDestEntity, + EEntityOffsetMode_t nDestOffsetMode, + CBaseEntity *pSkipEntity, + int nCollisionGroup, + unsigned int nTraceMask, + ShouldHitFunc_t pTraceFilterCallback, + float flMinimumUpdateInterval = 0.2 + ); + + + +// call during main loop for threaded update of the query cache +void UpdateQueryCache( void ); + +// call on level transition or other significant step-functions +void InvalidateQueryCache( void ); + +#endif // querycache_h -- cgit v1.2.3