diff --git a/src/renderer/camera.hpp b/src/renderer/camera.hpp index 3517ce5..acbe1a0 100644 --- a/src/renderer/camera.hpp +++ b/src/renderer/camera.hpp @@ -20,8 +20,10 @@ public: void MoveCamera(Uint8* state); // Mouse void HandleMouse(SDL_Event e); + // Mouse Delta void MouseMoved(glm::vec2 mouseDelta); + // Updatable by float MouseSensitivity = 0.1f; float CameraSpeed = 2.0f; diff --git a/src/world/chunk/chunk.cpp b/src/world/chunk/chunk.cpp index 1c06640..d46c902 100644 --- a/src/world/chunk/chunk.cpp +++ b/src/world/chunk/chunk.cpp @@ -53,7 +53,7 @@ Chunk::Chunk(int x, int z, std::shared_ptr terrainGenerator) { continue; } - if (pow(y / (float)CHUNK_HEIGHT, 1.1024f) + terrainGenerator->GetNoise(x + (Z * CHUNK_WIDTH), y, z + (X * CHUNK_DEPTH)) * 0.60f < 0.5f) { + if (pow((y / (float)CHUNK_HEIGHT), 1.1024f) + terrainGenerator->GetNoise(x + (Z * CHUNK_WIDTH), y, z + (X * CHUNK_DEPTH)) * 0.40f < 0.5f) { Voxels.push_back((uint8_t)EBlockType::Grass); continue; @@ -149,9 +149,23 @@ void Chunk::Load() { } +void Chunk::Unload() { + + m_vertices.clear(); + m_uvs.clear(); + + glBindVertexArray(m_vao); + + glDeleteBuffers(1, &m_vbo); + glDeleteVertexArrays(1, &m_vao); + + Loaded = false; + +} + void Chunk::UploadMesh() { - if (!MeshReady) + if (!MeshReady || !Loaded) return; glGenVertexArrays(1, &m_vao); @@ -187,7 +201,7 @@ void Chunk::UploadMesh() { void Chunk::Render(std::shared_ptr camera, std::shared_ptr shader) { - if (!Loaded) + if (!MeshReady || !Loaded) return; shader->Use(); @@ -276,4 +290,6 @@ void Chunk::m_mesh() { Chunk::~Chunk() { + Unload(); + } diff --git a/src/world/chunk/chunk.hpp b/src/world/chunk/chunk.hpp index 2588a2c..0422df7 100644 --- a/src/world/chunk/chunk.hpp +++ b/src/world/chunk/chunk.hpp @@ -23,6 +23,7 @@ public: Chunk(int x, int z, std::shared_ptr terrainGenerator); void Load(); + void Unload(); void UploadMesh(); bool MeshReady = false; diff --git a/src/world/world.cpp b/src/world/world.cpp index ef02b4a..fbc45c7 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -1,5 +1,8 @@ #include "world.hpp" +#include +#include + #include "chunk/chunk.hpp" #include "../renderer/shader.hpp" @@ -24,16 +27,17 @@ void World::LoadWorld() { m_noiseGenerator = std::make_shared(); m_noiseGenerator->SetSeed(rand()); - m_noiseGenerator->SetNoiseType(FastNoise::Perlin); + m_noiseGenerator->SetNoiseType(FastNoise::ValueFractal); - m_noiseGenerator->SetFractalOctaves(8); + m_noiseGenerator->SetFractalOctaves(5); - for (int x = -4; x < 50; x++) - for (int y = -50; y < 4; y++) { + // Generate a 54x54 chunk world + // for (int x = -4; x < 50; x++) + // for (int y = -50; y < 4; y++) { - m_chunkLoaderQueue.push({ x, y }); + // m_chunkLoaderQueue.push({ x, y }); - } + // } // Spawn generator threads for (int i = 0; i < 6; i++) { @@ -56,9 +60,17 @@ void World::SetTextureMap(GLuint map) { } -glm::vec2 World::GetChunkCoords(glm::vec3 wordCoords) { +glm::vec3 World::GetChunkCoords(glm::vec3 worldCoords) { - return { wordCoords.x / CHUNK_WIDTH, wordCoords.z / CHUNK_DEPTH }; + return { worldCoords.x / static_cast(CHUNK_WIDTH), + worldCoords.y / static_cast(CHUNK_HEIGHT), + worldCoords.z / static_cast(CHUNK_DEPTH) }; + +} + +glm::vec2 World::GetChunk(glm::vec3 worldCoords) { + + return { static_cast(worldCoords.x / CHUNK_WIDTH), static_cast(worldCoords.z / CHUNK_DEPTH) }; } @@ -71,12 +83,12 @@ std::vector> World::GetRenderableChunks() { // Should the chunk be rendererd ? if (chunk.second->ShouldRender) { - m_chunkMutex.lock(); + m_chunkLoderMutex.lock(); if (chunk.second->MeshReady) chunk.second->UploadMesh(); - m_chunkMutex.unlock(); + m_chunkLoderMutex.unlock(); // If not, add it chunks.push_back(chunk.second); @@ -91,6 +103,21 @@ std::vector> World::GetRenderableChunks() { void World::Update(std::shared_ptr player) { + glm::vec2 inChunk = GetChunk(player->Position); + + if (m_chunks.find(inChunk) == m_chunks.end()) { + + m_chunkLoderMutex.lock(); + + m_chunkLoaderQueue.push(inChunk); + + m_chunkLoderMutex.unlock(); + + } + + std::cout << "Position: " << player->Position.x << ":" << player->Position.y << ":" << player->Position.z << std::endl; + std::cout << "Chunk: " << inChunk.x << ":" << inChunk.y << std::endl << std::endl; + } void World::Render(std::shared_ptr player) { @@ -118,30 +145,36 @@ World::~World() { } + for (auto& chunk : m_chunks) { + + chunk.second->Unload(); + + } + } void World::m_loadChunks() { while (m_generatorRunning) { - m_chunkMutex.lock(); + m_chunkLoderMutex.lock(); glm::vec2 coords = m_chunkLoaderQueue.front(); m_chunkLoaderQueue.pop(); - m_chunkMutex.unlock(); + m_chunkLoderMutex.unlock(); std::shared_ptr loadingChunk = std::make_shared(coords.x, coords.y, m_noiseGenerator); + loadingChunk->ShouldRender = true; std::cout << "Loaded chunk " << coords.x << ":" << coords.y << std::endl; - m_chunkMutex.lock(); + m_chunkLoderMutex.lock(); m_chunks[coords] = loadingChunk; - m_chunks[coords]->ShouldRender = true; - m_chunkMutex.unlock(); + m_chunkLoderMutex.unlock(); while (m_chunkLoaderQueue.empty()) { diff --git a/src/world/world.hpp b/src/world/world.hpp index bc7f557..988420e 100644 --- a/src/world/world.hpp +++ b/src/world/world.hpp @@ -30,7 +30,11 @@ public: void SetTextureMap(GLuint map); // Takes world coordinates and gets a chunks coordinates - glm::vec2 GetChunkCoords(glm::vec3 wordCoords); + glm::vec3 GetChunkCoords(glm::vec3 wordCoords); + + // Takes world coordinates and gets the chunk those coorinates + // fall in + glm::vec2 GetChunk(glm::vec3 worldCoords); std::vector> GetRenderableChunks(); @@ -59,10 +63,11 @@ private: // Indexed by chunk coorinates std::unordered_map> m_chunks; + std::mutex m_chunkUpdaterMutex; std::queue m_chunkUpdatesQueue; - std::queue m_chunkLoaderQueue; - std::mutex m_chunkMutex; + std::mutex m_chunkLoderMutex; + std::queue m_chunkLoaderQueue; // Generator std::shared_ptr m_noiseGenerator;