85 lines
2.4 KiB
C
85 lines
2.4 KiB
C
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
#ifndef QUERYCACHE_H
|
|
#define QUERYCACHE_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "mathlib/vector.h"
|
|
#include "tier0/platform.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
|