summaryrefslogtreecommitdiffstats
path: root/Tools/QtBiomeVisualiser/RegionCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/QtBiomeVisualiser/RegionCache.h')
-rw-r--r--Tools/QtBiomeVisualiser/RegionCache.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/Tools/QtBiomeVisualiser/RegionCache.h b/Tools/QtBiomeVisualiser/RegionCache.h
new file mode 100644
index 000000000..c343e4ba9
--- /dev/null
+++ b/Tools/QtBiomeVisualiser/RegionCache.h
@@ -0,0 +1,73 @@
+#pragma once
+
+#include <QObject>
+#include <QCache>
+#include <QMutex>
+#include <memory>
+
+
+
+
+
+// fwd:
+class Region;
+typedef std::shared_ptr<Region> RegionPtr;
+
+class ChunkSource;
+
+
+
+
+
+/** Caches regions' chunk data for reuse */
+class RegionCache :
+ public QObject
+{
+ typedef QObject super;
+ Q_OBJECT
+
+public:
+ explicit RegionCache(QObject * parent = NULL);
+
+ /** Retrieves the specified region from the cache.
+ Only returns valid regions; if the region is invalid, queues it for rendering and returns an empty ptr. */
+ RegionPtr fetch(int a_RegionX, int a_RegionZ);
+
+ /** Replaces the chunk source used by the biome view to get the chunk biome data.
+ The cache is then invalidated. */
+ void setChunkSource(std::shared_ptr<ChunkSource> a_ChunkSource);
+
+ /** Returns true iff the chunk source has been initialized. */
+ bool hasData() const { return (m_ChunkSource.get() != nullptr); }
+
+ /** Reloads the current chunk source. */
+ void reload();
+
+signals:
+ void regionAvailable(int a_RegionX, int a_RegionZ);
+
+protected slots:
+ void gotRegion(int a_RegionX, int a_RegionZ);
+
+protected:
+ /** The cache of the chunks */
+ QCache<quint32, RegionPtr> m_Cache;
+
+ /** Locks the cache against multithreaded access */
+ QMutex m_Mtx;
+
+ /** The source used to get the biome data. */
+ std::shared_ptr<ChunkSource> m_ChunkSource;
+
+
+ /** Returns the hash used by the chunk in the cache */
+ quint32 getRegionHash(int a_RegionX, int a_RegionZ);
+
+ /** Queues the specified region for rendering by m_RegionSource. */
+ void queueRegionRender(int a_RegionX, int a_RegionZ, RegionPtr & a_Region);
+};
+
+
+
+
+