Begin implementing surface loading for CODO maps
This commit is contained in:
parent
fa18695898
commit
6dc46a4289
2
deps/fmt
vendored
2
deps/fmt
vendored
@ -1 +1 @@
|
||||
Subproject commit 0d25f6fcbbf0a867b939a5501965ee4462b21ee6
|
||||
Subproject commit 1fb0586b065c4202e976528a6bdc6384dc56dc04
|
2
deps/mongoose
vendored
2
deps/mongoose
vendored
@ -1 +1 @@
|
||||
Subproject commit 2a541175b56a1aeecd2dc8474f981923ef580af6
|
||||
Subproject commit d6dda04f4f00016e12618d0b55c972498e6249b5
|
2
deps/protobuf
vendored
2
deps/protobuf
vendored
@ -1 +1 @@
|
||||
Subproject commit 14e74f6a21f2726d25e0e679c59d569f6bc8fe8e
|
||||
Subproject commit 86fcd879b38505446799b2f2a2929415ddad620a
|
@ -56,6 +56,7 @@ namespace Components
|
||||
Loader::Register(new BitMessage());
|
||||
#endif
|
||||
Loader::Register(new FileSystem());
|
||||
Loader::Register(new ModelSurfs());
|
||||
Loader::Register(new PlayerName());
|
||||
Loader::Register(new QuickPatch());
|
||||
Loader::Register(new ServerInfo());
|
||||
|
@ -69,6 +69,7 @@ namespace Components
|
||||
#include "Modules\Singleton.hpp"
|
||||
#include "Modules\BitMessage.hpp"
|
||||
#include "Modules\FileSystem.hpp"
|
||||
#include "Modules\ModelSurfs.hpp"
|
||||
#include "Modules\PlayerName.hpp"
|
||||
#include "Modules\QuickPatch.hpp"
|
||||
#include "Modules\ServerInfo.hpp"
|
||||
|
124
src/Components/Modules/ModelSurfs.cpp
Normal file
124
src/Components/Modules/ModelSurfs.cpp
Normal file
@ -0,0 +1,124 @@
|
||||
#include "STDInclude.hpp"
|
||||
|
||||
namespace Components
|
||||
{
|
||||
std::map<void*, IUnknown*> ModelSurfs::BufferMap;
|
||||
|
||||
IUnknown* ModelSurfs::GetBuffer(void* buffer)
|
||||
{
|
||||
return ModelSurfs::BufferMap[buffer];
|
||||
}
|
||||
|
||||
void ModelSurfs::SetBuffer(char /*streamHandle*/, void* buffer, IUnknown** bufferOut, int* offsetOut)
|
||||
{
|
||||
*offsetOut;
|
||||
*bufferOut = ModelSurfs::BufferMap[buffer];
|
||||
}
|
||||
|
||||
void ModelSurfs::ReleaseModelSurf(Game::XAssetHeader header)
|
||||
{
|
||||
Game::XModelSurfs* surfaces = header.surfaces;
|
||||
|
||||
(surfaces);
|
||||
}
|
||||
|
||||
void ModelSurfs::BeginRecover()
|
||||
{
|
||||
for (auto& buffer : ModelSurfs::BufferMap)
|
||||
{
|
||||
buffer.second->Release();
|
||||
}
|
||||
|
||||
ModelSurfs::BufferMap.clear();
|
||||
}
|
||||
|
||||
void ModelSurfs::EndRecover()
|
||||
{
|
||||
Game::DB_EnumXAssets_Internal(Game::XAssetType::ASSET_TYPE_XMODELSURFS, [] (Game::XAssetHeader header, void* /*userdata*/)
|
||||
{
|
||||
Game::XModelSurfs* surfaces = header.surfaces;
|
||||
|
||||
// TODO: Recreate all buffers here
|
||||
(surfaces);
|
||||
}, nullptr, false);
|
||||
}
|
||||
|
||||
__declspec(naked) void ModelSurfs::GetIndexBufferStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, [esp + 4h]
|
||||
cmp al, 0FFh
|
||||
|
||||
jne returnSafe
|
||||
|
||||
jmp ModelSurfs::SetBuffer
|
||||
|
||||
returnSafe:
|
||||
movzx eax, [esp + 4h]
|
||||
mov edx, 4B4DE5h
|
||||
jmp edx
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void ModelSurfs::GetIndexBufferStub2()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, [esp + 4h]
|
||||
cmp al, 0FFh
|
||||
|
||||
jne returnSafe
|
||||
|
||||
mov eax, [edi + 0Ch]
|
||||
push eax
|
||||
call ModelSurfs::GetBuffer
|
||||
add esp, 4h
|
||||
retn
|
||||
|
||||
returnSafe:
|
||||
mov eax, 4FDC20h
|
||||
jmp eax
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void ModelSurfs::GetVertexBufferStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, [esp + 4h]
|
||||
cmp al, 0FFh
|
||||
|
||||
jne returnSafe
|
||||
|
||||
jmp ModelSurfs::SetBuffer
|
||||
|
||||
returnSafe:
|
||||
movzx eax, [esp + 4h]
|
||||
mov edx, 5BC055h
|
||||
jmp edx
|
||||
}
|
||||
}
|
||||
|
||||
ModelSurfs::ModelSurfs()
|
||||
{
|
||||
ModelSurfs::BufferMap.clear();
|
||||
|
||||
// Install release handler
|
||||
Game::DB_ReleaseXAssetHandlers[Game::XAssetType::ASSET_TYPE_XMODELSURFS] = ModelSurfs::ReleaseModelSurf;
|
||||
|
||||
// Install device recovery handlers
|
||||
Renderer::OnDeviceRecoveryBegin(ModelSurfs::BeginRecover);
|
||||
Renderer::OnDeviceRecoveryEnd(ModelSurfs::EndRecover);
|
||||
|
||||
// Install hooks
|
||||
Utils::Hook(0x5BC050, ModelSurfs::GetIndexBufferStub, HOOK_JUMP).Install()->Quick();
|
||||
Utils::Hook(0x558E70, ModelSurfs::GetIndexBufferStub2, HOOK_CALL).Install()->Quick();
|
||||
Utils::Hook(0x5BC050, ModelSurfs::GetVertexBufferStub, HOOK_JUMP).Install()->Quick();
|
||||
}
|
||||
|
||||
ModelSurfs::~ModelSurfs()
|
||||
{
|
||||
assert(ModelSurfs::BufferMap.empty());
|
||||
}
|
||||
}
|
25
src/Components/Modules/ModelSurfs.hpp
Normal file
25
src/Components/Modules/ModelSurfs.hpp
Normal file
@ -0,0 +1,25 @@
|
||||
namespace Components
|
||||
{
|
||||
class ModelSurfs : public Component
|
||||
{
|
||||
public:
|
||||
ModelSurfs();
|
||||
~ModelSurfs();
|
||||
|
||||
private:
|
||||
|
||||
static std::map<void*, IUnknown*> BufferMap;
|
||||
|
||||
static void ReleaseModelSurf(Game::XAssetHeader header);
|
||||
|
||||
static void BeginRecover();
|
||||
static void EndRecover();
|
||||
|
||||
static IUnknown* GetBuffer(void* buffer);
|
||||
static void SetBuffer(char streamHandle, void* buffer, IUnknown** bufferOut, int* offsetOut);
|
||||
|
||||
static void GetIndexBufferStub();
|
||||
static void GetIndexBufferStub2();
|
||||
static void GetVertexBufferStub();
|
||||
};
|
||||
}
|
@ -7,6 +7,9 @@ namespace Components
|
||||
wink::signal<wink::slot<Renderer::Callback>> Renderer::FrameOnceSignal;
|
||||
wink::signal<wink::slot<Renderer::BackendCallback>> Renderer::BackendFrameSignal;
|
||||
|
||||
wink::signal<wink::slot<Renderer::Callback>> Renderer::EndRecoverDeviceSignal;
|
||||
wink::signal<wink::slot<Renderer::Callback>> Renderer::BeginRecoverDeviceSignal;
|
||||
|
||||
__declspec(naked) void Renderer::FrameStub()
|
||||
{
|
||||
__asm
|
||||
@ -62,6 +65,16 @@ namespace Components
|
||||
Renderer::BackendFrameSignal.connect(callback);
|
||||
}
|
||||
|
||||
void Renderer::OnDeviceRecoveryEnd(Renderer::Callback* callback)
|
||||
{
|
||||
Renderer::EndRecoverDeviceSignal.connect(callback);
|
||||
}
|
||||
|
||||
void Renderer::OnDeviceRecoveryBegin(Renderer::Callback* callback)
|
||||
{
|
||||
Renderer::BeginRecoverDeviceSignal.connect(callback);
|
||||
}
|
||||
|
||||
int Renderer::Width()
|
||||
{
|
||||
return Utils::Hook::Get<int>(0x66E1C68);
|
||||
@ -106,6 +119,18 @@ namespace Components
|
||||
Renderer::DrawFrameHook.Initialize(0x5ACB99, Renderer::FrameStub, HOOK_CALL)->Install();
|
||||
|
||||
Utils::Hook(0x536A80, Renderer::BackendFrameStub, HOOK_JUMP).Install()->Quick();
|
||||
|
||||
Utils::Hook(0x508298, [] ()
|
||||
{
|
||||
Game::DB_BeginRecoverLostDevice();
|
||||
Renderer::BeginRecoverDeviceSignal();
|
||||
}, HOOK_CALL).Install()->Quick();
|
||||
|
||||
Utils::Hook(0x508355, [] ()
|
||||
{
|
||||
Renderer::EndRecoverDeviceSignal();
|
||||
Game::DB_EndRecoverLostDevice();
|
||||
}, HOOK_CALL).Install()->Quick();
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
@ -114,5 +139,8 @@ namespace Components
|
||||
Renderer::BackendFrameSignal.clear();
|
||||
Renderer::FrameOnceSignal.clear();
|
||||
Renderer::FrameSignal.clear();
|
||||
|
||||
Renderer::EndRecoverDeviceSignal.clear();
|
||||
Renderer::BeginRecoverDeviceSignal.clear();
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,9 @@ namespace Components
|
||||
static void OnFrame(Callback* callback);
|
||||
static void OnBackendFrame(BackendCallback* callback);
|
||||
|
||||
static void OnDeviceRecoveryEnd(Callback* callback);
|
||||
static void OnDeviceRecoveryBegin(Callback* callback);
|
||||
|
||||
private:
|
||||
static void FrameStub();
|
||||
static void FrameHandler();
|
||||
@ -29,6 +32,10 @@ namespace Components
|
||||
|
||||
static wink::signal<wink::slot<Callback>> FrameSignal;
|
||||
static wink::signal<wink::slot<Callback>> FrameOnceSignal;
|
||||
|
||||
static wink::signal<wink::slot<Callback>> EndRecoverDeviceSignal;
|
||||
static wink::signal<wink::slot<Callback>> BeginRecoverDeviceSignal;
|
||||
|
||||
static wink::signal<wink::slot<BackendCallback>> BackendFrameSignal;
|
||||
static Utils::Hook DrawFrameHook;
|
||||
};
|
||||
|
@ -31,6 +31,8 @@ namespace Game
|
||||
Con_DrawMiniConsole_t Con_DrawMiniConsole = (Con_DrawMiniConsole_t)0x464F30;
|
||||
Con_DrawSolidConsole_t Con_DrawSolidConsole = (Con_DrawSolidConsole_t)0x5A5040;
|
||||
|
||||
DB_BeginRecoverLostDevice_t DB_BeginRecoverLostDevice = (DB_BeginRecoverLostDevice_t)0x4BFF90;
|
||||
DB_EndRecoverLostDevice_t DB_EndRecoverLostDevice = (DB_EndRecoverLostDevice_t)0x46B660;
|
||||
DB_EnumXAssets_t DB_EnumXAssets = (DB_EnumXAssets_t)0x4B76D0;
|
||||
DB_EnumXAssets_Internal_t DB_EnumXAssets_Internal = (DB_EnumXAssets_Internal_t)0x5BB0A0;
|
||||
DB_FindXAssetHeader_t DB_FindXAssetHeader = (DB_FindXAssetHeader_t)0x407930;
|
||||
@ -40,6 +42,7 @@ namespace Game
|
||||
DB_IsXAssetDefault_t DB_IsXAssetDefault = (DB_IsXAssetDefault_t)0x48E6A0;
|
||||
DB_LoadXAssets_t DB_LoadXAssets = (DB_LoadXAssets_t)0x4E5930;
|
||||
DB_ReadXFileUncompressed_t DB_ReadXFileUncompressed = (DB_ReadXFileUncompressed_t)0x4705E0;
|
||||
DB_ReleaseXAssetHandler_t* DB_ReleaseXAssetHandlers = (DB_ReleaseXAssetHandler_t*)0x799AB8;
|
||||
|
||||
Dvar_RegisterBool_t Dvar_RegisterBool = (Dvar_RegisterBool_t)0x4CE1A0;
|
||||
Dvar_RegisterFloat_t Dvar_RegisterFloat = (Dvar_RegisterFloat_t)0x648440;
|
||||
|
@ -63,6 +63,12 @@ namespace Game
|
||||
typedef void (__cdecl * Con_DrawSolidConsole_t)();
|
||||
extern Con_DrawSolidConsole_t Con_DrawSolidConsole;
|
||||
|
||||
typedef void(__cdecl * DB_BeginRecoverLostDevice_t)();
|
||||
extern DB_BeginRecoverLostDevice_t DB_BeginRecoverLostDevice;
|
||||
|
||||
typedef void(__cdecl * DB_EndRecoverLostDevice_t)();
|
||||
extern DB_EndRecoverLostDevice_t DB_EndRecoverLostDevice;
|
||||
|
||||
typedef void(__cdecl * DB_EnumXAssets_t)(XAssetType type, void(*)(XAssetHeader, void *), void* userdata, bool overrides);
|
||||
extern DB_EnumXAssets_t DB_EnumXAssets;
|
||||
|
||||
@ -90,6 +96,9 @@ namespace Game
|
||||
typedef void(__cdecl * DB_ReadXFileUncompressed_t)(void* buffer, int size);
|
||||
extern DB_ReadXFileUncompressed_t DB_ReadXFileUncompressed;
|
||||
|
||||
typedef void(__cdecl * DB_ReleaseXAssetHandler_t)(XAssetHeader header);
|
||||
extern DB_ReleaseXAssetHandler_t* DB_ReleaseXAssetHandlers;
|
||||
|
||||
typedef dvar_t* (__cdecl * Dvar_RegisterBool_t)(const char* name, bool default, int flags, const char* description);
|
||||
extern Dvar_RegisterBool_t Dvar_RegisterBool;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user