summaryrefslogtreecommitdiffstats
path: root/Tools/QtBiomeVisualiser/ChunkCache.h
blob: 8d198f02fef45ad20bcce93b36eaad389df2097a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#pragma once

#include <QObject>
#include <QCache>
#include <QMutex>
#include <memory>





class Chunk;
typedef std::shared_ptr<Chunk> ChunkPtr;

class ChunkSource;





/** Caches chunk data for reuse */
class ChunkCache :
	public QObject
{
	typedef QObject super;
	Q_OBJECT

public:
	explicit ChunkCache(QObject * parent = NULL);

	/** Retrieves the specified chunk from the cache.
	Only returns valid chunks; if the chunk is invalid, queues it for rendering and returns an empty ptr. */
	ChunkPtr fetch(int a_ChunkX, int a_ChunkZ);

	/** 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 chunkAvailable(int a_ChunkX, int a_ChunkZ);

protected slots:
	void gotChunk(int a_ChunkX, int a_ChunkZ);

protected:
	/** The cache of the chunks */
	QCache<quint32, ChunkPtr> m_Cache;

	/** Locks te 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 getChunkHash(int a_ChunkX, int a_ChunkZ);

	/** Queues the specified chunk for rendering by m_ChunkSource. */
	void queueChunkRender(int a_ChunkX, int a_ChunkZ, ChunkPtr & a_Chunk);
};