mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-13 11:43:49 +00:00
Enables setting the forward vector of a Scene Object
This commit is contained in:
parent
6479c7592a
commit
bdac9286ee
2 changed files with 68 additions and 0 deletions
|
|
@ -433,6 +433,64 @@ void SceneObject::setScale( const VectorF &scale )
|
|||
setMaskBits( ScaleMask );
|
||||
}
|
||||
|
||||
void SceneObject::setForwardVector(VectorF newForward, VectorF upVector)
|
||||
{
|
||||
MatrixF mat = getTransform();
|
||||
|
||||
VectorF up(0.0f, 0.0f, 1.0f);
|
||||
VectorF axisX;
|
||||
VectorF axisY = newForward;
|
||||
VectorF axisZ;
|
||||
|
||||
if (upVector != VectorF::Zero)
|
||||
up = upVector;
|
||||
|
||||
// Validate and normalize input:
|
||||
F32 lenSq;
|
||||
lenSq = axisY.lenSquared();
|
||||
if (lenSq < 0.000001f)
|
||||
{
|
||||
axisY.set(0.0f, 1.0f, 0.0f);
|
||||
Con::errorf("SceneObject::setForwardVector() - degenerate forward vector");
|
||||
}
|
||||
else
|
||||
{
|
||||
axisY /= mSqrt(lenSq);
|
||||
}
|
||||
|
||||
|
||||
lenSq = up.lenSquared();
|
||||
if (lenSq < 0.000001f)
|
||||
{
|
||||
up.set(0.0f, 0.0f, 1.0f);
|
||||
Con::errorf("SceneObject::setForwardVector() - degenerate up vector - too small");
|
||||
}
|
||||
else
|
||||
{
|
||||
up /= mSqrt(lenSq);
|
||||
}
|
||||
|
||||
if (fabsf(mDot(up, axisY)) > 0.9999f)
|
||||
{
|
||||
Con::errorf("SceneObject::setForwardVector() - degenerate up vector - same as forward");
|
||||
// I haven't really tested this, but i think it generates something which should be not parallel to the previous vector:
|
||||
F32 tmp = up.x;
|
||||
up.x = -up.y;
|
||||
up.y = up.z;
|
||||
up.z = tmp;
|
||||
}
|
||||
|
||||
// construct the remaining axes:
|
||||
mCross(axisY, up, &axisX);
|
||||
mCross(axisX, axisY, &axisZ);
|
||||
|
||||
mat.setColumn(0, axisX);
|
||||
mat.setColumn(1, axisY);
|
||||
mat.setColumn(2, axisZ);
|
||||
|
||||
setTransform(mat);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void SceneObject::resetWorldBox()
|
||||
|
|
@ -1458,3 +1516,10 @@ DefineEngineMethod( SceneObject, isGlobalBounds, bool, (),,
|
|||
{
|
||||
return object->isGlobalBounds();
|
||||
}
|
||||
|
||||
DefineConsoleMethod(SceneObject, setForwardVector, void, (VectorF newForward, VectorF upVector), (VectorF(0, 0, 0), VectorF(0, 0, 1)),
|
||||
"Get the number of static fields on the object.\n"
|
||||
"@return The number of static fields defined on the object.")
|
||||
{
|
||||
object->setForwardVector(newForward, upVector);
|
||||
}
|
||||
|
|
@ -504,6 +504,9 @@ class SceneObject : public NetObject, private SceneContainer::Link, public Proce
|
|||
/// @param scale Scaling values
|
||||
virtual void setScale( const VectorF &scale );
|
||||
|
||||
/// Sets the forward vector of the object
|
||||
void setForwardVector(VectorF newForward, VectorF upVector = VectorF(0, 0, 1));
|
||||
|
||||
/// This sets the render transform for this object
|
||||
/// @param mat New render transform
|
||||
virtual void setRenderTransform(const MatrixF &mat);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue