Przeglądaj źródła

Bugfix: Camera loaded from a saved scene will now properly be displayed in the Game view

BearishSun 8 lat temu
rodzic
commit
63ef0b05cf

+ 3 - 3
Source/BansheeCore/Components/BsCCamera.cpp

@@ -61,14 +61,14 @@ namespace bs
 			mInternal->initialize();
 		else
 			mInternal = Camera::create();
-
-		SPtr<RenderTarget> mainRT = CoreApplication::instance().getPrimaryWindow();
-		mInternal->getViewport()->setTarget(mainRT);
 	}
 
 	void CCamera::onInitialized()
 	{
 		gSceneManager()._bindActor(mInternal, SO());
+
+		// Make sure primary RT gets applied if camera gets deserialized with main camera state
+		gSceneManager()._notifyMainCameraStateChanged(mInternal);
 	}
 
 	void CCamera::onDestroyed()

+ 4 - 3
Source/BansheeCore/CoreThread/BsCoreObjectManager.cpp

@@ -315,10 +315,11 @@ namespace bs
 					for (auto& dependant : dependants)
 					{
 						if (!dependant->isCoreDirty())
-						{
-							dependant->mCoreDirtyFlags |= 0xFFFFFFFF; // To ensure the loop below doesn't skip it
 							dirtyDependants.insert(dependant);
-						}
+
+						// Note: This tells the object it was marked dirty due to a dependency, but it doesn't tell it
+						// due to which one. Eventually it might be nice to have that information as well.
+						dependant->mCoreDirtyFlags |= 0x80000000;
 					}
 				}
 			}

+ 1 - 1
Source/BansheeCore/Material/BsMaterial.cpp

@@ -438,7 +438,7 @@ namespace bs
 
 	CoreSyncData Material::syncToCore(FrameAlloc* allocator)
 	{
-		bool syncAllParams = getCoreDirtyFlags() == (UINT32)MaterialDirtyFlags::ResourceChanged;
+		bool syncAllParams = (getCoreDirtyFlags() & (UINT32)MaterialDirtyFlags::ResourceChanged) != 0;
 
 		UINT32 paramsSize = 0;
 		if (mParams != nullptr)

+ 1 - 0
Source/BansheeCore/RTTI/BsCameraRTTI.h

@@ -41,6 +41,7 @@ namespace bs
 			BS_RTTI_MEMBER_PLAIN(mBottom, 21)
 			BS_RTTI_MEMBER_PLAIN(mMSAA, 22)
 			BS_RTTI_MEMBER_REFLPTR(mRenderSettings, 23)
+			BS_RTTI_MEMBER_PLAIN(mMain, 24)
 		BS_END_RTTI_MEMBERS
 			
 	public:

+ 3 - 2
Source/BansheeCore/Renderer/BsCamera.h

@@ -25,8 +25,9 @@ namespace bs
 	/**	Signals which portion of a Camera is dirty. */
 	enum class CameraDirtyFlag
 	{
-		// First few bits reserved by ActorDiryFlag
-		RenderSettings = 1 << 4
+		// First few bits reserved by ActorDirtyFlag
+		RenderSettings = 1 << 4,
+		Viewport = 1 << 31
 	};
 
 	/** @} */

+ 5 - 1
Source/BansheeCore/Renderer/BsRenderable.cpp

@@ -613,7 +613,11 @@ namespace bs
 			dataPtr += sizeof(SPtr<Material>);
 		}
 
-		if((dirtyFlags & ((UINT32)ActorDirtyFlag::Everything | (UINT32)ActorDirtyFlag::Active)) != 0)
+		UINT32 updateEverythingFlag = (UINT32)ActorDirtyFlag::Everything 
+			| (UINT32)ActorDirtyFlag::Active 
+			| (UINT32)ActorDirtyFlag::Dependency;
+
+		if((dirtyFlags & updateEverythingFlag) != 0)
 		{
 			createAnimationBuffers();
 

+ 2 - 1
Source/BansheeCore/Scene/BsSceneActor.h

@@ -17,7 +17,8 @@ namespace bs
 		Transform	= 1 << 0,
 		Mobility	= 1 << 1,
 		Active		= 1 << 2,
-		Everything	= 1 << 3
+		Everything	= 1 << 3,
+		Dependency	= 1 << 31
 	};
 
 	/**

+ 5 - 1
Source/RenderBeast/BsRendererScene.cpp

@@ -52,7 +52,11 @@ namespace bs {	namespace ct
 		UINT32 cameraId = camera->getRendererId();
 		RendererView* view = mInfo.views[cameraId];
 
-		if((updateFlag & ((UINT32)ActorDirtyFlag::Everything | (UINT32)ActorDirtyFlag::Active)) != 0)
+		UINT32 updateEverythingFlag = (UINT32)ActorDirtyFlag::Everything 
+			| (UINT32)ActorDirtyFlag::Active 
+			| (UINT32)CameraDirtyFlag::Viewport;
+
+		if((updateFlag & updateEverythingFlag) != 0)
 		{
 			RENDERER_VIEW_DESC viewDesc = createViewDesc(camera);