Browse Source

CoreThreadCore instance is now a shared pointer

Marko Pintera 11 years ago
parent
commit
a6c65825ca
56 changed files with 110 additions and 114 deletions
  1. 4 4
      BansheeCore/Include/BsCoreObject.h
  2. 1 1
      BansheeCore/Include/BsIndexBuffer.h
  3. 1 1
      BansheeCore/Include/BsMultiRenderTexture.h
  4. 1 1
      BansheeCore/Include/BsRenderTarget.h
  5. 1 1
      BansheeCore/Include/BsRenderTexture.h
  6. 1 1
      BansheeCore/Include/BsRenderWindow.h
  7. 1 1
      BansheeCore/Include/BsVertexBuffer.h
  8. 1 7
      BansheeCore/Source/BsCoreObject.cpp
  9. 3 3
      BansheeCore/Source/BsCoreObjectManager.cpp
  10. 2 2
      BansheeCore/Source/BsIndexBuffer.cpp
  11. 5 5
      BansheeCore/Source/BsMesh.cpp
  12. 4 4
      BansheeCore/Source/BsMeshHeap.cpp
  13. 2 2
      BansheeCore/Source/BsMultiRenderTexture.cpp
  14. 1 1
      BansheeCore/Source/BsRenderSystem.cpp
  15. 2 2
      BansheeCore/Source/BsRenderTarget.cpp
  16. 2 2
      BansheeCore/Source/BsRenderTexture.cpp
  17. 2 2
      BansheeCore/Source/BsRenderWindow.cpp
  18. 2 2
      BansheeCore/Source/BsVertexBuffer.cpp
  19. 3 3
      BansheeCore/Source/Win32/BsPlatformImpl.cpp
  20. 1 1
      BansheeCore/Source/Win32/BsPlatformWndProc.cpp
  21. 1 1
      BansheeD3D11RenderSystem/Include/BsD3D11IndexBuffer.h
  22. 1 1
      BansheeD3D11RenderSystem/Include/BsD3D11MultiRenderTexture.h
  23. 1 1
      BansheeD3D11RenderSystem/Include/BsD3D11RenderTexture.h
  24. 1 1
      BansheeD3D11RenderSystem/Include/BsD3D11RenderWindow.h
  25. 1 1
      BansheeD3D11RenderSystem/Include/BsD3D11VertexBuffer.h
  26. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11IndexBuffer.cpp
  27. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11MultiRenderTexture.cpp
  28. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11RenderSystem.cpp
  29. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11RenderTexture.cpp
  30. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11RenderWindow.cpp
  31. 2 2
      BansheeD3D11RenderSystem/Source/BsD3D11VertexBuffer.cpp
  32. 1 1
      BansheeD3D9RenderSystem/Include/BsD3D9IndexBuffer.h
  33. 1 1
      BansheeD3D9RenderSystem/Include/BsD3D9MultiRenderTexture.h
  34. 1 1
      BansheeD3D9RenderSystem/Include/BsD3D9RenderTexture.h
  35. 2 2
      BansheeD3D9RenderSystem/Include/BsD3D9RenderWindow.h
  36. 1 1
      BansheeD3D9RenderSystem/Include/BsD3D9VertexBuffer.h
  37. 2 2
      BansheeD3D9RenderSystem/Source/BsD3D9IndexBuffer.cpp
  38. 2 2
      BansheeD3D9RenderSystem/Source/BsD3D9MultiRenderTexture.cpp
  39. 2 2
      BansheeD3D9RenderSystem/Source/BsD3D9RenderSystem.cpp
  40. 2 2
      BansheeD3D9RenderSystem/Source/BsD3D9RenderTexture.cpp
  41. 4 4
      BansheeD3D9RenderSystem/Source/BsD3D9RenderWindow.cpp
  42. 2 2
      BansheeD3D9RenderSystem/Source/BsD3D9VertexBuffer.cpp
  43. 1 1
      BansheeGLRenderSystem/Include/BsGLIndexBuffer.h
  44. 1 1
      BansheeGLRenderSystem/Include/BsGLMultiRenderTexture.h
  45. 1 1
      BansheeGLRenderSystem/Include/BsGLRenderTexture.h
  46. 1 1
      BansheeGLRenderSystem/Include/BsGLVertexBuffer.h
  47. 2 2
      BansheeGLRenderSystem/Include/BsWin32Window.h
  48. 2 2
      BansheeGLRenderSystem/Source/BsGLIndexBuffer.cpp
  49. 2 2
      BansheeGLRenderSystem/Source/BsGLMultiRenderTexture.cpp
  50. 1 1
      BansheeGLRenderSystem/Source/BsGLRenderSystem.cpp
  51. 2 2
      BansheeGLRenderSystem/Source/BsGLRenderTexture.cpp
  52. 3 3
      BansheeGLRenderSystem/Source/BsGLVertexArrayObjectManager.cpp
  53. 2 2
      BansheeGLRenderSystem/Source/BsGLVertexBuffer.cpp
  54. 4 4
      BansheeGLRenderSystem/Source/BsWin32Window.cpp
  55. 3 0
      BansheeUtility/Include/BsStdHeaders.h
  56. 8 9
      TODO.txt

+ 4 - 4
BansheeCore/Include/BsCoreObject.h

@@ -113,7 +113,7 @@ namespace BansheeEngine
 		/**
 		 * @brief	Returns a shared_ptr version of "this" pointer.
 		 */
