summaryrefslogtreecommitdiff
path: root/src/minecraft.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/minecraft.cpp')
-rwxr-xr-xsrc/minecraft.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/minecraft.cpp b/src/minecraft.cpp
new file mode 100755
index 0000000..a11421d
--- /dev/null
+++ b/src/minecraft.cpp
@@ -0,0 +1,95 @@
+#include "minecraft.hpp"
+
+#include <chrono>
+using namespace std::chrono;
+
+namespace app {
+
+Minecraft::Minecraft() : xeEngine{WIDTH, HEIGHT, "Minecraft Vulkan", "res/image/icon.png"} {};
+
+Minecraft::~Minecraft() {}
+
+void Minecraft::run() {
+
+ Chunk::load();
+
+ auto viewerObject = xe::GameObject::createGameObject();
+ viewerObject.transform.translation = {0.f, 40.f, 0.f};
+ viewerObject.transform.rotation.y = glm::radians(45.f);
+
+ createGameObjects(viewerObject);
+
+ ChunkRenderer renderer{Chunk::getTextures()};
+
+ xe::Sound sound{"res/sound/when_the_world_ends.wav"};
+ sound.setLooping(true);
+ sound.play();
+
+ PlayerController cameraController{xeEngine.getInput(), viewerObject};
+
+ while (xeEngine.poll()) {
+
+ float frameTime = xeEngine.getFrameTime();
+
+ cameraController.update(frameTime);
+ xeEngine.getCamera().setViewYXZ(viewerObject.transform.translation, viewerObject.transform.rotation);
+
+ if(xeEngine.beginFrame()) {
+ renderer.render(loadedChunks, xeEngine.getCamera());
+ xeEngine.endFrame();
+ }
+
+ reloadLoadedChunks(viewerObject);
+
+ }
+
+ xeEngine.close();
+
+ Chunk::unload();
+
+}
+
+void Minecraft::createGameObjects(xe::GameObject& viewer) {
+ int width = 2*RENDER_DISTANCE+1;
+ loadedChunks.clear();
+ for(int32_t x = 0; x < width; x++) {
+ for(int32_t z = 0; z < width; z++) {
+ auto gameObject = xe::GameObject::createGameObject();
+ gameObject.transform.translation = glm::vec3(0.f);
+ loadedChunks.push_back(std::move(gameObject));
+ }
+ }
+}
+
+void Minecraft::reloadLoadedChunks(xe::GameObject& viewer) {
+ viewX = static_cast<int>(floor(viewer.transform.translation.x / Chunk::CHUNK_SIZE.x));
+ viewZ = static_cast<int>(floor(viewer.transform.translation.z / Chunk::CHUNK_SIZE.z));
+ int width = 2*RENDER_DISTANCE+1;
+ int minX = viewX - RENDER_DISTANCE;
+ int minZ = viewZ - RENDER_DISTANCE;
+ int maxX = viewX + RENDER_DISTANCE;
+ int maxZ = viewZ + RENDER_DISTANCE;
+ for(int32_t x = 0; x < width; x++) {
+ for(int32_t z = 0; z < width; z++) {
+ auto& gameObject = loadedChunks[x + z * width];
+ int gridX = static_cast<int>(floor(gameObject.transform.translation.x / Chunk::CHUNK_SIZE.x));
+ int gridZ = static_cast<int>(floor(gameObject.transform.translation.z / Chunk::CHUNK_SIZE.z));
+ int newGridX = minX + x;
+ int newGridZ = minZ + z;
+ if(gridX < minX || gridZ < minZ || gridX > maxX || gridZ > maxZ)
+ Chunk::deleteChunk(gridX, gridZ);
+ Chunk* chunk = Chunk::getChunk(newGridX, newGridZ);
+ if(chunk == nullptr) {
+ chunk = Chunk::newChunk(newGridX, newGridZ, 12345);
+ Chunk::generateAsync(chunk);
+ }
+ if(chunk->getMesh() == nullptr){
+ Chunk::createMeshAsync(chunk);
+ }
+ gameObject.model = chunk->getMesh();
+ gameObject.transform.translation = glm::vec3(newGridX * Chunk::CHUNK_SIZE.x, 0, newGridZ * Chunk::CHUNK_SIZE.z);
+ }
+ }
+}
+
+} \ No newline at end of file