Missing material error logging

This commit implements missing material error logging.
When a material does not exist, it will get replaced with an error material, we log which material is missing, and with which error material it gets replaced with.
This commit also comes with some updates regarding the CMaterialGlue class, and some new types used by this class from the RePak project.
This commit is contained in:
Kawe Mazidjatari 2022-10-13 02:22:50 +02:00
parent f16d538aee
commit 50fee7414d
15 changed files with 317 additions and 35 deletions

View File

@ -9,10 +9,9 @@
#include "public/avi/iavi.h"
#include "public/avi/ibik.h"
#include "public/const.h"
#include "public/imaterial.h"
#include "game/client/hud.h"
typedef void* IMaterial; // HACK
//-----------------------------------------------------------------------------
// Purpose: Sprite Models
//-----------------------------------------------------------------------------

View File

@ -1,26 +1,36 @@
#pragma once
#include "materialsystem/cshaderglue.h"
#include "public/imaterialinternal.h"
#include "public/materialsystem/shader_vcs_version.h"
#include "public/rendersystem/schema/texture.g.h"
struct CMaterialGlue_Unknown
{
__m128i unk1;
__m128i unk2;
__m128i unk3;
};
#pragma pack(push, 1) // Without this MSVC might get the idea to align our members to completely fuck the offsets up.
// [ PIXIE ]: The texture GUID's aren't in a specific order, gonna leave them as ptr's so an individual can check them in any memory searcher.
// [ PIXIE ]: Verification needed for earlier seasons, if the struct is the same.
class CMaterialGlue // [ PIXIE ]: Class seems mostly right, a few members are still missing though.
// [ PIXIE ]: Class seems mostly right, a few members are still missing though.
class CMaterialGlue : public IMaterialInternal
{
public:
void* m_pVTable; //0x0000
uint8_t pad_0008[8]; //0x0008
uint64_t m_GUID; //0x0010
const char* m_pszName; //0x0018
const char* m_pszSurfaceName1; //0x0020
const char* m_pszSurfaceName2; //0x0028
const char* m_pszSurfaceProp; //0x0020
const char* m_pszSurfaceProp2; //0x0028
CMaterialGlue* m_pDepthShadow; //0x0030
CMaterialGlue* m_pDepthPrepass; //0x0038
CMaterialGlue* m_pDepthVSM; //0x0040
CMaterialGlue* m_pDepthShadowTight; //0x0048
CMaterialGlue* m_pColPass; //0x0050
CShaderGlue* m_pShaderGlue; //0x0058
void* m_pTextureGUID; //0x0060
void* m_pStreamableTextures; //0x0068
TextureHeader_t** m_pTextureHandles; //0x0060
TextureHeader_t** m_pStreamableTextureHandles; //0x0068
int16_t m_nStreamableTextureCount; //0x0070
int16_t m_iWidth; //0x0072
int16_t m_iHeight; //0x0074
@ -29,12 +39,17 @@ public:
int32_t m_unused2; //0x007C
uint8_t pad_0080[8]; //0x0080
uint32_t m_iUnknownFlags1; //0x0088
char pad_008C[103]; //0x008C
uint8_t m_iUnknown1; //0x00F3
char pad_00F4[12]; //0x00F4
void* m_pDXBuffer; //0x0100 [ PIXIE ]: ID3D11Buffer*, might need to include dx here.
void* m_pDXBufferVTable; //0x0108 [ PIXIE ]: ID3D11BufferVtbl, probably just leave it as a void*
void* m_pUnknown2; //0x0110
char pad_008C[4]; //0x008C
CMaterialGlue_Unknown unk_sections[2];
_BYTE bytef0;
_BYTE bytef1;
_BYTE materialType;
_BYTE bytef3;
int dwordf4;
void* textureAnim;
void** m_pDXBuffer;
void** m_pID3D11BufferVTable;
void* m_pViewsBuffer;
uint32_t m_iUnknown3; //0x0118
uint16_t m_iUnknown4; //0x011C
uint16_t m_iUnknown5; //0x011E

View File

@ -113,12 +113,32 @@ bool IsMaterialInternal(void** pCandidate)
return false;
}
//-----------------------------------------------------------------------------
// Purpose: finds a material
// Input : *pMatSys -
// *pMaterialName -
// nMaterialType -
// nUnk -
// bComplain -
// Output : pointer to material
//-----------------------------------------------------------------------------
CMaterialGlue* CMaterialSystem::FindMaterialEx(CMaterialSystem* pMatSys, const char* pMaterialName, uint8_t nMaterialType, int nUnk, bool bComplain)
{
CMaterialGlue* pMaterial = CMaterialSystem__FindMaterialEx(pMatSys, pMaterialName, nMaterialType, nUnk, bComplain);
if (pMaterial->IsErrorMaterial())
{
Error(eDLL_T::MS, NO_ERROR, "Material \"%s\" not found; replacing with \"%s\".\n", pMaterialName, pMaterial->GetName());
}
return pMaterial;
}
///////////////////////////////////////////////////////////////////////////////
void CMaterialSystem_Attach()
{
#ifndef DEDICATED
DetourAttach((LPVOID*)&v_StreamDB_Init, &StreamDB_Init);
DetourAttach((LPVOID*)&v_DispatchDrawCall, &DispatchDrawCall);
DetourAttach((LPVOID*)&CMaterialSystem__FindMaterialEx, &CMaterialSystem::FindMaterialEx);
#endif // !DEDICATED
}
@ -127,5 +147,6 @@ void CMaterialSystem_Detach()
#ifndef DEDICATED
DetourDetach((LPVOID*)&v_StreamDB_Init, &StreamDB_Init);
DetourDetach((LPVOID*)&v_DispatchDrawCall, &DispatchDrawCall);
DetourDetach((LPVOID*)&CMaterialSystem__FindMaterialEx, &CMaterialSystem::FindMaterialEx);
#endif // !DEDICATED
}

