Jump to content

Recommended Posts

  • Active+ Member

There is a memory leak in the SpeedTree library implementation used in metin2 client, nothing too serious about memory usage but it also affects CPU usage.

There is a leaked "CSpeedTreeRT" instance for each tree instance created at runtime, this can escalate quickly after a few hours of metinstone farming.

Every CSpeedTreeRT instance is "updated" (including the leaked ones) when "CSpeedTreeRT::SetTime" is called (once per frame obviously) resulting extra memory and CPU usage wasted.

 

The leak occurs when "CSpeedTreeWrapper::MakeInstance" is called (when a tree instance is created from a "main tree")

when a "CSpeedTreeWrapper" instance is created we have a "CSpeedTreeRT" instance (m_pSpeedTree) this ptr is then reassigned without freeing (pInstance->m_pSpeedTree = m_pSpeedTree->MakeInstance();)

 

You can fix it in many ways, go the way you like, here is one (git patch download below)

 

Spoiler
diff --git a/SpeedTreeLib/SpeedTreeForest.cpp b/SpeedTreeLib/SpeedTreeForest.cpp
index b7342de..4e4ba5e 100644
--- a/SpeedTreeLib/SpeedTreeForest.cpp
+++ b/SpeedTreeLib/SpeedTreeForest.cpp
@@ -84,6 +84,10 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree,
 
 		pTree = new CSpeedTreeWrapper;
 
+		// For main tree instance explicitely make CSpeedTreeRT object
+		//  for instances it's "instanced" from main tree in "MakeInstance"
+		pTree->MakeSpeedTree();
+
 		if (!pTree->LoadTree(c_pszFileName, (const BYTE *) c_pvData, file.Size()))
 		{
 			delete pTree;
diff --git a/SpeedTreeLib/SpeedTreeWrapper.cpp b/SpeedTreeLib/SpeedTreeWrapper.cpp
index 87eb836..3ca6016 100644
--- a/SpeedTreeLib/SpeedTreeWrapper.cpp
+++ b/SpeedTreeLib/SpeedTreeWrapper.cpp
@@ -57,7 +57,7 @@ bool CSpeedTreeWrapper::ms_bSelfShadowOn = true;
 ///////////////////////////////////////////////////////////////////////  
 //	CSpeedTreeWrapper::CSpeedTreeWrapper
 CSpeedTreeWrapper::CSpeedTreeWrapper() :
-m_pSpeedTree(new CSpeedTreeRT),
+m_pSpeedTree(nullptr),
 m_bIsInstance(false),
 m_pInstanceOf(NULL),
 m_pGeometryCache(NULL),
@@ -73,12 +73,28 @@ m_pLeavesUpdatedByCpu(NULL),
 m_unBranchVertexCount(0),
 m_unFrondVertexCount(0),
 m_pTextureInfo(NULL)
+{
+	Initialize();
+}
+
+void CSpeedTreeWrapper::Initialize()
 {
 	// set initial position
 	m_afPos[0] = m_afPos[1] = m_afPos[2] = 0.0f;
-	
-	m_pSpeedTree->SetWindStrength(1.0f);
-	m_pSpeedTree->SetLocalMatrices(0, 4);
+
+	if (m_pSpeedTree)
+	{
+		m_pSpeedTree->SetWindStrength(1.0f);
+		m_pSpeedTree->SetLocalMatrices(0, 4);
+	}
+}
+
+void CSpeedTreeWrapper::MakeSpeedTree()
+{
+	assert(m_pSpeedTree == nullptr);
+
+	m_pSpeedTree = new CSpeedTreeRT;
+	Initialize();
 }
 
 void CSpeedTreeWrapper::SetVertexShaders(DWORD dwBranchVertexShader, DWORD dwLeafVertexShader)
diff --git a/SpeedTreeLib/SpeedTreeWrapper.h b/SpeedTreeLib/SpeedTreeWrapper.h
index ea9e9ce..86ffa89 100644
--- a/SpeedTreeLib/SpeedTreeWrapper.h
+++ b/SpeedTreeLib/SpeedTreeWrapper.h
@@ -97,6 +97,8 @@ public:
 public:
 	CSpeedTreeWrapper();
 	virtual	~CSpeedTreeWrapper();
+
+	void						Initialize();
 
 	const float *				GetPosition();
 	static void					SetVertexShaders(DWORD dwBranchVertexShader, DWORD dwLeafVertexShader);
@@ -128,6 +130,7 @@ public:
 	CSpeedTreeWrapper *			InstanceOf(void) const							{ return m_pInstanceOf; }
 	CSpeedTreeWrapper * 		MakeInstance();								
 	void						DeleteInstance(CSpeedTreeWrapper * pInstance);
+	void						MakeSpeedTree();
 	CSpeedTreeRT *				GetSpeedTree(void) const						{ return m_pSpeedTree; }
 
 	// lighting	

 

 

in SpeedTreeWrapper.h:

add these somewhere in CSpeedTreeWrapper class declaration ("MakeSpeedTree" must be public, "Initialize" can be private):

void Initialize();
void MakeSpeedTree();

 

in SpeedTreeWrapper.cpp:

replace CSpeedTreeWrapper::CSpeedTreeWrapper() definition to (notice "m_pSpeedTree" initialization to nullptr here):

CSpeedTreeWrapper::CSpeedTreeWrapper() :
m_pSpeedTree(nullptr),
m_bIsInstance(false),
m_pInstanceOf(NULL),
m_pGeometryCache(NULL),
m_usNumLeafLods(0),
m_pBranchIndexCounts(NULL),
m_pBranchIndexBuffer(NULL),
m_pBranchVertexBuffer(NULL),
m_pFrondIndexCounts(NULL),
m_pFrondIndexBuffer(NULL),
m_pFrondVertexBuffer(NULL),
m_pLeafVertexBuffer(NULL),
m_pLeavesUpdatedByCpu(NULL),
m_unBranchVertexCount(0),
m_unFrondVertexCount(0),
m_pTextureInfo(NULL)
{
	Initialize();
}

 

add:

void CSpeedTreeWrapper::Initialize()
{
	// set initial position
	m_afPos[0] = m_afPos[1] = m_afPos[2] = 0.0f;

	if (m_pSpeedTree)
	{
		m_pSpeedTree->SetWindStrength(1.0f);
		m_pSpeedTree->SetLocalMatrices(0, 4);
	}
}

void CSpeedTreeWrapper::MakeSpeedTree()
{
	assert(m_pSpeedTree == nullptr);

	m_pSpeedTree = new CSpeedTreeRT;
	Initialize();
}

 

in SpeedTreeForest.cpp

in 

BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, const char * c_pszFileName)

below:

pTree = new CSpeedTreeWrapper;

add:

// For main tree instance explicitely make CSpeedTreeRT object
//  for instances it's "instanced" from main tree in "MakeInstance"
pTree->MakeSpeedTree();

 

Done

  • Metin2 Dev 6
  • Good 5
  • Love 1
  • Love 5
Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/
Share on other sites

After installing this, when i log in inside the game i get these errors:
 

Quote
0221 20:17:18470 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18470 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18471 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18471 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18471 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18472 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18472 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18473 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18473 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18473 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18474 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18474 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18475 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18476 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18478 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18479 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18480 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18481 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18481 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18482 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18482 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18482 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18483 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18486 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18487 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18488 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18488 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18491 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18492 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18492 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18492 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18493 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18510 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18510 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18511 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18511 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18511 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18512 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18512 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18512 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18513 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18513 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18514 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18514 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18515 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18515 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18515 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18527 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18530 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18531 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18531 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18531 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18532 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18540 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18541 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18545 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18545 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18546 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18548 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18548 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18548 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18549 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18549 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18550 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18550 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18571 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18571 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18572 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18572 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18572 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18580 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18580 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18580 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18581 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18582 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18582 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18582 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18583 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18583 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18600 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18600 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18600 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18601 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18601 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18601 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18602 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18602 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18602 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18603 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18603 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18604 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18604 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18604 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18605 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18605 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18605 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18605 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18606 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18606 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18606 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18607 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18607 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18607 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18608 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18608 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18608 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18608 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18610 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18610 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18610 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18611 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18612 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18612 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18620 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18621 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18621 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18621 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18623 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18623 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18623 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18624 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18625 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18626 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18626 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18627 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18627 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18627 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18628 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18628 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18628 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18629 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18629 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18630 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18630 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18630 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18630 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18631 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18631 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18631 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18632 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18633 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18633 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18634 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18634 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18634 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18635 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18635 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18635 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18636 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18636 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18637 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18637 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18637 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18638 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18638 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18638 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18638 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18640 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18640 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18678 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18678 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18678 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18680 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18681 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18681 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18681 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18682 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18682 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18682 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18696 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18696 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18696 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18697 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18697 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18697 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18698 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18711 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18711 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18712 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18712 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18713 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18713 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18713 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18714 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18714 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18714 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18715 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18720 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18721 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18734 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18735 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18735 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18735 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18736 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18736 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18738 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18738 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18739 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18740 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18740 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18745 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18760 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18760 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18761 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18761 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18762 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18762 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18762 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18763 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18763 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18763 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18764 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18764 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18764 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18765 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18765 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18766 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18766 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18766 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18767 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18767 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18767 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18768 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18768 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18768 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18768 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18770 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18770 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18770 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18771 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18771 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18772 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18772 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18772 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18773 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18773 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18773 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18774 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18774 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18774 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18775 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18775 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18776 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18776 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18776 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18777 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18777 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18777 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18778 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18784 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18785 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18785 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18785 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18786 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18786 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18787 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18787 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18787 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18788 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18788 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18788 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18788 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18790 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18790 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18790 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18791 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18791 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18791 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18792 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18792 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18792 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18793 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18793 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18793 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18794 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18794 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18795 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18795 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18795 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18796 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18797 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18797 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18797 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18798 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18803 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18804 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18804 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18804 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18805 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18805 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18807 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18807 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18808 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18808 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18808 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18808 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18810 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18810 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18811 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18811 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18811 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18812 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18812 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18812 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18813 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18813 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18813 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18814 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18814 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18815 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18815 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18815 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18816 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18816 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18816 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18817 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18817 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18817 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18818 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18818 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18818 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18820 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18820 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18820 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18820 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18821 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18821 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18821 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18822 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18822 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18823 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18823 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18823 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18824 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18824 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18824 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18825 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18825 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18826 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18827 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18827 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:18835 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18835 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18835 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt2.spt' [No such file or directory]
0221 20:17:18836 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18836 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18836 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt.spt' [No such file or directory]
0221 20:17:18837 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18837 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18837 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18838 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt3.spt' [No such file or directory]
0221 20:17:18838 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18838 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18839 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18839 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18840 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt4.spt' [No such file or directory]
0221 20:17:18840 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18840 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18840 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt.spt' [No such file or directory]
0221 20:17:18841 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18841 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18841 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18842 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18842 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt5.spt' [No such file or directory]
0221 20:17:18842 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18843 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18843 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18843 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18844 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt.spt' [No such file or directory]
0221 20:17:18844 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18844 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18845 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18845 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18846 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18846 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_pagodatree_rt2.spt' [No such file or directory]
0221 20:17:18846 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18847 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt2.spt' [No such file or directory]
0221 20:17:18847 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall.spt' [No such file or directory]
0221 20:17:18847 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b3_beech_rt3.spt' [No such file or directory]
0221 20:17:18848 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18848 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_beech_rt4.spt' [No such file or directory]
0221 20:17:18848 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18848 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18850 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18850 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18850 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_montereycypress_rt3.spt' [No such file or directory]
0221 20:17:18851 :: SpeedTreeRT Error: CSpeedTreeRT::Load Tree - failed to load file 'd:/ymir work/tree/Shye/Officials/b1_sassafras_rt_fall2.spt' [No such file or directory]
0221 20:17:24303 :: svside\empty.jpg
0221 20:17:24303 :: svside\0.jpg
0221 20:17:24304 :: mark\10_0.tga
0221 20:17:24550 :: keysave
0221 20:17:25733 :: CRaceManager::GetRaceDataPointer: cannot load data by dwRaceIndex 20025
0221 20:17:25733 :: CPythonCharacterManager::CreateInstance VID[20025] Race[20025]
0221 20:17:25733 :: Failed to preload race 20025

 

