static model experiments [skip ci]
This commit is contained in:
parent
26c0243ba9
commit
ed6e71ff11
64
src/client/component/experimental.cpp
Normal file
64
src/client/component/experimental.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "dvars.hpp"
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
|
#include "game/game.hpp"
|
||||||
|
#include "game/dvars.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
namespace experimental
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const game::dvar_t* map_experiments = nullptr;
|
||||||
|
|
||||||
|
utils::hook::detour load_gfx_world_asset_hook;
|
||||||
|
|
||||||
|
void load_gfx_world_asset_stub(game::GfxWorld** gfx_world_ptr)
|
||||||
|
{
|
||||||
|
load_gfx_world_asset_hook.invoke<void>(gfx_world_ptr);
|
||||||
|
|
||||||
|
if (!map_experiments || !map_experiments->current.enabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto gfx_world = *gfx_world_ptr;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < gfx_world->dpvs.smodelCount; ++i)
|
||||||
|
{
|
||||||
|
if ((gfx_world->dpvs.smodelDrawInsts[i].flags & 64) != 0) // STATIC_MODEL_FLAG_LIGHTGRID_LIGHTING
|
||||||
|
{
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.colorFloat16[0] = 14340; // r: 0.4
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.colorFloat16[1] = 14340; // g: 0.4
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.colorFloat16[2] = 14340; // b: 0.4
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.colorFloat16[3] = 14340; // a: 0.4
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.a = 47280;
|
||||||
|
gfx_world->dpvs.smodelLighting[i].modelLightGridLightingInfo.b = 1.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
// modify GfxWorld to use static model lighting
|
||||||
|
load_gfx_world_asset_hook.create(0x39C460_b, load_gfx_world_asset_stub);
|
||||||
|
|
||||||
|
scheduler::once([]
|
||||||
|
{
|
||||||
|
map_experiments = dvars::register_bool("map_experiments", 0, 0x0, "Toggle experimental map settings");
|
||||||
|
}, scheduler::main);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
REGISTER_COMPONENT(experimental::component)
|
||||||
|
#endif
|
@ -3,6 +3,14 @@
|
|||||||
|
|
||||||
#define PROTOCOL 1
|
#define PROTOCOL 1
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define assert_sizeof(__ASSET__, __SIZE__) static_assert(sizeof(__ASSET__) == __SIZE__)
|
||||||
|
#define assert_offsetof(__ASSET__, __VARIABLE__, __OFFSET__) static_assert(offsetof(__ASSET__, __VARIABLE__) == __OFFSET__)
|
||||||
|
#else
|
||||||
|
#define assert_sizeof(__ASSET__, __SIZE__)
|
||||||
|
#define assert_offsetof(__ASSET__, __VARIABLE__, __OFFSET__)
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
typedef float vec_t;
|
typedef float vec_t;
|
||||||
@ -2036,6 +2044,274 @@ namespace game
|
|||||||
mp::playerState_s* mp;
|
mp::playerState_s* mp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GfxWorldDpvsPlanes
|
||||||
|
{
|
||||||
|
int cellCount;
|
||||||
|
void* planes;
|
||||||
|
unsigned short* nodes;
|
||||||
|
unsigned int* sceneEntCellBits;
|
||||||
|
}; assert_sizeof(GfxWorldDpvsPlanes, 32);
|
||||||
|
|
||||||
|
struct sunflare_t
|
||||||
|
{
|
||||||
|
bool hasValidData;
|
||||||
|
Material* spriteMaterial;
|
||||||
|
Material* flareMaterial;
|
||||||
|
float spriteSize;
|
||||||
|
float flareMinSize;
|
||||||
|
float flareMinDot;
|
||||||
|
float flareMaxSize;
|
||||||
|
float flareMaxDot;
|
||||||
|
float flareMaxAlpha;
|
||||||
|
int flareFadeInTime;
|
||||||
|
int flareFadeOutTime;
|
||||||
|
float blindMinDot;
|
||||||
|
float blindMaxDot;
|
||||||
|
float blindMaxDarken;
|
||||||
|
int blindFadeInTime;
|
||||||
|
int blindFadeOutTime;
|
||||||
|
float glareMinDot;
|
||||||
|
float glareMaxDot;
|
||||||
|
float glareMaxLighten;
|
||||||
|
int glareFadeInTime;
|
||||||
|
int glareFadeOutTime;
|
||||||
|
float sunFxPosition[3];
|
||||||
|
}; assert_sizeof(sunflare_t, 112);
|
||||||
|
|
||||||
|
typedef void* umbraTomePtr_t;
|
||||||
|
|
||||||
|
struct GfxBuildInfo
|
||||||
|
{
|
||||||
|
const char* args0;
|
||||||
|
const char* args1;
|
||||||
|
const char* buildStartTime;
|
||||||
|
const char* buildEndTime;
|
||||||
|
}; assert_sizeof(GfxBuildInfo, 32);
|
||||||
|
|
||||||
|
struct GfxStaticModelDrawInst
|
||||||
|
{
|
||||||
|
char __pad0[56];
|
||||||
|
XModel* __ptr64 model;
|
||||||
|
unsigned short cullDist;
|
||||||
|
unsigned short flags;
|
||||||
|
unsigned short lightingHandle;
|
||||||
|
unsigned short staticModelId;
|
||||||
|
unsigned short primaryLightEnvIndex;
|
||||||
|
short unk0;
|
||||||
|
char unk1; // lod related
|
||||||
|
unsigned char reflectionProbeIndex;
|
||||||
|
unsigned char firstMtlSkinIndex;
|
||||||
|
unsigned char sunShadowFlags;
|
||||||
|
}; assert_sizeof(GfxStaticModelDrawInst, 80);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, model, 56);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, cullDist, 64);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, flags, 66);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, lightingHandle, 68);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, primaryLightEnvIndex, 72);
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, reflectionProbeIndex, 77); // maybe wrong
|
||||||
|
assert_offsetof(GfxStaticModelDrawInst, firstMtlSkinIndex, 78);
|
||||||
|
|
||||||
|
struct GfxStaticModelVertexLighting
|
||||||
|
{
|
||||||
|
unsigned char visibility[4];
|
||||||
|
unsigned short ambientColorFloat16[4];
|
||||||
|
unsigned short highlightColorFloat16[4];
|
||||||
|
}; assert_sizeof(GfxStaticModelVertexLighting, 20);
|
||||||
|
|
||||||
|
struct GfxStaticModelVertexLightingInfo
|
||||||
|
{
|
||||||
|
GfxStaticModelVertexLighting* lightingValues;
|
||||||
|
ID3D11Buffer* lightingValuesVb;
|
||||||
|
int numLightingValues;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GfxStaticModelLightmapInfo
|
||||||
|
{
|
||||||
|
float offset[2];
|
||||||
|
float scale[2];
|
||||||
|
unsigned int lightmapIndex;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GfxStaticModelGroundLightingInfo
|
||||||
|
{
|
||||||
|
unsigned short groundLighting[4]; // float16
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GfxStaticModelLightGridLightingInfo
|
||||||
|
{
|
||||||
|
unsigned short colorFloat16[4];
|
||||||
|
int a;
|
||||||
|
float b;
|
||||||
|
char __pad1[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
union GfxStaticModelLighting
|
||||||
|
{
|
||||||
|
GfxStaticModelVertexLightingInfo vertexLightingInfo;
|
||||||
|
GfxStaticModelLightmapInfo modelLightmapInfo;
|
||||||
|
GfxStaticModelGroundLightingInfo modelGroundLightingInfo;
|
||||||
|
GfxStaticModelLightGridLightingInfo modelLightGridLightingInfo;
|
||||||
|
}; assert_sizeof(GfxStaticModelLighting, 24);
|
||||||
|
|
||||||
|
struct GfxWorldDpvsStatic
|
||||||
|
{
|
||||||
|
unsigned int smodelCount; // 0
|
||||||
|
unsigned int subdivVertexLightingInfoCount; // 4
|
||||||
|
unsigned int staticSurfaceCount; // 8
|
||||||
|
unsigned int litOpaqueSurfsBegin; // 12
|
||||||
|
unsigned int litOpaqueSurfsEnd; // 16
|
||||||
|
unsigned int unkSurfsBegin;
|
||||||
|
unsigned int unkSurfsEnd;
|
||||||
|
unsigned int litDecalSurfsBegin; // 28
|
||||||
|
unsigned int litDecalSurfsEnd; // 32
|
||||||
|
unsigned int litTransSurfsBegin; // 36
|
||||||
|
unsigned int litTransSurfsEnd; // 40
|
||||||
|
unsigned int shadowCasterSurfsBegin; // 44
|
||||||
|
unsigned int shadowCasterSurfsEnd; // 48
|
||||||
|
unsigned int emissiveSurfsBegin; // 52
|
||||||
|
unsigned int emissiveSurfsEnd; // 56
|
||||||
|
unsigned int smodelVisDataCount; // 60
|
||||||
|
unsigned int surfaceVisDataCount; // 64
|
||||||
|
unsigned int* smodelVisData[4]; // 72 80 88 96
|
||||||
|
unsigned int* smodelUnknownVisData[27];
|
||||||
|
unsigned int* surfaceVisData[4]; // 320 328 336 344
|
||||||
|
unsigned int* surfaceUnknownVisData[27];
|
||||||
|
unsigned int* smodelUmbraVisData[4]; // 568 576 584 592
|
||||||
|
unsigned int* surfaceUmbraVisData[4]; // 600 608 616 624
|
||||||
|
unsigned int* lodData; // 632
|
||||||
|
unsigned int* tessellationCutoffVisData; // 640
|
||||||
|
unsigned int* sortedSurfIndex; // 648
|
||||||
|
void* smodelInsts; // 656
|
||||||
|
void* surfaces; // 664
|
||||||
|
void* surfacesBounds; // 672
|
||||||
|
GfxStaticModelDrawInst* smodelDrawInsts; // 680
|
||||||
|
unsigned int* unknownSModelVisData1; // 688
|
||||||
|
unsigned int* unknownSModelVisData2; // 696
|
||||||
|
GfxStaticModelLighting* smodelLighting; // 704 (array)
|
||||||
|
void* subdivVertexLighting; // 712 (array)
|
||||||
|
GfxDrawSurf* surfaceMaterials; // 720
|
||||||
|
unsigned int* surfaceCastsSunShadow; // 728
|
||||||
|
unsigned int sunShadowOptCount; // 736
|
||||||
|
unsigned int sunSurfVisDataCount; // 740
|
||||||
|
unsigned int* surfaceCastsSunShadowOpt; // 744
|
||||||
|
void* surfaceDeptAndSurf; // 752
|
||||||
|
void* constantBuffersLit; // 760
|
||||||
|
void* constantBuffersAmbient; // 768
|
||||||
|
int usageCount; // 776
|
||||||
|
}; assert_sizeof(GfxWorldDpvsStatic, 784);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, smodelVisData[0], 72);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, surfaceVisData[0], 320);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, smodelUmbraVisData[0], 568);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, tessellationCutoffVisData, 640);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, smodelDrawInsts, 680);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, smodelLighting, 704);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, sunSurfVisDataCount, 740);
|
||||||
|
assert_offsetof(GfxWorldDpvsStatic, constantBuffersAmbient, 768);
|
||||||
|
|
||||||
|
struct GfxWorld
|
||||||
|
{
|
||||||
|
const char* name; // 0
|
||||||
|
const char* baseName; // 8
|
||||||
|
unsigned int bspVersion; // 16
|
||||||
|
int planeCount; // 20
|
||||||
|
int nodeCount; // 24
|
||||||
|
unsigned int surfaceCount; // 28
|
||||||
|
int skyCount; // 32
|
||||||
|
void* skies; // 40
|
||||||
|
unsigned int portalGroupCount; // 48
|
||||||
|
unsigned int lastSunPrimaryLightIndex; // 52
|
||||||
|
unsigned int primaryLightCount; // 56
|
||||||
|
unsigned int primaryLightEnvCount; // 60
|
||||||
|
unsigned int sortKeyLitDecal; // 64
|
||||||
|
unsigned int sortKeyEffectDecal; // 68
|
||||||
|
unsigned int sortKeyTopDecal; // 72
|
||||||
|
unsigned int sortKeyEffectAuto; // 76
|
||||||
|
unsigned int sortKeyDistortion; // 80
|
||||||
|
unsigned int sortKeyUnknown; // 84
|
||||||
|
unsigned int sortKeyUnknown2; // 88
|
||||||
|
char __pad0[4]; // 92
|
||||||
|
GfxWorldDpvsPlanes dpvsPlanes; // 96
|
||||||
|
void* aabbTreeCounts; // 128
|
||||||
|
void* aabbTrees; // 136
|
||||||
|
void* cells; // 144
|
||||||
|
void* portalGroup; // 152
|
||||||
|
int unk_vec4_count_0; // 160
|
||||||
|
char __pad1[4];
|
||||||
|
vec4_t* unk_vec4_0; // 168
|
||||||
|
|
||||||
|
//GfxWorldDraw draw; // 176
|
||||||
|
//GfxLightGrid lightGrid; // 432
|
||||||
|
char __pad2[1336]; // 176
|
||||||
|
|
||||||
|
int modelCount; // 1512
|
||||||
|
void* models; // 1520
|
||||||
|
vec3_t mins1;
|
||||||
|
vec3_t maxs1;
|
||||||
|
vec3_t mins2;
|
||||||
|
vec3_t maxs2;
|
||||||
|
unsigned int checksum;
|
||||||
|
int materialMemoryCount; // 1580
|
||||||
|
void* materialMemory; // 1584
|
||||||
|
sunflare_t sun; // 1592
|
||||||
|
float outdoorLookupMatrix[4][4];
|
||||||
|
GfxImage* outdoorImage; // 1768
|
||||||
|
unsigned int* cellCasterBits; // 1776
|
||||||
|
unsigned int* cellHasSunLitSurfsBits; // 1784
|
||||||
|
void* sceneDynModel; // 1792
|
||||||
|
void* sceneDynBrush; // 1800
|
||||||
|
unsigned int* primaryLightEntityShadowVis; // 1808
|
||||||
|
unsigned int* primaryLightDynEntShadowVis[2]; // 1816 1824
|
||||||
|
unsigned short* nonSunPrimaryLightForModelDynEnt; // 1832
|
||||||
|
void* shadowGeom; // 1840
|
||||||
|
void* shadowGeomOptimized; // 1848
|
||||||
|
void* lightRegion; // 1856
|
||||||
|
|
||||||
|
GfxWorldDpvsStatic dpvs; // 1864
|
||||||
|
//GfxWorldDpvsDynamic dpvsDyn; // 2648
|
||||||
|
char __pad3[96]; // 2648
|
||||||
|
|
||||||
|
unsigned int mapVtxChecksum; // 2744
|
||||||
|
unsigned int heroOnlyLightCount; // 2748
|
||||||
|
void* heroOnlyLights; // 2752
|
||||||
|
unsigned char fogTypesAllowed; // 2760
|
||||||
|
unsigned int umbraTomeSize; // 2764
|
||||||
|
char* umbraTomeData; // 2768
|
||||||
|
umbraTomePtr_t umbraTomePtr; // 2776
|
||||||
|
unsigned int mdaoVolumesCount; // 2784
|
||||||
|
void* mdaoVolumes; // 2792
|
||||||
|
char __pad4[32];
|
||||||
|
GfxBuildInfo buildInfo; // 2832
|
||||||
|
}; assert_sizeof(GfxWorld, 0xB30);
|
||||||
|
assert_offsetof(GfxWorld, skyCount, 32);
|
||||||
|
assert_offsetof(GfxWorld, skies, 40);
|
||||||
|
assert_offsetof(GfxWorld, dpvsPlanes, 96);
|
||||||
|
assert_offsetof(GfxWorld, aabbTreeCounts, 128);
|
||||||
|
assert_offsetof(GfxWorld, cells, 144);
|
||||||
|
assert_offsetof(GfxWorld, portalGroup, 152);
|
||||||
|
assert_offsetof(GfxWorld, unk_vec4_count_0, 160);
|
||||||
|
assert_offsetof(GfxWorld, unk_vec4_0, 168);
|
||||||
|
assert_offsetof(GfxWorld, __pad2, 176);
|
||||||
|
//assert_offsetof(GfxWorld, lightGrid, 432);
|
||||||
|
assert_offsetof(GfxWorld, modelCount, 1512);
|
||||||
|
assert_offsetof(GfxWorld, models, 1520);
|
||||||
|
assert_offsetof(GfxWorld, materialMemoryCount, 1580);
|
||||||
|
assert_offsetof(GfxWorld, materialMemory, 1584);
|
||||||
|
assert_offsetof(GfxWorld, sun, 1592);
|
||||||
|
assert_offsetof(GfxWorld, outdoorImage, 1768);
|
||||||
|
assert_offsetof(GfxWorld, cellCasterBits, 1776);
|
||||||
|
assert_offsetof(GfxWorld, cellHasSunLitSurfsBits, 1784);
|
||||||
|
assert_offsetof(GfxWorld, dpvs, 1864);
|
||||||
|
assert_offsetof(GfxWorld, __pad3, 2648);
|
||||||
|
assert_offsetof(GfxWorld, heroOnlyLightCount, 2748);
|
||||||
|
assert_offsetof(GfxWorld, heroOnlyLights, 2752);
|
||||||
|
assert_offsetof(GfxWorld, umbraTomeSize, 2764);
|
||||||
|
assert_offsetof(GfxWorld, umbraTomeData, 2768);
|
||||||
|
assert_offsetof(GfxWorld, umbraTomePtr, 2776);
|
||||||
|
assert_offsetof(GfxWorld, mdaoVolumesCount, 2784);
|
||||||
|
assert_offsetof(GfxWorld, mdaoVolumes, 2792);
|
||||||
|
assert_offsetof(GfxWorld, mdaoVolumes, 2792);
|
||||||
|
assert_offsetof(GfxWorld, buildInfo, 2832);
|
||||||
|
|
||||||
namespace hks
|
namespace hks
|
||||||
{
|
{
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
|
Loading…
Reference in New Issue
Block a user