View File

@ -1,14 +1,25 @@
#pragma once
#include "cmaterialglue.h"
#define STREAM_DB_EXT "stbsp"
class CMaterialSystem
{
public:
#ifndef DEDICATED
static CMaterialGlue* FindMaterialEx(CMaterialSystem* pMatSys, const char* pMaterialName, uint8_t nMaterialType, int nUnk, bool bComplain);
#endif // !DEDICATED
};
/* ==== MATERIALSYSTEM ================================================================================================================================================== */
inline CMemory p_CMaterialSystem__Init;
inline auto CMaterialSystem__Init = p_CMaterialSystem__Init.RCast<void* (*)(void* thisptr)>();
inline auto CMaterialSystem__Init = p_CMaterialSystem__Init.RCast<void* (*)(CMaterialSystem* thisptr)>();
inline void* g_pMaterialSystem = nullptr;
inline void* g_pMaterialVFTable = nullptr;
#ifndef DEDICATED
inline CMemory p_CMaterialSystem__FindMaterialEx;
inline auto CMaterialSystem__FindMaterialEx = p_CMaterialSystem__FindMaterialEx.RCast<CMaterialGlue* (*)(CMaterialSystem* pMatSys, const char* pMaterialName, uint8_t nMaterialType, int nUnk, bool bComplain)>();
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
inline CMemory p_DispatchDrawCall;
inline auto v_DispatchDrawCall = p_DispatchDrawCall.RCast<void* (*)(int64_t a1, uint64_t a2, int a3, int a4, char a5, int a6, uint8_t a7, int64_t a8, uint32_t a9, uint32_t a10, __m128* a11, int a12)>();
@ -50,8 +61,10 @@ class VMaterialSystem : public IDetour
virtual void GetFun(void) const
{
p_CMaterialSystem__Init = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x00\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x83\xEC\x70\x48\x83\x3D\x00\x00\x00\x00\x00"), "xxxx?xxxxxxxxxxxxxxxxxx?????");
CMaterialSystem__Init = p_CMaterialSystem__Init.RCast<void* (*)(void*)>(); /*48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 70 48 83 3D ?? ?? ?? ?? ??*/
CMaterialSystem__Init = p_CMaterialSystem__Init.RCast<void* (*)(CMaterialSystem*)>(); /*48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 70 48 83 3D ?? ?? ?? ?? ??*/
#ifndef DEDICATED
p_CMaterialSystem__FindMaterialEx = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x44\x89\x4C\x24\x00\x44\x88\x44\x24\x00\x48\x89\x4C\x24\x00"), "xxxx?xxxx?xxxx?");
CMaterialSystem__FindMaterialEx = p_CMaterialSystem__FindMaterialEx.RCast<CMaterialGlue* (*)(CMaterialSystem*, const char*, uint8_t, int, bool)>(); /*44 89 4C 24 ?? 44 88 44 24 ?? 48 89 4C 24 ??*/
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
p_DispatchDrawCall = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x44\x89\x4C\x24\x00\x44\x89\x44\x24\x00\x48\x89\x4C\x24\x00\x55\x53"), "xxxx?xxxx?xxxx?xx");
v_DispatchDrawCall = p_DispatchDrawCall.RCast<void* (*)(int64_t, uint64_t, int, int, char, int, uint8_t, int64_t, uint32_t, uint32_t, __m128*, int)>();

102
r5dev/public/imaterial.h Normal file
View File

@ -0,0 +1,102 @@
#ifndef IMATERIAL_H
#define IMATERIAL_H
abstract_class IMaterial
{
public:
virtual const char* GetName() const = 0;
virtual uint8_t GetMaterialType() const = 0;
virtual const char* GetNullString() const = 0;
virtual int64_t ReturnZero() const = 0;
virtual void* sub_1403B41A0(void* unk) = 0; // IDK
virtual int GetMappingWidth() const = 0;
virtual int GetMappingHeight() const = 0;
private:
//TODO! <-- most of these are bitwise and operators testing flags of the member CMaterialGlue::unkFlags.
// Don't call these without reversing/renaming first, as the const qualifier might have to be removed.
virtual void stub_0() const = 0;
virtual void stub_1() const = 0;
virtual void stub_2() const = 0;
virtual void stub_3() const = 0;
virtual void stub_4() const = 0;
virtual void stub_5() const = 0;
virtual void stub_6() const = 0;
virtual void stub_7() const = 0;
virtual void stub_8() const = 0;
virtual void stub_9() const = 0;
virtual void stub_10() const = 0;
virtual void stub_11() const = 0;
virtual void stub_12() const = 0;
virtual void stub_13() const = 0;
virtual void stub_14() const = 0;
virtual void stub_15() const = 0;
virtual void stub_16() const = 0;
virtual void stub_17() const = 0;
virtual void stub_18() const = 0;
virtual void stub_19() const = 0;
virtual void stub_20() const = 0;
virtual void stub_21() const = 0;
virtual void stub_22() const = 0;
virtual void stub_23() const = 0;
virtual void stub_24() const = 0;
virtual void stub_25() const = 0;
virtual void stub_26() const = 0;
virtual void stub_27() const = 0;
virtual void stub_28() const = 0;
virtual void stub_29() const = 0;
virtual void stub_30() const = 0;
virtual void stub_31() const = 0;
virtual void stub_32() const = 0;
virtual void stub_33() const = 0;
virtual void stub_34() const = 0;
virtual void stub_35() const = 0;
virtual void stub_36() const = 0;
virtual void stub_37() const = 0;
virtual void stub_38() const = 0;
virtual void stub_39() const = 0;
virtual void stub_40() const = 0;
virtual void stub_41() const = 0;
virtual void stub_42() const = 0;
virtual void stub_43() const = 0;
virtual void stub_44() const = 0;
virtual void stub_45() const = 0;
virtual void stub_46() const = 0;
virtual void stub_47() const = 0;
virtual void stub_48() const = 0;
virtual void stub_49() const = 0;
virtual void stub_50() const = 0;
virtual void stub_51() const = 0;
virtual void stub_52() const = 0;
virtual void stub_53() const = 0;
virtual void stub_54() const = 0;
virtual void stub_55() const = 0;
virtual void stub_56() const = 0;
virtual void stub_57() const = 0;
virtual void stub_58() const = 0;
virtual void stub_59() const = 0;
virtual void stub_60() const = 0;
virtual void stub_61() const = 0;
virtual void stub_62() const = 0;
virtual void stub_63() const = 0;
virtual void stub_64() const = 0;
virtual void stub_65() const = 0;
virtual void stub_66() const = 0;
virtual void stub_67() const = 0;
virtual void stub_68() const = 0;
virtual void stub_69() const = 0;
virtual void stub_70() const = 0;
virtual void stub_71() const = 0;
virtual void stub_72() const = 0;
virtual void stub_73() const = 0;
virtual void stub_74() const = 0;
virtual void stub_75() const = 0;
virtual void stub_76() const = 0;
virtual void stub_77() const = 0;
virtual void stub_78() const = 0;
};
#endif // IMATERIAL_H

View File

@ -0,0 +1,11 @@
#ifndef IMATERIALINTERNAL_H
#define IMATERIALINTERNAL_H
#include "imaterial.h"
abstract_class IMaterialInternal : public IMaterial
{
public:
virtual bool IsErrorMaterial() const = 0;
};
#endif // IMATERIALINTERNAL_H

View File

@ -0,0 +1,19 @@
#ifndef SHADER_VCS_VERSION_H
#define SHADER_VCS_VERSION_H
struct ShaderHeader_t
{
char* m_pszDebugName;
uint8_t m_byte1;
uint8_t m_byte2;
uint8_t m_byte3;
uint8_t m_byte4;
uint8_t m_byte5;
uint8_t m_byte6;
uint8_t m_byte7;
uint8_t m_byte8;
ID3D11DeviceChild** m_ppShader;
__int64* m_pUnk2;
};
#endif // SHADER_VCS_VERSION_H

View File

@ -0,0 +1,32 @@
#ifndef TEXTURE_G_H
#define TEXTURE_G_H
//-----------------------------------------------------------------------------
// Structure definitions
//-----------------------------------------------------------------------------
/*schema*/ struct TextureDesc_t
{
uint64_t m_AssetGuid;
const char* m_pDebugName;
uint16 m_nWidth;
uint16 m_nHeight;
uint16 m_nDepth;
uint16_t m_nImageFormat;
};
/*schema*/ struct TextureHeader_t : public TextureDesc_t
{
uint32_t m_nDataLength;
uint8_t unknown_2;
uint8_t m_nOptStreamedMipCount;
uint8_t m_nArraySize;
uint8_t m_nLayerCount;
uint8_t unknown_3;
uint8_t m_nPermanentMipCount;
uint8_t m_nStreamedMipCount;
uint8_t unknown_4[13];
__int64 m_nPixelCount;
char gap38[320];
};
#endif // !TEXTURE_G_H

View File

@ -114,6 +114,16 @@
#error
#endif
//////////////////////////////////////////////////////////////////////////
//#ifndef schema
//#define schema namespace ValveSchemaMarker {}
//#endif
//#define noschema
//#define schema_pragma( ... )
//#define META( ... )
//#define TYPEMETA( ... )
//-----------------------------------------------------------------------------
// Old-school defines we're going to support since much code uses them
//-----------------------------------------------------------------------------

View File

@ -257,7 +257,7 @@ void CLogSystem::DrawCrosshairMaterial(void) const
pMaterialGlue->m_pszName,
pMaterialGlue->m_GUID,
pMaterialGlue->m_iWidth, pMaterialGlue->m_iHeight,
pMaterialGlue->m_pszSurfaceName1, pMaterialGlue->m_pszSurfaceName2,
pMaterialGlue->m_pszSurfaceProp, pMaterialGlue->m_pszSurfaceProp2,
pMaterialGlue->m_nStreamableTextureCount,
pMaterialGlue->m_pShaderGlue->m_nTextureInputCount);

