From 6f5c415096d10103889979fa45e6818762cdcefc Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 6 Jan 2019 16:29:47 +0100 Subject: [PATCH 1/7] dxDrawPrimitive3d and dxDrawMaterialPrimitive3d --- Client/core/CCore.cpp | 4 + Client/core/Graphics/CGraphics.cpp | 66 ++++- Client/core/Graphics/CGraphics.h | 35 ++- .../Graphics/CMaterialPrimitive3DBatcher.cpp | 243 ++++++++++++++++++ .../Graphics/CMaterialPrimitive3DBatcher.h | 39 +++ Client/core/Graphics/CPrimitive3DBatcher.cpp | 163 ++++++++++++ Client/core/Graphics/CPrimitive3DBatcher.h | 35 +++ .../logic/luadefs/CLuaDrawingDefs.cpp | 94 +++++++ .../logic/luadefs/CLuaDrawingDefs.h | 2 + Client/sdk/core/CGraphicsInterface.h | 13 + 10 files changed, 682 insertions(+), 12 deletions(-) create mode 100644 Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp create mode 100644 Client/core/Graphics/CMaterialPrimitive3DBatcher.h create mode 100644 Client/core/Graphics/CPrimitive3DBatcher.cpp create mode 100644 Client/core/Graphics/CPrimitive3DBatcher.h diff --git a/Client/core/CCore.cpp b/Client/core/CCore.cpp index 8dc41155bd8..6b286663469 100644 --- a/Client/core/CCore.cpp +++ b/Client/core/CCore.cpp @@ -1894,6 +1894,10 @@ void CCore::OnDeviceRestore(void) void CCore::OnPreFxRender(void) { // Don't do nothing if nothing won't be drawn + + if (CGraphics::GetSingleton().HasPrimitive3DPreGUIQueueItems()) + CGraphics::GetSingleton().DrawPrimitive3DPreGUIQueue(); + if (!CGraphics::GetSingleton().HasLine3DPreGUIQueueItems()) return; diff --git a/Client/core/Graphics/CGraphics.cpp b/Client/core/Graphics/CGraphics.cpp index 5769a3e3762..31d7a801417 100644 --- a/Client/core/Graphics/CGraphics.cpp +++ b/Client/core/Graphics/CGraphics.cpp @@ -15,6 +15,8 @@ #include "CMaterialLine3DBatcher.h" #include "CPrimitiveBatcher.h" #include "CPrimitiveMaterialBatcher.h" +#include "CPrimitive3DBatcher.h" +#include "CMaterialPrimitive3DBatcher.h" #include "CAspectRatioConverter.h" extern CCore* g_pCore; extern bool g_bInGTAScene; @@ -58,6 +60,10 @@ CGraphics::CGraphics(CLocalGUI* pGUI) m_pLine3DBatcherPostGUI = new CLine3DBatcher(false); m_pMaterialLine3DBatcherPreGUI = new CMaterialLine3DBatcher(true); m_pMaterialLine3DBatcherPostGUI = new CMaterialLine3DBatcher(false); + m_pPrimitive3DBatcherPreGUI = new CPrimitive3DBatcher(true); + m_pPrimitive3DBatcherPostGUI = new CPrimitive3DBatcher(false); + m_pMaterialPrimitive3DBatcherPreGUI = new CMaterialPrimitive3DBatcher(true, this); + m_pMaterialPrimitive3DBatcherPostGUI = new CMaterialPrimitive3DBatcher(false, this); m_pPrimitiveBatcher = new CPrimitiveBatcher(); m_pPrimitiveMaterialBatcher = new CPrimitiveMaterialBatcher(this); @@ -84,6 +90,10 @@ CGraphics::~CGraphics(void) SAFE_DELETE(m_pMaterialLine3DBatcherPostGUI); SAFE_DELETE(m_pPrimitiveBatcher); SAFE_DELETE(m_pPrimitiveMaterialBatcher); + SAFE_DELETE(m_pPrimitive3DBatcherPreGUI); + SAFE_DELETE(m_pPrimitive3DBatcherPostGUI); + SAFE_DELETE(m_pMaterialPrimitive3DBatcherPreGUI); + SAFE_DELETE(m_pMaterialPrimitive3DBatcherPostGUI); SAFE_DELETE(m_pScreenGrabber); SAFE_DELETE(m_pPixelsManager); SAFE_DELETE(m_pAspectRatioConverter); @@ -875,6 +885,44 @@ void CGraphics::DrawPrimitiveQueued(std::vector* pVecVertices, AddQueueItem (Item, bPostGUI); } +void CGraphics::DrawPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, bool bPostGUI) +{ + // Prevent queuing when minimized + if (g_pCore->IsWindowMinimized()) + { + delete pVecVertices; + return; + } + + // Add it to the queue + if (bPostGUI && !CCore::GetSingleton().IsMenuVisible()) + m_pPrimitive3DBatcherPostGUI->AddPrimitive(eType, pVecVertices); + else + m_pPrimitive3DBatcherPreGUI->AddPrimitive(eType, pVecVertices); +} + +void CGraphics::DrawMaterialPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, bool bPostGUI) +{ + // Prevent queuing when minimized + if (g_pCore->IsWindowMinimized()) + { + delete pVecVertices; + return; + } + + if (CShaderItem* pShaderItem = DynamicCast(pMaterial)) + { + // If material is a shader, use its current instance + pMaterial = pShaderItem->m_pShaderInstance; + } + + // Add it to the queue + if (bPostGUI && !CCore::GetSingleton().IsMenuVisible()) + m_pMaterialPrimitive3DBatcherPostGUI->AddPrimitive(eType, pMaterial, pVecVertices); + else + m_pMaterialPrimitive3DBatcherPreGUI->AddPrimitive(eType, pMaterial, pVecVertices); +} + void CGraphics::DrawMaterialPrimitiveQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, bool bPostGUI) { @@ -1408,7 +1456,10 @@ void CGraphics::OnDeviceCreate(IDirect3DDevice9* pDevice) m_pMaterialLine3DBatcherPreGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); m_pMaterialLine3DBatcherPostGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); m_pPrimitiveBatcher->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); - m_pPrimitiveMaterialBatcher->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); + m_pPrimitive3DBatcherPreGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); + m_pPrimitive3DBatcherPostGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); + m_pMaterialPrimitive3DBatcherPreGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); + m_pMaterialPrimitive3DBatcherPostGUI->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); m_pRenderItemManager->OnDeviceCreate(pDevice, GetViewportWidth(), GetViewportHeight()); m_pScreenGrabber->OnDeviceCreate(pDevice); m_pPixelsManager->OnDeviceCreate(pDevice); @@ -1484,6 +1535,8 @@ void CGraphics::DrawPostGUIQueue(void) DrawQueue(m_PostGUIQueue); m_pLine3DBatcherPostGUI->Flush(); m_pMaterialLine3DBatcherPostGUI->Flush(); + m_pPrimitive3DBatcherPostGUI->Flush(); + m_pMaterialPrimitive3DBatcherPostGUI->Flush(); // Both queues should be empty now, and there should be no outstanding refs assert(m_PreGUIQueue.empty() && m_iDebugQueueRefs == 0); @@ -1495,11 +1548,22 @@ void CGraphics::DrawLine3DPreGUIQueue(void) m_pMaterialLine3DBatcherPreGUI->Flush(); } +void CGraphics::DrawPrimitive3DPreGUIQueue(void) +{ + m_pPrimitive3DBatcherPreGUI->Flush(); + m_pMaterialPrimitive3DBatcherPreGUI->Flush(); +} + bool CGraphics::HasLine3DPreGUIQueueItems(void) { return m_pLine3DBatcherPreGUI->HasItems() || m_pMaterialLine3DBatcherPreGUI->HasItems(); } +bool CGraphics::HasPrimitive3DPreGUIQueueItems(void) +{ + return m_pMaterialPrimitive3DBatcherPreGUI->HasItems() || m_pPrimitive3DBatcherPreGUI->HasItems(); +} + void CGraphics::DrawQueue(std::vector& Queue) { BeginDrawBatch(); diff --git a/Client/core/Graphics/CGraphics.h b/Client/core/Graphics/CGraphics.h index cb3029b3f5a..89cb5f5deab 100644 --- a/Client/core/Graphics/CGraphics.h +++ b/Client/core/Graphics/CGraphics.h @@ -28,6 +28,8 @@ class CLine3DBatcher; class CMaterialLine3DBatcher; class CPrimitiveBatcher; class CPrimitiveMaterialBatcher; +class CPrimitive3DBatcher; +class CMaterialPrimitive3DBatcher; class CAspectRatioConverter; struct IDirect3DDevice9; struct IDirect3DSurface9; @@ -65,6 +67,7 @@ class CGraphics : public CGraphicsInterface, public CSingleton { friend class CDirect3DEvents9; friend CPrimitiveMaterialBatcher; + friend CMaterialPrimitive3DBatcher; public: ZERO_ON_NEW @@ -147,6 +150,10 @@ class CGraphics : public CGraphicsInterface, public CSingleton void DrawPrimitiveQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, bool bPostGUI = false); void DrawMaterialPrimitiveQueued(std::vector* vertices, D3DPRIMITIVETYPE type, CMaterialItem* pMaterial, bool bPostGUI); + + void DrawPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, bool bPostGUI); + void DrawMaterialPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, bool bPostGUI); + void DrawCircleQueued(float fX, float fY, float fRadius, float fStartAngle, float fStopAngle, unsigned long ulColor, unsigned long ulColorCenter, short siSegments, float fRatio, bool bPostGUI); @@ -178,6 +185,8 @@ class CGraphics : public CGraphicsInterface, public CSingleton void DrawPostGUIQueue(void); void DrawLine3DPreGUIQueue(void); bool HasLine3DPreGUIQueueItems(void); + void DrawPrimitive3DPreGUIQueue(void); + bool HasPrimitive3DPreGUIQueueItems(void); void DidRenderScene(void); void SetProgressMessage(const SString& strMessage); @@ -207,17 +216,21 @@ class CGraphics : public CGraphicsInterface, public CSingleton IDirect3DDevice9* m_pDevice; - CRenderItemManager* m_pRenderItemManager; - CScreenGrabberInterface* m_pScreenGrabber; - CPixelsManagerInterface* m_pPixelsManager; - CTileBatcher* m_pTileBatcher; - CLine3DBatcher* m_pLine3DBatcherPreGUI; - CLine3DBatcher* m_pLine3DBatcherPostGUI; - CMaterialLine3DBatcher* m_pMaterialLine3DBatcherPreGUI; - CMaterialLine3DBatcher* m_pMaterialLine3DBatcherPostGUI; - CPrimitiveBatcher* m_pPrimitiveBatcher; - CPrimitiveMaterialBatcher* m_pPrimitiveMaterialBatcher; - CAspectRatioConverter* m_pAspectRatioConverter; + CRenderItemManager* m_pRenderItemManager; + CScreenGrabberInterface* m_pScreenGrabber; + CPixelsManagerInterface* m_pPixelsManager; + CTileBatcher* m_pTileBatcher; + CLine3DBatcher* m_pLine3DBatcherPreGUI; + CLine3DBatcher* m_pLine3DBatcherPostGUI; + CMaterialLine3DBatcher* m_pMaterialLine3DBatcherPreGUI; + CMaterialLine3DBatcher* m_pMaterialLine3DBatcherPostGUI; + CPrimitiveBatcher* m_pPrimitiveBatcher; + CPrimitiveMaterialBatcher* m_pPrimitiveMaterialBatcher; + CPrimitive3DBatcher* m_pPrimitive3DBatcherPreGUI; + CPrimitive3DBatcher* m_pPrimitive3DBatcherPostGUI; + CMaterialPrimitive3DBatcher* m_pMaterialPrimitive3DBatcherPreGUI; + CMaterialPrimitive3DBatcher* m_pMaterialPrimitive3DBatcherPostGUI; + CAspectRatioConverter* m_pAspectRatioConverter; // Fonts ID3DXFont* m_pDXFonts[NUM_FONTS]; diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp new file mode 100644 index 00000000000..4ef26e5efee --- /dev/null +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp @@ -0,0 +1,243 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * (Shared logic for modifications) + * LICENSE: See LICENSE in the top level directory + * FILE: CMaterialPrimitive3DBatcher.cpp + * PURPOSE: + * + * + *****************************************************************************/ +#include +#include "CMaterialPrimitive3DBatcher.h" +//////////////////////////////////////////////////////////////// +// +// CMaterialPrimitive3DBatcher::CMaterialPrimitive3DBatcher +// +// +// +//////////////////////////////////////////////////////////////// +CMaterialPrimitive3DBatcher::CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* graphics) +{ + m_bPreGUI = bPreGUI; + m_pGraphics = graphics; +} +//////////////////////////////////////////////////////////////// +// +// CMaterialPrimitive3DBatcher::~CMaterialPrimitive3DBatcher +// +// +// +//////////////////////////////////////////////////////////////// +CMaterialPrimitive3DBatcher::~CMaterialPrimitive3DBatcher(void) +{ +} +//////////////////////////////////////////////////////////////// +// +// CMaterialPrimitive3DBatcher::OnDeviceCreate +// +// +// +//////////////////////////////////////////////////////////////// +void CMaterialPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY) +{ + m_pDevice = pDevice; +} + + +//////////////////////////////////////////////////////////////// +// +// CMaterialPrimitive3DBatcher::Flush +// +// Send all buffered vertices to D3D +// +//////////////////////////////////////////////////////////////// +void CMaterialPrimitive3DBatcher::Flush(void) +{ + if (m_primitiveList.empty()) + return; + + // Get scene matrices + D3DXMATRIX matWorld; + D3DXMatrixIdentity(&matWorld); + const D3DXMATRIX& matView = g_pDeviceState->TransformState.VIEW; + const D3DXMATRIX& matProjection = g_pDeviceState->TransformState.PROJECTION; + + // Pre-calc camera position + D3DXMATRIX matViewInv; + D3DXMatrixInverse(&matViewInv, NULL, &matView); + const CVector vecCameraPos(matViewInv._41, matViewInv._42, matViewInv._43); + + // Set transforms + m_pDevice->SetTransform(D3DTS_WORLD, &matWorld); + m_pDevice->SetTransform(D3DTS_VIEW, &matView); + m_pDevice->SetTransform(D3DTS_PROJECTION, &matProjection); + + + IDirect3DStateBlock9* pSavedStateBlock = nullptr; + m_pDevice->CreateStateBlock(D3DSBT_ALL, &pSavedStateBlock); + + // fix alpha blending, func at address 0x005D6480 drawing models in gtasa + + // Set states + if (g_pDeviceState->AdapterState.bRequiresClipping) + m_pDevice->SetRenderState(D3DRS_CLIPPING, TRUE); + m_pDevice->SetRenderState(D3DRS_ZENABLE, m_bPreGUI ? D3DZB_TRUE : D3DZB_FALSE); + m_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + m_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); + m_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + m_pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); + m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + m_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + m_pDevice->SetRenderState(D3DRS_ALPHAREF, 0x01); + m_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); + m_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + m_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); + m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); + m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + // Set vertex stream + m_pDevice->SetFVF(PrimitiveMaterialVertice::FNV); + + // Draw + m_pDevice->SetTexture(0, nullptr); + // Cache last used material, so we don't set directx parameters needlessly + CMaterialItem* pLastMaterial = nullptr; + + uint uiVertexStreamZeroStride = sizeof(PrimitiveMaterialVertice); + + for (auto& primitive : m_primitiveList) { + const void* pVertexStreamZeroData = &primitive.pVecVertices->at(0); + size_t iCollectionSize = primitive.pVecVertices->size(); + + CMaterialItem* pMaterial = primitive.pMaterial; + if (pMaterial != pLastMaterial) + { + // Set texture addressing mode + m_pDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, pMaterial->m_TextureAddress); + m_pDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, pMaterial->m_TextureAddress); + + if (pMaterial->m_TextureAddress == TADDRESS_BORDER) + m_pDevice->SetSamplerState(0, D3DSAMP_BORDERCOLOR, pMaterial->m_uiBorderColor); + } + + if (CTextureItem* pTextureItem = DynamicCast(pMaterial)) + { + m_pDevice->SetTexture(0, pTextureItem->m_pD3DTexture); + DrawPrimitive(primitive.eType, primitive.pVecVertices->size(), pVertexStreamZeroData, uiVertexStreamZeroStride); + } + else if (CShaderInstance* pShaderInstance = DynamicCast(pMaterial)) + { + // Draw using shader + ID3DXEffect* pD3DEffect = pShaderInstance->m_pEffectWrap->m_pD3DEffect; + + if (pMaterial != pLastMaterial) + { + // Apply custom parameters + pShaderInstance->ApplyShaderParameters(); + // Apply common parameters + pShaderInstance->m_pEffectWrap->ApplyCommonHandles(); + // Apply mapped parameters + pShaderInstance->m_pEffectWrap->ApplyMappedHandles(); + } + + // Do shader passes + DWORD dwFlags = D3DXFX_DONOTSAVESHADERSTATE; + uint uiNumPasses = 0; + pShaderInstance->m_pEffectWrap->Begin(&uiNumPasses, dwFlags, false); + + for (uint uiPass = 0; uiPass < uiNumPasses; uiPass++) + { + pD3DEffect->BeginPass(uiPass); + DrawPrimitive(primitive.eType, primitive.pVecVertices->size(), pVertexStreamZeroData, uiVertexStreamZeroStride); + pD3DEffect->EndPass(); + } + pShaderInstance->m_pEffectWrap->End(); + + // If we didn't get the effect to save the shader state, clear some things here + if (dwFlags & D3DXFX_DONOTSAVESHADERSTATE) + { + m_pDevice->SetVertexShader(NULL); + m_pDevice->SetPixelShader(NULL); + } + } + pLastMaterial = pMaterial; + pMaterial->Release(); + } + + // Clean up + ClearQueue(); + + if (pSavedStateBlock) + { + pSavedStateBlock->Apply(); + SAFE_RELEASE(pSavedStateBlock); + } +} + +void CMaterialPrimitive3DBatcher::ClearQueue() +{ + // Clean up + for (auto& primitive : m_primitiveList) + { + delete primitive.pVecVertices; + } + + size_t prevSize = m_primitiveList.size(); + m_primitiveList.clear(); + m_primitiveList.reserve(prevSize); +} +//////////////////////////////////////////////////////////////// +// +// CPrimitiveMaterialBatcher::DrawPrimitive +// +// Draws the primitives on render target +// +//////////////////////////////////////////////////////////////// +void CMaterialPrimitive3DBatcher::DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride) +{ + int iSize = 1; + switch (eType) + { + case D3DPT_POINTLIST: + iSize = iCollectionSize; + break; + case D3DPT_LINELIST: + iSize = iCollectionSize / 2; + break; + case D3DPT_LINESTRIP: + iSize = iCollectionSize - 1; + break; + case D3DPT_TRIANGLEFAN: + case D3DPT_TRIANGLESTRIP: + iSize = iCollectionSize - 2; + break; + case D3DPT_TRIANGLELIST: + iSize = iCollectionSize / 3; + break; + } + m_pDevice->DrawPrimitiveUP(eType, iSize, pDataAddr, uiVertexStride); +} +//////////////////////////////////////////////////////////////// +// +// CMaterialPrimitive3DBatcher::AddPrimitive +// +// Add a new primitive to the list +// +//////////////////////////////////////////////////////////////// +void CMaterialPrimitive3DBatcher::AddPrimitive(D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, std::vector* pVecVertices) +{ + if (!pMaterial) + return; + + pMaterial->AddRef(); + m_primitiveList.push_back({eType, pMaterial, pVecVertices}); +} diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.h b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h new file mode 100644 index 00000000000..2dcd050decc --- /dev/null +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h @@ -0,0 +1,39 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: CMaterialPrimitive3DBatcher.h + * PURPOSE: + * + * + *****************************************************************************/ +// Vertex type used by the primitives 3d batcher +struct sPrimitiveMaterial3D +{ + D3DPRIMITIVETYPE eType; + CMaterialItem* pMaterial; + std::vector* pVecVertices; +}; + +// +// Batches primitives drawing +// +class CMaterialPrimitive3DBatcher +{ +public: + ZERO_ON_NEW + CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* graphics); + ~CMaterialPrimitive3DBatcher(void); + void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); + void Flush(void); + void AddPrimitive(D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, std::vector* pVecVertices); + void DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride); + bool HasItems(void) { return !m_primitiveList.empty(); } + void ClearQueue(); + +protected: + bool m_bPreGUI; + IDirect3DDevice9* m_pDevice; + CGraphics* m_pGraphics; + std::vector m_primitiveList; +}; diff --git a/Client/core/Graphics/CPrimitive3DBatcher.cpp b/Client/core/Graphics/CPrimitive3DBatcher.cpp new file mode 100644 index 00000000000..2ac049684da --- /dev/null +++ b/Client/core/Graphics/CPrimitive3DBatcher.cpp @@ -0,0 +1,163 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * (Shared logic for modifications) + * LICENSE: See LICENSE in the top level directory + * FILE: CPrimitive3DBatcher.cpp + * PURPOSE: + * + * + *****************************************************************************/ +#include +#include "CPrimitive3DBatcher.h" +//////////////////////////////////////////////////////////////// +// +// CPrimitive3DBatcher::CPrimitive3DBatcher +// +// +// +//////////////////////////////////////////////////////////////// +CPrimitive3DBatcher::CPrimitive3DBatcher(bool bPreGUI) +{ + m_bPreGUI = bPreGUI; +} +//////////////////////////////////////////////////////////////// +// +// CPrimitive3DBatcher::~CPrimitive3DBatcher +// +// +// +//////////////////////////////////////////////////////////////// +CPrimitive3DBatcher::~CPrimitive3DBatcher(void) +{ +} +//////////////////////////////////////////////////////////////// +// +// CPrimitive3DBatcher::OnDeviceCreate +// +// +// +//////////////////////////////////////////////////////////////// +void CPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY) +{ + m_pDevice = pDevice; +} + + +//////////////////////////////////////////////////////////////// +// +// CPrimitive3DBatcher::Flush +// +// Send all buffered vertices to D3D +// +//////////////////////////////////////////////////////////////// +void CPrimitive3DBatcher::Flush(void) +{ + if (m_primitiveList.empty()) + return; + + // Get scene matrices + D3DXMATRIX matWorld; + D3DXMatrixIdentity(&matWorld); + const D3DXMATRIX& matView = g_pDeviceState->TransformState.VIEW; + const D3DXMATRIX& matProjection = g_pDeviceState->TransformState.PROJECTION; + + // Pre-calc camera position + D3DXMATRIX matViewInv; + D3DXMatrixInverse(&matViewInv, NULL, &matView); + const CVector vecCameraPos(matViewInv._41, matViewInv._42, matViewInv._43); + + + IDirect3DStateBlock9* pSavedStateBlock = nullptr; + m_pDevice->CreateStateBlock(D3DSBT_ALL, &pSavedStateBlock); + + // Set states + if (g_pDeviceState->AdapterState.bRequiresClipping) + m_pDevice->SetRenderState(D3DRS_CLIPPING, TRUE); + m_pDevice->SetRenderState(D3DRS_ZENABLE, m_bPreGUI ? D3DZB_TRUE : D3DZB_FALSE); + m_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + m_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + m_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + m_pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); + m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + m_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + m_pDevice->SetRenderState(D3DRS_ALPHAREF, 0x01); + m_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); + m_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); + m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); + m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); + m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + // Set transforms + m_pDevice->SetTransform(D3DTS_WORLD, &matWorld); + m_pDevice->SetTransform(D3DTS_VIEW, &matView); + m_pDevice->SetTransform(D3DTS_PROJECTION, &matProjection); + + // Set vertex stream + m_pDevice->SetFVF(PrimitiveVertice::FNV); + + m_pDevice->SetTexture(0, NULL); + // Draw + + uint VertexStreamZeroStride = sizeof(PrimitiveVertice); + for (auto& primitive : m_primitiveList) { + size_t iSize = 1; + size_t iCollectionSize = primitive.pVecVertices->size(); + switch (primitive.eType) + { + case D3DPT_POINTLIST: + iSize = iCollectionSize; + break; + case D3DPT_LINELIST: + iSize = iCollectionSize / 2; + break; + case D3DPT_LINESTRIP: + iSize = iCollectionSize - 1; + break; + case D3DPT_TRIANGLEFAN: + case D3DPT_TRIANGLESTRIP: + iSize = iCollectionSize - 2; + break; + case D3DPT_TRIANGLELIST: + iSize = iCollectionSize / 3; + break; + } + + m_pDevice->DrawPrimitiveUP(primitive.eType, iSize, (const void*)(&primitive.pVecVertices->at(0)), VertexStreamZeroStride); + } + + // Clean up + for (auto& primitive : m_primitiveList) { + delete primitive.pVecVertices; + } + + size_t prevSize = m_primitiveList.size(); + m_primitiveList.clear(); + m_primitiveList.reserve(prevSize); + + if (g_pDeviceState->AdapterState.bRequiresClipping) + m_pDevice->SetRenderState(D3DRS_CLIPPING, FALSE); + + if (pSavedStateBlock) + { + pSavedStateBlock->Apply(); + SAFE_RELEASE(pSavedStateBlock); + } +} + +//////////////////////////////////////////////////////////////// +// +// CPrimitive3DBatcher::AddTriangle +// +// Add a new primitive to the list +// +//////////////////////////////////////////////////////////////// +void CPrimitive3DBatcher::AddPrimitive(D3DPRIMITIVETYPE eType, std::vector* pVecVertices) +{ + m_primitiveList.push_back({eType, pVecVertices}); +} diff --git a/Client/core/Graphics/CPrimitive3DBatcher.h b/Client/core/Graphics/CPrimitive3DBatcher.h new file mode 100644 index 00000000000..cdd8d063655 --- /dev/null +++ b/Client/core/Graphics/CPrimitive3DBatcher.h @@ -0,0 +1,35 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: CPrimitive3DBatcher.h + * PURPOSE: + * + * + *****************************************************************************/ +// Vertex type used by the primitives 3d batcher +struct sPrimitive3D +{ + D3DPRIMITIVETYPE eType; + std::vector* pVecVertices; +}; + +// +// Batches primitives drawing +// +class CPrimitive3DBatcher +{ +public: + ZERO_ON_NEW + CPrimitive3DBatcher(bool bPreGUI); + ~CPrimitive3DBatcher(void); + void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); + void Flush(void); + void AddPrimitive(D3DPRIMITIVETYPE eType, std::vector* pVecVertices); + bool HasItems(void) { return !m_primitiveList.empty(); } + +protected: + bool m_bPreGUI; + IDirect3DDevice9* m_pDevice; + std::vector m_primitiveList; +}; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index 47937621697..747f75e6f4a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -26,7 +26,9 @@ void CLuaDrawingDefs::LoadFunctions(void) {"dxDrawImage", DxDrawImage}, {"dxDrawImageSection", DxDrawImageSection}, {"dxDrawPrimitive", DxDrawPrimitive}, + {"dxDrawPrimitive3D", DxDrawPrimitive3D}, {"dxDrawMaterialPrimitive", DxDrawMaterialPrimitive}, + {"dxDrawMaterialPrimitive3D", DxDrawMaterialPrimitive3D}, {"dxGetTextWidth", DxGetTextWidth}, {"dxGetFontHeight", DxGetFontHeight}, {"dxCreateFont", DxCreateFont}, @@ -566,6 +568,98 @@ int CLuaDrawingDefs::DxDrawImageSection(lua_State* luaVM) return 1; } +int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) +{ + // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + bool bPostGUI; + CScriptArgReader argStream(luaVM); + argStream.ReadEnumString(ePrimitiveType); + argStream.ReadBool(bPostGUI, false); + + while (argStream.NextIsTable()) + { + std::vector vecTableContent; + argStream.ReadNumberTable(vecTableContent); + switch (vecTableContent.size()) + { + case Primitive3DVerticeSizes::VERT_XYZ: + pVecVertices->push_back(PrimitiveVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], (DWORD)0xFFFFFFFF}); + break; + case Primitive3DVerticeSizes::VERT_XYZ_COLOR: + pVecVertices->push_back(PrimitiveVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], static_cast(vecTableContent[3])}); + break; + } + } + + if (!argStream.HasErrors()) + { + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) + { + g_pCore->GetGraphics()->DrawPrimitive3DQueued(pVecVertices, ePrimitiveType, bPostGUI); + lua_pushboolean(luaVM, true); + return 1; + } + } + else + { + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + } + + // Failed + delete pVecVertices; + lua_pushboolean(luaVM, false); + return 1; +} + +int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) +{ + // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + CClientMaterial* pMaterialElement; + bool bPostGUI; + CScriptArgReader argStream(luaVM); + argStream.ReadEnumString(ePrimitiveType); + MixedReadMaterialString(argStream, pMaterialElement); + argStream.ReadBool(bPostGUI, false); + + while (argStream.NextIsTable()) + { + std::vector vecTableContent; + argStream.ReadNumberTable(vecTableContent); + switch (vecTableContent.size()) + { + case Primitive3DVerticeSizes::VERT_XYZ_UV: + pVecVertices->push_back(PrimitiveMaterialVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], (DWORD)0xFFFFFFFF, vecTableContent[3], vecTableContent[4] }); + break; + case Primitive3DVerticeSizes::VERT_XYZ_COLOR_UV: + pVecVertices->push_back(PrimitiveMaterialVertice{ vecTableContent[0], vecTableContent[1], vecTableContent[2], static_cast(vecTableContent[3]),vecTableContent[4], vecTableContent[5] }); + break; + } + } + + if (!argStream.HasErrors()) + { + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) + { + g_pCore->GetGraphics()->DrawMaterialPrimitive3DQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); + lua_pushboolean(luaVM, true); + return 1; + } + } + else + { + m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + } + + // Failed + delete pVecVertices; + lua_pushboolean(luaVM, false); + return 1; +} + int CLuaDrawingDefs::DxDrawPrimitive(lua_State* luaVM) { // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h index cec72046e95..0b488c8170b 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h @@ -29,6 +29,8 @@ class CLuaDrawingDefs : public CLuaDefs LUA_DECLARE(DxDrawImageSection); LUA_DECLARE(DxDrawPrimitive); LUA_DECLARE(DxDrawMaterialPrimitive); + LUA_DECLARE(DxDrawPrimitive3D); + LUA_DECLARE(DxDrawMaterialPrimitive3D); LUA_DECLARE_OOP(DxGetTextWidth); LUA_DECLARE_OOP(DxGetFontHeight); LUA_DECLARE(DxCreateFont); diff --git a/Client/sdk/core/CGraphicsInterface.h b/Client/sdk/core/CGraphicsInterface.h index 687b33c7423..ab5cb505580 100644 --- a/Client/sdk/core/CGraphicsInterface.h +++ b/Client/sdk/core/CGraphicsInterface.h @@ -37,6 +37,14 @@ enum PrimitiveVerticeSizes VERT_XY_COLOR_UV = 5 }; +enum Primitive3DVerticeSizes +{ + VERT_XYZ = 3, + VERT_XYZ_COLOR, + VERT_XYZ_UV, + VERT_XYZ_COLOR_UV, +}; + struct ID3DXFont; struct IDirect3DDevice9; struct IDirect3DTexture9; @@ -153,6 +161,11 @@ class CGraphicsInterface virtual void DrawPrimitiveQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, bool bPostGUI) = 0; virtual void DrawMaterialPrimitiveQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, bool bPostGUI) = 0; + + virtual void DrawPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, bool bPostGUI) = 0; + virtual void DrawMaterialPrimitive3DQueued(std::vector* pVecVertices, D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, + bool bPostGUI) = 0; + virtual void DrawCircleQueued(float fX, float fY, float fRadius, float fStartAngle, float fStopAngle, unsigned long ulColor, unsigned long ulColorCenter, short siSegments, float fRatio, bool bPostGUI) = 0; From cdfdfaf8d582f8eb830988a815fe04ee9c64f844 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 6 Jan 2019 16:46:24 +0100 Subject: [PATCH 2/7] a bit clean up --- Client/core/Graphics/CPrimitive3DBatcher.cpp | 58 +++++++++++--------- Client/core/Graphics/CPrimitive3DBatcher.h | 1 + 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/Client/core/Graphics/CPrimitive3DBatcher.cpp b/Client/core/Graphics/CPrimitive3DBatcher.cpp index 2ac049684da..85408dc1313 100644 --- a/Client/core/Graphics/CPrimitive3DBatcher.cpp +++ b/Client/core/Graphics/CPrimitive3DBatcher.cpp @@ -42,8 +42,6 @@ void CPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewp { m_pDevice = pDevice; } - - //////////////////////////////////////////////////////////////// // // CPrimitive3DBatcher::Flush @@ -106,29 +104,7 @@ void CPrimitive3DBatcher::Flush(void) uint VertexStreamZeroStride = sizeof(PrimitiveVertice); for (auto& primitive : m_primitiveList) { - size_t iSize = 1; - size_t iCollectionSize = primitive.pVecVertices->size(); - switch (primitive.eType) - { - case D3DPT_POINTLIST: - iSize = iCollectionSize; - break; - case D3DPT_LINELIST: - iSize = iCollectionSize / 2; - break; - case D3DPT_LINESTRIP: - iSize = iCollectionSize - 1; - break; - case D3DPT_TRIANGLEFAN: - case D3DPT_TRIANGLESTRIP: - iSize = iCollectionSize - 2; - break; - case D3DPT_TRIANGLELIST: - iSize = iCollectionSize / 3; - break; - } - - m_pDevice->DrawPrimitiveUP(primitive.eType, iSize, (const void*)(&primitive.pVecVertices->at(0)), VertexStreamZeroStride); + DrawPrimitive(primitive.eType, primitive.pVecVertices->size(), &primitive.pVecVertices->at(0), VertexStreamZeroStride); } // Clean up @@ -149,7 +125,37 @@ void CPrimitive3DBatcher::Flush(void) SAFE_RELEASE(pSavedStateBlock); } } - +//////////////////////////////////////////////////////////////// +// +// CPrimitiveMaterialBatcher::DrawPrimitive +// +// Draws the primitives on render target +// +//////////////////////////////////////////////////////////////// +void CPrimitive3DBatcher::DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride) +{ + int iSize = 1; + switch (eType) + { + case D3DPT_POINTLIST: + iSize = iCollectionSize; + break; + case D3DPT_LINELIST: + iSize = iCollectionSize / 2; + break; + case D3DPT_LINESTRIP: + iSize = iCollectionSize - 1; + break; + case D3DPT_TRIANGLEFAN: + case D3DPT_TRIANGLESTRIP: + iSize = iCollectionSize - 2; + break; + case D3DPT_TRIANGLELIST: + iSize = iCollectionSize / 3; + break; + } + m_pDevice->DrawPrimitiveUP(eType, iSize, pDataAddr, uiVertexStride); +} //////////////////////////////////////////////////////////////// // // CPrimitive3DBatcher::AddTriangle diff --git a/Client/core/Graphics/CPrimitive3DBatcher.h b/Client/core/Graphics/CPrimitive3DBatcher.h index cdd8d063655..a28e2e18870 100644 --- a/Client/core/Graphics/CPrimitive3DBatcher.h +++ b/Client/core/Graphics/CPrimitive3DBatcher.h @@ -26,6 +26,7 @@ class CPrimitive3DBatcher void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); void Flush(void); void AddPrimitive(D3DPRIMITIVETYPE eType, std::vector* pVecVertices); + void DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride); bool HasItems(void) { return !m_primitiveList.empty(); } protected: From 16a6bd5cf760f954da7f92b812d2d379bd6aaa75 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 6 Jan 2019 17:01:27 +0100 Subject: [PATCH 3/7] comment update --- Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index 747f75e6f4a..5be3cb93627 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -570,7 +570,7 @@ int CLuaDrawingDefs::DxDrawImageSection(lua_State* luaVM) int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) { - // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) + // bool DxDrawPrimitive3D (string primitiveType, bool postGUI, table vertice1, ...) D3DPRIMITIVETYPE ePrimitiveType; auto pVecVertices = new std::vector(); bool bPostGUI; @@ -615,7 +615,7 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) { - // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) + // bool DxDrawMaterialPrimitive3D (string primitiveType, dxMaterial material, bool postGUI, table vertice1, ...) D3DPRIMITIVETYPE ePrimitiveType; auto pVecVertices = new std::vector(); CClientMaterial* pMaterialElement; From b8d7e8a1c43054621218ecb02bdab119f057f402 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 12 Jan 2019 18:19:29 +0100 Subject: [PATCH 4/7] fix along Botder tips --- .../Graphics/CMaterialPrimitive3DBatcher.cpp | 20 +++---------- .../Graphics/CMaterialPrimitive3DBatcher.h | 11 ++++--- Client/core/Graphics/CPrimitive3DBatcher.cpp | 17 ++--------- Client/core/Graphics/CPrimitive3DBatcher.h | 11 ++++--- .../logic/luadefs/CLuaDrawingDefs.cpp | 30 +++++++++++++++---- 5 files changed, 45 insertions(+), 44 deletions(-) diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp index 4ef26e5efee..3a65d5c4bf0 100644 --- a/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp @@ -6,6 +6,7 @@ * FILE: CMaterialPrimitive3DBatcher.cpp * PURPOSE: * + * Multi Theft Auto is available from http://www.multitheftauto.com/ * *****************************************************************************/ #include @@ -17,19 +18,8 @@ // // //////////////////////////////////////////////////////////////// -CMaterialPrimitive3DBatcher::CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* graphics) -{ - m_bPreGUI = bPreGUI; - m_pGraphics = graphics; -} -//////////////////////////////////////////////////////////////// -// -// CMaterialPrimitive3DBatcher::~CMaterialPrimitive3DBatcher -// -// -// -//////////////////////////////////////////////////////////////// -CMaterialPrimitive3DBatcher::~CMaterialPrimitive3DBatcher(void) +CMaterialPrimitive3DBatcher::CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* pGraphics) + : m_bPreGUI(bPreGUI), m_pGraphics(pGraphics) { } //////////////////////////////////////////////////////////////// @@ -43,8 +33,6 @@ void CMaterialPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, floa { m_pDevice = pDevice; } - - //////////////////////////////////////////////////////////////// // // CMaterialPrimitive3DBatcher::Flush @@ -52,7 +40,7 @@ void CMaterialPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, floa // Send all buffered vertices to D3D // //////////////////////////////////////////////////////////////// -void CMaterialPrimitive3DBatcher::Flush(void) +void CMaterialPrimitive3DBatcher::Flush() { if (m_primitiveList.empty()) return; diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.h b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h index 2dcd050decc..6381ed2a3bb 100644 --- a/Client/core/Graphics/CMaterialPrimitive3DBatcher.h +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h @@ -5,8 +5,12 @@ * FILE: CMaterialPrimitive3DBatcher.h * PURPOSE: * + * Multi Theft Auto is available from http://www.multitheftauto.com/ * *****************************************************************************/ + +#pragma once + // Vertex type used by the primitives 3d batcher struct sPrimitiveMaterial3D { @@ -22,13 +26,12 @@ class CMaterialPrimitive3DBatcher { public: ZERO_ON_NEW - CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* graphics); - ~CMaterialPrimitive3DBatcher(void); + CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* pGraphics); void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); - void Flush(void); + void Flush(); void AddPrimitive(D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, std::vector* pVecVertices); void DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride); - bool HasItems(void) { return !m_primitiveList.empty(); } + bool HasItems() const { return !m_primitiveList.empty(); } void ClearQueue(); protected: diff --git a/Client/core/Graphics/CPrimitive3DBatcher.cpp b/Client/core/Graphics/CPrimitive3DBatcher.cpp index 85408dc1313..21f3f11c850 100644 --- a/Client/core/Graphics/CPrimitive3DBatcher.cpp +++ b/Client/core/Graphics/CPrimitive3DBatcher.cpp @@ -6,6 +6,7 @@ * FILE: CPrimitive3DBatcher.cpp * PURPOSE: * + * Multi Theft Auto is available from http://www.multitheftauto.com/ * *****************************************************************************/ #include @@ -18,17 +19,7 @@ // //////////////////////////////////////////////////////////////// CPrimitive3DBatcher::CPrimitive3DBatcher(bool bPreGUI) -{ - m_bPreGUI = bPreGUI; -} -//////////////////////////////////////////////////////////////// -// -// CPrimitive3DBatcher::~CPrimitive3DBatcher -// -// -// -//////////////////////////////////////////////////////////////// -CPrimitive3DBatcher::~CPrimitive3DBatcher(void) + : m_bPreGUI(bPreGUI) { } //////////////////////////////////////////////////////////////// @@ -49,7 +40,7 @@ void CPrimitive3DBatcher::OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewp // Send all buffered vertices to D3D // //////////////////////////////////////////////////////////////// -void CPrimitive3DBatcher::Flush(void) +void CPrimitive3DBatcher::Flush() { if (m_primitiveList.empty()) return; @@ -112,9 +103,7 @@ void CPrimitive3DBatcher::Flush(void) delete primitive.pVecVertices; } - size_t prevSize = m_primitiveList.size(); m_primitiveList.clear(); - m_primitiveList.reserve(prevSize); if (g_pDeviceState->AdapterState.bRequiresClipping) m_pDevice->SetRenderState(D3DRS_CLIPPING, FALSE); diff --git a/Client/core/Graphics/CPrimitive3DBatcher.h b/Client/core/Graphics/CPrimitive3DBatcher.h index a28e2e18870..7eae81cb2f5 100644 --- a/Client/core/Graphics/CPrimitive3DBatcher.h +++ b/Client/core/Graphics/CPrimitive3DBatcher.h @@ -5,13 +5,17 @@ * FILE: CPrimitive3DBatcher.h * PURPOSE: * + * Multi Theft Auto is available from http://www.multitheftauto.com/ * *****************************************************************************/ + +#pragma once + // Vertex type used by the primitives 3d batcher struct sPrimitive3D { D3DPRIMITIVETYPE eType; - std::vector* pVecVertices; + std::vector* pVecVertices; }; // @@ -22,12 +26,11 @@ class CPrimitive3DBatcher public: ZERO_ON_NEW CPrimitive3DBatcher(bool bPreGUI); - ~CPrimitive3DBatcher(void); void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); - void Flush(void); + void Flush(); void AddPrimitive(D3DPRIMITIVETYPE eType, std::vector* pVecVertices); void DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride); - bool HasItems(void) { return !m_primitiveList.empty(); } + bool HasItems() const { return !m_primitiveList.empty(); } protected: bool m_bPreGUI; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index 5be3cb93627..c5263965afd 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -578,9 +578,10 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) argStream.ReadEnumString(ePrimitiveType); argStream.ReadBool(bPostGUI, false); + std::vector vecTableContent; + while (argStream.NextIsTable()) { - std::vector vecTableContent; argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { @@ -590,6 +591,9 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) case Primitive3DVerticeSizes::VERT_XYZ_COLOR: pVecVertices->push_back(PrimitiveVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], static_cast(vecTableContent[3])}); break; + default: + argStream.SetCustomError(SString("Expected table with 3 or 4 numbers, got %i numbers", vecTableContent.size()).c_str()); + break; } } @@ -600,7 +604,12 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) g_pCore->GetGraphics()->DrawPrimitive3DQueued(pVecVertices, ePrimitiveType, bPostGUI); lua_pushboolean(luaVM, true); return 1; - } + } + else + { + lua_pushboolean(luaVM, false); + return 1; + } } else { @@ -609,7 +618,7 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) // Failed delete pVecVertices; - lua_pushboolean(luaVM, false); + lua_pushnil(luaVM); return 1; } @@ -625,9 +634,10 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) MixedReadMaterialString(argStream, pMaterialElement); argStream.ReadBool(bPostGUI, false); + std::vector vecTableContent; + while (argStream.NextIsTable()) { - std::vector vecTableContent; argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { @@ -637,6 +647,9 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) case Primitive3DVerticeSizes::VERT_XYZ_COLOR_UV: pVecVertices->push_back(PrimitiveMaterialVertice{ vecTableContent[0], vecTableContent[1], vecTableContent[2], static_cast(vecTableContent[3]),vecTableContent[4], vecTableContent[5] }); break; + default: + argStream.SetCustomError(SString("Expected table with 5 or 6 numbers, got %i numbers", vecTableContent.size()).c_str()); + break; } } @@ -647,7 +660,12 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) g_pCore->GetGraphics()->DrawMaterialPrimitive3DQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); lua_pushboolean(luaVM, true); return 1; - } + } + else + { + lua_pushboolean(luaVM, false); + return 1; + } } else { @@ -656,7 +674,7 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) // Failed delete pVecVertices; - lua_pushboolean(luaVM, false); + lua_pushnil(luaVM); return 1; } From 9c799ac2c2b86c2f172c99babdb461e8cd4795bd Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sat, 12 Jan 2019 19:17:59 +0100 Subject: [PATCH 5/7] fixed along Qaisjp tips --- .../deathmatch/logic/luadefs/CLuaDrawingDefs.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index c5263965afd..b2542e005dd 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -605,11 +605,6 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) lua_pushboolean(luaVM, true); return 1; } - else - { - lua_pushboolean(luaVM, false); - return 1; - } } else { @@ -618,7 +613,7 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) // Failed delete pVecVertices; - lua_pushnil(luaVM); + lua_pushboolean(luaVM, false); return 1; } @@ -661,11 +656,6 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) lua_pushboolean(luaVM, true); return 1; } - else - { - lua_pushboolean(luaVM, false); - return 1; - } } else { @@ -674,7 +664,7 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) // Failed delete pVecVertices; - lua_pushnil(luaVM); + lua_pushboolean(luaVM, false); return 1; } From bdcaa59290e269921d528808ee06a62fde62e500 Mon Sep 17 00:00:00 2001 From: CrosRoad95 Date: Sun, 11 Aug 2019 11:36:07 +0200 Subject: [PATCH 6/7] fixed --- Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp | 2 -- Client/core/Graphics/CMaterialPrimitive3DBatcher.h | 1 - Client/core/Graphics/CPrimitive3DBatcher.h | 1 - Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp | 2 +- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp index 3a65d5c4bf0..5ef73b65edb 100644 --- a/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp @@ -179,9 +179,7 @@ void CMaterialPrimitive3DBatcher::ClearQueue() delete primitive.pVecVertices; } - size_t prevSize = m_primitiveList.size(); m_primitiveList.clear(); - m_primitiveList.reserve(prevSize); } //////////////////////////////////////////////////////////////// // diff --git a/Client/core/Graphics/CMaterialPrimitive3DBatcher.h b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h index 6381ed2a3bb..bfbb52073e3 100644 --- a/Client/core/Graphics/CMaterialPrimitive3DBatcher.h +++ b/Client/core/Graphics/CMaterialPrimitive3DBatcher.h @@ -25,7 +25,6 @@ struct sPrimitiveMaterial3D class CMaterialPrimitive3DBatcher { public: - ZERO_ON_NEW CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* pGraphics); void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); void Flush(); diff --git a/Client/core/Graphics/CPrimitive3DBatcher.h b/Client/core/Graphics/CPrimitive3DBatcher.h index 7eae81cb2f5..e32fd9d8c32 100644 --- a/Client/core/Graphics/CPrimitive3DBatcher.h +++ b/Client/core/Graphics/CPrimitive3DBatcher.h @@ -24,7 +24,6 @@ struct sPrimitive3D class CPrimitive3DBatcher { public: - ZERO_ON_NEW CPrimitive3DBatcher(bool bPreGUI); void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY); void Flush(); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index e6c3a8250e2..2316ece8913 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -679,9 +679,9 @@ int CLuaDrawingDefs::DxDrawPrimitive(lua_State* luaVM) argStream.ReadEnumString(ePrimitiveType); argStream.ReadBool(bPostGUI); + std::vector vecTableContent; while (argStream.NextIsTable()) { - std::vector vecTableContent; argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { From 543f55e655a32914292e50d612a4d43dfcacff77 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Mon, 2 Sep 2019 19:22:23 +0300 Subject: [PATCH 7/7] Fix formatting, update errors and clear vectors --- .../logic/luadefs/CLuaDrawingDefs.cpp | 112 ++++++++---------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index f13590f2306..b7009f3a209 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -571,9 +571,9 @@ int CLuaDrawingDefs::DxDrawImageSection(lua_State* luaVM) int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) { // bool DxDrawPrimitive3D (string primitiveType, bool postGUI, table vertice1, ...) - D3DPRIMITIVETYPE ePrimitiveType; - auto pVecVertices = new std::vector(); - bool bPostGUI; + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + bool bPostGUI; CScriptArgReader argStream(luaVM); argStream.ReadEnumString(ePrimitiveType); argStream.ReadBool(bPostGUI, false); @@ -582,6 +582,8 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) while (argStream.NextIsTable()) { + vecTableContent.clear(); + argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { @@ -597,18 +599,14 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) } } - if (!argStream.HasErrors()) - { - if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) - { - g_pCore->GetGraphics()->DrawPrimitive3DQueued(pVecVertices, ePrimitiveType, bPostGUI); - lua_pushboolean(luaVM, true); - return 1; - } - } - else + if (argStream.HasErrors()) + return luaL_error(luaVM, argStream.GetFullErrorMessage()); + + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + g_pCore->GetGraphics()->DrawPrimitive3DQueued(pVecVertices, ePrimitiveType, bPostGUI); + lua_pushboolean(luaVM, true); + return 1; } // Failed @@ -620,10 +618,11 @@ int CLuaDrawingDefs::DxDrawPrimitive3D(lua_State* luaVM) int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) { // bool DxDrawMaterialPrimitive3D (string primitiveType, dxMaterial material, bool postGUI, table vertice1, ...) - D3DPRIMITIVETYPE ePrimitiveType; - auto pVecVertices = new std::vector(); - CClientMaterial* pMaterialElement; - bool bPostGUI; + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + CClientMaterial* pMaterialElement; + bool bPostGUI; + CScriptArgReader argStream(luaVM); argStream.ReadEnumString(ePrimitiveType); MixedReadMaterialString(argStream, pMaterialElement); @@ -633,14 +632,18 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) while (argStream.NextIsTable()) { + vecTableContent.clear(); + argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { case Primitive3DVerticeSizes::VERT_XYZ_UV: - pVecVertices->push_back(PrimitiveMaterialVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], (DWORD)0xFFFFFFFF, vecTableContent[3], vecTableContent[4] }); + pVecVertices->push_back(PrimitiveMaterialVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], (DWORD)0xFFFFFFFF, + vecTableContent[3], vecTableContent[4]}); break; case Primitive3DVerticeSizes::VERT_XYZ_COLOR_UV: - pVecVertices->push_back(PrimitiveMaterialVertice{ vecTableContent[0], vecTableContent[1], vecTableContent[2], static_cast(vecTableContent[3]),vecTableContent[4], vecTableContent[5] }); + pVecVertices->push_back(PrimitiveMaterialVertice{vecTableContent[0], vecTableContent[1], vecTableContent[2], + static_cast(vecTableContent[3]), vecTableContent[4], vecTableContent[5]}); break; default: argStream.SetCustomError(SString("Expected table with 5 or 6 numbers, got %i numbers", vecTableContent.size()).c_str()); @@ -648,18 +651,14 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) } } - if (!argStream.HasErrors()) - { - if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) - { - g_pCore->GetGraphics()->DrawMaterialPrimitive3DQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); - lua_pushboolean(luaVM, true); - return 1; - } - } - else + if (argStream.HasErrors()) + return luaL_error(luaVM, argStream.GetFullErrorMessage()); + + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + g_pCore->GetGraphics()->DrawMaterialPrimitive3DQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); + lua_pushboolean(luaVM, true); + return 1; } // Failed @@ -671,9 +670,9 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive3D(lua_State* luaVM) int CLuaDrawingDefs::DxDrawPrimitive(lua_State* luaVM) { // bool dxDrawPrimitive (string primitiveType, bool postGUI, table vertice1, ...) - D3DPRIMITIVETYPE ePrimitiveType; - auto pVecVertices = new std::vector(); - bool bPostGUI; + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + bool bPostGUI; CScriptArgReader argStream(luaVM); argStream.ReadEnumString(ePrimitiveType); @@ -700,18 +699,14 @@ int CLuaDrawingDefs::DxDrawPrimitive(lua_State* luaVM) } } - if (!argStream.HasErrors()) - { - if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) - { - g_pCore->GetGraphics()->DrawPrimitiveQueued(pVecVertices, ePrimitiveType, bPostGUI); - lua_pushboolean(luaVM, true); - return 1; - } - } - else + if (argStream.HasErrors()) + return luaL_error(luaVM, argStream.GetFullErrorMessage()); + + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + g_pCore->GetGraphics()->DrawPrimitiveQueued(pVecVertices, ePrimitiveType, bPostGUI); + lua_pushboolean(luaVM, true); + return 1; } // Failed @@ -723,10 +718,10 @@ int CLuaDrawingDefs::DxDrawPrimitive(lua_State* luaVM) int CLuaDrawingDefs::DxDrawMaterialPrimitive(lua_State* luaVM) { // bool dxDrawPrimitive (string primitiveType, dxMaterial material, bool postGUI, table vertice1, ...) - D3DPRIMITIVETYPE ePrimitiveType; - auto pVecVertices = new std::vector(); - CClientMaterial* pMaterialElement; - bool bPostGUI; + D3DPRIMITIVETYPE ePrimitiveType; + auto pVecVertices = new std::vector(); + CClientMaterial* pMaterialElement; + bool bPostGUI; CScriptArgReader argStream(luaVM); argStream.ReadEnumString(ePrimitiveType); @@ -738,6 +733,7 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive(lua_State* luaVM) while (argStream.NextIsTable()) { vecTableContent.clear(); + argStream.ReadNumberTable(vecTableContent); switch (vecTableContent.size()) { @@ -747,7 +743,7 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive(lua_State* luaVM) break; case PrimitiveVerticeSizes::VERT_XY_COLOR_UV: pVecVertices->push_back(PrimitiveMaterialVertice{vecTableContent[0], vecTableContent[1], 0, static_cast(vecTableContent[2]), - vecTableContent[3], vecTableContent[4]}); + vecTableContent[3], vecTableContent[4]}); break; default: argStream.SetCustomError(SString("Expected table with 4 or 5 numbers, got %i numbers", vecTableContent.size()).c_str()); @@ -755,18 +751,14 @@ int CLuaDrawingDefs::DxDrawMaterialPrimitive(lua_State* luaVM) } } - if (!argStream.HasErrors()) - { - if (pMaterialElement && g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) - { - g_pCore->GetGraphics()->DrawMaterialPrimitiveQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); - lua_pushboolean(luaVM, true); - return 1; - } - } if (argStream.HasErrors()) + return luaL_error(luaVM, argStream.GetFullErrorMessage()); + + if (g_pCore->GetGraphics()->IsValidPrimitiveSize(pVecVertices->size(), ePrimitiveType)) { - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + g_pCore->GetGraphics()->DrawMaterialPrimitiveQueued(pVecVertices, ePrimitiveType, pMaterialElement->GetMaterialItem(), bPostGUI); + lua_pushboolean(luaVM, true); + return 1; } // Failed