Files
tech5/source/engine/cm/jobs/collisionquery.h
T
2026-08-09 01:29:43 -07:00

128 lines
3.6 KiB
C++

#pragma once
#include "cm/jobs/collisionresults.h"
#include "cm/collisiontypes.h"
#include <cstdint>
enum traceType_t : int {
TRACE_INVALID = 0,
TRACE_TRANSLATION = 1,
TRACE_TRANSLATION_POINT = 2,
TRACE_ROTATION = 3,
TRACE_ROTATION_POINT = 4,
TRACE_CONTENTS = 5,
TRACE_CONTENTS_POINT = 6,
TRACE_CONTACTS_UNI_DIR = 7,
TRACE_CONTACTS_OMNI_DIR = 8,
TRACE_CLIP = 9
};
enum queryStatus_t : int {
QUERY_STATUS_PENDING = 0,
QUERY_STATUS_SUCCESS = 1,
QUERY_STATUS_BAD_START = 2,
QUERY_STATUS_FAILED = 4
};
enum dependencyType_t : int {
DEPENDENCY_NONE = 0,
DEPENDENCY_MOTION_ROTATION = 1,
DEPENDENCY_MOTION_CONTACTS = 2,
DEPENDENCY_STEPMOVE_STEP_UP = 3,
DEPENDENCY_STEPMOVE_2ND_MOVE = 4,
DEPENDENCY_STEPMOVE_STEP_DOWN = 5,
DEPENDENCY_STEPMOVE_CONTACTS = 6,
DEPENDENCY_SLIDEMOVE_STEP_UP_1 = 7,
DEPENDENCY_SLIDEMOVE_STEP_UP_2 = 8,
DEPENDENCY_SLIDEMOVE_STEP_UP_3 = 9,
DEPENDENCY_SLIDEMOVE_STEP_UP_4 = 10,
DEPENDENCY_SLIDEMOVE_2ND_MOVE_1 = 11,
DEPENDENCY_SLIDEMOVE_2ND_MOVE_2 = 12,
DEPENDENCY_SLIDEMOVE_2ND_MOVE_3 = 13,
DEPENDENCY_SLIDEMOVE_2ND_MOVE_4 = 14,
DEPENDENCY_SLIDEMOVE_STEP_DOWN_1 = 15,
DEPENDENCY_SLIDEMOVE_STEP_DOWN_2 = 16,
DEPENDENCY_SLIDEMOVE_STEP_DOWN_3 = 17,
DEPENDENCY_SLIDEMOVE_STEP_DOWN_4 = 18,
DEPENDENCY_SLIDEMOVE_SLIDE = 19,
DEPENDENCY_SLIDEMOVE_CONTACTS = 20,
DEPENDENCY_LOCAL_SPACE = 21
};
class idCollisionQuery {
public:
std::uint64_t offset;
};
class idTraceModel;
struct idTraceWork;
class idJointMat;
struct queryResults_t;
struct queryParms_t {
traceType_t type;
bool autoMerge;
bool testQuery;
std::uint8_t pad[10];
idVec3 start;
idVec3 end;
idVec3 rotationOrigin;
idVec3 rotationAxis;
float rotationAngle;
idVec3 dir;
float depth;
idMat3 trmAxis;
int contentMask;
idVec3 modelOrigin;
idMat3 modelAxis;
int modelEntityNum;
int modelPhysicsId;
int modelBodyId;
int modelContentsOverride;
int selfId;
};
class idCollisionQueryExecute {
public:
static void ExecuteSubModelQuery(idTraceWork* tw,
queryResults_t& results, const queryParms_t* parms,
const idTraceModel* trm, const cm_subModelData_t* subModelData,
int subModelNum);
static void ExecutePolygonModelQuery(idTraceWork* tw,
queryResults_t& results, const queryParms_t* parms,
const idTraceModel* trm, const cm_polygonModel_t* polygonModel);
static void ExecuteSphereModelQuery(queryResults_t& results,
const queryParms_t* parms, const idJointMat* modelJoints,
const cm_sphereModel_t* sphereModel);
static void SetupDependentParms(queryParms_t* resultParms,
const queryParms_t* sourceParms,
const queryResults_t* modelPosition,
dependencyType_t dependencyType,
const queryResults_t* dependency1,
const queryResults_t* dependency2);
};
struct queryResults_t {
struct query_t {
traceType_t type;
int done;
int merged;
queryStatus_t status;
std::uint16_t executeThreadId;
std::uint16_t mergeThreadId;
std::uint32_t profile[5];
std::uint64_t modelQueryIndex;
} query;
std::uint8_t data[928];
};
static_assert(sizeof(idCollisionQuery) == 8,
"Recovered idCollisionQuery ABI changed");
static_assert(sizeof(queryResults_t::query_t) == 48,
"Recovered queryResults_t::query_t ABI changed");
static_assert(sizeof(queryResults_t) == 976,
"Recovered queryResults_t ABI changed");
static_assert(sizeof(queryParms_t) == 192,
"Recovered queryParms_t ABI changed");