I already have these files. I dont know why i get these errors.

“𝓐𝓵𝓵 𝔀𝓮 𝓱𝓪𝓿𝓮 𝓽𝓸 𝓭𝓮𝓬𝓲𝓭𝓮 𝓲𝓼 𝔀𝓱𝓪𝓽 𝓽𝓸 𝓭𝓸 𝔀𝓲𝓽𝓱 𝓽𝓱𝓮 𝓽𝓲𝓶𝓮 𝓽𝓱𝓪𝓽 𝓲𝓼 𝓰𝓲𝓿𝓮𝓷 𝓾𝓼.” ~ 𝓖𝓪𝓷𝓭𝓪𝓵𝓯 𝓽𝓱𝓮 𝓖𝓻𝓮𝔂

Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169590
Share on other sites

  • Active+ Member
22 minutes ago, Jimmermania said:

After installing this, when i log in inside the game i get these errors:
 

I already have these files. I dont know why i get these errors.

Can't see how this could be related, could you provide me a git diff of the changes you applied?

  • kekw 1
Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169591
Share on other sites

3 hours ago, Trial said:

Can't see how this could be related, could you provide me a git diff of the changes you applied?

These are my current files:
 

Quote
///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper Class
//
//	(c) 2003 IDV, Inc.
//
//	This class is provided to illustrate one way to incorporate
//	SpeedTreeRT into an OpenGL application.  All of the SpeedTreeRT
//	calls that must be made on a per tree basis are done by this class.
//	Calls that apply to all trees (i.e. static SpeedTreeRT functions)
//	are made in the functions in main.cpp.
//
//
//	*** INTERACTIVE DATA VISUALIZATION (IDV) PROPRIETARY INFORMATION ***
//
//	This software is supplied under the terms of a license agreement or
//	nondisclosure agreement with Interactive Data Visualization and may
//	not be copied or disclosed except in accordance with the terms of
//	that agreement.
//
//      Copyright (c) 2001-2003 IDV, Inc.
//      All Rights Reserved.
//
//		IDV, Inc.
//		1233 Washington St. Suite 610
//		Columbia, SC 29201
//		Voice: (803) 799-1699
//		Fax:   (803) 931-0320
//		Web:   http://www.idvinc.com
//

#pragma warning(disable:4786)

///////////////////////////////////////////////////////////////////////
//	Include Files
#include "StdAfx.h"

#include <stdlib.h>
#include <stdio.h>
#include "../eterBase/Debug.h"
#include "../eterBase/Timer.h"
#include "../eterBase/Filename.h"
#include "../eterLib/ResourceManager.h"
#include "../eterLib/Camera.h"
#include "../eterLib/StateManager.h"

#include "SpeedTreeConfig.h"
#include "SpeedTreeForestDirectX8.h"
#include "SpeedTreeWrapper.h"
#include "VertexShaders.h"

DWORD CSpeedTreeWrapper::ms_dwBranchVertexShader = 0;
DWORD CSpeedTreeWrapper::ms_dwLeafVertexShader = 0;
bool CSpeedTreeWrapper::ms_bSelfShadowOn = true;

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::CSpeedTreeWrapper
CSpeedTreeWrapper::CSpeedTreeWrapper() :
m_pSpeedTree(nullptr),
m_bIsInstance(false),
m_pInstanceOf(NULL),
m_pGeometryCache(NULL),
m_usNumLeafLods(0),
m_pBranchIndexCounts(NULL),
m_pBranchIndexBuffer(NULL),
m_pBranchVertexBuffer(NULL),
m_pFrondIndexCounts(NULL),
m_pFrondIndexBuffer(NULL),
m_pFrondVertexBuffer(NULL),
m_pLeafVertexBuffer(NULL),
m_pLeavesUpdatedByCpu(NULL),
m_unBranchVertexCount(0),
m_unFrondVertexCount(0),
m_pTextureInfo(NULL)
{
	Initialize();
}

void CSpeedTreeWrapper::Initialize()
{
	// set initial position
	m_afPos[0] = m_afPos[1] = m_afPos[2] = 0.0f;

	if (m_pSpeedTree)
	{
		m_pSpeedTree->SetWindStrength(1.0f);
		m_pSpeedTree->SetLocalMatrices(0, 4);
	}
}

void CSpeedTreeWrapper::MakeSpeedTree()
{
	assert(m_pSpeedTree == nullptr);

	m_pSpeedTree = new CSpeedTreeRT;
	Initialize();
}

void CSpeedTreeWrapper::SetVertexShaders(DWORD dwBranchVertexShader, DWORD dwLeafVertexShader)
{
	ms_dwBranchVertexShader = dwBranchVertexShader;
	ms_dwLeafVertexShader = dwLeafVertexShader;
}

void CSpeedTreeWrapper::OnRenderPCBlocker()
{
	if (ms_dwBranchVertexShader == 0)
	{
		ms_dwBranchVertexShader = LoadBranchShader(ms_lpd3dDevice);
		//LogBox("Vertex Shader not assigned. You must call CSpeedTreeWrapper::SetVertexShader for this");
	}

	if (ms_dwLeafVertexShader == 0)
	{
		ms_dwLeafVertexShader = LoadLeafShader(ms_lpd3dDevice);
		//LogBox("Vertex Shader not assigned. You must call CSpeedTreeWrapper::SetVertexShader for this");
	}

	CSpeedTreeForestDirectX8::Instance().UpdateSystem(ELTimer_GetMSec() / 1000.0f);

	m_pSpeedTree->SetLodLevel(1.0f);
	//Advance();

	CSpeedTreeForestDirectX8::Instance().UpdateCompundMatrix(CCameraManager::Instance().GetCurrentCamera()->GetEye(), ms_matView, ms_matProj);

	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1,	D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2,	D3DTA_DIFFUSE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP,	D3DTOP_MODULATE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1,	D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2,	D3DTA_DIFFUSE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP,	D3DTOP_MODULATE);

	STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

	DWORD dwLighting = STATEMANAGER.GetRenderState(D3DRS_LIGHTING);
	DWORD dwFogEnable = STATEMANAGER.GetRenderState(D3DRS_FOGENABLE);
	DWORD dwAlphaBlendEnable = STATEMANAGER.GetRenderState(D3DRS_ALPHABLENDENABLE);
 	STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
	STATEMANAGER.SaveRenderState(D3DRS_COLORVERTEX, TRUE);
    STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
	STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_CW);
 	STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);

	// choose fixed function pipeline or custom shader for fronds and branches
	STATEMANAGER.SetVertexShader(ms_dwBranchVertexShader);

// 	SetupBranchForTreeType();
	{
		// update the branch geometry for CPU wind
#ifdef WRAPPER_USE_CPU_WIND
		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry);

		if (m_pGeometryCache->m_sBranches.m_usNumStrips > 0)
		{
			// update the vertex array
			SFVFBranchVertex* pVertexBuffer = NULL;
			m_pBranchVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
			for (UINT i = 0; i < m_unBranchVertexCount; ++i)
			{
				memcpy(&(pVertexBuffer[i].m_vPosition), &(m_pGeometryCache->m_sBranches.m_pCoords[i * 3]), 3 * sizeof(float));
			}
			m_pBranchVertexBuffer->Unlock();
		}
#endif

		LPDIRECT3DTEXTURE8 lpd3dTexture;

		// set texture map
		if ((lpd3dTexture = m_BranchImageInstance.GetTextureReference().GetD3DTexture()))
			STATEMANAGER.SetTexture(0, lpd3dTexture);

		if (m_pGeometryCache->m_sBranches.m_usVertexCount > 0)
		{
			// activate the branch vertex buffer
			STATEMANAGER.SetStreamSource(0, m_pBranchVertexBuffer, sizeof(SFVFBranchVertex));
			// set the index buffer
			STATEMANAGER.SetIndices(m_pBranchIndexBuffer, 0);
		}
	}

	RenderBranches();

	STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());
	STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

// 	SetupFrondForTreeType();
	{
		// update the frond geometry for CPU wind
#ifdef WRAPPER_USE_CPU_WIND
		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry);
		if (m_pGeometryCache->m_sFronds.m_usNumStrips > 0)
		{
			// update the vertex array
			SFVFBranchVertex * pVertexBuffer = NULL;
			m_pFrondVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
			for (UINT i = 0; i < m_unFrondVertexCount; ++i)
			{
				memcpy(&(pVertexBuffer[i].m_vPosition), &(m_pGeometryCache->m_sFronds.m_pCoords[i * 3]), 3 * sizeof(float));
			}
			m_pFrondVertexBuffer->Unlock();
		}
#endif

		if (!m_CompositeImageInstance.IsEmpty())
			STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());

		if (m_pGeometryCache->m_sFronds.m_usVertexCount > 0)
		{
			// activate the frond vertex buffer
			STATEMANAGER.SetStreamSource(0, m_pFrondVertexBuffer, sizeof(SFVFBranchVertex));
			// set the index buffer
			STATEMANAGER.SetIndices(m_pFrondIndexBuffer, 0);
		}
	}
	RenderFronds();

	STATEMANAGER.SetVertexShader(ms_dwLeafVertexShader);

// 	SetupLeafForTreeType();
	{
		// pass leaf tables to shader
#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
		UploadLeafTables(c_nVertexShader_LeafTables);
#endif

		if (!m_CompositeImageInstance.IsEmpty())
			STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());
	}
	RenderLeaves();
	EndLeafForTreeType();

	STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
	STATEMANAGER.SetRenderState(D3DRS_COLORVERTEX, FALSE);
	RenderBillboards();

	STATEMANAGER.RestoreRenderState(D3DRS_COLORVERTEX);
	STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE);
	STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE);
	STATEMANAGER.RestoreRenderState(D3DRS_ALPHAFUNC);
	STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, dwAlphaBlendEnable);
	STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLighting);
 	STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, dwFogEnable);

	STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
}

void CSpeedTreeWrapper::OnRender()
{
	if (ms_dwBranchVertexShader == 0)
	{
		ms_dwBranchVertexShader = LoadBranchShader(ms_lpd3dDevice);
		//LogBox("Vertex Shader not assigned. You must call CSpeedTreeWrapper::SetVertexShader for this");
	}

	if (ms_dwLeafVertexShader == 0)
	{
		ms_dwLeafVertexShader = LoadLeafShader(ms_lpd3dDevice);
		//LogBox("Vertex Shader not assigned. You must call CSpeedTreeWrapper::SetVertexShader for this");
	}

	CSpeedTreeForestDirectX8::Instance().UpdateSystem(ELTimer_GetMSec() / 1000.0f);

	m_pSpeedTree->SetLodLevel(1.0f);
	//Advance();

	CSpeedTreeForestDirectX8::Instance().UpdateCompundMatrix(CCameraManager::Instance().GetCurrentCamera()->GetEye(), ms_matView, ms_matProj);

	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1,	D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2,	D3DTA_DIFFUSE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP,	D3DTOP_MODULATE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1,	D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2,	D3DTA_DIFFUSE);
	STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP,	D3DTOP_MODULATE);

	STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);

	STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
	STATEMANAGER.SaveRenderState(D3DRS_COLORVERTEX, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, TRUE);
	STATEMANAGER.SaveRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
	STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_CW);
	STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);

	// choose fixed function pipeline or custom shader for fronds and branches
	STATEMANAGER.SetVertexShader(ms_dwBranchVertexShader);

	SetupBranchForTreeType();
	RenderBranches();

	STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());
	STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

	SetupFrondForTreeType();
	RenderFronds();

	STATEMANAGER.SetVertexShader(ms_dwLeafVertexShader);

	SetupLeafForTreeType();
	RenderLeaves();
	EndLeafForTreeType();

	STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
	STATEMANAGER.SetRenderState(D3DRS_COLORVERTEX, FALSE);
	RenderBillboards();

	STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
	STATEMANAGER.RestoreRenderState(D3DRS_COLORVERTEX);
    STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE);
	STATEMANAGER.RestoreRenderState(D3DRS_ALPHAFUNC);
	STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE);
	STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::~CSpeedTreeWrapper

