Browse Source

When blocking for resource load optionally wait for dependencies too

Marko Pintera 11 years ago
parent
commit
eb609f487a

+ 2 - 2
BansheeCore/Include/BsFont.h

@@ -85,9 +85,9 @@ namespace BansheeEngine
 		Font();
 		Font();
 
 
 		/**
 		/**
-		 * @copydoc	Resource::areDependenciesLoaded
+		 * @copydoc	Resource::getResourceDependencies
 		 */
 		 */
-		bool areDependenciesLoaded() const;
+		void getResourceDependencies(Vector<HResource>& dependencies) const;
 
 
 		/**
 		/**
 		 * @copydoc	CoreObject::getCoreDependencies
 		 * @copydoc	CoreObject::getCoreDependencies

+ 1 - 1
BansheeCore/Include/BsGpuParams.h

@@ -373,7 +373,7 @@ namespace BansheeEngine
 		/**
 		/**
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 */
 		 */
-		void getResourceDependencies(Vector<HResource>& resources);
+		void getListenerResources(Vector<HResource>& resources);
 
 
 		/**
 		/**
 		 * @copydoc IResourceListener::notifyResourceLoaded
 		 * @copydoc IResourceListener::notifyResourceLoaded

+ 2 - 2
BansheeCore/Include/BsIResourceListener.h

@@ -22,12 +22,12 @@ namespace BansheeEngine
 		 *
 		 *
 		 * @note	You must add the resources to the provided "resources" array.
 		 * @note	You must add the resources to the provided "resources" array.
 		 */
 		 */
-		virtual void getResourceDependencies(Vector<HResource>& resources) = 0;
+		virtual void getListenerResources(Vector<HResource>& resources) = 0;
 
 
 		/**
 		/**
 		 * @brief	Marks the resource dependencies list as dirty and schedules it for rebuild.
 		 * @brief	Marks the resource dependencies list as dirty and schedules it for rebuild.
 		 */
 		 */
-		virtual void markResourcesDirty();
+		virtual void markListenerResourcesDirty();
 
 
 		/**
 		/**
 		 * @brief	Called when a resource has been fully loaded.
 		 * @brief	Called when a resource has been fully loaded.

+ 3 - 3
BansheeCore/Include/BsMaterial.h

@@ -673,7 +673,7 @@ namespace BansheeEngine
 		/**
 		/**
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 */
 		 */
-		void getResourceDependencies(Vector<HResource>& resources);
+		void getListenerResources(Vector<HResource>& resources);
 
 
 		/**
 		/**
 		 * @copydoc IResourceListener::notifyResourceLoaded
 		 * @copydoc IResourceListener::notifyResourceLoaded
@@ -691,9 +691,9 @@ namespace BansheeEngine
 		void notifyResourceChanged(const HResource& resource);
 		void notifyResourceChanged(const HResource& resource);
 
 
 		/**
 		/**
-		 * @copydoc	Resource::areDependenciesLoaded
+		 * @copydoc	Resource::getResourceDependencies
 		 */
 		 */
-		bool areDependenciesLoaded() const;
+		void getResourceDependencies(Vector<HResource>& dependencies) const;
 
 
 		/**
 		/**
 		 * @brief	Performs material initialization when all resources are ready.
 		 * @brief	Performs material initialization when all resources are ready.

+ 1 - 1
BansheeCore/Include/BsPass.h

@@ -203,7 +203,7 @@ namespace BansheeEngine
 		/**
 		/**
 		* @copydoc	IResourceListener::getResourceDependencies
 		* @copydoc	IResourceListener::getResourceDependencies
 		*/
 		*/
-		void getResourceDependencies(Vector<HResource>& resources);
+		void getListenerResources(Vector<HResource>& resources);
 
 
 		/**
 		/**
 		* @copydoc IResourceListener::notifyResourceLoaded
 		* @copydoc IResourceListener::notifyResourceLoaded

+ 10 - 2
BansheeCore/Include/BsResource.h

@@ -40,9 +40,17 @@ namespace BansheeEngine
 		friend class ResourceHandleBase;
 		friend class ResourceHandleBase;
 
 
 		/**
 		/**
-		 * @brief	Checks if are all resources that this resource depends on loaded.
+		 * @brief	Retrieves a list of all resources that this resource depends on.
+		 *
+		 * TODO - Consider using a stack-allocated data type since returned data is almost
+		 *		  always transient. Then we can save on memory allocations.
 		 */
 		 */