-		std::shared_ptr<CoreObject> getThisPtr() const { return mThis.lock(); }
+		SPtr<CoreObject> getThisPtr() const { return mThis.lock(); }
 
 		/**
 		 * @brief	Returns an object that contains a core thread specific implementation
@@ -121,7 +121,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Thread safe to retrieve, but its data is only valid on the core thread.
 		 */
-		CoreObjectCore* getCore() const { return mCoreSpecific; }
+		SPtr<CoreObjectCore> getCore() const { return mCoreSpecific; }
 
 	protected:
 		/**
@@ -218,7 +218,7 @@ namespace BansheeEngine
 		 * @brief	Creates an object that contains core thread specific data and methods
 		 *			for this CoreObject. Can be null if such object is not required.
 		 */
-		virtual CoreObjectCore* createCore() const { return nullptr; }
+		virtual SPtr<CoreObjectCore> createCore() const { return nullptr; }
 
 		/**
 		 * @brief	Marks the core data as dirty. This causes the syncToCore()
@@ -255,7 +255,7 @@ namespace BansheeEngine
 		virtual void syncFromCore(const CoreSyncData& data) { }
 
 	protected:
-		CoreObjectCore* mCoreSpecific;
+		SPtr<CoreObjectCore> mCoreSpecific;
 	};
 
 	/**

+ 1 - 1
BansheeCore/Include/BsIndexBuffer.h

@@ -84,7 +84,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Core thread only.
 		 */
-		IndexBufferCore* getCore() const;
+		SPtr<IndexBufferCore> getCore() const;
 
 		/**
 		 * @copydoc	HardwareBufferManager::createIndexBuffer

+ 1 - 1
BansheeCore/Include/BsMultiRenderTexture.h

@@ -122,7 +122,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Core thread only.
 		 */
-		MultiRenderTextureCore* getCore() const;
+		SPtr<MultiRenderTextureCore> getCore() const;
 
 		/**
 		 * @copydoc	TextureManager::createMultiRenderTexture

+ 1 - 1
BansheeCore/Include/BsRenderTarget.h

@@ -239,7 +239,7 @@ namespace BansheeEngine
 		 * @brief	Retrieves a core implementation of a render target usable only from the
 		 *			core thread.
 		 */
-		RenderTargetCore* getCore() const;
+		SPtr<RenderTargetCore> getCore() const;
 
 		/**
 		 * @brief	Event that gets triggered whenever the render target is resized.

+ 1 - 1
BansheeCore/Include/BsRenderTexture.h

@@ -154,7 +154,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Core thread only.
 		 */
-		RenderTextureCore* getCore() const;
+		SPtr<RenderTextureCore> getCore() const;
 
 	protected:
 		friend class TextureManager;

+ 1 - 1
BansheeCore/Include/BsRenderWindow.h

@@ -260,7 +260,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Core thread only.
 		 */
-		RenderWindowCore* getCore() const;
+		SPtr<RenderWindowCore> getCore() const;
 
 		/**
 		 * @brief	Creates a new render window using the specified options. Optionally

+ 1 - 1
BansheeCore/Include/BsVertexBuffer.h

@@ -65,7 +65,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Core thread only.
 		 */
