content: package tim.prune.threedee;
  
  import tim.prune.DataStatus;
  import tim.prune.data.Track;
  
  /**
   * This abstract class acts as a singleton to store a single
   * terrain model (as a Track) for a given data status and terrain definition.
   * When the data or the definition changes, this track becomes invalid.
   */
  public abstract class TerrainCache
  {
  	/** The data status at the time this terrain was generated */
  	private static DataStatus _dataStatus = null;
  	/** The definition (grid size) for this terrain */
  	private static TerrainDefinition _terrainDef = null;
  	/** The generated grid of points with altitudes */
  	private static Track _terrainTrack = null;
  
  
  	/**
  	 * Get the stored terrain track if it's still valid
  	 * @param inCurrStatus current data status
  	 * @param inTerrainDef currently selected terrain definition
  	 * @return stored terrain track if it's valid, null otherwise
  	 */
  	public static Track getTerrainTrack(DataStatus inCurrStatus, TerrainDefinition inTerrainDef)
  	{
  		if (_dataStatus == null || _terrainDef == null || _terrainTrack == null)
  		{
  			return null; // nothing stored
  		}
  		if (inCurrStatus == null || inTerrainDef == null || !inTerrainDef.getUseTerrain())
  		{
  			return null; // nonsense requested
  		}
  		if (inCurrStatus.hasDataChanged(_dataStatus) || !inTerrainDef.equals(_terrainDef))
  		{
  			return null; // stored track is out of date
  		}
  		// we have a match
  		return _terrainTrack;
  	}
  
  	/**
  	 * Now that a terrain track has been generated, store it for possible reuse
  	 * @param inTrack terrain track to store
  	 * @param inCurrStatus current data status
  	 * @param inTerrainDef terrain definition
  	 */
  	public static void storeTerrainTrack(Track inTrack, DataStatus inCurrStatus, TerrainDefinition inTerrainDef)
  	{
  		_terrainTrack = inTrack;
  		_dataStatus = inCurrStatus;
  		_terrainDef = inTerrainDef;
  	}
  }
  