Math/Box: Add ScaleAroundCenter
This commit is contained in:
parent
a6f4e7b08d
commit
741dc6b7e8
|
|
@ -64,6 +64,9 @@ namespace Nz
|
|||
Box& Scale(T scalar);
|
||||
Box& Scale(const Vector3<T>& vec);
|
||||
|
||||
Box& ScaleAroundCenter(T scalar);
|
||||
Box& ScaleAroundCenter(const Vector3<T>& vec);
|
||||
|
||||
std::string ToString() const;
|
||||
|
||||
Box& Transform(const Matrix4<T>& matrix, bool applyTranslation = true);
|
||||
|
|
|
|||
|
|
@ -545,6 +545,46 @@ namespace Nz
|
|||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Multiplies the lengths of this box with the scalar (the box center doesn't move)
|
||||
* \return A reference to this box where lengths are the product of these lengths and the scalar
|
||||
*
|
||||
* \param scalar The scalar to multiply width, height and depth with
|
||||
*/
|
||||
template<typename T>
|
||||
Box<T>& Box<T>::ScaleAroundCenter(T scalar)
|
||||
{
|
||||
x -= (width * scalar - width) / T(2.0);
|
||||
y -= (height * scalar - height) / T(2.0);
|
||||
z -= (depth * scalar - depth) / T(2.0);
|
||||
|
||||
width *= scalar;
|
||||
height *= scalar;
|
||||
depth *= scalar;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Multiplies the lengths of this box with the vector but changes the origin (the box center doesn't move)
|
||||
* \return A reference to this box where width, height and depth are the product of the old width, height and depth with the vec
|
||||
*
|
||||
* \param vec The vector where component one multiply width, two height and three depth
|
||||
*/
|
||||
template<typename T>
|
||||
Box<T>& Box<T>::ScaleAroundCenter(const Vector3<T>& vec)
|
||||
{
|
||||
x -= (width * vec.x - width) / T(2.0);
|
||||
y -= (height * vec.y - height) / T(2.0);
|
||||
z -= (depth * vec.z - depth) / T(2.0);
|
||||
|
||||
width *= vec.x;
|
||||
height *= vec.y;
|
||||
depth *= vec.z;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Gives a string representation
|
||||
|
|
|
|||
|
|
@ -89,6 +89,43 @@ SCENARIO("Box", "[MATH][BOX]")
|
|||
REQUIRE(Nz::Boxf::Lerp(nullBox, centerAndUnit, 0.5f) == result);
|
||||
}
|
||||
}
|
||||
|
||||
WHEN("We scale the boxes")
|
||||
{
|
||||
WHEN("We scale uniformly")
|
||||
{
|
||||
firstCenterAndUnit.Scale(2.f);
|
||||
CHECK(firstCenterAndUnit.GetCenter() == Nz::Vector3f::Unit());
|
||||
CHECK(firstCenterAndUnit.GetLengths() == 2.f * Nz::Vector3f::Unit());
|
||||
}
|
||||
|
||||
WHEN("We scale non-uniformly")
|
||||
{
|
||||
firstCenterAndUnit.Scale({ 2.f, 1.f, 0.01f });
|
||||
CHECK(firstCenterAndUnit.GetCenter() == Nz::Vector3f(1.f, 0.5f, 0.005f));
|
||||
CHECK(firstCenterAndUnit.GetLengths() == Nz::Vector3f(2.f, 1.f, 0.01f));
|
||||
}
|
||||
|
||||
WHEN("We scale uniformly around center")
|
||||
{
|
||||
Nz::Vector3f center = firstCenterAndUnit.GetCenter();
|
||||
|
||||
firstCenterAndUnit.ScaleAroundCenter(2.f);
|
||||
|
||||
CHECK(firstCenterAndUnit.GetCenter() == center);
|
||||
CHECK(firstCenterAndUnit.GetLengths() == 2.f * Nz::Vector3f::Unit());
|
||||
}
|
||||
|
||||
WHEN("We scale non-uniformly around center")
|
||||
{
|
||||
Nz::Vector3f center = firstCenterAndUnit.GetCenter();
|
||||
|
||||
firstCenterAndUnit.ScaleAroundCenter({ 2.f, 1.f, 0.01f });
|
||||
|
||||
CHECK(firstCenterAndUnit.GetCenter() == center);
|
||||
CHECK(firstCenterAndUnit.GetLengths() == Nz::Vector3f(2.f, 1.f, 0.01f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GIVEN("Two wrong box (negative width, height and depth")
|
||||
|
|
|
|||
Loading…
Reference in New Issue