318 lines
12 KiB
C++
318 lines
12 KiB
C++
#pragma once
|
|
|
|
#include "cm/jobs/collisionresults.h"
|
|
#include "cm/jobs/collisionquery.h"
|
|
#include "gamelib/physics/clipmodel.h"
|
|
#include "idlib/blockalloc_base.h"
|
|
#include "idlib/containers/list.h"
|
|
#include "idlib/containers/staticlist.h"
|
|
#include "idlib/math/rotation.h"
|
|
|
|
#include <cstdint>
|
|
|
|
class idAAS2;
|
|
class idCollisionModel;
|
|
class idFixedWinding;
|
|
class idTraceModel;
|
|
class idTraceModelCache;
|
|
class idTraceModelRecycler;
|
|
class idTypeInfoTools;
|
|
struct idPositionedCollisionModel;
|
|
|
|
#ifndef ID_CLIP_QUERY_DEFINED
|
|
#define ID_CLIP_QUERY_DEFINED
|
|
struct idClipQuery { std::uint64_t index; };
|
|
#endif
|
|
|
|
struct idGatherQuery { std::uint64_t index; };
|
|
#ifndef ID_RESIDENCY_QUERY_DEFINED
|
|
#define ID_RESIDENCY_QUERY_DEFINED
|
|
struct idResidencyQuery { std::uint64_t index; };
|
|
#endif
|
|
|
|
struct clipSector_t {
|
|
int axis;
|
|
float dist;
|
|
clipSector_t* children[2];
|
|
clipLink_t* clipLinks;
|
|
};
|
|
|
|
struct clipQueryStats_t {
|
|
const char* userName;
|
|
int count;
|
|
int max;
|
|
};
|
|
|
|
class idClip {
|
|
public:
|
|
enum queryType_t : int {
|
|
QUERY_VALID = 0,
|
|
QUERY_CANCELED,
|
|
QUERY_SUBMITTED_TRANSLATION,
|
|
QUERY_SUBMITTED_ROTATION,
|
|
QUERY_SUBMITTED_MOTION,
|
|
QUERY_SUBMITTED_MOTION_CONTACTS,
|
|
QUERY_SUBMITTED_STEPMOVE,
|
|
QUERY_SUBMITTED_STEPMOVE_CONTACTS,
|
|
QUERY_SUBMITTED_SLIDEMOVE,
|
|
QUERY_SUBMITTED_SLIDEMOVE_CONTACTS,
|
|
QUERY_SUBMITTED_CONTENTS,
|
|
QUERY_SUBMITTED_CONTACTS,
|
|
QUERY_SUBMITTED_CLIP
|
|
};
|
|
|
|
enum gatherType_t : int {
|
|
GATHER_TOUCHING_BOUNDS = 0,
|
|
GATHER_TOUCHING_LINE = 1,
|
|
GATHER_TOUCHING_CLIPMODEL = 2
|
|
};
|
|
|
|
struct idClipQueryParms {
|
|
idVec3 start;
|
|
idVec3 end;
|
|
idVec3 origin;
|
|
idVec3 vec;
|
|
float f1;
|
|
float f2;
|
|
idMat3 startAxis;
|
|
int clipMask;
|
|
std::uint16_t passEntityNumber;
|
|
std::uint16_t flags;
|
|
std::uint8_t pad[12];
|
|
unsigned int queryIndex;
|
|
const idClipModel* clipModel;
|
|
const idTraceModel* traceModel;
|
|
const char* userName;
|
|
};
|
|
|
|
struct idClipCollisionQuery {
|
|
queryType_t type;
|
|
int parmIndex;
|
|
idClipModel* clipModel;
|
|
idCollisionQuery query;
|
|
};
|
|
|
|
struct idClipGatherQuery {
|
|
idVec3 vectors[4];
|
|
int clipMask;
|
|
std::int16_t passEntityNumber;
|
|
std::int16_t gatherType;
|
|
std::uint16_t firstResultIndex;
|
|
std::uint16_t numResults;
|
|
const idClipModel* clipModel;
|
|
};
|
|
|
|
struct idGatherResult {
|
|
idCollisionQuery query;
|
|
int physicsId;
|
|
std::int16_t bodyId;
|
|
std::int16_t entityNumber;
|
|
};
|
|
|
|
struct idClipResidencyQuery {
|
|
idBounds absBounds;
|
|
bool resident;
|
|
std::uint8_t pad[7];
|
|
};
|
|
|
|
idClip();
|
|
~idClip();
|
|
void Init(idCollisionModel* worldModel, idTraceModelCache* cache,
|
|
idTraceModelRecycler* recycler);
|
|
void Shutdown();
|
|
void StartQueryFrame();
|
|
void EndQueryFrame();
|
|
void ResolveCollisionQueries();
|
|
void DeleteClipModels();
|
|
void DeleteClipModel(idClipModel* clipModel);
|
|
void InitializeAASLinks(int aasType);
|
|
const idBounds& GetWorldBounds() const;
|
|
void AddStreamArea(int areaNum);
|
|
void ClearStreamAreas();
|
|
int FindStreamArea(const idClipModel* clipModel);
|
|
|
|
int GetClipModelsTouchingBounds(const idBounds& bounds, int contentMask,
|
|
idClipModel** clipModels, int maxClipModels) const;
|
|
int GetClipModelsTouchingLine(const idVec3& start, const idVec3& end,
|
|
int contentMask, idClipModel** clipModels,
|
|
int maxClipModels) const;
|
|
int GetEntitiesTouchingBounds(const idBounds& bounds, int contentMask,
|
|
int* entityNumbers, int maxEntities) const;
|
|
int GetEntitiesTouchingLine(const idVec3& start, const idVec3& end,
|
|
int contentMask, int* entityNumbers, int maxEntities) const;
|
|
idGatherQuery GatherTouchingBounds(const idBounds& bounds,
|
|
int contentMask, int passEntityNumber, const char* userName);
|
|
idGatherQuery GatherTouchingClipModel(const idVec3& origin,
|
|
const idClipModel* clipModel, const idMat3& axis, int contentMask,
|
|
int passEntityNumber, const char* userName);
|
|
int GetGatheredClipModels(const idGatherQuery& query,
|
|
idClipModel** clipModels, int maxClipModels);
|
|
int GetGatheredEntities(const idGatherQuery& query,
|
|
int* entityNumbers, int maxEntities);
|
|
idResidencyQuery TestResidency(const idBounds& bounds);
|
|
|
|
idClipQuery Translation(trace_t* result, const idVec3& start,
|
|
const idVec3& end, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, int passEntityNumber,
|
|
bool ignoreWorld, const char* userName);
|
|
idClipQuery LocalTranslation(idClipQuery localSpace,
|
|
const idVec3& start, const idVec3& end,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, bool ignoreWorld,
|
|
const char* userName);
|
|
idClipQuery TranslationTraceModel(trace_t* result,
|
|
const idVec3& start, const idVec3& end,
|
|
const idClipModel* clipModel, const idVec3& modelOrigin,
|
|
const idMat3& modelAxis, int contentMask, const char* userName);
|
|
idClipQuery Rotation(trace_t* result, const idVec3& start,
|
|
const idRotation& rotation, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, int passEntityNumber,
|
|
bool ignoreWorld, const char* userName);
|
|
idClipQuery Motion(trace_t* result, const idVec3& start,
|
|
const idVec3& end, const idRotation& rotation,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, bool ignoreWorld,
|
|
const char* userName);
|
|
idClipQuery MotionContacts(trace_t* result, contactsResult_t* contacts,
|
|
const idVec3& start, const idVec3& end,
|
|
const idRotation& rotation, float depth,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, bool ignoreWorld,
|
|
const char* userName);
|
|
idClipQuery StepMove(trace_t* result, const idVec3& start,
|
|
const idVec3& end, const idVec3& downNormal,
|
|
float stepUp, float stepDown, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, int passEntityNumber,
|
|
bool ignoreWorld, const char* userName);
|
|
idClipQuery StepMoveContacts(trace_t* result,
|
|
contactsResult_t* contacts, const idVec3& start,
|
|
const idVec3& end, const idVec3& downNormal,
|
|
float stepUp, float stepDown, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, int passEntityNumber,
|
|
bool ignoreWorld, const char* userName);
|
|
idClipQuery SlideMoveContacts(trace_t* result,
|
|
contactsResult_t* contacts, const idVec3& start,
|
|
const idVec3& end, const idVec3& downNormal,
|
|
float stepUp, const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, bool ignoreWorld,
|
|
const char* userName);
|
|
idClipQuery Contents(trace_t* result, const idVec3& start,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, const char* userName);
|
|
idClipQuery LocalContents(idClipQuery localSpace, const idVec3& start,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, const char* userName);
|
|
idClipQuery Contacts(contactsResult_t* result, const idVec3& start,
|
|
const idVec3& direction, float depth,
|
|
const idClipModel* clipModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, const char* userName);
|
|
idClipQuery Clip(clipResult_t* result, const idVec3& start,
|
|
const idTraceModel* traceModel, const idMat3& axis,
|
|
int contentMask, int passEntityNumber, const char* userName);
|
|
|
|
void TranslationModel(trace_t& result, const idVec3& start,
|
|
const idVec3& end, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, const idVec3& modelOrigin,
|
|
const idClipModel* model, const idMat3& modelAxis) const;
|
|
void RotationModel(trace_t& result, const idVec3& start,
|
|
const idRotation& rotation, const idClipModel* clipModel,
|
|
const idMat3& axis, int contentMask, const idVec3& modelOrigin,
|
|
const idClipModel* model, const idMat3& modelAxis) const;
|
|
void ContentsModel(trace_t& result, const idVec3& start,
|
|
const idClipModel* clipModel, const idMat3& axis, int contentMask,
|
|
const idVec3& modelOrigin, const idClipModel* model,
|
|
const idMat3& modelAxis) const;
|
|
bool GetModelContactFeature(const contactInfo_t& contact,
|
|
const idClipModel* model, idFixedWinding& winding) const;
|
|
void PrintStatistics();
|
|
void DrawWorld(const idVec3&, const idMat3&, float, bool) {}
|
|
void DrawSingleClipModel(idClipModel*, const idVec3&,
|
|
const idMat3&, int) {}
|
|
void ShowCollisionPoint(const contactInfo_t&,
|
|
const idTypeInfoTools*) {}
|
|
void ShowCollisionSurfaces(const idVec3&, const idMat3&, int, int,
|
|
const idTypeInfoTools*) {}
|
|
|
|
idClipModel* world;
|
|
idClipModel* temporaryClipModel;
|
|
idClipModel* defaultClipModel;
|
|
idClipModel* playerMeleeClipModel;
|
|
idClipModel* clip8x8;
|
|
idClipModel* clip8x8x8;
|
|
idClipModel* clip16x16;
|
|
idClipModel* clip16x16x16;
|
|
idClipModel* clip24x24;
|
|
idClipModel* clip32x32;
|
|
idClipModel* clip8x16;
|
|
idClipModel* clip48x48;
|
|
idClipModel* clip96x96;
|
|
idClipModel* clip24x24x96;
|
|
idClipModel* clip32x32x96;
|
|
idClipModel* clip48x48x96;
|
|
idBlockAlloc<clipLink_t, 256, 13> clipLinkAllocator;
|
|
idStaticList<clipSector_t, 8191> clipSectors;
|
|
int touchCount;
|
|
idAAS2* aases[8];
|
|
idTraceModelCache* traceModelCache;
|
|
idTraceModelRecycler* traceModelRecycler;
|
|
idClipModel* deletedClipModels;
|
|
idList<int, 13> streamAreas;
|
|
idClipQueryParms* queryParms;
|
|
int numQueryParms;
|
|
idStaticList<unsigned int, 2048> translationQueries;
|
|
idStaticList<unsigned int, 2048> rotationQueries;
|
|
idStaticList<unsigned int, 2048> motionQueries;
|
|
idStaticList<unsigned int, 2048> motionContactsQueries;
|
|
idStaticList<unsigned int, 2048> stepMoveQueries;
|
|
idStaticList<unsigned int, 2048> stepMoveContactsQueries;
|
|
idStaticList<unsigned int, 2048> slideMoveQueries;
|
|
idStaticList<unsigned int, 2048> slideMoveContactsQueries;
|
|
idStaticList<unsigned int, 2048> contentsQueries;
|
|
idStaticList<unsigned int, 2048> contactsQueries;
|
|
idStaticList<unsigned int, 2048> clipQueries;
|
|
idStaticList<unsigned int, 2048> localTranslationQueries;
|
|
idStaticList<unsigned int, 2048> localContentsQueries;
|
|
idStaticList<unsigned int, 2048> translationTraceModelQueries;
|
|
idClipCollisionQuery collisionQueries[4096];
|
|
std::uint64_t collisionQueryFirstSubmittedIndex;
|
|
std::uint64_t collisionQueryLastSubmittedIndex;
|
|
std::uint64_t collisionQueryFirstAllocedIndex;
|
|
std::uint64_t collisionQueryLastAllocedIndex;
|
|
std::uint64_t collisionQueryLastResolvedIndex;
|
|
const char* gatherQueryUserNames[256];
|
|
idClipGatherQuery gatherQueries[256];
|
|
std::uint64_t gatherQueryFirstSubmittedIndex;
|
|
std::uint64_t gatherQueryLastSubmittedIndex;
|
|
std::uint64_t gatherQueryFirstAllocedIndex;
|
|
std::uint64_t gatherQueryLastAllocedIndex;
|
|
idGatherResult gatherResults[2048];
|
|
std::uint64_t gatherResultFirstSubmittedIndex;
|
|
std::uint64_t gatherResultLastSubmittedIndex;
|
|
std::uint64_t gatherResultFirstAllocedIndex;
|
|
std::uint64_t gatherResultLastAllocedIndex;
|
|
idClipResidencyQuery residencyQueries[1024];
|
|
std::uint64_t residencyQueryFirstSubmittedIndex;
|
|
std::uint64_t residencyQueryLastSubmittedIndex;
|
|
std::uint64_t residencyQueryFirstAllocedIndex;
|
|
std::uint64_t residencyQueryLastAllocedIndex;
|
|
};
|
|
|
|
static_assert(sizeof(idClipQuery) == 8,
|
|
"Recovered clip-query ABI changed");
|
|
static_assert(sizeof(idGatherQuery) == 8,
|
|
"Recovered gather-query ABI changed");
|
|
static_assert(sizeof(idResidencyQuery) == 8,
|
|
"Recovered residency-query ABI changed");
|
|
#if INTPTR_MAX == INT32_MAX
|
|
static_assert(sizeof(idClip::idClipQueryParms) == 128,
|
|
"Recovered clip query parameters ABI changed");
|
|
static_assert(sizeof(idClip::idClipCollisionQuery) == 24,
|
|
"Recovered collision query ABI changed");
|
|
static_assert(sizeof(idClip::idClipGatherQuery) == 64,
|
|
"Recovered gather query ABI changed");
|
|
static_assert(sizeof(idClip::idGatherResult) == 16,
|
|
"Recovered gather result ABI changed");
|
|
static_assert(sizeof(idClip::idClipResidencyQuery) == 32,
|
|
"Recovered residency state ABI changed");
|
|
#endif
|