diff --git a/src/graphics/sp/sp_base.cpp b/src/graphics/sp/sp_base.cpp index 1c3e8088a..c5c456501 100644 --- a/src/graphics/sp/sp_base.cpp +++ b/src/graphics/sp/sp_base.cpp @@ -1517,6 +1517,10 @@ void drawNormal() { for (unsigned k = 0; k < p.second[j].second.size(); k++) { + // Make sure tangents and joints are not drawn undefined + glVertexAttrib4f(5, 0.0f, 0.0f, 0.0f, 0.0f); + glVertexAttribI4i(6, 0, 0, 0, 0); + glVertexAttrib4f(7, 0.0f, 0.0f, 0.0f, 0.0f); p.second[j].second[k].first->draw(DCT_NORMAL, -1/*material_id*/); } diff --git a/src/graphics/sp/sp_mesh_buffer.cpp b/src/graphics/sp/sp_mesh_buffer.cpp index 2e4075c5f..056f5bff3 100644 --- a/src/graphics/sp/sp_mesh_buffer.cpp +++ b/src/graphics/sp/sp_mesh_buffer.cpp @@ -176,8 +176,7 @@ void SPMeshBuffer::uploadGLMesh() std::get<2>(m_stk_material[0])->getShaderName() == "normalmap" && CVS->isDefferedEnabled(); const unsigned pitch = 48 - (use_tangents ? 0 : 4) - (use_2_uv ? 0 : 4) - - (m_skinned ? 0 : 16) - (m_vertex_color ? 0 : 4) + - (CVS->useArrayTextures() ? 12 : + (m_skinned ? 0 : 16) + (CVS->useArrayTextures() ? 12 : CVS->isARBBindlessTextureUsable() ? 48 : 0); m_pitch = pitch; @@ -204,20 +203,18 @@ void SPMeshBuffer::uploadGLMesh() memcpy(ptr + v_size + offset, &m_vertices[i].m_normal, 12); offset += 4; - if (m_vertex_color) + video::SColor vc = m_vertices[i].m_color; + if (CVS->isDefferedEnabled() || + CVS->isARBSRGBFramebufferUsable()) { - video::SColor vc = m_vertices[i].m_color; - if (CVS->isDefferedEnabled() || - CVS->isARBSRGBFramebufferUsable()) - { - video::SColorf tmp(vc); - vc.setRed(srgbToLinear(tmp.r)); - vc.setGreen(srgbToLinear(tmp.g)); - vc.setBlue(srgbToLinear(tmp.b)); - } - memcpy(ptr + v_size + offset, &vc, 4); - offset += 4; + video::SColorf tmp(vc); + vc.setRed(srgbToLinear(tmp.r)); + vc.setGreen(srgbToLinear(tmp.g)); + vc.setBlue(srgbToLinear(tmp.b)); } + memcpy(ptr + v_size + offset, &vc, 4); + offset += 4; + memcpy(ptr + v_size + offset, &m_vertices[i].m_all_uvs[0], 4); offset += 4; if (use_2_uv) @@ -317,6 +314,7 @@ void SPMeshBuffer::recreateVAO(unsigned i) glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, pitch, (void*)offset); offset += 12; + // Normal, if 10bit vector normalization is wrongly done by drivers, use // original value and normalize ourselves in shader glEnableVertexAttribArray(1); @@ -325,23 +323,13 @@ void SPMeshBuffer::recreateVAO(unsigned i) (GraphicsRestrictions::GR_10BIT_VECTOR) ? GL_FALSE : GL_TRUE, pitch, (void*)offset); offset += 4; + // Vertex color - if (m_vertex_color) - { - glEnableVertexAttribArray(2); - glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, pitch, - (void*)offset); - offset += 4; - } - else - { - glDisableVertexAttribArray(2); -#ifdef USE_GLES2 - glVertexAttrib4f(2, 1.0f, 1.0f, 1.0f, 1.0f); -#else - glVertexAttrib4Nub(2, 255, 255, 255, 255); -#endif - } + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, pitch, + (void*)offset); + offset += 4; + // 1st texture coordinates glEnableVertexAttribArray(3); glVertexAttribPointer(3, 2, GL_HALF_FLOAT, GL_FALSE, pitch, (void*)offset); @@ -354,6 +342,11 @@ void SPMeshBuffer::recreateVAO(unsigned i) (void*)offset); offset += 4; } + else + { + glDisableVertexAttribArray(4); + } + if (use_tangents) { // Tangent and bi-tanget sign @@ -364,6 +357,11 @@ void SPMeshBuffer::recreateVAO(unsigned i) pitch, (void*)offset); offset += 4; } + else + { + glDisableVertexAttribArray(5); + } + if (m_skinned) { // 4 Joint indices @@ -376,6 +374,12 @@ void SPMeshBuffer::recreateVAO(unsigned i) (void*)offset); offset += 8; } + else + { + glDisableVertexAttribArray(6); + glDisableVertexAttribArray(7); + } + if (CVS->useArrayTextures()) { // uvec4 + uvec2 for 6 texture array indices @@ -385,6 +389,7 @@ void SPMeshBuffer::recreateVAO(unsigned i) glEnableVertexAttribArray(14); glVertexAttribIPointer(14, 2, GL_UNSIGNED_SHORT, pitch, (void*)offset); offset += 4; + glDisableVertexAttribArray(15); } else if (CVS->isARBBindlessTextureUsable()) { @@ -398,6 +403,13 @@ void SPMeshBuffer::recreateVAO(unsigned i) glEnableVertexAttribArray(15); glVertexAttribIPointer(15, 4, GL_UNSIGNED_INT, pitch, (void*)offset); } + else + { + glDisableVertexAttribArray(13); + glDisableVertexAttribArray(14); + glDisableVertexAttribArray(15); + } + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]); // Origin diff --git a/src/graphics/sp/sp_mesh_buffer.hpp b/src/graphics/sp/sp_mesh_buffer.hpp index 3e9323329..eabb51656 100644 --- a/src/graphics/sp/sp_mesh_buffer.hpp +++ b/src/graphics/sp/sp_mesh_buffer.hpp @@ -78,13 +78,11 @@ private: bool m_skinned; - const bool m_vertex_color; - // ------------------------------------------------------------------------ bool initTexture(); public: - SPMeshBuffer(bool vertex_color = true) : m_vertex_color(vertex_color) + SPMeshBuffer() { #ifdef _DEBUG setDebugName("SMeshBuffer"); diff --git a/src/graphics/sp_mesh_loader.cpp b/src/graphics/sp_mesh_loader.cpp index 4df7504f2..61a80af97 100644 --- a/src/graphics/sp_mesh_loader.cpp +++ b/src/graphics/sp_mesh_loader.cpp @@ -277,7 +277,7 @@ void SPMeshLoader::decompressSPM(irr::io::IReadFile* spm, assert(indices_count != 0); using namespace SP; - SPMeshBuffer* mb = new SPMeshBuffer(read_vcolor); + SPMeshBuffer* mb = new SPMeshBuffer(); static_cast(m_mesh)->m_buffer.push_back(mb); const unsigned idx_size = vertices_count > 255 ? 2 : 1; for (unsigned i = 0; i < vertices_count; i++) diff --git a/src/tracks/graph.cpp b/src/tracks/graph.cpp index 35e77a003..4942756a6 100644 --- a/src/tracks/graph.cpp +++ b/src/tracks/graph.cpp @@ -249,7 +249,7 @@ void Graph::createMeshSP(bool show_invisible, bool enable_transparency, #ifndef SERVER_ONLY SP::SPMesh* spm = new SP::SPMesh(); - SP::SPMeshBuffer* spmb = new SP::SPMeshBuffer(true/*vertex_color*/); + SP::SPMeshBuffer* spmb = new SP::SPMeshBuffer(); m_mesh = spm; m_mesh_buffer = spmb;