Merge pull request #6 from mq1n/mem-leak-fix

fix some memory leaks
This commit is contained in:
d1str4ught
2025-08-28 18:41:51 +02:00
committed by GitHub
10 changed files with 149 additions and 116 deletions

View File

@@ -155,9 +155,17 @@ bool CDibBar::Create(HDC hdc, DWORD dwWidth, DWORD dwHeight)
return true; return true;
} }
CDibBar::CDibBar() CDibBar::CDibBar() :
m_dwWidth(0),
m_dwHeight(0)
{ {
} }
CDibBar::~CDibBar() CDibBar::~CDibBar()
{ {
for (size_t i = 0; i < m_kVec_pkBlockTexture.size(); ++i)
{
CBlockTexture * pTexture = m_kVec_pkBlockTexture[i];
delete pTexture;
}
} }

View File

@@ -283,7 +283,8 @@ void CGraphicObjectInstance::Initialize()
D3DXMatrixIdentity(&m_worldMatrix); D3DXMatrixIdentity(&m_worldMatrix);
D3DXMatrixIdentity(&m_mRotation); D3DXMatrixIdentity(&m_mRotation);
ClearCollision();
OnInitialize(); OnInitialize();
} }

View File

@@ -11,6 +11,7 @@
#include "PhysicsObject.h" #include "PhysicsObject.h"
#include "ActorInstanceInterface.h" #include "ActorInstanceInterface.h"
#include "Interface.h" #include "Interface.h"
#include "../SpeedTreeLib/SpeedTreeForest.h"
//#include "../eterGrnLib/ThingInstance.h" //#include "../eterGrnLib/ThingInstance.h"
class CItemData; class CItemData;
@@ -808,7 +809,7 @@ class CActorInstance : public IActorInstance, public IFlyTargetableObject
THitDataMap m_HitDataMap; THitDataMap m_HitDataMap;
CActorInstance * m_pkHorse; CActorInstance * m_pkHorse;
CSpeedTreeWrapper * m_pkTree; CSpeedTreeForest::SpeedTreeWrapperPtr m_pkTree;
protected: protected:

View File

@@ -4,6 +4,7 @@
#include "../eterGrnLib/ThingInstance.h" #include "../eterGrnLib/ThingInstance.h"
#include "MapType.h" #include "MapType.h"
#include "DungeonBlock.h" #include "DungeonBlock.h"
#include "../SpeedTreeLib/SpeedTreeForest.h"
class CMapOutdoor; class CMapOutdoor;
class CEffectInstance; class CEffectInstance;
@@ -90,7 +91,7 @@ class CArea
CAttributeInstance * pAttributeInstance; CAttributeInstance * pAttributeInstance;
// Data For Tree // Data For Tree
CSpeedTreeWrapper * pTree; CSpeedTreeForest::SpeedTreeWrapperPtr pTree;
// Data For Normal Object or Building // Data For Normal Object or Building
BOOL isShadowFlag; BOOL isShadowFlag;
@@ -152,7 +153,7 @@ class CArea
} }
} TObjectInstance; } TObjectInstance;
typedef std::vector<CSpeedTreeWrapper *> TTreeInstanceVector; typedef std::vector<CSpeedTreeForest::SpeedTreeWrapperPtr> TTreeInstanceVector;
typedef std::vector<CGraphicThingInstance *> TThingInstanceVector; typedef std::vector<CGraphicThingInstance *> TThingInstanceVector;
typedef std::vector<CDungeonBlock *> TDungeonBlockInstanceVector; typedef std::vector<CDungeonBlock *> TDungeonBlockInstanceVector;
typedef std::vector<TObjectInstance *> TObjectInstanceVector; typedef std::vector<TObjectInstance *> TObjectInstanceVector;

View File