CSpeedTreeWrapper::~CSpeedTreeWrapper()
{
	// if this is not an instance, clean up
	if (!m_bIsInstance)
	{
		if (m_unBranchVertexCount > 0)
		{
			SAFE_RELEASE(m_pBranchVertexBuffer);
			SAFE_RELEASE(m_pBranchIndexBuffer);
			SAFE_DELETE_ARRAY(m_pBranchIndexCounts);
		}

		if (m_unFrondVertexCount > 0)
		{
			SAFE_RELEASE(m_pFrondVertexBuffer);
			SAFE_RELEASE(m_pFrondIndexBuffer);
			SAFE_DELETE_ARRAY(m_pFrondIndexCounts);
		}

		for (short i = 0; i < m_usNumLeafLods; ++i)
		{
			m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_LeafGeometry, -1, -1, i);

			if (m_pGeometryCache->m_sLeaves0.m_usLeafCount > 0)
				SAFE_RELEASE(m_pLeafVertexBuffer[i]);
		}

		SAFE_DELETE_ARRAY(m_pLeavesUpdatedByCpu);
		SAFE_DELETE_ARRAY(m_pLeafVertexBuffer);

		SAFE_DELETE(m_pTextureInfo);

		SAFE_DELETE(m_pGeometryCache);
	}

	// always delete the speedtree
	SAFE_DELETE(m_pSpeedTree);

	Clear();
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::LoadTree
bool CSpeedTreeWrapper::LoadTree(const char * pszSptFile, const BYTE * c_pbBlock, unsigned int uiBlockSize, UINT nSeed, float fSize, float fSizeVariance)
{
    bool bSuccess = false;

	// directx, so allow for flipping of the texture coordinate
#ifdef WRAPPER_FLIP_T_TEXCOORD
	m_pSpeedTree->SetTextureFlip(true);
#endif

	// load the tree file
	if (!m_pSpeedTree->LoadTree(c_pbBlock, uiBlockSize))
	{
		if (!m_pSpeedTree->LoadTree(pszSptFile))
		{
			TraceError("SpeedTreeRT Error: %s", CSpeedTreeRT::GetCurrentError());
			return false;
		}
	}

	// override the lighting method stored in the spt file
#ifdef WRAPPER_USE_DYNAMIC_LIGHTING
	m_pSpeedTree->SetBranchLightingMethod(CSpeedTreeRT::LIGHT_DYNAMIC);
	m_pSpeedTree->SetLeafLightingMethod(CSpeedTreeRT::LIGHT_DYNAMIC);
	m_pSpeedTree->SetFrondLightingMethod(CSpeedTreeRT::LIGHT_DYNAMIC);
#else
	m_pSpeedTree->SetBranchLightingMethod(CSpeedTreeRT::LIGHT_STATIC);
	m_pSpeedTree->SetLeafLightingMethod(CSpeedTreeRT::LIGHT_STATIC);
	m_pSpeedTree->SetFrondLightingMethod(CSpeedTreeRT::LIGHT_STATIC);
#endif

	// set the wind method
#ifdef WRAPPER_USE_GPU_WIND
	m_pSpeedTree->SetBranchWindMethod(CSpeedTreeRT::WIND_GPU);
	m_pSpeedTree->SetLeafWindMethod(CSpeedTreeRT::WIND_GPU);
	m_pSpeedTree->SetFrondWindMethod(CSpeedTreeRT::WIND_GPU);
#endif
#ifdef WRAPPER_USE_CPU_WIND
	m_pSpeedTree->SetBranchWindMethod(CSpeedTreeRT::WIND_CPU);
	m_pSpeedTree->SetLeafWindMethod(CSpeedTreeRT::WIND_CPU);
	m_pSpeedTree->SetFrondWindMethod(CSpeedTreeRT::WIND_CPU);
#endif
#ifdef WRAPPER_USE_NO_WIND
	m_pSpeedTree->SetBranchWindMethod(CSpeedTreeRT::WIND_NONE);
	m_pSpeedTree->SetLeafWindMethod(CSpeedTreeRT::WIND_NONE);
	m_pSpeedTree->SetFrondWindMethod(CSpeedTreeRT::WIND_NONE);
#endif

	m_pSpeedTree->SetNumLeafRockingGroups(1);

	// override the size, if necessary
	if (fSize >= 0.0f && fSizeVariance >= 0.0f)
		m_pSpeedTree->SetTreeSize(fSize, fSizeVariance);

	// generate tree geometry
	if (m_pSpeedTree->Compute(NULL, nSeed))
	{
		// get the dimensions
		m_pSpeedTree->GetBoundingBox(m_afBoundingBox);

		// make the leaves rock in the wind
		m_pSpeedTree->SetLeafRockingState(true);

		// billboard setup
#ifdef WRAPPER_NO_BILLBOARD_MODE
		CSpeedTreeRT::SetDropToBillboard(false);
#else
		CSpeedTreeRT::SetDropToBillboard(true);
#endif

		// query & set materials
		m_cBranchMaterial.Set(m_pSpeedTree->GetBranchMaterial());
		m_cFrondMaterial.Set(m_pSpeedTree->GetFrondMaterial());
		m_cLeafMaterial.Set(m_pSpeedTree->GetLeafMaterial());

		// adjust lod distances
		float fHeight = m_afBoundingBox[5] - m_afBoundingBox[2];
		m_pSpeedTree->SetLodLimits(fHeight * c_fNearLodFactor, fHeight * c_fFarLodFactor);

		// query textures
		m_pTextureInfo = new CSpeedTreeRT::STextures;
		m_pSpeedTree->GetTextures(*m_pTextureInfo);

		// load branch textures
		LoadTexture((CFileNameHelper::GetPath(string(pszSptFile)) + CFileNameHelper::NoExtension(string(m_pTextureInfo->m_pBranchTextureFilename)) + ".dds").c_str(), m_BranchImageInstance);

#ifdef WRAPPER_RENDER_SELF_SHADOWS
		if (m_pTextureInfo->m_pSelfShadowFilename != NULL)
			LoadTexture((CFileNameHelper::GetPath(string(pszSptFile)) + CFileNameHelper::NoExtension(string(m_pTextureInfo->m_pSelfShadowFilename)) + ".dds").c_str(), m_ShadowImageInstance);
#endif
		if (m_pTextureInfo->m_pCompositeFilename)
			LoadTexture((CFileNameHelper::GetPath(string(pszSptFile)) + CFileNameHelper::NoExtension(string(m_pTextureInfo->m_pCompositeFilename)) + ".dds").c_str(), m_CompositeImageInstance);

		// setup the index and vertex buffers
		SetupBuffers();

		// everything appeared to go well
		bSuccess = true;
	}
	else // tree failed to compute
		fprintf(stderr, "\nFatal Error, cannot compute tree [%s]\n\n", CSpeedTreeRT::GetCurrentError());

    return bSuccess;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupBuffers

void CSpeedTreeWrapper::SetupBuffers(void)
{
	// read all the geometry for highest LOD into the geometry cache (just a precaution, it's updated later)
	m_pSpeedTree->SetLodLevel(1.0f);

	if (m_pGeometryCache == NULL)
		m_pGeometryCache = new CSpeedTreeRT::SGeometry;

	m_pSpeedTree->GetGeometry(*m_pGeometryCache);

	// setup the buffers for each part
	SetupBranchBuffers();
	SetupFrondBuffers();
	SetupLeafBuffers();
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupBranchBuffers

void CSpeedTreeWrapper::SetupBranchBuffers(void)
{
	// reference to branch structure
	CSpeedTreeRT::SGeometry::SIndexed* pBranches = &(m_pGeometryCache->m_sBranches);
	m_unBranchVertexCount = pBranches->m_usVertexCount; // we asked for a contiguous strip

	// check if this tree has branches
	if (m_unBranchVertexCount > 1)
	{
		// create the vertex buffer for storing branch vertices
		SFVFBranchVertex * pVertexBuffer = NULL;

#ifndef WRAPPER_USE_CPU_WIND
		ms_lpd3dDevice->CreateVertexBuffer(m_unBranchVertexCount * sizeof(SFVFBranchVertex), D3DUSAGE_WRITEONLY, D3DFVF_SPEEDTREE_BRANCH_VERTEX, D3DPOOL_MANAGED, &m_pBranchVertexBuffer);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pBranchVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), 0);
#else
		ms_lpd3dDevice->CreateVertexBuffer(m_unBranchVertexCount * sizeof(SFVFBranchVertex), D3DUSAGE_DYNAMIC, D3DFVF_SPEEDTREE_BRANCH_VERTEX, D3DPOOL_SYSTEMMEM, &m_pBranchVertexBuffer);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pBranchVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
#endif
		{
			for (UINT i = 0; i < m_unBranchVertexCount; ++i)
			{
				// position
				memcpy(&pVertexBuffer->m_vPosition, &(pBranches->m_pCoords[i * 3]), 3 * sizeof(float));

				// normal or color
#ifdef WRAPPER_USE_DYNAMIC_LIGHTING
				memcpy(&pVertexBuffer->m_vNormal, &(pBranches->m_pNormals[i * 3]), 3 * sizeof(float));
#else
				pVertexBuffer->m_dwDiffuseColor = pBranches->m_pColors[i];
#endif

				// texcoords for layer 0
				pVertexBuffer->m_fTexCoords[0] = pBranches->m_pTexCoords0[i * 2];
				pVertexBuffer->m_fTexCoords[1] = pBranches->m_pTexCoords0[i * 2 + 1];

				// texcoords for layer 1 (if enabled)
#ifdef WRAPPER_RENDER_SELF_SHADOWS
				pVertexBuffer->m_fShadowCoords[0] = pBranches->m_pTexCoords1[i * 2];
				pVertexBuffer->m_fShadowCoords[1] = pBranches->m_pTexCoords1[i * 2 + 1];
#endif

				// extra data for gpu wind
#ifdef WRAPPER_USE_GPU_WIND
				pVertexBuffer->m_fWindIndex = 4.0f * pBranches->m_pWindMatrixIndices[i];
				pVertexBuffer->m_fWindWeight = pBranches->m_pWindWeights[i];
#endif

				++pVertexBuffer;
			}
			m_pBranchVertexBuffer->Unlock();
		}

		// create and fill the index counts for each LOD
		UINT unNumLodLevels = m_pSpeedTree->GetNumBranchLodLevels();
		m_pBranchIndexCounts = new unsigned short[unNumLodLevels];
		for (UINT i = 0; i < unNumLodLevels; ++i)
		{
			// force update for particular LOD
			m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry, i);

			// check if this LOD has branches
			if (pBranches->m_usNumStrips > 0)
				m_pBranchIndexCounts[i] = pBranches->m_pStripLengths[0];
			else
				m_pBranchIndexCounts[i] = 0;
		}
		// set back to highest LOD
		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry, 0);

		// the first LOD level contains the most indices of all the levels, so
		// we use its size to allocate the index buffer
		ms_lpd3dDevice->CreateIndexBuffer(m_pBranchIndexCounts[0] * sizeof(unsigned short), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pBranchIndexBuffer);

		// fill the index buffer
		unsigned short* pIndexBuffer = NULL;
		m_pBranchIndexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pIndexBuffer), 0);
		memcpy(pIndexBuffer, pBranches->m_pStrips[0], pBranches->m_pStripLengths[0] * sizeof(unsigned short));
		m_pBranchIndexBuffer->Unlock();
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupFrondBuffers

