Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
fc3170e
refactor render item manager
Pirulax May 25, 2020
7b6c523
Add constexpr to SharedUtil.ClaslIdent.h
Pirulax May 25, 2020
15be692
add static keyword to g_rectEdgePixelsData
Pirulax May 26, 2020
84fed9b
refactor CGraphics::DrawStringOutline
Pirulax May 26, 2020
3d5cd49
refactor CGraphics::CheckModes
Pirulax May 26, 2020
c7177e2
refactor CGraphics::GetDXTextExtentW
Pirulax May 26, 2020
54bfd13
CGraphics::GetTrailingSpacesWidth
Pirulax May 26, 2020
dfab03d
refactor CGraphics::IsValidPrimitiveSize
Pirulax May 26, 2020
2a2c54e
refactor CGraphics::LoadStandardDXFonts
Pirulax May 26, 2020
995b236
refactor CGraphics::DrawQueue
Pirulax May 26, 2020
e5c31e3
refactor CGraphics::ClearDrawQueue
Pirulax May 26, 2020
93010b1
refactor CGraphics::ResizeTextureData
Pirulax May 26, 2020
a27c4fc
refactor CGaphics::CreateSphereFaces
Pirulax May 26, 2020
cbeac86
refactor Cgraphics::GetSphereWireModel
Pirulax May 26, 2020
bfdeb28
other small refactors in CGraphics
Pirulax May 26, 2020
0bb8f09
refactor CVector.h to use constexpr
Pirulax May 26, 2020
67289ec
refactor CVector2D to use constexpr
Pirulax May 26, 2020
1171387
refactor CVector2D to use constexpr
Pirulax May 26, 2020
ee8fc8e
change SColor constructor to use member init list
Pirulax May 26, 2020
e5eeca2
Revert "refactor render item manager"
Pirulax May 26, 2020
a86646b
Revert "Revert "refactor render item manager""
Pirulax May 26, 2020
21cf600
Fix typo in NoifyDestructRenderItem
Pirulax May 26, 2020
33e551d
fix formatting for for loop
Pirulax May 26, 2020
8b88eac
Fix indentation in ResizeTextureData
Pirulax May 26, 2020
bbf5a38
refactor CVector4D
Pirulax May 26, 2020
9045fe0
refactor CVector2D
Pirulax May 26, 2020
1084b4d
refactor CVector
Pirulax May 26, 2020
a434d39
Restore removed if check in, and do some cleanup in ::CheckModes
Pirulax May 26, 2020
df84b07
Fix indentation in for loop in GetTrailingSpacesWidth
Pirulax May 26, 2020
79412f6
Change space counting loop to be more readable
Pirulax May 29, 2020
88322b5
CrenderItemManager apply ccw's assert sugg, also revert changes at 1044
Pirulax May 29, 2020
caa193f
apply changes to CVector4D, also add comment that DotProduct is retur…
Pirulax May 29, 2020
b060c22
Apply changes to CVector: declare x, y, z on separate lines
Pirulax May 29, 2020
0ff0813
Apply changes to CVector2D: declare x, y on separate lines
Pirulax May 29, 2020
0831dd9
Modify DrawCircleQueued as suggested(logical error), also make it use…
Pirulax May 29, 2020
f9e5928
Refactor AddQueueItem to CreateQueueItem, and make it use emplace_bac…
Pirulax May 29, 2020
db4d80b
remove static from g rectEdgePixelsData
Pirulax May 29, 2020
63a270b
Add PrimitiveVertice constructor, emplace_back using arguments in CGr…
Pirulax May 29, 2020
defbe69
fix MaybeGetBigFont incorrectly modifying scaleX twice
Pirulax May 29, 2020
4df6019
Fix NotifyDe/ContructRenderItem incorrect assertion expressions
Pirulax May 29, 2020
f459433
Fix incorrect usage of constexpr for Cvector4d:operator==
Pirulax May 29, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
567 changes: 301 additions & 266 deletions Client/core/Graphics/CGraphics.cpp

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Client/core/Graphics/CGraphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ class CGraphics : public CGraphicsInterface, public CSingleton<CGraphics>
std::vector<sDrawQueueItem> m_PostGUIQueue;

