From 2aba3e91db17c445496d069c4eddcf5054a4cf09 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 3 Mar 2022 18:14:34 +0300 Subject: [PATCH] 'Assets', some refactor --- Debug/src/graphics/subdir.mk | 13 +- Debug/src/objects/subdir.mk | 4 - Debug/src/subdir.mk | 9 +- Debug_win/sources.mk | 19 +-- Debug_win/src/graphics/subdir.mk | 43 +++--- Debug_win/src/objects/subdir.mk | 20 +++ Debug_win/src/subdir.mk | 13 +- res/ascii.png | Bin 0 -> 2027 bytes res/block (copy).png | Bin 0 -> 8247 bytes src/Assets.cpp | 31 ++++ src/Assets.h | 22 +++ src/declarations.h | 77 +++++----- src/graphics/Batch2D.cpp | 18 +++ src/graphics/Batch2D.h | 27 ++++ src/graphics/Mesh.cpp | 7 +- src/objects/Player.cpp | 4 +- src/objects/Player.h | 1 + src/voxel_engine.cpp | 248 +++++++++++++++++-------------- src/world_render.h | 7 +- 19 files changed, 350 insertions(+), 213 deletions(-) create mode 100644 Debug_win/src/objects/subdir.mk create mode 100644 res/ascii.png create mode 100644 res/block (copy).png create mode 100644 src/Assets.cpp create mode 100644 src/Assets.h create mode 100644 src/graphics/Batch2D.cpp create mode 100644 src/graphics/Batch2D.h diff --git a/Debug/src/graphics/subdir.mk b/Debug/src/graphics/subdir.mk index 35070f37..995ec1bb 100644 --- a/Debug/src/graphics/subdir.mk +++ b/Debug/src/graphics/subdir.mk @@ -1,28 +1,27 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/graphics/LineBatch.cpp \ ../src/graphics/Mesh.cpp \ ../src/graphics/Shader.cpp \ ../src/graphics/Texture.cpp \ -../src/graphics/VoxelRenderer.cpp +../src/graphics/VoxelRenderer.cpp \ +../src/graphics/Batch2D.cpp OBJS += \ ./src/graphics/LineBatch.o \ ./src/graphics/Mesh.o \ ./src/graphics/Shader.o \ ./src/graphics/Texture.o \ -./src/graphics/VoxelRenderer.o +./src/graphics/VoxelRenderer.o \ +./src/graphics/Batch2D.o CPP_DEPS += \ ./src/graphics/LineBatch.d \ ./src/graphics/Mesh.d \ ./src/graphics/Shader.d \ ./src/graphics/Texture.d \ -./src/graphics/VoxelRenderer.d +./src/graphics/VoxelRenderer.d \ +./src/graphics/Batch2D.d # Each subdirectory must supply rules for building sources it contributes diff --git a/Debug/src/objects/subdir.mk b/Debug/src/objects/subdir.mk index 4757b8dd..1b72aeb0 100644 --- a/Debug/src/objects/subdir.mk +++ b/Debug/src/objects/subdir.mk @@ -1,7 +1,3 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/objects/Player.cpp diff --git a/Debug/src/subdir.mk b/Debug/src/subdir.mk index e4dbf713..e6fcb3f3 100644 --- a/Debug/src/subdir.mk +++ b/Debug/src/subdir.mk @@ -4,13 +4,16 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ -../src/voxel_engine.cpp +../src/voxel_engine.cpp \ +../src/Assets.cpp OBJS += \ -./src/voxel_engine.o +./src/voxel_engine.o \ +./src/Assets.o CPP_DEPS += \ -./src/voxel_engine.d +./src/voxel_engine.d \ +./src/Assets.d # Each subdirectory must supply rules for building sources it contributes diff --git a/Debug_win/sources.mk b/Debug_win/sources.mk index bb746f07..26037f00 100644 --- a/Debug_win/sources.mk +++ b/Debug_win/sources.mk @@ -22,13 +22,14 @@ CPP_DEPS := C_DEPS := # Every subdirectory with source files must be described here -SUBDIRS := \ -src \ -src/files \ -src/graphics \ -src/lighting \ -src/loaders \ -src/physics \ -src/voxels \ -src/window \ +SUBDIRS := \ +src \ +src/files \ +src/graphics \ +src/lighting \ +src/loaders \ +src/physics \ +src/voxels \ +src/objects \ +src/window \ diff --git a/Debug_win/src/graphics/subdir.mk b/Debug_win/src/graphics/subdir.mk index 2e37caee..2b3a0102 100644 --- a/Debug_win/src/graphics/subdir.mk +++ b/Debug_win/src/graphics/subdir.mk @@ -1,28 +1,27 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - # Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/graphics/LineBatch.cpp \ -../src/graphics/Mesh.cpp \ -../src/graphics/Shader.cpp \ -../src/graphics/Texture.cpp \ -../src/graphics/VoxelRenderer.cpp +CPP_SRCS += \ +../src/graphics/LineBatch.cpp \ +../src/graphics/Mesh.cpp \ +../src/graphics/Shader.cpp \ +../src/graphics/Texture.cpp \ +../src/graphics/VoxelRenderer.cpp \ +../src/graphics/Batch2D.cpp -OBJS += \ -./src/graphics/LineBatch.o \ -./src/graphics/Mesh.o \ -./src/graphics/Shader.o \ -./src/graphics/Texture.o \ -./src/graphics/VoxelRenderer.o +OBJS += \ +./src/graphics/LineBatch.o \ +./src/graphics/Mesh.o \ +./src/graphics/Shader.o \ +./src/graphics/Texture.o \ +./src/graphics/VoxelRenderer.o \ +./src/graphics/Batch2D.o -CPP_DEPS += \ -./src/graphics/LineBatch.d \ -./src/graphics/Mesh.d \ -./src/graphics/Shader.d \ -./src/graphics/Texture.d \ -./src/graphics/VoxelRenderer.d +CPP_DEPS += \ +./src/graphics/LineBatch.d \ +./src/graphics/Mesh.d \ +./src/graphics/Shader.d \ +./src/graphics/Texture.d \ +./src/graphics/VoxelRenderer.d \ +./src/graphics/Batch2D.d # Each subdirectory must supply rules for building sources it contributes diff --git a/Debug_win/src/objects/subdir.mk b/Debug_win/src/objects/subdir.mk new file mode 100644 index 00000000..ce3e7c3d --- /dev/null +++ b/Debug_win/src/objects/subdir.mk @@ -0,0 +1,20 @@ +# Add inputs and outputs from these tool invocations to the build variables +CPP_SRCS += \ +../src/objects/Player.cpp + +OBJS += \ +./src/objects/Player.o + +CPP_DEPS += \ +./src/objects/Player.d + + +# Each subdirectory must supply rules for building sources it contributes +src/objects/%.o: ../src/objects/%.cpp src/objects/subdir.mk + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/Debug_win/src/subdir.mk b/Debug_win/src/subdir.mk index d41d8884..a0330fab 100644 --- a/Debug_win/src/subdir.mk +++ b/Debug_win/src/subdir.mk @@ -1,16 +1,15 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ -../src/voxel_engine.cpp +../src/voxel_engine.cpp \ +../src/Assets.cpp OBJS += \ -./src/voxel_engine.o +./src/voxel_engine.o \ +./src/Assets.o CPP_DEPS += \ -./src/voxel_engine.d +./src/voxel_engine.d \ +./src/Assets.d # Each subdirectory must supply rules for building sources it contributes diff --git a/res/ascii.png b/res/ascii.png new file mode 100644 index 0000000000000000000000000000000000000000..3278f04cf6ece29ea3c3b9f7ed7d042702092dc8 GIT binary patch literal 2027 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 +#include + +class Texture; +class Shader; + +class Assets { + std::unordered_map textures; + std::unordered_map shaders; +public: + ~Assets(); + Texture* getTexture(std::string name); + void store(Texture* texture, std::string name); + + Shader* getShader(std::string name); + void store(Shader* shader, std::string name); +}; + +#endif /* SRC_ASSETS_H_ */ diff --git a/src/declarations.h b/src/declarations.h index 412d2afb..ae6edc38 100644 --- a/src/declarations.h +++ b/src/declarations.h @@ -1,8 +1,8 @@ -#ifndef DECLARATIONS_CPP -#define DECLARATIONS_CPP +#ifndef DECLARATIONS_H +#define DECLARATIONS_H #include - +#include "Assets.h" #include "graphics/Shader.h" #include "graphics/Texture.h" #include "window/Window.h" @@ -10,49 +10,42 @@ #include "voxels/Block.h" -Shader *shader, *linesShader, *crosshairShader; -Texture *texture; - - // Shaders, textures, renderers -int initialize_assets() { - shader = load_shader("res/main.glslv", "res/main.glslf"); + +bool _load_shader(Assets* assets, std::string vertex_file, std::string fragment_file, std::string name){ + Shader* shader = load_shader(vertex_file, fragment_file); if (shader == nullptr){ - std::cerr << "failed to load shader" << std::endl; - Window::terminate(); - return 1; + std::cerr << "failed to load shader '" << name << "'" << std::endl; + return false; } - - crosshairShader = load_shader("res/crosshair.glslv", "res/crosshair.glslf"); - if (crosshairShader == nullptr){ - std::cerr << "failed to load crosshair shader" << std::endl; - Window::terminate(); - return 1; - } - - linesShader = load_shader("res/lines.glslv", "res/lines.glslf"); - if (linesShader == nullptr){ - std::cerr << "failed to load lines shader" << std::endl; - Window::terminate(); - return 1; - } - - texture = load_texture("res/block.png"); - if (texture == nullptr){ - std::cerr << "failed to load texture" << std::endl; - delete shader; - Window::terminate(); - return 1; - } - return 0; + assets->store(shader, name); + return true; } -// Deleting GL objects like shaders, textures -void finalize_assets(){ - delete shader; - delete texture; - delete crosshairShader; - delete linesShader; +bool _load_texture(Assets* assets, std::string filename, std::string name){ + Texture* texture = load_texture(filename); + if (texture == nullptr){ + std::cerr << "failed to load texture '" << name << "'" << std::endl; + return false; + } + assets->store(texture, name); + return true; +} + +int initialize_assets(Assets* assets) { +#define LOAD_SHADER(VERTEX, FRAGMENT, NAME) \ + if (!_load_shader(assets, VERTEX, FRAGMENT, NAME))\ + return 1; +#define LOAD_TEXTURE(FILENAME, NAME) \ + if (!_load_texture(assets, FILENAME, NAME))\ + return 1; + + LOAD_SHADER("res/main.glslv", "res/main.glslf", "main"); + LOAD_SHADER("res/crosshair.glslv", "res/crosshair.glslf", "crosshair"); + LOAD_SHADER("res/lines.glslv", "res/lines.glslf", "lines"); + + LOAD_TEXTURE("res/block.png", "block"); + return 0; } @@ -115,5 +108,5 @@ void setup_definitions() { block->obstacle = false; Block::blocks[block->id] = block; } -#endif // DECLARATIONS_CPP +#endif // DECLARATIONS_H diff --git a/src/graphics/Batch2D.cpp b/src/graphics/Batch2D.cpp new file mode 100644 index 00000000..e6b43770 --- /dev/null +++ b/src/graphics/Batch2D.cpp @@ -0,0 +1,18 @@ +#include "Batch2D.h" +#include "Mesh.h" + +Batch2D::Batch2D(size_t capacity) : capacity(capacity), + offset(0), + color(1.0f, 1.0f, 1.0f, 1.0f){ + const int attrs[] = { + 2, 2, 4, 0 //null terminator + }; + + buffer = new float[capacity]; + mesh = new Mesh(nullptr, 0, attrs); +} + +Batch2D::~Batch2D(){ + delete buffer; + delete mesh; +} diff --git a/src/graphics/Batch2D.h b/src/graphics/Batch2D.h new file mode 100644 index 00000000..7e756eda --- /dev/null +++ b/src/graphics/Batch2D.h @@ -0,0 +1,27 @@ +#ifndef SRC_GRAPHICS_BATCH2D_H_ +#define SRC_GRAPHICS_BATCH2D_H_ + +#include +#include + +class Mesh; + +class Batch2D { + float* buffer; + size_t capacity; + size_t offset; + glm::vec4 color; + Mesh* mesh; + + void vertex(float x, float y, + float u, float v, + float r, float g, float b, float a); +public: + Batch2D(size_t capacity); + ~Batch2D(); + + void rect(float x, float y, float w, float h); + void render(); +}; + +#endif /* SRC_GRAPHICS_BATCH2D_H_ */ diff --git a/src/graphics/Mesh.cpp b/src/graphics/Mesh.cpp index 678115f0..ef99560f 100644 --- a/src/graphics/Mesh.cpp +++ b/src/graphics/Mesh.cpp @@ -12,7 +12,12 @@ Mesh::Mesh(const float* buffer, size_t vertices, const int* attrs) : vertices(ve glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertexSize * vertices, buffer, GL_STATIC_DRAW); + if (buffer){ + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertexSize * vertices, buffer, GL_STATIC_DRAW); + } else { + glBufferData(GL_ARRAY_BUFFER, 0, {}, GL_STATIC_DRAW); + } + // attributes int offset = 0; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 5acec728..2633c2ca 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -5,6 +5,8 @@ Player::Player(glm::vec3 position, float speed, Camera* camera) : speed(speed), - camera(camera){ + camera(camera), + choosenBlock(1), + camX(0.0f), camY(0.0f){ hitbox = new Hitbox(position, vec3(0.2f,0.9f,0.2f)); } diff --git a/src/objects/Player.h b/src/objects/Player.h index 335cb5cd..66174cb6 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -11,6 +11,7 @@ public: float speed; Camera* camera; Hitbox* hitbox; + int choosenBlock; float camX, camY; Player(glm::vec3 position, float speed, Camera* camera); ~Player(); diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 53b8b785..fa117aff 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -1,3 +1,5 @@ +// Install dependencies: +// sudo apt install libgl-dev libglew-dev libglfw3-dev libpng-dev libglm-dev #include #define GLEW_STATIC @@ -37,22 +39,15 @@ using namespace glm; #include "physics/Hitbox.h" #include "physics/PhysicsSolver.h" +#include "Assets.h" #include "objects/Player.h" #include "declarations.h" #include "world_render.h" -int WIDTH = 1280; -int HEIGHT = 720; - -Chunks* chunks; -WorldFiles* wfile; - -bool occlusion = false; - // Save all world data to files -void write_world(){ +void write_world(WorldFiles* wfile, Chunks* chunks){ for (unsigned int i = 0; i < chunks->volume; i++){ Chunk* chunk = chunks->chunks[i]; if (chunk == nullptr) @@ -64,27 +59,134 @@ void write_world(){ } // Deleting world data from memory -void close_world(){ +void close_world(WorldFiles* wfile, Chunks* chunks){ delete chunks; delete wfile; } +void update_controls(PhysicsSolver* physics, + Chunks* chunks, + Player* player, + float delta){ + // Controls + Camera* camera = player->camera; + Hitbox* hitbox = player->hitbox; + bool sprint = Events::pressed(GLFW_KEY_LEFT_CONTROL); + bool shift = Events::pressed(GLFW_KEY_LEFT_SHIFT) && hitbox->grounded && !sprint; + + float speed = player->speed; + int substeps = (int)(delta * 1000); + substeps = (substeps <= 0 ? 1 : (substeps > 100 ? 100 : substeps)); + physics->step(chunks, hitbox, delta, substeps, shift); + camera->position.x = hitbox->position.x; + camera->position.y = hitbox->position.y + 0.5f; + camera->position.z = hitbox->position.z; + + float dt = min(1.0f, delta * 16); + if (shift){ + speed *= 0.25f; + camera->position.y -= 0.2f; + camera->zoom = 0.9f * dt + camera->zoom * (1.0f - dt); + } else if (sprint){ + speed *= 1.5f; + camera->zoom = 1.1f * dt + camera->zoom * (1.0f - dt); + } else { + camera->zoom = dt + camera->zoom * (1.0f - dt); + } + if (Events::pressed(GLFW_KEY_SPACE) && hitbox->grounded){ + hitbox->velocity.y = 6.0f; + } + + vec3 dir(0,0,0); + if (Events::pressed(GLFW_KEY_W)){ + dir.x += camera->dir.x; + dir.z += camera->dir.z; + } + if (Events::pressed(GLFW_KEY_S)){ + dir.x -= camera->dir.x; + dir.z -= camera->dir.z; + } + if (Events::pressed(GLFW_KEY_D)){ + dir.x += camera->right.x; + dir.z += camera->right.z; + } + if (Events::pressed(GLFW_KEY_A)){ + dir.x -= camera->right.x; + dir.z -= camera->right.z; + } + if (length(dir) > 0.0f) + dir = normalize(dir); + hitbox->velocity.x = dir.x * speed; + hitbox->velocity.z = dir.z * speed; + + if (Events::_cursor_locked){ + player->camY += -Events::deltaY / Window::height * 2; + player->camX += -Events::deltaX / Window::height * 2; + + if (player->camY < -radians(89.0f)){ + player->camY = -radians(89.0f); + } + if (player->camY > radians(89.0f)){ + player->camY = radians(89.0f); + } + + camera->rotation = mat4(1.0f); + camera->rotate(player->camY, player->camX, 0); + } +} + +void update_interaction(Chunks* chunks, PhysicsSolver* physics, Player* player, Lighting* lighting){ + Camera* camera = player->camera; + { + vec3 end; + vec3 norm; + vec3 iend; + voxel* vox = chunks->rayCast(camera->position, camera->front, 10.0f, end, norm, iend); + if (vox != nullptr){ + lineBatch->box(iend.x+0.5f, iend.y+0.5f, iend.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); + + if (Events::jclicked(GLFW_MOUSE_BUTTON_1)){ + int x = (int)iend.x; + int y = (int)iend.y; + int z = (int)iend.z; + chunks->set(x,y,z, 0); + lighting->onBlockSet(x,y,z,0); + } + if (Events::jclicked(GLFW_MOUSE_BUTTON_2)){ + int x = (int)(iend.x)+(int)(norm.x); + int y = (int)(iend.y)+(int)(norm.y); + int z = (int)(iend.z)+(int)(norm.z); + if (!physics->isBlockInside(x,y,z, player->hitbox)){ + chunks->set(x, y, z, player->choosenBlock); + lighting->onBlockSet(x,y,z, player->choosenBlock); + } + } + } + } +} + +int WIDTH = 1280; +int HEIGHT = 720; + int main() { setup_definitions(); Window::initialize(WIDTH, HEIGHT, "Window 2.0"); Events::initialize(); - int result = initialize_assets(); + std::cout << "-- loading assets" << std::endl; + Assets* assets = new Assets(); + int result = initialize_assets(assets); if (result){ + delete assets; Window::terminate(); return result; } + std::cout << "-- loading world" << std::endl; - Camera* camera = new Camera(vec3(-320,255,32), radians(90.0f)); - - wfile = new WorldFiles("world/", REGION_VOL * (CHUNK_VOL * 2 + 8)); - chunks = new Chunks(34,1,34, 0,0,0); + Camera *camera = new Camera(vec3(-320,255,32), radians(90.0f)); + WorldFiles *wfile = new WorldFiles("world/", REGION_VOL * (CHUNK_VOL * 2 + 8)); + Chunks *chunks = new Chunks(34,1,34, 0,0,0); Player* player = new Player(vec3(camera->position), 5.0f, camera); @@ -92,9 +194,10 @@ int main() { camera->rotation = mat4(1.0f); camera->rotate(player->camY, player->camX, 0); + std::cout << "-- preparing systems" << std::endl; + VoxelRenderer renderer(1024*1024); PhysicsSolver physics(vec3(0,-16.0f,0)); - Lighting lighting(chunks); init_renderer(); @@ -104,20 +207,20 @@ int main() { float lastTime = glfwGetTime(); float delta = 0.0f; - int choosenBlock = 1; long frame = 0; + bool occlusion = false; + glfwSwapInterval(1); + std::cout << "-- initializing finished" << std::endl; + while (!Window::isShouldClose()){ frame++; float currentTime = glfwGetTime(); delta = currentTime - lastTime; lastTime = currentTime; - if (frame % 240 == 0) - std::cout << 1.0/delta << std::endl; - if (Events::jpressed(GLFW_KEY_O)){ occlusion = !occlusion; } @@ -131,117 +234,32 @@ int main() { for (int i = 1; i < 10; i++){ if (Events::jpressed(GLFW_KEY_0+i)){ - choosenBlock = i; + player->choosenBlock = i; } } - // Controls - Hitbox* hitbox = player->hitbox; - bool sprint = Events::pressed(GLFW_KEY_LEFT_CONTROL); - bool shift = Events::pressed(GLFW_KEY_LEFT_SHIFT) && hitbox->grounded && !sprint; - - float speed = player->speed; - int substeps = (int)(delta * 1000); - substeps = (substeps <= 0 ? 1 : (substeps > 100 ? 100 : substeps)); - physics.step(chunks, hitbox, delta, substeps, shift); - camera->position.x = hitbox->position.x; - camera->position.y = hitbox->position.y + 0.5f; - camera->position.z = hitbox->position.z; - - float dt = min(1.0f, delta * 16); - if (shift){ - speed *= 0.25f; - camera->position.y -= 0.2f; - camera->zoom = 0.9f * dt + camera->zoom * (1.0f - dt); - } else if (sprint){ - speed *= 1.5f; - camera->zoom = 1.1f * dt + camera->zoom * (1.0f - dt); - } else { - camera->zoom = dt + camera->zoom * (1.0f - dt); - } - if (Events::pressed(GLFW_KEY_SPACE) && hitbox->grounded){ - hitbox->velocity.y = 6.0f; - } - - vec3 dir(0,0,0); - if (Events::pressed(GLFW_KEY_W)){ - dir.x += camera->dir.x; - dir.z += camera->dir.z; - } - if (Events::pressed(GLFW_KEY_S)){ - dir.x -= camera->dir.x; - dir.z -= camera->dir.z; - } - if (Events::pressed(GLFW_KEY_D)){ - dir.x += camera->right.x; - dir.z += camera->right.z; - } - if (Events::pressed(GLFW_KEY_A)){ - dir.x -= camera->right.x; - dir.z -= camera->right.z; - } - if (length(dir) > 0.0f) - dir = normalize(dir); - hitbox->velocity.x = dir.x * speed; - hitbox->velocity.z = dir.z * speed; + update_controls(&physics, chunks, player, delta); + update_interaction(chunks, &physics, player, &lighting); chunks->setCenter(wfile, camera->position.x,0,camera->position.z); chunksController._buildMeshes(&renderer, frame); chunksController.loadVisible(wfile); - if (Events::_cursor_locked){ - player->camY += -Events::deltaY / Window::height * 2; - player->camX += -Events::deltaX / Window::height * 2; - - if (player->camY < -radians(89.0f)){ - player->camY = -radians(89.0f); - } - if (player->camY > radians(89.0f)){ - player->camY = radians(89.0f); - } - - camera->rotation = mat4(1.0f); - camera->rotate(player->camY, player->camX, 0); - } - - { - vec3 end; - vec3 norm; - vec3 iend; - voxel* vox = chunks->rayCast(camera->position, camera->front, 10.0f, end, norm, iend); - if (vox != nullptr){ - lineBatch->box(iend.x+0.5f, iend.y+0.5f, iend.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); - - if (Events::jclicked(GLFW_MOUSE_BUTTON_1)){ - int x = (int)iend.x; - int y = (int)iend.y; - int z = (int)iend.z; - chunks->set(x,y,z, 0); - lighting.onBlockSet(x,y,z,0); - } - if (Events::jclicked(GLFW_MOUSE_BUTTON_2)){ - int x = (int)(iend.x)+(int)(norm.x); - int y = (int)(iend.y)+(int)(norm.y); - int z = (int)(iend.z)+(int)(norm.z); - if (!physics.isBlockInside(x,y,z, hitbox)){ - chunks->set(x, y, z, choosenBlock); - lighting.onBlockSet(x,y,z, choosenBlock); - } - } - } - } - draw_world(camera, shader, texture, crosshairShader, linesShader, chunks, occlusion); + draw_world(camera, assets, chunks, occlusion); Window::swapBuffers(); Events::pullEvents(); } + std::cout << "-- saving world" << std::endl; wfile->writePlayer(player); - write_world(); - close_world(); + write_world(wfile, chunks); + close_world(wfile, chunks); + std::cout << "-- shutting down" << std::endl; + + delete assets; finalize_renderer(); - finalize_assets(); Window::terminate(); return 0; } diff --git a/src/world_render.h b/src/world_render.h index 630736da..ef8344ab 100644 --- a/src/world_render.h +++ b/src/world_render.h @@ -96,8 +96,7 @@ bool chunks_comparator(size_t i, size_t j) { } -void draw_world(Camera* camera, Shader* shader, Texture* texture, - Shader* crosshairShader, Shader* linesShader, +void draw_world(Camera* camera, Assets* assets, Chunks* chunks, bool occlusion){ glClearColor(0.7f,0.71f,0.73f,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -105,6 +104,10 @@ void draw_world(Camera* camera, Shader* shader, Texture* texture, _chunks = chunks; // Draw VAO + Texture* texture = assets->getTexture("block"); + Shader* shader = assets->getShader("main"); + Shader* crosshairShader = assets->getShader("crosshair"); + Shader* linesShader = assets->getShader("lines"); shader->use(); shader->uniformMatrix("u_proj", camera->getProjection()); shader->uniformMatrix("u_view", camera->getView());