Axiom.SceneManagers.PortalConnected.Portal.updateDerivedValues C# (CSharp) Method

updateDerivedValues() public method

public updateDerivedValues ( ) : void
return void
		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;
				}
			}
		}