summaryrefslogtreecommitdiffstats
path: root/src/VoronoiMap.h
blob: eeece05d34a0acdb11128984d64fd5b6d86d5343 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

// VoronoiMap.h

// Declares the cVoronoiMap class that implements a Voronoi algorithm over a noise to produce a map





#pragma once

#include "Noise/Noise.h"





class cVoronoiMap
{
  public:
	cVoronoiMap(int a_Seed, int a_CellSize = 128, int a_JitterSize = 128);

	/** Sets both the cell size and jitter size used for generating the Voronoi seeds. */
	void SetCellSize(int a_CellSize);

	/** Sets the jitter size. Clamps it to current cell size. */
	void SetJitterSize(int a_JitterSize);

	/** Sets the offset that is added to each odd row of cells.
	This offset makes the voronoi cells align to a non-grid.
	Clamps the value to [-m_CellSize, +m_CellSize]. */
	void SetOddRowOffset(int a_OddRowOffset);

	/** Returns the value in the cell into which the specified point lies. */
	int GetValueAt(int a_X, int a_Y);

	/** Returns the value in the cell into which the specified point lies,
	and the distance to the nearest Voronoi seed. */
	int GetValueAt(int a_X, int a_Y, int & a_MinDistance);

	/** Returns the value in the cell into which the specified point lies,
	and the distances to the 2 nearest Voronoi seeds. Uses a cache. */
	int GetValueAt(
		int a_X,
		int a_Y,  // Coords to query
		int & a_NearestSeedX,
		int & a_NearestSeedY,  // Coords of the closest cell's seed
		int & a_MinDist2  // Distance to the second closest cell's seed
	);

	/** Finds the nearest and second nearest seeds, returns their coords. */
	void FindNearestSeeds(
		int a_X,
		int a_Y,
		int & a_NearestSeedX,
		int & a_NearestSeedY,
		int & a_SecondNearestSeedX,
		int & a_SecondNearestSeedY
	);

  protected:
	/** The noise used for generating Voronoi seeds */
	cNoise m_Noise1;
	cNoise m_Noise2;
	cNoise m_Noise3;

	/** Size of the Voronoi cells (avg X / Y distance between the seeds). Expected to be at least 2. */
	int m_CellSize;

	/** The amount that the cell seeds may be offset from the grid.
	Expected to be at least 1 and less than m_CellSize. */
	int m_JitterSize;

	/** The constant amount that the cell seeds of every odd row will be offset from the grid.
	This allows us to have non-rectangular grids.
	Expected to be between -m_CellSize and +m_CellSize. */
	int m_OddRowOffset;

	/** The X coordinate of the currently cached cell neighborhood */
	int m_CurrentCellX;

	/** The Z coordinate of the currently cached cell neighborhood */
	int m_CurrentCellZ;

	/** The seeds of cells around m_CurrentCellX, m_CurrentCellZ, X-coords */
	int m_SeedX[5][5];

	/** The seeds of cells around m_CurrentCellX, m_CurrentCellZ, X-coords */
	int m_SeedZ[5][5];


	/** Updates the cached cell seeds to match the specified cell. Noop if cell pos already matches.
	Updates m_SeedX and m_SeedZ. */
	void UpdateCell(int a_CellX, int a_CellZ);
};