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

171 lines
7.8 KiB
C++

#pragma once
#include "cm/collisionqueryjobmanager.h"
class idCollisionModel;
class idCollisionGrid;
class idCollisionGridState;
class idJointMat;
class idMapFile;
class idMaterial;
class idRenderModel;
class idStaticModel;
class idTraceModel;
class idVec3;
class idMat3;
class idCollisionDebugDrawSink {
public:
virtual ~idCollisionDebugDrawSink() = default;
virtual void DrawLine(const idVec3& start, const idVec3& end,
bool internalEdge, int lifeTime) = 0;
virtual void DrawPolygon(const idVec3* points, int numPoints,
int contents, int surfaceFlags, int surfaceType,
int lifeTime) = 0;
virtual void DrawSphere(const idVec3& center, float radius,
int surfaceType, int lifeTime) = 0;
};
int ContentsFromString(const char* string);
class idTrmFromSubModel {
public:
static bool TrmFromSubModel(const idCollisionModelLocal* model,
const cm_subModelData_t* subModelData, idTraceModel& trm);
};
class idCollisionModelManager {
public:
static void SetDebugDrawSink(idCollisionDebugDrawSink* sink);
idCollisionModel* ModelFromTrm(const char* modelName,
const idTraceModel& traceModel, const idMaterial* material);
idCollisionModel* BuildModel(const char* modelName,
const idStaticModel* staticModel, const int* subModelIndices,
int numSubModelIndices);
void BuildModelsForMapFile(const idMapFile* mapFile,
bool mapModelOnly);
idCollisionModel* ModelFromRender(const char* modelName,
const idRenderModel* renderModel);
idCollisionModel* ModelFromGrid(const char* modelName,
const idCollisionGrid* grid, const idCollisionGridState& state,
const idMaterial* material);
void DrawCollisionModel(idCollisionModel* model,
const idJointMat* modelJoints, const idVec3& modelOrigin,
const idMat3& modelAxis, const idVec3& viewOrigin,
const idMat3& viewAxis, float radius, int lifeTime);
void DebugOutput(const idVec3& viewOrigin, const idMat3& viewAxis);
void Init();
void Shutdown();
void StartQueryFrame();
void EndQueryFrame();
void SubmitQueries();
void WaitForAllQueries();
idCollisionModel* LoadModel(const char* modelName);
idCollisionGrid* LoadGrid(const char* modelName);
int FindStreamArea(idCollisionModel* model, const char* areaName);
void StreamModel(idCollisionModel* model, const int* areaIndices,
int numAreaIndices, bool wait);
bool IsResident(const idBounds& bounds,
const idPositionedCollisionModel* models, int numModels);
bool TrmFromModel(const char* modelName, idTraceModel& trm);
int CompoundTrmFromModel(const char* modelName, idTraceModel* trms,
int maxTrms, int* invalidSubmodelIndices,
int* numInvalidIndices);
idCollisionQuery Translation(trace_t* result, 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 LocalTranslation(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 Rotation(trace_t* result, 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 Motion(trace_t* result, 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 MotionContacts(trace_t* result,
contactsResult_t* contacts, 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 Contents(trace_t* result, 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 LocalContents(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 Contacts(contactsResult_t* result,
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 Clip(clipResult_t* result, 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 StepMove(trace_t* result, 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 StepMoveContacts(trace_t* result,
contactsResult_t* contacts, 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 SlideMove(trace_t* result, 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 SlideMoveContacts(trace_t* result,
contactsResult_t* contacts, 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 GetContentsResult(trace_t* result, idCollisionQuery& query,
bool peek);
bool GetMotionContactsResult(trace_t* result,
contactsResult_t* contacts, idCollisionQuery& query, bool peek);
bool GetClipResult(clipResult_t* result, idCollisionQuery& query,
bool peek);
bool GetStepMoveContactsResult(trace_t* result,
contactsResult_t* contacts, idCollisionQuery& query, bool peek);
};
extern idCollisionModelManager collisionModelManager;
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idCollisionModelManager) == 1,
"Recovered idCollisionModelManager ABI changed");
#endif