@@ -723,7 +723,7 @@ class CMapOutdoor : public CMapBase
private: private:
struct SXMasTree struct SXMasTree
{ {
CSpeedTreeWrapper* m_pkTree; CSpeedTreeForest::SpeedTreeWrapperPtr m_pkTree;
int m_iEffectID; int m_iEffectID;
} m_kXMas; } m_kXMas;

View File

@@ -20,7 +20,13 @@ using namespace std;
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// CSpeedTreeForest constructor // CSpeedTreeForest constructor
CSpeedTreeForest::CSpeedTreeForest() : m_fWindStrength(0.0f) CSpeedTreeForest::CSpeedTreeForest() :
m_fWindStrength(0.0f),
m_afFog{ 0.0f, 0.0f, 0.0f, 0.0f },
m_fAccumTime(0.0f),
m_afLighting{ 0.0f, 0.0f, 0.0f, 1.0f, // direction
0.2f, 0.2f, 0.2f, 1.0f, // ambient
0.8f, 0.8f, 0.8f, 1.0f } // diffuse
{ {
CSpeedTreeRT::SetNumWindMatrices(c_nNumWindMatrices); CSpeedTreeRT::SetNumWindMatrices(c_nNumWindMatrices);
@@ -39,24 +45,26 @@ CSpeedTreeForest::~CSpeedTreeForest()
void CSpeedTreeForest::Clear() void CSpeedTreeForest::Clear()
{ {
TTreeMap::iterator itor = m_pMainTreeMap.begin(); for (auto tr : m_pMainTreeMap)
UINT uiCount;
while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; SpeedTreeWrapperPtr pMainTree = tr.second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount);
for (UINT i = 0; i < uiCount; ++i) UINT uiCount;
delete ppInstances[i]; auto ppInstances = pMainTree->GetInstances(uiCount);
delete pMainTree; for (auto it : ppInstances)
it->Clear();
pMainTree->Clear();
} }
m_pMainTreeMap.clear(); if (m_pMainTreeMap.begin() != m_pMainTreeMap.end())
{
m_pMainTreeMap.clear();
}
} }
CSpeedTreeWrapper * CSpeedTreeForest::GetMainTree(DWORD dwCRC) CSpeedTreeForest::SpeedTreeWrapperPtr CSpeedTreeForest::GetMainTree(DWORD dwCRC)
{ {
TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC); TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC);
@@ -66,11 +74,11 @@ CSpeedTreeWrapper * CSpeedTreeForest::GetMainTree(DWORD dwCRC)
return itor->second; return itor->second;
} }
BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, const char * c_pszFileName) BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, SpeedTreeWrapperPtr &ppMainTree, const char * c_pszFileName)
{ {
TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC); TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC);
CSpeedTreeWrapper * pTree; SpeedTreeWrapperPtr pTree;
if (itor != m_pMainTreeMap.end()) if (itor != m_pMainTreeMap.end())
pTree = itor->second; pTree = itor->second;
@@ -82,40 +90,43 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree,
if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData)) if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
return FALSE; return FALSE;
pTree = new CSpeedTreeWrapper; pTree = std::make_shared<CSpeedTreeWrapper>();
if (!pTree->LoadTree(c_pszFileName, (const BYTE*)c_pvData, file.Size())) if (!pTree->LoadTree(c_pszFileName, (const BYTE *) c_pvData, file.Size()))
{ {
delete pTree; pTree.reset();
return FALSE; return FALSE;
} }
m_pMainTreeMap.insert(std::map<DWORD, CSpeedTreeWrapper*>::value_type(dwCRC, pTree)); m_pMainTreeMap.insert(std::map<DWORD, SpeedTreeWrapperPtr>::value_type(dwCRC, pTree));
file.Destroy(); file.Destroy();
} }
*ppMainTree = pTree; ppMainTree = pTree;
return TRUE; return TRUE;
} }
CSpeedTreeWrapper* CSpeedTreeForest::CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char * c_szTreeName) CSpeedTreeForest::SpeedTreeWrapperPtr CSpeedTreeForest::CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char* c_szTreeName)
{ {
CSpeedTreeWrapper * pMainTree; SpeedTreeWrapperPtr pMainTree;
if (!GetMainTree(dwTreeCRC, &pMainTree, c_szTreeName)) if (!GetMainTree(dwTreeCRC, pMainTree, c_szTreeName))
{
return NULL; return NULL;
}
CSpeedTreeWrapper* pTreeInst = pMainTree->MakeInstance(); SpeedTreeWrapperPtr pTreeInst = pMainTree->MakeInstance();
pTreeInst->SetPosition(x, y, z); pTreeInst->SetPosition(x, y, z);
pTreeInst->RegisterBoundingSphere(); pTreeInst->RegisterBoundingSphere();
return pTreeInst; return pTreeInst;
} }
void CSpeedTreeForest::DeleteInstance(CSpeedTreeWrapper * pInstance) void CSpeedTreeForest::DeleteInstance(SpeedTreeWrapperPtr pInstance)
{ {
if (!pInstance) if (!pInstance)
return; return;
CSpeedTreeWrapper * pParentTree = pInstance->InstanceOf(); SpeedTreeWrapperPtr pParentTree = pInstance->InstanceOf();
if (!pParentTree) if (!pParentTree)
return; return;
@@ -163,11 +174,11 @@ void CSpeedTreeForest::SetWindStrength(float fStrength)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
for (UINT i = 0; i < uiCount; ++i) for (auto it : ppInstances)
ppInstances[i]->GetSpeedTree()->SetWindStrength(m_fWindStrength); it->GetSpeedTree()->SetWindStrength(m_fWindStrength);
} }
} }