-		VertexBufferCore* getCore() const;
+		SPtr<VertexBufferCore> getCore() const;
 
 		/**
 		 * @copydoc	HardwareBufferManager::createVertexBuffer

+ 1 - 7
BansheeCore/Source/BsCoreObject.cpp

@@ -12,7 +12,7 @@ namespace BansheeEngine
 	BS_STATIC_MUTEX_CLASS_INSTANCE(mCoreGpuObjectLoadedMutex, CoreObject)
 
 	CoreObject::CoreObject(bool initializeOnRenderThread)
-		: mFlags(0), mInternalID(0), mCoreDirtyFlags(0xFFFFFFFF), mCoreSpecific(nullptr)
+		: mFlags(0), mInternalID(0), mCoreDirtyFlags(0xFFFFFFFF)
 	{
 		mInternalID = CoreObjectManager::instance().registerObject(this);
 		mFlags = initializeOnRenderThread ? mFlags | CGO_INIT_ON_CORE_THREAD : mFlags;
@@ -35,12 +35,6 @@ namespace BansheeEngine
 		}
 #endif
 
-		if (mCoreSpecific != nullptr)
-		{
-			bs_delete(mCoreSpecific);
-			mCoreSpecific = nullptr;
-		}
-
 		CoreObjectManager::instance().unregisterObject(this);
 	}
 

+ 3 - 3
BansheeCore/Source/BsCoreObjectManager.cpp

@@ -62,13 +62,13 @@ namespace BansheeEngine
 			for (auto& objectData : mObjects)
 			{
 				CoreObject* object = objectData.second;
-				CoreObjectCore* objectCore = object->getCore();
+				SPtr<CoreObjectCore> objectCore = object->getCore();
 				if (objectCore != nullptr && object->isCoreDirty())
 				{
 					CoreSyncData syncData = object->syncToCore(allocator);
 					object->markCoreClean();
 
-					mCoreSyncData[object->getInternalID()] = CoreStoredSyncData(objectCore, syncData);
+					mCoreSyncData[object->getInternalID()] = CoreStoredSyncData(objectCore.get(), syncData);
 				}
 			}
 		}
@@ -78,7 +78,7 @@ namespace BansheeEngine
 			for (auto& objectData : mObjects)
 			{
 				CoreObject* object = objectData.second;
-				CoreObjectCore* objectCore = object->getCore();
+				SPtr<CoreObjectCore> objectCore = object->getCore();
 				if (objectCore != nullptr && objectCore->isCoreDirty())
 				{
 					CoreSyncData syncData = objectCore->syncFromCore(allocator);

+ 2 - 2
BansheeCore/Source/BsIndexBuffer.cpp

@@ -27,9 +27,9 @@ namespace BansheeEngine
         }
     }
 
-	IndexBufferCore* IndexBuffer::getCore() const
+	SPtr<IndexBufferCore> IndexBuffer::getCore() const
 	{
-		return static_cast<IndexBufferCore*>(mCoreSpecific);
+		return std::static_pointer_cast<IndexBufferCore>(mCoreSpecific);
 	}
 
 	IndexBufferPtr IndexBuffer::create(IndexType itype, UINT32 numIndexes, GpuBufferUsage usage)

+ 5 - 5
BansheeCore/Source/BsMesh.cpp

@@ -92,7 +92,7 @@ namespace BansheeEngine
 		}
 
 		// Indices
-		IndexBufferCore* indexBuffer = mIndexBuffer->getCore();
+		SPtr<IndexBufferCore> indexBuffer = mIndexBuffer->getCore();
 		const IndexBufferProperties& ibProps = indexBuffer->getProperties();
 
 		UINT32 indicesSize = meshData.getIndexBufferSize();
@@ -127,7 +127,7 @@ namespace BansheeEngine
 					toString(myVertSize) + ". Got: " + toString(otherVertSize));
 			}
 
-			VertexBufferCore* vertexBuffer = mVertexData->getBuffer(i)->getCore();
+			SPtr<VertexBufferCore> vertexBuffer = mVertexData->getBuffer(i)->getCore();
 			const VertexBufferProperties& vbProps = vertexBuffer->getProperties();
 
 			UINT32 bufferSize = meshData.getStreamSize(i);
@@ -176,7 +176,7 @@ namespace BansheeEngine
 		if(data.getTypeId() != TID_MeshData)
 			BS_EXCEPT(InvalidParametersException, "Invalid GpuResourceData type. Only MeshData is supported.");
 
-		IndexBufferCore* indexBuffer = mIndexBuffer->getCore();
+		SPtr<IndexBufferCore> indexBuffer = mIndexBuffer->getCore();
 
 		IndexType indexType = IT_32BIT;
 		if (indexBuffer)
@@ -225,7 +225,7 @@ namespace BansheeEngine
 				if(!meshData.getVertexDesc()->hasStream(streamIdx))
 					continue;
 
-				VertexBufferCore* vertexBuffer = iter->second->getCore();
+				SPtr<VertexBufferCore> vertexBuffer = iter->second->getCore();
 				const VertexBufferProperties& vbProps = vertexBuffer->getProperties();
 
 				// Ensure both have the same sized vertices
@@ -257,7 +257,7 @@ namespace BansheeEngine
 
 	MeshDataPtr Mesh::allocateSubresourceBuffer(UINT32 subresourceIdx) const
 	{
-		IndexBufferCore* indexBuffer = mIndexBuffer->getCore();
+		SPtr<IndexBufferCore> indexBuffer = mIndexBuffer->getCore();
 
 		IndexType indexType = IT_32BIT;
 		if(mIndexBuffer)

+ 4 - 4
BansheeCore/Source/BsMeshHeap.cpp

@@ -270,7 +270,7 @@ namespace BansheeEngine
 					toString(vertSize) + ". Got: " + toString(otherVertSize));
 			}
 
-			VertexBufferCore* vertexBuffer = mVertexData->getBuffer(i)->getCore();
+			SPtr<VertexBufferCore> vertexBuffer = mVertexData->getBuffer(i)->getCore();
 			const VertexBufferProperties& vbProps = vertexBuffer->getProperties();
 
 			UINT8* vertDest = mCPUVertexData[i] + vertChunkStart * vertSize;
@@ -299,7 +299,7 @@ namespace BansheeEngine
 			vertexBuffer->writeData(vertChunkStart * vertSize, meshData->getNumVertices() * vertSize, vertDest, BufferWriteType::NoOverwrite);
 		}
 
-		IndexBufferCore* indexBuffer = mIndexBuffer->getCore();
+		SPtr<IndexBufferCore> indexBuffer = mIndexBuffer->getCore();
 		const IndexBufferProperties& ibProps = indexBuffer->getProperties();
 
 		UINT32 idxSize = ibProps.getIndexSize();
@@ -356,7 +356,7 @@ namespace BansheeEngine
 			VertexBufferPtr vertexBuffer = HardwareBufferManager::instance().createVertexBuffer(
 				vertSize, mVertexData->vertexCount, GBU_DYNAMIC);
 
-			VertexBufferCore* vertexBufferCore = vertexBuffer->getCore();
+			SPtr<VertexBufferCore> vertexBufferCore = vertexBuffer->getCore();
 			mVertexData->setBuffer(i, vertexBuffer);
 
 			// Copy all data to the new buffer
@@ -427,7 +427,7 @@ namespace BansheeEngine
 		mNumIndices = numIndices;
 
 		mIndexBuffer = HardwareBufferManager::instance().createIndexBuffer(mIndexType, mNumIndices, GBU_DYNAMIC);
-		IndexBufferCore* indexBuffer = mIndexBuffer->getCore();
+		SPtr<IndexBufferCore> indexBuffer = mIndexBuffer->getCore();
 		const IndexBufferProperties& ibProps = indexBuffer->getProperties();
 
 		// Copy all data to the new buffer

+ 2 - 2
BansheeCore/Source/BsMultiRenderTexture.cpp

@@ -189,9 +189,9 @@ namespace BansheeEngine
 		return static_cast<const MultiRenderTextureProperties&>(RenderTarget::getProperties());
 	}
 
-	MultiRenderTextureCore* MultiRenderTexture::getCore() const
+	SPtr<MultiRenderTextureCore> MultiRenderTexture::getCore() const
 	{
-		return static_cast<MultiRenderTextureCore*>(mCoreSpecific);
+		return std::static_pointer_cast<MultiRenderTextureCore>(mCoreSpecific);
 	}
 
 	MultiRenderTexturePtr MultiRenderTexture::create(const MULTI_RENDER_TEXTURE_DESC& desc)

+ 1 - 1
BansheeCore/Source/BsRenderSystem.cpp

@@ -249,7 +249,7 @@ namespace BansheeEngine
 
 		if (useIndices)
 		{
-			IndexBufferCore* indexBuffer = mesh->_getIndexBuffer()->getCore();
+			SPtr<IndexBufferCore> indexBuffer = mesh->_getIndexBuffer()->getCore();
 			const IndexBufferProperties& ibProps = indexBuffer->getProperties();
 
 			if(indexCount == 0)

+ 2 - 2
BansheeCore/Source/BsRenderTarget.cpp

@@ -60,9 +60,9 @@ namespace BansheeEngine
 		return *mProperties;
 	}
 
-	RenderTargetCore* RenderTarget::getCore() const
+	SPtr<RenderTargetCore> RenderTarget::getCore() const
 	{
-		return static_cast<RenderTargetCore*>(mCoreSpecific);
+		return std::static_pointer_cast<RenderTargetCore>(mCoreSpecific);
 	}
 
 	RenderTarget::RenderTarget()

+ 2 - 2
BansheeCore/Source/BsRenderTexture.cpp

@@ -133,9 +133,9 @@ namespace BansheeEngine
 		return static_cast<const RenderTextureProperties&>(RenderTarget::getProperties()); 
 	}
 
-	RenderTextureCore* RenderTexture::getCore() const 
+	SPtr<RenderTextureCore> RenderTexture::getCore() const 
 	{ 
-		return static_cast<RenderTextureCore*>(mCoreSpecific); 
+		return std::static_pointer_cast<RenderTextureCore>(mCoreSpecific); 
 	}
 
 	void RenderTexture::initialize(const RENDER_TEXTURE_DESC& desc)

+ 2 - 2
BansheeCore/Source/BsRenderWindow.cpp

@@ -102,9 +102,9 @@ namespace BansheeEngine
 		return static_cast<const RenderWindowProperties&>(RenderTarget::getProperties());
 	}
 
-	RenderWindowCore* RenderWindow::getCore() const
+	SPtr<RenderWindowCore> RenderWindow::getCore() const
 	{
-		return static_cast<RenderWindowCore*>(mCoreSpecific);
+		return std::static_pointer_cast<RenderWindowCore>(mCoreSpecific);
 	}
 
 	RenderWindowPtr RenderWindow::create(RENDER_WINDOW_DESC& desc, RenderWindowPtr parentWindow)

+ 2 - 2
BansheeCore/Source/BsVertexBuffer.cpp

@@ -20,9 +20,9 @@ namespace BansheeEngine
 		mProperties.mNumVertices = numVertices;
     }
 
-	VertexBufferCore* VertexBuffer::getCore() const
+	SPtr<VertexBufferCore> VertexBuffer::getCore() const
 	{
-		return static_cast<VertexBufferCore*>(mCoreSpecific);
+		return std::static_pointer_cast<VertexBufferCore>(mCoreSpecific);
 	}
 
 	VertexBufferPtr VertexBuffer::create(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)

+ 3 - 3
BansheeCore/Source/Win32/BsPlatformImpl.cpp

@@ -263,21 +263,21 @@ namespace BansheeEngine
 	{
 		BS_LOCK_MUTEX(mSync);
 
-		mNonClientAreas[window.getCore()].moveAreas = nonClientAreas;
+		mNonClientAreas[window.getCore().get()].moveAreas = nonClientAreas;
 	}
 
 	void Platform::setResizeNonClientAreas(const RenderWindow& window, const Vector<NonClientResizeArea>& nonClientAreas)
 	{
 		BS_LOCK_MUTEX(mSync);
 
-		mNonClientAreas[window.getCore()].resizeAreas = nonClientAreas;
+		mNonClientAreas[window.getCore().get()].resizeAreas = nonClientAreas;
 	}
 
 	void Platform::resetNonClientAreas(const RenderWindow& window)
 	{
 		BS_LOCK_MUTEX(mSync);
 
-		auto iterFind = mNonClientAreas.find(window.getCore());
+		auto iterFind = mNonClientAreas.find(window.getCore().get());
 
 		if(iterFind != end(mNonClientAreas))
 			mNonClientAreas.erase(iterFind);

+ 1 - 1
BansheeCore/Source/Win32/BsPlatformWndProc.cpp

@@ -32,7 +32,7 @@ namespace BansheeEngine
 					Vector<RenderWindow*> renderWindows = RenderWindowManager::instance().getRenderWindows();
 					for(auto& renderWindow : renderWindows)
 					{
-						if(renderWindow->getCore() == newWindow)
+						if(renderWindow->getCore().get() == newWindow)
 							continue;
 
 						HWND curHwnd;

+ 1 - 1
BansheeD3D11RenderSystem/Include/BsD3D11IndexBuffer.h

@@ -82,7 +82,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 
 		D3D11Device& mDevice;
 	};

+ 1 - 1
BansheeD3D11RenderSystem/Include/BsD3D11MultiRenderTexture.h

@@ -49,6 +49,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 }

+ 1 - 1
BansheeD3D11RenderSystem/Include/BsD3D11RenderTexture.h

@@ -53,6 +53,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 }

+ 1 - 1
BansheeD3D11RenderSystem/Include/BsD3D11RenderWindow.h

@@ -227,7 +227,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderWindow::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 
 	private:
 		D3D11Device& mDevice;

+ 1 - 1
BansheeD3D11RenderSystem/Include/BsD3D11VertexBuffer.h

@@ -85,7 +85,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 
 		D3D11Device& mDevice;
 		bool mStreamOut;

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11IndexBuffer.cpp

@@ -78,8 +78,8 @@ namespace BansheeEngine
 
 	}
 
-	CoreObjectCore* D3D11IndexBuffer::createCore() const
+	SPtr<CoreObjectCore> D3D11IndexBuffer::createCore() const
 	{
-		return bs_new<D3D11IndexBufferCore>(mDevice, mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<D3D11IndexBufferCore>(mDevice, mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11MultiRenderTexture.cpp

@@ -45,14 +45,14 @@ namespace BansheeEngine
 		return bs_new<MultiRenderTextureProperties>();
 	}
 
-	CoreObjectCore* D3D11MultiRenderTexture::createCore() const
+	SPtr<CoreObjectCore> D3D11MultiRenderTexture::createCore() const
 	{
 		MultiRenderTextureProperties* coreProperties = bs_new<MultiRenderTextureProperties>();
 		MultiRenderTextureProperties* myProperties = static_cast<MultiRenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<D3D11MultiRenderTextureCore>(const_cast<D3D11MultiRenderTexture*>(this),
+		return bs_shared_ptr<D3D11MultiRenderTextureCore>(const_cast<D3D11MultiRenderTexture*>(this),
 			coreProperties, mDesc);
 	}
 }

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11RenderSystem.cpp

@@ -408,7 +408,7 @@ namespace BansheeEngine
 
 		for(UINT32 i = 0; i < numBuffers; i++)
 		{
-			D3D11VertexBufferCore* vertexBuffer = static_cast<D3D11VertexBufferCore*>(buffers[i]->getCore());
+			SPtr<D3D11VertexBufferCore> vertexBuffer = std::static_pointer_cast<D3D11VertexBufferCore>(buffers[i]->getCore());
 			const VertexBufferProperties& vbProps = vertexBuffer->getProperties();
 
 			dx11buffers[i] = vertexBuffer->getD3DVertexBuffer();
@@ -426,7 +426,7 @@ namespace BansheeEngine
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
-		D3D11IndexBufferCore* indexBuffer = static_cast<D3D11IndexBufferCore*>(buffer->getCore());
+		SPtr<D3D11IndexBufferCore> indexBuffer = std::static_pointer_cast<D3D11IndexBufferCore>(buffer->getCore());
 
 		DXGI_FORMAT indexFormat = DXGI_FORMAT_R16_UINT;
 		if(indexBuffer->getProperties().getType() == IT_16BIT)

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11RenderTexture.cpp

@@ -38,14 +38,14 @@ namespace BansheeEngine
 		return bs_new<RenderTextureProperties>();
 	}
 
-	CoreObjectCore* D3D11RenderTexture::createCore() const
+	SPtr<CoreObjectCore> D3D11RenderTexture::createCore() const
 	{
 		RenderTextureProperties* coreProperties = bs_new<RenderTextureProperties>();
 		RenderTextureProperties* myProperties = static_cast<RenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<D3D11RenderTextureCore>(const_cast<D3D11RenderTexture*>(this), 
+		return bs_shared_ptr<D3D11RenderTextureCore>(const_cast<D3D11RenderTexture*>(this), 
 			coreProperties, mColorSurfaceDesc, mDepthStencilSurfaceDesc);
 	}
 }

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11RenderWindow.cpp

@@ -817,13 +817,13 @@ namespace BansheeEngine
 		return bs_new<D3D11RenderWindowProperties>();
 	}
 
-	CoreObjectCore* D3D11RenderWindow::createCore() const
+	SPtr<CoreObjectCore> D3D11RenderWindow::createCore() const
 	{
 		D3D11RenderWindowProperties* coreProperties = bs_new<D3D11RenderWindowProperties>();
 		D3D11RenderWindowProperties* myProperties = static_cast<D3D11RenderWindowProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<D3D11RenderWindowCore>(const_cast<D3D11RenderWindow*>(this), coreProperties, mDesc, mDevice, mDXGIFactory);
+		return bs_shared_ptr<D3D11RenderWindowCore>(const_cast<D3D11RenderWindow*>(this), coreProperties, mDesc, mDevice, mDXGIFactory);
 	}
 }

+ 2 - 2
BansheeD3D11RenderSystem/Source/BsD3D11VertexBuffer.cpp

@@ -72,8 +72,8 @@ namespace BansheeEngine
 		:VertexBuffer(vertexSize, numVertices, usage, useSystemMem), mDevice(device), mStreamOut(streamOut)
 	{ }
 
-	CoreObjectCore* D3D11VertexBuffer::createCore() const
+	SPtr<CoreObjectCore> D3D11VertexBuffer::createCore() const
 	{
-		return bs_new<D3D11VertexBufferCore>(mDevice, mStreamOut, mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<D3D11VertexBufferCore>(mDevice, mStreamOut, mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 1 - 1
BansheeD3D9RenderSystem/Include/BsD3D9IndexBuffer.h

@@ -116,6 +116,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
     };
 }

+ 1 - 1
BansheeD3D9RenderSystem/Include/BsD3D9MultiRenderTexture.h

@@ -58,6 +58,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 }

+ 1 - 1
BansheeD3D9RenderSystem/Include/BsD3D9RenderTexture.h

@@ -93,6 +93,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 }

+ 2 - 2
BansheeD3D9RenderSystem/Include/BsD3D9RenderWindow.h

@@ -218,7 +218,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderWindow::getCore
 		 */
