From b1e5a3c6fbdc9bf56f2225278bd0ee011776dba7 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Tue, 8 Nov 2022 14:49:10 +0300 Subject: [PATCH 01/19] many little fixes --- src/graphics/VoxelRenderer.cpp | 50 +++++++++++++++++----------------- src/hud_render.cpp | 30 ++++++++++++-------- src/player_control.cpp | 2 +- src/voxel_engine.cpp | 2 +- src/voxels/Block.h | 2 +- src/voxels/WorldGenerator.cpp | 4 +-- 6 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/graphics/VoxelRenderer.cpp b/src/graphics/VoxelRenderer.cpp index 7e9ed7fc..fd8773ca 100644 --- a/src/graphics/VoxelRenderer.cpp +++ b/src/graphics/VoxelRenderer.cpp @@ -417,43 +417,43 @@ inline void _renderXBlock(std::vector& buffer, int x, int y, int z, const {SETUP_UV(block->textureFaces[1]); - VERTEX(index, x-0.5f+xs, y-0.5f, z-0.5f+zs, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x-0.5f+xs, y+0.5f, z-0.5f+zs, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x+0.5f+xs, y+0.5f, z+0.5f+zs, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f+xs, y-0.5f, z-0.5f+zs, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f+xs, y+0.5f, z+0.5f+zs, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x+0.5f+xs, y-0.5f, z+0.5f+zs, u1,v1, lr3,lg3,lb3,ls3);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr3,lg3,lb3,ls3);} {SETUP_UV(block->textureFaces[0]); - VERTEX(index, x-0.5f+xs, y-0.5f, z-0.5f+zs, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f+xs, y+0.5f, z+0.5f+zs, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.5f+xs, y+0.5f, z-0.5f+zs, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f+xs, y-0.5f, z-0.5f+zs, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f+xs, y-0.5f, z+0.5f+zs, u2,v1, lr3,lg3,lb3,ls3); - VERTEX(index, x+0.5f+xs, y+0.5f, z+0.5f+zs, u2,v2, lr1,lg1,lb1,ls1);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1);} {SETUP_UV(block->textureFaces[5]); - VERTEX(index, x-0.5f+xs, y-0.5f, z+0.5f+zs, u1,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.5f+xs, y+0.5f, z-0.5f+zs, u2,v2, lr5,lg5,lb5,ls5); - VERTEX(index, x-0.5f+xs, y+0.5f, z+0.5f+zs, u1,v2, lr6,lg6,lb6,ls6); + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr4,lg4,lb4,ls4); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5); + VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); - VERTEX(index, x-0.5f+xs, y-0.5f, z+0.5f+zs, u1,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.5f+xs, y-0.5f, z-0.5f+zs, u2,v1, lr7,lg7,lb7,ls7); - VERTEX(index, x+0.5f+xs, y+0.5f, z-0.5f+zs, u2,v2, lr5,lg5,lb5,ls5);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr4,lg4,lb4,ls4); + VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr7,lg7,lb7,ls7); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5);} {SETUP_UV(block->textureFaces[4]); - VERTEX(index, x-0.5f+xs, y-0.5f, z+0.5f+zs, u2,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x-0.5f+xs, y+0.5f, z+0.5f+zs, u2,v2, lr5,lg5,lb5,ls5); - VERTEX(index, x+0.5f+xs, y+0.5f, z-0.5f+zs, u1,v2, lr6,lg6,lb6,ls6); + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr4,lg4,lb4,ls4); + VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); - VERTEX(index, x-0.5f+xs, y-0.5f, z+0.5f+zs, u2,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.5f+xs, y+0.5f, z-0.5f+zs, u1,v2, lr6,lg6,lb6,ls6); - VERTEX(index, x+0.5f+xs, y-0.5f, z-0.5f+zs, u1,v1, lr7,lg7,lb7,ls7);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr4,lg4,lb4,ls4); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); + VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr7,lg7,lb7,ls7);} } const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& size){ @@ -509,7 +509,7 @@ const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& s voxel vox = chunk->voxels[(y * CHUNK_D + z) * CHUNK_W + x]; if (vox.id == 0) continue; - if (Block::blocks[vox.id]->model != BLOCK_MODEL_GRASS) + if (Block::blocks[vox.id]->model != BLOCK_MODEL_X_SPRITE) continue; _renderXBlock(buffer, x, y, z, chunks, vox, index); } diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 62894d66..1cadf969 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -95,36 +95,42 @@ void HudRenderer::draw(Level* level, Assets* assets){ Block* cblock = Block::blocks[player->choosenBlock]; if (cblock->model == BLOCK_MODEL_CUBE){ batch->blockSprite(24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces, vec4(1.0f)); - } else if (cblock->model == BLOCK_MODEL_GRASS){ + } else if (cblock->model == BLOCK_MODEL_X_SPRITE){ batch->sprite(24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces[3], vec4(1.0f)); } } if (!Events::_cursor_locked) { + int size = 48; + int step = 70; + int y = uicamera->fov - 72 - 70; + int x = 0; + vec4 tint = vec4(1.0f); + int mx = Events::x; + int my = Events::y; + for (unsigned i = 1; i < 256; i++) { Block* cblock = Block::blocks[i]; if (cblock == nullptr) break; - int size = 48; - int step = 70; - int x = 24 + (i-1) * step; - int y = uicamera->fov - 72 - 70; + x = 24 + (i-1) * step; y -= 72 * (x / (Window::width - step)); x %= (Window::width - step); - vec4 tint(1.0f); - int mx = Events::x; - int my = Events::y; if (mx > x && mx < x + size && my > y && my < y + size) { - tint.r *= 2.0f; - tint.g *= 2.0f; - tint.b *= 2.0f; + tint.r *= 1.3f; + tint.g *= 1.3f; + tint.b *= 1.3f; if (Events::jclicked(GLFW_MOUSE_BUTTON_LEFT)) { player->choosenBlock = i; } + } else + { + tint = vec4(1.0f); } + if (cblock->model == BLOCK_MODEL_CUBE){ batch->blockSprite(x, y, size, size, 16, cblock->textureFaces, tint); - } else if (cblock->model == BLOCK_MODEL_GRASS){ + } else if (cblock->model == BLOCK_MODEL_X_SPRITE){ batch->sprite(x, y, size, size, 16, cblock->textureFaces[3], tint); } } diff --git a/src/player_control.cpp b/src/player_control.cpp index 59fbe276..7bc654c6 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -189,7 +189,7 @@ void PlayerController::update_interaction(){ 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 (block->model == BLOCK_MODEL_GRASS){ + if (block->model == BLOCK_MODEL_X_SPRITE){ x = (int)iend.x; y = (int)iend.y; z = (int)iend.z; diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 99c95676..30f4dba1 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -120,7 +120,7 @@ void mainloop(Level* level, Assets* assets) { float delta = 0.0f; bool occlusion = true; bool devdata = false; - Window::swapInterval(0); + Window::swapInterval(1); while (!Window::isShouldClose()){ frame++; float currentTime = glfwGetTime(); diff --git a/src/voxels/Block.h b/src/voxels/Block.h index c57bec3d..21f6fde3 100644 --- a/src/voxels/Block.h +++ b/src/voxels/Block.h @@ -2,7 +2,7 @@ #define VOXELS_BLOCK_H_ #define BLOCK_MODEL_CUBE 1 -#define BLOCK_MODEL_GRASS 2 +#define BLOCK_MODEL_X_SPRITE 2 class Block { public: diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index 1664bbda..252d2607 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -142,10 +142,10 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ } if (real_y <= 2) id = BLOCK_BEDROCK; - if ((id == 0) && (real_y > 55) && ((int)height + 1 == real_y) && ((unsigned short)random() > 56000)){ + if ((id == 0) && (real_y > 55) && ((int)(height + 0.5f) == real_y) && ((unsigned short)random() > 56000)){ id = BLOCK_GRASS; } - if ((id == 0) && (real_y > 55) && ((int)height + 1 == real_y) && ((unsigned short)random() > 64000)){ + if ((id == 0) && (real_y > 55) && ((int)(height + 0.5f) == real_y) && ((unsigned short)random() > 64000)){ id = BLOCK_FLOWER; } voxels[(y * CHUNK_D + z) * CHUNK_W + x].id = id; From d2416946d9e3c9a8f63f9fea072fb60560ce80f5 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Sat, 19 Nov 2022 02:21:15 +0300 Subject: [PATCH 02/19] inventory --- res/block.png | Bin 12498 -> 9847 bytes src/graphics/Batch2D.cpp | 64 +++++++++++++++++- src/graphics/Batch2D.h | 11 +++- src/graphics/VoxelRenderer.cpp | 82 +++++++++--------------- src/hud_render.cpp | 114 ++++++++++++++++++++++++++------- src/voxel_engine.cpp | 4 +- src/voxels/Block.h | 4 +- src/voxels/WorldGenerator.cpp | 32 ++++----- src/world_render.cpp | 2 +- 9 files changed, 213 insertions(+), 100 deletions(-) diff --git a/res/block.png b/res/block.png index e7c090d1e41f8d05bd6bd9200a6decb577010702..723816fc351edd7cd8b0eb1723008fd7b72605e3 100644 GIT binary patch literal 9847 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 yV07ady({jR9fo#PbweVM*a`dVj}zi literal 12498 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 A!~g&Q diff --git a/src/graphics/Batch2D.cpp b/src/graphics/Batch2D.cpp index acb9f2ec..067df008 100644 --- a/src/graphics/Batch2D.cpp +++ b/src/graphics/Batch2D.cpp @@ -261,8 +261,8 @@ void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int } void Batch2D::rect(float x, float y, float w, float h, - float u, float v, float tx, float ty, - float r, float g, float b, float a){ + float u, float v, float tx, float ty, + float r, float g, float b, float a){ if (index + 6*VERTEX_SIZE >= capacity) render(); vertex(x, y, u, v+ty, r,g,b,a); @@ -274,6 +274,66 @@ void Batch2D::rect(float x, float y, float w, float h, vertex(x+w, y+h, u+tx, v, r,g,b,a); } +void Batch2D::rect(float x, float y, float w, float h, + float r0, float g0, float b0, + float r1, float g1, float b1, + float r2, float g2, float b2, + float r3, float g3, float b3, + float r4, float g4, float b4, int sh){ + if (index + 30*VERTEX_SIZE >= capacity) + render(); + vec2 v0 = vec2(x+h/2,y+h/2); + vec2 v1 = vec2(x+w-sh,y); + vec2 v2 = vec2(x+sh,y); + vec2 v3 = vec2(x,y+sh); + vec2 v4 = vec2(x,y+h-sh); + vec2 v5 = vec2(x+sh,y+h); + vec2 v6 = vec2(x+w-h/2,y+h/2); + vec2 v7 = vec2(x+w-sh,y+h); + vec2 v8 = vec2(x+w,y+h-sh); + vec2 v9 = vec2(x+w,y+sh); + + vertex(v0, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v6, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v1, vec2(0, 0), r1,g1,b1,1.0f); + + vertex(v0, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v1, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v2, vec2(0, 0), r1,g1,b1,1.0f); + + vertex(v0, vec2(0, 0), r0,g0,b0,1.0f); + vertex(v2, vec2(0, 0), r0,g0,b0,1.0f); + vertex(v3, vec2(0, 0), r0,g0,b0,1.0f); + + vertex(v0, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v3, vec2(0, 0), r1,g1,b1,1.0f); + vertex(v4, vec2(0, 0), r1,g1,b1,1.0f); + + vertex(v0, vec2(0, 0), r2,g2,b2,1.0f); + vertex(v4, vec2(0, 0), r2,g2,b2,1.0f); + vertex(v5, vec2(0, 0), r2,g2,b2,1.0f); + + vertex(v0, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v5, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v6, vec2(0, 0), r3,g3,b3,1.0f); + + vertex(v6, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v5, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v7, vec2(0, 0), r3,g3,b3,1.0f); + + vertex(v6, vec2(0, 0), r4,g4,b4,1.0f); + vertex(v7, vec2(0, 0), r4,g4,b4,1.0f); + vertex(v8, vec2(0, 0), r4,g4,b4,1.0f); + + vertex(v6, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v8, vec2(0, 0), r3,g3,b3,1.0f); + vertex(v9, vec2(0, 0), r3,g3,b3,1.0f); + + vertex(v6, vec2(0, 0), r2,g2,b2,1.0f); + vertex(v9, vec2(0, 0), r2,g2,b2,1.0f); + vertex(v1, vec2(0, 0), r2,g2,b2,1.0f); +} + void Batch2D::render() { mesh->reload(buffer, index / VERTEX_SIZE); mesh->draw(GL_TRIANGLES); diff --git a/src/graphics/Batch2D.h b/src/graphics/Batch2D.h index 0c9b69e8..ac89c884 100644 --- a/src/graphics/Batch2D.h +++ b/src/graphics/Batch2D.h @@ -49,8 +49,15 @@ public: void rect(float x, float y, float w, float h); void rect(float x, float y, float w, float h, - float u, float v, float tx, float ty, - float r, float g, float b, float a); + float u, float v, float tx, float ty, + float r, float g, float b, float a); + + void rect(float x, float y, float w, float h, + float r0, float g0, float b0, + float r1, float g1, float b1, + float r2, float g2, float b2, + float r3, float g3, float b3, + float r4, float g4, float b4, int sh); void render(); }; diff --git a/src/graphics/VoxelRenderer.cpp b/src/graphics/VoxelRenderer.cpp index fd8773ca..a7b3b953 100644 --- a/src/graphics/VoxelRenderer.cpp +++ b/src/graphics/VoxelRenderer.cpp @@ -374,86 +374,62 @@ inline void _renderXBlock(std::vector& buffer, int x, int y, int z, const float uvsize = 1.0f/16.0f; - float lr = LIGHT(x,y,z, 0) / 15.0f; - float lg = LIGHT(x,y,z, 1) / 15.0f; - float lb = LIGHT(x,y,z, 2) / 15.0f; - float ls = LIGHT(x,y,z, 3) / 15.0f; + float lr = LIGHT(x,y,z, 0); + float lg = LIGHT(x,y,z, 1); + float lb = LIGHT(x,y,z, 2); + float ls = LIGHT(x,y,z, 3); - float lr0 = (LIGHT(x,y-1,z,0) + lr*30) / 45.0f; - float lr1 = (LIGHT(x,y+1,z,0) + lr*30) / 45.0f; - float lr2 = (LIGHT(x,y+1,z,0) + lr*30) / 45.0f; - float lr3 = (LIGHT(x,y-1,z,0) + lr*30) / 45.0f; - float lr4 = (LIGHT(x,y-1,z,0) + lr*30) / 45.0f; - float lr5 = (LIGHT(x,y+1,z,0) + lr*30) / 45.0f; - float lr6 = (LIGHT(x,y+1,z,0) + lr*30) / 45.0f; - float lr7 = (LIGHT(x,y-1,z,0) + lr*30) / 45.0f; + float lr0 = (LIGHT(x,y-1,z,0) + lr*3) / 60.0f; + float lr1 = (LIGHT(x,y+1,z,0) + lr*3) / 60.0f; - float lg0 = (LIGHT(x,y-1,z,1) + lg*30) / 45.0f; - float lg1 = (LIGHT(x,y+1,z,1) + lg*30) / 45.0f; - float lg2 = (LIGHT(x,y+1,z,1) + lg*30) / 45.0f; - float lg3 = (LIGHT(x,y-1,z,1) + lg*30) / 45.0f; - float lg4 = (LIGHT(x,y-1,z,1) + lg*30) / 45.0f; - float lg5 = (LIGHT(x,y+1,z,1) + lg*30) / 45.0f; - float lg6 = (LIGHT(x,y+1,z,1) + lg*30) / 45.0f; - float lg7 = (LIGHT(x,y-1,z,1) + lg*30) / 45.0f; + float lg0 = (LIGHT(x,y-1,z,1) + lg*3) / 60.0f; + float lg1 = (LIGHT(x,y+1,z,1) + lg*3) / 60.0f; - float lb0 = (LIGHT(x,y-1,z,2) + lb*30) / 45.0f; - float lb1 = (LIGHT(x,y+1,z,2) + lb*30) / 45.0f; - float lb2 = (LIGHT(x,y+1,z,2) + lb*30) / 45.0f; - float lb3 = (LIGHT(x,y-1,z,2) + lb*30) / 45.0f; - float lb4 = (LIGHT(x,y-1,z,2) + lb*30) / 45.0f; - float lb5 = (LIGHT(x,y+1,z,2) + lb*30) / 45.0f; - float lb6 = (LIGHT(x,y+1,z,2) + lb*30) / 45.0f; - float lb7 = (LIGHT(x,y-1,z,2) + lb*30) / 45.0f; + float lb0 = (LIGHT(x,y-1,z,2) + lb*3) / 60.0f; + float lb1 = (LIGHT(x,y+1,z,2) + lb*3) / 60.0f; - float ls0 = (LIGHT(x,y-1,z,3) + ls*30) / 45.0f; - float ls1 = (LIGHT(x,y+1,z,3) + ls*30) / 45.0f; - float ls2 = (LIGHT(x,y+1,z,3) + ls*30) / 45.0f; - float ls3 = (LIGHT(x,y-1,z,3) + ls*30) / 45.0f; - float ls4 = (LIGHT(x,y-1,z,3) + ls*30) / 45.0f; - float ls5 = (LIGHT(x,y+1,z,3) + ls*30) / 45.0f; - float ls6 = (LIGHT(x,y+1,z,3) + ls*30) / 45.0f; - float ls7 = (LIGHT(x,y-1,z,3) + ls*30) / 45.0f; + float ls0 = (LIGHT(x,y-1,z,3) + ls*3) / 60.0f; + float ls1 = (LIGHT(x,y+1,z,3) + ls*3) / 60.0f; {SETUP_UV(block->textureFaces[1]); VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); VERTEX(index, x-0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr3,lg3,lb3,ls3);} + VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0);} {SETUP_UV(block->textureFaces[0]); VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x-0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); VERTEX(index, x-0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); VERTEX(index, x+0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1);} {SETUP_UV(block->textureFaces[5]); - VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5); - VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr7,lg7,lb7,ls7); - VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1);} {SETUP_UV(block->textureFaces[4]); - VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr5,lg5,lb5,ls5); - VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.3535f+xs, y+0.5f, z+0.3535f+zs, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr4,lg4,lb4,ls4); - VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr6,lg6,lb6,ls6); - VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr7,lg7,lb7,ls7);} + VERTEX(index, x-0.3535f+xs, y-0.5f, z+0.3535f+zs, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.3535f+xs, y+0.5f, z-0.3535f+zs, u1,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.3535f+xs, y-0.5f, z-0.3535f+zs, u1,v1, lr0,lg0,lb0,ls0);} } const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& size){ diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 1cadf969..bead34d9 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -56,8 +56,8 @@ void HudRenderer::drawDebug(Level* level, Assets* assets, int fps, bool occlusio batch->begin(); font->draw(batch, L"chunks: "+std::to_wstring(chunks->chunksCount), 16, 16, STYLE_OUTLINE); font->draw(batch, std::to_wstring((int)player->camera->position.x), 10, 30, STYLE_OUTLINE); - font->draw(batch, std::to_wstring((int)player->camera->position.y), 50, 30, STYLE_OUTLINE); - font->draw(batch, std::to_wstring((int)player->camera->position.z), 90, 30, STYLE_OUTLINE); + font->draw(batch, std::to_wstring((int)player->camera->position.y), 90, 30, STYLE_OUTLINE); + font->draw(batch, std::to_wstring((int)player->camera->position.z), 170, 30, STYLE_OUTLINE); font->draw(batch, L"fps:", 16, 42, STYLE_OUTLINE); font->draw(batch, std::to_wstring(fps), 44, 42, STYLE_OUTLINE); font->draw(batch, L"occlusion: "+std::to_wstring(occlusion), 16, 54, STYLE_OUTLINE); @@ -80,51 +80,115 @@ void HudRenderer::draw(Level* level, Assets* assets){ Texture* sprite = assets->getTexture("slot"); if (!Events::_cursor_locked) { - batch->texture(nullptr); - batch->color = vec4(0.0f, 0.0f, 0.0f, 0.5f); - batch->rect(0, 0, Window::width, Window::height); } batch->color = vec4(1.0f); - batch->texture(sprite); - batch->sprite(16, uicamera->fov - 80, 64, 64, 16, 0, vec4(1.0f)); + // batch->texture(sprite); + batch->texture(nullptr); + // batch->sprite(Window::width/2-32, uicamera->fov - 80, 64, 64, 16, 0, vec4(1.0f)); + // batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, + // 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, + // 0.55f, 0.55f, 0.55f, + // 0.45f, 0.45f, 0.45f, 0.7f, 0.7f, 0.7f, 2); + batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, + 0.95f, 0.95f, 0.95f, 0.85f, 0.85f, 0.85f, + 0.7f, 0.7f, 0.7f, + 0.55f, 0.55f, 0.55f, 0.45f, 0.45f, 0.45f, 4); + batch->rect(Window::width/2-128, Window::height - 80, 256, 64, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 4); + batch->rect(Window::width/2-32+2, Window::height - 80+2, 60, 60, + 0.45f, 0.45f, 0.45f, 0.55f, 0.55f, 0.55f, + 0.7f, 0.7f, 0.7f, + 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, 2); + batch->rect(Window::width/2-32+4, Window::height - 80+4, 56, 56, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 2); + batch->texture(blocks); Player* player = level->player; { Block* cblock = Block::blocks[player->choosenBlock]; if (cblock->model == BLOCK_MODEL_CUBE){ - batch->blockSprite(24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces, vec4(1.0f)); + batch->blockSprite(Window::width/2-24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces, vec4(1.0f)); } else if (cblock->model == BLOCK_MODEL_X_SPRITE){ - batch->sprite(24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces[3], vec4(1.0f)); + batch->sprite(Window::width/2-24, uicamera->fov - 72, 48, 48, 16, cblock->textureFaces[3], vec4(1.0f)); } } - if (!Events::_cursor_locked) { + if (!Events::_cursor_locked) { //inventory int size = 48; - int step = 70; - int y = uicamera->fov - 72 - 70; + int step = 64; + int inv_wm = step*10; + int inv_hm = step*8; + int inv_w = inv_wm - (step - size); + int inv_h = inv_hm - (step - size); + int xs = (Window::width - inv_w + step)/2; int x = 0; + int ys = (Window::height - inv_h + step)/2; + int y = 0; vec4 tint = vec4(1.0f); int mx = Events::x; int my = Events::y; + int count = (inv_w / step) * (inv_h / step) + 1; - for (unsigned i = 1; i < 256; i++) { + //back + batch->texture(nullptr); + batch->color = vec4(0.0f, 0.0f, 0.0f, 0.3f); + batch->rect(0, 0, Window::width, Window::height); + batch->rect((Window::width - (inv_w)) / 2 - 4, (Window::height - (inv_h)) / 2 - 4, inv_w+8, inv_h+8, + 0.95f, 0.95f, 0.95f, 0.85f, 0.85f, 0.85f, + 0.7f, 0.7f, 0.7f, + 0.55f, 0.55f, 0.55f, 0.45f, 0.45f, 0.45f, 4); + batch->rect((Window::width - (inv_w)) / 2, (Window::height - (inv_h)) / 2, inv_w, inv_h, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, + 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 4); + + batch->color = vec4(0.35f, 0.35f, 0.35f, 1.0f); + for (unsigned i = 1; i < count; i++) { + x = xs + step * ((i-1) % (inv_w / step)); + y = ys + step * ((i-1) / (inv_w / step)); + // batch->rect(x-2, y-2, size+4, size+4); + batch->rect(x-2, y-2, size+4, size+4, + 0.45f, 0.45f, 0.45f, 0.55f, 0.55f, 0.55f, + 0.7f, 0.7f, 0.7f, + 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, 2); + batch->rect(x, y, size, size, + 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, + 0.65f, 0.65f, 0.65f, + 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 2); + } + + // batch->color = vec4(0.5f, 0.5f, 0.5f, 1.0f); + // for (unsigned i = 1; i < count; i++) { + // x = xs + step * ((i-1) % (inv_w / step)); + // y = ys + step * ((i-1) / (inv_w / step)); + // batch->rect(x, y, size, size); + // } + + //front + batch->texture(blocks); + for (unsigned i = 1; i < count; i++) { Block* cblock = Block::blocks[i]; if (cblock == nullptr) break; - x = 24 + (i-1) * step; - y -= 72 * (x / (Window::width - step)); - x %= (Window::width - step); + x = xs + step * ((i-1) % (inv_w / step)); + y = ys + step * ((i-1) / (inv_w / step)); if (mx > x && mx < x + size && my > y && my < y + size) { - tint.r *= 1.3f; - tint.g *= 1.3f; - tint.b *= 1.3f; + tint.r *= 1.2f; + tint.g *= 1.2f; + tint.b *= 1.2f; if (Events::jclicked(GLFW_MOUSE_BUTTON_LEFT)) { player->choosenBlock = i; } + // size = 50; } else { + // size = 48; tint = vec4(1.0f); } @@ -138,9 +202,11 @@ void HudRenderer::draw(Level* level, Assets* assets){ batch->render(); - Shader* crosshairShader = assets->getShader("crosshair"); - crosshairShader->use(); - crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); - crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); - crosshair->draw(GL_LINES); + if (Events::_cursor_locked){ + Shader* crosshairShader = assets->getShader("crosshair"); + crosshairShader->use(); + crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); + crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); + crosshair->draw(GL_LINES); + } } diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 30f4dba1..7f232955 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -130,7 +130,7 @@ void mainloop(Level* level, Assets* assets) { if (Events::jpressed(GLFW_KEY_ESCAPE)){ Window::setShouldClose(true); } - if (Events::jpressed(GLFW_KEY_TAB)){ + if (Events::jpressed(GLFW_KEY_TAB) || Events::jpressed(GLFW_KEY_E)){ Events::toggleCursor(); } if (Events::jpressed(GLFW_KEY_O)){ @@ -178,7 +178,7 @@ int main() { if (status) return status; std::cout << "-- loading world" << std::endl; - vec3 playerPosition = vec3(0,150,-10); + vec3 playerPosition = vec3(0,150,0); Camera* camera = new Camera(playerPosition, radians(90.0f)); World* world = new World("world-1", "world/", 42); Player* player = new Player(playerPosition, 4.0f, camera); diff --git a/src/voxels/Block.h b/src/voxels/Block.h index 21f6fde3..561c741b 100644 --- a/src/voxels/Block.h +++ b/src/voxels/Block.h @@ -13,12 +13,14 @@ public: int textureFaces[6]; // -x,x, -y,y, -z,z unsigned char emission[3]; unsigned char drawGroup = 0; + unsigned char model = 1; // 0:None 1:Block 2:XSprite bool lightPassing = false; bool skyLightPassing = false; bool obstacle = true; bool selectable = true; bool breakable = true; - unsigned char model = 1; + float hitboxScale = 1; + float hitboxY = 1; Block(unsigned int id, int texture); }; diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index 252d2607..eaf155f7 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -37,15 +37,16 @@ public: }; float calc_height(fnl_state *noise, int real_x, int real_z){ - float height = fnlGetNoise3D(noise, real_x*0.0125f*8,real_z*0.0125f*8, 0.0f); - height += fnlGetNoise3D(noise, real_x*0.025f*8,real_z*0.025f*8, 0.0f)*0.5f; - height += fnlGetNoise3D(noise, real_x*0.05f*8,real_z*0.05f*8, 0.0f)*0.25f; + float height = 0; + height += fnlGetNoise3D(noise, real_x*0.0125f*8-125567,real_z*0.0125f*8+3546, 0.0f); + height += fnlGetNoise3D(noise, real_x*0.025f*8+4647,real_z*0.025f*8-3436, 0.0f)*0.5f; + height += fnlGetNoise3D(noise, real_x*0.05f*8-834176,real_z*0.05f*8+23678, 0.0f)*0.25f; height += fnlGetNoise3D(noise, - real_x*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8,real_z*0.1f*8, 0.0f)*50, - real_z*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8+4363,real_z*0.1f*8, 0.0f)*50, + real_x*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8-23557,real_z*0.1f*8-6568, 0.0f)*50, + real_z*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8+4363,real_z*0.1f*8+4456, 0.0f)*50, 0.0f)*0.1f; - height += fnlGetNoise3D(noise, real_x*0.1f*8,real_z*0.1f*8, 0.0f)*0.125f; - height += fnlGetNoise3D(noise, real_x*0.4f*8,real_z*0.4f*8, 0.0f)*0.0625f; + height += fnlGetNoise3D(noise, real_x*0.1f*8-3465,real_z*0.1f*8+4534, 0.0f)*0.125f; + height += fnlGetNoise3D(noise, real_x*0.4f*8+4565,real_z*0.4f*8+46456, 0.0f)*0.0625f; height += fnlGetNoise3D(noise, real_x*8,real_z*8, 0.0f)*0.03f*(fnlGetNoise3D(noise, -real_x*0.0125f*8-1000,real_z*0.0125f*8+2000, 0.0f)/2+0.5f); height *= fnlGetNoise3D(noise, real_x*0.0125f*8+1000,real_z*0.0125f*8+1000, 0.0f)/2+0.5f; height += 1.0f; @@ -54,14 +55,15 @@ float calc_height(fnl_state *noise, int real_x, int real_z){ } float calc_height_faster(fnl_state *noise, int real_x, int real_z){ - float height = fnlGetNoise3D(noise, real_x*0.0125f*8,real_z*0.0125f*8, 0.0f); - height += fnlGetNoise3D(noise, real_x*0.025f*8,real_z*0.025f*8, 0.0f)*0.5f; - height += fnlGetNoise3D(noise, real_x*0.05f*8,real_z*0.05f*8, 0.0f)*0.25f; + float height = 0; + height += fnlGetNoise3D(noise, real_x*0.0125f*8-125567,real_z*0.0125f*8+3546, 0.0f); + height += fnlGetNoise3D(noise, real_x*0.025f*8+4647,real_z*0.025f*8-3436, 0.0f)*0.5f; + height += fnlGetNoise3D(noise, real_x*0.05f*8-834176,real_z*0.05f*8+23678, 0.0f)*0.25f; height += fnlGetNoise3D(noise, - real_x*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8,real_z*0.1f*8, 0.0f)*50, - real_z*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8+4363,real_z*0.1f*8, 0.0f)*50, + real_x*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8-23557,real_z*0.1f*8-6568, 0.0f)*50, + real_z*0.2f*8 + fnlGetNoise3D(noise, real_x*0.1f*8+4363,real_z*0.1f*8+4456, 0.0f)*50, 0.0f)*0.1f; - height += fnlGetNoise3D(noise, real_x*0.1f*8,real_z*0.1f*8, 0.0f)*0.125f; + height += fnlGetNoise3D(noise, real_x*0.1f*8-3465,real_z*0.1f*8+4534, 0.0f)*0.125f; height *= fnlGetNoise3D(noise, real_x*0.0125f*8+1000,real_z*0.0125f*8+1000, 0.0f)/2+0.5f; height += 1.0f; height *= 64.0f; @@ -142,10 +144,10 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ } if (real_y <= 2) id = BLOCK_BEDROCK; - if ((id == 0) && (real_y > 55) && ((int)(height + 0.5f) == real_y) && ((unsigned short)random() > 56000)){ + if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)random() > 56000)){ id = BLOCK_GRASS; } - if ((id == 0) && (real_y > 55) && ((int)(height + 0.5f) == real_y) && ((unsigned short)random() > 64000)){ + if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)random() > 64000)){ id = BLOCK_FLOWER; } voxels[(y * CHUNK_D + z) * CHUNK_W + x].id = id; diff --git a/src/world_render.cpp b/src/world_render.cpp index 48209214..8d85a3fa 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -147,7 +147,7 @@ void WorldRenderer::draw(World* world, Camera* camera, bool occlusion){ if (selectedBlock->model == 1){ lineBatch->box(pos.x+0.5f, pos.y+0.5f, pos.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); } else if (selectedBlock->model == 2){ - lineBatch->box(pos.x+0.4f, pos.y+0.3f, pos.z+0.4f, 0.805f,0.805f,0.805f, 0,0,0,0.5f); + lineBatch->box(pos.x+0.5f, pos.y+0.35f, pos.z+0.5f, 0.805f,0.705f,0.805f, 0,0,0,0.5f); } } } From 900e4ae098762b95a4db3b1e269591bf8d67272b Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Sat, 19 Nov 2022 23:05:33 +0300 Subject: [PATCH 03/19] add block rotate --- src/declarations.cpp | 1 + src/graphics/VoxelRenderer.cpp | 234 ++++++++++++++++++++++++++------- src/hud_render.cpp | 14 +- src/player_control.cpp | 45 ++++--- src/voxel_engine.cpp | 2 +- src/voxels/Block.h | 1 + src/voxels/Chunk.h | 2 +- src/voxels/Chunks.cpp | 3 +- src/voxels/Chunks.h | 2 +- src/voxels/WorldGenerator.cpp | 1 + src/voxels/voxel.h | 1 + 11 files changed, 233 insertions(+), 73 deletions(-) diff --git a/src/declarations.cpp b/src/declarations.cpp index ddb6bd1d..bb85c0c1 100644 --- a/src/declarations.cpp +++ b/src/declarations.cpp @@ -106,6 +106,7 @@ void setup_definitions() { block = new Block(BLOCK_WOOD, 7); block->textureFaces[2] = 8; block->textureFaces[3] = 8; + block->rotatable = true; Block::blocks[block->id] = block; block = new Block(BLOCK_LEAVES, 9); diff --git a/src/graphics/VoxelRenderer.cpp b/src/graphics/VoxelRenderer.cpp index a7b3b953..94f79ce5 100644 --- a/src/graphics/VoxelRenderer.cpp +++ b/src/graphics/VoxelRenderer.cpp @@ -30,7 +30,7 @@ INDEX += CHUNK_VERTEX_SIZE; -#define SETUP_UV(INDEX) float u1 = ((INDEX) % 16) * uvsize;\ +#define SETUP_UV(INDEX) float u1 = ((INDEX) % 16) * uvsize;\ float v1 = 1-((1 + (INDEX) / 16) * uvsize);\ float u2 = u1 + uvsize;\ float v2 = v1 + uvsize; @@ -43,17 +43,41 @@ VoxelRenderer::VoxelRenderer() { VoxelRenderer::~VoxelRenderer(){ } -inline void _renderBlock(std::vector& buffer, int x, int y, int z, const Chunk** chunks, unsigned int id, size_t& index){ +inline void _renderBlock(std::vector& buffer, int x, int y, int z, const Chunk** chunks, voxel vox, size_t& index){ float l; float uvsize = 1.0f/16.0f; - Block* block = Block::blocks[id]; + Block* block = Block::blocks[vox.id]; unsigned char group = block->drawGroup; + int textureCopyFaces[6]; + int rot = 0; + + for (int i=0; i<6; i++){ + textureCopyFaces[i] = block->textureFaces[i]; + } + + if (block->rotatable){ + if (vox.states == 0x31){ + rot = 1; + textureCopyFaces[0] = block->textureFaces[2]; + textureCopyFaces[1] = block->textureFaces[3]; + textureCopyFaces[2] = block->textureFaces[0]; + textureCopyFaces[3] = block->textureFaces[1]; + } else if (vox.states == 0x32){ + rot = 2; + } else if (vox.states == 0x33){ + rot = 3; + textureCopyFaces[2] = block->textureFaces[4]; + textureCopyFaces[3] = block->textureFaces[5]; + textureCopyFaces[4] = block->textureFaces[2]; + textureCopyFaces[5] = block->textureFaces[3]; + } + } if (!IS_BLOCKED(x,y+1,z,group)){ l = 1.0f; - SETUP_UV(block->textureFaces[3]); + SETUP_UV(textureCopyFaces[3]); const float lr = LIGHT(x,y+1,z, 0) / 15.0f; const float lg = LIGHT(x,y+1,z, 1) / 15.0f; @@ -80,18 +104,36 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = (LIGHT(x+1,y+1,z,3) + ls*30 + LIGHT(x+1,y+1,z+1,3) + LIGHT(x,y+1,z+1,3)) / 75.0f; float ls3 = (LIGHT(x+1,y+1,z,3) + ls*30 + LIGHT(x+1,y+1,z-1,3) + LIGHT(x,y+1,z-1,3)) / 75.0f; - VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0, lg0, lb0, ls0); - VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1, lg1, lb1, ls1); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2, lg2, lb2, ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0, lg0, lb0, ls0); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2, lg2, lb2, ls2); - VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v1, lr3, lg3, lb3, ls3); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v1, lr3,lg3,lb3,ls3); + } else if (rot == 1){ + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v1, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr3,lg3,lb3,ls3); + } else if (rot == 3){ + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v1, lr3,lg3,lb3,ls3); + } } if (!IS_BLOCKED(x,y-1,z,group)){ l = 0.75f; - SETUP_UV(block->textureFaces[2]); + SETUP_UV(textureCopyFaces[2]); const float lr = LIGHT(x,y-1,z, 0) / 15.0f; const float lg = LIGHT(x,y-1,z, 1) / 15.0f; @@ -118,19 +160,37 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = (LIGHT(x-1,y-1,z+1,3) + ls*30 + LIGHT(x-1,y-1,z,3) + LIGHT(x,y-1,z+1,3)) / 75.0f; float ls3 = (LIGHT(x+1,y-1,z-1,3) + ls*30 + LIGHT(x+1,y-1,z,3) + LIGHT(x,y-1,z-1,3)) / 75.0f; - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr3,lg3,lb3,ls3); - VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } else if (rot == 1){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v2, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u1,v1, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v2, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u1,v1, lr1,lg1,lb1,ls1); + } else if (rot == 3){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } } if (!IS_BLOCKED(x+1,y,z,group)){ l = 0.95f; - SETUP_UV(block->textureFaces[1]); + SETUP_UV(textureCopyFaces[1]); const float lr = LIGHT(x+1,y,z, 0) / 15.0f; const float lg = LIGHT(x+1,y,z, 1) / 15.0f; @@ -157,18 +217,36 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = (LIGHT(x+1,y+1,z+1,3) + ls*30 + LIGHT(x+1,y,z+1,3) + LIGHT(x+1,y+1,z,3)) / 75.0f; float ls3 = (LIGHT(x+1,y-1,z+1,3) + ls*30 + LIGHT(x+1,y,z+1,3) + LIGHT(x+1,y-1,z,3)) / 75.0f; - VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u1,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u1,v1, lr3,lg3,lb3,ls3); + } else if (rot == 1){ + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr3,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v1, lr1,lg3,lb3,ls3); + } else if (rot == 3){ + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v2, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v1, lr2,lg2,lb2,ls2); + + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v2, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u1,v1, lr3,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v1, lr1,lg3,lb3,ls3); + } } if (!IS_BLOCKED(x-1,y,z,group)){ l = 0.85f; - SETUP_UV(block->textureFaces[0]); + SETUP_UV(textureCopyFaces[0]); const float lr = LIGHT(x-1,y,z, 0) / 15.0f; const float lg = LIGHT(x-1,y,z, 1) / 15.0f; @@ -195,19 +273,37 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = (LIGHT(x-1,y+1,z-1,3) + ls*30 + LIGHT(x-1,y,z-1,3) + LIGHT(x-1,y+1,z,3)) / 75.0f; float ls3 = (LIGHT(x-1,y-1,z+1,3) + ls*30 + LIGHT(x-1,y,z+1,3) + LIGHT(x-1,y-1,z,3)) / 75.0f; - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); - VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } else if (rot == 1){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } else if (rot == 3){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v1, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v2, lr3,lg3,lb3,ls3); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } } if (!IS_BLOCKED(x,y,z+1,group)){ l = 0.9f; - SETUP_UV(block->textureFaces[5]); + SETUP_UV(textureCopyFaces[5]); const float lr = LIGHT(x,y,z+1, 0) / 15.0f; const float lg = LIGHT(x,y,z+1, 1) / 15.0f; @@ -234,18 +330,36 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = l*(LIGHT(x-1,y+1,z+1,3) + ls*30 + LIGHT(x,y+1,z+1,3) + LIGHT(x-1,y,z+1,3)) / 75.0f; float ls3 = l*(LIGHT(x+1,y-1,z+1,3) + ls*30 + LIGHT(x,y-1,z+1,3) + LIGHT(x+1,y,z+1,3)) / 75.0f; - VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); - VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } else if (rot == 1){ + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u2,v1, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u1,v2, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } else if (rot == 3){ + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x-0.5f, y+0.5f, z+0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z+0.5f, u1,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y-0.5f, z+0.5f, u2,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x+0.5f, y+0.5f, z+0.5f, u2,v2, lr1,lg1,lb1,ls1); + } } if (!IS_BLOCKED(x,y,z-1,group)){ l = 0.8f; - SETUP_UV(block->textureFaces[4]); + SETUP_UV(textureCopyFaces[4]); const float lr = LIGHT(x,y,z-1, 0) / 15.0f; const float lg = LIGHT(x,y,z-1, 1) / 15.0f; @@ -272,21 +386,39 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const float ls2 = l*(LIGHT(x+1,y+1,z-1,3) + ls*30 + LIGHT(x,y+1,z-1,3) + LIGHT(x+1,y,z-1,3)) / 75.0f; float ls3 = l*(LIGHT(x+1,y-1,z-1,3) + ls*30 + LIGHT(x,y-1,z-1,3) + LIGHT(x+1,y,z-1,3)) / 75.0f; - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v2, lr1,lg1,lb1,ls1); - VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + if ((rot == 0) || (rot == 2)){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); - VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); - VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u1,v1, lr3,lg3,lb3,ls3); + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u1,v1, lr3,lg3,lb3,ls3); + } else if (rot == 1){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u1,v1, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u2,v2, lr3,lg3,lb3,ls3); + } else if (rot == 3){ + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x-0.5f, y+0.5f, z-0.5f, u2,v2, lr1,lg1,lb1,ls1); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + + VERTEX(index, x-0.5f, y-0.5f, z-0.5f, u2,v1, lr0,lg0,lb0,ls0); + VERTEX(index, x+0.5f, y+0.5f, z-0.5f, u1,v2, lr2,lg2,lb2,ls2); + VERTEX(index, x+0.5f, y-0.5f, z-0.5f, u1,v1, lr3,lg3,lb3,ls3); + } } } -inline void _renderBlockShadeless(std::vector& buffer, int x, int y, int z, const Chunk** chunks, unsigned int id, size_t& index){ +inline void _renderBlockShadeless(std::vector& buffer, int x, int y, int z, const Chunk** chunks, voxel vox, size_t& index){ float l; float uvsize = 1.0f/16.0f; - Block* block = Block::blocks[id]; + Block* block = Block::blocks[vox.id]; unsigned char group = block->drawGroup; if (!IS_BLOCKED(x,y+1,z,group)){ @@ -447,7 +579,7 @@ const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& s if (block->emission[0] || block->emission[1] || block->emission[2]){ continue; } - _renderBlock(buffer, x, y, z, chunks, vox.id, index); + _renderBlock(buffer, x, y, z, chunks, vox, index); } } } @@ -460,7 +592,7 @@ const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& s continue; Block* block = Block::blocks[vox.id]; if (block->emission[0] || block->emission[1] || block->emission[2]){ - _renderBlockShadeless(buffer, x, y, z, chunks, vox.id, index); + _renderBlockShadeless(buffer, x, y, z, chunks, vox, index); } } } @@ -474,7 +606,7 @@ const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& s continue; if (vox.id != 9) continue; - _renderBlock(buffer, x, y, z, chunks, vox.id, index); + _renderBlock(buffer, x, y, z, chunks, vox, index); } } } @@ -500,7 +632,7 @@ const float* VoxelRenderer::render(Chunk* chunk, const Chunk** chunks, size_t& s continue; if (vox.id != 4) continue; - _renderBlock(buffer, x, y, z, chunks, vox.id, index); + _renderBlock(buffer, x, y, z, chunks, vox, index); } } } diff --git a/src/hud_render.cpp b/src/hud_render.cpp index bead34d9..7f7db616 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -126,9 +126,17 @@ void HudRenderer::draw(Level* level, Assets* assets){ int inv_hm = step*8; int inv_w = inv_wm - (step - size); int inv_h = inv_hm - (step - size); + int inv_x = (Window::width - (inv_w)) / 2; + int inv_y = (Window::height - (inv_h)) / 2; int xs = (Window::width - inv_w + step)/2; - int x = 0; int ys = (Window::height - inv_h + step)/2; + if (Window::width > inv_wm*3){ + inv_x = (Window::width + (inv_w)) / 2; + inv_y = (Window::height - (inv_h)) / 2; + xs = (Window::width + inv_w + step)/2; + ys = (Window::height - inv_h + step)/2; + } + int x = 0; int y = 0; vec4 tint = vec4(1.0f); int mx = Events::x; @@ -139,11 +147,11 @@ void HudRenderer::draw(Level* level, Assets* assets){ batch->texture(nullptr); batch->color = vec4(0.0f, 0.0f, 0.0f, 0.3f); batch->rect(0, 0, Window::width, Window::height); - batch->rect((Window::width - (inv_w)) / 2 - 4, (Window::height - (inv_h)) / 2 - 4, inv_w+8, inv_h+8, + batch->rect(inv_x - 4, inv_y - 4, inv_w+8, inv_h+8, 0.95f, 0.95f, 0.95f, 0.85f, 0.85f, 0.85f, 0.7f, 0.7f, 0.7f, 0.55f, 0.55f, 0.55f, 0.45f, 0.45f, 0.45f, 4); - batch->rect((Window::width - (inv_w)) / 2, (Window::height - (inv_h)) / 2, inv_w, inv_h, + batch->rect(inv_x, inv_y, inv_w, inv_h, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 4); diff --git a/src/player_control.cpp b/src/player_control.cpp index 7bc654c6..de20e347 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -176,33 +176,48 @@ void PlayerController::update_interaction(){ if (vox != nullptr){ selectedBlockId = vox->id; selectedBlockPosition = iend; + int x = (int)iend.x; + int y = (int)iend.y; + int z = (int)iend.z; + uint8_t states; + + if (Block::blocks[player->choosenBlock]->rotatable){ + states = states & 0b11111100; + // if (abs(norm.x) > abs(norm.z)){ + // if (abs(norm.x) > abs(norm.y)) states = states | 0b00000001; + // if (abs(norm.x) < abs(norm.y)) states = states | 0b00000010; + // } + // if (abs(norm.x) < abs(norm.z)){ + // if (abs(norm.z) > abs(norm.y)) states = states | 0b00000011; + // if (abs(norm.z) < abs(norm.y)) states = states | 0b00000010; + // } + if (abs(norm.x) > abs(norm.z)){ + if (abs(norm.x) > abs(norm.y)) states = 0x31; + if (abs(norm.x) < abs(norm.y)) states = 0x32; + } + if (abs(norm.x) < abs(norm.z)){ + if (abs(norm.z) > abs(norm.y)) states = 0x33; + if (abs(norm.z) < abs(norm.y)) states = 0x32; + } + } Block* block = Block::blocks[vox->id]; if (Events::jclicked(GLFW_MOUSE_BUTTON_1) && block->breakable){ - int x = (int)iend.x; - int y = (int)iend.y; - int z = (int)iend.z; - chunks->set(x,y,z, 0); + chunks->set(x,y,z, 0, 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 (block->model == BLOCK_MODEL_X_SPRITE){ - x = (int)iend.x; - y = (int)iend.y; - z = (int)iend.z; + if (block->model != BLOCK_MODEL_X_SPRITE){ + x = (int)(iend.x)+(int)(norm.x); + y = (int)(iend.y)+(int)(norm.y); + z = (int)(iend.z)+(int)(norm.z); } if (!level->physics->isBlockInside(x,y,z, player->hitbox)){ - chunks->set(x, y, z, player->choosenBlock); + chunks->set(x, y, z, player->choosenBlock, states); lighting->onBlockSet(x,y,z, player->choosenBlock); } } if (Events::jclicked(GLFW_MOUSE_BUTTON_3)){ - int x = (int)iend.x; - int y = (int)iend.y; - int z = (int)iend.z; player->choosenBlock = chunks->get(x,y,z)->id; } } else { diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 7f232955..e340a2d6 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -178,7 +178,7 @@ int main() { if (status) return status; std::cout << "-- loading world" << std::endl; - vec3 playerPosition = vec3(0,150,0); + vec3 playerPosition = vec3(0,64,0); Camera* camera = new Camera(playerPosition, radians(90.0f)); World* world = new World("world-1", "world/", 42); Player* player = new Player(playerPosition, 4.0f, camera); diff --git a/src/voxels/Block.h b/src/voxels/Block.h index 561c741b..2b6c4832 100644 --- a/src/voxels/Block.h +++ b/src/voxels/Block.h @@ -19,6 +19,7 @@ public: bool obstacle = true; bool selectable = true; bool breakable = true; + bool rotatable = false; float hitboxScale = 1; float hitboxY = 1; diff --git a/src/voxels/Chunk.h b/src/voxels/Chunk.h index 1ff29b7a..18d6f28b 100644 --- a/src/voxels/Chunk.h +++ b/src/voxels/Chunk.h @@ -6,7 +6,7 @@ #define CHUNK_W 16 #define CHUNK_H 256 #define CHUNK_D 16 -#define CHUNK_VOL (CHUNK_W * CHUNK_H * CHUNK_D) +#define CHUNK_VOL (CHUNK_W * CHUNK_H * CHUNK_D * 2) #define CHUNK_MODIFIED 0x1 #define CHUNK_READY 0x2 diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index b16aecd5..4dd538cf 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -123,7 +123,7 @@ Chunk* Chunks::getChunk(int x, int z){ return chunks[z * w + x]; } -void Chunks::set(int x, int y, int z, int id){ +void Chunks::set(int x, int y, int z, int id, uint8_t states){ x -= ox * CHUNK_W; z -= oz * CHUNK_D; int cx = x / CHUNK_W; @@ -140,6 +140,7 @@ void Chunks::set(int x, int y, int z, int id){ int lx = x - cx * CHUNK_W; int lz = z - cz * CHUNK_D; chunk->voxels[(y * CHUNK_D + lz) * CHUNK_W + lx].id = id; + chunk->voxels[(y * CHUNK_D + lz) * CHUNK_W + lx].states = states; chunk->setUnsaved(true); chunk->setModified(true); diff --git a/src/voxels/Chunks.h b/src/voxels/Chunks.h index 5b5f9a3a..b8268a77 100644 --- a/src/voxels/Chunks.h +++ b/src/voxels/Chunks.h @@ -34,7 +34,7 @@ public: voxel* get(int x, int y, int z); unsigned short getLight(int x, int y, int z); unsigned char getLight(int x, int y, int z, int channel); - void set(int x, int y, int z, int id); + void set(int x, int y, int z, int id, uint8_t states); voxel* rayCast(vec3 start, vec3 dir, float maxLength, vec3& end, vec3& norm, vec3& iend); bool isObstacle(int x, int y, int z); diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index eaf155f7..a028c5fd 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -151,6 +151,7 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ id = BLOCK_FLOWER; } voxels[(y * CHUNK_D + z) * CHUNK_W + x].id = id; + voxels[(y * CHUNK_D + z) * CHUNK_W + x].states = 0x32; } } } diff --git a/src/voxels/voxel.h b/src/voxels/voxel.h index 4e758376..15eae23a 100644 --- a/src/voxels/voxel.h +++ b/src/voxels/voxel.h @@ -5,6 +5,7 @@ struct voxel { uint8_t id; + uint8_t states; }; #endif /* VOXELS_VOXEL_H_ */ From fea123bc5f6c5ec68967ba98a3a1e2db5c75e794 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Sat, 19 Nov 2022 23:11:50 +0300 Subject: [PATCH 04/19] inventory fix --- src/hud_render.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 7f7db616..f724b965 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -130,7 +130,7 @@ void HudRenderer::draw(Level* level, Assets* assets){ int inv_y = (Window::height - (inv_h)) / 2; int xs = (Window::width - inv_w + step)/2; int ys = (Window::height - inv_h + step)/2; - if (Window::width > inv_wm*3){ + if (Window::width > inv_w*3){ inv_x = (Window::width + (inv_w)) / 2; inv_y = (Window::height - (inv_h)) / 2; xs = (Window::width + inv_w + step)/2; From f04bac6b4366bc4d4076a1409c6d09b9af5343e2 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Thu, 1 Dec 2022 20:37:30 +0300 Subject: [PATCH 05/19] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D1=81=D0=B3=D0=BB=D0=B0=D0=B6=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/block.png.old | Bin 8247 -> 16462 bytes res/block.png.old.old | Bin 0 -> 8247 bytes src/graphics/Batch2D.cpp | 6 +++- src/hud_render.cpp | 5 ++-- src/hud_render.h | 2 +- src/voxel_engine.cpp | 4 +-- src/voxels/WorldGenerator.cpp | 52 +++++++++++++++++++++------------ src/window/Window.cpp | 4 ++- src/world_render.cpp | 53 ++++++++++++++++++++++++++++------ src/world_render.h | 2 +- 10 files changed, 92 insertions(+), 36 deletions(-) create mode 100644 res/block.png.old.old diff --git a/res/block.png.old b/res/block.png.old index 5e2512c7d531cc21c8c2cb913134d300f2800ef2..1fb83555b47ec08165c4766b34984bbb86dd6ee1 100644 GIT binary patch literal 16462 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 literal 8247 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 + 18*VERTEX_SIZE >= capacity) + // if (this->index + 18*VERTEX_SIZE >= capacity) render(); float ar = 0.88f; @@ -258,6 +258,10 @@ void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int vertex(points[0], uvpoints[6], tint.r, tint.g, tint.b, tint.a); vertex(points[6], uvpoints[4], tint.r, tint.g, tint.b, tint.a); vertex(points[1], uvpoints[7], tint.r, tint.g, tint.b, tint.a); + + glDisable(GL_MULTISAMPLE); + render(); + glEnable(GL_MULTISAMPLE); } void Batch2D::rect(float x, float y, float w, float h, diff --git a/src/hud_render.cpp b/src/hud_render.cpp index f724b965..f4d57285 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -65,7 +65,7 @@ void HudRenderer::drawDebug(Level* level, Assets* assets, int fps, bool occlusio } -void HudRenderer::draw(Level* level, Assets* assets){ +void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ uicamera->fov = Window::height; glDisable(GL_DEPTH_TEST); @@ -210,11 +210,12 @@ void HudRenderer::draw(Level* level, Assets* assets){ batch->render(); - if (Events::_cursor_locked){ + if (Events::_cursor_locked && !devdata){ Shader* crosshairShader = assets->getShader("crosshair"); crosshairShader->use(); crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); + glLineWidth(2.0f); crosshair->draw(GL_LINES); } } diff --git a/src/hud_render.h b/src/hud_render.h index 08984627..37b40225 100644 --- a/src/hud_render.h +++ b/src/hud_render.h @@ -14,7 +14,7 @@ class HudRenderer { public: HudRenderer(); ~HudRenderer(); - void draw(Level* level, Assets* assets); + void draw(Level* level, Assets* assets, bool devdata); void drawDebug(Level* level, Assets* assets, int fps, bool occlusion); }; diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index e340a2d6..085fdef5 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -159,8 +159,8 @@ void mainloop(Level* level, Assets* assets) { for (int i = 0; i < freeLoaders; i++) level->chunksController->loadVisible(world->wfile); - worldRenderer.draw(world, camera, occlusion); - hud.draw(level, assets); + worldRenderer.draw(world, camera, occlusion, devdata); + hud.draw(level, assets, devdata); if (devdata) { hud.drawDebug(level, assets, fps, occlusion); } diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index a028c5fd..25e67ad2 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -31,7 +31,11 @@ public: } void setSeed(int number){ - seed = ((unsigned short)number+23729 xor (unsigned short)number+16786); + seed = ((unsigned short)(number*23729) xor (unsigned short)(number+16786)); + rand(); + } + void setSeed(int number1,int number2){ + seed = (((unsigned short)(number1*23729) or (unsigned short)(number2%16786)) xor (unsigned short)(number2*number1)); rand(); } }; @@ -70,27 +74,28 @@ float calc_height_faster(fnl_state *noise, int real_x, int real_z){ return height; } -int generate_tree(fnl_state *noise, PseudoRandom* random, const float* heights, int real_x, int real_y, int real_z, int tileSize){ +int generate_tree(fnl_state *noise, PseudoRandom* random, float* heights, int real_x, int real_y, int real_z, int tileSize){ const int tileX = floor((double)real_x/(double)tileSize); - const int tileY = floor((double)real_z/(double)tileSize); - random->setSeed(tileX*4325261+tileY*12160951+tileSize*9431111); + const int tileZ = floor((double)real_z/(double)tileSize); + random->setSeed(tileX*4325261+tileZ*12160951+tileSize*9431111); - bool gentree = fnlGetNoise3D(noise, tileX*3.0f+633, 0.0, tileY*3.0f) > -0.1f && (random->rand() % 10) < 7; + bool gentree = fnlGetNoise3D(noise, tileX*3.0f+633, 0.0, tileZ*3.0f) > -0.1f && (random->rand() % 10) < 7; if (!gentree) return 0; const int randomX = (random->rand() % (tileSize/2)) - tileSize/4; const int randomZ = (random->rand() % (tileSize/2)) - tileSize/4; int centerX = tileX * tileSize + tileSize/2 + randomX; - int centerY = tileY * tileSize + tileSize/2 + randomZ; - int height = (int)calc_height_faster(noise, centerX, centerY); - if ((height < 57) || (fnlGetNoise3D(noise, real_x*0.025f,real_z*0.025f, 0.0f)*0.5f > 0.5)) + int centerZ = tileZ * tileSize + tileSize/2 + randomZ; + // int height = (int)(heights[centerX*CHUNK_W+centerZ]); + int height = (int)calc_height_faster(noise, centerX, centerZ); + if ((height < 57)/* || (fnlGetNoise3D(noise, real_x*0.025f,real_z*0.025f, 0.0f)*0.5f > 0.5)*/) return 0; int lx = real_x - centerX; - int radius = random->rand() % 4 + 3; + int radius = random->rand() % 4 + 2; int ly = real_y - height - 3 * radius; - int lz = real_z - centerY; - if (lx == 0 && lz == 0 && real_y - height < 4*radius) + int lz = real_z - centerZ; + if (lx == 0 && lz == 0 && real_y - height < (3*radius + radius/2)) return 6; if (lx*lx+ly*ly/2+lz*lz < radius*radius) return 7; @@ -102,6 +107,7 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ noise.noise_type = FNL_NOISE_OPENSIMPLEX2; noise.seed = seed * 60617077 % 25896307; PseudoRandom randomtree; + PseudoRandom randomgrass; float heights[CHUNK_VOL]; @@ -123,6 +129,7 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ for (int y = 0; y < CHUNK_H; y++){ int real_y = y; int id = real_y < 55 ? BLOCK_WATER : BLOCK_AIR; + int states = 0; if ((real_y == (int)height) && (54 < real_y)) { id = BLOCK_GRASS_BLOCK; } else if (real_y < (height - 6)){ @@ -130,13 +137,14 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ } else if (real_y < height){ id = BLOCK_DIRT; } else { - int tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 16); + int tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 23); if (tree) { id = tree; - } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 19))){ - id = tree; - } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 23))){ - id = tree; + states = 0x32; + // } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 19))){ + // id = tree; + // } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 23))){ + // id = tree; } } if ( ((height - (1.5 - 0.2 * pow(height - 54, 4))) < real_y) && (real_y < height)){ @@ -144,14 +152,20 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cz, int seed){ } if (real_y <= 2) id = BLOCK_BEDROCK; - if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)random() > 56000)){ + + randomgrass.setSeed(real_x,real_z); + if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)randomgrass.rand() > 56000)){ id = BLOCK_GRASS; } - if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)random() > 64000)){ + if ((id == 0) && (height > 55.5) && ((int)(height + 1) == real_y) && ((unsigned short)randomgrass.rand() > 65000)){ id = BLOCK_FLOWER; } + if ((height > 56) && ((int)(height + 1) == real_y) && ((unsigned short)randomgrass.rand() > 65533)){ + id = BLOCK_WOOD; + states = 0x32; + } voxels[(y * CHUNK_D + z) * CHUNK_W + x].id = id; - voxels[(y * CHUNK_D + z) * CHUNK_W + x].states = 0x32; + voxels[(y * CHUNK_D + z) * CHUNK_W + x].states = states; } } } diff --git a/src/window/Window.cpp b/src/window/Window.cpp index 9031edc7..b48f4b0a 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -13,7 +13,7 @@ int Window::initialize(int width, int height, const char* title){ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); - //glfwWindowHint(GLFW_SAMPLES, 2); + glfwWindowHint(GLFW_SAMPLES, 16); window = glfwCreateWindow(width, height, title, nullptr, nullptr); if (window == nullptr){ @@ -34,6 +34,8 @@ int Window::initialize(int width, int height, const char* title){ glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); + glEnable(GL_MULTISAMPLE); + // glDisable(GL_MULTISAMPLE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Window::width = width; diff --git a/src/world_render.cpp b/src/world_render.cpp index 8d85a3fa..e7f08930 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -2,6 +2,7 @@ #include #include "graphics/VoxelRenderer.h" +#include #include "window/Window.h" #include "window/Camera.h" @@ -63,15 +64,16 @@ bool WorldRenderer::drawChunk(size_t index, Camera* camera, Shader* shader, bool } } } - mat4 model = glm::translate(mat4(1.0f), vec3(chunk->x*CHUNK_W+0.5f, 0.5f, chunk->z*CHUNK_D+0.5f)); shader->uniformMatrix("u_model", model); + glDisable(GL_MULTISAMPLE); mesh->draw(GL_TRIANGLES); + glEnable(GL_MULTISAMPLE); return false; } -void WorldRenderer::draw(World* world, Camera* camera, bool occlusion){ +void WorldRenderer::draw(World* world, Camera* camera, bool occlusion, bool devdata){ Chunks* chunks = level->chunks; vec4 skyColor(0.7f, 0.81f, 1.0f, 1.0f); @@ -133,21 +135,54 @@ void WorldRenderer::draw(World* world, Camera* camera, bool occlusion){ // draw 3D stuff here batch3d->render(); - linesShader->use(); - linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); - glLineWidth(2.0f); - lineBatch->line(camera->position.x, camera->position.y-0.1f, camera->position.z, camera->position.x+0.01f, camera->position.y-0.1f, camera->position.z, 1, 0, 0, 1); - lineBatch->line(camera->position.x, camera->position.y-0.1f, camera->position.z, camera->position.x, camera->position.y-0.1f, camera->position.z+0.01f, 0, 0, 1, 1); - lineBatch->line(camera->position.x, camera->position.y-0.1f, camera->position.z, camera->position.x, camera->position.y-0.1f+0.01f, camera->position.z, 0, 1, 0, 1); - lineBatch->render(); + if (devdata) { + linesShader->use(); + linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); + + vec3 point = vec3(camera->position.x+camera->front.x/1, + camera->position.y+camera->front.y/1, + camera->position.z+camera->front.z/1); + + glDisable(GL_DEPTH_TEST); + + glLineWidth(3.0f); + lineBatch->line(point.x, point.y, point.z, + point.x+0.1f, point.y, point.z, + 0, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y, point.z+0.1f, + 0, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y+0.1f, point.z, + 0, 0, 0, 1); + lineBatch->render(); + + glLineWidth(1.0f); + lineBatch->line(point.x, point.y, point.z, + point.x+0.1f, point.y, point.z, + 1, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y, point.z+0.1f, + 0, 0, 1, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y+0.1f, point.z, + 0, 1, 0, 1); + lineBatch->render(); + + glEnable(GL_DEPTH_TEST); + } if (level->playerController->selectedBlockId != -1){ Block* selectedBlock = Block::blocks[level->playerController->selectedBlockId]; vec3 pos = level->playerController->selectedBlockPosition; + linesShader->use(); + linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); + glLineWidth(2.0f); if (selectedBlock->model == 1){ lineBatch->box(pos.x+0.5f, pos.y+0.5f, pos.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); } else if (selectedBlock->model == 2){ lineBatch->box(pos.x+0.5f, pos.y+0.35f, pos.z+0.5f, 0.805f,0.705f,0.805f, 0,0,0,0.5f); } + lineBatch->render(); } } diff --git a/src/world_render.h b/src/world_render.h index d237ed29..64ff8c63 100644 --- a/src/world_render.h +++ b/src/world_render.h @@ -37,7 +37,7 @@ public: WorldRenderer(Level* level, Assets* assets); ~WorldRenderer(); - void draw(World* world, Camera* camera, bool occlusion); + void draw(World* world, Camera* camera, bool occlusion, bool devdata); }; From a1f9155498cc0ed06c9cf9b11d97bc862b86b340 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Thu, 8 Dec 2022 01:03:12 +0300 Subject: [PATCH 06/19] ui update,many fixes --- src/graphics/Batch2D.cpp | 213 +++++++++++++++++++--------------- src/graphics/Batch2D.h | 6 +- src/graphics/Font.cpp | 32 ++--- src/graphics/Font.h | 2 +- src/graphics/Framebuffer.cpp | 56 ++++++--- src/graphics/Texture.cpp | 9 ++ src/hud_render.cpp | 51 ++++---- src/hud_render.h | 2 +- src/loaders/png_loading.cpp | 38 +++++- src/player_control.cpp | 35 +++--- src/voxels/WorldGenerator.cpp | 2 +- src/world_render.cpp | 74 ++++++------ 12 files changed, 312 insertions(+), 208 deletions(-) diff --git a/src/graphics/Batch2D.cpp b/src/graphics/Batch2D.cpp index 94368bce..c0029d3a 100644 --- a/src/graphics/Batch2D.cpp +++ b/src/graphics/Batch2D.cpp @@ -62,7 +62,7 @@ void Batch2D::vertex(vec2 point, void Batch2D::texture(Texture* new_texture){ if (_texture == new_texture) return; - render(); + render(GL_TRIANGLES); _texture = new_texture; if (new_texture == nullptr) blank->bind(); @@ -70,21 +70,39 @@ void Batch2D::texture(Texture* new_texture){ new_texture->bind(); } +void Batch2D::point(float x, float y, float r, float g, float b, float a){ + // if (index + 6*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); + + vertex(x, y, 0, 0, r,g,b,a); + render(GL_POINTS); +} + +void Batch2D::line(float x1, float y1, float x2, float y2, float r, float g, float b, float a){ + // if (index + 6*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); + + vertex(x1, y1, 0, 0, r,g,b,a); + vertex(x2, y2, 1, 1, r,g,b,a); + render(GL_LINES); +} + void Batch2D::rect(float x, float y, float w, float h){ const float r = color.r; const float g = color.g; const float b = color.b; const float a = color.a; - if (index + 6*VERTEX_SIZE >= capacity) - render(); + // if (index + 6*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); vertex(x, y, 0, 0, r,g,b,a); - vertex(x+w, y+h, 1, 1, r,g,b,a); vertex(x, y+h, 0, 1, r,g,b,a); + vertex(x+w, y+h, 1, 1, r,g,b,a); vertex(x, y, 0, 0, r,g,b,a); - vertex(x+w, y, 1, 0, r,g,b,a); vertex(x+w, y+h, 1, 1, r,g,b,a); + vertex(x+w, y, 1, 0, r,g,b,a); + render(GL_TRIANGLES); } void Batch2D::rect( @@ -96,8 +114,8 @@ void Batch2D::rect( bool flippedX, bool flippedY, vec4 tint) { - if (index + 6*VERTEX_SIZE >= capacity) - render(); + // if (index + 6*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); float centerX = w*ox; float centerY = h*oy; @@ -179,96 +197,14 @@ void Batch2D::rect( vertex(x1, y1, u1, v1, tint.r, tint.g, tint.b, tint.a); vertex(x3, y3, u3, v3, tint.r, tint.g, tint.b, tint.a); vertex(x4, y4, u4, v4, tint.r, tint.g, tint.b, tint.a); -} - -void Batch2D::sprite(Sprite* sprite) { - vec2 position = sprite->position; - vec2 size = sprite->size; - vec2 origin = sprite->origin; - texture(sprite->texture); - rect( - position.x, position.y, - size.x, size.y, - origin.x, origin.y, - sprite->angle, - sprite->region, - sprite->flippedX, - sprite->flippedY, - sprite->color); -} - -void Batch2D::sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint){ - float scale = 1.0f / (float)atlasRes; - float u = (index % atlasRes) * scale; - float v = 1.0f - ((index / atlasRes) * scale) - scale; - rect(x, y, w, h, u, v, scale, scale, tint.r, tint.g, tint.b, tint.a); -} - -void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int index[6], vec4 tint){ - float scale = 1.0f / (float)atlasRes; - float uu = (index[3] % atlasRes) * scale; - float vu = 1.0f - ((index[3] / atlasRes) * scale) - scale; - float uf = (index[0] % atlasRes) * scale; - float vf = 1.0f - ((index[0] / atlasRes) * scale) - scale; - // if (this->index + 18*VERTEX_SIZE >= capacity) - render(); - - float ar = 0.88f; - float ox = x + (w * 0.5f); - float sx = w * 0.5f * ar; - vec2 points[7] = {vec2(ox, y+(h*0.5f)), - vec2(ox-sx, y+(h*0.25f)), - vec2(ox, y), - vec2(ox+sx, y+(h*0.25f)), - vec2(ox+sx, y+(h*0.75f)), - vec2(ox, y+h), - vec2(ox-sx, y+(h*0.75f))}; - - vec2 uvpoints[8] = {vec2(uu, vu), - vec2(uu+scale, vu), - vec2(uu+scale, vu+scale), - vec2(uu, vu+scale), - vec2(uf, vf), - vec2(uf+scale, vf), - vec2(uf+scale, vf+scale), - vec2(uf, vf+scale)}; - - vertex(points[0], uvpoints[3], tint.r, tint.g, tint.b, tint.a); - vertex(points[1], uvpoints[0], tint.r, tint.g, tint.b, tint.a); - vertex(points[2], uvpoints[1], tint.r, tint.g, tint.b, tint.a); - - vertex(points[0], uvpoints[3], tint.r, tint.g, tint.b, tint.a); - vertex(points[2], uvpoints[1], tint.r, tint.g, tint.b, tint.a); - vertex(points[3], uvpoints[2], tint.r, tint.g, tint.b, tint.a); - - - vertex(points[0], uvpoints[7], tint.r, tint.g, tint.b, tint.a); - vertex(points[3], uvpoints[6], tint.r, tint.g, tint.b, tint.a); - vertex(points[4], uvpoints[5], tint.r, tint.g, tint.b, tint.a); - - vertex(points[0], uvpoints[7], tint.r, tint.g, tint.b, tint.a); - vertex(points[4], uvpoints[5], tint.r, tint.g, tint.b, tint.a); - vertex(points[5], uvpoints[4], tint.r, tint.g, tint.b, tint.a); - - - vertex(points[0], uvpoints[6], tint.r, tint.g, tint.b, tint.a); - vertex(points[5], uvpoints[5], tint.r, tint.g, tint.b, tint.a); - vertex(points[6], uvpoints[4], tint.r, tint.g, tint.b, tint.a); - - vertex(points[0], uvpoints[6], tint.r, tint.g, tint.b, tint.a); - vertex(points[6], uvpoints[4], tint.r, tint.g, tint.b, tint.a); - vertex(points[1], uvpoints[7], tint.r, tint.g, tint.b, tint.a); - - glDisable(GL_MULTISAMPLE); - render(); - glEnable(GL_MULTISAMPLE); + render(GL_TRIANGLES); } void Batch2D::rect(float x, float y, float w, float h, float u, float v, float tx, float ty, float r, float g, float b, float a){ - if (index + 6*VERTEX_SIZE >= capacity) - render(); + // if (index + 6*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); vertex(x, y, u, v+ty, r,g,b,a); vertex(x+w, y+h, u+tx, v, r,g,b,a); vertex(x, y+h, u, v, r,g,b,a); @@ -276,6 +212,7 @@ void Batch2D::rect(float x, float y, float w, float h, vertex(x, y, u, v+ty, r,g,b,a); vertex(x+w, y, u+tx, v+ty, r,g,b,a); vertex(x+w, y+h, u+tx, v, r,g,b,a); + render(GL_TRIANGLES); } void Batch2D::rect(float x, float y, float w, float h, @@ -284,8 +221,8 @@ void Batch2D::rect(float x, float y, float w, float h, float r2, float g2, float b2, float r3, float g3, float b3, float r4, float g4, float b4, int sh){ - if (index + 30*VERTEX_SIZE >= capacity) - render(); + // if (index + 30*VERTEX_SIZE >= capacity) + // render(GL_TRIANGLES); vec2 v0 = vec2(x+h/2,y+h/2); vec2 v1 = vec2(x+w-sh,y); vec2 v2 = vec2(x+sh,y); @@ -336,10 +273,94 @@ void Batch2D::rect(float x, float y, float w, float h, vertex(v6, vec2(0, 0), r2,g2,b2,1.0f); vertex(v9, vec2(0, 0), r2,g2,b2,1.0f); vertex(v1, vec2(0, 0), r2,g2,b2,1.0f); + render(GL_TRIANGLES); } -void Batch2D::render() { +void Batch2D::sprite(Sprite* sprite) { + vec2 position = sprite->position; + vec2 size = sprite->size; + vec2 origin = sprite->origin; + texture(sprite->texture); + rect( + position.x, position.y, + size.x, size.y, + origin.x, origin.y, + sprite->angle, + sprite->region, + sprite->flippedX, + sprite->flippedY, + sprite->color); +} + +void Batch2D::sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint){ + float scale = 1.0f / (float)atlasRes; + float u = (index % atlasRes) * scale; + float v = 1.0f - ((index / atlasRes) * scale) - scale; + rect(x, y, w, h, u, v, scale, scale, tint.r, tint.g, tint.b, tint.a); +} + +void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int index[6], vec4 tint){ + float scale = 1.0f / (float)atlasRes; + float uu = (index[3] % atlasRes) * scale; + float vu = 1.0f - ((index[3] / atlasRes) * scale) - scale; + float uf = (index[0] % atlasRes) * scale; + float vf = 1.0f - ((index[0] / atlasRes) * scale) - scale; + // if (this->index + 18*VERTEX_SIZE >= capacity) + // render(); + + float ar = 0.88f; + float ox = x + (w * 0.5f); + float sx = w * 0.5f * ar; + vec2 points[7] = {vec2(ox, y+(h*0.5f)), + vec2(ox-sx, y+(h*0.25f)), + vec2(ox, y), + vec2(ox+sx, y+(h*0.25f)), + vec2(ox+sx, y+(h*0.75f)), + vec2(ox, y+h), + vec2(ox-sx, y+(h*0.75f))}; + + vec2 uvpoints[8] = {vec2(uu, vu), + vec2(uu+scale, vu), + vec2(uu+scale, vu+scale), + vec2(uu, vu+scale), + vec2(uf, vf), + vec2(uf+scale, vf), + vec2(uf+scale, vf+scale), + vec2(uf, vf+scale)}; + + vertex(points[0], uvpoints[3], tint.r, tint.g, tint.b, tint.a); + vertex(points[1], uvpoints[0], tint.r, tint.g, tint.b, tint.a); + vertex(points[2], uvpoints[1], tint.r, tint.g, tint.b, tint.a); + + vertex(points[0], uvpoints[3], tint.r, tint.g, tint.b, tint.a); + vertex(points[2], uvpoints[1], tint.r, tint.g, tint.b, tint.a); + vertex(points[3], uvpoints[2], tint.r, tint.g, tint.b, tint.a); + + + vertex(points[0], uvpoints[7], tint.r, tint.g, tint.b, tint.a); + vertex(points[3], uvpoints[6], tint.r, tint.g, tint.b, tint.a); + vertex(points[4], uvpoints[5], tint.r, tint.g, tint.b, tint.a); + + vertex(points[0], uvpoints[7], tint.r, tint.g, tint.b, tint.a); + vertex(points[4], uvpoints[5], tint.r, tint.g, tint.b, tint.a); + vertex(points[5], uvpoints[4], tint.r, tint.g, tint.b, tint.a); + + + vertex(points[0], uvpoints[6], tint.r, tint.g, tint.b, tint.a); + vertex(points[5], uvpoints[5], tint.r, tint.g, tint.b, tint.a); + vertex(points[6], uvpoints[4], tint.r, tint.g, tint.b, tint.a); + + vertex(points[0], uvpoints[6], tint.r, tint.g, tint.b, tint.a); + vertex(points[6], uvpoints[4], tint.r, tint.g, tint.b, tint.a); + vertex(points[1], uvpoints[7], tint.r, tint.g, tint.b, tint.a); + + glDisable(GL_MULTISAMPLE); + render(GL_TRIANGLES); + glEnable(GL_MULTISAMPLE); +} + +void Batch2D::render(unsigned int gl_primitive) { mesh->reload(buffer, index / VERTEX_SIZE); - mesh->draw(GL_TRIANGLES); + mesh->draw(gl_primitive); index = 0; } diff --git a/src/graphics/Batch2D.h b/src/graphics/Batch2D.h index ac89c884..b8c45c03 100644 --- a/src/graphics/Batch2D.h +++ b/src/graphics/Batch2D.h @@ -20,7 +20,7 @@ class Batch2D { size_t index; Texture* blank; - Texture* _texture; + Texture* _texture; void vertex(float x, float y, float u, float v, @@ -40,6 +40,8 @@ public: void sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint); void sprite(Sprite* sprite); void blockSprite(float x, float y, float w, float h, int atlasRes, int index[6], vec4 tint); + void point(float x, float y, float r, float g, float b, float a); + void line(float x1, float y1, float x2, float y2, float r, float g, float b, float a); void rect(float x, float y, float w, float h, float ox, float oy, @@ -58,7 +60,7 @@ public: float r2, float g2, float b2, float r3, float g3, float b3, float r4, float g4, float b4, int sh); - void render(); + void render(unsigned int gl_primitive); }; #endif /* SRC_GRAPHICS_BATCH2D_H_ */ diff --git a/src/graphics/Font.cpp b/src/graphics/Font.cpp index 3e881503..56dd8eef 100644 --- a/src/graphics/Font.cpp +++ b/src/graphics/Font.cpp @@ -10,21 +10,21 @@ Font::~Font(){ delete texture; } -int Font::getGlyphWidth(char c) { - switch (c){ - case 'l': - case 'i': - case 'j': - case '|': - case '.': - case ',': - case ':': - case ';': return 7; - case 't': return 8; - case ' ': return 7; - } - return 7; -} +// int Font::getGlyphWidth(char c) { +// switch (c){ +// case 'l': +// case 'i': +// case 'j': +// case '|': +// case '.': +// case ',': +// case ':': +// case ';': return 7; +// case 't': return 8; +// case ' ': return 7; +// } +// return 7; +// } bool Font::isPrintableChar(int c) { @@ -81,7 +81,7 @@ void Font::draw(Batch2D* batch, std::wstring text, int x, int y, int style) { next = charpage; } } - x += getGlyphWidth(c); + x += 8;//getGlyphWidth(c); } page = next; next = 10000; diff --git a/src/graphics/Font.h b/src/graphics/Font.h index db1fdcda..e9418cbc 100644 --- a/src/graphics/Font.h +++ b/src/graphics/Font.h @@ -17,7 +17,7 @@ public: Font(std::vector pages); ~Font(); - int getGlyphWidth(char c); + // int getGlyphWidth(char c); bool isPrintableChar(int c); void draw(Batch2D* batch, std::wstring text, int x, int y); void draw(Batch2D* batch, std::wstring text, int x, int y, int style); diff --git a/src/graphics/Framebuffer.cpp b/src/graphics/Framebuffer.cpp index 287be8e5..f08a55f4 100644 --- a/src/graphics/Framebuffer.cpp +++ b/src/graphics/Framebuffer.cpp @@ -4,23 +4,45 @@ #include "Texture.h" Framebuffer::Framebuffer(int width, int height) : width(width), height(height) { - glGenFramebuffers(1, &fbo); - bind(); - GLuint tex; - glGenTextures(1, &tex); - glBindTexture(GL_TEXTURE_2D, tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); - texture = new Texture(tex, width, height); - glGenRenderbuffers(1, &depth); - glBindRenderbuffer(GL_RENDERBUFFER, depth); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth); - unbind(); + // glGenFramebuffers(1, &fbo); + // bind(); + // GLuint tex; + // glGenTextures(1, &tex); + // // glBindTexture(GL_TEXTURE_2D, tex); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex); + // // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); + // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, width, height, GL_TRUE); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + // glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0); + // texture = new Texture(tex, width, height); + // glGenRenderbuffers(1, &depth); + // glBindRenderbuffer(GL_RENDERBUFFER, depth); + // glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, width, height); + // // glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); + // glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth); + // unbind(); + + + // bind(); + // glGenFramebuffers(1, &fbo); + // // create a multisampled color attachment texture + // unsigned int textureColorBufferMultiSampled; + // glGenTextures(1, &textureColorBufferMultiSampled); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureColorBufferMultiSampled); + // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, width, height, GL_TRUE); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); + // glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, textureColorBufferMultiSampled, 0); + // // create a (also multisampled) renderbuffer object for depth and stencil attachments + // unsigned int rbo; + // glGenRenderbuffers(1, &rbo); + // glBindRenderbuffer(GL_RENDERBUFFER, rbo); + // glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, width, height); + // glBindRenderbuffer(GL_RENDERBUFFER, 0); + // glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); + // unbind(); } Framebuffer::~Framebuffer() { diff --git a/src/graphics/Texture.cpp b/src/graphics/Texture.cpp index 4516c03a..fde3ca65 100644 --- a/src/graphics/Texture.cpp +++ b/src/graphics/Texture.cpp @@ -7,12 +7,17 @@ Texture::Texture(unsigned int id, int width, int height) : id(id), width(width), Texture::Texture(unsigned char* data, int width, int height) : width(width), height(height) { glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, id); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, width, height, GL_TRUE); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); } Texture::~Texture() { @@ -21,11 +26,15 @@ Texture::~Texture() { void Texture::bind(){ glBindTexture(GL_TEXTURE_2D, id); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, id); } void Texture::reload(unsigned char* data){ glBindTexture(GL_TEXTURE_2D, id); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) data); + // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, width, height, GL_TRUE); glBindTexture(GL_TEXTURE_2D, 0); + // glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); } diff --git a/src/hud_render.cpp b/src/hud_render.cpp index f4d57285..9f5f05d0 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -18,18 +18,18 @@ HudRenderer::HudRenderer() { - float vertices[] = { - // x y - -0.01f,-0.01f, - 0.01f, 0.01f, + // float vertices[] = { + // // x y + // -0.01f,-0.01f, + // 0.01f, 0.01f, - -0.01f, 0.01f, - 0.01f,-0.01f, - }; - int attrs[] = { - 2, 0 //null terminator - }; - crosshair = new Mesh(vertices, 4, attrs); + // -0.01f, 0.01f, + // 0.01f,-0.01f, + // }; + // int attrs[] = { + // 2, 0 //null terminator + // }; + // crosshair = new Mesh(vertices, 4, attrs); batch = new Batch2D(1024); uicamera = new Camera(glm::vec3(), Window::height / 1.0f); @@ -38,7 +38,7 @@ HudRenderer::HudRenderer() { } HudRenderer::~HudRenderer() { - delete crosshair; + // delete crosshair; delete batch; delete uicamera; } @@ -61,7 +61,7 @@ void HudRenderer::drawDebug(Level* level, Assets* assets, int fps, bool occlusio font->draw(batch, L"fps:", 16, 42, STYLE_OUTLINE); font->draw(batch, std::to_wstring(fps), 44, 42, STYLE_OUTLINE); font->draw(batch, L"occlusion: "+std::to_wstring(occlusion), 16, 54, STYLE_OUTLINE); - batch->render(); + // batch->render(); } @@ -79,12 +79,17 @@ void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ Texture* blocks = assets->getTexture("block"); Texture* sprite = assets->getTexture("slot"); - if (!Events::_cursor_locked) { + batch->texture(nullptr); + batch->color = vec4(1.0f); + if (Events::_cursor_locked && !devdata) { + glLineWidth(2); + batch->line(Window::width/2, Window::height/2-6, Window::width/2, Window::height/2+6, 0.2f, 0.2f, 0.2f, 1.0f); + batch->line(Window::width/2+6, Window::height/2, Window::width/2-6, Window::height/2, 0.2f, 0.2f, 0.2f, 1.0f); + batch->line(Window::width/2-5, Window::height/2-5, Window::width/2+5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); + batch->line(Window::width/2+5, Window::height/2-5, Window::width/2-5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); } - batch->color = vec4(1.0f); // batch->texture(sprite); - batch->texture(nullptr); // batch->sprite(Window::width/2-32, uicamera->fov - 80, 64, 64, 16, 0, vec4(1.0f)); // batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, // 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, @@ -208,14 +213,14 @@ void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ } } - batch->render(); + // batch->render(); if (Events::_cursor_locked && !devdata){ - Shader* crosshairShader = assets->getShader("crosshair"); - crosshairShader->use(); - crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); - crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); - glLineWidth(2.0f); - crosshair->draw(GL_LINES); + // Shader* crosshairShader = assets->getShader("crosshair"); + // crosshairShader->use(); + // crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); + // crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); + // glLineWidth(2.0f); + // crosshair->draw(GL_LINES); } } diff --git a/src/hud_render.h b/src/hud_render.h index 37b40225..f90d964b 100644 --- a/src/hud_render.h +++ b/src/hud_render.h @@ -10,7 +10,7 @@ class Mesh; class HudRenderer { Batch2D* batch; Camera* uicamera; - Mesh* crosshair; + // Mesh* crosshair; public: HudRenderer(); ~HudRenderer(); diff --git a/src/loaders/png_loading.cpp b/src/loaders/png_loading.cpp index 7757b564..f05fa8a0 100644 --- a/src/loaders/png_loading.cpp +++ b/src/loaders/png_loading.cpp @@ -20,6 +20,7 @@ int _png_load(const char* file, int* width, int* height){ png_bytepp row_pointers; png_structp png_ptr; GLuint texture; + GLuint texturems; int alpha; if ( !( f = fopen(file, "r" ) ) ) { @@ -95,18 +96,53 @@ int _png_load(const char* file, int* width, int* height){ png_destroy_read_struct( &png_ptr, &info_ptr, &end_info ); return 0; } + // configure second post-processing framebuffer + unsigned int framebuffer; + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, t_width, t_height, 0, alpha, GL_UNSIGNED_BYTE, (GLvoid *) image_data); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); glGenerateMipmap(GL_TEXTURE_2D); + // glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); // we only need a color buffer + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + unsigned int framebufferms; + glGenFramebuffers(1, &framebufferms); + glBindFramebuffer(GL_FRAMEBUFFER, framebufferms); + // create a multisampled color attachment texture + glGenTextures(1, &texturems); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texturems); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 16, GL_RGBA, t_width, t_height, GL_TRUE); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texturems, 0); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LEVEL, 3); + // glGenerateMipmap(GL_TEXTURE_2D_MULTISAMPLE); + + + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferms); + glBlitFramebuffer(0, 0, t_width, t_height, 0, 0, t_width, t_height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + + + png_destroy_read_struct( &png_ptr, &info_ptr, &end_info ); free( image_data ); diff --git a/src/player_control.cpp b/src/player_control.cpp index de20e347..2f6ffbf7 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -19,8 +19,8 @@ #define RUN_ZOOM 1.1f #define C_ZOOM 0.1f #define ZOOM_SPEED 16.0f -#define DEFAULT_AIR_DAMPING 0.1f -#define PLAYER_NOT_ONGROUND_DAMPING 10.0f +#define PLAYER_GROUNDED_DAMPING 1.0f +#define PLAYER_NOT_GROUNDED_DAMPING 10.0f #define CAMERA_SHAKING_OFFSET 0.025f #define CAMERA_SHAKING_OFFSET_Y 0.031f #define CAMERA_SHAKING_SPEED 1.6f @@ -82,7 +82,6 @@ void PlayerController::update_controls(float delta){ (Events::jpressed(GLFW_KEY_N) && player->flight == player->noclip)){ player->flight = !player->flight; if (player->flight){ - hitbox->velocity.y += 1; hitbox->grounded = false; } } @@ -127,9 +126,9 @@ void PlayerController::update_controls(float delta){ dir.z -= camera->right.z; } - hitbox->linear_damping = DEFAULT_AIR_DAMPING; + hitbox->linear_damping = PLAYER_GROUNDED_DAMPING; if (player->flight){ - hitbox->linear_damping = PLAYER_NOT_ONGROUND_DAMPING; + hitbox->linear_damping = PLAYER_NOT_GROUNDED_DAMPING; hitbox->velocity.y *= 1.0f - delta * 9; if (Events::pressed(GLFW_KEY_SPACE)){ hitbox->velocity.y += speed * delta * 9; @@ -142,27 +141,37 @@ void PlayerController::update_controls(float delta){ dir = normalize(dir); if (!hitbox->grounded) - hitbox->linear_damping = PLAYER_NOT_ONGROUND_DAMPING; + hitbox->linear_damping = PLAYER_NOT_GROUNDED_DAMPING; hitbox->velocity.x += dir.x * speed * delta * 9; hitbox->velocity.z += dir.z * speed * delta * 9; } - 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); +// camera rotate + + if (Events::_cursor_locked){ + float rotX = -Events::deltaX / Window::height * 2; + float rotY = -Events::deltaY / Window::height * 2; + if (zoom){ + rotX /= 4; + rotY /= 4; } - if (player->camY > radians(89.0f)){ - player->camY = radians(89.0f); + player->camX += rotX; + player->camY += rotY; + + if (player->camY < -radians(89.9f)){ + player->camY = -radians(89.9f); + } + if (player->camY > radians(89.9f)){ + player->camY = radians(89.9f); } camera->rotation = mat4(1.0f); camera->rotate(player->camY, player->camX, 0); } } +// end camera rotate void PlayerController::update_interaction(){ Chunks* chunks = level->chunks; diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index 25e67ad2..3ad843bb 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -51,7 +51,7 @@ float calc_height(fnl_state *noise, int real_x, int real_z){ 0.0f)*0.1f; height += fnlGetNoise3D(noise, real_x*0.1f*8-3465,real_z*0.1f*8+4534, 0.0f)*0.125f; height += fnlGetNoise3D(noise, real_x*0.4f*8+4565,real_z*0.4f*8+46456, 0.0f)*0.0625f; - height += fnlGetNoise3D(noise, real_x*8,real_z*8, 0.0f)*0.03f*(fnlGetNoise3D(noise, -real_x*0.0125f*8-1000,real_z*0.0125f*8+2000, 0.0f)/2+0.5f); + // height += fnlGetNoise3D(noise, real_x*8,real_z*8, 0.0f)*0.03f*(fnlGetNoise3D(noise, -real_x*0.0125f*8-1000,real_z*0.0125f*8+2000, 0.0f)/2+0.5f); height *= fnlGetNoise3D(noise, real_x*0.0125f*8+1000,real_z*0.0125f*8+1000, 0.0f)/2+0.5f; height += 1.0f; height *= 64.0f; diff --git a/src/world_render.cpp b/src/world_render.cpp index e7f08930..721f20f1 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -135,43 +135,6 @@ void WorldRenderer::draw(World* world, Camera* camera, bool occlusion, bool devd // draw 3D stuff here batch3d->render(); - if (devdata) { - linesShader->use(); - linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); - - vec3 point = vec3(camera->position.x+camera->front.x/1, - camera->position.y+camera->front.y/1, - camera->position.z+camera->front.z/1); - - glDisable(GL_DEPTH_TEST); - - glLineWidth(3.0f); - lineBatch->line(point.x, point.y, point.z, - point.x+0.1f, point.y, point.z, - 0, 0, 0, 1); - lineBatch->line(point.x, point.y, point.z, - point.x, point.y, point.z+0.1f, - 0, 0, 0, 1); - lineBatch->line(point.x, point.y, point.z, - point.x, point.y+0.1f, point.z, - 0, 0, 0, 1); - lineBatch->render(); - - glLineWidth(1.0f); - lineBatch->line(point.x, point.y, point.z, - point.x+0.1f, point.y, point.z, - 1, 0, 0, 1); - lineBatch->line(point.x, point.y, point.z, - point.x, point.y, point.z+0.1f, - 0, 0, 1, 1); - lineBatch->line(point.x, point.y, point.z, - point.x, point.y+0.1f, point.z, - 0, 1, 0, 1); - lineBatch->render(); - - glEnable(GL_DEPTH_TEST); - } - if (level->playerController->selectedBlockId != -1){ Block* selectedBlock = Block::blocks[level->playerController->selectedBlockId]; vec3 pos = level->playerController->selectedBlockPosition; @@ -185,4 +148,41 @@ void WorldRenderer::draw(World* world, Camera* camera, bool occlusion, bool devd } lineBatch->render(); } + + if (devdata) { + linesShader->use(); + linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); + + vec3 point = vec3(camera->position.x+camera->front.x/1, + camera->position.y+camera->front.y/1, + camera->position.z+camera->front.z/1); + + glDisable(GL_DEPTH_TEST); + + glLineWidth(4.0f); + lineBatch->line(point.x, point.y, point.z, + point.x+0.1f, point.y, point.z, + 0, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y, point.z+0.1f, + 0, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y+0.1f, point.z, + 0, 0, 0, 1); + lineBatch->render(); + + glLineWidth(2.0f); + lineBatch->line(point.x, point.y, point.z, + point.x+0.1f, point.y, point.z, + 1, 0, 0, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y, point.z+0.1f, + 0, 0, 1, 1); + lineBatch->line(point.x, point.y, point.z, + point.x, point.y+0.1f, point.z, + 0, 1, 0, 1); + lineBatch->render(); + + glEnable(GL_DEPTH_TEST); + } } From 8e68a47712fe37258a3ba337be2be35fa3092551 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Thu, 8 Dec 2022 21:20:45 +0300 Subject: [PATCH 07/19] refactoring --- src/hud_render.cpp | 6 +- src/hud_render.h | 2 +- src/objects/Player.cpp | 2 +- src/objects/Player.h | 1 + src/physics/PhysicsSolver.cpp | 164 +++++++++++++++++----------------- src/physics/PhysicsSolver.h | 1 + src/player_control.cpp | 120 ++++++++++++------------- src/voxel_engine.cpp | 17 ++-- src/world_render.cpp | 4 +- src/world_render.h | 2 +- 10 files changed, 160 insertions(+), 159 deletions(-) diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 9f5f05d0..5870a46b 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -65,7 +65,7 @@ void HudRenderer::drawDebug(Level* level, Assets* assets, int fps, bool occlusio } -void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ +void HudRenderer::draw(Level* level, Assets* assets){ uicamera->fov = Window::height; glDisable(GL_DEPTH_TEST); @@ -81,7 +81,7 @@ void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ batch->texture(nullptr); batch->color = vec4(1.0f); - if (Events::_cursor_locked && !devdata) { + if (Events::_cursor_locked && !level->player->debug) { glLineWidth(2); batch->line(Window::width/2, Window::height/2-6, Window::width/2, Window::height/2+6, 0.2f, 0.2f, 0.2f, 1.0f); batch->line(Window::width/2+6, Window::height/2, Window::width/2-6, Window::height/2, 0.2f, 0.2f, 0.2f, 1.0f); @@ -215,7 +215,7 @@ void HudRenderer::draw(Level* level, Assets* assets, bool devdata){ // batch->render(); - if (Events::_cursor_locked && !devdata){ + if (Events::_cursor_locked && !level->player->debug){ // Shader* crosshairShader = assets->getShader("crosshair"); // crosshairShader->use(); // crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); diff --git a/src/hud_render.h b/src/hud_render.h index f90d964b..c8568f6b 100644 --- a/src/hud_render.h +++ b/src/hud_render.h @@ -14,7 +14,7 @@ class HudRenderer { public: HudRenderer(); ~HudRenderer(); - void draw(Level* level, Assets* assets, bool devdata); + void draw(Level* level, Assets* assets); void drawDebug(Level* level, Assets* assets, int fps, bool occlusion); }; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 997caf06..0889b8ee 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -11,7 +11,7 @@ Player::Player(glm::vec3 position, float speed, Camera* camera) : camera(camera), choosenBlock(1), camX(0.0f), camY(0.0f){ - hitbox = new Hitbox(position, vec3(0.2f,0.9f,0.2f)); + hitbox = new Hitbox(position, vec3(0.3f,0.9f,0.3f)); } Player::~Player(){ diff --git a/src/objects/Player.h b/src/objects/Player.h index af7a9fe7..ac340c47 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -15,6 +15,7 @@ public: Hitbox* hitbox; bool flight = false; bool noclip = false; + bool debug = false; int choosenBlock; float camX, camY; float cameraShaking = 0.0f; diff --git a/src/physics/PhysicsSolver.cpp b/src/physics/PhysicsSolver.cpp index dac915df..7d70f629 100644 --- a/src/physics/PhysicsSolver.cpp +++ b/src/physics/PhysicsSolver.cpp @@ -5,7 +5,6 @@ #include #define E 0.03 -#define DEFAULT_FRICTION 10.0 PhysicsSolver::PhysicsSolver(vec3 gravity) : gravity(gravity) { } @@ -28,89 +27,7 @@ void PhysicsSolver::step(Chunks* chunks, Hitbox* hitbox, float delta, unsigned s float pz = pos.z; if (collisions) { - if (vel.x < 0.0){ - for (int y = floor(pos.y-half.y+E); y <= floor(pos.y+half.y-E); y++){ - for (int z = floor(pos.z-half.z+E); z <= floor(pos.z+half.z-E); z++){ - int x = floor(pos.x-half.x-E); - if (chunks->isObstacle(x,y,z)){ - vel.x *= 0.0; - pos.x = x + 1 + half.x + E; - break; - } - } - } - } - if (vel.x > 0.0){ - for (int y = floor(pos.y-half.y+E); y <= floor(pos.y+half.y-E); y++){ - for (int z = floor(pos.z-half.z+E); z <= floor(pos.z+half.z-E); z++){ - int x = floor(pos.x+half.x+E); - if (chunks->isObstacle(x,y,z)){ - vel.x *= 0.0; - pos.x = x - half.x - E; - break; - } - } - } - } - - if (vel.z < 0.0){ - for (int y = floor(pos.y-half.y+E); y <= floor(pos.y+half.y-E); y++){ - for (int x = floor(pos.x-half.x+E); x <= floor(pos.x+half.x-E); x++){ - int z = floor(pos.z-half.z-E); - if (chunks->isObstacle(x,y,z)){ - vel.z *= 0.0; - pos.z = z + 1 + half.z + E; - break; - } - } - } - } - - if (vel.z > 0.0){ - for (int y = floor(pos.y-half.y+E); y <= floor(pos.y+half.y-E); y++){ - for (int x = floor(pos.x-half.x+E); x <= floor(pos.x+half.x-E); x++){ - int z = floor(pos.z+half.z+E); - if (chunks->isObstacle(x,y,z)){ - vel.z *= 0.0; - pos.z = z - half.z - E; - break; - } - } - } - } - - if (vel.y < 0.0){ - for (int x = floor(pos.x-half.x+E); x <= floor(pos.x+half.x-E); x++){ - bool broken = false; - for (int z = floor(pos.z-half.z+E); z <= floor(pos.z+half.z-E); z++){ - int y = floor(pos.y-half.y-E); - if (chunks->isObstacle(x,y,z)){ - vel.y *= 0.0; - pos.y = y + 1 + half.y; - int f = DEFAULT_FRICTION; - vel.x *= max(0.0, 1.0 - dt * f); - vel.z *= max(0.0, 1.0 - dt * f); - hitbox->grounded = true; - broken = true; - break; - } - } - if (broken) - break; - } - } - if (vel.y > 0.0){ - for (int x = floor(pos.x-half.x+E); x <= floor(pos.x+half.x-E); x++){ - for (int z = floor(pos.z-half.z+E); z <= floor(pos.z+half.z-E); z++){ - int y = floor(pos.y+half.y+E); - if (chunks->isObstacle(x,y,z)){ - vel.y *= 0.0; - pos.y = y - half.y - E; - break; - } - } - } - } + colisionCalc(chunks, hitbox, &vel, &pos, half); } vel.x *= max(0.0, 1.0 - dt * linear_damping); @@ -152,6 +69,85 @@ void PhysicsSolver::step(Chunks* chunks, Hitbox* hitbox, float delta, unsigned s } } +void PhysicsSolver::colisionCalc(Chunks* chunks, Hitbox* hitbox, vec3* vel, vec3* pos, vec3 half){ + if (vel->x < 0.0){ + for (int y = floor(pos->y-half.y+E); y <= floor(pos->y+half.y-E); y++){ + for (int z = floor(pos->z-half.z+E); z <= floor(pos->z+half.z-E); z++){ + int x = floor(pos->x-half.x-E); + if (chunks->isObstacle(x,y,z)){ + vel->x *= 0.0; + pos->x = x + 1 + half.x + E; + break; + } + } + } + } + if (vel->x > 0.0){ + for (int y = floor(pos->y-half.y+E); y <= floor(pos->y+half.y-E); y++){ + for (int z = floor(pos->z-half.z+E); z <= floor(pos->z+half.z-E); z++){ + int x = floor(pos->x+half.x+E); + if (chunks->isObstacle(x,y,z)){ + vel->x *= 0.0; + pos->x = x - half.x - E; + break; + } + } + } + } + + if (vel->z < 0.0){ + for (int y = floor(pos->y-half.y+E); y <= floor(pos->y+half.y-E); y++){ + for (int x = floor(pos->x-half.x+E); x <= floor(pos->x+half.x-E); x++){ + int z = floor(pos->z-half.z-E); + if (chunks->isObstacle(x,y,z)){ + vel->z *= 0.0; + pos->z = z + 1 + half.z + E; + break; + } + } + } + } + + if (vel->z > 0.0){ + for (int y = floor(pos->y-half.y+E); y <= floor(pos->y+half.y-E); y++){ + for (int x = floor(pos->x-half.x+E); x <= floor(pos->x+half.x-E); x++){ + int z = floor(pos->z+half.z+E); + if (chunks->isObstacle(x,y,z)){ + vel->z *= 0.0; + pos->z = z - half.z - E; + break; + } + } + } + } + + if (vel->y < 0.0){ + for (int x = floor(pos->x-half.x+E); x <= floor(pos->x+half.x-E); x++){ + for (int z = floor(pos->z-half.z+E); z <= floor(pos->z+half.z-E); z++){ + int y = floor(pos->y-half.y-E); + if (chunks->isObstacle(x,y,z)){ + vel->y *= 0.0; + pos->y = y + 1 + half.y; + hitbox->grounded = true; + break; + } + } + } + } + if (vel->y > 0.0){ + for (int x = floor(pos->x-half.x+E); x <= floor(pos->x+half.x-E); x++){ + for (int z = floor(pos->z-half.z+E); z <= floor(pos->z+half.z-E); z++){ + int y = floor(pos->y+half.y+E); + if (chunks->isObstacle(x,y,z)){ + vel->y *= 0.0; + pos->y = y - half.y - E; + break; + } + } + } + } +} + bool PhysicsSolver::isBlockInside(int x, int y, int z, Hitbox* hitbox) { vec3& pos = hitbox->position; vec3& half = hitbox->halfsize; diff --git a/src/physics/PhysicsSolver.h b/src/physics/PhysicsSolver.h index f2302b34..c3c9be83 100644 --- a/src/physics/PhysicsSolver.h +++ b/src/physics/PhysicsSolver.h @@ -21,6 +21,7 @@ public: bool shifting, float gravityScale, bool collisions); + void colisionCalc(Chunks* chunks, Hitbox* hitbox, vec3* vel, vec3* pos, vec3 half); bool isBlockInside(int x, int y, int z, Hitbox* hitbox); }; diff --git a/src/player_control.cpp b/src/player_control.cpp index 2f6ffbf7..a3b5cbbf 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -19,8 +19,8 @@ #define RUN_ZOOM 1.1f #define C_ZOOM 0.1f #define ZOOM_SPEED 16.0f -#define PLAYER_GROUNDED_DAMPING 1.0f -#define PLAYER_NOT_GROUNDED_DAMPING 10.0f +#define PLAYER_GROUND_DAMPING 10.0f +#define PLAYER_AIR_DAMPING 7.0f #define CAMERA_SHAKING_OFFSET 0.025f #define CAMERA_SHAKING_OFFSET_Y 0.031f #define CAMERA_SHAKING_SPEED 1.6f @@ -35,13 +35,14 @@ PlayerController::PlayerController(Level* level) : level(level) { void PlayerController::update_controls(float delta){ Player* player = level->player; - for (int i = 1; i < 10; i++){ - if (Events::jpressed(GLFW_KEY_0+i)){ - player->choosenBlock = i; + /*block choose*/{ + for (int i = 1; i < 10; i++){ + if (Events::jpressed(GLFW_KEY_0+i)){ + player->choosenBlock = i; + } } - } + }//end - // Controls Camera* camera = player->camera; Hitbox* hitbox = player->hitbox; bool sprint = Events::pressed(GLFW_KEY_LEFT_CONTROL); @@ -65,18 +66,20 @@ void PlayerController::update_controls(float delta){ if (player->flight && hitbox->grounded) player->flight = false; - // Camera shaking - player->interpVel = player->interpVel * (1.0f - delta * 5) + hitbox->velocity * delta * 0.1f; - if (hitbox->grounded && player->interpVel.y < 0.0f){ - player->interpVel.y *= -30.0f; - } - float factor = hitbox->grounded ? length(vec2(hitbox->velocity.x, hitbox->velocity.z)) : 0.0f; - player->cameraShakingTimer += delta * factor * CAMERA_SHAKING_SPEED; - float shakeTimer = player->cameraShakingTimer; - player->cameraShaking = player->cameraShaking * (1.0f - delta * CAMERA_SHAKING_DELTA_K) + factor * delta * CAMERA_SHAKING_DELTA_K; - camera->position += camera->right * sin(shakeTimer) * CAMERA_SHAKING_OFFSET * player->cameraShaking; - camera->position += camera->up * abs(cos(shakeTimer)) * CAMERA_SHAKING_OFFSET_Y * player->cameraShaking; - camera->position -= min(player->interpVel * 0.05f, 1.0f); + + /*camera shaking*/{ + player->interpVel = player->interpVel * (1.0f - delta * 5) + hitbox->velocity * delta * 0.1f; + if (hitbox->grounded && player->interpVel.y < 0.0f){ + player->interpVel.y *= -30.0f; + } + float factor = hitbox->grounded ? length(vec2(hitbox->velocity.x, hitbox->velocity.z)) : 0.0f; + player->cameraShakingTimer += delta * factor * CAMERA_SHAKING_SPEED; + float shakeTimer = player->cameraShakingTimer; + player->cameraShaking = player->cameraShaking * (1.0f - delta * CAMERA_SHAKING_DELTA_K) + factor * delta * CAMERA_SHAKING_DELTA_K; + camera->position += camera->right * sin(shakeTimer) * CAMERA_SHAKING_OFFSET * player->cameraShaking; + camera->position += camera->up * abs(cos(shakeTimer)) * CAMERA_SHAKING_OFFSET_Y * player->cameraShaking; + camera->position -= min(player->interpVel * 0.05f, 1.0f); + }//end if ((Events::jpressed(GLFW_KEY_F) && !player->noclip) || (Events::jpressed(GLFW_KEY_N) && player->flight == player->noclip)){ @@ -89,25 +92,25 @@ void PlayerController::update_controls(float delta){ player->noclip = !player->noclip; } - // Field of view manipulations - float dt = min(1.0f, delta * ZOOM_SPEED); - float zoomValue = 1.0f; - if (shift){ - speed *= CROUCH_SPEED_MUL; - camera->position.y += CROUCH_SHIFT_Y; - zoomValue = CROUCH_ZOOM; - } else if (sprint){ - speed *= RUN_SPEED_MUL; - zoomValue = RUN_ZOOM; - } - if (zoom) - zoomValue *= C_ZOOM; - camera->zoom = zoomValue * dt + camera->zoom * (1.0f - dt); + /*field of view manipulations*/{ + float dt = min(1.0f, delta * ZOOM_SPEED); + float zoomValue = 1.0f; + if (shift){ + speed *= CROUCH_SPEED_MUL; + camera->position.y += CROUCH_SHIFT_Y; + zoomValue = CROUCH_ZOOM; + } else if (sprint){ + speed *= RUN_SPEED_MUL; + zoomValue = RUN_ZOOM; + } + if (zoom) + zoomValue *= C_ZOOM; + camera->zoom = zoomValue * dt + camera->zoom * (1.0f - dt); + }//end if (Events::pressed(GLFW_KEY_SPACE) && hitbox->grounded){ hitbox->velocity.y = JUMP_FORCE; } - vec3 dir(0,0,0); if (Events::pressed(GLFW_KEY_W)){ dir.x += camera->dir.x; @@ -126,9 +129,9 @@ void PlayerController::update_controls(float delta){ dir.z -= camera->right.z; } - hitbox->linear_damping = PLAYER_GROUNDED_DAMPING; + hitbox->linear_damping = PLAYER_GROUND_DAMPING; if (player->flight){ - hitbox->linear_damping = PLAYER_NOT_GROUNDED_DAMPING; + hitbox->linear_damping = PLAYER_AIR_DAMPING; hitbox->velocity.y *= 1.0f - delta * 9; if (Events::pressed(GLFW_KEY_SPACE)){ hitbox->velocity.y += speed * delta * 9; @@ -137,41 +140,38 @@ void PlayerController::update_controls(float delta){ hitbox->velocity.y -= speed * delta * 9; } } + if (!hitbox->grounded) + hitbox->linear_damping = PLAYER_AIR_DAMPING; if (length(dir) > 0.0f){ dir = normalize(dir); - - if (!hitbox->grounded) - hitbox->linear_damping = PLAYER_NOT_GROUNDED_DAMPING; - hitbox->velocity.x += dir.x * speed * delta * 9; hitbox->velocity.z += dir.z * speed * delta * 9; } -// camera rotate + /*camera rotate*/{ + if (Events::_cursor_locked){ + float rotX = -Events::deltaX / Window::height * 2; + float rotY = -Events::deltaY / Window::height * 2; + if (zoom){ + rotX /= 4; + rotY /= 4; + } + player->camX += rotX; + player->camY += rotY; - if (Events::_cursor_locked){ - float rotX = -Events::deltaX / Window::height * 2; - float rotY = -Events::deltaY / Window::height * 2; - if (zoom){ - rotX /= 4; - rotY /= 4; - } - player->camX += rotX; - player->camY += rotY; + if (player->camY < -radians(89.9f)){ + player->camY = -radians(89.9f); + } + if (player->camY > radians(89.9f)){ + player->camY = radians(89.9f); + } - if (player->camY < -radians(89.9f)){ - player->camY = -radians(89.9f); + camera->rotation = mat4(1.0f); + camera->rotate(player->camY, player->camX, 0); } - if (player->camY > radians(89.9f)){ - player->camY = radians(89.9f); - } - - camera->rotation = mat4(1.0f); - camera->rotate(player->camY, player->camX, 0); - } + }//end } -// end camera rotate void PlayerController::update_interaction(){ Chunks* chunks = level->chunks; diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 085fdef5..66f09aa4 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -77,9 +77,13 @@ void write_world(World* world, Level* level){ void update_level(World* world, Level* level, float delta, long frame, VoxelRenderer* renderer) { level->playerController->update_controls(delta); - if (Events::_cursor_locked) + if (Events::_cursor_locked){ level->playerController->update_interaction(); - + } else + { + level->playerController->selectedBlockId = -1; + } + vec3 position = level->player->hitbox->position; level->chunks->setCenter(world->wfile, position.x, position.z); } @@ -119,7 +123,6 @@ void mainloop(Level* level, Assets* assets) { float lastTime = glfwGetTime(); float delta = 0.0f; bool occlusion = true; - bool devdata = false; Window::swapInterval(1); while (!Window::isShouldClose()){ frame++; @@ -137,7 +140,7 @@ void mainloop(Level* level, Assets* assets) { occlusion = !occlusion; } if (Events::jpressed(GLFW_KEY_F3)){ - devdata = !devdata; + level->player->debug = !level->player->debug; } if (Events::jpressed(GLFW_KEY_F5)){ for (unsigned i = 0; i < level->chunks->volume; i++) { @@ -159,9 +162,9 @@ void mainloop(Level* level, Assets* assets) { for (int i = 0; i < freeLoaders; i++) level->chunksController->loadVisible(world->wfile); - worldRenderer.draw(world, camera, occlusion, devdata); - hud.draw(level, assets, devdata); - if (devdata) { + worldRenderer.draw(world, camera, occlusion); + hud.draw(level, assets); + if (level->player->debug) { hud.drawDebug(level, assets, fps, occlusion); } diff --git a/src/world_render.cpp b/src/world_render.cpp index 721f20f1..3c4f7df2 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -73,7 +73,7 @@ bool WorldRenderer::drawChunk(size_t index, Camera* camera, Shader* shader, bool } -void WorldRenderer::draw(World* world, Camera* camera, bool occlusion, bool devdata){ +void WorldRenderer::draw(World* world, Camera* camera, bool occlusion){ Chunks* chunks = level->chunks; vec4 skyColor(0.7f, 0.81f, 1.0f, 1.0f); @@ -149,7 +149,7 @@ void WorldRenderer::draw(World* world, Camera* camera, bool occlusion, bool devd lineBatch->render(); } - if (devdata) { + if (level->player->debug) { linesShader->use(); linesShader->uniformMatrix("u_projview", camera->getProjection()*camera->getView()); diff --git a/src/world_render.h b/src/world_render.h index 64ff8c63..d237ed29 100644 --- a/src/world_render.h +++ b/src/world_render.h @@ -37,7 +37,7 @@ public: WorldRenderer(Level* level, Assets* assets); ~WorldRenderer(); - void draw(World* world, Camera* camera, bool occlusion, bool devdata); + void draw(World* world, Camera* camera, bool occlusion); }; From eaf1fa54cd3f46998b9e0a61b05f05fbc7502e9d Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Sep 2023 14:14:50 +0300 Subject: [PATCH 08/19] Fixed some warnings, set -Wall, -Wextra --- CMakeLists.txt | 6 ++++++ src/files/WorldFiles.h | 2 -- src/files/files.h | 2 -- src/voxel_engine.cpp | 2 +- src/world/Level.cpp | 3 +++ src/world_render.cpp | 2 +- src/world_render.h | 5 +---- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d7591eb..73978c3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,12 @@ file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) +if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX) +else() + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) +endif() + option(VE_USE_SYSTEM_LIBS "Use system installed libraries" ON) find_package(OpenGL REQUIRED) diff --git a/src/files/WorldFiles.h b/src/files/WorldFiles.h index 93d50db0..70ebc55b 100644 --- a/src/files/WorldFiles.h +++ b/src/files/WorldFiles.h @@ -3,9 +3,7 @@ #include #include -#ifndef std::string #include -#endif class Player; #define REGION_SIZE_BIT 5 diff --git a/src/files/files.h b/src/files/files.h index 27cc9c54..7b53cb16 100644 --- a/src/files/files.h +++ b/src/files/files.h @@ -1,9 +1,7 @@ #ifndef FILES_FILES_H_ #define FILES_FILES_H_ -#ifndef std::string #include -#endif extern bool write_binary_file(std::string filename, const char* data, size_t size); extern unsigned int append_binary_file(std::string filename, const char* data, size_t size); diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 66f09aa4..cec3c7e0 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -162,7 +162,7 @@ void mainloop(Level* level, Assets* assets) { for (int i = 0; i < freeLoaders; i++) level->chunksController->loadVisible(world->wfile); - worldRenderer.draw(world, camera, occlusion); + worldRenderer.draw(camera, occlusion); hud.draw(level, assets); if (level->player->debug) { hud.drawDebug(level, assets, fps, occlusion); diff --git a/src/world/Level.cpp b/src/world/Level.cpp index d85df92e..c86f9507 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -1,7 +1,10 @@ #include "Level.h" #include "../lighting/Lighting.h" +#include "../voxels/Chunks.h" #include "../voxels/ChunksController.h" #include "../player_control.h" +#include "../physics/PhysicsSolver.h" +#include "../objects/Player.h" Level::Level(World* world, Player* player, Chunks* chunks, PhysicsSolver* physics) : world(world), diff --git a/src/world_render.cpp b/src/world_render.cpp index 3c4f7df2..35028f04 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -73,7 +73,7 @@ bool WorldRenderer::drawChunk(size_t index, Camera* camera, Shader* shader, bool } -void WorldRenderer::draw(World* world, Camera* camera, bool occlusion){ +void WorldRenderer::draw(Camera* camera, bool occlusion){ Chunks* chunks = level->chunks; vec4 skyColor(0.7f, 0.81f, 1.0f, 1.0f); diff --git a/src/world_render.h b/src/world_render.h index d237ed29..2dd611da 100644 --- a/src/world_render.h +++ b/src/world_render.h @@ -4,10 +4,7 @@ #include #include #include - -#ifndef std::string #include -#endif #include #include @@ -37,7 +34,7 @@ public: WorldRenderer(Level* level, Assets* assets); ~WorldRenderer(); - void draw(World* world, Camera* camera, bool occlusion); + void draw(Camera* camera, bool occlusion); }; From 4f20abe7ea98191938b1cc3255e72879c96f0c09 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Sep 2023 23:25:17 +0300 Subject: [PATCH 09/19] Warning fixes, refactor --- src/files/WorldFiles.cpp | 4 ++-- src/files/files.cpp | 42 ++++++++++++++++++--------------- src/files/files.h | 7 +++--- src/graphics/VoxelRenderer.cpp | 3 +-- src/hud_render.cpp | 22 +++++++++-------- src/player_control.cpp | 4 ++-- src/typedefs.h | 4 ++++ src/voxel_engine.cpp | 6 ++--- src/voxels/ChunksController.cpp | 2 +- src/voxels/ChunksController.h | 2 +- src/voxels/WorldGenerator.cpp | 4 ++-- src/window/Events.cpp | 8 +++---- src/window/Window.cpp | 6 ++--- src/window/Window.h | 8 ++++--- 14 files changed, 67 insertions(+), 55 deletions(-) create mode 100644 src/typedefs.h diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 84388a72..b4c62102 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -171,7 +171,7 @@ bool WorldFiles::readChunk(int x, int y, char* out){ input.read(mainBufferIn, compressedSize); input.close(); - decompressRLE(mainBufferIn, compressedSize, out, CHUNK_VOL); + decompressRLE((unsigned char*)mainBufferIn, compressedSize, (unsigned char*)out, CHUNK_VOL); return true; } @@ -274,7 +274,7 @@ unsigned int WorldFiles::writeRegion(char* out, int x, int y, char** region){ } else { int2Bytes(offset, out, i*4); - unsigned int compressedSize = compressRLE(chunk, CHUNK_VOL, compressed); + unsigned int compressedSize = compressRLE((unsigned char*)chunk, CHUNK_VOL, (unsigned char*)compressed); int2Bytes(compressedSize, out, offset); offset += 4; diff --git a/src/files/files.cpp b/src/files/files.cpp index 783faa2a..573d1f4b 100644 --- a/src/files/files.cpp +++ b/src/files/files.cpp @@ -2,6 +2,8 @@ #include #include +#include +#include bool write_binary_file_part(std::string filename, const char* data, size_t offset, size_t size){ std::ofstream output(filename, std::ios::out | std::ios::binary | std::ios::in); @@ -48,18 +50,18 @@ char* read_binary_file(std::string filename, size_t& length) { length = input.tellg(); input.seekg(0, std::ios_base::beg); - char* data = new char[length]; - input.read(data, length); + std::unique_ptr data {new char[length]}; + input.read(data.get(), length); input.close(); - return data; + return data.release(); } // returns decompressed length -unsigned int decompressRLE(const char* src, unsigned int length, char* dst, unsigned int targetLength){ - unsigned int offset = 0; - for (unsigned int i = 0; i < length;){ +size_t decompressRLE(const ubyte* src, size_t length, ubyte* dst, size_t targetLength){ + size_t offset = 0; + for (size_t i = 0; i < length;){ unsigned char counter = src[i++]; - char c = src[i++]; + unsigned char c = src[i++]; for (unsigned int j = 0; j <= counter; j++){ dst[offset++] = c; } @@ -67,12 +69,12 @@ unsigned int decompressRLE(const char* src, unsigned int length, char* dst, unsi return offset; } -unsigned int calcRLE(const char* src, unsigned int length) { - unsigned int offset = 0; - unsigned int counter = 0; - char c = src[0]; - for (unsigned int i = 0; i < length; i++){ - char cnext = src[i]; +size_t calcRLE(const ubyte* src, size_t length) { + size_t offset = 0; + size_t counter = 0; + ubyte c = src[0]; + for (size_t i = 0; i < length; i++){ + ubyte cnext = src[i]; if (cnext != c || counter == 255){ offset += 2; c = cnext; @@ -85,12 +87,14 @@ unsigned int calcRLE(const char* src, unsigned int length) { } // max result size = length * 2; returns compressed length -unsigned int compressRLE(const char* src, unsigned int length, char* dst) { - unsigned int offset = 0; - unsigned int counter = 0; - char c = src[0]; - for (unsigned int i = 1; i < length; i++){ - char cnext = src[i]; +size_t compressRLE(const ubyte* src, size_t length, ubyte* dst) { + if (length == 0) + return 0; + size_t offset = 0; + uint counter = 0; + ubyte c = src[0]; + for (size_t i = 1; i < length; i++){ + ubyte cnext = src[i]; if (cnext != c || counter == 255){ dst[offset++] = counter; dst[offset++] = c; diff --git a/src/files/files.h b/src/files/files.h index 7b53cb16..b760529d 100644 --- a/src/files/files.h +++ b/src/files/files.h @@ -2,6 +2,7 @@ #define FILES_FILES_H_ #include +#include "../typedefs.h" extern bool write_binary_file(std::string filename, const char* data, size_t size); extern unsigned int append_binary_file(std::string filename, const char* data, size_t size); @@ -9,8 +10,8 @@ extern bool read_binary_file(std::string filename, char* data, size_t size); extern bool read_binary_file(std::string filename, char* data, size_t offset, size_t size); extern char* read_binary_file(std::string filename, size_t& length); -extern unsigned int calcRLE(const char* src, unsigned int length); -extern unsigned int compressRLE(const char* src, unsigned int length, char* dst); -extern unsigned int decompressRLE(const char* src, unsigned int length, char* dst, unsigned int targetLength); +extern size_t calcRLE(const ubyte* src, size_t length); +extern size_t compressRLE(const ubyte* src, size_t length, ubyte* dst); +extern size_t decompressRLE(const ubyte* src, size_t length, ubyte* dst, size_t targetLength); #endif /* FILES_FILES_H_ */ diff --git a/src/graphics/VoxelRenderer.cpp b/src/graphics/VoxelRenderer.cpp index 94f79ce5..689156f2 100644 --- a/src/graphics/VoxelRenderer.cpp +++ b/src/graphics/VoxelRenderer.cpp @@ -415,7 +415,6 @@ inline void _renderBlock(std::vector& buffer, int x, int y, int z, const } inline void _renderBlockShadeless(std::vector& buffer, int x, int y, int z, const Chunk** chunks, voxel vox, size_t& index){ - float l; float uvsize = 1.0f/16.0f; Block* block = Block::blocks[vox.id]; @@ -495,7 +494,7 @@ inline void _renderBlockShadeless(std::vector& buffer, int x, int y, int inline void _renderXBlock(std::vector& buffer, int x, int y, int z, const Chunk** chunks, voxel vox, size_t& index){ Block* block = Block::blocks[vox.id]; - int rand = ((x * z + y) xor (z * y - x)) * (z + y); + int rand = ((x * z + y) ^ (z * y - x)) * (z + y); float xs = (float)(char)rand / 512; float zs = (float)(char)(rand >> 8) / 512; diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 5870a46b..9e028b03 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -2,6 +2,8 @@ #include #include + +#include "typedefs.h" #include "Assets.h" #include "graphics/Shader.h" #include "graphics/Batch2D.h" @@ -125,12 +127,12 @@ void HudRenderer::draw(Level* level, Assets* assets){ } if (!Events::_cursor_locked) { //inventory - int size = 48; - int step = 64; - int inv_wm = step*10; - int inv_hm = step*8; - int inv_w = inv_wm - (step - size); - int inv_h = inv_hm - (step - size); + uint size = 48; + uint step = 64; + uint inv_wm = step*10; + uint inv_hm = step*8; + uint inv_w = inv_wm - (step - size); + uint inv_h = inv_hm - (step - size); int inv_x = (Window::width - (inv_w)) / 2; int inv_y = (Window::height - (inv_h)) / 2; int xs = (Window::width - inv_w + step)/2; @@ -146,7 +148,7 @@ void HudRenderer::draw(Level* level, Assets* assets){ vec4 tint = vec4(1.0f); int mx = Events::x; int my = Events::y; - int count = (inv_w / step) * (inv_h / step) + 1; + uint count = (inv_w / step) * (inv_h / step) + 1; //back batch->texture(nullptr); @@ -162,7 +164,7 @@ void HudRenderer::draw(Level* level, Assets* assets){ 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 0.75f, 4); batch->color = vec4(0.35f, 0.35f, 0.35f, 1.0f); - for (unsigned i = 1; i < count; i++) { + for (uint i = 1; i < count; i++) { x = xs + step * ((i-1) % (inv_w / step)); y = ys + step * ((i-1) / (inv_w / step)); // batch->rect(x-2, y-2, size+4, size+4); @@ -185,13 +187,13 @@ void HudRenderer::draw(Level* level, Assets* assets){ //front batch->texture(blocks); - for (unsigned i = 1; i < count; i++) { + for (uint i = 1; i < count; i++) { Block* cblock = Block::blocks[i]; if (cblock == nullptr) break; x = xs + step * ((i-1) % (inv_w / step)); y = ys + step * ((i-1) / (inv_w / step)); - if (mx > x && mx < x + size && my > y && my < y + size) { + if (mx > x && mx < x + (int)size && my > y && my < y + (int)size) { tint.r *= 1.2f; tint.g *= 1.2f; tint.b *= 1.2f; diff --git a/src/player_control.cpp b/src/player_control.cpp index a3b5cbbf..9bdd6829 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -188,10 +188,10 @@ void PlayerController::update_interaction(){ int x = (int)iend.x; int y = (int)iend.y; int z = (int)iend.z; - uint8_t states; + uint8_t states = 0; if (Block::blocks[player->choosenBlock]->rotatable){ - states = states & 0b11111100; + // states = states & 0b11111100; // if (abs(norm.x) > abs(norm.z)){ // if (abs(norm.x) > abs(norm.y)) states = states | 0b00000001; // if (abs(norm.x) < abs(norm.y)) states = states | 0b00000010; diff --git a/src/typedefs.h b/src/typedefs.h new file mode 100644 index 00000000..52b4123c --- /dev/null +++ b/src/typedefs.h @@ -0,0 +1,4 @@ +#include + +typedef unsigned int uint; +typedef unsigned char ubyte; diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index cec3c7e0..d5aa94fc 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -75,7 +75,7 @@ void write_world(World* world, Level* level){ world->wfile->writePlayer(level->player); } -void update_level(World* world, Level* level, float delta, long frame, VoxelRenderer* renderer) { +void update_level(World* world, Level* level, float delta) { level->playerController->update_controls(delta); if (Events::_cursor_locked){ level->playerController->update_interaction(); @@ -151,10 +151,10 @@ void mainloop(Level* level, Assets* assets) { } } - update_level(world, level, delta, frame, worldRenderer.renderer); + update_level(world, level, delta); int freeLoaders = level->chunksController->countFreeLoaders(); for (int i = 0; i < freeLoaders; i++) - level->chunksController->_buildMeshes(worldRenderer.renderer, frame); + level->chunksController->_buildMeshes(); freeLoaders = level->chunksController->countFreeLoaders(); for (int i = 0; i < freeLoaders; i++) level->chunksController->calculateLights(); diff --git a/src/voxels/ChunksController.cpp b/src/voxels/ChunksController.cpp index 1ca47b52..b943e260 100644 --- a/src/voxels/ChunksController.cpp +++ b/src/voxels/ChunksController.cpp @@ -185,7 +185,7 @@ void ChunksController::calculateLights() { freeLoader->lights(chunk, (Chunk**)closes); } -bool ChunksController::_buildMeshes(VoxelRenderer* renderer, int tick) { +bool ChunksController::_buildMeshes() { const int w = chunks->w; const int d = chunks->d; diff --git a/src/voxels/ChunksController.h b/src/voxels/ChunksController.h index d9315f00..1363c7a1 100644 --- a/src/voxels/ChunksController.h +++ b/src/voxels/ChunksController.h @@ -22,7 +22,7 @@ public: int countFreeLoaders(); bool loadVisible(WorldFiles* worldFiles); void calculateLights(); - bool _buildMeshes(VoxelRenderer* renderer, int tick); + bool _buildMeshes(); }; #endif /* VOXELS_CHUNKSCONTROLLER_H_ */ diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index 3ad843bb..208a57d0 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -31,11 +31,11 @@ public: } void setSeed(int number){ - seed = ((unsigned short)(number*23729) xor (unsigned short)(number+16786)); + seed = ((unsigned short)(number*23729) ^ (unsigned short)(number+16786)); rand(); } void setSeed(int number1,int number2){ - seed = (((unsigned short)(number1*23729) or (unsigned short)(number2%16786)) xor (unsigned short)(number2*number1)); + seed = (((unsigned short)(number1*23729) | (unsigned short)(number2%16786)) ^ (unsigned short)(number2*number1)); rand(); } }; diff --git a/src/window/Events.cpp b/src/window/Events.cpp index 13327b3b..58df902c 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -15,7 +15,7 @@ bool Events::_cursor_started = false; #define _MOUSE_BUTTONS 1024 -void cursor_position_callback(GLFWwindow* window, double xpos, double ypos){ +void cursor_position_callback(GLFWwindow*, double xpos, double ypos){ if (Events::_cursor_started){ Events::deltaX += xpos-Events::x; Events::deltaY += ypos-Events::y; @@ -27,7 +27,7 @@ void cursor_position_callback(GLFWwindow* window, double xpos, double ypos){ Events::y = ypos; } -void mouse_button_callback(GLFWwindow* window, int button, int action, int mode){ +void mouse_button_callback(GLFWwindow*, int button, int action, int){ if (action == GLFW_PRESS){ Events::_keys[_MOUSE_BUTTONS+button] = true; Events::_frames[_MOUSE_BUTTONS+button] = Events::_current; @@ -38,7 +38,7 @@ void mouse_button_callback(GLFWwindow* window, int button, int action, int mode) } } -void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { +void key_callback(GLFWwindow*, int key, int /*scancode*/, int action, int /*mode*/) { if (action == GLFW_PRESS){ Events::_keys[key] = true; Events::_frames[key] = Events::_current; @@ -49,7 +49,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod } } -void window_size_callback(GLFWwindow* window, int width, int height){ +void window_size_callback(GLFWwindow*, int width, int height){ glViewport(0,0, width, height); Window::width = width; Window::height = height; diff --git a/src/window/Window.cpp b/src/window/Window.cpp index b48f4b0a..05e24727 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -4,10 +4,10 @@ #include "Window.h" GLFWwindow* Window::window; -int Window::width = 0; -int Window::height = 0; +uint Window::width = 0; +uint Window::height = 0; -int Window::initialize(int width, int height, const char* title){ +int Window::initialize(uint width, uint height, const char* title){ glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); diff --git a/src/window/Window.h b/src/window/Window.h index dfce56b6..605cda54 100644 --- a/src/window/Window.h +++ b/src/window/Window.h @@ -1,14 +1,16 @@ #ifndef WINDOW_WINDOW_H_ #define WINDOW_WINDOW_H_ +#include "../typedefs.h" + class GLFWwindow; class Window { public: - static int width; - static int height; + static uint width; + static uint height; static GLFWwindow* window; // не лучшее решение делать window публичным - static int initialize(int width, int height, const char* title); + static int initialize(uint width, uint height, const char* title); static void terminate(); static void viewport(int x, int y, int width, int height); From fb34f603aee2e90cdbda7e7bd8bc72234f6eb353 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:10:42 +0300 Subject: [PATCH 10/19] Added spng support --- CMakeLists.txt | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 73978c3a..2b8654f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(MSVC) - target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX) + target_compile_options(${PROJECT_NAME} PRIVATE /W4) else() target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) endif() @@ -18,17 +18,19 @@ option(VE_USE_SYSTEM_LIBS "Use system installed libraries" ON) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenAL REQUIRED) -find_package(PNG REQUIRED) + +if (WIN32) + set(PNGLIB spng) +else() + find_package(PNG REQUIRED) + set(PNGLIB PNG::PNG) +endif(WIN32) set(LIBS "") -if(NOT VE_USE_SYSTEM_LIBS) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glm) - set(LIBS glm) -else() - find_package(glfw3 REQUIRED) - find_package(glm REQUIRED) -endif(NOT VE_USE_SYSTEM_LIBS) + +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glm) +set(LIBS glm) if(UNIX) find_package(Threads REQUIRED) @@ -36,6 +38,6 @@ if(UNIX) endif(UNIX) -target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW PNG::PNG) +target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW spng) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/res DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/build) From c4e097727da61e6ceb93ad2a3ef964cade9e43b6 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:18:36 +0300 Subject: [PATCH 11/19] Update CMakeLists.txt --- CMakeLists.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b8654f4..de5f1f0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,12 +9,12 @@ target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glm) else() target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) endif() -option(VE_USE_SYSTEM_LIBS "Use system installed libraries" ON) - find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenAL REQUIRED) @@ -27,9 +27,6 @@ else() endif(WIN32) set(LIBS "") - -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glm) set(LIBS glm) if(UNIX) @@ -38,6 +35,6 @@ if(UNIX) endif(UNIX) -target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW spng) +target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW ${PNGLIB}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/res DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/build) From 89d78bd44ce68d581dbeb1017144dd833c538412 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:21:43 +0300 Subject: [PATCH 12/19] Delete Debug directory --- Debug/makefile | 82 ------------------------------------ Debug/objects.mk | 8 ---- Debug/res | 1 - Debug/sources.mk | 37 ---------------- Debug/src/audio/subdir.mk | 27 ------------ Debug/src/files/subdir.mk | 27 ------------ Debug/src/graphics/subdir.mk | 54 ------------------------ Debug/src/lighting/subdir.mk | 30 ------------- Debug/src/loaders/subdir.mk | 24 ----------- Debug/src/objects/subdir.mk | 24 ----------- Debug/src/physics/subdir.mk | 27 ------------ Debug/src/subdir.mk | 39 ----------------- Debug/src/voxels/subdir.mk | 42 ------------------ Debug/src/window/subdir.mk | 30 ------------- Debug/src/world/subdir.mk | 27 ------------ 15 files changed, 479 deletions(-) delete mode 100644 Debug/makefile delete mode 100644 Debug/objects.mk delete mode 120000 Debug/res delete mode 100644 Debug/sources.mk delete mode 100644 Debug/src/audio/subdir.mk delete mode 100644 Debug/src/files/subdir.mk delete mode 100644 Debug/src/graphics/subdir.mk delete mode 100644 Debug/src/lighting/subdir.mk delete mode 100644 Debug/src/loaders/subdir.mk delete mode 100644 Debug/src/objects/subdir.mk delete mode 100644 Debug/src/physics/subdir.mk delete mode 100644 Debug/src/subdir.mk delete mode 100644 Debug/src/voxels/subdir.mk delete mode 100644 Debug/src/window/subdir.mk delete mode 100644 Debug/src/world/subdir.mk diff --git a/Debug/makefile b/Debug/makefile deleted file mode 100644 index 0247a747..00000000 --- a/Debug/makefile +++ /dev/null @@ -1,82 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - --include ../makefile.init - -RM := rm -rf - -# All of the sources participating in the build are defined here --include sources.mk --include src/world/subdir.mk --include src/window/subdir.mk --include src/voxels/subdir.mk --include src/physics/subdir.mk --include src/objects/subdir.mk --include src/loaders/subdir.mk --include src/lighting/subdir.mk --include src/graphics/subdir.mk --include src/files/subdir.mk --include src/audio/subdir.mk --include src/subdir.mk --include subdir.mk --include objects.mk - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(strip $(CC_DEPS)),) --include $(CC_DEPS) -endif -ifneq ($(strip $(C++_DEPS)),) --include $(C++_DEPS) -endif -ifneq ($(strip $(C_UPPER_DEPS)),) --include $(C_UPPER_DEPS) -endif -ifneq ($(strip $(CXX_DEPS)),) --include $(CXX_DEPS) -endif -ifneq ($(strip $(C_DEPS)),) --include $(C_DEPS) -endif -ifneq ($(strip $(CPP_DEPS)),) --include $(CPP_DEPS) -endif -endif - --include ../makefile.defs - -OPTIONAL_TOOL_DEPS := \ -$(wildcard ../makefile.defs) \ -$(wildcard ../makefile.init) \ -$(wildcard ../makefile.targets) \ - - -BUILD_ARTIFACT_NAME := voxel_engine -BUILD_ARTIFACT_EXTENSION := -BUILD_ARTIFACT_PREFIX := -BUILD_ARTIFACT := $(BUILD_ARTIFACT_PREFIX)$(BUILD_ARTIFACT_NAME)$(if $(BUILD_ARTIFACT_EXTENSION),.$(BUILD_ARTIFACT_EXTENSION),) - -# Add inputs and outputs from these tool invocations to the build variables - -# All Target -all: main-build - -# Main-build Target -main-build: voxel_engine - -# Tool invocations -voxel_engine: $(OBJS) $(USER_OBJS) makefile objects.mk $(OPTIONAL_TOOL_DEPS) - @echo 'Building target: $@' - @echo 'Invoking: Cross G++ Linker' - g++ -pthread -o "voxel_engine" $(OBJS) $(USER_OBJS) $(LIBS) - @echo 'Finished building target: $@' - @echo ' ' - -# Other Targets -clean: - -$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(C_DEPS)$(CPP_DEPS) voxel_engine - -@echo ' ' - -.PHONY: all clean dependents main-build - --include ../makefile.targets diff --git a/Debug/objects.mk b/Debug/objects.mk deleted file mode 100644 index b7d25c5b..00000000 --- a/Debug/objects.mk +++ /dev/null @@ -1,8 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -USER_OBJS := - -LIBS := -lglfw -lpng -lGL -lGLEW -lstdc++fs -lopenal - diff --git a/Debug/res b/Debug/res deleted file mode 120000 index 85ee7023..00000000 --- a/Debug/res +++ /dev/null @@ -1 +0,0 @@ -../res \ No newline at end of file diff --git a/Debug/sources.mk b/Debug/sources.mk deleted file mode 100644 index 39d73484..00000000 --- a/Debug/sources.mk +++ /dev/null @@ -1,37 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -C_UPPER_SRCS := -CXX_SRCS := -C++_SRCS := -OBJ_SRCS := -CC_SRCS := -ASM_SRCS := -C_SRCS := -CPP_SRCS := -O_SRCS := -S_UPPER_SRCS := -CC_DEPS := -C++_DEPS := -EXECUTABLES := -OBJS := -C_UPPER_DEPS := -CXX_DEPS := -C_DEPS := -CPP_DEPS := - -# Every subdirectory with source files must be described here -SUBDIRS := \ -src \ -src/audio \ -src/files \ -src/graphics \ -src/lighting \ -src/loaders \ -src/objects \ -src/physics \ -src/voxels \ -src/window \ -src/world \ - diff --git a/Debug/src/audio/subdir.mk b/Debug/src/audio/subdir.mk deleted file mode 100644 index a12515df..00000000 --- a/Debug/src/audio/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/audio/Audio.cpp \ -../src/audio/audioutil.cpp - -OBJS += \ -./src/audio/Audio.o \ -./src/audio/audioutil.o - -CPP_DEPS += \ -./src/audio/Audio.d \ -./src/audio/audioutil.d - - -# Each subdirectory must supply rules for building sources it contributes -src/audio/%.o: ../src/audio/%.cpp src/audio/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/files/subdir.mk b/Debug/src/files/subdir.mk deleted file mode 100644 index 42a70dfe..00000000 --- a/Debug/src/files/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/files/WorldFiles.cpp \ -../src/files/files.cpp - -OBJS += \ -./src/files/WorldFiles.o \ -./src/files/files.o - -CPP_DEPS += \ -./src/files/WorldFiles.d \ -./src/files/files.d - - -# Each subdirectory must supply rules for building sources it contributes -src/files/%.o: ../src/files/%.cpp src/files/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/graphics/subdir.mk b/Debug/src/graphics/subdir.mk deleted file mode 100644 index 743d753c..00000000 --- a/Debug/src/graphics/subdir.mk +++ /dev/null @@ -1,54 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/graphics/Batch2D.cpp \ -../src/graphics/Batch3D.cpp \ -../src/graphics/Font.cpp \ -../src/graphics/LineBatch.cpp \ -../src/graphics/Mesh.cpp \ -../src/graphics/Shader.cpp \ -../src/graphics/Texture.cpp \ -../src/graphics/Sprite.cpp \ -../src/graphics/UVRegion.cpp \ -../src/graphics/Framebuffer.cpp \ -../src/graphics/VoxelRenderer.cpp - -OBJS += \ -./src/graphics/Batch2D.o \ -./src/graphics/Batch3D.o \ -./src/graphics/Font.o \ -./src/graphics/LineBatch.o \ -./src/graphics/Mesh.o \ -./src/graphics/Shader.o \ -./src/graphics/Texture.o \ -./src/graphics/Sprite.o \ -./src/graphics/UVRegion.o \ -./src/graphics/Framebuffer.o \ -./src/graphics/VoxelRenderer.o - -CPP_DEPS += \ -./src/graphics/Batch2D.d \ -./src/graphics/Batch3D.d \ -./src/graphics/Font.d \ -./src/graphics/LineBatch.d \ -./src/graphics/Mesh.d \ -./src/graphics/Shader.d \ -./src/graphics/Texture.d \ -./src/graphics/Sprite.d \ -./src/graphics/UVRegion.d \ -./src/graphics/Framebuffer.d \ -./src/graphics/VoxelRenderer.d - - -# Each subdirectory must supply rules for building sources it contributes -src/graphics/%.o: ../src/graphics/%.cpp src/graphics/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/lighting/subdir.mk b/Debug/src/lighting/subdir.mk deleted file mode 100644 index aed4c28a..00000000 --- a/Debug/src/lighting/subdir.mk +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/lighting/LightSolver.cpp \ -../src/lighting/Lighting.cpp \ -../src/lighting/Lightmap.cpp - -OBJS += \ -./src/lighting/LightSolver.o \ -./src/lighting/Lighting.o \ -./src/lighting/Lightmap.o - -CPP_DEPS += \ -./src/lighting/LightSolver.d \ -./src/lighting/Lighting.d \ -./src/lighting/Lightmap.d - - -# Each subdirectory must supply rules for building sources it contributes -src/lighting/%.o: ../src/lighting/%.cpp src/lighting/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/loaders/subdir.mk b/Debug/src/loaders/subdir.mk deleted file mode 100644 index 771a7f80..00000000 --- a/Debug/src/loaders/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/loaders/png_loading.cpp - -OBJS += \ -./src/loaders/png_loading.o - -CPP_DEPS += \ -./src/loaders/png_loading.d - - -# Each subdirectory must supply rules for building sources it contributes -src/loaders/%.o: ../src/loaders/%.cpp src/loaders/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/objects/subdir.mk b/Debug/src/objects/subdir.mk deleted file mode 100644 index 4757b8dd..00000000 --- a/Debug/src/objects/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# 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: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/physics/subdir.mk b/Debug/src/physics/subdir.mk deleted file mode 100644 index 0be00411..00000000 --- a/Debug/src/physics/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/physics/Hitbox.cpp \ -../src/physics/PhysicsSolver.cpp - -OBJS += \ -./src/physics/Hitbox.o \ -./src/physics/PhysicsSolver.o - -CPP_DEPS += \ -./src/physics/Hitbox.d \ -./src/physics/PhysicsSolver.d - - -# Each subdirectory must supply rules for building sources it contributes -src/physics/%.o: ../src/physics/%.cpp src/physics/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/subdir.mk b/Debug/src/subdir.mk deleted file mode 100644 index 60c123c4..00000000 --- a/Debug/src/subdir.mk +++ /dev/null @@ -1,39 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/Assets.cpp \ -../src/player_control.cpp \ -../src/hud_render.cpp \ -../src/world_render.cpp \ -../src/declarations.cpp \ -../src/voxel_engine.cpp - -OBJS += \ -./src/Assets.o \ -./src/player_control.o \ -./src/hud_render.o \ -./src/world_render.o \ -./src/declarations.o \ -./src/voxel_engine.o - -CPP_DEPS += \ -./src/Assets.d \ -./src/player_control.d \ -./src/hud_render.d \ -./src/world_render.d \ -./src/declarations.d \ -./src/voxel_engine.d - - -# Each subdirectory must supply rules for building sources it contributes -src/%.o: ../src/%.cpp src/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/voxels/subdir.mk b/Debug/src/voxels/subdir.mk deleted file mode 100644 index f4dc0a33..00000000 --- a/Debug/src/voxels/subdir.mk +++ /dev/null @@ -1,42 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/voxels/Block.cpp \ -../src/voxels/Chunk.cpp \ -../src/voxels/Chunks.cpp \ -../src/voxels/ChunksController.cpp \ -../src/voxels/ChunksLoader.cpp \ -../src/voxels/WorldGenerator.cpp \ -../src/voxels/voxel.cpp - -OBJS += \ -./src/voxels/Block.o \ -./src/voxels/Chunk.o \ -./src/voxels/Chunks.o \ -./src/voxels/ChunksController.o \ -./src/voxels/ChunksLoader.o \ -./src/voxels/WorldGenerator.o \ -./src/voxels/voxel.o - -CPP_DEPS += \ -./src/voxels/Block.d \ -./src/voxels/Chunk.d \ -./src/voxels/Chunks.d \ -./src/voxels/ChunksController.d \ -./src/voxels/ChunksLoader.d \ -./src/voxels/WorldGenerator.d \ -./src/voxels/voxel.d - - -# Each subdirectory must supply rules for building sources it contributes -src/voxels/%.o: ../src/voxels/%.cpp src/voxels/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/window/subdir.mk b/Debug/src/window/subdir.mk deleted file mode 100644 index d7e6dc9f..00000000 --- a/Debug/src/window/subdir.mk +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/window/Camera.cpp \ -../src/window/Events.cpp \ -../src/window/Window.cpp - -OBJS += \ -./src/window/Camera.o \ -./src/window/Events.o \ -./src/window/Window.o - -CPP_DEPS += \ -./src/window/Camera.d \ -./src/window/Events.d \ -./src/window/Window.d - - -# Each subdirectory must supply rules for building sources it contributes -src/window/%.o: ../src/window/%.cpp src/window/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug/src/world/subdir.mk b/Debug/src/world/subdir.mk deleted file mode 100644 index 0d5d11aa..00000000 --- a/Debug/src/world/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/world/Level.cpp \ -../src/world/World.cpp - -OBJS += \ -./src/world/Level.o \ -./src/world/World.o - -CPP_DEPS += \ -./src/world/Level.d \ -./src/world/World.d - - -# Each subdirectory must supply rules for building sources it contributes -src/world/%.o: ../src/world/%.cpp src/world/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: Cross G++ Compiler' - g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - From 2b6cb192fd317a2460f4eaea4b1f14084fb2317c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:21:55 +0300 Subject: [PATCH 13/19] Delete Debug_win directory --- Debug_win/makefile | 80 -------------------------------- Debug_win/objects.mk | 8 ---- Debug_win/sources.mk | 36 -------------- Debug_win/src/files/subdir.mk | 27 ----------- Debug_win/src/graphics/subdir.mk | 35 -------------- Debug_win/src/lighting/subdir.mk | 30 ------------ Debug_win/src/loaders/subdir.mk | 24 ---------- Debug_win/src/objects/subdir.mk | 20 -------- Debug_win/src/physics/subdir.mk | 27 ----------- Debug_win/src/subdir.mk | 23 --------- Debug_win/src/voxels/subdir.mk | 42 ----------------- Debug_win/src/window/subdir.mk | 30 ------------ 12 files changed, 382 deletions(-) delete mode 100644 Debug_win/makefile delete mode 100644 Debug_win/objects.mk delete mode 100644 Debug_win/sources.mk delete mode 100644 Debug_win/src/files/subdir.mk delete mode 100644 Debug_win/src/graphics/subdir.mk delete mode 100644 Debug_win/src/lighting/subdir.mk delete mode 100644 Debug_win/src/loaders/subdir.mk delete mode 100644 Debug_win/src/objects/subdir.mk delete mode 100644 Debug_win/src/physics/subdir.mk delete mode 100644 Debug_win/src/subdir.mk delete mode 100644 Debug_win/src/voxels/subdir.mk delete mode 100644 Debug_win/src/window/subdir.mk diff --git a/Debug_win/makefile b/Debug_win/makefile deleted file mode 100644 index 3cb199b9..00000000 --- a/Debug_win/makefile +++ /dev/null @@ -1,80 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - --include ../makefile.init - -RM := rm -rf - -# All of the sources participating in the build are defined here --include sources.mk --include src/window/subdir.mk --include src/voxels/subdir.mk --include src/physics/subdir.mk --include src/objects/subdir.mk --include src/loaders/subdir.mk --include src/lighting/subdir.mk --include src/graphics/subdir.mk --include src/files/subdir.mk --include src/subdir.mk --include subdir.mk --include objects.mk - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(strip $(CC_DEPS)),) --include $(CC_DEPS) -endif -ifneq ($(strip $(C++_DEPS)),) --include $(C++_DEPS) -endif -ifneq ($(strip $(C_UPPER_DEPS)),) --include $(C_UPPER_DEPS) -endif -ifneq ($(strip $(CXX_DEPS)),) --include $(CXX_DEPS) -endif -ifneq ($(strip $(CPP_DEPS)),) --include $(CPP_DEPS) -endif -ifneq ($(strip $(C_DEPS)),) --include $(C_DEPS) -endif -endif - --include ../makefile.defs - -OPTIONAL_TOOL_DEPS := \ -$(wildcard ../makefile.defs) \ -$(wildcard ../makefile.init) \ -$(wildcard ../makefile.targets) \ - - -BUILD_ARTIFACT_NAME := VOXEL_ENGINE -BUILD_ARTIFACT_EXTENSION := exe -BUILD_ARTIFACT_PREFIX := -BUILD_ARTIFACT := $(BUILD_ARTIFACT_PREFIX)$(BUILD_ARTIFACT_NAME)$(if $(BUILD_ARTIFACT_EXTENSION),.$(BUILD_ARTIFACT_EXTENSION),) - -# Add inputs and outputs from these tool invocations to the build variables - -# All Target -all: main-build - -# Main-build Target -std=c++0x -main-build: VOXEL_ENGINE.exe - -# Tool invocations -VOXEL_ENGINE.exe: $(OBJS) $(USER_OBJS) makefile objects.mk $(OPTIONAL_TOOL_DEPS) - @echo 'Building target: $@' - @echo 'Invoking: MinGW C++ Linker' - g++ -lpthread -o "VOXEL_ENGINE.exe" $(OBJS) $(USER_OBJS) $(LIBS) -static-libgcc -static-libstdc++ - @echo 'Finished building target: $@' - @echo ' ' - -# Other Targets -clean: - -$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(CPP_DEPS)$(C_DEPS) VOXEL_ENGINE.exe - -@echo ' ' - -.PHONY: all clean dependents - --include ../makefile.targets diff --git a/Debug_win/objects.mk b/Debug_win/objects.mk deleted file mode 100644 index f500237b..00000000 --- a/Debug_win/objects.mk +++ /dev/null @@ -1,8 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -USER_OBJS := - -LIBS := -lglfw3 -lglew32 -lopengl32 -lspng -lgdi32 -Wl,-Bstatic -lz - diff --git a/Debug_win/sources.mk b/Debug_win/sources.mk deleted file mode 100644 index e5164945..00000000 --- a/Debug_win/sources.mk +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -C_UPPER_SRCS := -CXX_SRCS := -C++_SRCS := -OBJ_SRCS := -CC_SRCS := -ASM_SRCS := -CPP_SRCS := -C_SRCS := -S_UPPER_SRCS := -O_SRCS := -CC_DEPS := -C++_DEPS := -EXECUTABLES := -OBJS := -C_UPPER_DEPS := -CXX_DEPS := -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/objects \ -src/voxels \ -src/objects \ -src/window \ - diff --git a/Debug_win/src/files/subdir.mk b/Debug_win/src/files/subdir.mk deleted file mode 100644 index 32b6b207..00000000 --- a/Debug_win/src/files/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/files/WorldFiles.cpp \ -../src/files/files.cpp - -OBJS += \ -./src/files/WorldFiles.o \ -./src/files/files.o - -CPP_DEPS += \ -./src/files/WorldFiles.d \ -./src/files/files.d - - -# Each subdirectory must supply rules for building sources it contributes -src/files/%.o: ../src/files/%.cpp src/files/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/graphics/subdir.mk b/Debug_win/src/graphics/subdir.mk deleted file mode 100644 index 2b3a0102..00000000 --- a/Debug_win/src/graphics/subdir.mk +++ /dev/null @@ -1,35 +0,0 @@ -# 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/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/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/Batch2D.d - - -# Each subdirectory must supply rules for building sources it contributes -src/graphics/%.o: ../src/graphics/%.cpp src/graphics/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/lighting/subdir.mk b/Debug_win/src/lighting/subdir.mk deleted file mode 100644 index 1fb85e07..00000000 --- a/Debug_win/src/lighting/subdir.mk +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/lighting/LightSolver.cpp \ -../src/lighting/Lighting.cpp \ -../src/lighting/Lightmap.cpp - -OBJS += \ -./src/lighting/LightSolver.o \ -./src/lighting/Lighting.o \ -./src/lighting/Lightmap.o - -CPP_DEPS += \ -./src/lighting/LightSolver.d \ -./src/lighting/Lighting.d \ -./src/lighting/Lightmap.d - - -# Each subdirectory must supply rules for building sources it contributes -src/lighting/%.o: ../src/lighting/%.cpp src/lighting/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/loaders/subdir.mk b/Debug_win/src/loaders/subdir.mk deleted file mode 100644 index 886e0c90..00000000 --- a/Debug_win/src/loaders/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/loaders/png_loading.cpp - -OBJS += \ -./src/loaders/png_loading.o - -CPP_DEPS += \ -./src/loaders/png_loading.d - - -# Each subdirectory must supply rules for building sources it contributes -src/loaders/%.o: ../src/loaders/%.cpp src/loaders/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/objects/subdir.mk b/Debug_win/src/objects/subdir.mk deleted file mode 100644 index ce3e7c3d..00000000 --- a/Debug_win/src/objects/subdir.mk +++ /dev/null @@ -1,20 +0,0 @@ -# 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/physics/subdir.mk b/Debug_win/src/physics/subdir.mk deleted file mode 100644 index b68f9857..00000000 --- a/Debug_win/src/physics/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/physics/Hitbox.cpp \ -../src/physics/PhysicsSolver.cpp - -OBJS += \ -./src/physics/Hitbox.o \ -./src/physics/PhysicsSolver.o - -CPP_DEPS += \ -./src/physics/Hitbox.d \ -./src/physics/PhysicsSolver.d - - -# Each subdirectory must supply rules for building sources it contributes -src/physics/%.o: ../src/physics/%.cpp src/physics/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 deleted file mode 100644 index a0330fab..00000000 --- a/Debug_win/src/subdir.mk +++ /dev/null @@ -1,23 +0,0 @@ -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/voxel_engine.cpp \ -../src/Assets.cpp - -OBJS += \ -./src/voxel_engine.o \ -./src/Assets.o - -CPP_DEPS += \ -./src/voxel_engine.d \ -./src/Assets.d - - -# Each subdirectory must supply rules for building sources it contributes -src/%.o: ../src/%.cpp src/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/voxels/subdir.mk b/Debug_win/src/voxels/subdir.mk deleted file mode 100644 index c1481c5f..00000000 --- a/Debug_win/src/voxels/subdir.mk +++ /dev/null @@ -1,42 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/voxels/Block.cpp \ -../src/voxels/Chunk.cpp \ -../src/voxels/Chunks.cpp \ -../src/voxels/ChunksController.cpp \ -../src/voxels/ChunksLoader.cpp \ -../src/voxels/WorldGenerator.cpp \ -../src/voxels/voxel.cpp - -OBJS += \ -./src/voxels/Block.o \ -./src/voxels/Chunk.o \ -./src/voxels/Chunks.o \ -./src/voxels/ChunksController.o \ -./src/voxels/ChunksLoader.o \ -./src/voxels/WorldGenerator.o \ -./src/voxels/voxel.o - -CPP_DEPS += \ -./src/voxels/Block.d \ -./src/voxels/Chunk.d \ -./src/voxels/Chunks.d \ -./src/voxels/ChunksController.d \ -./src/voxels/ChunksLoader.d \ -./src/voxels/WorldGenerator.d \ -./src/voxels/voxel.d - - -# Each subdirectory must supply rules for building sources it contributes -src/voxels/%.o: ../src/voxels/%.cpp src/voxels/subdir.mk - @echo 'Building file: $<' - @echo 'Invoking: GCC C++ Compiler' - g++ -D _WIN32_WINNT=0501 -pthread -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/Debug_win/src/window/subdir.mk b/Debug_win/src/window/subdir.mk deleted file mode 100644 index 4f72e81e..00000000 --- a/Debug_win/src/window/subdir.mk +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -CPP_SRCS += \ -../src/window/Camera.cpp \ -../src/window/Events.cpp \ -../src/window/Window.cpp - -OBJS += \ -./src/window/Camera.o \ -./src/window/Events.o \ -./src/window/Window.o - -CPP_DEPS += \ -./src/window/Camera.d \ -./src/window/Events.d \ -./src/window/Window.d - - -# Each subdirectory must supply rules for building sources it contributes -src/window/%.o: ../src/window/%.cpp src/window/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 ' ' - - From bec5bd7e46ebd0e63d81451cf3e32993e4b24891 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:22:48 +0300 Subject: [PATCH 14/19] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 8818b84a..aaec2135 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,6 @@ - **F** - toggle flight mode - **Esc** - exit -# Run in linux: -`$ git clone https://github.com/MihailRis/VoxelEngine-Cpp.git` - -`$ cd VoxelEngine-Cpp/Debug` - -`$ make` - -`$ ./voxel_engine` - #### Build with CMake ```sh git clone --recursive https://github.com/MihailRis/VoxelEngine-Cpp.git From 5954369744dcf8d1e52efc5613c81ead199e9957 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 09:56:56 +0300 Subject: [PATCH 15/19] Windows compile fixes --- CMakeLists.txt | 4 +--- src/voxels/ChunksController.cpp | 2 +- src/voxels/ChunksLoader.h | 4 ++-- src/window/Window.cpp | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index de5f1f0e..36b489df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,6 @@ target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glm) else() target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) endif() @@ -21,13 +19,13 @@ find_package(OpenAL REQUIRED) if (WIN32) set(PNGLIB spng) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs/glfw) else() find_package(PNG REQUIRED) set(PNGLIB PNG::PNG) endif(WIN32) set(LIBS "") -set(LIBS glm) if(UNIX) find_package(Threads REQUIRED) diff --git a/src/voxels/ChunksController.cpp b/src/voxels/ChunksController.cpp index b943e260..e3fc3a71 100644 --- a/src/voxels/ChunksController.cpp +++ b/src/voxels/ChunksController.cpp @@ -10,7 +10,7 @@ #include #include -#ifdef _WIN32 +#if defined(_WIN32) && defined(__MINGW32__) #define _WIN32_WINNT 0x0501 #include #else diff --git a/src/voxels/ChunksLoader.h b/src/voxels/ChunksLoader.h index 876b0c8c..27a656e9 100644 --- a/src/voxels/ChunksLoader.h +++ b/src/voxels/ChunksLoader.h @@ -1,12 +1,12 @@ #ifndef VOXELS_CHUNKSLOADER_H_ #define VOXELS_CHUNKSLOADER_H_ -#ifdef _WIN32 +#if defined(_WIN32) && defined(__MINGW32__) #define _WIN32_WINNT 0x0501 #include #else #include -#endif +#endif // _WIN32 && __MINGW32__ #include diff --git a/src/window/Window.cpp b/src/window/Window.cpp index 05e24727..9a11b210 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -1,9 +1,9 @@ #include +#include "Window.h" #include #include -#include "Window.h" -GLFWwindow* Window::window; +GLFWwindow* Window::window = nullptr; uint Window::width = 0; uint Window::height = 0; From 5a6a5bbb05fd74c506fad669a7f18ffedee10c19 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Oct 2023 14:12:51 +0300 Subject: [PATCH 16/19] GCC warnings fix --- CMakeLists.txt | 6 +++++- src/hud_render.cpp | 42 ------------------------------------------ 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36b489df..ec6e1ede 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,11 @@ target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) else() - target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra + # additional warnings + -Wformat-nonliteral -Wcast-align + -Wpointer-arith -Winline -Wundef + -Wwrite-strings -Wno-unused-parameter) endif() find_package(OpenGL REQUIRED) diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 9e028b03..6d1e008b 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -20,19 +20,6 @@ HudRenderer::HudRenderer() { - // float vertices[] = { - // // x y - // -0.01f,-0.01f, - // 0.01f, 0.01f, - - // -0.01f, 0.01f, - // 0.01f,-0.01f, - // }; - // int attrs[] = { - // 2, 0 //null terminator - // }; - // crosshair = new Mesh(vertices, 4, attrs); - batch = new Batch2D(1024); uicamera = new Camera(glm::vec3(), Window::height / 1.0f); uicamera->perspective = false; @@ -79,7 +66,6 @@ void HudRenderer::draw(Level* level, Assets* assets){ // Chosen block preview Texture* blocks = assets->getTexture("block"); - Texture* sprite = assets->getTexture("slot"); batch->texture(nullptr); batch->color = vec4(1.0f); @@ -90,13 +76,6 @@ void HudRenderer::draw(Level* level, Assets* assets){ batch->line(Window::width/2-5, Window::height/2-5, Window::width/2+5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); batch->line(Window::width/2+5, Window::height/2-5, Window::width/2-5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); } - - // batch->texture(sprite); - // batch->sprite(Window::width/2-32, uicamera->fov - 80, 64, 64, 16, 0, vec4(1.0f)); - // batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, - // 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, - // 0.55f, 0.55f, 0.55f, - // 0.45f, 0.45f, 0.45f, 0.7f, 0.7f, 0.7f, 2); batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, 0.95f, 0.95f, 0.95f, 0.85f, 0.85f, 0.85f, 0.7f, 0.7f, 0.7f, @@ -167,7 +146,6 @@ void HudRenderer::draw(Level* level, Assets* assets){ for (uint i = 1; i < count; i++) { x = xs + step * ((i-1) % (inv_w / step)); y = ys + step * ((i-1) / (inv_w / step)); - // batch->rect(x-2, y-2, size+4, size+4); batch->rect(x-2, y-2, size+4, size+4, 0.45f, 0.45f, 0.45f, 0.55f, 0.55f, 0.55f, 0.7f, 0.7f, 0.7f, @@ -178,13 +156,6 @@ void HudRenderer::draw(Level* level, Assets* assets){ 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 2); } - // batch->color = vec4(0.5f, 0.5f, 0.5f, 1.0f); - // for (unsigned i = 1; i < count; i++) { - // x = xs + step * ((i-1) % (inv_w / step)); - // y = ys + step * ((i-1) / (inv_w / step)); - // batch->rect(x, y, size, size); - // } - //front batch->texture(blocks); for (uint i = 1; i < count; i++) { @@ -200,10 +171,8 @@ void HudRenderer::draw(Level* level, Assets* assets){ if (Events::jclicked(GLFW_MOUSE_BUTTON_LEFT)) { player->choosenBlock = i; } - // size = 50; } else { - // size = 48; tint = vec4(1.0f); } @@ -214,15 +183,4 @@ void HudRenderer::draw(Level* level, Assets* assets){ } } } - - // batch->render(); - - if (Events::_cursor_locked && !level->player->debug){ - // Shader* crosshairShader = assets->getShader("crosshair"); - // crosshairShader->use(); - // crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); - // crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); - // glLineWidth(2.0f); - // crosshair->draw(GL_LINES); - } } From 3e1f5fb9b35db4ef50b42d8e35e1dc73380ca666 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 25 Oct 2023 18:56:18 +0300 Subject: [PATCH 17/19] Added '-no-pie' flag for GCC --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec6e1ede..8bfc3f09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,10 @@ if(UNIX) set(LIBS ${LIBS} Threads::Threads) endif(UNIX) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") +endif() + target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW ${PNGLIB}) From 972db16a0cde1d8aa78080e90032ed2a59da716c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 30 Oct 2023 00:19:56 +0300 Subject: [PATCH 18/19] Added run.sh --- run.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 run.sh diff --git a/run.sh b/run.sh new file mode 100644 index 00000000..e33f4a8e --- /dev/null +++ b/run.sh @@ -0,0 +1,6 @@ +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release ../ +make +cd .. +build/VoxelEngine From 05763162825c843775314ac158e9039e7177f911 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 30 Oct 2023 15:19:58 +0300 Subject: [PATCH 19/19] Engine core and assets loading refactor --- src/AssetsLoader.cpp | 79 +++++++++++++++ src/AssetsLoader.h | 38 ++++++++ src/declarations.cpp | 67 ++----------- src/declarations.h | 4 +- src/hud_render.cpp | 42 ++++++++ src/voxel_engine.cpp | 225 ++++++++++++++++++++----------------------- src/world/Level.cpp | 15 +++ src/world/Level.h | 3 + src/world/World.cpp | 28 ++++++ src/world/World.h | 5 + 10 files changed, 325 insertions(+), 181 deletions(-) create mode 100644 src/AssetsLoader.cpp create mode 100644 src/AssetsLoader.h diff --git a/src/AssetsLoader.cpp b/src/AssetsLoader.cpp new file mode 100644 index 00000000..eaeba7b9 --- /dev/null +++ b/src/AssetsLoader.cpp @@ -0,0 +1,79 @@ +#include "AssetsLoader.h" +#include "Assets.h" + +#include + +AssetsLoader::AssetsLoader(Assets* assets) : assets(assets) { +} + +void AssetsLoader::addLoader(int tag, aloader_func func) { + loaders[tag] = func; +} + +void AssetsLoader::add(int tag, const std::string filename, const std::string alias) { + entries.push(aloader_entry{ tag, filename, alias }); +} + +bool AssetsLoader::hasNext() const { + return !entries.empty(); +} + +bool AssetsLoader::loadNext() { + const aloader_entry& entry = entries.front(); + std::cout << " loading " << entry.filename << " as " << entry.alias << std::endl; + std::cout.flush(); + auto found = loaders.find(entry.tag); + if (found == loaders.end()) { + std::cerr << "unknown asset tag " << entry.tag << std::endl; + return false; + } + aloader_func loader = found->second; + bool status = loader(assets, entry.filename, entry.alias); + entries.pop(); + return status; +} + +#include "graphics/Shader.h" +#include "graphics/Texture.h" +#include "graphics/Font.h" + +bool _load_shader(Assets* assets, const std::string& filename, const std::string& name) { + Shader* shader = load_shader(filename + ".glslv", filename + ".glslf"); + if (shader == nullptr) { + std::cerr << "failed to load shader '" << name << "'" << std::endl; + return false; + } + assets->store(shader, name); + return true; +} + +bool _load_texture(Assets* assets, const std::string& filename, const 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; +} + +bool _load_font(Assets* assets, const std::string& filename, const std::string& name) { + std::vector pages; + for (size_t i = 0; i <= 4; i++) { + Texture* texture = load_texture(filename + "_" + std::to_string(i) + ".png"); + if (texture == nullptr) { + std::cerr << "failed to load bitmap font '" << name << "' (missing page " << std::to_string(i) << ")" << std::endl; + return false; + } + pages.push_back(texture); + } + Font* font = new Font(pages); + assets->store(font, name); + return true; +} + +void AssetsLoader::createDefaults(AssetsLoader& loader) { + loader.addLoader(ASSET_SHADER, _load_shader); + loader.addLoader(ASSET_TEXTURE, _load_texture); + loader.addLoader(ASSET_FONT, _load_font); +} diff --git a/src/AssetsLoader.h b/src/AssetsLoader.h new file mode 100644 index 00000000..ff4ff5ed --- /dev/null +++ b/src/AssetsLoader.h @@ -0,0 +1,38 @@ +#ifndef SRC_ASSETS_LOADER_H +#define SRC_ASSETS_LOADER_H + +#include +#include +#include +#include + +#define ASSET_TEXTURE 1 +#define ASSET_SHADER 2 +#define ASSET_FONT 3 + +class Assets; + +typedef std::function aloader_func; + +struct aloader_entry { + int tag; + const std::string filename; + const std::string alias; +}; + +class AssetsLoader { + Assets* assets; + std::map loaders; + std::queue entries; +public: + AssetsLoader(Assets* assets); + void addLoader(int tag, aloader_func func); + void add(int tag, const std::string filename, const std::string alias); + + bool hasNext() const; + bool loadNext(); + + static void createDefaults(AssetsLoader& loader); +}; + +#endif // SRC_ASSETS_LOADER_H \ No newline at end of file diff --git a/src/declarations.cpp b/src/declarations.cpp index bb85c0c1..2f89985d 100644 --- a/src/declarations.cpp +++ b/src/declarations.cpp @@ -1,70 +1,21 @@ #include "declarations.h" -#include "Assets.h" -#include "graphics/Shader.h" -#include "graphics/Texture.h" -#include "graphics/Font.h" +#include "AssetsLoader.h" #include "window/Window.h" #include "voxels/Block.h" -// Shaders, textures -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 '" << name << "'" << std::endl; - return false; - } - assets->store(shader, name); - return true; -} -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; -} +void initialize_assets(AssetsLoader* loader) { + loader->add(ASSET_SHADER, "res/main", "main"); + loader->add(ASSET_SHADER, "res/crosshair", "crosshair"); + loader->add(ASSET_SHADER, "res/lines", "lines"); + loader->add(ASSET_SHADER, "res/ui", "ui"); -bool _load_font(Assets* assets, std::string filename, std::string name){ - std::vector pages; - for (size_t i = 0; i <= 4; i++){ - Texture* texture = load_texture(filename+"_"+std::to_string(i)+".png"); - if (texture == nullptr){ - std::cerr << "failed to load bitmap font '" << name << "' (missing page " << std::to_string(i) << ")" << std::endl; - return false; - } - pages.push_back(texture); - } - Font* font = new Font(pages); - assets->store(font, name); - return true; -} + loader->add(ASSET_TEXTURE, "res/block.png", "block"); + loader->add(ASSET_TEXTURE, "res/slot.png", "slot"); -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; -#define LOAD_FONT(FILENAME, NAME) \ - if (!_load_font(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_SHADER("res/ui.glslv", "res/ui.glslf", "ui"); - - LOAD_TEXTURE("res/block.png", "block"); - LOAD_TEXTURE("res/slot.png", "slot"); - - LOAD_FONT("res/font", "normal"); - return 0; + loader->add(ASSET_FONT, "res/font", "normal"); } // All in-game definitions (blocks, items, etc..) diff --git a/src/declarations.h b/src/declarations.h index 13ff14be..b2585cb3 100644 --- a/src/declarations.h +++ b/src/declarations.h @@ -21,9 +21,9 @@ #define BLOCK_METAL 15 #define BLOCK_RUST 16 -class Assets; +class AssetsLoader; -int initialize_assets(Assets* assets); +void initialize_assets(AssetsLoader* loader); void setup_definitions(); #endif // DECLARATIONS_H diff --git a/src/hud_render.cpp b/src/hud_render.cpp index 6d1e008b..9e028b03 100644 --- a/src/hud_render.cpp +++ b/src/hud_render.cpp @@ -20,6 +20,19 @@ HudRenderer::HudRenderer() { + // float vertices[] = { + // // x y + // -0.01f,-0.01f, + // 0.01f, 0.01f, + + // -0.01f, 0.01f, + // 0.01f,-0.01f, + // }; + // int attrs[] = { + // 2, 0 //null terminator + // }; + // crosshair = new Mesh(vertices, 4, attrs); + batch = new Batch2D(1024); uicamera = new Camera(glm::vec3(), Window::height / 1.0f); uicamera->perspective = false; @@ -66,6 +79,7 @@ void HudRenderer::draw(Level* level, Assets* assets){ // Chosen block preview Texture* blocks = assets->getTexture("block"); + Texture* sprite = assets->getTexture("slot"); batch->texture(nullptr); batch->color = vec4(1.0f); @@ -76,6 +90,13 @@ void HudRenderer::draw(Level* level, Assets* assets){ batch->line(Window::width/2-5, Window::height/2-5, Window::width/2+5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); batch->line(Window::width/2+5, Window::height/2-5, Window::width/2-5, Window::height/2+5, 0.9f, 0.9f, 0.9f, 1.0f); } + + // batch->texture(sprite); + // batch->sprite(Window::width/2-32, uicamera->fov - 80, 64, 64, 16, 0, vec4(1.0f)); + // batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, + // 0.85f, 0.85f, 0.85f, 0.95f, 0.95f, 0.95f, + // 0.55f, 0.55f, 0.55f, + // 0.45f, 0.45f, 0.45f, 0.7f, 0.7f, 0.7f, 2); batch->rect(Window::width/2-128-4, Window::height-80-4, 256+8, 64+8, 0.95f, 0.95f, 0.95f, 0.85f, 0.85f, 0.85f, 0.7f, 0.7f, 0.7f, @@ -146,6 +167,7 @@ void HudRenderer::draw(Level* level, Assets* assets){ for (uint i = 1; i < count; i++) { x = xs + step * ((i-1) % (inv_w / step)); y = ys + step * ((i-1) / (inv_w / step)); + // batch->rect(x-2, y-2, size+4, size+4); batch->rect(x-2, y-2, size+4, size+4, 0.45f, 0.45f, 0.45f, 0.55f, 0.55f, 0.55f, 0.7f, 0.7f, 0.7f, @@ -156,6 +178,13 @@ void HudRenderer::draw(Level* level, Assets* assets){ 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 0.65f, 2); } + // batch->color = vec4(0.5f, 0.5f, 0.5f, 1.0f); + // for (unsigned i = 1; i < count; i++) { + // x = xs + step * ((i-1) % (inv_w / step)); + // y = ys + step * ((i-1) / (inv_w / step)); + // batch->rect(x, y, size, size); + // } + //front batch->texture(blocks); for (uint i = 1; i < count; i++) { @@ -171,8 +200,10 @@ void HudRenderer::draw(Level* level, Assets* assets){ if (Events::jclicked(GLFW_MOUSE_BUTTON_LEFT)) { player->choosenBlock = i; } + // size = 50; } else { + // size = 48; tint = vec4(1.0f); } @@ -183,4 +214,15 @@ void HudRenderer::draw(Level* level, Assets* assets){ } } } + + // batch->render(); + + if (Events::_cursor_locked && !level->player->debug){ + // Shader* crosshairShader = assets->getShader("crosshair"); + // crosshairShader->use(); + // crosshairShader->uniform1f("u_ar", (float)Window::height / (float)Window::width); + // crosshairShader->uniform1f("u_scale", 1.0f / ((float)Window::height / 1000.0f)); + // glLineWidth(2.0f); + // crosshair->draw(GL_LINES); + } } diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index d5aa94fc..635ebd22 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -10,6 +10,7 @@ #include #include +#include // GLM #include @@ -18,140 +19,124 @@ using namespace glm; -#include "graphics/Shader.h" -#include "graphics/Texture.h" -#include "graphics/Mesh.h" -#include "graphics/VoxelRenderer.h" -#include "graphics/LineBatch.h" -#include "graphics/Batch2D.h" -#include "graphics/Framebuffer.h" #include "window/Window.h" #include "window/Events.h" #include "window/Camera.h" -#include "loaders/png_loading.h" -#include "voxels/voxel.h" +#include "audio/Audio.h" #include "voxels/Chunk.h" #include "voxels/Chunks.h" -#include "voxels/Block.h" -#include "voxels/WorldGenerator.h" #include "voxels/ChunksController.h" -#include "files/files.h" -#include "files/WorldFiles.h" -#include "lighting/LightSolver.h" -#include "lighting/Lightmap.h" -#include "lighting/Lighting.h" -#include "physics/Hitbox.h" -#include "physics/PhysicsSolver.h" -#include "world/World.h" -#include "world/Level.h" - -#include "audio/Audio.h" -#include "audio/audioutil.h" -#include "Assets.h" +#include "voxels/ChunksLoader.h" #include "objects/Player.h" - +#include "world/Level.h" +#include "world/World.h" #include "declarations.h" +#include "Assets.h" +#include "AssetsLoader.h" #include "world_render.h" #include "hud_render.h" -#include "player_control.h" -int WIDTH = 1280; -int HEIGHT = 720; -// Save all world data to files -void write_world(World* world, Level* level){ - WorldFiles* wfile = world->wfile; - Chunks* chunks = level->chunks; +class initialize_error : public std::runtime_error { + initialize_error(const std::string& message) : std::runtime_error(message) {} +}; - for (unsigned int i = 0; i < chunks->volume; i++){ - Chunk* chunk = chunks->chunks[i]; - if (chunk == nullptr || !chunk->isUnsaved()) - continue; - wfile->put((const char*)chunk->voxels, chunk->x, chunk->z); - } +struct EngineSettings { + int displayWidth; + int displayHeight; + const char* title; +}; - wfile->write(); - world->wfile->writePlayer(level->player); -} +class Engine { + Assets* assets; + Level* level; -void update_level(World* world, Level* level, float delta) { - level->playerController->update_controls(delta); - if (Events::_cursor_locked){ - level->playerController->update_interaction(); - } else - { - level->playerController->selectedBlockId = -1; - } - - vec3 position = level->player->hitbox->position; - level->chunks->setCenter(world->wfile, position.x, position.z); -} + uint64_t frame = 0; + float lastTime = 0.0f; + float delta = 0.0f; + bool occlusion = true; +public: + Engine(const EngineSettings& settings); + ~Engine(); -Level* load_level(World* world, Player* player) { - Level* level = new Level(world, player, new Chunks(56, 56, 0, 0), new PhysicsSolver(vec3(0, -19.6f, 0))); - world->wfile->readPlayer(player); + void updateTimers(); + void updateHotkeys(); + void mainloop(); +}; - Camera* camera = player->camera; - camera->rotation = mat4(1.0f); - camera->rotate(player->camY, player->camX, 0); - return level; -} - -int initialize(Assets*& assets) { - Window::initialize(WIDTH, HEIGHT, "VoxelEngine-Cpp v12"); +Engine::Engine(const EngineSettings& settings) { + Window::initialize(settings.displayWidth, settings.displayHeight, settings.title); Events::initialize(); assets = new Assets(); std::cout << "-- loading assets" << std::endl; - int result = initialize_assets(assets); - if (result){ - delete assets; - Window::terminate(); - return result; + AssetsLoader loader(assets); + AssetsLoader::createDefaults(loader); + initialize_assets(&loader); + while (loader.hasNext()) { + if (!loader.loadNext()) { + delete assets; + Window::terminate(); + throw std::runtime_error("could not to initialize assets"); + } } - return 0; + std::cout << "-- loading world" << std::endl; + vec3 playerPosition = vec3(0, 64, 0); + Camera* camera = new Camera(playerPosition, radians(90.0f)); + World* world = new World("world-1", "world/", 42); + Player* player = new Player(playerPosition, 4.0f, camera); + level = world->loadLevel(player); + + std::cout << "-- initializing finished" << std::endl; + + Audio::initialize(); } -void mainloop(Level* level, Assets* assets) { +void Engine::updateTimers() { + frame++; + float currentTime = glfwGetTime(); + delta = currentTime - lastTime; + lastTime = currentTime; +} + +void Engine::updateHotkeys() { + if (Events::jpressed(GLFW_KEY_ESCAPE)) { + Window::setShouldClose(true); + } + if (Events::jpressed(GLFW_KEY_TAB) || Events::jpressed(GLFW_KEY_E)) { + Events::toggleCursor(); + } + if (Events::jpressed(GLFW_KEY_O)) { + occlusion = !occlusion; + } + if (Events::jpressed(GLFW_KEY_F3)) { + level->player->debug = !level->player->debug; + } + if (Events::jpressed(GLFW_KEY_F5)) { + for (unsigned i = 0; i < level->chunks->volume; i++) { + Chunk* chunk = level->chunks->chunks[i]; + if (chunk != nullptr && chunk->isReady()) { + chunk->setModified(true); + } + } + } +} + +void Engine::mainloop() { Camera* camera = level->player->camera; std::cout << "-- preparing systems" << std::endl; World* world = level->world; WorldRenderer worldRenderer(level, assets); HudRenderer hud; - long frame = 0; - float lastTime = glfwGetTime(); - float delta = 0.0f; - bool occlusion = true; + lastTime = glfwGetTime(); + Window::swapInterval(1); while (!Window::isShouldClose()){ - frame++; - float currentTime = glfwGetTime(); - delta = currentTime - lastTime; - lastTime = currentTime; - int fps = 1 / delta; - if (Events::jpressed(GLFW_KEY_ESCAPE)){ - Window::setShouldClose(true); - } - if (Events::jpressed(GLFW_KEY_TAB) || Events::jpressed(GLFW_KEY_E)){ - Events::toggleCursor(); - } - if (Events::jpressed(GLFW_KEY_O)){ - occlusion = !occlusion; - } - if (Events::jpressed(GLFW_KEY_F3)){ - level->player->debug = !level->player->debug; - } - if (Events::jpressed(GLFW_KEY_F5)){ - for (unsigned i = 0; i < level->chunks->volume; i++) { - Chunk* chunk = level->chunks->chunks[i]; - if (chunk != nullptr && chunk->isReady()){ - chunk->setModified(true); - } - } - } + updateTimers(); + updateHotkeys(); - update_level(world, level, delta); + level->update(delta, Events::_cursor_locked); int freeLoaders = level->chunksController->countFreeLoaders(); for (int i = 0; i < freeLoaders; i++) level->chunksController->_buildMeshes(); @@ -165,7 +150,7 @@ void mainloop(Level* level, Assets* assets) { worldRenderer.draw(camera, occlusion); hud.draw(level, assets); if (level->player->debug) { - hud.drawDebug(level, assets, fps, occlusion); + hud.drawDebug(level, assets, 1 / delta, occlusion); } Window::swapBuffers(); @@ -173,28 +158,12 @@ void mainloop(Level* level, Assets* assets) { } } -int main() { - setup_definitions(); - - Assets* assets; - int status = initialize(assets); - if (status) return status; - - std::cout << "-- loading world" << std::endl; - vec3 playerPosition = vec3(0,64,0); - Camera* camera = new Camera(playerPosition, radians(90.0f)); - World* world = new World("world-1", "world/", 42); - Player* player = new Player(playerPosition, 4.0f, camera); - Level* level = load_level(world, player); - - std::cout << "-- initializing finished" << std::endl; - - Audio::initialize(); - mainloop(level, assets); +Engine::~Engine() { Audio::finalize(); + World* world = level->world; std::cout << "-- saving world" << std::endl; - write_world(world, level); + world->write(level); delete level; delete world; @@ -203,5 +172,19 @@ int main() { delete assets; Events::finalize(); Window::terminate(); +} + +int main() { + setup_definitions(); + + try { + Engine engine(EngineSettings{ 1280, 720, "VoxelEngine-Cpp v13" }); + engine.mainloop(); + } + catch (const initialize_error& err) { + std::cerr << "could not to initialize engine" << std::endl; + std::cerr << err.what() << std::endl; + } + return 0; } diff --git a/src/world/Level.cpp b/src/world/Level.cpp index c86f9507..b591fc9d 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -1,8 +1,10 @@ #include "Level.h" +#include "World.h" #include "../lighting/Lighting.h" #include "../voxels/Chunks.h" #include "../voxels/ChunksController.h" #include "../player_control.h" +#include "../physics/Hitbox.h" #include "../physics/PhysicsSolver.h" #include "../objects/Player.h" @@ -24,3 +26,16 @@ Level::~Level(){ delete chunksController; delete playerController; } + +void Level::update(float delta, bool interactions) { + playerController->update_controls(delta); + if (interactions) { + playerController->update_interaction(); + } + else + { + playerController->selectedBlockId = -1; + } + vec3 position = player->hitbox->position; + chunks->setCenter(world->wfile, position.x, position.z); +} diff --git a/src/world/Level.h b/src/world/Level.h index 47728e2a..aea33c5a 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -20,6 +20,9 @@ public: PlayerController* playerController; Level(World* world, Player* player, Chunks* chunks, PhysicsSolver* physics); ~Level(); + + void update(float delta, bool interactions); + }; #endif /* WORLD_LEVEL_H_ */ diff --git a/src/world/World.cpp b/src/world/World.cpp index 2e336dce..04b32d33 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -3,6 +3,10 @@ #include "../files/WorldFiles.h" #include "../voxels/Chunk.h" #include "../voxels/Chunks.h" +#include "Level.h" +#include "../objects/Player.h" +#include "../physics/PhysicsSolver.h" +#include "../window/Camera.h" World::World(std::string name, std::string directory, int seed) : name(name), seed(seed) { wfile = new WorldFiles(directory, REGION_VOL * (CHUNK_VOL * 2 + 8)); @@ -11,3 +15,27 @@ World::World(std::string name, std::string directory, int seed) : name(name), se World::~World(){ delete wfile; } + +void World::write(Level* level) { + Chunks* chunks = level->chunks; + + for (unsigned int i = 0; i < chunks->volume; i++) { + Chunk* chunk = chunks->chunks[i]; + if (chunk == nullptr || !chunk->isUnsaved()) + continue; + wfile->put((const char*)chunk->voxels, chunk->x, chunk->z); + } + + wfile->write(); + wfile->writePlayer(level->player); +} + +Level* World::loadLevel(Player* player) { + Level* level = new Level(this, player, new Chunks(56, 56, 0, 0), new PhysicsSolver(vec3(0, -19.6f, 0))); + wfile->readPlayer(player); + + Camera* camera = player->camera; + camera->rotation = mat4(1.0f); + camera->rotate(player->camY, player->camX, 0); + return level; +} \ No newline at end of file diff --git a/src/world/World.h b/src/world/World.h index 7b51192b..d67b27c6 100644 --- a/src/world/World.h +++ b/src/world/World.h @@ -5,6 +5,8 @@ class WorldFiles; class Chunks; +class Level; +class Player; class World { public: @@ -14,6 +16,9 @@ public: World(std::string name, std::string directory, int seed); ~World(); + + void write(Level* level); + Level* loadLevel(Player* player); }; #endif /* WORLD_WORLD_H_ */