From 30f1a1e6278cdda904360c42d8421eb72dafc875 Mon Sep 17 00:00:00 2001
From: Anakin <Battlefrontler@t-online.de>
Date: Sun, 5 Feb 2017 16:57:12 +0100
Subject: [PATCH] passing poylNormal, tangent, bitangent to shader

---
 QtMeshViewer/Header/GeometryEngine.h   |  1 +
 QtMeshViewer/Resources/fshader.glsl    |  4 ++
 QtMeshViewer/Source/GeometryEngine.cpp | 77 ++++++++++++++++++--------
 3 files changed, 59 insertions(+), 23 deletions(-)

diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h
index 7464662..5b551e5 100644
--- a/QtMeshViewer/Header/GeometryEngine.h
+++ b/QtMeshViewer/Header/GeometryEngine.h
@@ -34,6 +34,7 @@ private:
 // functions
 private:
 	void clearData();
+	void setupPipeline(QOpenGLShaderProgram * program);
 
 public:
 	void drawGeometry(QOpenGLShaderProgram *program);
diff --git a/QtMeshViewer/Resources/fshader.glsl b/QtMeshViewer/Resources/fshader.glsl
index 4e5d7be..b66d1ed 100644
--- a/QtMeshViewer/Resources/fshader.glsl
+++ b/QtMeshViewer/Resources/fshader.glsl
@@ -22,6 +22,10 @@ uniform struct Light {
 	float ambientCoefficient;
 } light;
 
+attribute vec3 a_polyNorm;
+attribute vec3 a_polyTan;
+attribute vec3 a_polyBiTan;
+
 varying vec2 v_surfaceUV;
 varying vec3 v_surfacePosition;
 varying vec3 v_surfaceNormal;
diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp
index 902f3a5..da2a798 100644
--- a/QtMeshViewer/Source/GeometryEngine.cpp
+++ b/QtMeshViewer/Source/GeometryEngine.cpp
@@ -52,26 +52,8 @@ void GeometryEngine::clearData()
 	m_drawList.clear();
 }
 
-void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
+void GeometryEngine::setupPipeline(QOpenGLShaderProgram *program)
 {
-	if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
-		return;
-
-	// Setup
-	// Tell OpenGL which VBOs to use
-	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);
-
 	// Offset for position
 	quintptr offset = 0;
 
@@ -88,14 +70,63 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
 	program->enableAttributeArray(texcoordLocation);
 	program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData));
 
-	//Offset for normal
+	//Offset for vertexNormal
 	offset += sizeof(QVector2D);
 
 	// Tell OpenGL programmable pipeline how to locate vertex normal data
-	int normLocation = program->attributeLocation("a_normal");
-	program->enableAttributeArray(normLocation);
-	program->setAttributeBuffer(normLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
+	int vertNormLocation = program->attributeLocation("a_normal");
+	program->enableAttributeArray(vertNormLocation);
+	program->setAttributeBuffer(vertNormLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
+
+	//Offset for polygonNormal
+	offset += sizeof(QVector3D);
+
+	// Tell OpenGL programmable pipeline how to locate polygon normal data
+	int polyNormLocation = program->attributeLocation("a_polyNorm");
+	program->enableAttributeArray(polyNormLocation);
+	program->setAttributeBuffer(polyNormLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
+
+	//Offset for polygonTangent
+	offset += sizeof(QVector3D);
+
+	// Tell OpenGL programmable pipeline how to locate polygon tangent data
+	int polyTanLocation = program->attributeLocation("a_polyTan");
+	program->enableAttributeArray(polyTanLocation);
+	program->setAttributeBuffer(polyTanLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
+
+	//Offset for polygonBitangent
+	offset += sizeof(QVector3D);
+
+	// Tell OpenGL programmable pipeline how to locate polygon bitangent data
+	int polyBiTanLocation = program->attributeLocation("a_polyBiTan");
+	program->enableAttributeArray(polyBiTanLocation);
+	program->setAttributeBuffer(polyBiTanLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
+
+}
+
+void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
+{
+	if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
+		return;
+
+	// Setup
+	// Tell OpenGL which VBOs to use
+	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);
 
+	//setup the pipeline
+	setupPipeline(program);
+	
 	// Paint
 
 	for (auto& it : m_drawList)
-- 
GitLab