View File

@ -269,6 +269,8 @@
<ClInclude Include="..\public\iframetask.h" />
<ClInclude Include="..\public\igame.h" />
<ClInclude Include="..\public\ihandleentity.h" />
<ClInclude Include="..\public\imaterial.h" />
<ClInclude Include="..\public\imaterialinternal.h" />
<ClInclude Include="..\public\inetchannel.h" />
<ClInclude Include="..\public\inetmessage.h" />
<ClInclude Include="..\public\inetmsghandler.h" />
@ -276,7 +278,9 @@
<ClInclude Include="..\public\isurfacesystem.h" />
<ClInclude Include="..\public\ivrenderview.h" />
<ClInclude Include="..\public\ivscript.h" />
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h" />
<ClInclude Include="..\public\model_types.h" />
<ClInclude Include="..\public\rendersystem\schema\texture.g.h" />
<ClInclude Include="..\public\studio.h" />
<ClInclude Include="..\core\resource.h" />
<ClInclude Include="..\public\utility\binstream.h" />

View File

@ -223,6 +223,15 @@
<Filter Include="sdk\pluginsystem">
<UniqueIdentifier>{b22e88ea-1ee0-4431-82a4-e877a6798f23}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\rendersystem">
<UniqueIdentifier>{a254a718-eeec-434e-b3a3-77604c8f372e}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\rendersystem\schema">
<UniqueIdentifier>{a41c5a4b-d1a5-4b95-aa63-b61ca185a0a9}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\materialsystem">
<UniqueIdentifier>{565eefdf-15cf-47dc-a22b-0d3521e8c5c9}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\client\cdll_engine_int.cpp">
@ -1769,6 +1778,18 @@
<ClInclude Include="..\public\igame.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\imaterial.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\imaterialinternal.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\rendersystem\schema\texture.g.h">
<Filter>sdk\public\rendersystem\schema</Filter>
</ClInclude>
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h">
<Filter>sdk\public\materialsystem</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\shared\resource\lockedserver.png">

