CDispCollTree::AABBTree_BuildTreeTrisInSphere_r
0x000cc480 · 957 bytes · __thiscall
_ZN13CDispCollTree32AABBTree_BuildTreeTrisInSphere_rERK6VectorfiPtt
Decompiled
undefined (6 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CDispCollTree::AABBTree_BuildTreeTrisInSphere_r(Vector const&, float, int, unsigned short*,
unsigned short) */
int __thiscall
CDispCollTree::AABBTree_BuildTreeTrisInSphere_r
(CDispCollTree *this,Vector *param_1,float param_2,int param_3,ushort *param_4,
ushort param_5)
{
int iVar1;
float fVar2;
float fVar3;
float fVar4;
char cVar5;
float *pfVar6;
uint uVar7;
int iVar8;
int iVar9;
int iVar10;
int iVar11;
float fVar12;
undefined1 auVar13 [16];
undefined1 auVar14 [16];
undefined1 auVar15 [16];
undefined1 auVar16 [16];
undefined1 auVar17 [16];
undefined1 auVar18 [16];
undefined1 auVar19 [16];
undefined4 local_594;
undefined4 local_590;
undefined4 local_588;
undefined4 local_584;
int local_580;
int local_57c [347];
iVar10 = 0;
fVar12 = param_2 * param_2;
fVar2 = *(float *)param_1;
fVar3 = *(float *)(param_1 + 4);
fVar4 = *(float *)(param_1 + 8);
local_57c[0] = param_3;
iVar11 = *(int *)(this + 0x98);
iVar9 = 0;
while( true ) {
iVar1 = iVar9 + 1;
if (iVar11 <= param_3) {
local_594 = 0;
local_590 = 0;
if (_exit == 0) {
local_580 = 0;
}
else {
(**(code **)(_exit + 0x50))
(_exit,&local_594,0,0,0,0,"/data/src/engine/../public/dispcoll_common.cpp",0x2e6,
&AABBTree_BuildTreeTrisInSphere_r(Vector_const&,float,int,unsigned_short*,unsigned_short)
::tm_fmt,"(%s)%s","Unaccounted","Tris");
local_580 = _exit;
}
iVar11 = _DAT_0040b9d4;
local_588 = local_594;
local_584 = local_590;
/* try { // try from 000cc7eb to 000cc83d has its CatchHandler @ 000cc862 */
if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
(iVar8 = ThreadGetCurrentId(), iVar11 == iVar8)) {
if ((char *)*_DAT_0040b030 != "Tris") {
_DAT_0040b030 =
(int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a2913,&DAT_00000001,0x2a054b);
}
CVProfNode::EnterScope();
DAT_0040b02c = '\0';
}
if (iVar10 < iVar9) {
iVar11 = 0;
}
else {
iVar11 = 0;
while( true ) {
iVar8 = iVar1;
if (iVar11 + 1 < (int)(uint)param_5) {
iVar9 = local_57c[iVar9];
iVar1 = *(int *)(this + 0x98);
param_4[iVar11] = *(ushort *)(*(int *)(this + 0xa0) + (iVar9 - iVar1) * 4);
param_4[iVar11 + 1] = *(ushort *)(*(int *)(this + 0xa0) + 2 + (iVar9 - iVar1) * 4);
iVar11 = iVar11 + 2;
}
if (iVar8 == iVar10 + 1) break;
iVar1 = iVar8 + 1;
iVar9 = iVar8;
}
}
iVar9 = _DAT_0040b9d4;
if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
(iVar10 = ThreadGetCurrentId(), iVar9 == iVar10)) {
cVar5 = CVProfNode::ExitScope();
if (cVar5 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
if (local_580 == 0) {
/* WARNING: Read-only address (ram,0x002cf7b0) is written */
return iVar11;
}
(**(code **)(local_580 + 0x54))(local_580,local_588,local_584,0,0,0);
return iVar11;
}
pfVar6 = (float *)(param_3 * 0x60 + *(int *)(this + 0x90));
auVar17._0_4_ = *pfVar6 - fVar2;
auVar17._4_4_ = pfVar6[1] - fVar2;
auVar17._8_4_ = pfVar6[2] - fVar2;
auVar17._12_4_ = pfVar6[3] - fVar2;
auVar15._0_4_ = pfVar6[4] - fVar3;
auVar15._4_4_ = pfVar6[5] - fVar3;
auVar15._8_4_ = pfVar6[6] - fVar3;
auVar15._12_4_ = pfVar6[7] - fVar3;
auVar13._0_4_ = pfVar6[8] - fVar4;
auVar13._4_4_ = pfVar6[9] - fVar4;
auVar13._8_4_ = pfVar6[10] - fVar4;
auVar13._12_4_ = pfVar6[0xb] - fVar4;
auVar18 = maxps(auVar17,Four_Zeros);
auVar16 = maxps(auVar15,Four_Zeros);
auVar13 = maxps(auVar13,Four_Zeros);
auVar19._4_4_ = fVar2 - pfVar6[0xd];
auVar19._0_4_ = fVar2 - pfVar6[0xc];
auVar19._8_4_ = fVar2 - pfVar6[0xe];
auVar19._12_4_ = fVar2 - pfVar6[0xf];
auVar19 = maxps(auVar18,auVar19);
auVar18._4_4_ = fVar3 - pfVar6[0x11];
auVar18._0_4_ = fVar3 - pfVar6[0x10];
auVar18._8_4_ = fVar3 - pfVar6[0x12];
auVar18._12_4_ = fVar3 - pfVar6[0x13];
auVar18 = maxps(auVar16,auVar18);
auVar16._4_4_ = fVar4 - pfVar6[0x15];
auVar16._0_4_ = fVar4 - pfVar6[0x14];
auVar16._8_4_ = fVar4 - pfVar6[0x16];
auVar16._12_4_ = fVar4 - pfVar6[0x17];
auVar16 = maxps(auVar13,auVar16);
auVar14._4_4_ =
-(uint)(auVar16._4_4_ * auVar16._4_4_ +
auVar18._4_4_ * auVar18._4_4_ + auVar19._4_4_ * auVar19._4_4_ <= fVar12);
auVar14._0_4_ =
-(uint)(auVar16._0_4_ * auVar16._0_4_ +
auVar18._0_4_ * auVar18._0_4_ + auVar19._0_4_ * auVar19._0_4_ <= fVar12);
auVar14._8_4_ =
-(uint)(auVar16._8_4_ * auVar16._8_4_ +
auVar18._8_4_ * auVar18._8_4_ + auVar19._8_4_ * auVar19._8_4_ <= fVar12);
auVar14._12_4_ =
-(uint)(auVar16._12_4_ * auVar16._12_4_ +
auVar18._12_4_ * auVar18._12_4_ + auVar19._12_4_ * auVar19._12_4_ <= fVar12);
uVar7 = movmskps(pfVar6,auVar14);
if (uVar7 != 0) {
iVar9 = param_3 * 4;
if ((uVar7 & 1) != 0) {
iVar10 = iVar10 + 1;
local_57c[iVar10] = iVar9 + 1;
}
if ((uVar7 & 2) != 0) {
iVar10 = iVar10 + 1;
local_57c[iVar10] = iVar9 + 2;
}
if ((uVar7 & 4) != 0) {
iVar10 = iVar10 + 1;
local_57c[iVar10] = iVar9 + 3;
}
if ((uVar7 & 8) != 0) {
iVar10 = iVar10 + 1;
local_57c[iVar10] = iVar9 + 4;
}
}
if (iVar10 < iVar1) break;
param_3 = local_57c[iVar1];
iVar9 = iVar1;
}
return 0;
}
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.