-		virtual bool areDependenciesLoaded() const { return true; }
+		virtual void getResourceDependencies(Vector<HResource>& dependencies) const { }
+
+		/**
+		 * @brief	Checks if all the resources this object is dependent on are fully loaded.
+		 */
+		bool areDependenciesLoaded() const;
 
 
 		UINT32 mSize;
 		UINT32 mSize;
 		ResourceMetaDataPtr mMetaData;
 		ResourceMetaDataPtr mMetaData;

+ 2 - 2
BansheeCore/Include/BsShader.h

@@ -310,9 +310,9 @@ namespace BansheeEngine
 		Shader(const String& name, const SHADER_DESC& desc, const Vector<SPtr<Technique>>& techniques);
 		Shader(const String& name, const SHADER_DESC& desc, const Vector<SPtr<Technique>>& techniques);
 
 
 		/**
 		/**
-		 * @copydoc	Resource::areDependenciesLoaded
+		 * @copydoc	Resource::getResourceDependencies
 		 */
 		 */
-		bool areDependenciesLoaded() const;
+		void getResourceDependencies(Vector<HResource>& dependencies) const;
 
 
 		/**
 		/**
 		 * @copydoc	CoreObject::getCoreDependencies
 		 * @copydoc	CoreObject::getCoreDependencies

+ 3 - 5
BansheeCore/Source/BsFont.cpp

@@ -83,18 +83,16 @@ namespace BansheeEngine
 		return bestSize;
 		return bestSize;
 	}
 	}
 
 
-	bool Font::areDependenciesLoaded() const
+	void Font::getResourceDependencies(Vector<HResource>& dependencies) const
 	{
 	{
 		for (auto& fontDataEntry : mFontDataPerSize)
 		for (auto& fontDataEntry : mFontDataPerSize)
 		{
 		{
 			for (auto& texture : fontDataEntry.second.texturePages)
 			for (auto& texture : fontDataEntry.second.texturePages)
 			{
 			{
-				if (!texture.isLoaded())
-					return false;
+				if (texture != nullptr)
+					dependencies.push_back(texture);
 			}
 			}
 		}
 		}
-
-		return true;
 	}
 	}
 
 
 	void Font::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)
 	void Font::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)

+ 2 - 2
BansheeCore/Source/BsGpuParams.cpp

@@ -457,7 +457,7 @@ UINT32 GpuParamsBase::getDataParamSize(const String& name) const
 
 
 	void GpuParams::_markResourcesDirty()
 	void GpuParams::_markResourcesDirty()
 	{
 	{
-		markResourcesDirty();
+		markListenerResourcesDirty();
 	}
 	}
 
 
 	SPtr<GpuParams> GpuParams::create(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
 	SPtr<GpuParams> GpuParams::create(const GpuParamDescPtr& paramDesc, bool transposeMatrices)
@@ -526,7 +526,7 @@ UINT32 GpuParamsBase::getDataParamSize(const String& name) const
 		return CoreSyncData(data, totalSize);
 		return CoreSyncData(data, totalSize);
 	}
 	}
 
 
-	void GpuParams::getResourceDependencies(Vector<HResource>& resources)
+	void GpuParams::getListenerResources(Vector<HResource>& resources)
 	{
 	{
 		for (UINT32 i = 0; i < mNumTextures; i++)
 		for (UINT32 i = 0; i < mNumTextures; i++)
 		{
 		{

+ 1 - 1
BansheeCore/Source/BsIResourceListener.cpp

@@ -13,7 +13,7 @@ namespace BansheeEngine
 		ResourceListenerManager::instance().unregisterListener(this);
 		ResourceListenerManager::instance().unregisterListener(this);
 	}
 	}
 
 
-	void IResourceListener::markResourcesDirty()
+	void IResourceListener::markListenerResourcesDirty()
 	{
 	{
 		ResourceListenerManager::instance().markListenerDirty(this);
 		ResourceListenerManager::instance().markListenerDirty(this);
 	}
 	}

+ 6 - 8
BansheeCore/Source/BsMaterial.cpp

@@ -916,7 +916,7 @@ namespace BansheeEngine
 
 
 	void Material::_markResourcesDirty()
 	void Material::_markResourcesDirty()
 	{
 	{
-		markResourcesDirty();
+		markListenerResourcesDirty();
 	}
 	}
 
 
 	SPtr<MaterialCore> Material::getCore() const
 	SPtr<MaterialCore> Material::getCore() const
@@ -1012,7 +1012,7 @@ namespace BansheeEngine
 		}
 		}
 	}
 	}
 
 
-	void Material::getResourceDependencies(Vector<HResource>& resources)
+	void Material::getListenerResources(Vector<HResource>& resources)
 	{
 	{
 		if (mShader != nullptr)
 		if (mShader != nullptr)
 		{
 		{
@@ -1069,12 +1069,10 @@ namespace BansheeEngine
 		}
 		}
 	}
 	}
 
 
-	bool Material::areDependenciesLoaded() const
+	void Material::getResourceDependencies(Vector<HResource>& dependencies) const
 	{
 	{
-		if (mShader == nullptr) // No shader, so everything is technically loaded
-			return true;
-
-		return mShader.isLoaded();
+		if (mShader != nullptr)
+			dependencies.push_back(mShader);
 	}
 	}
 
 
 	void Material::initializeIfLoaded()
 	void Material::initializeIfLoaded()
@@ -1094,7 +1092,7 @@ namespace BansheeEngine
 			if (mShader.isLoaded() && mLoadFlags == Load_None)
 			if (mShader.isLoaded() && mLoadFlags == Load_None)
 			{
 			{
 				mLoadFlags = Load_Shader;
 				mLoadFlags = Load_Shader;
-				markResourcesDirty(); // Need to register resources dependent on shader now
+				markListenerResourcesDirty(); // Need to register resources dependent on shader now
 			}
 			}
 		}
 		}
 	}
 	}

+ 2 - 2
BansheeCore/Source/BsPass.cpp

@@ -133,7 +133,7 @@ namespace BansheeEngine
 
 
 	void Pass::_markResourcesDirty()
 	void Pass::_markResourcesDirty()
 	{
 	{
-		markResourcesDirty();
+		markListenerResourcesDirty();
 	}
 	}
 
 
 	void Pass::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)
 	void Pass::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)
@@ -166,7 +166,7 @@ namespace BansheeEngine
 			dependencies.push_back(mData.computeProgram.getInternalPtr());
 			dependencies.push_back(mData.computeProgram.getInternalPtr());
 	}
 	}
 
 
-	void Pass::getResourceDependencies(Vector<HResource>& resources)
+	void Pass::getListenerResources(Vector<HResource>& resources)
 	{
 	{
 		if (mData.blendState != nullptr)
 		if (mData.blendState != nullptr)
 			resources.push_back(mData.blendState);
 			resources.push_back(mData.blendState);

+ 14 - 0
BansheeCore/Source/BsResource.cpp

@@ -23,6 +23,20 @@ namespace BansheeEngine
 		mMetaData->displayName = name; 
 		mMetaData->displayName = name; 
 	}
 	}
 
 
+	bool Resource::areDependenciesLoaded() const
+	{
+		Vector<HResource> dependencies;
+		getResourceDependencies(dependencies);
+
+		for (auto& dependency : dependencies)
+		{
+			if (dependency != nullptr && !dependency.isLoaded())
+				return false;
+		}
+
+		return true;
+	}
+
 	RTTITypeBase* Resource::getRTTIStatic()
 	RTTITypeBase* Resource::getRTTIStatic()
 	{
 	{
 		return ResourceRTTI::instance();
 		return ResourceRTTI::instance();

+ 11 - 2
BansheeCore/Source/BsResourceHandle.cpp

@@ -35,10 +35,10 @@ namespace BansheeEngine
 		if(mData == nullptr)
 		if(mData == nullptr)
 			return;
 			return;
 
 
-		if (!isLoaded(waitForDependencies))
+		if (!mData->mIsCreated)
 		{
 		{
 			BS_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
 			BS_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
-			while (!mData->mIsCreated || (waitForDependencies && !mData->mPtr->areDependenciesLoaded()))
+			while (!mData->mIsCreated)
 			{
 			{
 				BS_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
 				BS_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
 			}
 			}
@@ -47,6 +47,15 @@ namespace BansheeEngine
 			// probably also expects the listener events to trigger immediately as well
 			// probably also expects the listener events to trigger immediately as well
 			ResourceListenerManager::instance().notifyListeners(mData->mUUID);
 			ResourceListenerManager::instance().notifyListeners(mData->mUUID);
 		}
 		}
+
+		if (waitForDependencies)
+		{
+			Vector<HResource> dependencies;
+			mData->mPtr->getResourceDependencies(dependencies);
+
+			for (auto& dependency : dependencies)
+				dependency.blockUntilLoaded(waitForDependencies);
+		}
 	}
 	}
 
 
 	void ResourceHandleBase::_setHandleData(std::shared_ptr<Resource> ptr, const String& uuid)
 	void ResourceHandleBase::_setHandleData(std::shared_ptr<Resource> ptr, const String& uuid)

+ 1 - 1
BansheeCore/Source/BsResourceListenerManager.cpp

@@ -172,7 +172,7 @@ namespace BansheeEngine
 
 
 	void ResourceListenerManager::addDependencies(IResourceListener* listener)
 	void ResourceListenerManager::addDependencies(IResourceListener* listener)
 	{
 	{
-		listener->getResourceDependencies(mTempResourceBuffer);
+		listener->getListenerResources(mTempResourceBuffer);
 
 
 		if (mTempResourceBuffer.size() > 0)
 		if (mTempResourceBuffer.size() > 0)
 		{
 		{

+ 21 - 23
BansheeCore/Source/BsShader.cpp

@@ -199,11 +199,11 @@ namespace BansheeEngine
 		return shaderCorePtr;
 		return shaderCorePtr;
 	}
 	}
 
 
-	bool Shader::areDependenciesLoaded() const
+	void Shader::getResourceDependencies(Vector<HResource>& dependencies) const
 	{
 	{
 		TechniquePtr bestTechnique = getBestTechnique();
 		TechniquePtr bestTechnique = getBestTechnique();
-		if (bestTechnique == nullptr) // No valid technique, so everything is technically loaded
-			return true;
+		if (bestTechnique == nullptr) // No valid technique
+			return;
 
 
 		UINT32 numPasses = bestTechnique->getNumPasses();
 		UINT32 numPasses = bestTechnique->getNumPasses();
 		for (UINT32 i = 0; i < numPasses; i++)
 		for (UINT32 i = 0; i < numPasses; i++)
@@ -211,43 +211,41 @@ namespace BansheeEngine
 			PassPtr pass = bestTechnique->getPass(i);
 			PassPtr pass = bestTechnique->getPass(i);
 
 
 			HGpuProgram vertProg = pass->getVertexProgram();
 			HGpuProgram vertProg = pass->getVertexProgram();
-			if (vertProg != nullptr && !vertProg.isLoaded())
-				return false;
+			if (vertProg != nullptr)
+				dependencies.push_back(vertProg);
 
 
 			HGpuProgram fragProg = pass->getFragmentProgram();
 			HGpuProgram fragProg = pass->getFragmentProgram();
-			if (fragProg != nullptr && !fragProg.isLoaded())
-				return false;
+			if (fragProg != nullptr)
+				dependencies.push_back(fragProg);
 
 
 			HGpuProgram geomProg = pass->getGeometryProgram();
 			HGpuProgram geomProg = pass->getGeometryProgram();
-			if (geomProg != nullptr && !geomProg.isLoaded())
-				return false;
+			if (geomProg != nullptr)
+				dependencies.push_back(geomProg);
 
 
 			HGpuProgram domProg = pass->getDomainProgram();
 			HGpuProgram domProg = pass->getDomainProgram();
-			if (domProg != nullptr && !domProg.isLoaded())
-				return false;
+			if (domProg != nullptr)
+				dependencies.push_back(domProg);
 
 
 			HGpuProgram hullProg = pass->getHullProgram();
 			HGpuProgram hullProg = pass->getHullProgram();
-			if (hullProg != nullptr && !hullProg.isLoaded())
-				return false;
+			if (hullProg != nullptr)
+				dependencies.push_back(hullProg);
 
 
 			HGpuProgram computeProg = pass->getComputeProgram();
 			HGpuProgram computeProg = pass->getComputeProgram();
-			if (computeProg != nullptr && !computeProg.isLoaded())
-				return false;
+			if (computeProg != nullptr)
+				dependencies.push_back(computeProg);
 
 
 			HBlendState blendState = pass->getBlendState();
 			HBlendState blendState = pass->getBlendState();
-			if (blendState != nullptr && !blendState.isLoaded())
-				return false;
+			if (blendState != nullptr)
+				dependencies.push_back(blendState);
 
 
 			HRasterizerState rasterizerState = pass->getRasterizerState();
 			HRasterizerState rasterizerState = pass->getRasterizerState();
-			if (rasterizerState != nullptr && !rasterizerState.isLoaded())
-				return false;
+			if (rasterizerState != nullptr)
+				dependencies.push_back(rasterizerState);
 
 
 			HDepthStencilState depthStencilState = pass->getDepthStencilState();
 			HDepthStencilState depthStencilState = pass->getDepthStencilState();
-			if (depthStencilState != nullptr && !depthStencilState.isLoaded())
-				return false;
+			if (depthStencilState != nullptr)
+				dependencies.push_back(depthStencilState);
 		}
 		}
-
-		return true;
 	}
 	}
 
 
 	void Shader::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)
 	void Shader::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)

+ 1 - 1
BansheeEngine/Include/BsRenderableHandler.h

@@ -236,7 +236,7 @@ namespace BansheeEngine
 		/**
 		/**
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 * @copydoc	IResourceListener::getResourceDependencies
 		 */
 		 */