View File

@ -294,6 +294,8 @@
<ClInclude Include="..\public\iframetask.h" />
<ClInclude Include="..\public\igame.h" />
<ClInclude Include="..\public\ihandleentity.h" />
<ClInclude Include="..\public\imaterial.h" />
<ClInclude Include="..\public\imaterialinternal.h" />
<ClInclude Include="..\public\inetchannel.h" />
<ClInclude Include="..\public\inetmessage.h" />
<ClInclude Include="..\public\inetmsghandler.h" />
@ -302,7 +304,9 @@
<ClInclude Include="..\public\isurfacesystem.h" />
<ClInclude Include="..\public\ivrenderview.h" />
<ClInclude Include="..\public\ivscript.h" />
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h" />
<ClInclude Include="..\public\model_types.h" />
<ClInclude Include="..\public\rendersystem\schema\texture.g.h" />
<ClInclude Include="..\public\studio.h" />
<ClInclude Include="..\core\resource.h" />
<ClInclude Include="..\public\utility\binstream.h" />

View File

@ -232,6 +232,15 @@
<Filter Include="sdk\pluginsystem">
<UniqueIdentifier>{cd7b0538-e28c-4181-9e19-588f77d41d36}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\rendersystem">
<UniqueIdentifier>{993b2009-3b46-4ffd-8f09-4f2d6ff7691a}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\rendersystem\schema">
<UniqueIdentifier>{5bdaa309-3120-4e90-a824-41f7ef739225}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\materialsystem">
<UniqueIdentifier>{1718d302-db9b-4d2e-b666-cb9f2712eef4}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\client\vengineclient_impl.cpp">
@ -1856,6 +1865,18 @@
<ClInclude Include="..\public\igame.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\imaterial.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\imaterialinternal.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\rendersystem\schema\texture.g.h">
<Filter>sdk\public\rendersystem\schema</Filter>
</ClInclude>
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h">
<Filter>sdk\public\materialsystem</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\shared\resource\lockedserver.png">