void AddQueueItem(const sDrawQueueItem& Item, bool bPostGUI);
sDrawQueueItem& CreateQueueItem(const bool bPostGUI);
void DrawQueueItem(const sDrawQueueItem& Item);
void DrawQueue(std::vector<sDrawQueueItem>& Queue);
void ClearDrawQueue(std::vector<sDrawQueueItem>& Queue);
Expand Down
100 changes: 54 additions & 46 deletions Client/core/Graphics/CRenderItemManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,8 @@ CGuiFontItem* CRenderItemManager::CreateGuiFont(const SString& strFullFilePath,
////////////////////////////////////////////////////////////////
void CRenderItemManager::NotifyContructRenderItem(CRenderItem* pItem)
{
assert(!MapContains(m_CreatedItemList, pItem));
MapInsert(m_CreatedItemList, pItem);
const bool wasInserted = m_CreatedItemList.insert(pItem).second;
assert(wasInserted); // assert if item was already in the collection(and thus we didnt insert this)

if (CScreenSourceItem* pScreenSourceItem = DynamicCast<CScreenSourceItem>(pItem))
m_bBackBufferCopyMaybeNeedsResize = true;
Expand All @@ -328,8 +328,8 @@ void CRenderItemManager::NotifyContructRenderItem(CRenderItem* pItem)
////////////////////////////////////////////////////////////////
void CRenderItemManager::NotifyDestructRenderItem(CRenderItem* pItem)
{
assert(MapContains(m_CreatedItemList, pItem));
MapRemove(m_CreatedItemList, pItem);
const auto deletedCount = m_CreatedItemList.erase(pItem);
assert(deletedCount == 1); // it must be in the collection exactly once

if (CScreenSourceItem* pScreenSourceItem = DynamicCast<CScreenSourceItem>(pItem))
m_bBackBufferCopyMaybeNeedsResize = true;
Expand Down Expand Up @@ -453,9 +453,9 @@ void CRenderItemManager::UpdateBackBufferCopySize()
// Set what the max size requirement is for the back buffer copy
uint uiSizeX = 0;
uint uiSizeY = 0;
for (std::set<CRenderItem*>::iterator iter = m_CreatedItemList.begin(); iter != m_CreatedItemList.end(); iter++)
for (const auto item : m_CreatedItemList)
{
if (CScreenSourceItem* pScreenSourceItem = DynamicCast<CScreenSourceItem>(*iter))
if (CScreenSourceItem* pScreenSourceItem = DynamicCast<CScreenSourceItem>(item))
{
uiSizeX = std::max(uiSizeX, pScreenSourceItem->m_uiSizeX);
uiSizeY = std::max(uiSizeY, pScreenSourceItem->m_uiSizeY);
Expand Down Expand Up @@ -631,7 +631,9 @@ void CRenderItemManager::ChangeRenderTarget(uint uiSizeX, uint uiSizeY, IDirect3
//
// CRenderItemManager::CanCreateRenderItem
//
//
// Returns whenever a render item can be created
// depending on the current set m_TestMode
// Also checks if theres actually enough free video memory
//
////////////////////////////////////////////////////////////////
bool CRenderItemManager::CanCreateRenderItem(ClassId classId)
Expand All @@ -646,21 +648,22 @@ bool CRenderItemManager::CanCreateRenderItem(ClassId classId)
if (m_iMemoryKBFreeForMTA <= 0)
return false;

if (m_TestMode == DX_TEST_MODE_NO_MEM)
switch (m_TestMode)
{
case DX_TEST_MODE_NO_MEM:
return false;

if (m_TestMode == DX_TEST_MODE_LOW_MEM)
{
if ((rand() % 1000) > 750)
return false;
case DX_TEST_MODE_LOW_MEM:
return (rand() % 1000) <= 750;

default:
return true;
}
}
else if (classId == CShaderItem::GetClassId())
{
if (m_TestMode == DX_TEST_MODE_NO_SHADER)
return false;
return m_TestMode != DX_TEST_MODE_NO_SHADER;
}
return true;
}

////////////////////////////////////////////////////////////////
Expand All @@ -687,17 +690,20 @@ void CRenderItemManager::UpdateMemoryUsage()
m_iTextureMemoryKBUsed = 0;
m_iRenderTargetMemoryKBUsed = 0;
m_iFontMemoryKBUsed = 0;
for (std::set<CRenderItem*>::iterator iter = m_CreatedItemList.begin(); iter != m_CreatedItemList.end(); iter++)

for (const auto pRenderItem : m_CreatedItemList)
{
CRenderItem* pRenderItem = *iter;
if (!pRenderItem->GetIncludeInMemoryStats())
continue;
int iMemoryKBUsed = pRenderItem->GetVideoMemoryKBUsed();

const int iMemoryKBUsed = pRenderItem->GetVideoMemoryKBUsed();

if (pRenderItem->IsA(CFileTextureItem::GetClassId()))
m_iTextureMemoryKBUsed += iMemoryKBUsed;

else if (pRenderItem->IsA(CRenderTargetItem::GetClassId()) || pRenderItem->IsA(CScreenSourceItem::GetClassId()))
m_iRenderTargetMemoryKBUsed += iMemoryKBUsed;

else if (pRenderItem->IsA(CGuiFontItem::GetClassId()) || pRenderItem->IsA(CDxFontItem::GetClassId()))
m_iFontMemoryKBUsed += iMemoryKBUsed;
}
Expand Down Expand Up @@ -776,21 +782,20 @@ void CRenderItemManager::GetDxStatus(SDxStatus& outStatus)
}

// Display color depth
D3DFORMAT BackBufferFormat = g_pDeviceState->CreationState.PresentationParameters.BackBufferFormat;
if (BackBufferFormat >= D3DFMT_R5G6B5 && BackBufferFormat < D3DFMT_A8R3G3B2)
outStatus.settings.b32BitColor = 0;
else
outStatus.settings.b32BitColor = 1;
outStatus.settings.b32BitColor = GetBitsPerPixel(g_pDeviceState->CreationState.PresentationParameters.BackBufferFormat) == 32;

// Modify if using test mode
if (m_TestMode == DX_TEST_MODE_NO_MEM)
switch (m_TestMode)
{
case DX_TEST_MODE_NO_MEM:
outStatus.videoMemoryKB.iFreeForMTA = 0;

if (m_TestMode == DX_TEST_MODE_LOW_MEM)
case DX_TEST_MODE_LOW_MEM:
outStatus.videoMemoryKB.iFreeForMTA = 1;

if (m_TestMode == DX_TEST_MODE_NO_SHADER)
case DX_TEST_MODE_NO_SHADER:
outStatus.videoCard.strPSVersion = "0";
}
}

////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -886,21 +891,23 @@ int CRenderItemManager::GetPitchDivisor(D3DFORMAT Format)
////////////////////////////////////////////////////////////////
int CRenderItemManager::CalcD3DResourceMemoryKBUsage(IDirect3DResource9* pD3DResource)
{
D3DRESOURCETYPE type = pD3DResource->GetType();

if (type == D3DRTYPE_SURFACE)
switch (pD3DResource->GetType())
{
case D3DRTYPE_SURFACE:
return CalcD3DSurfaceMemoryKBUsage((IDirect3DSurface9*)pD3DResource);

if (type == D3DRTYPE_TEXTURE)
case D3DRTYPE_TEXTURE:
return CalcD3DTextureMemoryKBUsage((IDirect3DTexture9*)pD3DResource);

if (type == D3DRTYPE_VOLUMETEXTURE)
case D3DRTYPE_VOLUMETEXTURE:
return CalcD3DVolumeTextureMemoryKBUsage((IDirect3DVolumeTexture9*)pD3DResource);

if (type == D3DRTYPE_CUBETEXTURE)
case D3DRTYPE_CUBETEXTURE:
return CalcD3DCubeTextureMemoryKBUsage((IDirect3DCubeTexture9*)pD3DResource);

return 0;
default:
return 0;
}
}

////////////////////////////////////////////////////////////////
Expand All @@ -915,10 +922,10 @@ int CRenderItemManager::CalcD3DSurfaceMemoryKBUsage(IDirect3DSurface9* pD3DSurfa
D3DSURFACE_DESC surfaceDesc;
pD3DSurface->GetDesc(&surfaceDesc);

int iBitsPerPixel = GetBitsPerPixel(surfaceDesc.Format);
int iMemoryUsed = surfaceDesc.Width * surfaceDesc.Height / 8 * iBitsPerPixel;
const int iBitsPerPixel = GetBitsPerPixel(surfaceDesc.Format);
const int iMemoryUsedBytes = (surfaceDesc.Width * surfaceDesc.Height * iBitsPerPixel) / 8;

return iMemoryUsed / 1024;
return iMemoryUsedBytes / 1024;
}

////////////////////////////////////////////////////////////////
Expand All @@ -933,7 +940,7 @@ int CRenderItemManager::CalcD3DTextureMemoryKBUsage(IDirect3DTexture9* pD3DTextu
int iMemoryUsed = 0;

// Calc memory usage
int iLevelCount = pD3DTexture->GetLevelCount();
const int iLevelCount = pD3DTexture->GetLevelCount();
for (int i = 0; i < iLevelCount; i++)
{
D3DSURFACE_DESC surfaceDesc;
Expand All @@ -955,20 +962,20 @@ int CRenderItemManager::CalcD3DTextureMemoryKBUsage(IDirect3DTexture9* pD3DTextu
////////////////////////////////////////////////////////////////
int CRenderItemManager::CalcD3DVolumeTextureMemoryKBUsage(IDirect3DVolumeTexture9* pD3DVolumeTexture)
{
int iMemoryUsed = 0;
int iMemoryUsedBytes = 0;

// Calc memory usage
int iLevelCount = pD3DVolumeTexture->GetLevelCount();
const int iLevelCount = pD3DVolumeTexture->GetLevelCount();
for (int i = 0; i < iLevelCount; i++)
{
D3DVOLUME_DESC volumeDesc;
pD3DVolumeTexture->GetLevelDesc(i, &volumeDesc);

int iBitsPerPixel = GetBitsPerPixel(volumeDesc.Format);
iMemoryUsed += volumeDesc.Width * volumeDesc.Height * volumeDesc.Depth / 8 * iBitsPerPixel;
iMemoryUsedBytes += (volumeDesc.Width * volumeDesc.Height * volumeDesc.Depth * iBitsPerPixel) / 8;
}

return iMemoryUsed / 1024;
return iMemoryUsedBytes / 1024;
}

////////////////////////////////////////////////////////////////
Expand All @@ -980,20 +987,20 @@ int CRenderItemManager::CalcD3DVolumeTextureMemoryKBUsage(IDirect3DVolumeTexture
////////////////////////////////////////////////////////////////
int CRenderItemManager::CalcD3DCubeTextureMemoryKBUsage(IDirect3DCubeTexture9* pD3DCubeTexture)
{
int iMemoryUsed = 0;
int iMemoryUsedBytes = 0;

// Calc memory usage
int iLevelCount = pD3DCubeTexture->GetLevelCount();
const int iLevelCount = pD3DCubeTexture->GetLevelCount();
for (int i = 0; i < iLevelCount; i++)
{
D3DSURFACE_DESC surfaceDesc;
pD3DCubeTexture->GetLevelDesc(i, &surfaceDesc);

int iBitsPerPixel = GetBitsPerPixel(surfaceDesc.Format);
iMemoryUsed += surfaceDesc.Width * surfaceDesc.Height / 8 * iBitsPerPixel;
const int iBitsPerPixel = GetBitsPerPixel(surfaceDesc.Format);
iMemoryUsedBytes += (surfaceDesc.Width * surfaceDesc.Height * iBitsPerPixel) / 8;
}

return iMemoryUsed * 6 / 1024;
return iMemoryUsedBytes * 6 / 1024;
}

////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -1070,6 +1077,7 @@ void CRenderItemManager::PreDrawWorld()
m_pDevice->CreateTexture(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, 1, D3DUSAGE_DEPTHSTENCIL, (D3DFORMAT)m_depthBufferFormat, D3DPOOL_DEFAULT,
&pReadableDepthBuffer, NULL);
}

if (bRequireNonAADisplay && !m_pNonAARenderTarget)
{
// Create a non-AA render target and depth buffer
Expand Down
7 changes: 7 additions & 0 deletions Client/sdk/core/CGraphicsInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ struct PrimitiveVertice
static const uint FNV = D3DFVF_XYZ | D3DFVF_DIFFUSE;
float fX, fY, fZ;
D3DCOLOR Color;

PrimitiveVertice(float x, float y, float z, D3DCOLOR color) :
fX(x),
fY(y),
fZ(z),
Color(color)
{}
};
struct PrimitiveMaterialVertice
{
Expand Down
Loading