void CSpeedTreeWrapper::SetupFrondBuffers(void)
{
	// reference to frond structure
	CSpeedTreeRT::SGeometry::SIndexed* pFronds = &(m_pGeometryCache->m_sFronds);
	m_unFrondVertexCount = pFronds->m_usVertexCount; // we asked for a contiguous strip

	// check if tree has fronds
	if (m_unFrondVertexCount > 1)
	{
		// create the vertex buffer for storing frond vertices
		SFVFBranchVertex * pVertexBuffer = NULL;
#ifndef WRAPPER_USE_CPU_WIND
		ms_lpd3dDevice->CreateVertexBuffer(m_unFrondVertexCount * sizeof(SFVFBranchVertex), D3DUSAGE_WRITEONLY, D3DFVF_SPEEDTREE_BRANCH_VERTEX, D3DPOOL_MANAGED, &m_pFrondVertexBuffer);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pFrondVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), 0);
#else
		ms_lpd3dDevice->CreateVertexBuffer(m_unFrondVertexCount * sizeof(SFVFBranchVertex), D3DUSAGE_DYNAMIC, D3DFVF_SPEEDTREE_BRANCH_VERTEX, D3DPOOL_SYSTEMMEM, &m_pFrondVertexBuffer);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pFrondVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
#endif
		for (UINT i = 0; i < m_unFrondVertexCount; ++i)
		{
			// position
			memcpy(&pVertexBuffer->m_vPosition, &(pFronds->m_pCoords[i * 3]), 3 * sizeof(float));

			// normal or color
#ifdef WRAPPER_USE_DYNAMIC_LIGHTING
			memcpy(&pVertexBuffer->m_vNormal, &(pFronds->m_pNormals[i * 3]), 3 * sizeof(float));
#else
			pVertexBuffer->m_dwDiffuseColor = pFronds->m_pColors[i];
#endif

			// texcoords for layer 0
			pVertexBuffer->m_fTexCoords[0] = pFronds->m_pTexCoords0[i * 2];
			pVertexBuffer->m_fTexCoords[1] = pFronds->m_pTexCoords0[i * 2 + 1];

			// texcoords for layer 1 (if enabled)
#ifdef WRAPPER_RENDER_SELF_SHADOWS
			pVertexBuffer->m_fShadowCoords[0] = pFronds->m_pTexCoords1[i * 2];
			pVertexBuffer->m_fShadowCoords[1] = pFronds->m_pTexCoords1[i * 2 + 1];
#endif

			// extra data for gpu wind
#ifdef WRAPPER_USE_GPU_WIND
			pVertexBuffer->m_fWindIndex = 4.0f * pFronds->m_pWindMatrixIndices[i];
			pVertexBuffer->m_fWindWeight = pFronds->m_pWindWeights[i];
#endif

			++pVertexBuffer;
		}
		m_pFrondVertexBuffer->Unlock();

		// create and fill the index counts for each LOD
		UINT unNumLodLevels = m_pSpeedTree->GetNumFrondLodLevels();
		m_pFrondIndexCounts = new unsigned short[unNumLodLevels];
		for (WORD j = 0; j < unNumLodLevels; ++j)
		{
			// force update for this LOD
			m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry, -1, j);

			// check if this LOD has fronds
			if (pFronds->m_usNumStrips > 0)
				m_pFrondIndexCounts[j] = pFronds->m_pStripLengths[0];
			else
				m_pFrondIndexCounts[j] = 0;
		}
		// go back to highest LOD
		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry, -1, 0);

		// the first LOD level contains the most indices of all the levels, so
		// we use its size to allocate the index buffer
		ms_lpd3dDevice->CreateIndexBuffer(m_pFrondIndexCounts[0] * sizeof(unsigned short), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pFrondIndexBuffer);

		// fill the index buffer
		unsigned short * pIndexBuffer = NULL;
		m_pFrondIndexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pIndexBuffer), 0);
		memcpy(pIndexBuffer, pFronds->m_pStrips[0], pFronds->m_pStripLengths[0] * sizeof(unsigned short));
		m_pFrondIndexBuffer->Unlock();
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupLeafBuffers

void CSpeedTreeWrapper::SetupLeafBuffers(void)
{
	// set up constants
	const short anVertexIndices[6] = { 0, 1, 2, 0, 2, 3 };
	//const int nNumLeafMaps = m_pTextureInfo->m_uiLeafTextureCount;

	// set up the leaf counts for each LOD
	m_usNumLeafLods = m_pSpeedTree->GetNumLeafLodLevels();

	// create array of vertex buffers (one for each LOD)
	m_pLeafVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_usNumLeafLods];

	// create array of bools for CPU updating (so we don't update for each instance)
	m_pLeavesUpdatedByCpu = new bool[m_usNumLeafLods];

	// cycle through LODs
	for (UINT unLod = 0; unLod < m_usNumLeafLods; ++unLod)
	{
		m_pLeavesUpdatedByCpu[unLod] = false;
		m_pLeafVertexBuffer[unLod] = NULL;

		// if this LOD has no leaves, skip it
		unsigned short usLeafCount = m_pGeometryCache->m_sLeaves0.m_usLeafCount;

		if (usLeafCount < 1)
			continue;

		SFVFLeafVertex* pVertexBuffer = NULL;
		// create the vertex buffer for storing leaf vertices
#ifndef WRAPPER_USE_CPU_LEAF_PLACEMENT
		ms_lpd3dDevice->CreateVertexBuffer(usLeafCount * 6 * sizeof(SFVFLeafVertex), D3DUSAGE_WRITEONLY, D3DFVF_SPEEDTREE_LEAF_VERTEX, D3DPOOL_MANAGED, &m_pLeafVertexBuffer[unLod]);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), 0);
#else
		ms_lpd3dDevice->CreateVertexBuffer(usLeafCount * 6 * sizeof(SFVFLeafVertex), D3DUSAGE_DYNAMIC, D3DFVF_SPEEDTREE_LEAF_VERTEX, D3DPOOL_SYSTEMMEM, &m_pLeafVertexBuffer[unLod]);
		// fill the vertex buffer by interleaving SpeedTree data
		m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
#endif
		SFVFLeafVertex* pVertex = pVertexBuffer;
		for (UINT unLeaf = 0; unLeaf < usLeafCount; ++unLeaf)
		{
			const CSpeedTreeRT::SGeometry::SLeaf* pLeaf = &(m_pGeometryCache->m_sLeaves0);
			for (UINT unVert = 0; unVert < 6; ++unVert)  // 6 verts == 2 triangles
			{
				// position
				memcpy(pVertex->m_vPosition, &(pLeaf->m_pCenterCoords[unLeaf * 3]), 3 * sizeof(float));

#ifdef WRAPPER_USE_DYNAMIC_LIGHTING
				// normal
				memcpy(&pVertex->m_vNormal, &(pLeaf->m_pNormals[unLeaf * 3]), 3 * sizeof(float));
#else
				// color
				pVertex->m_dwDiffuseColor = pLeaf->m_pColors[unLeaf];
#endif

				// tex coord
				memcpy(pVertex->m_fTexCoords, &(pLeaf->m_pLeafMapTexCoords[unLeaf][anVertexIndices[unVert] * 2]), 2 * sizeof(float));

				// wind weights
#ifdef WRAPPER_USE_GPU_WIND
				pVertex->m_fWindIndex = 4.0f * pLeaf->m_pWindMatrixIndices[unLeaf];
				pVertex->m_fWindWeight = pLeaf->m_pWindWeights[unLeaf];
#endif

				// GPU placement data
#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
				pVertex->m_fLeafPlacementIndex = c_nVertexShader_LeafTables + pLeaf->m_pLeafClusterIndices[unLeaf] * 4.0f + anVertexIndices[unVert];
				pVertex->m_fLeafScalarValue = m_pSpeedTree->GetLeafLodSizeAdjustments()[unLod];
#endif

				++pVertex;
			}
		}
		m_pLeafVertexBuffer[unLod]->Unlock();
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::Advance

void CSpeedTreeWrapper::Advance(void)
{
	// compute LOD level (based on distance from camera)
	m_pSpeedTree->ComputeLodLevel();
	m_pSpeedTree->SetLodLevel(1.0f);

	// compute wind
#ifdef WRAPPER_USE_CPU_WIND
	m_pSpeedTree->ComputeWindEffects(true, true, true);
#endif
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::MakeInstance
CSpeedTreeWrapper * CSpeedTreeWrapper::MakeInstance()
{
	CSpeedTreeWrapper * pInstance = new CSpeedTreeWrapper;

	// make an instance of this object's SpeedTree
	pInstance->m_bIsInstance = true;
	pInstance->m_pSpeedTree = m_pSpeedTree->MakeInstance();

	if (pInstance->m_pSpeedTree)
    {
		// use the same materials
		pInstance->m_cBranchMaterial = m_cBranchMaterial;
		pInstance->m_cLeafMaterial = m_cLeafMaterial;
		pInstance->m_cFrondMaterial = m_cFrondMaterial;
		pInstance->m_CompositeImageInstance.SetImagePointer(m_CompositeImageInstance.GetGraphicImagePointer());
		pInstance->m_BranchImageInstance.SetImagePointer(m_BranchImageInstance.GetGraphicImagePointer());

		if (!m_ShadowImageInstance.IsEmpty())
			pInstance->m_ShadowImageInstance.SetImagePointer(m_ShadowImageInstance.GetGraphicImagePointer());

		pInstance->m_pTextureInfo = m_pTextureInfo;

		// use the same geometry cache
		pInstance->m_pGeometryCache = m_pGeometryCache;

		// use the same buffers
		pInstance->m_pBranchIndexBuffer = m_pBranchIndexBuffer;
		pInstance->m_pBranchIndexCounts = m_pBranchIndexCounts;
		pInstance->m_pBranchVertexBuffer = m_pBranchVertexBuffer;
		pInstance->m_unBranchVertexCount = m_unBranchVertexCount;

		pInstance->m_pFrondIndexBuffer = m_pFrondIndexBuffer;
		pInstance->m_pFrondIndexCounts = m_pFrondIndexCounts;
		pInstance->m_pFrondVertexBuffer = m_pFrondVertexBuffer;
		pInstance->m_unFrondVertexCount = m_unFrondVertexCount;

		pInstance->m_pLeafVertexBuffer = m_pLeafVertexBuffer;
		pInstance->m_usNumLeafLods = m_usNumLeafLods;
		pInstance->m_pLeavesUpdatedByCpu = m_pLeavesUpdatedByCpu;

		// new stuff
		memcpy(pInstance->m_afPos, m_afPos, 3 * sizeof(float));
		memcpy(pInstance->m_afBoundingBox, m_afBoundingBox, 6 * sizeof(float));
		pInstance->m_pInstanceOf = this;
		m_vInstances.push_back(pInstance);
    }
    else
	{
		fprintf(stderr, "SpeedTreeRT Error: %s\n", m_pSpeedTree->GetCurrentError());
        delete pInstance;
        pInstance = NULL;
	}

	return pInstance;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::GetInstances

CSpeedTreeWrapper ** CSpeedTreeWrapper::GetInstances(UINT& nCount)
{
	nCount = m_vInstances.size();
	if (nCount)
		return &(m_vInstances[0]);
	else
		return NULL;
}

void CSpeedTreeWrapper::DeleteInstance(CSpeedTreeWrapper * pInstance)
{
	std::vector<CSpeedTreeWrapper *>::iterator itor = m_vInstances.begin();

	while (itor != m_vInstances.end())
	{
		if (*itor == pInstance)
		{
			itor = m_vInstances.erase(itor);
		}
		else
			++itor;
	}
	delete pInstance;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupBranchForTreeType

void CSpeedTreeWrapper::SetupBranchForTreeType(void) const
{
#ifdef WRAPPER_USE_DYNAMIC_LIGHTING
	// set lighting material
	STATEMANAGER.SetMaterial(m_cBranchMaterial.Get());
	SetShaderConstants(m_pSpeedTree->GetBranchMaterial());
#endif

	// update the branch geometry for CPU wind
#ifdef WRAPPER_USE_CPU_WIND
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry);

	if (m_pGeometryCache->m_sBranches.m_usNumStrips > 0)
	{
		// update the vertex array
		SFVFBranchVertex* pVertexBuffer = NULL;
		m_pBranchVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
		for (UINT i = 0; i < m_unBranchVertexCount; ++i)
		{
			memcpy(&(pVertexBuffer[i].m_vPosition), &(m_pGeometryCache->m_sBranches.m_pCoords[i * 3]), 3 * sizeof(float));
		}
		m_pBranchVertexBuffer->Unlock();
	}
#endif

	LPDIRECT3DTEXTURE8 lpd3dTexture;

    // set texture map
    if ((lpd3dTexture = m_BranchImageInstance.GetTextureReference().GetD3DTexture()))
        STATEMANAGER.SetTexture(0, lpd3dTexture);

	// bind shadow texture
#ifdef WRAPPER_RENDER_SELF_SHADOWS
	if (ms_bSelfShadowOn && (lpd3dTexture = m_ShadowImageInstance.GetTextureReference().GetD3DTexture()))
		STATEMANAGER.SetTexture(1, lpd3dTexture);
	else
		STATEMANAGER.SetTexture(1, NULL);
#endif

	if (m_pGeometryCache->m_sBranches.m_usVertexCount > 0)
	{
		// activate the branch vertex buffer
		STATEMANAGER.SetStreamSource(0, m_pBranchVertexBuffer, sizeof(SFVFBranchVertex));
		// set the index buffer
		STATEMANAGER.SetIndices(m_pBranchIndexBuffer, 0);
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::RenderBranches

void CSpeedTreeWrapper::RenderBranches(void) const
{
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry);

	if (m_pGeometryCache->m_fBranchAlphaTestValue)
	{
		PositionTree();

		// set alpha test value
		STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_fBranchAlphaTestValue));

		// render if this LOD has branches
		if (m_pBranchIndexCounts &&
			m_pBranchIndexCounts[m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel] > 0)
		{
			ms_faceCount += m_pBranchIndexCounts[m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel] - 2;
			STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, m_pGeometryCache->m_sBranches.m_usVertexCount, 0, m_pBranchIndexCounts[m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel] - 2);
		}
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupFrondForTreeType

void CSpeedTreeWrapper::SetupFrondForTreeType(void) const
{
#ifdef SPEEDTREE_LIGHTING_DYNAMIC
	// set lighting material
	STATEMANAGER.SetMaterial(m_cFrondMaterial.Get());
	SetShaderConstants(m_pSpeedTree->GetFrondMaterial());
#endif

	// update the frond geometry for CPU wind
#ifdef WRAPPER_USE_CPU_WIND
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry);
	if (m_pGeometryCache->m_sFronds.m_usNumStrips > 0)
	{
		// update the vertex array
		SFVFBranchVertex * pVertexBuffer = NULL;
		m_pFrondVertexBuffer->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertexBuffer), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
		for (UINT i = 0; i < m_unFrondVertexCount; ++i)
		{
			memcpy(&(pVertexBuffer[i].m_vPosition), &(m_pGeometryCache->m_sFronds.m_pCoords[i * 3]), 3 * sizeof(float));
		}
		m_pFrondVertexBuffer->Unlock();
	}
#endif

	if (!m_CompositeImageInstance.IsEmpty())
		STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());

	// bind shadow texture
