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