public void calcDirectionAndRadius()
{
Vector3 radiusVector;
Vector3 side1, side2;
switch ( mType )
{
default:
case PORTAL_TYPE.PORTAL_TYPE_QUAD:
// first calculate local direction
side1 = mCorners[ 1 ] - mCorners[ 0 ];
side2 = mCorners[ 2 ] - mCorners[ 0 ];
mDirection = side1.Cross( side2 );
mDirection.Normalize();
// calculate local cp
mLocalCP = Vector3.Zero;
for ( int i = 0; i < 4; i++ )
{
mLocalCP += mCorners[ i ];
}
mLocalCP *= 0.25f;
// then calculate radius
radiusVector = mCorners[ 0 ] - mLocalCP;
mRadius = radiusVector.Length;
break;
case PORTAL_TYPE.PORTAL_TYPE_AABB:
// "direction" is is either pointed inward or outward and is set by user, not calculated.
// calculate local cp
mLocalCP = Vector3.Zero;
for ( int i = 0; i < 2; i++ )
{
mLocalCP += mCorners[ i ];
}
mLocalCP *= 0.5f;
// for radius, use distance from corner to center point
// this gives the radius of a sphere that encapsulates the aabb
radiusVector = mCorners[ 0 ] - mLocalCP;
mRadius = radiusVector.Length;
break;
case PORTAL_TYPE.PORTAL_TYPE_SPHERE:
// "direction" is is either pointed inward or outward and is set by user, not calculated.
// local CP is same as corner point 0
mLocalCP = mCorners[ 0 ];
// since corner1 is point on sphere, radius is simply corner1 - center point
radiusVector = mCorners[ 1 ] - mLocalCP;
mRadius = radiusVector.Length;
break;
}
mDerivedSphere.Radius = mRadius;
// locals are now up to date
mLocalsUpToDate = true;
}