CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay
0x001e1490 · 2139 bytes · __thiscall
_ZN10CVoxelTree37EnumerateElementsAlongRay_ExtrudedRayEiRK5Ray_tRK6VectorS5_P20IPartitionEnumerator
Decompiled
undefined (6 params)
/* CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay(int, Ray_t const&, Vector const&, Vector
const&, IPartitionEnumerator*) */
bool __thiscall
CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay
(CVoxelTree *this,int param_1,Ray_t *param_2,Vector *param_3,Vector *param_4,
IPartitionEnumerator *param_5)
{
float *pfVar1;
CVoxelHash *this_00;
bool bVar2;
char cVar3;
int *piVar4;
int iVar5;
int iVar6;
byte bVar7;
int iVar8;
uint uVar9;
uint uVar10;
uint uVar11;
float fVar12;
float fVar13;
uint local_1bc;
uint local_1a0;
uint local_19c;
uint local_18c;
int local_188;
int *local_180;
float local_178;
float local_174;
float local_170;
float local_16c;
float local_168;
float local_164;
int local_160 [3];
float local_154 [6];
float local_13c [3];
int aiStack_130 [6];
int aiStack_118 [3];
int local_10c [6];
int local_f4 [6];
int local_dc [6];
int local_c4 [6];
undefined4 local_ac;
CUtlHashFast<int,CUtlHashFastNoHash> local_a8 [72];
undefined4 local_60;
undefined4 local_5c;
undefined4 uStack_58;
undefined4 uStack_54;
undefined4 uStack_50;
undefined4 local_4c;
undefined4 uStack_48;
undefined4 uStack_44;
undefined4 uStack_40;
undefined4 local_3c;
undefined4 uStack_38;
undefined4 uStack_34;
undefined4 uStack_30;
undefined4 local_2c;
undefined4 uStack_28;
undefined4 uStack_24;
undefined4 uStack_20;
local_170 = *(float *)(param_2 + 8) - *(float *)(param_2 + 0x38);
local_16c = *(float *)param_2 + *(float *)(param_2 + 0x30);
local_178 = *(float *)param_2 - *(float *)(param_2 + 0x30);
local_174 = *(float *)(param_2 + 4) - *(float *)(param_2 + 0x34);
local_164 = *(float *)(param_2 + 8) + *(float *)(param_2 + 0x38);
pfVar1 = *(float **)(this + 8);
local_168 = *(float *)(param_2 + 4) + *(float *)(param_2 + 0x34);
bVar7 = SUB41(pfVar1[0x413],0) * '\x02' + 8;
local_10c[0] = (int)(local_178 - *pfVar1) >> (bVar7 & 0x1f);
local_10c[1] = (int)(local_174 - pfVar1[1]) >> (bVar7 & 0x1f);
local_10c[2] = (int)(local_170 - pfVar1[2]) >> (bVar7 & 0x1f);
local_10c[3] = (int)(local_16c - *pfVar1) >> (bVar7 & 0x1f);
local_10c[4] = (int)(local_168 - pfVar1[1]) >> (bVar7 & 0x1f);
local_10c[5] = (int)(local_164 - pfVar1[2]) >> (bVar7 & 0x1f);
CUtlHashFast<int,CUtlHashFastNoHash>::CUtlHashFast(local_a8);
piVar4 = (int *)___tls_get_addr();
local_ac = *(undefined4 *)(this + *piVar4 * 4 + 0x3c);
local_60 = *(undefined4 *)(this + 0x38);
local_5c = *(undefined4 *)param_2;
uStack_58 = *(undefined4 *)(param_2 + 4);
uStack_54 = *(undefined4 *)(param_2 + 8);
uStack_50 = *(undefined4 *)(param_2 + 0xc);
local_4c = *(undefined4 *)(param_2 + 0x10);
uStack_48 = *(undefined4 *)(param_2 + 0x14);
uStack_44 = *(undefined4 *)(param_2 + 0x18);
uStack_40 = *(undefined4 *)(param_2 + 0x1c);
local_3c = *(undefined4 *)param_3;
uStack_38 = *(undefined4 *)(param_3 + 4);
uStack_34 = *(undefined4 *)(param_3 + 8);
uStack_30 = *(undefined4 *)(param_3 + 0xc);
local_2c = *(undefined4 *)(param_2 + 0x30);
uStack_28 = *(undefined4 *)(param_2 + 0x34);
uStack_24 = *(undefined4 *)(param_2 + 0x38);
uStack_20 = *(undefined4 *)(param_2 + 0x3c);
local_180 = aiStack_130 + 0xc;
local_188 = 0;
if (0 < *(int *)(this + 4)) {
do {
bVar7 = (char)local_188 * '\x02';
local_1a0 = local_10c[0] >> (bVar7 & 0x1f);
local_180[-3] = local_1a0;
local_180[-2] = local_10c[1] >> (bVar7 & 0x1f);
local_180[-1] = local_10c[2] >> (bVar7 & 0x1f);
*local_180 = local_10c[3] >> (bVar7 & 0x1f);
local_180[1] = local_10c[4] >> (bVar7 & 0x1f);
local_180[2] = local_10c[5] >> (bVar7 & 0x1f);
if ((int)local_1a0 <= *local_180) {
local_1bc = local_1a0 & 0xffff;
do {
local_1bc = local_1bc & 0xffff07ff;
local_18c = local_180[-2];
local_19c = local_18c & 0xffff;
uVar10 = local_1bc;
if ((int)local_18c <= local_180[1]) {
do {
local_19c = local_19c & 0xffff07ff;
uVar10 = uVar10 & 0xffc007ff | local_19c << 0xb;
uVar11 = local_180[-1];
uVar9 = uVar11;
if ((int)uVar11 <= local_180[2]) {
do {
uVar10 = uVar10 & 0x3fffff | (uVar9 & 0xffff03ff) << 0x16;
/* try { // try from 001e175e to 001e1cb1 has its CatchHandler @ 001e1d07 */
bVar2 = CVoxelHash::EnumerateElementsInVoxel<CIntersectSweptBox>
((CVoxelHash *)(local_188 * 0x1050 + *(int *)(this + 8)),uVar10,
&local_ac,param_1,param_5);
if (!bVar2) goto LAB_001e1767;
uVar9 = (uVar9 & 0xffff03ff) + 1;
uVar11 = uVar11 + 1;
} while ((int)uVar11 <= local_180[2]);
}
local_18c = local_18c + 1;
local_19c = (uint)(ushort)((short)local_19c + 1);
} while ((int)local_18c <= local_180[1]);
}
local_1a0 = local_1a0 + 1;
local_1bc = (uint)(ushort)((short)local_1bc + 1);
} while ((int)local_1a0 <= *local_180);
}
local_188 = local_188 + 1;
local_180 = local_180 + 6;
} while (local_188 < *(int *)(this + 4));
}
this_00 = *(CVoxelHash **)(this + 8);
bVar7 = (char)*(undefined4 *)(this_00 + 0x104c) * '\x02' + 8;
if ((((((int)((*(float *)param_4 - *(float *)(param_2 + 0x30)) - *(float *)this_00) >>
(bVar7 & 0x1f) < local_10c[0]) ||
((int)((*(float *)(param_4 + 4) - *(float *)(param_2 + 0x34)) - *(float *)(this_00 + 4)) >>
(bVar7 & 0x1f) < local_10c[1])) ||
((int)((*(float *)(param_4 + 8) - *(float *)(param_2 + 0x38)) - *(float *)(this_00 + 8)) >>
(bVar7 & 0x1f) < local_10c[2])) ||
((local_10c[3] <
(int)((*(float *)param_4 + *(float *)(param_2 + 0x30)) - *(float *)this_00) >>
(bVar7 & 0x1f) ||
(local_10c[4] <
(int)((*(float *)(param_4 + 4) + *(float *)(param_2 + 0x34)) - *(float *)(this_00 + 4)) >>
(bVar7 & 0x1f))))) ||
(local_10c[5] <
(int)((*(float *)(param_4 + 8) + *(float *)(param_2 + 0x38)) - *(float *)(this_00 + 8)) >>
(bVar7 & 0x1f))) {
CVoxelHash::LeafListExtrudedRaySetup
(this_00,param_2,param_3,(Vector *)&local_178,(Vector *)&local_16c,aiStack_130 + 9,
aiStack_130 + 0xc,local_160,local_154 + 3,local_154,local_154 + 6);
iVar5 = 0;
do {
iVar6 = iVar5 + (uint)(0 < local_160[iVar5]) * 3;
aiStack_130[iVar5] = local_f4[iVar6];
iVar8 = local_c4[iVar6];
aiStack_130[iVar5 + 3] = local_dc[iVar6];
aiStack_130[iVar5 + 6] = iVar8;
iVar5 = iVar5 + 1;
} while (iVar5 != 3);
LAB_001e19b0:
if (local_154[0] < 1.0) goto LAB_001e19e3;
LAB_001e19d5:
if ((local_154[1] < 1.0) || (local_154[2] < 1.0)) {
LAB_001e19e3:
if (local_154[1] <= local_154[0]) goto LAB_001e1aa8;
do {
if (local_154[2] <= local_154[0]) goto LAB_001e1cf0;
iVar5 = 0;
fVar13 = local_154[0];
LAB_001e19fb:
if (local_154[4] <= local_154[3]) {
if (local_154[5] <= local_154[4]) goto LAB_001e1cc8;
iVar6 = 1;
fVar12 = local_154[4];
}
else if (local_154[5] <= local_154[3]) {
LAB_001e1cc8:
iVar6 = 2;
fVar12 = local_154[5];
}
else {
iVar6 = 0;
fVar12 = local_154[3];
}
if (fVar13 <= fVar12) {
local_154[iVar5] = fVar13 + local_154[iVar5 + 6];
uVar10 = (uint)(0 < local_160[iVar5]);
iVar6 = iVar5 + uVar10 * 3;
iVar8 = local_160[iVar5] + aiStack_130[iVar6 + 9];
aiStack_130[iVar6 + 9] = iVar8;
local_f4[iVar6] = iVar8 >> 2;
local_c4[iVar6] = iVar8 >> 6;
local_dc[iVar6] = iVar8 >> 4;
cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
(*(CVoxelHash **)(this + 8),param_1,param_5,
(CIntersectSweptBox *)&local_ac,aiStack_130 + 9,aiStack_130 + 0xc,iVar5
,local_160);
if (cVar3 != '\0') {
if (aiStack_130[iVar5] != aiStack_130[uVar10 * 3 + iVar5 + 0xf]) {
aiStack_130[iVar5] = aiStack_130[uVar10 * 3 + iVar5 + 0xf];
cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
((CVoxelHash *)(*(int *)(this + 8) + 0x1050),param_1,param_5,
(CIntersectSweptBox *)&local_ac,local_f4,local_f4 + 3,iVar5,
local_160);
if (cVar3 == '\0') goto LAB_001e1cba;
}
if (aiStack_130[iVar5 + 3] != aiStack_130[uVar10 * 3 + iVar5 + 0x15]) {
aiStack_130[iVar5 + 3] = aiStack_130[uVar10 * 3 + iVar5 + 0x15];
cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
((CVoxelHash *)(*(int *)(this + 8) + 0x20a0),param_1,param_5,
(CIntersectSweptBox *)&local_ac,local_dc,local_dc + 3,iVar5,
local_160);
if (cVar3 == '\0') goto LAB_001e1cba;
}
if (aiStack_130[iVar5 + 6] == aiStack_130[uVar10 * 3 + iVar5 + 0x1b]) goto LAB_001e19b0;
aiStack_130[iVar5 + 6] = aiStack_130[uVar10 * 3 + iVar5 + 0x1b];
cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
((CVoxelHash *)(*(int *)(this + 8) + 0x30f0),param_1,param_5,
(CIntersectSweptBox *)&local_ac,local_c4,local_c4 + 3,iVar5,local_160
);
if (cVar3 != '\0') goto LAB_001e19b0;
}
LAB_001e1cba:
bVar2 = false;
goto LAB_001e1767;
}
iVar5 = local_160[iVar6];
local_154[iVar6 + 3] = fVar12 + local_154[iVar6 + 6];
iVar6 = iVar6 + (uint)(iVar5 < 1) * 3;
iVar5 = iVar5 + aiStack_130[iVar6 + 9];
aiStack_130[iVar6 + 9] = iVar5;
local_f4[iVar6] = iVar5 >> 2;
local_c4[iVar6] = iVar5 >> 6;
local_dc[iVar6] = iVar5 >> 4;
if (1.0 <= local_154[0]) goto LAB_001e19d5;
} while (local_154[0] < local_154[1]);
LAB_001e1aa8:
if (local_154[2] <= local_154[1]) {
LAB_001e1cf0:
iVar5 = 2;
fVar13 = local_154[2];
}
else {
iVar5 = 1;
fVar13 = local_154[1];
}
goto LAB_001e19fb;
}
}
bVar2 = true;
LAB_001e1767:
CUtlHashFast<int,CUtlHashFastNoHash>::~CUtlHashFast(local_a8);
return bVar2;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.