-		D3D9RenderWindowCore* getCore() const;
+		SPtr<D3D9RenderWindowCore> getCore() const;
 
 	protected:
 		friend class D3D9RenderWindowManager;
@@ -234,7 +234,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderWindow::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 
 	private:
 		HINSTANCE mInstance;

+ 1 - 1
BansheeD3D9RenderSystem/Include/BsD3D9VertexBuffer.h

@@ -116,6 +116,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
     };
 }

+ 2 - 2
BansheeD3D9RenderSystem/Source/BsD3D9IndexBuffer.cpp

@@ -308,8 +308,8 @@ namespace BansheeEngine
 		: IndexBuffer(idxType, numIndexes, usage, useSystemMemory)
 	{ }
 
-	CoreObjectCore* D3D9IndexBuffer::createCore() const
+	SPtr<CoreObjectCore> D3D9IndexBuffer::createCore() const
 	{
-		return bs_new<D3D9IndexBufferCore>(mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<D3D9IndexBufferCore>(mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 2 - 2
BansheeD3D9RenderSystem/Source/BsD3D9MultiRenderTexture.cpp

@@ -86,14 +86,14 @@ namespace BansheeEngine
 		return bs_new<MultiRenderTextureProperties>();
 	}
 
-	CoreObjectCore* D3D9MultiRenderTexture::createCore() const
+	SPtr<CoreObjectCore> D3D9MultiRenderTexture::createCore() const
 	{
 		MultiRenderTextureProperties* coreProperties = bs_new<MultiRenderTextureProperties>();
 		MultiRenderTextureProperties* myProperties = static_cast<MultiRenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<D3D9MultiRenderTextureCore>(const_cast<D3D9MultiRenderTexture*>(this),
+		return bs_shared_ptr<D3D9MultiRenderTextureCore>(const_cast<D3D9MultiRenderTexture*>(this),
 			coreProperties, mDesc);
 	}
 }

+ 2 - 2
BansheeD3D9RenderSystem/Source/BsD3D9RenderSystem.cpp

@@ -1178,7 +1178,7 @@ namespace BansheeEngine
 		{
 			if(buffers[i] != nullptr)
 			{
-				D3D9VertexBufferCore* d3d9buf = static_cast<D3D9VertexBufferCore*>(buffers[i]->getCore());
+				SPtr<D3D9VertexBufferCore> d3d9buf = std::static_pointer_cast<D3D9VertexBufferCore>(buffers[i]->getCore());
 				const VertexBufferProperties& vbProps = d3d9buf->getProperties();
 
 				hr = getActiveD3D9Device()->SetStreamSource(
@@ -1204,7 +1204,7 @@ namespace BansheeEngine
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
-		D3D9IndexBufferCore* d3dIdxBuf = static_cast<D3D9IndexBufferCore*>(buffer->getCore());
+		SPtr<D3D9IndexBufferCore> d3dIdxBuf = std::static_pointer_cast<D3D9IndexBufferCore>(buffer->getCore());
 
 		HRESULT hr = getActiveD3D9Device()->SetIndices( d3dIdxBuf->getD3DIndexBuffer() );
 		if (FAILED(hr))

+ 2 - 2
BansheeD3D9RenderSystem/Source/BsD3D9RenderTexture.cpp

@@ -89,14 +89,14 @@ namespace BansheeEngine
 		return bs_new<RenderTextureProperties>();
 	}
 
-	CoreObjectCore* D3D9RenderTexture::createCore() const
+	SPtr<CoreObjectCore> D3D9RenderTexture::createCore() const
 	{
 		RenderTextureProperties* coreProperties = bs_new<RenderTextureProperties>();
 		RenderTextureProperties* myProperties = static_cast<RenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<D3D9RenderTextureCore>(const_cast<D3D9RenderTexture*>(this),
+		return bs_shared_ptr<D3D9RenderTextureCore>(const_cast<D3D9RenderTexture*>(this),
 			coreProperties, mColorSurfaceDesc, mDepthStencilSurfaceDesc);
 	}
 }

+ 4 - 4
BansheeD3D9RenderSystem/Source/BsD3D9RenderWindow.cpp

@@ -740,9 +740,9 @@ namespace BansheeEngine
 		return Vector2I(pos.x, pos.y);
 	}
 
-	D3D9RenderWindowCore* D3D9RenderWindow::getCore() const
+	SPtr<D3D9RenderWindowCore> D3D9RenderWindow::getCore() const
 	{
-		return static_cast<D3D9RenderWindowCore*>(mCoreSpecific);
+		return std::static_pointer_cast<D3D9RenderWindowCore>(mCoreSpecific);
 	}
 
 	RenderTargetProperties* D3D9RenderWindow::createProperties() const
@@ -750,12 +750,12 @@ namespace BansheeEngine
 		return bs_new<D3D9RenderWindowProperties>();
 	}
 
-	CoreObjectCore* D3D9RenderWindow::createCore() const
+	SPtr<CoreObjectCore> D3D9RenderWindow::createCore() const
 	{
 		D3D9RenderWindowProperties* coreProperties = bs_new<D3D9RenderWindowProperties>();
 		D3D9RenderWindowProperties* myProperties = static_cast<D3D9RenderWindowProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
-		return bs_new<D3D9RenderWindowCore>(const_cast<D3D9RenderWindow*>(this), coreProperties, mDesc, mInstance);
+		return bs_shared_ptr<D3D9RenderWindowCore>(const_cast<D3D9RenderWindow*>(this), coreProperties, mDesc, mInstance);
 	}
 }

+ 2 - 2
BansheeD3D9RenderSystem/Source/BsD3D9VertexBuffer.cpp

@@ -304,8 +304,8 @@ namespace BansheeEngine
 		: VertexBuffer(vertexSize, numVertices, usage, useSystemMemory)
 	{ }
 
-	CoreObjectCore* D3D9VertexBuffer::createCore() const
+	SPtr<CoreObjectCore> D3D9VertexBuffer::createCore() const
 	{
-		return bs_new<D3D9VertexBufferCore>(mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<D3D9VertexBufferCore>(mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 1 - 1
BansheeGLRenderSystem/Include/BsGLIndexBuffer.h

@@ -72,6 +72,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
     };
 }

+ 1 - 1
BansheeGLRenderSystem/Include/BsGLMultiRenderTexture.h

@@ -68,6 +68,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 }

+ 1 - 1
BansheeGLRenderSystem/Include/BsGLRenderTexture.h

@@ -73,7 +73,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderTexture::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 	};
 
     /**

+ 1 - 1
BansheeGLRenderSystem/Include/BsGLVertexBuffer.h

@@ -84,6 +84,6 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	CoreObject::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
     };
 }

+ 2 - 2
BansheeGLRenderSystem/Include/BsWin32Window.h

@@ -178,7 +178,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderWindow::getCore
 		 */
