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;
}
}