2022-09-25 23:05:56 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "xe_model.hpp"
|
|
|
|
#include "PerlinNoise.hpp"
|
|
|
|
|
|
|
|
#include <glm/common.hpp>
|
|
|
|
#include <glm/fwd.hpp>
|
|
|
|
#include <vector>
|
|
|
|
#include <thread>
|
|
|
|
#include <memory>
|
|
|
|
#include <string>
|
|
|
|
#include <map>
|
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
#define INVALID 0
|
|
|
|
#define AIR 1
|
|
|
|
#define DIRT 2
|
2022-09-26 18:08:40 +00:00
|
|
|
#define GRASS 3
|
2022-09-25 23:05:56 +00:00
|
|
|
|
|
|
|
namespace app {
|
|
|
|
|
|
|
|
class Chunk {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
static Chunk* newChunk(int32_t gridX, int32_t gridZ, uint32_t world_seed);
|
2022-09-25 23:05:56 +00:00
|
|
|
static void reset();
|
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
Chunk(int32_t gridX, int32_t gridZ, uint32_t world_seed);
|
2022-09-25 23:05:56 +00:00
|
|
|
~Chunk() {};
|
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
const int32_t gridX, gridZ;
|
|
|
|
const uint32_t world_seed, chunk_seed;
|
2022-09-25 23:05:56 +00:00
|
|
|
|
|
|
|
void createMesh();
|
|
|
|
void createMeshAsync();
|
|
|
|
std::shared_ptr<xe::Model> getMesh();
|
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
uint8_t getBlock(int32_t x, int32_t y, int32_t z);
|
|
|
|
void setBlock(int32_t x, int32_t y, int32_t z, uint8_t block);
|
2022-09-25 23:05:56 +00:00
|
|
|
|
2022-09-26 17:24:16 +00:00
|
|
|
static Chunk* getChunk(int32_t x, int32_t z);
|
2022-09-25 23:05:56 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
void generate();
|
2022-09-26 17:24:16 +00:00
|
|
|
void addVerticies(uint8_t side, int32_t x, int32_t y, int32_t z);
|
2022-09-25 23:05:56 +00:00
|
|
|
|
|
|
|
bool reloadRequired{false};
|
|
|
|
bool working{false};
|
|
|
|
|
|
|
|
std::shared_ptr<xe::Model> chunkMesh;
|
|
|
|
std::vector<float> vertexData;
|
|
|
|
std::vector<uint8_t> blocks;
|
|
|
|
std::thread worker;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
const float px[36][3] = {
|
|
|
|
// POS X
|
|
|
|
{0.5f,0.5f,0.5f},
|
|
|
|
{0.5f,-0.5f,0.5f},
|
|
|
|
{0.5f,-0.5f,-0.5f},
|
|
|
|
{0.5f,-0.5f,-0.5f},
|
|
|
|
{0.5f,0.5f,-0.5f},
|
|
|
|
{0.5f,0.5f,0.5f},
|
|
|
|
// NEG X
|
|
|
|
{-0.5f,0.5f,-0.5f},
|
|
|
|
{-0.5f,-0.5f,-0.5f},
|
|
|
|
{-0.5f,-0.5f,0.5f},
|
|
|
|
{-0.5f,-0.5f,0.5f},
|
|
|
|
{-0.5f,0.5f,0.5f},
|
|
|
|
{-0.5f,0.5f,-0.5f},
|
|
|
|
// POS Y
|
|
|
|
{0.5f,0.5f,-0.5f},
|
|
|
|
{-0.5f,0.5f,-0.5f},
|
|
|
|
{-0.5f,0.5f,0.5f},
|
|
|
|
{-0.5f,0.5f,0.5f},
|
|
|
|
{0.5f,0.5f,0.5f},
|
|
|
|
{0.5f,0.5f,-0.5f},
|
|
|
|
// NEG Y
|
|
|
|
{-0.5f,-0.5f,0.5f},
|
|
|
|
{-0.5f,-0.5f,-0.5f},
|
|
|
|
{0.5f,-0.5f,-0.5f},
|
|
|
|
{0.5f,-0.5f,-0.5f},
|
|
|
|
{0.5f,-0.5f,0.5f},
|
|
|
|
{-0.5f,-0.5f,0.5f},
|
|
|
|
// POS Z
|
|
|
|
{-0.5f,0.5f,0.5f},
|
|
|
|
{-0.5f,-0.5f,0.5f},
|
|
|
|
{0.5f,-0.5f,0.5f},
|
|
|
|
{0.5f,-0.5f,0.5f},
|
|
|
|
{0.5f,0.5f,0.5f},
|
|
|
|
{-0.5f,0.5f,0.5f},
|
|
|
|
// NEG Z
|
|
|
|
{0.5f,0.5f,-0.5f},
|
|
|
|
{0.5f,-0.5f,-0.5f},
|
|
|
|
{-0.5f,-0.5f,-0.5f},
|
|
|
|
{-0.5f,-0.5f,-0.5f},
|
|
|
|
{-0.5f,0.5f,-0.5f},
|
|
|
|
{0.5f,0.5f,-0.5f}
|
|
|
|
};
|
|
|
|
|
|
|
|
const float nm[6][3] = {
|
|
|
|
{1.f,0.f,0.f},
|
|
|
|
{-1.f,0.f,0.f},
|
|
|
|
{0.f,1.f,0.f},
|
|
|
|
{0.f,-1.f,0.f},
|
|
|
|
{0.f,0.f,1.f},
|
|
|
|
{0.f,0.f,-1.f}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const float uv[6][2] = {
|
2022-09-26 18:08:40 +00:00
|
|
|
{1.f,0.f},
|
2022-09-26 03:08:03 +00:00
|
|
|
{1.f,1.f},
|
2022-09-25 23:05:56 +00:00
|
|
|
{0.f,1.f},
|
2022-09-26 18:08:40 +00:00
|
|
|
{0.f,1.f},
|
2022-09-26 03:08:03 +00:00
|
|
|
{0.f,0.f},
|
2022-09-26 18:08:40 +00:00
|
|
|
{1.f,0.f}
|
2022-09-25 23:05:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|