diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h index c115b9b..979cfb1 100644 --- a/QtMeshViewer/Header/GeometryEngine.h +++ b/QtMeshViewer/Header/GeometryEngine.h @@ -27,6 +27,7 @@ private: QOpenGLBuffer m_indexBuf; QVector m_textures; QVector m_drawList; + BoundingBox m_boundings; void loadTexture(const char* filePath); void clearData(); diff --git a/QtMeshViewer/Resources/vshader.glsl b/QtMeshViewer/Resources/vshader.glsl index f5b84d7..583b344 100644 --- a/QtMeshViewer/Resources/vshader.glsl +++ b/QtMeshViewer/Resources/vshader.glsl @@ -5,6 +5,7 @@ precision mediump float; #endif uniform mat4 vp_matrix; +uniform mat4 norm_matrix; uniform mat4 m_matrix; attribute vec4 a_position; @@ -15,7 +16,7 @@ varying vec2 v_texcoord; void main() { // Calculate vertex position in screen space - gl_Position = vp_matrix * m_matrix * a_position; + gl_Position = vp_matrix * norm_matrix * m_matrix * a_position; // Pass texture coordinate to fragment shader // Value will be automatically interpolated to fragments inside polygon faces diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 4bc510b..be3a07b 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -1,5 +1,6 @@ #include "..\Header\GeometryEngine.h" #include "..\Header\MshFile.h" +#include ///////////////////////////////////////////////////////////////////////// @@ -45,6 +46,7 @@ void GeometryEngine::loadFile(const char* filePath) MshFile file(filePath); models = file.getModels(); textureNames = file.getTextureNames(); + m_boundings = file.getBoundingBox(); // collect data unsigned int indexOffset(0); @@ -76,8 +78,6 @@ void GeometryEngine::loadFile(const char* filePath) } } - //TODO: cleanup old stuff - // Transfer vertex data to VBO 0 m_arrayBuf.bind(); m_arrayBuf.allocate(vertexData.data(), vertexData.size() * sizeof(VertexData)); @@ -159,6 +159,13 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) m_arrayBuf.bind(); m_indexBuf.bind(); + // Allways normalize by this + QMatrix4x4 normMatrix; + float maxExtent = std::max(std::max(m_boundings.extents[0], m_boundings.extents[1]), m_boundings.extents[2]); + normMatrix.scale(1 / maxExtent); + normMatrix.translate(-m_boundings.center[0], -m_boundings.center[1], -m_boundings.center[2]); + program->setUniformValue("norm_matrix", normMatrix); + // Allways use texture unit 0 program->setUniformValue("texture", 0); diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index 6970a8b..4f2fb20 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -6,7 +6,7 @@ #include #include -#define DEFAULT_Z_DISTANCE -5.0 +#define DEFAULT_Z_DISTANCE -4.0 /////////////////////////////////////////////////////////////////////////