Przeglądaj źródła

MeshHeap and TransientMeshes no longer hold circular references to each other

Marko Pintera 11 lat temu
rodzic
commit
591af1e6c0

+ 1 - 1
BansheeCore/Include/BsTransientMesh.h

@@ -87,7 +87,7 @@ namespace BansheeEngine
 
 	protected:
 		bool mIsDestroyed;
-		MeshHeapPtr mParentHeap;
+		std::weak_ptr<MeshHeap> mParentHeap;
 		UINT32 mId;
 	};
 }

+ 9 - 0
BansheeCore/Source/BsResources.cpp

@@ -19,7 +19,16 @@ namespace BansheeEngine
 
 	Resources::~Resources()
 	{
+		// Unload and invalidate all resources
+		UnorderedMap<String, HResource> loadedResourcesCopy = mLoadedResources;
 
+		for (auto& loadedResourcePair : loadedResourcesCopy)
+		{
+			unload(loadedResourcePair.second);
+
+			// Invalidate the handle
+			loadedResourcePair.second._setHandleData(nullptr, "");
+		}
 	}
 
 	HResource Resources::load(const Path& filePath)

+ 33 - 6
BansheeCore/Source/BsTransientMesh.cpp

@@ -16,7 +16,11 @@ namespace BansheeEngine
 		if(!mIsDestroyed)
 		{
 			TransientMeshPtr meshPtr = std::static_pointer_cast<TransientMesh>(getThisPtr());
-			mParentHeap->dealloc(meshPtr);
+
+			MeshHeapPtr parentHeap = mParentHeap.lock();
+
+			if (parentHeap != nullptr)
+				parentHeap->dealloc(meshPtr);
 		}
 	}
 
@@ -32,27 +36,50 @@ namespace BansheeEngine
 
 	std::shared_ptr<VertexData> TransientMesh::_getVertexData() const
 	{
-		return mParentHeap->_getVertexData();
+		MeshHeapPtr parentHeap = mParentHeap.lock();
+
+		if (parentHeap != nullptr)
+			return parentHeap->_getVertexData();
+		else
+			return nullptr;
 	}
 
 	IndexBufferPtr TransientMesh::_getIndexBuffer() const
 	{
-		return mParentHeap->_getIndexBuffer();
+		MeshHeapPtr parentHeap = mParentHeap.lock();
+
+		if (parentHeap != nullptr)
+			return parentHeap->_getIndexBuffer();
+		else
+			return nullptr;
 	}
 
 	UINT32 TransientMesh::_getVertexOffset() const
 	{
-		return mParentHeap->getVertexOffset(mId);
+		MeshHeapPtr parentHeap = mParentHeap.lock();
+
+		if (parentHeap != nullptr)
+			return parentHeap->getVertexOffset(mId);
+		else
+			return 0;
 	}
 
 	UINT32 TransientMesh::_getIndexOffset() const
 	{
-		return mParentHeap->getIndexOffset(mId);
+		MeshHeapPtr parentHeap = mParentHeap.lock();
+
+		if (parentHeap != nullptr)
+			return parentHeap->getIndexOffset(mId);
+		else
+			return 0;
 	}
 
 	void TransientMesh::_notifyUsedOnGPU()
 	{
-		mParentHeap->notifyUsedOnGPU(mId);
+		MeshHeapPtr parentHeap = mParentHeap.lock();
+
+		if (parentHeap != nullptr)
+			parentHeap->notifyUsedOnGPU(mId);
 	}
 
 	MeshProxyPtr TransientMesh::_createProxy(UINT32 subMeshIdx)

+ 9 - 0
BansheeEngine/Source/BsSpriteTexture.cpp

@@ -38,6 +38,9 @@ namespace BansheeEngine
 		SpriteTexturePtr texturePtr = bs_core_ptr<SpriteTexture, PoolAlloc>
 			(new (bs_alloc<SpriteTexture, PoolAlloc>()) SpriteTexture(Vector2(0.0f, 0.0f), Vector2(1.0f, 1.0f), texture));
 
+		texturePtr->_setThisPtr(texturePtr);
+		texturePtr->initialize();
+
 		return static_resource_cast<SpriteTexture>(gResources()._createResourceHandle(texturePtr));
 	}
 
@@ -46,6 +49,9 @@ namespace BansheeEngine
 		SpriteTexturePtr texturePtr = bs_core_ptr<SpriteTexture, PoolAlloc>
 			(new (bs_alloc<SpriteTexture, PoolAlloc>()) SpriteTexture(uvOffset, uvScale, texture));
 
+		texturePtr->_setThisPtr(texturePtr);
+		texturePtr->initialize();
+
 		return static_resource_cast<SpriteTexture>(gResources()._createResourceHandle(texturePtr));
 	}
 
@@ -54,6 +60,9 @@ namespace BansheeEngine
 		SpriteTexturePtr texturePtr = bs_core_ptr<SpriteTexture, PoolAlloc>
 			(new (bs_alloc<SpriteTexture, PoolAlloc>()) SpriteTexture(Vector2(0.0f, 0.0f), Vector2(1.0f, 1.0f), Texture::dummy()));
 
+		texturePtr->_setThisPtr(texturePtr);
+		texturePtr->initialize();
+
 		return texturePtr;
 	}
 

+ 0 - 1
Polish.txt

@@ -3,7 +3,6 @@ Polish TODO:
   - Ensure that going fullscreen and windowed works fine
  - Add an example model
  - Test if example shuts down fine
- - Add readme to Git
 
  - Add license text to all files