View File

@@ -57,7 +57,8 @@
class CSpeedTreeForest class CSpeedTreeForest
{ {
public: public:
typedef std::map<DWORD, CSpeedTreeWrapper *> TTreeMap; using SpeedTreeWrapperPtr = std::shared_ptr <CSpeedTreeWrapper>;
using TTreeMap = std::map <DWORD, SpeedTreeWrapperPtr>;
public: public:
CSpeedTreeForest(); CSpeedTreeForest();
@@ -65,13 +66,13 @@ class CSpeedTreeForest
void ClearMainTree(); void ClearMainTree();
BOOL GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, const char * c_pszFileName); BOOL GetMainTree(DWORD dwCRC, SpeedTreeWrapperPtr& ppMainTree, const char* c_pszFileName);
CSpeedTreeWrapper * GetMainTree(DWORD dwCRC); SpeedTreeWrapperPtr GetMainTree(DWORD dwCRC);
void DeleteMainTree(DWORD dwCRC); void DeleteMainTree(DWORD dwCRC);
CSpeedTreeWrapper * CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char * c_pszTreeName); SpeedTreeWrapperPtr CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char* c_pszTreeName);
void DeleteInstance(CSpeedTreeWrapper * pTree); void DeleteInstance(SpeedTreeWrapperPtr pTree);
//void SetLodLimits(void); //void SetLodLimits(void);

View File

