mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 10:49:23 +00:00
Fixed various bugs and crashes and moved more functionality into the world editor
This commit is contained in:
@@ -356,6 +356,7 @@ CResource* CResourceEntry::LoadCooked(IInputStream& rInput)
|
||||
bool CResourceEntry::Unload()
|
||||
{
|
||||
ASSERT(mpResource != nullptr);
|
||||
ASSERT(!mpResource->IsReferenced());
|
||||
delete mpResource;
|
||||
mpResource = nullptr;
|
||||
return true;
|
||||
|
||||
@@ -277,6 +277,21 @@ void CResourceStore::CloseProject()
|
||||
// various TResPtrs are destroyed. There might be a cleaner solution than this.)
|
||||
DestroyUnreferencedResources();
|
||||
|
||||
// There should be no loaded resources!!!
|
||||
// If there are, that means something didn't clean up resource references properly on project close!!!
|
||||
if (!mLoadedResources.empty())
|
||||
{
|
||||
Log::Error(TString::FromInt32(mLoadedResources.size(), 0, 10) + " resources still loaded on project close:");
|
||||
|
||||
for (auto Iter = mLoadedResources.begin(); Iter != mLoadedResources.end(); Iter++)
|
||||
{
|
||||
CResourceEntry *pEntry = Iter->second;
|
||||
Log::Write("\t" + pEntry->Name().ToUTF8() + "." + pEntry->CookedExtension().ToString());
|
||||
}
|
||||
|
||||
ASSERT(false);
|
||||
}
|
||||
|
||||
// Delete all entries from old project
|
||||
auto It = mResourceEntries.begin();
|
||||
|
||||
@@ -286,16 +301,6 @@ void CResourceStore::CloseProject()
|
||||
|
||||
if (!pEntry->IsTransient())
|
||||
{
|
||||
if (pEntry->IsLoaded())
|
||||
{
|
||||
bool UnloadSuccess = pEntry->Unload();
|
||||
ASSERT(UnloadSuccess);
|
||||
|
||||
auto LoadIt = mLoadedResources.find(pEntry->ID());
|
||||
ASSERT(LoadIt != mLoadedResources.end());
|
||||
mLoadedResources.erase(LoadIt);
|
||||
}
|
||||
|
||||
delete pEntry;
|
||||
It = mResourceEntries.erase(It);
|
||||
}
|
||||
|
||||
@@ -172,12 +172,13 @@ void CScene::DeleteNode(CSceneNode *pNode)
|
||||
mNumNodes--;
|
||||
}
|
||||
|
||||
void CScene::SetActiveArea(CGameArea *pArea)
|
||||
void CScene::SetActiveArea(CWorld *pWorld, CGameArea *pArea)
|
||||
{
|
||||
// Clear existing area
|
||||
ClearScene();
|
||||
|
||||
// Create nodes for new area
|
||||
mpWorld = pWorld;
|
||||
mpArea = pArea;
|
||||
mpAreaRootNode = new CRootNode(this, -1, mpSceneRootNode);
|
||||
|
||||
@@ -248,11 +249,6 @@ void CScene::SetActiveArea(CGameArea *pArea)
|
||||
Log::Write( TString::FromInt32(CSceneNode::NumNodes(), 0, 10) + " nodes" );
|
||||
}
|
||||
|
||||
void CScene::SetActiveWorld(CWorld* pWorld)
|
||||
{
|
||||
mpWorld = pWorld;
|
||||
}
|
||||
|
||||
void CScene::PostLoad()
|
||||
{
|
||||
mpSceneRootNode->OnLoadFinished();
|
||||
@@ -265,6 +261,7 @@ void CScene::ClearScene()
|
||||
{
|
||||
mpAreaRootNode->Unparent();
|
||||
delete mpAreaRootNode;
|
||||
mpAreaRootNode = nullptr;
|
||||
}
|
||||
|
||||
mNodes.clear();
|
||||
@@ -274,6 +271,7 @@ void CScene::ClearScene()
|
||||
mNumNodes = 0;
|
||||
|
||||
mpArea = nullptr;
|
||||
mpWorld = nullptr;
|
||||
}
|
||||
|
||||
void CScene::AddSceneToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo)
|
||||
|
||||
@@ -56,8 +56,7 @@ public:
|
||||
CScriptNode* CreateScriptNode(CScriptObject *pObj, u32 NodeID = -1);
|
||||
CLightNode* CreateLightNode(CLight *pLight, u32 NodeID = -1);
|
||||
void DeleteNode(CSceneNode *pNode);
|
||||
void SetActiveArea(CGameArea *pArea);
|
||||
void SetActiveWorld(CWorld *pWorld);
|
||||
void SetActiveArea(CWorld *pWorld, CGameArea *pArea);
|
||||
void PostLoad();
|
||||
void ClearScene();
|
||||
void AddSceneToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo);
|
||||
|
||||
Reference in New Issue
Block a user