#ifdef WRAPPER_RENDER_SELF_SHADOWS
	LPDIRECT3DTEXTURE8 lpd3dTexture;

	if ((lpd3dTexture = m_ShadowImageInstance.GetTextureReference().GetD3DTexture()))
		STATEMANAGER.SetTexture(1, lpd3dTexture);
#endif

	if (m_pGeometryCache->m_sFronds.m_usVertexCount > 0)
	{
		// activate the frond vertex buffer
		STATEMANAGER.SetStreamSource(0, m_pFrondVertexBuffer, sizeof(SFVFBranchVertex));
		// set the index buffer
		STATEMANAGER.SetIndices(m_pFrondIndexBuffer, 0);
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::RenderFronds

void CSpeedTreeWrapper::RenderFronds(void) const
{
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry);

	if (m_pGeometryCache->m_fFrondAlphaTestValue > 0.0f)
	{
		PositionTree();

		// set alpha test value
		STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_fFrondAlphaTestValue));

		// render if this LOD has fronds
		if (m_pFrondIndexCounts &&
			m_pFrondIndexCounts[m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel] > 0)
		{
			ms_faceCount += m_pFrondIndexCounts[m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel] - 2;
			STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, m_pGeometryCache->m_sFronds.m_usVertexCount, 0, m_pFrondIndexCounts[m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel] - 2);
		}
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetupLeafForTreeType

void CSpeedTreeWrapper::SetupLeafForTreeType(void) const
{
#ifdef SPEEDTREE_LIGHTING_DYNAMIC
	// set lighting material
	STATEMANAGER.SetMaterial(m_cLeafMaterial.Get());
	SetShaderConstants(m_pSpeedTree->GetLeafMaterial());
#endif

	// pass leaf tables to shader
#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
	UploadLeafTables(c_nVertexShader_LeafTables);
#endif

	if (!m_CompositeImageInstance.IsEmpty())
		STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());

	// bind shadow texture
#ifdef WRAPPER_RENDER_SELF_SHADOWS
	STATEMANAGER.SetTexture(1, NULL);
#endif
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::UploadLeafTables

#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
void CSpeedTreeWrapper::UploadLeafTables(UINT uiLocation) const
{
	// query leaf cluster table from RT
	UINT uiEntryCount = 0;
	const float * pTable = m_pSpeedTree->GetLeafBillboardTable(uiEntryCount);

	// upload for vertex shader use
	STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_LeafTables, pTable, uiEntryCount / 4);
}
#endif

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::RenderLeaves

void CSpeedTreeWrapper::RenderLeaves(void) const
{
	// update leaf geometry
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_LeafGeometry);

	// update the LOD level vertex arrays we need
#if defined(WRAPPER_USE_GPU_LEAF_PLACEMENT) && defined(WRAPPER_USE_GPU_WIND)
	// do nothing, needs no updates
#else
#if !defined WRAPPER_USE_NO_WIND || defined WRAPPER_USE_CPU_LEAF_PLACEMENT
	// possibly need to update both leaf LOD's
	for (UINT i = 0; i < 2; ++i)
	{
		// reference to leaf structure
		const CSpeedTreeRT::SGeometry::SLeaf* pLeaf = (i == 0) ? &m_pGeometryCache->m_sLeaves0 : &m_pGeometryCache->m_sLeaves1;
		int unLod = pLeaf->m_nDiscreteLodLevel;

#if defined WRAPPER_USE_GPU_LEAF_PLACEMENT
		if (pLeaf->m_bIsActive && !m_pLeavesUpdatedByCpu[unLod])
		{
			// update the centers
			SFVFLeafVertex* pVertex = NULL;
			m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertex), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK);
			for (UINT unLeaf = 0; unLeaf < pLeaf->m_usLeafCount; ++unLeaf)
			{
				D3DXVECTOR3 vecCenter(&(pLeaf->m_pCenterCoords[unLeaf * 3]));
				(pVertex++)->m_vPosition = vecCenter;		// vertex 0
				(pVertex++)->m_vPosition = vecCenter;		// vertex 1
				(pVertex++)->m_vPosition = vecCenter;		// vertex 2
				(pVertex++)->m_vPosition = vecCenter;		// vertex 0
				(pVertex++)->m_vPosition = vecCenter;		// vertex 2
				(pVertex++)->m_vPosition = vecCenter;		// vertex 3
			}
			m_pLeafVertexBuffer[unLod]->Unlock();
			m_pLeavesUpdatedByCpu[unLod] = true;
		}
#else
		if (pLeaf->m_bIsActive && m_pLeafVertexBuffer[unLod])
		{
			// update the vertex positions
			SFVFLeafVertex * pVertex = NULL;

			const UINT VERTEX_NUM = 8192;
			if (pLeaf->m_usLeafCount*3>=VERTEX_NUM)
				return;

			D3DXVECTOR3 akPosition[VERTEX_NUM];
			D3DXVECTOR3*pkPosition=akPosition;
			const float* center=pLeaf->m_pCenterCoords;
			for (UINT unLeaf = 0; unLeaf < pLeaf->m_usLeafCount; ++unLeaf)
			{
				pkPosition[0].x=pLeaf->m_pLeafMapCoords[unLeaf][0]+center[0];
				pkPosition[0].y=pLeaf->m_pLeafMapCoords[unLeaf][1]+center[1];
				pkPosition[0].z=pLeaf->m_pLeafMapCoords[unLeaf][2]+center[2];
				pkPosition[1].x=pLeaf->m_pLeafMapCoords[unLeaf][4]+center[0];
				pkPosition[1].y=pLeaf->m_pLeafMapCoords[unLeaf][5]+center[1];
				pkPosition[1].z=pLeaf->m_pLeafMapCoords[unLeaf][6]+center[2];
				pkPosition[2].x=pLeaf->m_pLeafMapCoords[unLeaf][8]+center[0];
				pkPosition[2].y=pLeaf->m_pLeafMapCoords[unLeaf][9]+center[1];
				pkPosition[2].z=pLeaf->m_pLeafMapCoords[unLeaf][10]+center[2];
				pkPosition[3]=pkPosition[0];
				pkPosition[4]=pkPosition[2];
				pkPosition[5].x=pLeaf->m_pLeafMapCoords[unLeaf][12]+center[0];
				pkPosition[5].y=pLeaf->m_pLeafMapCoords[unLeaf][13]+center[1];
				pkPosition[5].z=pLeaf->m_pLeafMapCoords[unLeaf][14]+center[2];
				pkPosition+=6;
				center+=3;
			}

			if (SUCCEEDED(
				m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<BYTE**>(&pVertex), D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK)
			))
			{
				UINT uVtxCount=pLeaf->m_usLeafCount*6;
				for (UINT i = 0; i<uVtxCount; ++i)
					pVertex[i].m_vPosition=akPosition[i];

					/*
					memcpy(vec0, pLeaf->m_pLeafMapCoords[unLeaf]+0, sizeof(D3DXVECTOR3));
					memcpy(vec1, pLeaf->m_pLeafMapCoords[unLeaf]+4, sizeof(D3DXVECTOR3));
					memcpy(vec2, pLeaf->m_pLeafMapCoords[unLeaf]+8, sizeof(D3DXVECTOR3));
					memcpy(vec3, pLeaf->m_pLeafMapCoords[unLeaf]+12, sizeof(D3DXVECTOR3));
					memcpy(vecCenter, pLeaf->m_pCenterCoords + unLeaf * 3, sizeof(D3DXVECTOR3));
					vec0 += vecCenter;
					vec1 += vecCenter;
					vec2 += vecCenter;
					vec3 += vecCenter;

					pVertex[0].m_vPosition = vec0;
					pVertex[3].m_vPosition = vec0;
					pVertex[1].m_vPosition = vec1;
					pVertex[4].m_vPosition = vec2;
					pVertex[2].m_vPosition = vec2;
					pVertex[5].m_vPosition = vec3;
					*/
				/*
				for (UINT unLeaf = 0; unLeaf < pLeaf->m_usLeafCount; ++unLeaf)
				{
					D3DXVECTOR3 vecCenter(&(pLeaf->m_pCenterCoords[unLeaf * 3]));
					D3DXVECTOR3 vec0(&pLeaf->m_pLeafMapCoords[unLeaf][0]);
					D3DXVECTOR3 vec1(&pLeaf->m_pLeafMapCoords[unLeaf][4]);
					D3DXVECTOR3 vec2(&pLeaf->m_pLeafMapCoords[unLeaf][8]);
					D3DXVECTOR3 vec3(&pLeaf->m_pLeafMapCoords[unLeaf][12]);

					(pVertex++)->m_vPosition = vecCenter + vec0;		// vertex 0
					(pVertex++)->m_vPosition = vecCenter + vec1;		// vertex 1
					(pVertex++)->m_vPosition = vecCenter + vec2;		// vertex 2
					(pVertex++)->m_vPosition = vecCenter + vec0;		// vertex 0
					(pVertex++)->m_vPosition = vecCenter + vec2;		// vertex 2
					(pVertex++)->m_vPosition = vecCenter + vec3;		// vertex 3
				}
				*/
				m_pLeafVertexBuffer[unLod]->Unlock();
			}
		}
