BuildGammaTable
0x0026dec0 · 1113 bytes · __cdecl
_Z15BuildGammaTablefffi
Decompiled
undefined (4 params)
/* BuildGammaTable(float, float, float, int) */
void BuildGammaTable(float param_1,float param_2,float param_3,int param_4)
{
int iVar1;
undefined1 uVar2;
int iVar3;
int iVar4;
longdouble lVar5;
float fVar6;
float fVar7;
float fVar8;
float local_3c;
fVar8 = param_1;
if (3.0 <= param_1) {
fVar8 = 3.0;
}
local_3c = 0.125;
if (0.0 < param_3) {
local_3c = 0.05;
if (param_3 <= 1.0) {
local_3c = 0.125 - param_3 * param_3 * 0.075;
}
}
iVar3 = 0;
do {
lVar5 = (longdouble)
__pow_finite((double)((float)iVar3 * 0.003921569),(double)(param_2 * (1.0 / fVar8)));
uVar2 = 0;
iVar1 = (int)((double)lVar5 * 255.0);
if ((-1 < iVar1) && (uVar2 = (undefined1)iVar1, 0xff < iVar1)) {
uVar2 = 0xff;
}
(&texgammatable)[iVar3] = uVar2;
iVar3 = iVar3 + 1;
} while (iVar3 != 0x100);
iVar3 = 0;
do {
fVar6 = (float)iVar3 * 0.0009775171;
if (1.0 < param_3) {
fVar6 = fVar6 * param_3;
}
if (fVar6 <= local_3c) {
fVar6 = fVar6 * (1.0 / local_3c) * 0.125;
}
else {
fVar6 = (fVar6 - local_3c) * (1.0 / (1.0 - local_3c)) * 0.875 + 0.125;
}
lVar5 = (longdouble)__pow_finite((double)fVar6,(double)(1.0 / fVar8));
iVar1 = (int)((double)lVar5 * 255.0);
if (iVar1 < 0) {
iVar1 = 0;
}
else if (0xff < iVar1) {
iVar1 = 0xff;
}
(&lineartoscreen)[iVar3] = iVar1;
iVar3 = iVar3 + 1;
} while (iVar3 != 0x400);
iVar3 = 0;
fVar8 = 0.0;
fVar7 = 0.0;
fVar6 = 0.0;
while( true ) {
lVar5 = (longdouble)__pow_finite((double)(fVar7 * 0.003921569),(double)param_2);
*(float *)(g_Mathlib_LinearToGamma + iVar3 * 4) = fVar6;
*(float *)(g_Mathlib_GammaToLinear + iVar3 * 4) = fVar8;
*(float *)(texturetolinear + iVar3 * 4) = (float)lVar5;
iVar3 = iVar3 + 1;
if (iVar3 == 0x100) break;
fVar7 = (float)iVar3;
lVar5 = (longdouble)__pow_finite((double)(fVar7 * 0.003921569),0xc0000000,0x3fdd1745);
fVar6 = (float)lVar5;
lVar5 = (longdouble)__pow_finite((double)(fVar7 * 0.003921569),0xa0000000,0x40019999);
fVar8 = (float)lVar5;
}
iVar3 = 0;
do {
lVar5 = (longdouble)__pow_finite((double)iVar3 * 0.0009775171065493646,1.0 / (double)param_2);
(&lineartotexture)[iVar3] = (int)((double)lVar5 * 255.0);
iVar3 = iVar3 + 1;
} while (iVar3 != 0x400);
local_3c = 0.5;
if ((param_4 != 2) && (local_3c = 0.25, param_4 != 4)) {
local_3c = 1.0;
}
iVar3 = 0;
do {
lVar5 = (longdouble)__pow_finite((double)iVar3 * 0.0009765625,1.0 / (double)param_1);
fVar8 = (float)lVar5 * local_3c;
if (1.0 < fVar8) {
(&lineartovertex)[iVar3] = 0x3f800000;
}
else {
(&lineartovertex)[iVar3] = fVar8;
}
iVar1 = (int)ROUND(fVar8 * 255.0);
if (iVar1 < 0) {
iVar1 = 0;
}
if (0xff < iVar1) {
iVar1 = 0xff;
}
iVar4 = iVar3 + 1;
(&lineartolightmap)[iVar3] = (char)iVar1;
iVar3 = iVar4;
} while (iVar4 != 0x1000);
return;
}
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.