#pragma once

#include <GL/glew.h>

// How many Geography grids are created
constexpr unsigned int kGeographyCountShort{1 << 2};
constexpr unsigned int kGeographyCountLong{kGeographyCountShort << 0};

// Size of each Geography grid
constexpr std::size_t kGeographyShort{1 << 8};
constexpr std::size_t kGeographyLong{kGeographyShort << 0};
constexpr float kHeightMultiplier{kGeographyShort * 0.25};

// Controls the generated layers of Perlin noise
constexpr auto kDetail{kGeographyShort >> 0};
constexpr std::size_t kMinDetail{1 << 3};

// The maximum number of threads to use
constexpr size_t kMaxThreads{4};

// Detail of the shadow maps generated by point lights
constexpr GLsizei kShadowMapSize{1 << 13};

// Camera properties
constexpr float kNearPlane{0.1};
constexpr float kFarPlane{kGeographyLong * kGeographyCountLong << 2};
constexpr float kFOV{45};

// Ideal program FPS
constexpr auto kFPS{60};

// Mouse sensitivity
constexpr auto kRotateDelta{.0025f};

// Move speed
constexpr auto kMoveDelta{kGeographyShort * 0.01f};

// Calculate the total number of vertices_ needed for the entire grid
constexpr std::size_t kTotalVertices{kGeographyShort * kGeographyLong};

// 2 drawTriangles_ * 3 vertices_ per triangle
constexpr std::size_t kVerticesPerCell{6};
// Calculate the total number of cells in the grid
constexpr std::size_t kTotalCells{(kGeographyShort - 1) * (kGeographyLong - 1)};
// Total number of EBO indices
constexpr std::size_t kTotalIndices{kTotalCells * kVerticesPerCell};