#endif
	}
#endif
#endif

	PositionTree();

	// render LODs, if needed
	for (UINT unLeafLevel = 0; unLeafLevel < 2; ++unLeafLevel)
	{
		const CSpeedTreeRT::SGeometry::SLeaf* pLeaf = (unLeafLevel == 0) ?
			&m_pGeometryCache->m_sLeaves0 : &m_pGeometryCache->m_sLeaves1;

		int unLod = pLeaf->m_nDiscreteLodLevel;

		if (unLod > -1 && pLeaf->m_bIsActive && pLeaf->m_usLeafCount > 0)
		{
			STATEMANAGER.SetStreamSource(0, m_pLeafVertexBuffer[unLod], sizeof(SFVFLeafVertex));
			STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(pLeaf->m_fAlphaTestValue));

			ms_faceCount += pLeaf->m_usLeafCount * 2;
			STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLELIST, 0, pLeaf->m_usLeafCount * 2);
		}
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::EndLeafForTreeType

void CSpeedTreeWrapper::EndLeafForTreeType(void)
{
	// reset copy flags for CPU wind
	for (UINT i = 0; i < m_usNumLeafLods; ++i)
		m_pLeavesUpdatedByCpu[i] = false;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::RenderBillboards

void CSpeedTreeWrapper::RenderBillboards(void) const
{
	// render billboards in immediate mode (as close as DirectX comes to immediate mode)
#ifdef WRAPPER_BILLBOARD_MODE
	if (!m_CompositeImageInstance.IsEmpty())
		STATEMANAGER.SetTexture(0, m_CompositeImageInstance.GetTextureReference().GetD3DTexture());

	PositionTree();

	struct SBillboardVertex
	{
		float fX, fY, fZ;
		float fU, fV;
	};

	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BillboardGeometry);

	if (m_pGeometryCache->m_sBillboard0.m_bIsActive)
	{
		const float* pCoords = m_pGeometryCache->m_sBillboard0.m_pCoords;
		const float* pTexCoords = m_pGeometryCache->m_sBillboard0.m_pTexCoords;
		SBillboardVertex sVertex[4] =
		{
			{ pCoords[0], pCoords[1], pCoords[2], pTexCoords[0], pTexCoords[1] },
			{ pCoords[3], pCoords[4], pCoords[5], pTexCoords[2], pTexCoords[3] },
			{ pCoords[6], pCoords[7], pCoords[8], pTexCoords[4], pTexCoords[5] },
			{ pCoords[9], pCoords[10], pCoords[11], pTexCoords[6], pTexCoords[7] },
		};

		STATEMANAGER.SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1);
		STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sBillboard0.m_fAlphaTestValue));

		ms_faceCount += 2;
		STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
	}

	// if tree supports 360 degree billboards, render the second
	if (m_pGeometryCache->m_sBillboard1.m_bIsActive)
	{
		const float* pCoords = m_pGeometryCache->m_sBillboard1.m_pCoords;
		const float* pTexCoords = m_pGeometryCache->m_sBillboard1.m_pTexCoords;
		SBillboardVertex sVertex[4] =
		{
			{ pCoords[0], pCoords[1], pCoords[2], pTexCoords[0], pTexCoords[1] },
			{ pCoords[3], pCoords[4], pCoords[5], pTexCoords[2], pTexCoords[3] },
			{ pCoords[6], pCoords[7], pCoords[8], pTexCoords[4], pTexCoords[5] },
			{ pCoords[9], pCoords[10], pCoords[11], pTexCoords[6], pTexCoords[7] },
		};
		STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sBillboard1.m_fAlphaTestValue));

		ms_faceCount += 2;
		STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
	}

#ifdef WRAPPER_RENDER_HORIZONTAL_BILLBOARD
	// render horizontal billboard (if enabled)
	if (m_pGeometryCache->m_sHorizontalBillboard.m_bIsActive)
	{
		const float* pCoords = m_pGeometryCache->m_sHorizontalBillboard.m_pCoords;
		const float* pTexCoords = m_pGeometryCache->m_sHorizontalBillboard.m_pTexCoords;
		SBillboardVertex sVertex[4] =
		{
			{ pCoords[0], pCoords[1], pCoords[2], pTexCoords[0], pTexCoords[1] },
			{ pCoords[3], pCoords[4], pCoords[5], pTexCoords[2], pTexCoords[3] },
			{ pCoords[6], pCoords[7], pCoords[8], pTexCoords[4], pTexCoords[5] },
			{ pCoords[9], pCoords[10], pCoords[11], pTexCoords[6], pTexCoords[7] },
		};
		STATEMANAGER.SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sHorizontalBillboard.m_fAlphaTestValue));

		ms_faceCount += 2;
		STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
	}

#endif
#endif
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::CleanUpMemory

void CSpeedTreeWrapper::CleanUpMemory(void)
{
	if (!m_bIsInstance)
		m_pSpeedTree->DeleteTransientData();
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::PositionTree

void CSpeedTreeWrapper::PositionTree(void) const
{
	D3DXVECTOR3 vecPosition = m_pSpeedTree->GetTreePosition();
	D3DXMATRIX matTranslation;
	D3DXMatrixIdentity(&matTranslation);
	D3DXMatrixTranslation(&matTranslation, vecPosition.x, vecPosition.y, vecPosition.z);

	// store translation for client-side transformation
	STATEMANAGER.SetTransform(D3DTS_WORLD, &matTranslation);

    // store translation for use in vertex shader
	D3DXVECTOR4 vecConstant(vecPosition[0], vecPosition[1], vecPosition[2], 0.0f);
	STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_TreePos, (float*)&vecConstant, 1);
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::LoadTexture

bool CSpeedTreeWrapper::LoadTexture(const char * pFilename, CGraphicImageInstance & rImage)
{
	CResource * pResource = CResourceManager::Instance().GetResourcePointer(pFilename);
	rImage.SetImagePointer(static_cast<CGraphicImage *>(pResource));

	if (rImage.IsEmpty())
		return false;

	//TraceError("SpeedTreeWrapper::LoadTexture: %s", pFilename);
	return true;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeWrapper::SetShaderConstants

void CSpeedTreeWrapper::SetShaderConstants(const float* pMaterial) const
{
	const float afUsefulConstants[] =
	{
		m_pSpeedTree->GetLeafLightingAdjustment(), 0.0f, 0.0f, 0.0f,
	};

	STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_LeafLightingAdjustment, afUsefulConstants, 1);

	const float afMaterial[] =
	{
		pMaterial[0], pMaterial[1], pMaterial[2], 1.0f,
			pMaterial[3], pMaterial[4], pMaterial[5], 1.0f
	};

	STATEMANAGER.SetVertexShaderConstant(c_nVertexShader_Material, afMaterial, 2);
}

void CSpeedTreeWrapper::SetPosition(float x, float y, float z)
{
	m_afPos[0] = x;
	m_afPos[1] = y;
	m_afPos[2] = z;
	m_pSpeedTree->SetTreePosition(x, y, z);
	CGraphicObjectInstance::SetPosition(x, y, z);
}

bool CSpeedTreeWrapper::GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius)
{
	float fX, fY, fZ;

	fX = m_afBoundingBox[3] - m_afBoundingBox[0];
	fY = m_afBoundingBox[4] - m_afBoundingBox[1];
	fZ = m_afBoundingBox[5] - m_afBoundingBox[2];

	v3Center.x = 0.0f;
	v3Center.y = 0.0f;
	v3Center.z = fZ * 0.5f;

	fRadius = sqrtf(fX * fX + fY * fY + fZ * fZ) * 0.5f * 0.9f; // 0.9f for reduce size

	D3DXVECTOR3 vec = m_pSpeedTree->GetTreePosition();

	v3Center+=vec;

	return true;
}

void CSpeedTreeWrapper::CalculateBBox()
{
	float fX, fY, fZ;

	fX = m_afBoundingBox[3] - m_afBoundingBox[0];
	fY = m_afBoundingBox[4] - m_afBoundingBox[1];
	fZ = m_afBoundingBox[5] - m_afBoundingBox[2];

	m_v3BBoxMin.x = -fX / 2.0f;
	m_v3BBoxMin.y = -fY / 2.0f;
	m_v3BBoxMin.z = 0.0f;
	m_v3BBoxMax.x = fX / 2.0f;
	m_v3BBoxMax.y = fY / 2.0f;
	m_v3BBoxMax.z = fZ;

	m_v4TBBox[0] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
	m_v4TBBox[1] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
	m_v4TBBox[2] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
	m_v4TBBox[3] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
	m_v4TBBox[4] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
	m_v4TBBox[5] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);
	m_v4TBBox[6] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
	m_v4TBBox[7] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);

	const D3DXMATRIX & c_rmatTransform = GetTransform();

	for (DWORD i = 0; i < 8; ++i)
	{
		D3DXVec4Transform(&m_v4TBBox[i], &m_v4TBBox[i], &c_rmatTransform);
		if (0 == i)
		{
			m_v3TBBoxMin.x = m_v4TBBox[i].x;
			m_v3TBBoxMin.y = m_v4TBBox[i].y;
			m_v3TBBoxMin.z = m_v4TBBox[i].z;
			m_v3TBBoxMax.x = m_v4TBBox[i].x;
			m_v3TBBoxMax.y = m_v4TBBox[i].y;
			m_v3TBBoxMax.z = m_v4TBBox[i].z;
		}
		else
		{
			if (m_v3TBBoxMin.x > m_v4TBBox[i].x)
				m_v3TBBoxMin.x = m_v4TBBox[i].x;
			if (m_v3TBBoxMax.x < m_v4TBBox[i].x)
				m_v3TBBoxMax.x = m_v4TBBox[i].x;
			if (m_v3TBBoxMin.y > m_v4TBBox[i].y)
				m_v3TBBoxMin.y = m_v4TBBox[i].y;
			if (m_v3TBBoxMax.y < m_v4TBBox[i].y)
				m_v3TBBoxMax.y = m_v4TBBox[i].y;
			if (m_v3TBBoxMin.z > m_v4TBBox[i].z)
				m_v3TBBoxMin.z = m_v4TBBox[i].z;
			if (m_v3TBBoxMax.z < m_v4TBBox[i].z)
				m_v3TBBoxMax.z = m_v4TBBox[i].z;
		}
	}
}

// collision detection routines
UINT CSpeedTreeWrapper::GetCollisionObjectCount()
{
	assert(m_pSpeedTree);
	return m_pSpeedTree->GetCollisionObjectCount();
}

void CSpeedTreeWrapper::GetCollisionObject(UINT nIndex, CSpeedTreeRT::ECollisionObjectType& eType, float* pPosition, float* pDimensions)
{
	assert(m_pSpeedTree);
	m_pSpeedTree->GetCollisionObject(nIndex, eType, pPosition, pDimensions);
}

const float * CSpeedTreeWrapper::GetPosition()
{
	return m_afPos;
}

void CSpeedTreeWrapper::GetTreeSize(float & r_fSize, float & r_fVariance)
{
	m_pSpeedTree->GetTreeSize(r_fSize, r_fVariance);
}

