diff options
author | tylermurphy534 <tylermurphy534@gmail.com> | 2022-10-03 06:50:49 -0400 |
---|---|---|
committer | tylermurphy534 <tylermurphy534@gmail.com> | 2022-10-03 06:50:49 -0400 |
commit | 1701aa5a616f3de55b0a426f8d9e679f2c98a0c6 (patch) | |
tree | 87a6c13fb8b7884046f9fdf8c0b7dcaaf6952f28 /src | |
parent | move chunk loading into world class (diff) | |
download | minecraftvulkan-1701aa5a616f3de55b0a426f8d9e679f2c98a0c6.tar.gz minecraftvulkan-1701aa5a616f3de55b0a426f8d9e679f2c98a0c6.tar.bz2 minecraftvulkan-1701aa5a616f3de55b0a426f8d9e679f2c98a0c6.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/chunk.cpp | 23 | ||||
-rw-r--r-- | src/chunk.hpp | 2 | ||||
-rw-r--r-- | src/player_controller.cpp | 2 | ||||
-rw-r--r-- | src/player_controller.hpp | 3 | ||||
-rw-r--r-- | src/skinned_renderer.cpp (renamed from src/chunk_renderer.cpp) | 7 | ||||
-rw-r--r-- | src/skinned_renderer.hpp (renamed from src/chunk_renderer.hpp) | 10 | ||||
-rw-r--r-- | src/world.cpp | 23 | ||||
-rw-r--r-- | src/world.hpp | 16 |
8 files changed, 72 insertions, 14 deletions
diff --git a/src/chunk.cpp b/src/chunk.cpp index 55f8832..18e3c69 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -391,6 +391,29 @@ void Chunk::setBlock(int32_t x, int32_t y, int32_t z, uint8_t block) { cubes[index] = block; } +uint8_t Chunk::getGlobalBlock(int32_t x, int32_t y, int32_t z) { + if(y >= CHUNK_SIZE.y) return AIR; + if(y < 0) return INVALID; + int gridX = static_cast<int>(floor(x / Chunk::CHUNK_SIZE.x)); + int gridZ = static_cast<int>(floor(z / Chunk::CHUNK_SIZE.z)); + Chunk* chunk = getChunk(gridX, gridZ); + if(chunk == nullptr) return INVALID; + int localX = x - gridX * CHUNK_SIZE.x; + int localZ = z - gridZ * CHUNK_SIZE.z; + return chunk->getBlock(localX, y, localZ); +} + +void Chunk::setGlobalBlock(int32_t x, int32_t y, int32_t z, uint8_t block) { + if(y < 0 || y >= CHUNK_SIZE.y) return; + int gridX = static_cast<int>(x % Chunk::CHUNK_SIZE.x); + int gridZ = static_cast<int>(floor(z / Chunk::CHUNK_SIZE.z)); + Chunk* chunk = getChunk(gridX, gridZ); + if(chunk == nullptr) return; + int localX = x - gridX * CHUNK_SIZE.x; + int localZ = z - gridZ * CHUNK_SIZE.z; + chunk->setBlock(localX, y, localZ, block); +} + bool Chunk::isGenerated(int32_t gridX, int32_t gridZ) { Chunk* chunk = Chunk::getChunk(gridX, gridZ); if(chunk == nullptr) return false; diff --git a/src/chunk.hpp b/src/chunk.hpp index 6223fc7..5fcec17 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -68,6 +68,8 @@ class Chunk { xe::Model* getMesh(); 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); + static uint8_t getGlobalBlock(int32_t x, int32_t y, int32_t z); + static void setGlobalBlock(int32_t x, int32_t y, int32_t z, uint8_t block); static bool isGenerated(int32_t gridX, int32_t gridZ); static bool isMeshed(int32_t gridX, int32_t gridZ); diff --git a/src/player_controller.cpp b/src/player_controller.cpp index 1956f8e..45f5b4b 100644 --- a/src/player_controller.cpp +++ b/src/player_controller.cpp @@ -24,7 +24,7 @@ void PlayerController::update(float dt) { float yaw = viewerObject.transform.rotation.y; const glm::vec3 forwardDir{sin(yaw), 0.f, cos(yaw)}; const glm::vec3 rightDir{forwardDir.z, 0.f, -forwardDir.x}; - const glm::vec3 upDir{0.f, 01.f, 0.f}; + const glm::vec3 upDir{0.f, 1.f, 0.f}; glm::vec3 moveDir{0}; if(input.isKeyPressed(keys.moveForward)) moveDir += forwardDir; diff --git a/src/player_controller.hpp b/src/player_controller.hpp index e34f1ed..3d5d16d 100644 --- a/src/player_controller.hpp +++ b/src/player_controller.hpp @@ -3,6 +3,7 @@ #include "xe_game_object.hpp" #include "xe_input.hpp" +#define GLM_FORCE_RADIANS #include <glm/common.hpp> #include <glm/fwd.hpp> #include <glm/geometric.hpp> @@ -36,7 +37,7 @@ namespace app { xe::GameObject &viewerObject; KeyMappings keys{}; - float moveSpeed{250.f}; + float moveSpeed{100.f}; float lookSpeed{1.5f}; }; diff --git a/src/chunk_renderer.cpp b/src/skinned_renderer.cpp index 2dba6cb..0b65d0d 100644 --- a/src/chunk_renderer.cpp +++ b/src/skinned_renderer.cpp @@ -1,9 +1,9 @@ -#include "chunk_renderer.hpp" +#include "skinned_renderer.hpp" #include "chunk.hpp" namespace app { -ChunkRenderer::ChunkRenderer(std::vector<xe::Image*> &images) { +SkinnedRenderer::SkinnedRenderer(std::vector<xe::Image*> &images) { xeRenderSystem = xe::RenderSystem::Builder("res/shaders/simple_shader.vert.spv", "res/shaders/simple_shader.frag.spv") .addVertexBindingf(0, 3, 0) // position .addVertexBindingf(1, 3, 12) // normal @@ -14,10 +14,11 @@ ChunkRenderer::ChunkRenderer(std::vector<xe::Image*> &images) { .addUniformBinding(0, sizeof(UniformBuffer)) .addTextureArrayBinding(1, images) .setCulling(true) + .setWireframe(false) .build(); } -void ChunkRenderer::render(std::vector<xe::GameObject> &gameObjects, xe::Camera &xeCamera) { +void SkinnedRenderer::render(std::vector<xe::GameObject> &gameObjects, xe::Camera &xeCamera) { xeRenderSystem->start(); diff --git a/src/chunk_renderer.hpp b/src/skinned_renderer.hpp index e539f29..0c87fb5 100644 --- a/src/chunk_renderer.hpp +++ b/src/skinned_renderer.hpp @@ -16,16 +16,16 @@ struct PushConstant { alignas(16) glm::mat4 normalMatrix{1.f}; }; -class ChunkRenderer { +class SkinnedRenderer { public: - ChunkRenderer(std::vector<xe::Image*> &images); + SkinnedRenderer(std::vector<xe::Image*> &images); - ~ChunkRenderer() {}; + ~SkinnedRenderer() {}; - ChunkRenderer(const ChunkRenderer&) = delete; - ChunkRenderer operator=(const ChunkRenderer&) = delete; + SkinnedRenderer(const SkinnedRenderer&) = delete; + SkinnedRenderer operator=(const SkinnedRenderer&) = delete; void render(std::vector<xe::GameObject> &gameObjects, xe::Camera &xeCamera); diff --git a/src/world.cpp b/src/world.cpp index 485615d..d11e4bc 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -6,7 +6,7 @@ World::World(xe::GameObject& viewer, int renderDistance, int worldSeed) : viewer{viewer}, renderDistance{renderDistance}, worldSeed{worldSeed}, - chunkRenderer{Chunk::getTextures()} { + skinnedRenderer{Chunk::getTextures()} { reloadChunks(renderDistance); } @@ -92,7 +92,26 @@ void World::updateChunkMeshs() { void World::render(xe::Camera& camera) { camera.setViewYXZ(viewer.transform.translation, viewer.transform.rotation); - chunkRenderer.render(loadedChunks, camera); + // World::Ray ray = raycast(7, 100); + skinnedRenderer.render(loadedChunks, camera); +} + +World::Ray World::raycast(float distance, int steps) { + + glm::vec3 position = glm::vec3(viewer.transform.translation); + + float pitch = viewer.transform.rotation.x; + float yaw = viewer.transform.rotation.y; + float clamp = 1-fabs(sin(-pitch)); + const glm::vec3 step = glm::normalize(glm::vec3(sin(yaw)*clamp, sin(-pitch), cos(yaw)*clamp)) * (distance/steps); + + for(int i = 0; i < steps; i++) { + position += step; + int hit = Chunk::getGlobalBlock(position.x, position.y, position.z); + if(hit == AIR) continue; + return World::Ray{position, hit}; + } + return World::Ray{position, INVALID}; } }
\ No newline at end of file diff --git a/src/world.hpp b/src/world.hpp index 12e0285..e8882b2 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -1,9 +1,14 @@ #pragma once #include "xe_game_object.hpp" -#include "chunk_renderer.hpp" +#include "skinned_renderer.hpp" #include "chunk.hpp" +#define GLM_FORCE_RADIANS +#include <glm/common.hpp> +#include <glm/fwd.hpp> +#include <glm/geometric.hpp> + #include <vector> namespace app { @@ -12,6 +17,11 @@ class World { public: + struct Ray { + glm::ivec3 pos; + int hit; + }; + World(xe::GameObject& viewer, int renderDistance, int worldSeed); ~World(); @@ -20,6 +30,8 @@ class World { void render(xe::Camera& camera); + Ray raycast(float distance, int steps); + private: void resetChunks(); @@ -36,7 +48,7 @@ class World { const xe::GameObject& viewer; std::vector<xe::GameObject> loadedChunks; - ChunkRenderer chunkRenderer; + SkinnedRenderer skinnedRenderer; }; |