public void updateDerivedValues()
{
// make sure local values are up to date
if ( !mLocalsUpToDate )
{
calcDirectionAndRadius();
}
int numCorners = 4;
if ( mType == PORTAL_TYPE.PORTAL_TYPE_AABB )
numCorners = 2;
else if ( mType == PORTAL_TYPE.PORTAL_TYPE_SPHERE )
numCorners = 2;
// calculate derived values
if ( null != mNode )
{
if ( prevWorldTransform != mNode.FullTransform )
{
if ( null != mCurrentHomeZone )
{
// inform home zone that a portal has been updated
mCurrentHomeZone.PortalsUpdated = true;
}
// save world transform
Matrix4 transform = mNode.FullTransform;
Matrix3 rotation;
// save off the current DerivedCP
mPrevDerivedCP = mDerivedCP;
mDerivedCP = transform * mLocalCP;
mDerivedSphere.Center = mDerivedCP;
switch ( mType )
{
case PORTAL_TYPE.PORTAL_TYPE_QUAD:
for ( int i = 0; i < numCorners; i++ )
{
mDerivedCorners[ i ] = transform * mCorners[ i ];
}
rotation = transform.ExtractRotation();
mDerivedDirection = rotation * mDirection;
break;
case PORTAL_TYPE.PORTAL_TYPE_AABB:
{
AxisAlignedBox aabb;// = new AxisAlignedBox(mCorners[0], mCorners[1]);
//aabb.SetExtents(mCorners[0], mCorners[1]);
aabb = mNode.WorldAABB;
//aabb.transform(mNode->_getFullTransform());
mDerivedCorners[ 0 ] = aabb.Minimum;
mDerivedCorners[ 1 ] = aabb.Maximum;
mDerivedDirection = mDirection;
}
break;
case PORTAL_TYPE.PORTAL_TYPE_SPHERE:
{
mDerivedCorners[ 0 ] = mDerivedCP;
mDerivedCorners[ 1 ] = transform * mCorners[ 1 ];
mDerivedDirection = mDirection;
}
break;
}
if ( prevWorldTransform != Matrix4.Zero )
{
// save previous calc'd plane
mPrevDerivedPlane = mDerivedPlane;
// calc new plane
mDerivedPlane = new Plane( mDerivedDirection, mDerivedCP );
// only update prevWorldTransform if did not move
// we need to add this conditional to ensure that
// the portal fully updates when it changes position.
if ( mPrevDerivedPlane == mDerivedPlane &&
mPrevDerivedCP == mDerivedCP )
{
prevWorldTransform = transform;
}
mPrevDerivedCP = mDerivedCP;
}
else
{
// calc new plane
mDerivedPlane = new Plane( mDerivedDirection, mDerivedCP );
// this is first time, so there is no previous, so prev = current.
mPrevDerivedPlane = mDerivedPlane;
mPrevDerivedCP = mDerivedCP;
prevWorldTransform = Matrix4.Identity;
prevWorldTransform = transform;
}
}
}
else // no associated node, so just use the local values as derived values
{
if ( prevWorldTransform != Matrix4.Zero )
{
// save off the current DerivedCP
mPrevDerivedCP = mDerivedCP;
mDerivedCP = mLocalCP;
mDerivedSphere.Center = mDerivedCP;
for ( int i = 0; i < numCorners; i++ )
{
mDerivedCorners[ i ] = mCorners[ i ];
}
mDerivedDirection = mDirection;
// save previous calc'd plane
mPrevDerivedPlane = mDerivedPlane;
// calc new plane
mDerivedPlane = new Plane( mDerivedDirection, mDerivedCP );
}
else
{
if ( null != mCurrentHomeZone )
{
// this case should only happen once
mCurrentHomeZone.PortalsUpdated = true;
}
// this is the first time the derived CP has been calculated, so there
// is no "previous" value, so set previous = current.
mDerivedCP = mLocalCP;
mPrevDerivedCP = mDerivedCP;
mDerivedSphere.Center = mDerivedCP;
for ( int i = 0; i < numCorners; i++ )
{
mDerivedCorners[ i ] = mCorners[ i ];
}
mDerivedDirection = mDirection;
// calc new plane
mDerivedPlane = new Plane( mDerivedDirection, mDerivedCP );
// this is first time, so there is no previous, so prev = current.
mPrevDerivedPlane = mDerivedPlane;
// flag as initialized
prevWorldTransform = Matrix4.Identity;
}
}
}