|
@@ -214,8 +214,26 @@ void Frustum::setNearFarDist( F32 nearDist, F32 farDist )
|
|
|
return;
|
|
|
|
|
|
// Recalculate the frustum.
|
|
|
- MatrixF xfm( mTransform );
|
|
|
- set( mIsOrtho, getFov(), getAspectRatio(), nearDist, farDist, xfm );
|
|
|
+ MatrixF xfm( mTransform );
|
|
|
+
|
|
|
+ const F32 CENTER_EPSILON = 0.01;
|
|
|
+ F32 centerX = mNearLeft + (mNearRight - mNearLeft) * 0.5;
|
|
|
+ F32 centerY = mNearBottom + (mNearTop - mNearBottom) * 0.5;
|
|
|
+ if ((centerX > CENTER_EPSILON || centerX < -CENTER_EPSILON) || (centerY > CENTER_EPSILON || centerY < -CENTER_EPSILON) )
|
|
|
+ {
|
|
|
+ // Off-center projection, so re-calc use the new distances
|
|
|
+ FovPort expectedFovPort;
|
|
|
+ expectedFovPort.leftTan = -(mNearLeft / mNearDist);
|
|
|
+ expectedFovPort.rightTan = (mNearRight / mNearDist);
|
|
|
+ expectedFovPort.upTan = (mNearTop / mNearDist);
|
|
|
+ expectedFovPort.downTan = -(mNearBottom / mNearDist);
|
|
|
+ MathUtils::makeFovPortFrustum(this, mIsOrtho, nearDist, farDist, expectedFovPort);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Projection is not off-center, use the normal code
|
|
|
+ set(mIsOrtho, getFov(), getAspectRatio(), nearDist, farDist, xfm);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|