Browse Source

SceneObject world transform is now constructed from individual TRS components
Renderable now provide a no-scale version of the world transform

BearishSun 10 years ago
parent
commit
14446f8f12

+ 4 - 4
BansheeCore/Source/BsSceneObject.cpp

@@ -431,8 +431,6 @@ namespace BansheeEngine
 	{
 		if(mParent != nullptr)
 		{
-			mCachedWorldTfrm = getLocalTfrm() * mParent->getWorldTfrm();
-
 			// Update orientation
 			const Quaternion& parentOrientation = mParent->getWorldRotation();
 			mWorldRotation = parentOrientation * mRotation;
@@ -448,14 +446,16 @@ namespace BansheeEngine
 
 			// Add altered position vector to parents
 			mWorldPosition += mParent->getWorldPosition();
+
+			mCachedWorldTfrm.setTRS(mWorldPosition, mWorldRotation, mWorldScale);
 		}
 		else
 		{
-			mCachedWorldTfrm = getLocalTfrm();
-
 			mWorldRotation = mRotation;
 			mWorldPosition = mPosition;
 			mWorldScale = mScale;
+
+			mCachedWorldTfrm = getLocalTfrm();
 		}
 
 		mDirtyFlags &= ~DirtyFlags::WorldTfrmDirty;

+ 3 - 2
BansheeEngine/Include/BsRenderable.h

@@ -86,7 +86,7 @@ namespace BansheeEngine
 		 * @brief	Sets the transform matrix that is applied to the object
 		 *			when its being rendered.
 		 */
-		void setTransform(const Matrix4& transform);
+		void setTransform(const Matrix4& transform, const Matrix4& transformNoScale);
 
 		/**
 		 * @brief	Sets the world position of the renderable.
@@ -127,7 +127,7 @@ namespace BansheeEngine
 		 *			when its being rendered. This transform matrix does not
 		 *			include scale values.
 		 */
-		Matrix4 getTransformNoScale() const { return mTransform; /* TODO - Not implemented. */ }
+		Matrix4 getTransformNoScale() const { return mTransformNoScale; }
 
 		/**
 		 * @brief	Gets whether the object should be rendered or not.
@@ -161,6 +161,7 @@ namespace BansheeEngine
 		Vector<AABox> mWorldBounds;
 		Vector3 mPosition;
 		Matrix4 mTransform;
+		Matrix4 mTransformNoScale;
 		bool mIsActive;
 	};
 

+ 3 - 1
BansheeEngine/Source/BsCRenderable.cpp

@@ -40,7 +40,9 @@ namespace BansheeEngine
 		UINT32 curHash = SO()->getTransformHash();
 		if (curHash != mInternal->_getLastModifiedHash())
 		{
-			mInternal->setTransform(SO()->getWorldTfrm());
+			Matrix4 transformNoScale = Matrix4::TRS(SO()->getWorldPosition(), SO()->getWorldRotation(), Vector3::ONE);
+
+			mInternal->setTransform(SO()->getWorldTfrm(), transformNoScale);
 			mInternal->_setLastModifiedHash(curHash);
 		}
 	}

+ 6 - 2
BansheeEngine/Source/BsRenderable.cpp

@@ -14,7 +14,7 @@ namespace BansheeEngine
 {
 	template<bool Core>
 	TRenderable<Core>::TRenderable()
-		:mLayer(1), mTransform(Matrix4::IDENTITY), mIsActive(true)
+		:mLayer(1), mTransform(Matrix4::IDENTITY), mTransformNoScale(Matrix4::IDENTITY), mIsActive(true)
 	{
 		mMaterials.resize(1);
 	}
@@ -93,9 +93,10 @@ namespace BansheeEngine
 	}
 
 	template<bool Core>
-	void TRenderable<Core>::setTransform(const Matrix4& transform)
+	void TRenderable<Core>::setTransform(const Matrix4& transform, const Matrix4& transformNoScale)
 	{
 		mTransform = transform;
+		mTransformNoScale = transformNoScale;
 		_markCoreDirty(RenderableDirtyFlag::Transform);
 	}
 
@@ -169,6 +170,7 @@ namespace BansheeEngine
 		dataPtr = rttiReadElem(mWorldBounds, dataPtr);
 		dataPtr = rttiReadElem(numMaterials, dataPtr);
 		dataPtr = rttiReadElem(mTransform, dataPtr);
+		dataPtr = rttiReadElem(mTransformNoScale, dataPtr);
 		dataPtr = rttiReadElem(mPosition, dataPtr);
 		dataPtr = rttiReadElem(mIsActive, dataPtr);
 		dataPtr = rttiReadElem(dirtyFlags, dataPtr);
@@ -271,6 +273,7 @@ namespace BansheeEngine
 			rttiGetElemSize(mWorldBounds) + 
 			rttiGetElemSize(numMaterials) + 
 			rttiGetElemSize(mTransform) +
+			rttiGetElemSize(mTransformNoScale) +
 			rttiGetElemSize(mPosition) +
 			rttiGetElemSize(mIsActive) +
 			rttiGetElemSize(getCoreDirtyFlags()) +
@@ -283,6 +286,7 @@ namespace BansheeEngine
 		dataPtr = rttiWriteElem(mWorldBounds, dataPtr);
 		dataPtr = rttiWriteElem(numMaterials, dataPtr);
 		dataPtr = rttiWriteElem(mTransform, dataPtr);
+		dataPtr = rttiWriteElem(mTransformNoScale, dataPtr);
 		dataPtr = rttiWriteElem(mPosition, dataPtr);
 		dataPtr = rttiWriteElem(mIsActive, dataPtr);
 		dataPtr = rttiWriteElem(getCoreDirtyFlags(), dataPtr);

+ 3 - 1
BansheeEngine/Source/BsSceneManager.cpp

@@ -49,7 +49,9 @@ namespace BansheeEngine
 			UINT32 curHash = so->getTransformHash();
 			if (curHash != handler->_getLastModifiedHash())
 			{
-				handler->setTransform(so->getWorldTfrm());
+				Matrix4 transformNoScale = Matrix4::TRS(so->getWorldPosition(), so->getWorldRotation(), Vector3::ONE);
+
+				handler->setTransform(so->getWorldTfrm(), transformNoScale);
 				handler->_setLastModifiedHash(curHash);
 			}
 

+ 2 - 1
SBansheeEngine/Source/BsScriptRenderable.cpp

@@ -42,7 +42,8 @@ namespace BansheeEngine
 		UINT32 curHash = parent->getTransformHash();
 		if (curHash != mLastUpdateHash)
 		{
-			mRenderable->setTransform(parent->getWorldTfrm());
+			Matrix4 transformNoScale = Matrix4::TRS(parent->getWorldPosition(), parent->getWorldRotation(), Vector3::ONE);
+			mRenderable->setTransform(parent->getWorldTfrm(), transformNoScale);
 
 			mLastUpdateHash = curHash;
 		}