|
@@ -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);
|
|
|
+}
|