diff --git a/res/shader/geometryFragment.fs b/res/shader/geometryFragment.fs index 3df059f5..f085d6c0 100644 --- a/res/shader/geometryFragment.fs +++ b/res/shader/geometryFragment.fs @@ -11,7 +11,10 @@ in vec3 normal; uniform sampler2D tex; void main() { + vec4 spec = texture(tex, texCoords); + if (spec.a < 0.1) discard; + gPosition = vec4(fragPos, 1); gNormal = vec4(normalize(normal), 1); - gSpecular = texture(tex, texCoords); + gSpecular = spec; } \ No newline at end of file diff --git a/res/shader/geometryVertex.vs b/res/shader/geometryVertex.vs index ad5968ac..b5f33f9b 100644 --- a/res/shader/geometryVertex.vs +++ b/res/shader/geometryVertex.vs @@ -14,11 +14,11 @@ out vec3 fragPos; out vec3 normal; void main() { - vec4 worldPos = model * vec4(aPos, 1.0); + vec4 modelViewPos = view * model * vec4(aPos, 1.0); - fragPos = worldPos.xyz; + fragPos = modelViewPos.xyz; texCoords = aTexCoords.xy; normal = transpose(inverse(mat3(model))) * aNormal; - gl_Position = projection * view * worldPos; + gl_Position = projection * modelViewPos; } diff --git a/res/shader/lightingFragment.fs b/res/shader/lightingFragment.fs index f5cf0808..b80f99d7 100644 --- a/res/shader/lightingFragment.fs +++ b/res/shader/lightingFragment.fs @@ -1,6 +1,9 @@ #version 330 core -out vec4 fragColor; +#define NEAR_FOG vec3(0.40, 0.56, 0.72) +#define FAR_FOG vec3(0.58, 0.76, 0.94) + +out vec4 outColor; in vec2 texCoords; @@ -13,5 +16,14 @@ void main() { vec3 normal = texture(gNormal, texCoords).rgb; vec3 color = texture(gColorSpec, texCoords).rgb; - fragColor = vec4(normal, 1.0); + float shading = (0.8 + abs(normal.x) * 0.15) + (normal.y * 0.15) + 0.2; + float dist = distance(vec3(0, 0, 0), vec3(fragPos)); + + float nearFog = min(max(dist - 200, 0) / 100, 1); + float farFog = min(max(dist - 250, 0) / 100, 1); + + vec3 fragColor = color * vec3(shading); + vec3 shadedColor = mix(mix(vec3(fragColor), NEAR_FOG, nearFog), FAR_FOG, farFog); + + outColor = vec4(shadedColor, 1); } \ No newline at end of file diff --git a/src/game/graph/Renderer.cpp b/src/game/graph/Renderer.cpp index ba84b4d1..90b7b15f 100644 --- a/src/game/graph/Renderer.cpp +++ b/src/game/graph/Renderer.cpp @@ -21,7 +21,6 @@ Renderer::Renderer(GLint winWidth, GLint winHeight) : glEnable(GL_CULL_FACE); glEnable(GL_BLEND); - glEnable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } @@ -114,8 +113,11 @@ void Renderer::update() { } void Renderer::beginWorldDrawCalls() { + activeTexture = nullptr; + glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -149,22 +151,21 @@ void Renderer::endWorldDrawCalls() { 0, 0, static_cast(winSize.x), static_cast(winSize.y), GL_DEPTH_BUFFER_BIT, GL_NEAREST); glBindFramebuffer(GL_FRAMEBUFFER, 0); +} +void Renderer::beginGUIDrawCalls() { + glClear(GL_DEPTH_BUFFER_BIT); + glDisable(GL_DEPTH_TEST); + + guiShader.use(); + glUniformMatrix4fv(gu.ortho, 1, GL_FALSE, glm::value_ptr(gu.matrix)); +} + +void Renderer::swapBuffers() { Shader::clearShader(); window.swapBuffers(); } -//void Renderer::beginGUI() { -// glClear(GL_DEPTH_BUFFER_BIT); -// glDisable(GL_DEPTH_TEST); -// enableGuiShader(); -//} -// -//void Renderer::end() { -// Shader::clearShader(); -// window.swapBuffers(); -//} - Window *Renderer::getWindow() { return &window; } @@ -173,13 +174,6 @@ Camera *Renderer::getCamera() { return &camera; } -//void Renderer::enableGuiShader() { -// guiShader.use(); -// mode = true; -// -// glUniformMatrix4fv(gu.ortho, 1, GL_FALSE, glm::value_ptr(gu.matrix)); -//} - void Renderer::renderQuad() { if (quadVAO == 0) { float quadVertices[] = { diff --git a/src/game/graph/Renderer.h b/src/game/graph/Renderer.h index 48ef58cb..15d190fe 100644 --- a/src/game/graph/Renderer.h +++ b/src/game/graph/Renderer.h @@ -26,9 +26,8 @@ public: void beginWorldDrawCalls(); void endWorldDrawCalls(); - -// void beginGUI(); -// void end(); + void beginGUIDrawCalls(); + void swapBuffers(); void setModelMatrix(glm::mat4& modelMatrix); void enableTexture(Texture* texture); @@ -40,7 +39,6 @@ public: bool resized; private: -// void enableGuiShader(); void renderQuad(); unsigned int quadVAO = 0, quadVBO; @@ -51,8 +49,8 @@ private: unsigned int gBuffer; unsigned int gPosition, gNormal, gColorSpec; -// glm::vec4 clearColor {0.58f, 0.76f, 0.94f, 1.0f}; - glm::vec4 clearColor {0.0f, 0.0f, 0.0f, 1.0f}; +// glm::vec4 clearColor {0.0f, 0.0f, 0.0f, 1.0f}; + glm::vec4 clearColor {0.58f, 0.76f, 0.94f, 1.0f}; Texture* activeTexture; Shader worldGeometryShader; diff --git a/src/game/scene/GameScene.cpp b/src/game/scene/GameScene.cpp index 4c9541db..378407c0 100644 --- a/src/game/scene/GameScene.cpp +++ b/src/game/scene/GameScene.cpp @@ -65,25 +65,18 @@ void GameScene::draw() { auto &renderer = *state->renderer; auto &camera = *renderer.getCamera(); - drawCalls = 0; - renderer.beginWorldDrawCalls(); renderer.enableTexture(&defs.textures().getAtlasTexture()); - drawCalls = world.render(renderer); - for (auto entity : entities) entity->draw(renderer); renderer.endWorldDrawCalls(); + renderer.beginGUIDrawCalls(); -// state->renderer->beginGUI(); -// -// for (auto entity : gui) { -// entity->draw(renderer); -// } -// -// state->renderer->end(); + for (auto entity : gui) entity->draw(renderer); + + renderer.swapBuffers(); } void GameScene::cleanup() { diff --git a/src/server/player/ServerPlayer.h b/src/server/player/ServerPlayer.h index 8295cf99..ac50baef 100644 --- a/src/server/player/ServerPlayer.h +++ b/src/server/player/ServerPlayer.h @@ -13,8 +13,8 @@ class ServerPlayer { public: - const static int ACTIVE_RANGE_H = 16; - const static int ACTIVE_RANGE_V = 8; + const static int ACTIVE_RANGE_H = 24; + const static int ACTIVE_RANGE_V = 12; explicit ServerPlayer(ServerPeer* peer, std::string uuid, std::string username); diff --git a/src/world/Dimension.cpp b/src/world/Dimension.cpp index cba7fb66..95075f03 100644 --- a/src/world/Dimension.cpp +++ b/src/world/Dimension.cpp @@ -59,7 +59,7 @@ void Dimension::update() { float distance = max(abs(diffVec.x), max(abs(diffVec.y), abs(diffVec.z))); //TODO: Don't hard code this number - if (distance > 30) { + if (distance > 24) { if (chunk->meshChunk != nullptr) { meshChunks.erase(chunk->meshChunkIter); delete chunk->meshChunk;