From 3b3e4c0109575cb053b674d17ee3d4cf154cdca4 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 17 May 2024 17:22:48 +0300 Subject: [PATCH] fixed z fighting for GUI elements --- gui.vert | 2 +- material.h | 3 +++ node.h | 1 + root.cpp | 55 ++++++++++++++++++++++++++++-------------------------- root.h | 2 +- text.vert | 2 +- 6 files changed, 36 insertions(+), 29 deletions(-) diff --git a/gui.vert b/gui.vert index 17b5eff..836761c 100755 --- a/gui.vert +++ b/gui.vert @@ -12,6 +12,6 @@ void main(){ float x, y; x = (aVert.x + pos.x - screen.x * .5) / (screen.x * .5); y = (screen.y * .5 - (aVert.y + pos.y)) / (screen.y * .5); - gl_Position = vec4(x, y, pos.z + aVert.z, 1); + gl_Position = vec4(x, y, -(pos.z + aVert.z), 1); texCoords = aTexCoords; } diff --git a/material.h b/material.h index 4524849..d9cf752 100755 --- a/material.h +++ b/material.h @@ -160,9 +160,12 @@ namespace vb01{ inline void addVec4Uniform(std::string name, Vector4 value){uniforms.push_back(new Vector4Uniform(name, value));} inline void addTexUniform(std::string name, Texture *value, bool animatable){uniforms.push_back(new TextureUniform(name, value, animatable));} inline Shader* getShader(){return shader;} + inline bool isTransparent(){return transparent;} + inline void setTransparent(bool t){this->transparent = t;} private: std::vector uniforms; Shader *shader = nullptr; + bool transparent = false; }; } diff --git a/node.h b/node.h index 45eb8d4..58c1b90 100755 --- a/node.h +++ b/node.h @@ -49,6 +49,7 @@ namespace vb01{ inline Skeleton* getSkeleton(int i){return skeletons[i];} inline int getNumSkeletons(){return skeletons.size();} inline Text* getText(int i){return texts[i];} + inline std::vector& getTexts(){return texts;} inline std::vector& getMeshes(){return meshes;} inline std::vector& getSkeletons(){return skeletons;} inline Mesh* getMesh(int i){return meshes[i];} diff --git a/root.cpp b/root.cpp index 581b8cc..01bb698 100755 --- a/root.cpp +++ b/root.cpp @@ -153,7 +153,7 @@ namespace vb01{ AnimationController::getSingleton()->update(); - updateNodeTree(rootNode); + updateNodeTree(rootNode, false); LineRenderer::getSingleton()->drawLines(); @@ -167,33 +167,28 @@ namespace vb01{ updateGuiPlane(); glEnable(GL_DEPTH_TEST); - updateNodeTree(guiNode); + updateNodeTree(guiNode, true); glfwSwapBuffers(window); glfwPollEvents(); } //TODO replace sorting algorithm - void Root::updateNodeTree(Node *node){ + //TODO specify differentiation of nodes with translucent meshes AND texts + void Root::updateNodeTree(Node *node, bool gui){ vector descendants, opaqueNodes, transparentNodes; node->getDescendants(descendants); for(Node *desc : descendants){ - if(!desc->getMeshes().empty()) - for(Mesh *mesh : desc->getMeshes()){ - Material *mat = mesh->getMaterial(); - vector uniforms = mat->getUniformsByType(Material::Uniform::TEXTURE); - - if(!uniforms.empty()) - for(Material::Uniform *uni : uniforms){ - bool transparent = ((Material::TextureUniform*)uni)->value->isTransparent(); - (transparent ? transparentNodes : opaqueNodes).push_back(desc); - } - else - opaqueNodes.push_back(desc); - } - else - opaqueNodes.push_back(desc); + if(!desc->getMeshes().empty()) + for(Mesh *mesh : desc->getMeshes()){ + (mesh->getMaterial()->isTransparent() ? transparentNodes : opaqueNodes).push_back(desc); + break; + } + else if(!desc->getTexts().empty()) + transparentNodes.push_back(desc); + else + opaqueNodes.push_back(desc); } for(Node *node : opaqueNodes) @@ -202,22 +197,30 @@ namespace vb01{ int numNodes = transparentNodes.size(); for(int i = 0; i < numNodes; i++){ + float d1 = transparentNodes[i]->getPosition().z; + + if(!gui){ Vector3 v1 = transparentNodes[i]->getPosition() - camera->getPosition(); float a1 = v1.norm().getAngleBetween(camera->getDirection()); - float d1 = v1.getLength() * cos(a1); + d1 = v1.getLength() * cos(a1); + } - for(int j = i; j < numNodes; j++){ - Vector3 v2 = transparentNodes[j]->getPosition() - camera->getPosition(); - float a2 = v2.norm().getAngleBetween(camera->getDirection()); - float d2 = v2.getLength() * cos(a2); + for(int j = i; j < numNodes; j++){ + float d2 = transparentNodes[j]->getPosition().z; - if(d1 < d2) - swap(transparentNodes[i], transparentNodes[j]); + if(!gui){ + Vector3 v2 = transparentNodes[j]->getPosition() - camera->getPosition(); + float a2 = v2.norm().getAngleBetween(camera->getDirection()); + d2 = v2.getLength() * cos(a2); } + + if(d1 > d2) + swap(transparentNodes[i], transparentNodes[j]); + } } for(Node *node : transparentNodes) - node->update(); + node->update(); } void Root::updateBloomFramebuffer(){ diff --git a/root.h b/root.h index 2c87162..3c87e7e 100755 --- a/root.h +++ b/root.h @@ -70,7 +70,7 @@ namespace vb01{ void initGuiPlane(Texture*, Texture*); void updateBloomFramebuffer(); void updateGuiPlane(); - void updateNodeTree(vb01::Node*); + void updateNodeTree(vb01::Node*, bool); }; } diff --git a/text.vert b/text.vert index cf029b7..5f15a79 100755 --- a/text.vert +++ b/text.vert @@ -11,6 +11,6 @@ void main(){ float x, y; x = (aVert.x - screen.x * .5) / (screen.x * .5); y = (screen.y * .5 - (aVert.y)) / (screen.y * .5); - gl_Position = vec4(x, y, pos.z, 1); + gl_Position = vec4(x, y, -pos.z, 1); texCoords = aVert.zw; }