diff --git a/r5dev/core/init.cpp b/r5dev/core/init.cpp index f4e0f616..6c134d1a 100644 --- a/r5dev/core/init.cpp +++ b/r5dev/core/init.cpp @@ -433,10 +433,9 @@ void DetourRegister() // Register detour classes to be searched and hooked. // StaticPropMgr REGISTER(VStaticPropMgr); +#ifndef DEDICATED // MaterialSystem REGISTER(VMaterialSystem); - -#ifndef DEDICATED REGISTER(VMaterialGlue); REGISTER(VShaderGlue); diff --git a/r5dev/materialsystem/cmaterialsystem.h b/r5dev/materialsystem/cmaterialsystem.h index d0bea309..fbb2691a 100644 --- a/r5dev/materialsystem/cmaterialsystem.h +++ b/r5dev/materialsystem/cmaterialsystem.h @@ -33,6 +33,9 @@ inline auto v_DispatchDrawCall = p_DispatchDrawCall.RCast(); #endif +inline CMemory p_GetStreamOverlay; +inline auto v_GetStreamOverlay = p_GetStreamOverlay.RCast(); + inline CMemory p_DrawStreamOverlay; inline auto v_DrawStreamOverlay = p_DrawStreamOverlay.RCast(); @@ -54,6 +57,7 @@ class VMaterialSystem : public IDetour LogFunAdr("CMaterialSystem::FindMaterialEx", p_CMaterialSystem__FindMaterialEx.GetPtr()); LogFunAdr("CMaterialSystem::GetScreenSize", p_CMaterialSystem_GetScreenSize.GetPtr()); LogFunAdr("CMaterialSystem::DispatchDrawCall", p_DispatchDrawCall.GetPtr()); + LogFunAdr("CMaterialSystem::GetStreamOverlay", p_GetStreamOverlay.GetPtr()); LogFunAdr("CMaterialSystem::DrawStreamOverlay", p_DrawStreamOverlay.GetPtr()); LogVarAdr("g_nTotalStreamingTextureMemory", reinterpret_cast(g_nTotalStreamingTextureMemory)); LogVarAdr("g_nUnfreeStreamingTextureMemory", reinterpret_cast(g_nUnfreeStreamingTextureMemory)); @@ -79,6 +83,9 @@ class VMaterialSystem : public IDetour p_DispatchDrawCall = g_GameDll.FindPatternSIMD("44 89 4C 24 ?? 44 89 44 24 ?? 48 89 4C 24 ?? 55 53 56"); v_DispatchDrawCall = p_DispatchDrawCall.RCast(); #endif + p_GetStreamOverlay = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 80 7C 24 ?? ?? 0F 84 ?? ?? ?? ?? 48 89 9C 24 ?? ?? ?? ??").FollowNearCallSelf(); + v_GetStreamOverlay = p_GetStreamOverlay.RCast(); /*E8 ? ? ? ? 80 7C 24 ? ? 0F 84 ? ? ? ? 48 89 9C 24 ? ? ? ?*/ + p_DrawStreamOverlay = g_GameDll.FindPatternSIMD("41 56 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 2B E0 C6 02 ??"); v_DrawStreamOverlay = p_DrawStreamOverlay.RCast(); // 41 56 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 2B E0 C6 02 00 // #endif // !DEDICATED diff --git a/r5dev/rtech/rtech_utils.cpp b/r5dev/rtech/rtech_utils.cpp index c74823f7..f6eca39f 100644 --- a/r5dev/rtech/rtech_utils.cpp +++ b/r5dev/rtech/rtech_utils.cpp @@ -484,109 +484,6 @@ LABEL_69: return result; } -#if !defined(DEDICATED) - -#pragma warning( push ) -// Disable stack warning, tells us to move more data to the heap instead. Not really possible with 'initialData' here. Since its parallel processed. -// Also disable 6378, complains that there is no control path where it would use 'nullptr', if that happens 'Error' will be called though. -#pragma warning( disable : 6262 6387) -constexpr uint32_t ALIGNMENT_SIZE = 15; // Used by the game in CreateDXTexture. -//---------------------------------------------------------------------------------- -// Purpose: creates 2D texture and shader resource from textureHeader and imageData. -//---------------------------------------------------------------------------------- -void RTech::CreateDXTexture(TextureHeader_t* textureHeader, int64_t imageData) -{ - if (textureHeader->m_nDepth && !textureHeader->m_nHeight) // Return never gets hit. Maybe its some debug check? - return; - - __int64 initialData[4096]{}; - textureHeader->m_nTextureMipLevels = textureHeader->m_nPermanentMipCount; - - const int totalStreamedMips = textureHeader->m_nOptStreamedMipCount + textureHeader->m_nStreamedMipCount; - int mipLevel = textureHeader->m_nPermanentMipCount + totalStreamedMips; - if (mipLevel != totalStreamedMips) - { - do - { - --mipLevel; - if (textureHeader->m_nArraySize) - { - int mipWidth = 0; - if (textureHeader->m_nWidth >> mipLevel > 1) - mipWidth = (textureHeader->m_nWidth >> mipLevel) - 1; - - int mipHeight = 0; - if (textureHeader->m_nHeight >> mipLevel > 1) - mipHeight = (textureHeader->m_nHeight >> mipLevel) - 1; - - uint8_t x = s_pBytesPerPixel[textureHeader->m_nImageFormat].first; - uint8_t y = s_pBytesPerPixel[textureHeader->m_nImageFormat].second; - - uint32_t bppWidth = (y + mipWidth) >> (y >> 1); - uint32_t bppHeight = (y + mipHeight) >> (y >> 1); - uint32_t sliceWidth = x * (y >> (y >> 1)); - - uint32_t rowPitch = sliceWidth * bppWidth; - uint32_t slicePitch = x * bppWidth * bppHeight; - - uint32_t subResourceEntry = mipLevel; - for (int i = 0; i < textureHeader->m_nArraySize; i++) - { - uint32_t offsetCurrentResourceData = subResourceEntry << 4u; - - *(int64_t*)((uint8_t*)initialData + offsetCurrentResourceData) = imageData; - *(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData) = rowPitch; - *(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData + 4) = slicePitch; - - imageData += (slicePitch + ALIGNMENT_SIZE) & ~ALIGNMENT_SIZE; - subResourceEntry += textureHeader->m_nPermanentMipCount; - } - } - } while (mipLevel != totalStreamedMips); - } - - const DXGI_FORMAT dxgiFormat = g_TxtrAssetToDxgiFormat[textureHeader->m_nImageFormat]; // Get dxgi format - - D3D11_TEXTURE2D_DESC textureDesc{}; - textureDesc.Width = textureHeader->m_nWidth >> mipLevel; - textureDesc.Height = textureHeader->m_nHeight >> mipLevel; - textureDesc.MipLevels = textureHeader->m_nPermanentMipCount; - textureDesc.ArraySize = textureHeader->m_nArraySize; - textureDesc.Format = dxgiFormat; - textureDesc.SampleDesc.Count = 1; - textureDesc.SampleDesc.Quality = 0; - textureDesc.Usage = textureHeader->m_nCPUAccessFlag != 2 ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT; - textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - textureDesc.MiscFlags = 0; - - const uint32_t offsetStartResourceData = mipLevel << 4u; - const D3D11_SUBRESOURCE_DATA* subResData = (D3D11_SUBRESOURCE_DATA*)((uint8_t*)initialData + offsetStartResourceData); - const HRESULT createTextureRes = (*g_ppGameDevice)->CreateTexture2D(&textureDesc, subResData, &textureHeader->m_ppTexture); - if (createTextureRes < S_OK) - Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createTextureRes); - - D3D11_SHADER_RESOURCE_VIEW_DESC shaderResource{}; - shaderResource.Format = dxgiFormat; - shaderResource.Texture2D.MipLevels = textureHeader->m_nTextureMipLevels; - if (textureHeader->m_nArraySize > 1) // Do we have a texture array? - { - shaderResource.Texture2DArray.FirstArraySlice = 0; - shaderResource.Texture2DArray.ArraySize = textureHeader->m_nArraySize; - shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY; - } - else - { - shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D; - } - - const HRESULT createShaderResourceRes = (*g_ppGameDevice)->CreateShaderResourceView(textureHeader->m_ppTexture, &shaderResource, &textureHeader->m_ppShaderResourceView); - if (createShaderResourceRes < S_OK) - Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create shader resource view for texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createShaderResourceRes); -} -#pragma warning( pop ) -#endif - -#ifndef DEDICATED //---------------------------------------------------------------------------------- // Purpose: start loading shader sets, assign vftable pointer //---------------------------------------------------------------------------------- @@ -595,7 +492,6 @@ void** RTech::LoadShaderSet(void** VTablePtr) *VTablePtr = &g_pShaderGlueVFTable; return &g_pShaderGlueVFTable; } -#endif //---------------------------------------------------------------------------------- // Purpose: open a file and add it to m_FileHandles. @@ -811,10 +707,6 @@ void V_RTechUtils::Attach() const #ifdef GAMEDLL_S3 DetourAttach(&RTech_Pak_ProcessGuidRelationsForAsset, &RTech::PakProcessGuidRelationsForAsset); #endif - -#if !defined (DEDICATED) && defined (GAMEDLL_S3) - DetourAttach(&RTech_CreateDXTexture, &RTech::CreateDXTexture); -#endif // !DEDICATED } void V_RTechUtils::Detach() const @@ -824,10 +716,6 @@ void V_RTechUtils::Detach() const #ifdef GAMEDLL_S3 DetourDetach(&RTech_Pak_ProcessGuidRelationsForAsset, &RTech::PakProcessGuidRelationsForAsset); #endif - -#if !defined (DEDICATED) && defined (GAMEDLL_S3) - DetourDetach(&RTech_CreateDXTexture, &RTech::CreateDXTexture); -#endif // !DEDICATED } /////////////////////////////////////////////////////////////////////////////// diff --git a/r5dev/rtech/rtech_utils.h b/r5dev/rtech/rtech_utils.h index d48855eb..d96fd35a 100644 --- a/r5dev/rtech/rtech_utils.h +++ b/r5dev/rtech/rtech_utils.h @@ -2,9 +2,7 @@ #include "tier0/jobthread.h" #include "vpklib/packedstore.h" #include "rtech/rtech_game.h" -#ifndef DEDICATED #include "public/rendersystem/schema/texture.g.h" -#endif // !DEDICATED #define PAK_MAX_TYPES 64 #define PAK_PARAM_SIZE 0xB0 @@ -376,14 +374,6 @@ static_assert(sizeof(RPakDecompState_t) == 136); static_assert(sizeof(RPakPatchCompressedHeader_t) == 16); /* ==== RTECH =========================================================================================================================================================== */ -#if !defined (DEDICATED) -inline CMemory p_RTech_CreateDXTexture; -inline auto RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast(); - -inline CMemory p_GetStreamOverlay; -inline auto GetStreamOverlay = p_GetStreamOverlay.RCast(); -#endif - // [ PIXIE ]: I'm very unsure about this, but it really seems like it inline CMemory p_RTech_FindFreeSlotInFiles; inline auto RTech_FindFreeSlotInFiles = p_RTech_FindFreeSlotInFiles.RCast(); @@ -431,10 +421,7 @@ public: static void PakProcessGuidRelationsForAsset(PakFile_t* pak, RPakAssetEntry_t* asset); #endif // GAMEDLL_S3 -#if !defined (DEDICATED) - static void CreateDXTexture(TextureHeader_t* textureHeader, int64_t cpuArg); void** LoadShaderSet(void** VTablePtr); -#endif // !DEDICATED }; /////////////////////////////////////////////////////////////////////////////// @@ -445,14 +432,9 @@ class V_RTechUtils : public IDetour { virtual void GetAdr(void) const { -#if !defined (DEDICATED) - LogFunAdr("RTech::CreateDXTexture", p_RTech_CreateDXTexture.GetPtr()); -#endif // !DEDICATED LogFunAdr("RTech::FindFreeSlotInFiles", p_RTech_FindFreeSlotInFiles.GetPtr()); LogFunAdr("RTech::OpenFile", p_RTech_OpenFile.GetPtr()); -#if !defined (DEDICATED) - LogFunAdr("GetStreamOverlay", p_GetStreamOverlay.GetPtr()); -#endif // !DEDICATED + LogFunAdr("StreamDB_Init", p_StreamDB_Init.GetPtr()); LogVarAdr("s_FileArray", reinterpret_cast(s_pFileArray)); LogVarAdr("s_FileArrayMutex", reinterpret_cast(s_pFileArrayMutex)); @@ -471,17 +453,6 @@ class V_RTechUtils : public IDetour } virtual void GetFun(void) const { -#if !defined (DEDICATED) -#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) - p_RTech_CreateDXTexture = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 53 55 41 55"); - RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast(); /*48 8B C4 48 89 48 08 53 55 41 55*/ -#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3) - p_RTech_CreateDXTexture = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60").FollowNearCallSelf(); - RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast(); /*E8 ? ? ? ? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60*/ -#endif - p_GetStreamOverlay = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 80 7C 24 ?? ?? 0F 84 ?? ?? ?? ?? 48 89 9C 24 ?? ?? ?? ??").FollowNearCallSelf(); - GetStreamOverlay = p_GetStreamOverlay.RCast(); /*E8 ? ? ? ? 80 7C 24 ? ? 0F 84 ? ? ? ? 48 89 9C 24 ? ? ? ?*/ -#endif // !DEDICATED p_StreamDB_Init = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 54 41 56 41 57 48 83 EC 40 48 8B E9"); v_StreamDB_Init = p_StreamDB_Init.RCast(); /*48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 54 41 56 41 57 48 83 EC 40 48 8B E9*/ diff --git a/r5dev/vgui/vgui_debugpanel.cpp b/r5dev/vgui/vgui_debugpanel.cpp index 5da52aeb..99e76259 100644 --- a/r5dev/vgui/vgui_debugpanel.cpp +++ b/r5dev/vgui/vgui_debugpanel.cpp @@ -247,7 +247,7 @@ void CTextOverlay::DrawStreamOverlay(void) const static char szLogbuf[4096]; static const Color c = { 255, 255, 255, 255 }; - GetStreamOverlay(stream_overlay_mode->GetString(), szLogbuf, sizeof(szLogbuf)); + v_GetStreamOverlay(stream_overlay_mode->GetString(), szLogbuf, sizeof(szLogbuf)); CMatSystemSurface_DrawColoredText(g_pMatSystemSurface, v_Rui_GetFontFace(), m_nFontHeight, 20, 300, c.r(), c.g(), c.b(), c.a(), "%s", szLogbuf); } diff --git a/r5dev/windows/id3dx.cpp b/r5dev/windows/id3dx.cpp index 9f2fc977..b3771552 100644 --- a/r5dev/windows/id3dx.cpp +++ b/r5dev/windows/id3dx.cpp @@ -11,6 +11,7 @@ #include "engine/sys_mainwind.h" #include "inputsystem/inputsystem.h" #include "public/bitmap/stb_image.h" +#include "public/rendersystem/schema/texture.g.h" /********************************************************************************** ----------------------------------------------------------------------------------- @@ -151,6 +152,102 @@ HRESULT __stdcall ResizeBuffers(IDXGISwapChain* pSwapChain, UINT nBufferCount, U // INTERNALS //################################################################################# +#pragma warning( push ) +// Disable stack warning, tells us to move more data to the heap instead. Not really possible with 'initialData' here. Since its parallel processed. +// Also disable 6378, complains that there is no control path where it would use 'nullptr', if that happens 'Error' will be called though. +#pragma warning( disable : 6262 6387) +constexpr uint32_t ALIGNMENT_SIZE = 15; // Creates 2D texture and shader resource from textureHeader and imageData. +void CreateTextureResource(TextureHeader_t* textureHeader, int64_t imageData) +{ + if (textureHeader->m_nDepth && !textureHeader->m_nHeight) // Return never gets hit. Maybe its some debug check? + return; + + __int64 initialData[4096]{}; + textureHeader->m_nTextureMipLevels = textureHeader->m_nPermanentMipCount; + + const int totalStreamedMips = textureHeader->m_nOptStreamedMipCount + textureHeader->m_nStreamedMipCount; + int mipLevel = textureHeader->m_nPermanentMipCount + totalStreamedMips; + if (mipLevel != totalStreamedMips) + { + do + { + --mipLevel; + if (textureHeader->m_nArraySize) + { + int mipWidth = 0; + if (textureHeader->m_nWidth >> mipLevel > 1) + mipWidth = (textureHeader->m_nWidth >> mipLevel) - 1; + + int mipHeight = 0; + if (textureHeader->m_nHeight >> mipLevel > 1) + mipHeight = (textureHeader->m_nHeight >> mipLevel) - 1; + + uint8_t x = s_pBytesPerPixel[textureHeader->m_nImageFormat].first; + uint8_t y = s_pBytesPerPixel[textureHeader->m_nImageFormat].second; + + uint32_t bppWidth = (y + mipWidth) >> (y >> 1); + uint32_t bppHeight = (y + mipHeight) >> (y >> 1); + uint32_t sliceWidth = x * (y >> (y >> 1)); + + uint32_t rowPitch = sliceWidth * bppWidth; + uint32_t slicePitch = x * bppWidth * bppHeight; + + uint32_t subResourceEntry = mipLevel; + for (int i = 0; i < textureHeader->m_nArraySize; i++) + { + uint32_t offsetCurrentResourceData = subResourceEntry << 4u; + + *(int64_t*)((uint8_t*)initialData + offsetCurrentResourceData) = imageData; + *(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData) = rowPitch; + *(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData + 4) = slicePitch; + + imageData += (slicePitch + ALIGNMENT_SIZE) & ~ALIGNMENT_SIZE; + subResourceEntry += textureHeader->m_nPermanentMipCount; + } + } + } while (mipLevel != totalStreamedMips); + } + + const DXGI_FORMAT dxgiFormat = g_TxtrAssetToDxgiFormat[textureHeader->m_nImageFormat]; // Get dxgi format + + D3D11_TEXTURE2D_DESC textureDesc{}; + textureDesc.Width = textureHeader->m_nWidth >> mipLevel; + textureDesc.Height = textureHeader->m_nHeight >> mipLevel; + textureDesc.MipLevels = textureHeader->m_nPermanentMipCount; + textureDesc.ArraySize = textureHeader->m_nArraySize; + textureDesc.Format = dxgiFormat; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Usage = textureHeader->m_nCPUAccessFlag != 2 ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT; + textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + textureDesc.MiscFlags = 0; + + const uint32_t offsetStartResourceData = mipLevel << 4u; + const D3D11_SUBRESOURCE_DATA* subResData = (D3D11_SUBRESOURCE_DATA*)((uint8_t*)initialData + offsetStartResourceData); + const HRESULT createTextureRes = (*g_ppGameDevice)->CreateTexture2D(&textureDesc, subResData, &textureHeader->m_ppTexture); + if (createTextureRes < S_OK) + Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createTextureRes); + + D3D11_SHADER_RESOURCE_VIEW_DESC shaderResource{}; + shaderResource.Format = dxgiFormat; + shaderResource.Texture2D.MipLevels = textureHeader->m_nTextureMipLevels; + if (textureHeader->m_nArraySize > 1) // Do we have a texture array? + { + shaderResource.Texture2DArray.FirstArraySlice = 0; + shaderResource.Texture2DArray.ArraySize = textureHeader->m_nArraySize; + shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY; + } + else + { + shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D; + } + + const HRESULT createShaderResourceRes = (*g_ppGameDevice)->CreateShaderResourceView(textureHeader->m_ppTexture, &shaderResource, &textureHeader->m_ppShaderResourceView); + if (createShaderResourceRes < S_OK) + Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create shader resource view for texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createShaderResourceRes); +} +#pragma warning( pop ) + bool LoadTextureBuffer(unsigned char* buffer, int len, ID3D11ShaderResourceView** out_srv, int* out_width, int* out_height) { // Load PNG buffer to a raw RGBA buffer @@ -295,11 +392,23 @@ void VDXGI::GetAdr(void) const { /////////////////////////////////////////////////////////////////////////////// LogFunAdr("IDXGISwapChain::Present", reinterpret_cast(s_fnSwapChainPresent)); + LogFunAdr("CreateTextureResource", p_CreateTextureResource.GetPtr()); LogVarAdr("g_pSwapChain", reinterpret_cast(g_ppSwapChain)); LogVarAdr("g_pGameDevice", reinterpret_cast(g_ppGameDevice)); LogVarAdr("g_pImmediateContext", reinterpret_cast(g_ppImmediateContext)); } +void VDXGI::GetFun(void) const +{ +#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) + p_CreateTextureResource = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 53 55 41 55"); + v_CreateTextureResource = p_CreateTextureResource.RCast(); /*48 8B C4 48 89 48 08 53 55 41 55*/ +#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3) + p_CreateTextureResource = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60").FollowNearCallSelf(); + v_CreateTextureResource = p_CreateTextureResource.RCast(); /*E8 ? ? ? ? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60*/ +#endif +} + void VDXGI::GetVar(void) const { #if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) @@ -316,4 +425,18 @@ void VDXGI::GetVar(void) const g_ppSwapChain = pBase.FindPattern("48 8B 0D").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); } +void VDXGI::Attach(void) const +{ +#ifdef GAMEDLL_S3 + DetourAttach(&v_CreateTextureResource, &CreateTextureResource); +#endif // GAMEDLL_S3 +} + +void VDXGI::Detach(void) const +{ +#ifdef GAMEDLL_S3 + DetourDetach(&v_CreateTextureResource, &CreateTextureResource); +#endif // GAMEDLL_S3 +} + #endif // !DEDICATED diff --git a/r5dev/windows/id3dx.h b/r5dev/windows/id3dx.h index 82ab2c65..bdb6a8c0 100644 --- a/r5dev/windows/id3dx.h +++ b/r5dev/windows/id3dx.h @@ -10,7 +10,7 @@ void DirectX_Shutdown(); extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); extern HRESULT __stdcall Present(IDXGISwapChain* pSwapChain, UINT nSyncInterval, UINT nFlags); -//extern bool LoadTextureBuffer(unsigned char* image_data, const int& image_width, const int& image_height, ID3D11ShaderResourceView** out_srv); +extern void CreateTextureResource(TextureHeader_t* textureHeader, int64_t imageData); extern bool LoadTextureBuffer(unsigned char* buffer, int len, ID3D11ShaderResourceView** out_srv, int* out_width, int* out_height); extern void ResetInput(); @@ -21,6 +21,9 @@ extern bool PanelsVisible(); typedef HRESULT(__stdcall* IDXGISwapChainPresent)(IDXGISwapChain* pSwapChain, UINT nSyncInterval, UINT nFlags); typedef HRESULT(__stdcall* IDXGIResizeBuffers) (IDXGISwapChain* pSwapChain, UINT nBufferCount, UINT nWidth, UINT nHeight, DXGI_FORMAT dxFormat, UINT nSwapChainFlags); +inline CMemory p_CreateTextureResource; +inline auto v_CreateTextureResource = p_CreateTextureResource.RCast(); + ///////////////////////////////////////////////////////////////////////////// // Globals inline UINT g_nWindowRect[2]; @@ -117,8 +120,8 @@ class VDXGI : public IDetour virtual void GetFun(void) const { } virtual void GetVar(void) const; virtual void GetCon(void) const { } - virtual void Attach(void) const { } - virtual void Detach(void) const { } + virtual void Attach(void) const; + virtual void Detach(void) const; /////////////////////////////////////////////////////////////////////////////// }; #endif // !BUILDING_LIBIMGUI