-		void getResourceDependencies(Vector<HResource>& resources);
+		void getListenerResources(Vector<HResource>& resources);
 
 
 		/**
 		/**
 		 * @copydoc IResourceListener::notifyResourceLoaded
 		 * @copydoc IResourceListener::notifyResourceLoaded

+ 2 - 2
BansheeEngine/Include/BsSpriteTexture.h

@@ -65,9 +65,9 @@ namespace BansheeEngine
 		SpriteTexture(const Vector2& uvOffset, const Vector2& uvScale, const HTexture& texture);
 		SpriteTexture(const Vector2& uvOffset, const Vector2& uvScale, const HTexture& texture);
 
 
 		/**
 		/**
-		 * @copydoc	Resource::areDependenciesLoaded
+		 * @copydoc	Resource::getResourceDependencies
 		 */
 		 */
-		bool areDependenciesLoaded() const;
+		void getResourceDependencies(Vector<HResource>& dependencies) const;
 
 
 		/**
 		/**
 		 * @copydoc	CoreObject::getCoreDependencies
 		 * @copydoc	CoreObject::getCoreDependencies

+ 2 - 2
BansheeEngine/Source/BsRenderableHandler.cpp

@@ -218,7 +218,7 @@ namespace BansheeEngine
 
 
 	void RenderableHandler::_markResourcesDirty()
 	void RenderableHandler::_markResourcesDirty()
 	{
 	{
-		markResourcesDirty();
+		markListenerResourcesDirty();
 	}
 	}
 
 
 	CoreSyncData RenderableHandler::syncToCore(FrameAlloc* allocator)
 	CoreSyncData RenderableHandler::syncToCore(FrameAlloc* allocator)
@@ -275,7 +275,7 @@ namespace BansheeEngine
 		}
 		}
 	}
 	}
 
 
-	void RenderableHandler::getResourceDependencies(Vector<HResource>& resources)
+	void RenderableHandler::getListenerResources(Vector<HResource>& resources)
 	{
 	{
 		if (mMesh != nullptr)
 		if (mMesh != nullptr)
 			resources.push_back(mMesh);
 			resources.push_back(mMesh);

+ 3 - 2
BansheeEngine/Source/BsSpriteTexture.cpp

@@ -43,9 +43,10 @@ namespace BansheeEngine
 		return Math::roundToInt(mAtlasTexture->getProperties().getHeight() * mUVScale.y);
 		return Math::roundToInt(mAtlasTexture->getProperties().getHeight() * mUVScale.y);
 	}
 	}
 
 
-	bool SpriteTexture::areDependenciesLoaded() const
+	void SpriteTexture::getResourceDependencies(Vector<HResource>& dependencies) const
 	{
 	{
-		return mAtlasTexture.isLoaded();
+		if (mAtlasTexture != nullptr)
+			dependencies.push_back(mAtlasTexture);
 	}
 	}
 
 
 	void SpriteTexture::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)
 	void SpriteTexture::getCoreDependencies(Vector<SPtr<CoreObject>>& dependencies)

+ 0 - 1
BansheeMono/Source/BsMonoManager.cpp

@@ -25,7 +25,6 @@ namespace BansheeEngine
 		mono_debug_init(MONO_DEBUG_FORMAT_MONO);
 		mono_debug_init(MONO_DEBUG_FORMAT_MONO);
 #endif
 #endif
 
 
-		
 		mono_config_parse(nullptr);
 		mono_config_parse(nullptr);
 
 
 		mRootDomain = mono_jit_init_version("BansheeMono", "v4.0.30319"); // TODO: Allow user-defined version here?
 		mRootDomain = mono_jit_init_version("BansheeMono", "v4.0.30319"); // TODO: Allow user-defined version here?

+ 1 - 0
SBansheeEngine/Include/BsScriptEnginePrerequisites.h

@@ -20,6 +20,7 @@
 
 
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
+	class ScriptObjectBase;
 	class ScriptResourceManager;
 	class ScriptResourceManager;
 	class ScriptResourceBase;
 	class ScriptResourceBase;
 	class ScriptFont;
 	class ScriptFont;

+ 0 - 1
SBansheeEngine/Include/BsScriptHString.h

@@ -21,7 +21,6 @@ namespace BansheeEngine
 
 
 		ScriptHString(MonoObject* instance, const HString& string);
 		ScriptHString(MonoObject* instance, const HString& string);
 
 
-		GUIArea* mArea;
 		HString mString;
 		HString mString;
 	};
 	};
 }
 }

+ 2 - 0
SBansheeEngine/SBansheeEngine.vcxproj

@@ -284,6 +284,7 @@
     <ClInclude Include="Include\BsScriptManagedResource.h" />
     <ClInclude Include="Include\BsScriptManagedResource.h" />
     <ClInclude Include="Include\BsScriptObject.h" />
     <ClInclude Include="Include\BsScriptObject.h" />
     <ClInclude Include="Include\BsScriptObjectImpl.h" />
     <ClInclude Include="Include\BsScriptObjectImpl.h" />
+    <ClInclude Include="Include\BsScriptObjectManager.h" />
     <ClInclude Include="Include\BsScriptPixelData.h" />
     <ClInclude Include="Include\BsScriptPixelData.h" />
     <ClInclude Include="Include\BsScriptPixelUtility.h" />
     <ClInclude Include="Include\BsScriptPixelUtility.h" />
     <ClInclude Include="Include\BsScriptRenderTarget.h" />
     <ClInclude Include="Include\BsScriptRenderTarget.h" />
@@ -352,6 +353,7 @@
     <ClCompile Include="Source\BsScriptManagedResource.cpp" />
     <ClCompile Include="Source\BsScriptManagedResource.cpp" />
     <ClCompile Include="Source\BsScriptObject.cpp" />
     <ClCompile Include="Source\BsScriptObject.cpp" />
     <ClCompile Include="Source\BsScriptObjectImpl.cpp" />
     <ClCompile Include="Source\BsScriptObjectImpl.cpp" />
+    <ClCompile Include="Source\BsScriptObjectManager.cpp" />
     <ClCompile Include="Source\BsScriptPixelData.cpp" />
     <ClCompile Include="Source\BsScriptPixelData.cpp" />
     <ClCompile Include="Source\BsScriptPixelUtility.cpp" />
     <ClCompile Include="Source\BsScriptPixelUtility.cpp" />
     <ClCompile Include="Source\BsScriptRenderTarget.cpp" />
     <ClCompile Include="Source\BsScriptRenderTarget.cpp" />

+ 6 - 0
SBansheeEngine/SBansheeEngine.vcxproj.filters

@@ -273,6 +273,9 @@
     <ClInclude Include="Include\BsScriptCameraHandler.h">
     <ClInclude Include="Include\BsScriptCameraHandler.h">
       <Filter>Header Files</Filter>
       <Filter>Header Files</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="Include\BsScriptObjectManager.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
@@ -479,5 +482,8 @@
     <ClCompile Include="Source\BsScriptCameraHandler.cpp">
     <ClCompile Include="Source\BsScriptCameraHandler.cpp">
       <Filter>Source Files</Filter>
       <Filter>Source Files</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="Source\BsScriptObjectManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   </ItemGroup>
 </Project>
 </Project>

+ 3 - 2
TODO.txt

@@ -2,11 +2,12 @@
 
 
 See GDrive/Resources doc for resources refactor
 See GDrive/Resources doc for resources refactor
 
 
-Shutting down causes an exception as Technique tries to access RendererManager on unload
-
 I can get mono errors by checking g_print calls in goutput.c
 I can get mono errors by checking g_print calls in goutput.c
  - Calling thunks incorrectly can cause those weird errors with no real callstack
  - Calling thunks incorrectly can cause those weird errors with no real callstack
 
 
+Crash on GLTextureBuffer::download on shutdown (OpenGL error invalid enum)
+Create a stack allocatable custom vector implementation and make getResourceDependencies and getCoreDependencies use it
+
 Multi-resource saving:
 Multi-resource saving:
  - Modify Font so it doesn't contain a texture, but instead keeps a handle to it
  - Modify Font so it doesn't contain a texture, but instead keeps a handle to it
  - Register it in its meta file
  - Register it in its meta file