View File

@ -799,9 +799,9 @@ void Mat_CrossHair_f(const CCommand& args)
DevMsg(eDLL_T::MS, "-+ Material --------------------------------------------------\n");
DevMsg(eDLL_T::MS, " |-- ADDR: '%llX'\n", material);
DevMsg(eDLL_T::MS, " |-- GUID: '%llX'\n", material->m_GUID);
DevMsg(eDLL_T::MS, " |-- Streamable Texture Count: '%d'\n", material->m_nStreamableTextureCount);
DevMsg(eDLL_T::MS, " |-- Material Width: '%d'\n", material->m_iWidth);
DevMsg(eDLL_T::MS, " |-- Material Height: '%d'\n", material->m_iHeight);
DevMsg(eDLL_T::MS, " |-- Streaming texture count: '%d'\n", material->m_nStreamableTextureCount);
DevMsg(eDLL_T::MS, " |-- Material width: '%d'\n", material->m_iWidth);
DevMsg(eDLL_T::MS, " |-- Material height: '%d'\n", material->m_iHeight);
DevMsg(eDLL_T::MS, " |-- Flags: '%llX'\n", material->m_iFlags);
std::function<void(CMaterialGlue*, const char*)> fnPrintChild = [](CMaterialGlue* material, const char* print)
@ -810,30 +810,40 @@ void Mat_CrossHair_f(const CCommand& args)
DevMsg(eDLL_T::MS, " | |-+ Child material ----------------------------------------\n");
DevMsg(eDLL_T::MS, print, material);
DevMsg(eDLL_T::MS, " | |-- GUID: '%llX'\n", material->m_GUID);
DevMsg(eDLL_T::MS, " | |-- Material Name: '%s'\n", material->m_pszName);
DevMsg(eDLL_T::MS, " | |-- Material name: '%s'\n", material->m_pszName);
};
DevMsg(eDLL_T::MS, " |-- Material Name: '%s'\n", material->m_pszName);
DevMsg(eDLL_T::MS, " |-- Material Surface Name 1: '%s'\n", material->m_pszSurfaceName1);
DevMsg(eDLL_T::MS, " |-- Material Surface Name 2: '%s'\n", material->m_pszSurfaceName2);
DevMsg(eDLL_T::MS, " |-- DX Buffer: '%llX'\n", material->m_pDXBuffer);
DevMsg(eDLL_T::MS, " |-- DX BufferVTable: '%llX'\n", material->m_pDXBufferVTable);
DevMsg(eDLL_T::MS, " |-- Material name: '%s'\n", material->m_pszName);
DevMsg(eDLL_T::MS, " |-- Material surface name 1: '%s'\n", material->m_pszSurfaceProp);
DevMsg(eDLL_T::MS, " |-- Material surface name 2: '%s'\n", material->m_pszSurfaceProp2);
DevMsg(eDLL_T::MS, " |-- DX buffer: '%llX'\n", material->m_pDXBuffer);
DevMsg(eDLL_T::MS, " |-- DX buffer VFTable: '%llX'\n", material->m_pID3D11BufferVTable);
material->m_pDepthShadow ? fnPrintChild(material->m_pDepthShadow, " | |-+ DepthShadow Addr: '%llX'\n") : DevMsg(eDLL_T::MS, " | |-+ DepthShadow Addr: 'NULL'\n");
material->m_pDepthPrepass ? fnPrintChild(material->m_pDepthPrepass, " | |-+ DepthPrepass Addr: '%llX'\n") : DevMsg(eDLL_T::MS, " | |-+ DepthPrepass Addr: 'NULL'\n");
material->m_pDepthVSM ? fnPrintChild(material->m_pDepthVSM, " | |-+ DepthVSM Addr: '%llX'\n") : DevMsg(eDLL_T::MS, " | |-+ DepthVSM Addr: 'NULL'\n");
material->m_pDepthShadow ? fnPrintChild(material->m_pDepthShadow, " | |-+ DepthShadowTight Addr: '%llX'\n") : DevMsg(eDLL_T::MS, " | |-+ DepthShadowTight Addr: 'NULL'\n");
material->m_pColPass ? fnPrintChild(material->m_pColPass, " | |-+ ColPass Addr: '%llX'\n") : DevMsg(eDLL_T::MS, " | |-+ ColPass Addr: 'NULL'\n");
material->m_pDepthShadow
? fnPrintChild(material->m_pDepthShadow, " | |-+ DepthShadow: '%llX'\n")
: DevMsg(eDLL_T::MS, " | |-+ DepthShadow: 'NULL'\n");
material->m_pDepthPrepass
? fnPrintChild(material->m_pDepthPrepass, " | |-+ DepthPrepass: '%llX'\n")
: DevMsg(eDLL_T::MS, " | |-+ DepthPrepass: 'NULL'\n");
material->m_pDepthVSM
? fnPrintChild(material->m_pDepthVSM, " | |-+ DepthVSM: '%llX'\n")
: DevMsg(eDLL_T::MS, " | |-+ DepthVSM: 'NULL'\n");
material->m_pDepthShadow
? fnPrintChild(material->m_pDepthShadow, " | |-+ DepthShadowTight: '%llX'\n")
: DevMsg(eDLL_T::MS, " | |-+ DepthShadowTight: 'NULL'\n");
material->m_pColPass
? fnPrintChild(material->m_pColPass, " | |-+ ColPass: '%llX'\n")
: DevMsg(eDLL_T::MS, " | |-+ ColPass: 'NULL'\n");
DevMsg(eDLL_T::MS, "-+ Texture GUID map ------------------------------------------\n");
material->m_pTextureGUID ? DevMsg(eDLL_T::MS, " |-- TextureMap 1 Addr: '%llX'\n", material->m_pTextureGUID) : DevMsg(eDLL_T::MS, " |-- TextureMap 1 Addr: 'NULL'\n");
material->m_pStreamableTextures ? DevMsg(eDLL_T::MS, " |-- TextureMap 2 Addr: '%llX'\n", material->m_pStreamableTextures) : DevMsg(eDLL_T::MS, " |-- TextureMap 2 Addr: 'NULL'\n");
DevMsg(eDLL_T::MS, " |-- Texture handles: '%llX'\n", material->m_pTextureHandles);
DevMsg(eDLL_T::MS, " |-- Streaming texture handles: '%llX'\n", material->m_pStreamableTextureHandles);
DevMsg(eDLL_T::MS, "--------------------------------------------------------------\n");
}
else
{
DevMsg(eDLL_T::MS, "%s - No Material found >:(\n", __FUNCTION__);
DevMsg(eDLL_T::MS, "%s - No material found >:(\n", __FUNCTION__);
}
}