-		Win32WindowCore* getCore() const;
+		SPtr<Win32WindowCore> getCore() const;
 
 	protected:
 		friend class GLRenderWindowManager;
@@ -195,7 +195,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	RenderWindow::createCore
 		 */
-		virtual CoreObjectCore* createCore() const;
+		virtual SPtr<CoreObjectCore> createCore() const;
 
 	private:
 		Win32GLSupport& mGLSupport;

+ 2 - 2
BansheeGLRenderSystem/Source/BsGLIndexBuffer.cpp

@@ -135,8 +135,8 @@ namespace BansheeEngine
 		:IndexBuffer(idxType, numIndexes, usage, false)
 	{  }
 
-	CoreObjectCore* GLIndexBuffer::createCore() const
+	SPtr<CoreObjectCore> GLIndexBuffer::createCore() const
 	{
-		return bs_new<GLIndexBufferCore>(mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<GLIndexBufferCore>(mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 2 - 2
BansheeGLRenderSystem/Source/BsGLMultiRenderTexture.cpp

@@ -96,14 +96,14 @@ namespace BansheeEngine
 		return bs_new<MultiRenderTextureProperties>();
 	}
 
-	CoreObjectCore* GLMultiRenderTexture::createCore() const
+	SPtr<CoreObjectCore> GLMultiRenderTexture::createCore() const
 	{
 		MultiRenderTextureProperties* coreProperties = bs_new<MultiRenderTextureProperties>();
 		MultiRenderTextureProperties* myProperties = static_cast<MultiRenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<GLMultiRenderTextureCore>(const_cast<GLMultiRenderTexture*>(this),
+		return bs_shared_ptr<GLMultiRenderTextureCore>(const_cast<GLMultiRenderTexture*>(this),
 			coreProperties, mDesc);
 	}
 }

+ 1 - 1
BansheeGLRenderSystem/Source/BsGLRenderSystem.cpp

@@ -706,7 +706,7 @@ namespace BansheeEngine
 
 		beginDraw();
 
-		GLIndexBufferCore* indexBuffer = static_cast<GLIndexBufferCore*>(mBoundIndexBuffer->getCore());
+		SPtr<GLIndexBufferCore> indexBuffer = std::static_pointer_cast<GLIndexBufferCore>(mBoundIndexBuffer->getCore());
 		const IndexBufferProperties& ibProps = indexBuffer->getProperties();
 		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer->getGLBufferId());
 

+ 2 - 2
BansheeGLRenderSystem/Source/BsGLRenderTexture.cpp

@@ -95,14 +95,14 @@ namespace BansheeEngine
 		return bs_new<RenderTextureProperties>();
 	}
 