@@ -165,13 +165,11 @@ void CSpeedTreeForestDirectX8::Render(unsigned long ulRenderBitVector)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
for (UINT i = 0; i < uiCount; ++i) for (auto it : ppInstances)
{ it->Advance();
ppInstances[i]->Advance();
}
} }
STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_Light, m_afLighting, 3); STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_Light, m_afLighting, 3);
@@ -226,8 +224,8 @@ void CSpeedTreeForestDirectX8::Render(unsigned long ulRenderBitVector)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
pMainTree->SetupBranchForTreeType(); pMainTree->SetupBranchForTreeType();
@@ -247,17 +245,19 @@ void CSpeedTreeForestDirectX8::Render(unsigned long ulRenderBitVector)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
pMainTree->SetupFrondForTreeType(); pMainTree->SetupFrondForTreeType();
for (UINT i = 0; i < uiCount; ++i) for (auto it : ppInstances)
if (ppInstances[i]->isShow()) {
ppInstances[i]->RenderFronds(); if (it->isShow())
it->RenderFronds();
}
} }
} }
// render leaves // render leaves
if (ulRenderBitVector & Forest_RenderLeaves) if (ulRenderBitVector & Forest_RenderLeaves)
{ {
@@ -281,14 +281,16 @@ void CSpeedTreeForestDirectX8::Render(unsigned long ulRenderBitVector)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
pMainTree->SetupLeafForTreeType(); pMainTree->SetupLeafForTreeType();
for (UINT i = 0; i < uiCount; ++i) for (auto it : ppInstances)
if (ppInstances[i]->isShow()) {
ppInstances[i]->RenderLeaves(); if (it->isShow())
it->RenderLeaves();
}
} }
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
@@ -313,14 +315,16 @@ void CSpeedTreeForestDirectX8::Render(unsigned long ulRenderBitVector)
while (itor != m_pMainTreeMap.end()) while (itor != m_pMainTreeMap.end())
{ {
CSpeedTreeWrapper * pMainTree = (itor++)->second; auto pMainTree = (itor++)->second;
CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount); auto ppInstances = pMainTree->GetInstances(uiCount);
pMainTree->SetupBranchForTreeType(); pMainTree->SetupLeafForTreeType();
for (UINT i = 0; i < uiCount; ++i) for (auto it : ppInstances)
if (ppInstances[i]->isShow()) {
ppInstances[i]->RenderBillboards(); if (it->isShow())
it->RenderBillboards();
}
} }
} }
#endif #endif

View File

