Files
tech5/source/engine/gamelib/physics/clipmodel.h
T

157 lines
4.6 KiB
C++

#pragma once
#include "cm/jobs/collisionquery.h"
#include "idlib/bv/bounds.h"
#include "idlib/containers/list.h"
#include "idlib/text/atomicstring.h"
#include <cstdint>
class idAASClipLink;
class idClip;
class idCollisionModel;
class idMaterial;
class idSerializer;
class idTraceModel;
class idTreeAnimator;
struct clipSector_t;
enum clipMode_t : int {
CLIPMODE_INTERSECT = 0,
CLIPMODE_UNION = 1,
CLIPMODE_DIFFERENCE = 2,
CLIPMODE_XOR = 3
};
struct clipLink_t {
class idClipModel* clipModel;
clipSector_t* sector;
clipLink_t* prevInSector;
clipLink_t* nextInSector;
clipLink_t* nextLink;
};
class idClipModel {
public:
idClipModel();
idClipModel(idClip* ownerClip, const char* modelName,
const idMaterial* material = nullptr);
idClipModel(idClip* ownerClip, idCollisionModel* model);
idClipModel(idClip* ownerClip, const idTraceModel* traceModel,
int traceModelIndex, const idMaterial* material = nullptr);
idClipModel(idClip* ownerClip, idTreeAnimator* animator);
idClipModel(idClip* ownerClip, const idClipModel& other);
virtual ~idClipModel();
void Delete();
void Unlink();
void Link();
void Link(int entityNum, int ownerNum, int physicsBodyId,
const idVec3& newOrigin, const idMat3& newAxis);
void Link(int entityNum, int ownerNum, int physicsBodyId,
const idVec3& newOrigin, const idMat3& newAxis,
const idBounds& newBounds);
void SetContents(int newContents);
int GetContents() const { return contents; }
void Enable() { enabled = true; }
void Disable() { enabled = false; }
bool IsEnabled() const { return enabled; }
bool IsLinked() const { return clipLinks != nullptr; }
bool IsDeleted() const { return deleted; }
int GetEntityNumber() const { return entityNumber; }
int GetOwnerNumber() const { return ownerNumber; }
int GetPhysicsId() const { return physicsId; }
int GetBodyId() const { return bodyId; }
int GetBodyMask() const { return bodyMask; }
void SetBodyMask(int mask) { bodyMask = mask; }
const idVec3& GetOrigin() const { return origin; }
const idMat3& GetAxis() const { return axis; }
const idBounds& GetBounds() const { return bounds; }
const idBounds& GetAbsBounds() const { return absBounds; }
idCollisionModel* GetCollisionModel() const;
const idTraceModel* GetTraceModel(int index = 0) const;
int GetNumTraceModels() const { return traceModels.Num(); }
void GetMassProperties(float density, float& mass,
idVec3& centerOfMass, idMat3& inertiaTensor) const;
void Serialize(idSerializer& serializer);
bool enabled;
bool deleted;
int entityNumber;
int ownerNumber;
int physicsId;
int bodyId;
int bodyMask;
idVec3 origin;
idMat3 axis;
idBounds bounds;
idBounds absBounds;
int contents;
idCollisionModel* collisionModel;
idList<int, 13> traceModels;
idTreeAnimator* animatedModel;
idClip* clip;
clipLink_t* clipLinks;
idCollisionQuery collisionQuery;
int touchCount;
idClipModel* nextDeleted;
idAASClipLink* aasLinks[8];
private:
idCollisionModel* NoTraceModelWarning() const;
void Init(idClip* ownerClip);
void FreeModel();
bool LoadCollisionModel(const char* modelName,
const idMaterial* material);
void LoadCollisionModel(idCollisionModel* model);
void LoadTraceModel(const idTraceModel* traceModel, int traceModelIndex,
const idMaterial* material);
void LoadAnimator(idTreeAnimator* animator);
void Link_r(clipSector_t* sector);
};
class idStrClipModel : public idAtomicString {
public:
using idAtomicString::idAtomicString;
};
class idClipModelInfo {
public:
enum clipModelType_t : int {
CLIPMODEL_NONE = 0,
CLIPMODEL_RENDERMODEL = 1,
CLIPMODEL_CUSTOM = 2,
CLIPMODEL_BOX = 3,
CLIPMODEL_CYLINDER = 4,
CLIPMODEL_CONE = 5,
CLIPMODEL_BOUNDINGBOX = 6
};
clipModelType_t type;
idVec3 size;
idVec3 offset;
int numSides;
idStrClipModel clipModelName;
bool clipShrink;
bool allowInline;
bool softObstacle;
const idMaterial* overrideClipMaterial;
};
struct cbp_model_s {
int state[16];
int count0[16];
int count1[16];
};
static_assert(sizeof(clipLink_t) == sizeof(void*) * 5,
"Recovered clip-link ABI changed");
static_assert(sizeof(cbp_model_s) == 192,
"Recovered clip-model predictor ABI changed");
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idClipModel) == 216,
"Recovered idClipModel ABI changed");
static_assert(sizeof(idClipModelInfo) == 44,
"Recovered idClipModelInfo ABI changed");
#endif