-	CoreObjectCore* GLRenderTexture::createCore() const
+	SPtr<CoreObjectCore> GLRenderTexture::createCore() const
 	{
 		RenderTextureProperties* coreProperties = bs_new<RenderTextureProperties>();
 		RenderTextureProperties* myProperties = static_cast<RenderTextureProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
 
-		return bs_new<GLRenderTextureCore>(const_cast<GLRenderTexture*>(this),
+		return bs_shared_ptr<GLRenderTextureCore>(const_cast<GLRenderTexture*>(this),
 			coreProperties, mColorSurfaceDesc, mDepthStencilSurfaceDesc);
 	}
 

+ 3 - 3
BansheeGLRenderSystem/Source/BsGLVertexArrayObjectManager.cpp

@@ -154,7 +154,7 @@ namespace BansheeEngine
 
 			// TODO - We might also want to check the size of input and buffer, and make sure they match? Or does OpenGL handle that internally?
 
-			GLVertexBufferCore* vertexBuffer = static_cast<GLVertexBufferCore*>(usedBuffers[seqIdx]->getCore());
+			SPtr<GLVertexBufferCore> vertexBuffer = std::static_pointer_cast<GLVertexBufferCore>(usedBuffers[seqIdx]->getCore());
 			const VertexBufferProperties& vbProps = vertexBuffer->getProperties();
 
 			glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer->getGLBufferId());