@@ -743,80 +743,85 @@ void CSpeedTreeWrapper::Advance(void)
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// CSpeedTreeWrapper::MakeInstance // CSpeedTreeWrapper::MakeInstance
CSpeedTreeWrapper * CSpeedTreeWrapper::MakeInstance() CSpeedTreeWrapper::SpeedTreeWrapperPtr CSpeedTreeWrapper::MakeInstance()
{ {
CSpeedTreeWrapper * pInstance = new CSpeedTreeWrapper; auto spInstance = std::make_shared<CSpeedTreeWrapper>();
// make an instance of this object's SpeedTree // make an instance of this object's SpeedTree
pInstance->m_bIsInstance = true; spInstance->m_bIsInstance = true;
SAFE_DELETE(pInstance->m_pSpeedTree); SAFE_DELETE(spInstance->m_pSpeedTree);
pInstance->m_pSpeedTree = m_pSpeedTree->MakeInstance(); spInstance->m_pSpeedTree = m_pSpeedTree->MakeInstance();
if (pInstance->m_pSpeedTree) if (spInstance->m_pSpeedTree)
{ {
// use the same materials // use the same materials
pInstance->m_cBranchMaterial = m_cBranchMaterial; spInstance->m_cBranchMaterial = m_cBranchMaterial;
pInstance->m_cLeafMaterial = m_cLeafMaterial; spInstance->m_cLeafMaterial = m_cLeafMaterial;
pInstance->m_cFrondMaterial = m_cFrondMaterial; spInstance->m_cFrondMaterial = m_cFrondMaterial;
pInstance->m_CompositeImageInstance.SetImagePointer(m_CompositeImageInstance.GetGraphicImagePointer()); spInstance->m_CompositeImageInstance.SetImagePointer(m_CompositeImageInstance.GetGraphicImagePointer());
pInstance->m_BranchImageInstance.SetImagePointer(m_BranchImageInstance.GetGraphicImagePointer()); spInstance->m_BranchImageInstance.SetImagePointer(m_BranchImageInstance.GetGraphicImagePointer());
if (!m_ShadowImageInstance.IsEmpty()) if (!m_ShadowImageInstance.IsEmpty())
pInstance->m_ShadowImageInstance.SetImagePointer(m_ShadowImageInstance.GetGraphicImagePointer()); spInstance->m_ShadowImageInstance.SetImagePointer(m_ShadowImageInstance.GetGraphicImagePointer());
pInstance->m_pTextureInfo = m_pTextureInfo; spInstance->m_pTextureInfo = m_pTextureInfo;
// use the same geometry cache // use the same geometry cache
pInstance->m_pGeometryCache = m_pGeometryCache; spInstance->m_pGeometryCache = m_pGeometryCache;
// use the same buffers // use the same buffers
pInstance->m_pBranchIndexBuffer = m_pBranchIndexBuffer; spInstance->m_pBranchIndexBuffer = m_pBranchIndexBuffer;
pInstance->m_pBranchIndexCounts = m_pBranchIndexCounts; spInstance->m_pBranchIndexCounts = m_pBranchIndexCounts;
pInstance->m_pBranchVertexBuffer = m_pBranchVertexBuffer; spInstance->m_pBranchVertexBuffer = m_pBranchVertexBuffer;
pInstance->m_unBranchVertexCount = m_unBranchVertexCount; spInstance->m_unBranchVertexCount = m_unBranchVertexCount;
pInstance->m_pFrondIndexBuffer = m_pFrondIndexBuffer; spInstance->m_pFrondIndexBuffer = m_pFrondIndexBuffer;
pInstance->m_pFrondIndexCounts = m_pFrondIndexCounts; spInstance->m_pFrondIndexCounts = m_pFrondIndexCounts;
pInstance->m_pFrondVertexBuffer = m_pFrondVertexBuffer; spInstance->m_pFrondVertexBuffer = m_pFrondVertexBuffer;
pInstance->m_unFrondVertexCount = m_unFrondVertexCount; spInstance->m_unFrondVertexCount = m_unFrondVertexCount;
pInstance->m_pLeafVertexBuffer = m_pLeafVertexBuffer; spInstance->m_pLeafVertexBuffer = m_pLeafVertexBuffer;
pInstance->m_usNumLeafLods = m_usNumLeafLods; spInstance->m_usNumLeafLods = m_usNumLeafLods;
pInstance->m_pLeavesUpdatedByCpu = m_pLeavesUpdatedByCpu; spInstance->m_pLeavesUpdatedByCpu = m_pLeavesUpdatedByCpu;
// new stuff // new stuff
memcpy(pInstance->m_afPos, m_afPos, 3 * sizeof(float)); memcpy(spInstance->m_afPos, m_afPos, 3 * sizeof(float));
memcpy(pInstance->m_afBoundingBox, m_afBoundingBox, 6 * sizeof(float)); memcpy(spInstance->m_afBoundingBox, m_afBoundingBox, 6 * sizeof(float));
pInstance->m_pInstanceOf = this; spInstance->m_pInstanceOf = shared_from_this();
m_vInstances.push_back(pInstance); m_vInstances.push_back(spInstance);
} }
else else
{ {
fprintf(stderr, "SpeedTreeRT Error: %s\n", m_pSpeedTree->GetCurrentError()); fprintf(stderr, "SpeedTreeRT Error: %s\n", m_pSpeedTree->GetCurrentError());
delete pInstance; spInstance.reset();
pInstance = NULL;
} }
return pInstance; return spInstance;
} }
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// CSpeedTreeWrapper::GetInstances // CSpeedTreeWrapper::GetInstances
std::vector <CSpeedTreeWrapper::SpeedTreeWrapperPtr> CSpeedTreeWrapper::GetInstances(UINT& nCount)
CSpeedTreeWrapper ** CSpeedTreeWrapper::GetInstances(UINT& nCount)
{ {
std::vector <SpeedTreeWrapperPtr> kResult;
nCount = m_vInstances.size(); nCount = m_vInstances.size();
if (nCount) if (nCount)
return &(m_vInstances[0]); {
else for (auto it : m_vInstances)
return NULL; {
kResult.push_back(it);
}
}
return kResult;
} }
void CSpeedTreeWrapper::DeleteInstance(CSpeedTreeWrapper * pInstance) void CSpeedTreeWrapper::DeleteInstance(SpeedTreeWrapperPtr pInstance)
{ {
std::vector<CSpeedTreeWrapper *>::iterator itor = m_vInstances.begin(); auto itor = m_vInstances.begin();
while (itor != m_vInstances.end()) while (itor != m_vInstances.end())
{ {
@@ -827,7 +832,6 @@ void CSpeedTreeWrapper::DeleteInstance(CSpeedTreeWrapper * pInstance)
else else
++itor; ++itor;
} }
delete pInstance;
} }
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////