// pscdVector may be null
void CSpeedTreeWrapper::OnUpdateCollisionData(const CStaticCollisionDataVector * /*pscdVector*/)
{
	D3DXMATRIX mat;
	D3DXMatrixTranslation(&mat, m_afPos[0], m_afPos[1], m_afPos[2]);

	/////
	for (UINT i = 0; i < GetCollisionObjectCount(); ++i)
	{
		CSpeedTreeRT::ECollisionObjectType ObjectType;
		CStaticCollisionData CollisionData;

		GetCollisionObject(i, ObjectType, (float * )&CollisionData.v3Position, CollisionData.fDimensions);

		if (ObjectType == CSpeedTreeRT::CO_BOX)
			continue;

		switch(ObjectType)
		{
		case CSpeedTreeRT::CO_SPHERE:
			CollisionData.dwType = COLLISION_TYPE_SPHERE;
			CollisionData.fDimensions[0] = CollisionData.fDimensions[0] /** fSizeRatio*/;
			//AddCollision(&CollisionData);
			break;

		case CSpeedTreeRT::CO_CYLINDER:
			CollisionData.dwType = COLLISION_TYPE_CYLINDER;
			CollisionData.fDimensions[0] = CollisionData.fDimensions[0] /** fSizeRatio*/;
			CollisionData.fDimensions[1] = CollisionData.fDimensions[1] /** fSizeRatio*/;
			//AddCollision(&CollisionData);
			break;

			/*case CSpeedTreeRT::CO_BOX:
			break;*/
		}
		AddCollision(&CollisionData, &mat);
	}
}
//martysama0134's 20f24363554ac7d9ca57c6e21af11ada

 

Quote
///////////////////////////////////////////////////////////////////////
//	SpeedTreeRTExample Class
//
//	(c) 2003 IDV, Inc.
//
//	This class is provided to illustrate one way to incorporate
//	SpeedTreeRT into an OpenGL application.  All of the SpeedTreeRT
//	calls that must be made on a per tree basis are done by this class.
//	Calls that apply to all trees (i.e. static SpeedTreeRT functions)
//	are made in the functions in main.cpp.
//
//
//	*** INTERACTIVE DATA VISUALIZATION (IDV) PROPRIETARY INFORMATION ***
//
//	This software is supplied under the terms of a license agreement or
//	nondisclosure agreement with Interactive Data Visualization and may
//	not be copied or disclosed except in accordance with the terms of
//	that agreement.
//
//      Copyright (c) 2001-2003 IDV, Inc.
//      All Rights Reserved.
//
//		IDV, Inc.
//		1233 Washington St. Suite 610
//		Columbia, SC 29201
//		Voice: (803) 799-1699
//		Fax:   (803) 931-0320
//		Web:   http://www.idvinc.com
//

#pragma once
#pragma warning (disable : 4786)

///////////////////////////////////////////////////////////////////////
//	Include files

#include "SpeedTreeMaterial.h"
#include <SpeedTreeRT.h>

#include <d3d8.h>
#include <d3d8types.h>
#include <d3dx8.h>
#include <vector>

#include "../eterLib/GrpObjectInstance.h"
#include "../eterLib/GrpImageInstance.h"

#ifdef NULL_TO_NULLPTR_POINTER
	#ifndef SAFE_DELETE
	#define SAFE_DELETE(p) { if (p) { delete (p); (p) = nullptr; } }
	#endif
	
	#ifndef SAFE_DELETE_ARRAY
	#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = nullptr; } }
	#endif
	
	#ifndef SAFE_RELEASE
	#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = nullptr; } }
	#endif
#else
	#ifndef SAFE_DELETE
	#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }
	#endif
	
	#ifndef SAFE_DELETE_ARRAY
	#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = NULL; } }
	#endif
	
	#ifndef SAFE_RELEASE
	#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = NULL; } }
	#endif
#endif

///////////////////////////////////////////////////////////////////////
//	class CSpeedTreeWrapper declaration
#pragma warning(push)
#pragma warning(disable:4100)

class CSpeedTreeWrapper : public CGraphicObjectInstance
{
	enum
	{
		ID = TREE_OBJECT
	};
	int GetType() const { return ID; }

	// Collision Data
protected:
	virtual void OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector);
	virtual void OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance) {}
	virtual bool OnGetObjectHeight(float fX, float fY, float * pfHeight) { return false; }
	// Bounding Sphere
public:
	virtual bool GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius);

public:
	static bool					ms_bSelfShadowOn;

public:
	// methods from CGraphicObjectInstance
	virtual void				SetPosition(float x, float y, float z);
	virtual void				CalculateBBox();

	virtual void				OnRender();
	virtual void				OnBlendRender() {}
	virtual void				OnRenderToShadowMap() {}
	virtual void				OnRenderShadow() {}
	virtual void				OnRenderPCBlocker();

public:
	CSpeedTreeWrapper();
	virtual	~CSpeedTreeWrapper();

	void						Initialize();

	const float *				GetPosition();
	static void					SetVertexShaders(DWORD dwBranchVertexShader, DWORD dwLeafVertexShader);

	// geometry
	bool                        LoadTree(const char * pszSptFile, const BYTE * c_pbBlock = NULL, unsigned int uiBlockSize = 0, unsigned int nSeed = 1, float fSize = -1.0f, float fSizeVariance = -1.0f);
	const float *				GetBoundingBox(void) const						{ return m_afBoundingBox; }
	void						GetTreeSize(float & r_fSize, float & r_fVariance);
	UINT						GetCollisionObjectCount();
	void						GetCollisionObject(unsigned int nIndex, CSpeedTreeRT::ECollisionObjectType& eType, float* pPosition, float* pDimensions);

	// rendering
	void						SetupBranchForTreeType(void) const;
	void						SetupFrondForTreeType(void) const;
	void						SetupLeafForTreeType(void) const;
	void						EndLeafForTreeType(void);

#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
	void						UploadLeafTables(unsigned int uiLocation) const;
#endif

	void						RenderBranches(void) const;
	void                        RenderFronds(void) const;
	void						RenderLeaves(void) const;
	void						RenderBillboards(void) const;

	// instancing
	CSpeedTreeWrapper **		GetInstances(unsigned int& nCount);
	CSpeedTreeWrapper *			InstanceOf(void) const							{ return m_pInstanceOf; }
	CSpeedTreeWrapper * 		MakeInstance();
	void						DeleteInstance(CSpeedTreeWrapper * pInstance);
	void						MakeSpeedTree();
	CSpeedTreeRT *				GetSpeedTree(void) const						{ return m_pSpeedTree; }

	// lighting
	const CSpeedTreeMaterial &	GetBranchMaterial(void) const					{ return m_cBranchMaterial; }
	const CSpeedTreeMaterial &	GetFrondMaterial(void) const					{ return m_cFrondMaterial; }
	const CSpeedTreeMaterial &	GetLeafMaterial(void) const						{ return m_cLeafMaterial; }
	float                       GetLeafLightingAdjustment(void) const			{ return m_pSpeedTree->GetLeafLightingAdjustment( ); }

	// wind
	void						SetWindStrength(float fStrength)				{ m_pSpeedTree->SetWindStrength(fStrength); }
	void						Advance(void);

	// utility
	LPDIRECT3DTEXTURE8			GetBranchTexture(void) const;
	void						CleanUpMemory(void);

private:
	void						SetupBuffers(void);
	void						SetupBranchBuffers(void);
	void						SetupFrondBuffers(void);
	void						SetupLeafBuffers(void);
	void						PositionTree(void) const;
	static bool					LoadTexture(const char* pFilename, CGraphicImageInstance & rImage);
	void						SetShaderConstants(const float* pMaterial) const;

private:
	// SpeedTreeRT data
	CSpeedTreeRT*					m_pSpeedTree;					// the SpeedTree object
	CSpeedTreeRT::STextures*		m_pTextureInfo;					// texture info cache
	bool							m_bIsInstance;					// is this an instance?
	std::vector<CSpeedTreeWrapper*>	m_vInstances;					// what is an instance of us
	CSpeedTreeWrapper*				m_pInstanceOf;					// which tree is this an instance of

	// geometry cache
	CSpeedTreeRT::SGeometry*		m_pGeometryCache;				// cache for pulling geometry from SpeedTree avoids lots of reallocation

	// branch buffers
	LPDIRECT3DVERTEXBUFFER8			m_pBranchVertexBuffer;			// branch vertex buffer
	unsigned int					m_unBranchVertexCount;			// number of vertices in branches
	LPDIRECT3DINDEXBUFFER8			m_pBranchIndexBuffer;			// branch index buffer
	unsigned short*					m_pBranchIndexCounts;			// number of indexes per branch LOD level

	// frond buffers
	LPDIRECT3DVERTEXBUFFER8			m_pFrondVertexBuffer;			// frond vertex buffer
	unsigned int					m_unFrondVertexCount;			// number of vertices in frond
	LPDIRECT3DINDEXBUFFER8			m_pFrondIndexBuffer;			// frond index buffer
	unsigned short*					m_pFrondIndexCounts;			// number of indexes per frond LOD level

	// leaf buffers
	unsigned short					m_usNumLeafLods;				// the number of leaf LODs
	LPDIRECT3DVERTEXBUFFER8*		m_pLeafVertexBuffer;			// leaf vertex buffer
	bool*							m_pLeavesUpdatedByCpu;			// stores which LOD's have been updated already per frame

	// tree properties
	float							m_afPos[3];						// tree position
	float							m_afBoundingBox[6];				// tree bounding box

	// materials
	CSpeedTreeMaterial				m_cBranchMaterial;				// branch material
	CSpeedTreeMaterial				m_cLeafMaterial;				// leaf material
	CSpeedTreeMaterial				m_cFrondMaterial;				// frond material

	// branch texture
	CGraphicImageInstance			m_BranchImageInstance;
	CGraphicImageInstance			m_ShadowImageInstance;			// shadow texture object (used if shadows are enabled)
	CGraphicImageInstance			m_CompositeImageInstance;

	static DWORD					ms_dwBranchVertexShader;
	static DWORD					ms_dwLeafVertexShader;
};

#pragma warning(pop)
//martysama0134's 20f24363554ac7d9ca57c6e21af11ada

 

Quote
///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest Class

///////////////////////////////////////////////////////////////////////
//	Include Files
#include "StdAfx.h"

#include <vector>
#include "../eterBase/Filename.h"
#include "../eterBase/MappedFile.h"
#include "../eterPack/EterPackManager.h"

#include "SpeedTreeForest.h"
#include "SpeedTreeConfig.h"
#include <cfloat>

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest constructor

CSpeedTreeForest::CSpeedTreeForest() : m_fWindStrength(0.0f)
{
	CSpeedTreeRT::SetNumWindMatrices(c_nNumWindMatrices);

	m_afForestExtents[0] = m_afForestExtents[1] = m_afForestExtents[2] = FLT_MAX;
	m_afForestExtents[3] = m_afForestExtents[4] = m_afForestExtents[5] = -FLT_MAX;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest destructor

CSpeedTreeForest::~CSpeedTreeForest()
{
	Clear();
}

void CSpeedTreeForest::Clear()
{
	TTreeMap::iterator itor = m_pMainTreeMap.begin();
	UINT uiCount;

	while (itor != m_pMainTreeMap.end())
	{
		CSpeedTreeWrapper * pMainTree = (itor++)->second;
		CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount);

		for (UINT i = 0; i < uiCount; ++i)
			delete ppInstances[i];

		delete pMainTree;
	}

	m_pMainTreeMap.clear();
}

CSpeedTreeWrapper * CSpeedTreeForest::GetMainTree(DWORD dwCRC)
{
	TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC);

	if (itor == m_pMainTreeMap.end())
		return NULL;

	return itor->second;
}

BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, const char * c_pszFileName)
{
	TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC);

	CSpeedTreeWrapper * pTree;

	pTree = new CSpeedTreeWrapper;

	// For main tree instance explicitely make CSpeedTreeRT object
	//  for instances it's "instanced" from main tree in "MakeInstance"
	pTree->MakeSpeedTree();

	if (itor != m_pMainTreeMap.end())
		pTree = itor->second;
	else
	{
		CMappedFile file;
		LPCVOID c_pvData;

		if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
			return FALSE;

		pTree = new CSpeedTreeWrapper;

		if (!pTree->LoadTree(c_pszFileName, (const BYTE *) c_pvData, file.Size()))
		{
			delete pTree;
			return FALSE;
		}

		m_pMainTreeMap.insert(std::map<DWORD, CSpeedTreeWrapper *>::value_type(dwCRC, pTree));

		file.Destroy();
	}

	*ppMainTree = pTree;
	return TRUE;
}

CSpeedTreeWrapper* CSpeedTreeForest::CreateInstance(float x, float y, float z, DWORD dwTreeCRC, const char * c_szTreeName)
{
	CSpeedTreeWrapper * pMainTree;
	if (!GetMainTree(dwTreeCRC, &pMainTree, c_szTreeName))
		return NULL;

	CSpeedTreeWrapper* pTreeInst = pMainTree->MakeInstance();
	pTreeInst->SetPosition(x, y, z);
	pTreeInst->RegisterBoundingSphere();
	return pTreeInst;
}

void CSpeedTreeForest::DeleteInstance(CSpeedTreeWrapper * pInstance)
{
	if (!pInstance)
		return;

	CSpeedTreeWrapper * pParentTree = pInstance->InstanceOf();

	if (!pParentTree)
		return;

	pParentTree->DeleteInstance(pInstance);
}

void CSpeedTreeForest::UpdateSystem(float fCurrentTime)
{
	static float fLastTime = fCurrentTime;
	float fElapsedTime = fCurrentTime - fLastTime;
	CSpeedTreeRT::SetTime(fElapsedTime);

	m_fAccumTime += fElapsedTime;
	SetupWindMatrices(m_fAccumTime);
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest::AdjustExtents
void CSpeedTreeForest::AdjustExtents(float x, float y, float z)
{
    // min
    m_afForestExtents[0] = __min(m_afForestExtents[0], x);
    m_afForestExtents[1] = __min(m_afForestExtents[1], y);
    m_afForestExtents[2] = __min(m_afForestExtents[2], z);

    // max
    m_afForestExtents[3] = __max(m_afForestExtents[3], x);
    m_afForestExtents[4] = __max(m_afForestExtents[4], y);
    m_afForestExtents[5] = __max(m_afForestExtents[5], z);
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest::SetWindStrength
void CSpeedTreeForest::SetWindStrength(float fStrength)
{
	if (m_fWindStrength == fStrength)
		return;

	m_fWindStrength = fStrength;

	TTreeMap::iterator itor = m_pMainTreeMap.begin();
	UINT uiCount;

	while (itor != m_pMainTreeMap.end())
	{
		CSpeedTreeWrapper * pMainTree = (itor++)->second;
		CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount);

		for (UINT i = 0; i < uiCount; ++i)
			ppInstances[i]->GetSpeedTree()->SetWindStrength(m_fWindStrength);
	}
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest::SetupWindMatrices
void CSpeedTreeForest::SetupWindMatrices(float fTimeInSecs)
{
	// matrix computational data
	static float afMatrixTimes[c_nNumWindMatrices] = { 0.0f };
	static float afFrequencies[c_nNumWindMatrices][2] =
	{
		{ 0.15f, 0.17f },
		{ 0.25f, 0.15f },
		{ 0.19f, 0.05f },
		{ 0.15f, 0.22f }
	};

	// compute time since last call
	static float fTimeOfLastCall = 0.0f;
	float fTimeSinceLastCall = fTimeInSecs - fTimeOfLastCall;
	fTimeOfLastCall = fTimeInSecs;

	// wind strength
	static float fOldStrength = m_fWindStrength;

	// increment matrix times
	for (int i = 0; i < c_nNumWindMatrices; ++i)
		afMatrixTimes[i] += fTimeSinceLastCall;

	// compute maximum branch throw
	float fBaseAngle = m_fWindStrength * 35.0f;

	// build rotation matrices
	for (int j = 0; j < c_nNumWindMatrices; ++j)
	{
		// adjust time to prevent "jumping"
		if (m_fWindStrength != 0.0f)
			afMatrixTimes[j] = (afMatrixTimes[j] * fOldStrength) / m_fWindStrength;

		// compute percentages for each axis
		float fBaseFreq = m_fWindStrength * 20.0f;
		float fXPercent = sinf(fBaseFreq * afFrequencies[j % c_nNumWindMatrices][0] * afMatrixTimes[j]);
		float fYPercent = cosf(fBaseFreq * afFrequencies[j % c_nNumWindMatrices][1] * afMatrixTimes[j]);

		// build compound rotation matrix (rotate on 'x' then on 'y')
		const float c_fDeg2Rad = 57.2957795f;
        float fSinX = sinf(fBaseAngle * fXPercent / c_fDeg2Rad);
        float fSinY = sinf(fBaseAngle * fYPercent / c_fDeg2Rad);
        float fCosX = cosf(fBaseAngle * fXPercent / c_fDeg2Rad);
        float fCosY = cosf(fBaseAngle * fYPercent / c_fDeg2Rad);

        float afMatrix[16] = { 0.0f };
        afMatrix[0] = fCosY;
        afMatrix[2] = -fSinY;
        afMatrix[4] = fSinX * fSinY;
        afMatrix[5] = fCosX;
        afMatrix[6] = fSinX * fCosY;
        afMatrix[8] = fSinY * fCosX;
        afMatrix[9] = -fSinX;
        afMatrix[10] = fCosX * fCosY;
        afMatrix[15] = 1.0f;

		#ifdef WRAPPER_USE_CPU_WIND
			CSpeedTreeRT::SetWindMatrix(j, afMatrix);
		#endif

		#ifdef WRAPPER_USE_GPU_WIND
			// graphics API specific
			UploadWindMatrix(c_nVertexShader_WindMatrices + j * 4, afMatrix);
		#endif
	}

	// track wind strength
	fOldStrength = m_fWindStrength;
}

///////////////////////////////////////////////////////////////////////
//	CSpeedTreeForest::SetLodLimits
/*
void CSpeedTreeForest::SetLodLimits(void)
{
	// find tallest tree
	float fTallest = -1.0f;

	TTreeMap::iterator itor = m_pMainTreeMap.begin();
	UINT uiCount;

	while (itor != m_pMainTreeMap.end())
	{
		CSpeedTreeWrapper * pMainTree = (itor++)->second;
		CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount);

		float fHeight;
		fHeight = pMainTree->GetBoundingBox()[5] - pMainTree->GetBoundingBox()[0];
		fTallest = __max(fHeight, fTallest);

		for (UINT i = 0; i < uiCount; ++i)
		{
			fHeight = ppInstances[i]->GetBoundingBox()[5] - ppInstances[i]->GetBoundingBox()[0];
			fTallest = __max(fHeight, fTallest);
		}
	}

	itor = m_pMainTreeMap.begin();

	while (itor != m_pMainTreeMap.end())
	{
		CSpeedTreeWrapper * pMainTree = (itor++)->second;
		CSpeedTreeWrapper ** ppInstances = pMainTree->GetInstances(uiCount);

		pMainTree->GetSpeedTree()->SetLodLimits(fTallest * c_fNearLodFactor, fTallest * c_fFarLodFactor);

		for (UINT i = 0; i < uiCount; ++i)
			ppInstances[i]->GetSpeedTree()->SetLodLimits(fTallest * c_fNearLodFactor, fTallest * c_fFarLodFactor);
	}
}
*/
void CSpeedTreeForest::SetLight(const float * afDirection, const float * afAmbient, const float * afDiffuse)
{
	m_afLighting[0] = afDirection[0];
	m_afLighting[1] = afDirection[1];
	m_afLighting[2] = afDirection[2];
	m_afLighting[3] = 1.0f;

	m_afLighting[4] = afAmbient[0];
	m_afLighting[5] = afAmbient[1];
	m_afLighting[6] = afAmbient[2];
	m_afLighting[7] = afAmbient[3];

	m_afLighting[8] = afDiffuse[0];
	m_afLighting[9] = afDiffuse[1];
	m_afLighting[10] = afDiffuse[2];
	m_afLighting[11] = afDiffuse[3];
}

void CSpeedTreeForest::SetFog(float fFogNear, float fFogFar)
{
	const float c_fFogLinearScale = (1.0f / (fFogFar - fFogNear));

	m_afFog[0] = fFogNear;
	m_afFog[1] = fFogFar;
	m_afFog[2] = c_fFogLinearScale;
	m_afFog[3] = 0.0f;
}
//martysama0134's 20f24363554ac7d9ca57c6e21af11ada

 

 

“𝓐𝓵𝓵 𝔀𝓮 𝓱𝓪𝓿𝓮 𝓽𝓸 𝓭𝓮𝓬𝓲𝓭𝓮 𝓲𝓼 𝔀𝓱𝓪𝓽 𝓽𝓸 𝓭𝓸 𝔀𝓲𝓽𝓱 𝓽𝓱𝓮 𝓽𝓲𝓶𝓮 𝓽𝓱𝓪𝓽 𝓲𝓼 𝓰𝓲𝓿𝓮𝓷 𝓾𝓼.” ~ 𝓖𝓪𝓷𝓭𝓪𝓵𝓯 𝓽𝓱𝓮 𝓖𝓻𝓮𝔂

Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169595
Share on other sites

  • Active+ Member
On 2/22/2025 at 11:28 PM, Jimmermania said:

These are my current files:
 

 

scratch all that and just 

Spoiler
CSpeedTreeWrapper * CSpeedTreeWrapper::MakeInstance()
{
	CSpeedTreeWrapper * pInstance = new CSpeedTreeWrapper;
	SAFE_DELETE(pInstance->m_pSpeedTree); // Add this

 

GL

Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169654
Share on other sites

  • Active+ Member
23 hours ago, CONTROL said:

scratch all that and just 

  Hide contents
CSpeedTreeWrapper * CSpeedTreeWrapper::MakeInstance()
{
	CSpeedTreeWrapper * pInstance = new CSpeedTreeWrapper;
	SAFE_DELETE(pInstance->m_pSpeedTree); // Add this

 

GL

No, don't, don't heap-allocate useless resource juste to delete it afterwards

Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169672
Share on other sites

  • Active+ Member
On 2/22/2025 at 9:28 PM, Jimmermania said:

These are my current files:
 

 

you made a mistake in SpeedTreeForest.cpp, you must just add 

		// For main tree instance explicitely make CSpeedTreeRT object
		//  for instances it's "instanced" from main tree in "MakeInstance"
		pTree->MakeSpeedTree();

 

below 

pTree = new CSpeedTreeWrapper;

 

result should be:

BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, const char * c_pszFileName)
{
	TTreeMap::iterator itor = m_pMainTreeMap.find(dwCRC);

	CSpeedTreeWrapper * pTree;

	if (itor != m_pMainTreeMap.end())
		pTree = itor->second;
	else
	{
		CMappedFile file;
		LPCVOID c_pvData;

		if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
			return FALSE;

		pTree = new CSpeedTreeWrapper;

		// For main tree instance explicitely make CSpeedTreeRT object
		//  for instances it's "instanced" from main tree in "MakeInstance"
		pTree->MakeSpeedTree();

		if (!pTree->LoadTree(c_pszFileName, (const BYTE *) c_pvData, file.Size()))
		{
			delete pTree;
			return FALSE;
		}

		m_pMainTreeMap.insert(std::map<DWORD, CSpeedTreeWrapper *>::value_type(dwCRC, pTree));

		file.Destroy();
	}

	*ppMainTree = pTree;
	return TRUE;
}

 

Link to comment
https://metin2.dev/topic/33493-fix-speedtree-memory-leak/#findComment-169690
Share on other sites

Don't use any images from : imgur, turkmmop, freakgamers, inforge, hizliresim... Or your content will be deleted without notice...
Use : https://metin2.download/media/add/

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.