Initial gamelib integration AAS2 with some animation and physics and another integration pass on idLib.

This commit is contained in:
Justin Marshall
2026-08-09 03:52:45 -07:00
parent cdf7d52214
commit 6d92a71d19
111 changed files with 15204 additions and 2275 deletions
+306 -160
View File
@@ -1,171 +1,317 @@
#pragma once
// Reconstructed C++ declarations from IDA Local Types and PDB/DIA metadata.
// Original PDB header: w:\tech5\engine\gamelib\physics\clip.h
// Recovered logical types: 9
// Signatures retain Xbox 360 ABI evidence and may still require manual review.
#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>
// IDA Local Type ordinal 1833; PDB kind: enum.
enum idClip::idClipCollisionQuery::type_t : __int32
{
QUERY_VALID = 0x0,
QUERY_CANCELED = 0x1,
QUERY_SUBMITTED_TRANSLATION = 0x2,
QUERY_SUBMITTED_ROTATION = 0x3,
QUERY_SUBMITTED_MOTION = 0x4,
QUERY_SUBMITTED_MOTION_CONTACTS = 0x5,
QUERY_SUBMITTED_STEPMOVE = 0x6,
QUERY_SUBMITTED_STEPMOVE_CONTACTS = 0x7,
QUERY_SUBMITTED_SLIDEMOVE = 0x8,
QUERY_SUBMITTED_SLIDEMOVE_CONTACTS = 0x9,
QUERY_SUBMITTED_CONTENTS = 0xA,
QUERY_SUBMITTED_CONTACTS = 0xB,
QUERY_SUBMITTED_CLIP = 0xC,
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;
};
// IDA Local Type ordinal 2572; PDB kind: enum.
enum idClip::gatherType_t : __int32
{
GATHER_TOUCHING_BOUNDS = 0x0,
GATHER_TOUCHING_LINE = 0x1,
GATHER_TOUCHING_CLIPMODEL = 0x2,
struct clipQueryStats_t {
const char* userName;
int count;
int max;
};
// IDA Local Type ordinal 14068; PDB kind: class.
class idClip
{
class idClip {
public:
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;
idClip::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;
idClip::idClipCollisionQuery collisionQueries[4096];
unsigned __int64 collisionQueryFirstSubmittedIndex;
unsigned __int64 collisionQueryLastSubmittedIndex;
unsigned __int64 collisionQueryFirstAllocedIndex;
unsigned __int64 collisionQueryLastAllocedIndex;
unsigned __int64 collisionQueryLastResolvedIndex;
const char *gatherQueryUserNames[256];
idClip::idClipGatherQuery gatherQueries[256];
unsigned __int64 gatherQueryFirstSubmittedIndex;
unsigned __int64 gatherQueryLastSubmittedIndex;
unsigned __int64 gatherQueryFirstAllocedIndex;
unsigned __int64 gatherQueryLastAllocedIndex;
idClip::idGatherResult gatherResults[2048];
unsigned __int64 gatherResultFirstSubmittedIndex;
unsigned __int64 gatherResultLastSubmittedIndex;
unsigned __int64 gatherResultFirstAllocedIndex;
unsigned __int64 gatherResultLastAllocedIndex;
idClip::idClipResidencyQuery residencyQueries[1024];
unsigned __int64 residencyQueryFirstSubmittedIndex;
unsigned __int64 residencyQueryLastSubmittedIndex;
unsigned __int64 residencyQueryFirstAllocedIndex;
unsigned __int64 residencyQueryLastAllocedIndex;
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;
};
// IDA Local Type ordinal 14128; PDB kind: class.
class idClip::idClipQueryParms
{
public:
idVec3 start;
idVec3 end;
idVec3 origin;
idVec3 vec;
float f1;
float f2;
idMat3 startAxis;
int clipMask;
unsigned __int16 passEntityNumber;
unsigned __int16 flags;
unsigned __int8 pad[12];
unsigned int queryIndex;
const idClipModel *clipModel;
const idTraceModel *traceModel;
const char *userName;
};
// IDA Local Type ordinal 14131; PDB kind: class.
class idClip::idClipCollisionQuery
{
public:
idClip::idClipCollisionQuery::type_t type;
int parmIndex;
idClipModel *clipModel;
idCollisionQuery query;
};
// IDA Local Type ordinal 14132; PDB kind: class.
class idClip::idClipGatherQuery
{
public:
idVec3 vectors[4];
int clipMask;
__int16 passEntityNumber;
__int16 gatherType;
unsigned __int16 firstResultIndex;
unsigned __int16 numResults;
const idClipModel *clipModel;
};
// IDA Local Type ordinal 14133; PDB kind: class.
class idClip::idGatherResult
{
public:
idCollisionQuery query;
int physicsId;
__int16 bodyId;
__int16 entityNumber;
};
// IDA Local Type ordinal 14134; PDB kind: class.
class idClip::idClipResidencyQuery
{
public:
idBounds absBounds;
bool resident;
unsigned __int8 pad[7];
};
// IDA Local Type ordinal 23461; PDB kind: struct.
struct idClip::GetClipModelsTouchingLine::__l2::stackPoints_t
{
idVec4 start;
idVec4 end;
};
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