View File

@@ -42,6 +42,7 @@
#include <d3d9types.h> #include <d3d9types.h>
#include <d3dx9.h> #include <d3dx9.h>
#include <vector> #include <vector>
#include <memory>
#include "EterLib/GrpObjectInstance.h" #include "EterLib/GrpObjectInstance.h"
#include "EterLib/GrpImageInstance.h" #include "EterLib/GrpImageInstance.h"
@@ -63,8 +64,10 @@
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4100) #pragma warning(disable:4100)
class CSpeedTreeWrapper : public CGraphicObjectInstance class CSpeedTreeWrapper : public CGraphicObjectInstance, public std::enable_shared_from_this<CSpeedTreeWrapper>
{ {
using SpeedTreeWrapperPtr = std::shared_ptr <CSpeedTreeWrapper>;
enum enum
{ {
ID = TREE_OBJECT ID = TREE_OBJECT
@@ -125,10 +128,10 @@ public:
void RenderBillboards(void) const; void RenderBillboards(void) const;
// instancing // instancing
CSpeedTreeWrapper ** GetInstances(unsigned int& nCount); std::vector <SpeedTreeWrapperPtr> GetInstances(UINT& nCount);
CSpeedTreeWrapper * InstanceOf(void) const { return m_pInstanceOf; } SpeedTreeWrapperPtr InstanceOf(void) const { return m_pInstanceOf; }
CSpeedTreeWrapper * MakeInstance(); SpeedTreeWrapperPtr MakeInstance();
void DeleteInstance(CSpeedTreeWrapper * pInstance); void DeleteInstance(SpeedTreeWrapperPtr pInstance);
CSpeedTreeRT * GetSpeedTree(void) const { return m_pSpeedTree; } CSpeedTreeRT * GetSpeedTree(void) const { return m_pSpeedTree; }
// lighting // lighting
@@ -154,15 +157,14 @@ private:
static bool LoadTexture(const char* pFilename, CGraphicImageInstance & rImage); static bool LoadTexture(const char* pFilename, CGraphicImageInstance & rImage);
void SetShaderConstants(const float* pMaterial) const; void SetShaderConstants(const float* pMaterial) const;
private: private:
// SpeedTreeRT data // SpeedTreeRT data
CSpeedTreeRT* m_pSpeedTree; // the SpeedTree object CSpeedTreeRT* m_pSpeedTree; // the SpeedTree object
CSpeedTreeRT::STextures* m_pTextureInfo; // texture info cache CSpeedTreeRT::STextures* m_pTextureInfo; // texture info cache
bool m_bIsInstance; // is this an instance? bool m_bIsInstance; // is this an instance?
std::vector<CSpeedTreeWrapper*> m_vInstances; // what is an instance of us std::vector<SpeedTreeWrapperPtr> m_vInstances; // what is an instance of us
CSpeedTreeWrapper* m_pInstanceOf; // which tree is this an instance of SpeedTreeWrapperPtr m_pInstanceOf; // which tree is this an instance of
// geometry cache // geometry cache
CSpeedTreeRT::SGeometry* m_pGeometryCache; // cache for pulling geometry from SpeedTree avoids lots of reallocation CSpeedTreeRT::SGeometry* m_pGeometryCache; // cache for pulling geometry from SpeedTree avoids lots of reallocation