CDispCollTree::AABBTree_IntersectAABB
0x000cc8c0 · 1636 bytes · __thiscall
_ZN13CDispCollTree22AABBTree_IntersectAABBERK6VectorS2_
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CDispCollTree::AABBTree_IntersectAABB(Vector const&, Vector const&) */
undefined4 __thiscall
CDispCollTree::AABBTree_IntersectAABB(CDispCollTree *this,Vector *param_1,Vector *param_2)
{
short *psVar1;
ushort *puVar2;
ushort *puVar3;
float fVar4;
float fVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
int iVar10;
char cVar11;
int iVar12;
int iVar13;
undefined4 uVar14;
undefined1 (*pauVar15) [16];
uint uVar16;
int iVar17;
int iVar18;
undefined1 auVar19 [16];
undefined1 auVar20 [16];
undefined1 auVar21 [16];
undefined1 auVar22 [16];
undefined1 auVar23 [16];
undefined1 auVar24 [16];
undefined1 auVar25 [16];
undefined4 local_5bc;
undefined4 local_5b8;
float local_5b4;
float local_5b0;
float local_5ac;
float local_5a8;
float local_5a4;
float local_5a0;
undefined4 local_59c;
undefined4 local_598;
int local_594;
undefined4 local_590;
undefined4 local_58c;
undefined4 local_588;
undefined4 local_584;
byte local_580;
byte local_57f;
int local_57c [347];
if ((*(uint *)(this + 0x2c) & 4) != 0) {
return 0;
}
fVar4 = *(float *)param_2;
local_57c[0] = 0;
fVar5 = *(float *)(param_1 + 8);
fVar6 = *(float *)param_1;
fVar7 = *(float *)(param_2 + 4);
fVar8 = *(float *)(param_1 + 4);
fVar9 = *(float *)(param_2 + 8);
local_5b4 = (fVar4 + fVar6) * 0.5;
iVar12 = 0;
iVar10 = *(int *)(this + 0x98);
local_5b0 = (fVar7 + fVar8) * 0.5;
local_5ac = (fVar5 + fVar9) * 0.5;
local_5a8 = fVar4 - local_5b4;
local_5a4 = fVar7 - local_5b0;
local_5a0 = fVar9 - local_5ac;
iVar17 = 0;
iVar18 = 0;
while (iVar13 = iVar18 + 1, iVar17 < iVar10) {
auVar21._4_4_ = fVar5;
auVar21._0_4_ = fVar5;
auVar21._8_4_ = fVar5;
auVar21._12_4_ = fVar5;
auVar25._4_4_ = fVar4;
auVar25._0_4_ = fVar4;
auVar25._8_4_ = fVar4;
auVar25._12_4_ = fVar4;
pauVar15 = (undefined1 (*) [16])(iVar17 * 0x60 + *(int *)(this + 0x90));
auVar24._4_4_ = fVar7;
auVar24._0_4_ = fVar7;
auVar24._8_4_ = fVar7;
auVar24._12_4_ = fVar7;
auVar23._4_4_ = fVar9;
auVar23._0_4_ = fVar9;
auVar23._8_4_ = fVar9;
auVar23._12_4_ = fVar9;
auVar21 = maxps(auVar21,pauVar15[2]);
auVar25 = minps(auVar25,pauVar15[3]);
auVar24 = minps(auVar24,pauVar15[4]);
auVar23 = minps(auVar23,pauVar15[5]);
auVar19._4_4_ = fVar6;
auVar19._0_4_ = fVar6;
auVar19._8_4_ = fVar6;
auVar19._12_4_ = fVar6;
auVar19 = maxps(*pauVar15,auVar19);
auVar22._4_4_ = fVar8;
auVar22._0_4_ = fVar8;
auVar22._8_4_ = fVar8;
auVar22._12_4_ = fVar8;
auVar22 = maxps(pauVar15[1],auVar22);
auVar20._0_4_ =
-(uint)((auVar19._0_4_ <= auVar25._0_4_ && auVar22._0_4_ <= auVar24._0_4_) &&
auVar21._0_4_ <= auVar23._0_4_);
auVar20._4_4_ =
-(uint)((auVar19._4_4_ <= auVar25._4_4_ && auVar22._4_4_ <= auVar24._4_4_) &&
auVar21._4_4_ <= auVar23._4_4_);
auVar20._8_4_ =
-(uint)((auVar19._8_4_ <= auVar25._8_4_ && auVar22._8_4_ <= auVar24._8_4_) &&
auVar21._8_4_ <= auVar23._8_4_);
auVar20._12_4_ =
-(uint)((auVar19._12_4_ <= auVar25._12_4_ && auVar22._12_4_ <= auVar24._12_4_) &&
auVar21._12_4_ <= auVar23._12_4_);
uVar16 = movmskps(pauVar15,auVar20);
if (uVar16 != 0) {
iVar17 = iVar17 * 4;
if ((uVar16 & 1) != 0) {
iVar12 = iVar12 + 1;
local_57c[iVar12] = iVar17 + 1;
}
if ((uVar16 & 2) != 0) {
iVar12 = iVar12 + 1;
local_57c[iVar12] = iVar17 + 2;
}
if ((uVar16 & 4) != 0) {
iVar12 = iVar12 + 1;
local_57c[iVar12] = iVar17 + 3;
}
if ((uVar16 & 8) != 0) {
iVar12 = iVar12 + 1;
local_57c[iVar12] = iVar17 + 4;
}
}
if (iVar12 < iVar13) {
return 0;
}
iVar18 = iVar13;
iVar17 = local_57c[iVar13];
}
local_5bc = 0;
local_5b8 = 0;
if (_exit == 0) {
local_594 = 0;
}
else {
(**(code **)(_exit + 0x50))
(_exit,&local_5bc,0,0,0,0,"/data/src/engine/../public/dispcoll_common.cpp",0x334,
&AABBTree_IntersectAABB(Vector_const&,Vector_const&)::tm_fmt,"(%s)%s","Unaccounted",
"Tris");
local_594 = _exit;
}
iVar10 = _DAT_0040b9d4;
local_59c = local_5bc;
local_598 = local_5b8;
/* try { // try from 000ccbd9 to 000ccc27 has its CatchHandler @ 000ccf3a */
if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
(iVar13 = ThreadGetCurrentId(), iVar10 == iVar13)) {
if ((char *)*_DAT_0040b030 != "Tris") {
_DAT_0040b030 =
(int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a2913,&DAT_00000001,0x2a054b);
}
CVProfNode::EnterScope();
DAT_0040b02c = '\0';
}
while( true ) {
psVar1 = (short *)(*(int *)(this + 0xa0) + (iVar17 - *(int *)(this + 0x98)) * 4);
puVar2 = (ushort *)(*(int *)(this + 0x80) + *psVar1 * 0x18);
local_590 = *(undefined4 *)(puVar2 + 4);
puVar3 = (ushort *)(*(int *)(this + 0x80) + psVar1[1] * 0x18);
local_58c = *(undefined4 *)(puVar2 + 6);
local_588 = *(undefined4 *)(puVar2 + 8);
local_584 = *(undefined4 *)(puVar2 + 10);
local_57f = (byte)puVar2[3] & 7;
local_580 = (byte)puVar2[3] >> 3 & 7;
iVar10 = *(int *)(this + 0x70);
/* try { // try from 000ccd1a to 000ccddf has its CatchHandler @ 000ccf52 */
cVar11 = IsBoxIntersectingTriangle
((Vector *)&local_5b4,(Vector *)&local_5a8,
(Vector *)(iVar10 + (*puVar2 & 0x1ff) * 0xc),
(Vector *)(iVar10 + (puVar2[2] & 0x1ff) * 0xc),
(Vector *)(iVar10 + (puVar2[1] & 0x1ff) * 0xc),(cplane_t *)&local_590,0.0);
if (cVar11 != '\0') break;
local_590 = *(undefined4 *)(puVar3 + 4);
local_58c = *(undefined4 *)(puVar3 + 6);
local_588 = *(undefined4 *)(puVar3 + 8);
local_584 = *(undefined4 *)(puVar3 + 10);
local_57f = (byte)puVar3[3] & 7;
local_580 = (byte)puVar3[3] >> 3 & 7;
iVar10 = *(int *)(this + 0x70);
uVar14 = IsBoxIntersectingTriangle
((Vector *)&local_5b4,(Vector *)&local_5a8,
(Vector *)(iVar10 + (*puVar3 & 0x1ff) * 0xc),
(Vector *)(iVar10 + (puVar3[2] & 0x1ff) * 0xc),
(Vector *)(iVar10 + (puVar3[1] & 0x1ff) * 0xc),(cplane_t *)&local_590,0.0);
iVar10 = _DAT_0040b9d4;
if ((char)uVar14 != '\0') break;
iVar18 = iVar18 + 1;
if (iVar12 < iVar18) {
if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
(iVar17 = ThreadGetCurrentId(), iVar10 == iVar17)) {
cVar11 = CVProfNode::ExitScope();
if (cVar11 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
if (local_594 != 0) {
(**(code **)(local_594 + 0x54))(local_594,local_59c,local_598,0,0,0);
return uVar14;
}
return uVar14;
}
iVar17 = local_57c[iVar18];
}
iVar10 = _DAT_0040b9d4;
if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
(iVar17 = ThreadGetCurrentId(), iVar10 == iVar17)) {
cVar11 = CVProfNode::ExitScope();
if (cVar11 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
if (local_594 != 0) {
(**(code **)(local_594 + 0x54))(local_594,local_59c,local_598,0,0,0);
}
return 1;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.