@@ -186,7 +186,7 @@ namespace BansheeEngine
 		{
 			wantedVAO.mAttachedBuffers[i] = usedBuffers[i];
 
-			GLVertexBufferCore* curVertexBuffer = static_cast<GLVertexBufferCore*>(usedBuffers[i]->getCore());
+			SPtr<GLVertexBufferCore> curVertexBuffer = std::static_pointer_cast<GLVertexBufferCore>(usedBuffers[i]->getCore());
 			curVertexBuffer->registerVAO(wantedVAO);
 		}
 
@@ -206,7 +206,7 @@ namespace BansheeEngine
 
 		for (UINT32 i = 0; i < vao.mNumBuffers; i++)
 		{
-			GLVertexBufferCore* curVertexBuffer = static_cast<GLVertexBufferCore*>(vao.mAttachedBuffers[i]->getCore());
+			SPtr<GLVertexBufferCore> curVertexBuffer = std::static_pointer_cast<GLVertexBufferCore>(vao.mAttachedBuffers[i]->getCore());
 			curVertexBuffer->unregisterVAO(vao);
 		}
 

+ 2 - 2
BansheeGLRenderSystem/Source/BsGLVertexBuffer.cpp

@@ -156,8 +156,8 @@ namespace BansheeEngine
 	{
 	}
 
