114 lines
3.0 KiB
C++
114 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include "gamelib/physics/clip.h"
|
|
#include "idlib/containers/list.h"
|
|
#include "idlib/math/vector.h"
|
|
|
|
#include <cstdint>
|
|
|
|
class idAAS2;
|
|
class idColor;
|
|
|
|
struct idDeferredVisQuery {
|
|
idDeferredVisQuery* nextInHash;
|
|
idDeferredVisQuery* prev;
|
|
idDeferredVisQuery* next;
|
|
std::int16_t start[3];
|
|
std::int16_t end[3];
|
|
std::int16_t frameCounter;
|
|
std::uint8_t queryIdx;
|
|
std::uint8_t state;
|
|
int pad;
|
|
};
|
|
|
|
struct deferredVisList_t {
|
|
idDeferredVisQuery* headNode;
|
|
idDeferredVisQuery* tailNode;
|
|
int numElements;
|
|
};
|
|
|
|
class idDeferredVisCache {
|
|
public:
|
|
enum queryState_t : std::uint8_t {
|
|
VIS_INVALID = 0,
|
|
VIS_PENDING = 1,
|
|
VIS_SUBMITTED = 2,
|
|
VIS_BLOCKED = 3,
|
|
VIS_CLEAR = 4
|
|
};
|
|
|
|
idDeferredVisCache();
|
|
~idDeferredVisCache();
|
|
void Init(idClip* inClip);
|
|
void Shutdown();
|
|
void UpdateCollisionQueries();
|
|
void SubmitCollisionQueries();
|
|
std::uint8_t GetVisQuery(const std::uint16_t start[3],
|
|
const std::uint16_t end[3], int flags);
|
|
void PrintDebugInfo() const;
|
|
|
|
idList<idDeferredVisQuery*, 106> hashTable;
|
|
idList<idClipQuery, 106> clipQueries;
|
|
int curClipQueryIdx;
|
|
deferredVisList_t leastRecentlyUsedList;
|
|
deferredVisList_t priorityList;
|
|
idClip* clip;
|
|
idDeferredVisQuery* queryList;
|
|
idDeferredVisQuery* queryPool;
|
|
int expiredIndex;
|
|
int numFrames;
|
|
int numCreatedThisFrame;
|
|
int numBumped;
|
|
int numQueriesIssued;
|
|
int totalQueriesIssued;
|
|
int numPurged;
|
|
int numExpired;
|
|
int numCacheHits;
|
|
int totalCacheHits;
|
|
int maxCreatedInAFrame;
|
|
int recentNumFrames;
|
|
int recentTotalCacheHits;
|
|
int recentTotalQueriesIssued;
|
|
float recentCacheHitRatio;
|
|
float recentAvgHitRatio;
|
|
bool initialized;
|
|
bool alreadyWarned;
|
|
|
|
private:
|
|
idDeferredVisQuery* AllocNode();
|
|
void FreeLinkedList(deferredVisList_t& list);
|
|
void RemoveNoDelete(deferredVisList_t& list,
|
|
idDeferredVisQuery* node);
|
|
void AddToFront(deferredVisList_t& list,
|
|
idDeferredVisQuery* node);
|
|
void RemoveFromHash(idDeferredVisQuery* node);
|
|
void FreeNode(idDeferredVisQuery* node);
|
|
};
|
|
|
|
class idDeferredVisGrid {
|
|
public:
|
|
idDeferredVisGrid();
|
|
void Init(const idVec3& entityPos);
|
|
void Update(const idVec3& entityPos, const idAAS2* aas,
|
|
int areaNum, int travelFlags);
|
|
float GetGridVisibility(const idVec3& worldPoint,
|
|
idDeferredVisCache& cache, const float* staggerZ,
|
|
int flags, idColor* missDebugColor = nullptr,
|
|
idColor* hitDebugColor = nullptr);
|
|
void DebugDrawGrid() const;
|
|
|
|
std::uint8_t cells[64];
|
|
std::int16_t xyz[3];
|
|
};
|
|
|
|
static_assert(sizeof(idDeferredVisGrid) == 70,
|
|
"Recovered deferred visibility grid ABI changed");
|
|
#if INTPTR_MAX == INT32_MAX
|
|
static_assert(sizeof(idDeferredVisQuery) == 32,
|
|
"Recovered deferred visibility query ABI changed");
|
|
static_assert(sizeof(deferredVisList_t) == 12,
|
|
"Recovered deferred visibility list ABI changed");
|
|
static_assert(sizeof(idDeferredVisCache) == 140,
|
|
"Recovered deferred visibility cache ABI changed");
|
|
#endif
|