From bdac9286eea73b8309ecf60ef8f658da65feb18e Mon Sep 17 00:00:00 2001 From: Areloch Date: Sun, 15 Oct 2017 03:49:18 -0500 Subject: [PATCH] Enables setting the forward vector of a Scene Object --- Engine/source/scene/sceneObject.cpp | 65 +++++++++++++++++++++++++++++ Engine/source/scene/sceneObject.h | 3 ++ 2 files changed, 68 insertions(+) diff --git a/Engine/source/scene/sceneObject.cpp b/Engine/source/scene/sceneObject.cpp index 550ee80b4..f2f7963a0 100644 --- a/Engine/source/scene/sceneObject.cpp +++ b/Engine/source/scene/sceneObject.cpp @@ -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); +} \ No newline at end of file diff --git a/Engine/source/scene/sceneObject.h b/Engine/source/scene/sceneObject.h index bf04ea4c4..549246c9e 100644 --- a/Engine/source/scene/sceneObject.h +++ b/Engine/source/scene/sceneObject.h @@ -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);