-	CoreObjectCore* GLVertexBuffer::createCore() const
+	SPtr<CoreObjectCore> GLVertexBuffer::createCore() const
 	{
-		return bs_new<GLVertexBufferCore>(mUsage, mUseSystemMemory, mProperties);
+		return bs_shared_ptr<GLVertexBufferCore>(mUsage, mUseSystemMemory, mProperties);
 	}
 }

+ 4 - 4
BansheeGLRenderSystem/Source/BsWin32Window.cpp

@@ -761,9 +761,9 @@ namespace BansheeEngine
 		return Vector2I(pos.x, pos.y);
 	}
 
-	Win32WindowCore* Win32Window::getCore() const
+	SPtr<Win32WindowCore> Win32Window::getCore() const
 	{
-		return static_cast<Win32WindowCore*>(mCoreSpecific);
+		return std::static_pointer_cast<Win32WindowCore>(mCoreSpecific);
 	}
 
 	RenderTargetProperties* Win32Window::createProperties() const
@@ -771,12 +771,12 @@ namespace BansheeEngine
 		return bs_new<Win32RenderWindowProperties>();
 	}
 
-	CoreObjectCore* Win32Window::createCore() const
+	SPtr<CoreObjectCore> Win32Window::createCore() const
 	{
 		Win32RenderWindowProperties* coreProperties = bs_new<Win32RenderWindowProperties>();
 		Win32RenderWindowProperties* myProperties = static_cast<Win32RenderWindowProperties*>(mProperties);
 
 		*coreProperties = *myProperties;
-		return bs_new<Win32WindowCore>(const_cast<Win32Window*>(this), coreProperties, mDesc, mGLSupport);
+		return bs_shared_ptr<Win32WindowCore>(const_cast<Win32Window*>(this), coreProperties, mDesc, mGLSupport);
 	}
 }

+ 3 - 0
BansheeUtility/Include/BsStdHeaders.h

@@ -135,6 +135,9 @@ namespace BansheeEngine
 	template <typename K, typename V, typename H = std::hash<K>, typename C = std::equal_to<K>, typename A = StdAlloc<std::pair<const K, V>>> 
 	using UnorderedMultimap = std::unordered_multimap<K, V, H, C, A>;
 
+	template <typename T>
+	using SPtr = std::shared_ptr<T> ;
+
 	/**
 	 * @brief	Create a new shared pointer using a custom allocator category.
 	 */

+ 8 - 9
TODO.txt

@@ -1,8 +1,6 @@
 --------- ALL LONG TERM TASKS / FIXES BELONG TO GOOGLE DOCS: ImplementationTODO OR PossibleImprovements ----------
 
 TODO - CoreObject refactor:
-IndexBuffer
-VertexBuffer
 Resource
  - RasterizerState
  - DepthStencilState
@@ -23,14 +21,15 @@ VertexDeclaration
 GpuBuffer
 GpuParamBlockBuffer
 
-Go through stuff that doesn't require syncing first, e.g. IndexBuffer
-  - Rename IndexBuffer to IndexBufferCore, and make it inheir from CoreObjectCore
-  - Add a new class IndexBuffer and use that on sim thread (if it's even used on sim thread)
-  - IndexBuffer should then only need to create an IndexBufferCore and needs no other functionality
-  - Potentially I'll want to move common immutable data (buffer size, type, etc.) into IndexBufferProperties, similar to RenderTarget
-    and have it accessible from both IndexBuffer and IndexBufferCore. This saves me from having to duplicate all methods on both types.
+Disallow CoreObject creation from core thread
+ - Add asserts in CoreObject::destroy and CoreObject::initialize
+ - Possibly also add asserts to CoreThread::queueCommand and CoreThread::queueReturnCommand
 
-Possibly also disallow CoreObject creation from core thread. Instead force them to create CoreObjectCore versions.
+Make mCoreSpecific a shared ptr
+ - Where needed, add create() methods to CoreObjectCore for use from the core thread
+
+Refactor RenderSystem, Mesh, MeshHeap so they use only core versions of Index and VertexBuffer
+ - This should also apply to any newly refactored classes, non-core stuff should be removed from core
 
 -----------------