diff --git a/Mesh/SurfaceMesh.cpp b/Mesh/SurfaceMesh.cpp index 13ad80e9d084df837c5eaecc0bc1cb00161d256c..dc890b0b05dd1b430eae49022be0acc03a61420b 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 9e993cd4d322008fd8ceded50656cbba32796735..717da8869cb509ea66cd4a53d728f62d585791a5 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 27dae9e782881198a47fd119284095cde66677c2..9a8554c6a6fc0ab96329a21bf9d3ed679ea9b431 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);