80 lines
2.8 KiB
C
80 lines
2.8 KiB
C
#ifndef TERRAIN_H
|
|
#define TERRAIN_H
|
|
|
|
#define MAP_WIDTH 300
|
|
#define MAP_HEIGHT 125
|
|
#define NUM_TRIANGLES_0 6
|
|
#define NUM_TRIANGLES_SUB 4
|
|
#define NUM_TRIANGLE_VERTICES 3
|
|
#define LOD_0_SIZE 1.0f
|
|
#define LOD_0_SIZE_Y 0.4328799197461722f
|
|
//#define LOD_0_S 0.75f
|
|
|
|
//#define NUM_POINTS_05f 10
|
|
|
|
//#define NUM_POINTS_WIDTH (NUM_POINTS_05f * 3 * MAP_WIDTH*2)
|
|
|
|
//#define NUM_POINTS_HEIGHT (NUM_POINTS_05f * MAP_HEIGHT)
|
|
|
|
#define NUM_TRIANGLES NUM_TRIANGLES_0*NUM_TRIANGLES_SUB * NUM_TRIANGLES_SUB
|
|
|
|
#define PI 3.14159265359f
|
|
|
|
#include <QVector2D>
|
|
|
|
struct TerrainPoint {
|
|
unsigned char height;
|
|
unsigned char type;
|
|
unsigned char river;
|
|
};
|
|
|
|
// Returns the 6 edge midpoints in local tile coordinates (radius = 0.5)
|
|
inline QVector2D getHexEdgeMidpoint(int edge) {
|
|
static const QVector2D midpoints[6] = {
|
|
QVector2D(-0.375f, 0.21650635f), // Edge 0 (Top-Left)
|
|
QVector2D( 0.0f, 0.43301270f), // Edge 1 (Top)
|
|
QVector2D( 0.375f, 0.21650635f), // Edge 2 (Top-Right)
|
|
QVector2D( 0.375f, -0.21650635f), // Edge 3 (Bottom-Right)
|
|
QVector2D( 0.0f, -0.43301270f), // Edge 4 (Bottom)
|
|
QVector2D(-0.375f, -0.21650635f) // Edge 5 (Bottom-Left)
|
|
};
|
|
return midpoints[(edge % 6 + 6) % 6];
|
|
}
|
|
|
|
// Returns the two corner endpoints in local tile coordinates for a given edge (radius = 0.5)
|
|
inline void getHexEdgeEndpoints(int edge, QVector2D &p1, QVector2D &p2) {
|
|
static const QVector2D corners[6] = {
|
|
QVector2D(-0.25f, 0.43301270f), // 0: Top-Left
|
|
QVector2D( 0.25f, 0.43301270f), // 1: Top-Right
|
|
QVector2D( 0.5f, 0.0f), // 2: Right
|
|
QVector2D( 0.25f, -0.43301270f), // 3: Bottom-Right
|
|
QVector2D(-0.25f, -0.43301270f), // 4: Bottom-Left
|
|
QVector2D(-0.5f, 0.0f) // 5: Left
|
|
};
|
|
switch ((edge % 6 + 6) % 6) {
|
|
case 0: p1 = corners[5]; p2 = corners[0]; break;
|
|
case 1: p1 = corners[0]; p2 = corners[1]; break;
|
|
case 2: p1 = corners[1]; p2 = corners[2]; break;
|
|
case 3: p1 = corners[2]; p2 = corners[3]; break;
|
|
case 4: p1 = corners[3]; p2 = corners[4]; break;
|
|
case 5: p1 = corners[4]; p2 = corners[5]; break;
|
|
default: p1 = corners[0]; p2 = corners[1]; break;
|
|
}
|
|
}
|
|
|
|
// Returns the coordinates of the neighbor tile sharing the given edge
|
|
inline void getHexNeighbor(int x, int y, int edge, int &nx, int &ny) {
|
|
bool even = (x % 2 == 0);
|
|
switch ((edge % 6 + 6) % 6) {
|
|
case 0: nx = x - 1; ny = even ? y : y + 1; break;
|
|
case 1: nx = x; ny = y + 1; break;
|
|
case 2: nx = x + 1; ny = even ? y : y + 1; break;
|
|
case 3: nx = x + 1; ny = even ? y - 1 : y; break;
|
|
case 4: nx = x; ny = y - 1; break;
|
|
case 5: nx = x - 1; ny = even ? y - 1 : y; break;
|
|
default: nx = x; ny = y; break;
|
|
}
|
|
}
|
|
|
|
#endif // TERRAIN_H
|