247 lines
9.3 KiB
C++
247 lines
9.3 KiB
C++
#pragma once
|
|
|
|
#include "cm/collisionmodel.h"
|
|
#include "cm/jobs/collisionmerge.h"
|
|
#include "idlib/math/rotation.h"
|
|
|
|
#include <cstdint>
|
|
|
|
class idParallelJobList;
|
|
struct idQueryData;
|
|
struct subModelQuery_t;
|
|
|
|
struct modelQuery_t {
|
|
traceType_t type;
|
|
queryParms_t* parms;
|
|
const idTraceModel* trm;
|
|
cmType_t modelType;
|
|
const cm_polygonModel_t* polygonModel;
|
|
const cm_sphereModel_t* sphereModel;
|
|
const idJointMat* modelJoints;
|
|
const char* userName;
|
|
queryResults_t* resultsPtr;
|
|
queryResults_t* finalResultsPtr;
|
|
modelQuery_t* nextOnQuery;
|
|
subModelQuery_t* subModelQueries;
|
|
int numSubModelQueries;
|
|
int executePriority;
|
|
int mergePriority;
|
|
modelQuery_t* nextInExecuteList;
|
|
modelQuery_t* nextInMergeList;
|
|
slideMoveState_t* slideMoveState;
|
|
queryResults_t* mergeResults;
|
|
int numMergeResults;
|
|
int resultSize;
|
|
queryResults_t* modelPosition;
|
|
queryResults_t* dependency1;
|
|
queryResults_t* dependency2;
|
|
dependencyType_t dependencyType;
|
|
int frameNumber;
|
|
int pad[6];
|
|
};
|
|
|
|
struct subModelQuery_t {
|
|
queryParms_t* parms;
|
|
const idTraceModel* trm;
|
|
const cm_subModel_t* subModel;
|
|
const cm_subModelData_t* subModelData;
|
|
int subModelNum;
|
|
queryResults_t* resultsPtr;
|
|
modelQuery_t* modelQuery;
|
|
subModelQuery_t* nextOnModelQuery;
|
|
};
|
|
|
|
struct timings_t {
|
|
timings_t();
|
|
|
|
std::uint32_t min;
|
|
std::uint32_t max;
|
|
std::uint32_t total;
|
|
std::uint32_t count;
|
|
};
|
|
|
|
struct queryDataStats_t {
|
|
const char* userName;
|
|
int numCollisionQueries;
|
|
int numModelQueries;
|
|
int numSubModelQueries;
|
|
int queryDataSize;
|
|
int finalResultSize;
|
|
int maxCollisionQueries;
|
|
int maxModelQueries;
|
|
int maxSubModelQueries;
|
|
int maxQueryDataSize;
|
|
int maxFinalResultSize;
|
|
};
|
|
|
|
struct profile_t {
|
|
timings_t timings[5];
|
|
};
|
|
|
|
struct jobGroup_t {
|
|
modelQuery_t* stallingExecuteJobs;
|
|
modelQuery_t* notStallingExecuteJobs1;
|
|
modelQuery_t* notStallingExecuteJobs2;
|
|
modelQuery_t* stallingMergeJobs;
|
|
modelQuery_t* notStallingMergeJobs;
|
|
int numJobs;
|
|
};
|
|
|
|
struct failedQuery_t {
|
|
bool valid;
|
|
queryResults_t results;
|
|
queryParms_t parms;
|
|
const idTraceModel* trm;
|
|
idCollisionModel* trmModel;
|
|
const cm_polygonModel_t* model;
|
|
const cm_subModel_t* subModel;
|
|
const cm_subModelData_t* subModelData;
|
|
idBounds subModelBounds;
|
|
int subModelNum;
|
|
};
|
|
|
|
class idCollisionQueryJobManager {
|
|
public:
|
|
idCollisionQueryJobManager();
|
|
~idCollisionQueryJobManager();
|
|
|
|
void Init();
|
|
void Shutdown();
|
|
void WaitForAllQueries();
|
|
|
|
idCollisionQuery SubmitTranslationQuery(const idVec3& start,
|
|
const idVec3& end, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitLocalTranslationQuery(idCollisionQuery localSpace,
|
|
const idVec3& start, const idVec3& end,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitRotationQuery(const idVec3& start,
|
|
const idRotation& rotation, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitMotionQuery(const idVec3& start,
|
|
const idVec3& end, const idRotation& rotation,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitMotionContactsQuery(const idVec3& start,
|
|
const idVec3& end, const idRotation& rotation, float depth,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitContentsQuery(const idVec3& start,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitLocalContentsQuery(idCollisionQuery localSpace,
|
|
const idVec3& start, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitContactsQuery(const idVec3& start,
|
|
const idVec3& direction, float depth,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitClipQuery(const idVec3& start,
|
|
const idBounds& globalBounds, const idTraceModel** trms,
|
|
int numTrms, const idMat3& trmAxis, int contentMask,
|
|
const idPositionedCollisionModel* models, int numModels,
|
|
const char* userName);
|
|
idCollisionQuery SubmitStepMoveQuery(const idVec3& start,
|
|
const idVec3& end, const idVec3& downNormal, float stepUp,
|
|
float stepDown, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitStepMoveContactsQuery(const idVec3& start,
|
|
const idVec3& end, const idVec3& downNormal, float stepUp,
|
|
float stepDown, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitSlideMoveQuery(const idVec3& start,
|
|
const idVec3& velocity, const idVec3& gravityVector, float stepUp,
|
|
float stepDown, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
idCollisionQuery SubmitSlideMoveContactsQuery(const idVec3& start,
|
|
const idVec3& velocity, const idVec3& gravityVector, float stepUp,
|
|
float stepDown, const idBounds& globalBounds,
|
|
const idTraceModel** trms, int numTrms, const idMat3& trmAxis,
|
|
int contentMask, const idPositionedCollisionModel* models,
|
|
int numModels, const char* userName);
|
|
|
|
bool GetRotationResult(idTraceWork* tw, trace_t* result,
|
|
idCollisionQuery& query, bool peek);
|
|
bool GetTraceResult(trace_t* result, idCollisionQuery& query,
|
|
bool peek);
|
|
bool GetContactsResult(contactsResult_t* result,
|
|
idCollisionQuery& query, bool peek);
|
|
bool GetMotionContactsResult(idTraceWork* tw, trace_t* result,
|
|
contactsResult_t* contacts, idCollisionQuery& query, bool peek);
|
|
bool GetClipResult(idTraceWork* tw, clipResult_t* result,
|
|
idCollisionQuery& query, bool peek);
|
|
bool GetSlideMoveContactsResult(idTraceWork* tw, trace_t* result,
|
|
contactsResult_t* contacts, idCollisionQuery& query, bool peek);
|
|
|
|
void ShowDebugInfo();
|
|
void StartFrame();
|
|
void EndFrame();
|
|
void SubmitQueries();
|
|
|
|
bool WaitForQueryResults(queryResults_t* results);
|
|
modelQuery_t* AllocModelQuery(
|
|
const idPositionedCollisionModel& model);
|
|
idCollisionQuery AllocFinishedFinalResult(traceType_t firstType,
|
|
traceType_t secondType, const idVec3& endPosition,
|
|
const idMat3& endAxis, const char* userName);
|
|
idCollisionQuery AddModelQueryToMergeList(modelQuery_t* modelQuery,
|
|
int mergePriority, slideMoveState_t* slideMoveState);
|
|
void AddModelQueryToExecuteList(modelQuery_t* modelQuery,
|
|
idCollisionQuery modelPosition, idCollisionQuery dependency1,
|
|
idCollisionQuery dependency2, dependencyType_t dependencyType,
|
|
const idVec3& globalStart, const idVec3& globalEnd,
|
|
const idBounds& globalBounds, int& executePriority);
|
|
void CreateMergeJobs(idParallelJobList* jobList,
|
|
modelQuery_t* modelQuery);
|
|
void CreateExecuteJobs(idParallelJobList* jobList,
|
|
modelQuery_t* modelQuery);
|
|
|
|
idQueryData* queryData;
|
|
queryResults_t* dummyQueryResults;
|
|
int queryFrameNumber;
|
|
int stalledFrameNumber;
|
|
std::uint64_t firstWaitTime;
|
|
int numJobGroups;
|
|
jobGroup_t* jobGroups;
|
|
idParallelJobList* jobList;
|
|
failedQuery_t failedQuery;
|
|
profile_t threadProfile[8];
|
|
profile_t translationProfile;
|
|
profile_t rotationProfile;
|
|
profile_t contentsProfile;
|
|
profile_t contactsProfile;
|
|
profile_t clipProfile;
|
|
};
|
|
|
|
#if INTPTR_MAX == INT32_MAX
|
|
static_assert(sizeof(timings_t) == 16,
|
|
"Recovered timings_t ABI changed");
|
|
static_assert(sizeof(queryDataStats_t) == 44,
|
|
"Recovered queryDataStats_t ABI changed");
|
|
static_assert(sizeof(idCollisionQueryJobManager) == 2304,
|
|
"Recovered idCollisionQueryJobManager ABI changed");
|
|
#endif
|