From 0fe2a1237028ea7c3af139e4677a200dc194c7aa Mon Sep 17 00:00:00 2001
From: Tansel Halic <tanslehalic@gmail.com>
Date: Wed, 7 Oct 2015 14:00:13 -0500
Subject: [PATCH] The vertex buffer is added for tangents.

The tangents transfer to the shaders need to be checked.
---
 Mesh/SurfaceMesh.cpp                   |  1 +
 VTKRendering/VTKMeshRenderDelegate.cpp | 46 +++++++++++++++++++++++++-
 VTKRendering/VTKRenderDelegate.h       |  5 ++-
 3 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/Mesh/SurfaceMesh.cpp b/Mesh/SurfaceMesh.cpp
index 13ad80e9..dc890b0b 100644
--- a/Mesh/SurfaceMesh.cpp
+++ b/Mesh/SurfaceMesh.cpp
@@ -151,6 +151,7 @@ void SurfaceMesh::computeTriangleTangents()
     // Calculate the vertex tangents
     if(this->useThreeDSTexureCoordinates || this->useOBJDSTexureCoordinates)
     {
+		this->vertexTangents.resize(this->vertices.size(), core::Vec3d::Zero());
         for(size_t v = 0, end = this->vertices.size(); v < end; ++v)
         {
             this->vertexTangents[v][0] = this->vertexTangents[v][1] = this->vertexTangents[v][2] = 0;
diff --git a/VTKRendering/VTKMeshRenderDelegate.cpp b/VTKRendering/VTKMeshRenderDelegate.cpp
index 9e993cd4..717da886 100644
--- a/VTKRendering/VTKMeshRenderDelegate.cpp
+++ b/VTKRendering/VTKMeshRenderDelegate.cpp
@@ -50,9 +50,13 @@
 #include <vtkTexture.h>
 #include <vtkOpenGLPolyDataMapper.h>
 #include <vtkProperty.h>
+#include "vtkShaderProgram.h"
+#include "vtkOpenGLVertexArrayObject.h"
+#include "vtkOpenGLVertexBufferObject.h"
 
 vtkStandardNewMacro(CustomGLPolyDataMapper)
 
+
 class MeshRenderDelegate : public VTKRenderDelegate
 {
 public:
@@ -201,6 +205,12 @@ void MeshRenderDelegate::initDraw()
 
 		mapper = CustomGLPolyDataMapper::New();
         mapper->SetInputConnection(normals->GetOutputPort());
+		auto mapperCustom = CustomGLPolyDataMapper::SafeDownCast(mapper);
+		mesh->computeVertexNeighbors();
+		mesh->setUseOBJTexture(true);
+		mesh->computeTriangleTangents();
+		
+		mapperCustom->tangents = mesh->getVertexTangents();
 		
         if(renderDetail->hasShaders())
         {
@@ -249,12 +259,46 @@ void MeshRenderDelegate::modified()
         dataSet->Modified();
 }
 
+void CustomGLPolyDataMapper::initDraw(){
+
+
+	cout << "init" << endl;
 
+}
+void CustomGLPolyDataMapper::BuildBufferObjects(vtkRenderer *ren, vtkActor *act){
+	tangentsBuffer = vtkOpenGLBufferObject::New();
+	tangentsBuffer->Bind();
+	if (tangentsBuffer->Upload(this->tangents, vtkOpenGLBufferObject::ArrayBuffer)){
+		cout << "Completed Tangents Binding"<<endl;
+	
+	
+	}
+	tangentsBuffer->Release();
+	vtkOpenGLPolyDataMapper::BuildBufferObjects(ren,act);
+
+}
 
 void CustomGLPolyDataMapper::SetMapperShaderParameters(vtkOpenGLHelper &cellBO, vtkRenderer *ren, vtkActor *act)
 {
+	double testColor1 = 0.01;
+	double testColor2 = 0.01;
+	static double testColor3 = 0.01;
+	vtkShaderProgram *program = cellBO.Program;
+	
+	testColor3 += 0.01;
+	program->SetUniformf("TestColor1", testColor1);
+	program->SetUniformf("TestColor2", testColor2);
+	program->SetUniformf("TestColor3", testColor3);
+	cellBO.VAO->Bind();
+	
+	if (!cellBO.VAO->AddAttributeArray(cellBO.Program, this->tangentsBuffer,
+		"vertTangents", 0,
+		0, VTK_DOUBLE, 3, false))
+	{
+		vtkErrorMacro(<< "Error setting 'vertTangents' in shader VAO.");
+	}
 	vtkOpenGLPolyDataMapper::SetMapperShaderParameters(cellBO, ren, act);
-
+		
 }
 
 RegisterFactoryClass(RenderDelegate,
diff --git a/VTKRendering/VTKRenderDelegate.h b/VTKRendering/VTKRenderDelegate.h
index 27dae9e7..9a8554c6 100644
--- a/VTKRendering/VTKRenderDelegate.h
+++ b/VTKRendering/VTKRenderDelegate.h
@@ -8,11 +8,14 @@ class vtkActor;
 class CustomGLPolyDataMapper :public vtkOpenGLPolyDataMapper{
 public:
 	static CustomGLPolyDataMapper* New();
+	vtkOpenGLBufferObject * tangentsBuffer;
+	std::vector<core::Vec3d>tangents;
 	vtkTypeMacro(CustomGLPolyDataMapper, vtkOpenGLPolyDataMapper)
-	virtual void initDraw() {}
+		virtual void initDraw();
 	virtual void modified() {}
 	virtual void draw() const { }
 	virtual void SetMapperShaderParameters(vtkOpenGLHelper &cellBO, vtkRenderer *ren, vtkActor *act) override;
+	void BuildBufferObjects(vtkRenderer *ren, vtkActor *act);
 
 
 
-- 
GitLab