From f04bac6b4366bc4d4076a1409c6d09b9af5343e2 Mon Sep 17 00:00:00 2001 From: lllzebralll Date: Thu, 1 Dec 2022 20:37:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=81=D0=B3=D0=BB=D0=B0=D0=B6=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=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); };