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