diff --git a/Core/RenderDetail.cpp b/Core/RenderDetail.cpp index 9d906eb6559c7eac0bcc2edec6f7eb4019799f61..bfad60dc631b7107cd1a4721f5f2f0f556ef32df 100644 --- a/Core/RenderDetail.cpp +++ b/Core/RenderDetail.cpp @@ -438,3 +438,24 @@ void RenderDetail::addShaderAttribute(int shaderType, const std::string &attribu } +//--------------------------------------------------------------------------- +void RenderDetail::addTexture(const std::string &textureName, const std::string &filename, const std::string &shaderBinding, const std::string &shaderProgramName){ + textures[textureName].textureName = textureName; + textures[textureName].fileName = filename; + textures[textureName].shaderBinding = shaderBinding; + textures[textureName].shaderProgramName = shaderProgramName; + textures[textureName].shaderUniformGL = -1; //not defined intially + + +} + +std::map<std::string, TextureDetail> &RenderDetail::getTextures() +{ + return this->textures; + + + +} +int RenderDetail::getNumberOfTextures(){ + return this->textures.size(); +} diff --git a/Core/RenderDetail.h b/Core/RenderDetail.h index 67558b2ba95b32c06f0b963f97b04335593e8cc4..5d511f26c055bc07a9973f7c4f972c212d38ed66 100644 --- a/Core/RenderDetail.h +++ b/Core/RenderDetail.h @@ -32,11 +32,19 @@ #include <string> #include <map> #include <array> + + + + class VisualArtifact; class CoreClass; class Model; struct UnifiedId; +class vtkOpenGLTexture; + + + /// /// \brief Hold a pointer to a source of geometry that render details can use for drawing. /// @@ -87,6 +95,17 @@ struct GeometrySource } }; + +struct TextureDetail { + std::string textureName; + std::string fileName; + std::string shaderBinding; + std::string shaderProgramName; + GLint shaderUniformGL; + vtkOpenGLTexture* vtexture; + +}; + /// \brief RenderDetail has rendering options and features. ///It shows how the mesh should be rendered struct RenderDetail @@ -210,6 +229,17 @@ public: /// void setTextureFilename(const std::string &filename); const std::string &getTextureFilename() const; + + /// + /// \brief Set/Get the binding texture filename for a shader. shaderBinding is for texture name in the shader name + /// + void addTexture(const std::string &textureName, const std::string &filename, const std::string &shaderBinding, const std::string &shaderProgramName); + //const std::string &getTextureFilename() const; + std::map<std::string, TextureDetail>& RenderDetail::getTextures(); + int getNumberOfTextures(); + + + /// /// \brief Returns true if you want to draw texture map @@ -322,6 +352,7 @@ private: std::vector<std::shared_ptr<UnifiedId>> shaders; // attached shaders std::vector<std::shared_ptr<UnifiedId>> VAOs; // stores VAO IDs std::map<std::string,int> shaderAttributes; + std::map<std::string, TextureDetail> textures; }; #endif // SMRENDERDETAIL_H diff --git a/Examples/AVMNidus/main.cpp b/Examples/AVMNidus/main.cpp index 91e9924831cc8e7723523b1685e675ba3292c079..4daa6632cfb5668ddca41da1e3e0c385800a849c 100644 --- a/Examples/AVMNidus/main.cpp +++ b/Examples/AVMNidus/main.cpp @@ -92,6 +92,9 @@ int main(int ac, char **av) // Set shader porograms meshRenderDetail->addShaderProgram(vtkShader::Vertex,"shaders/wet_vert.glsl"); meshRenderDetail->addShaderProgram(vtkShader::Fragment,"shaders/wet_frag.glsl"); + meshRenderDetail->addTexture("decal", "textures/cube2.jpg", "textureDecal", "wet_frag.glsl"); + meshRenderDetail->addTexture("bump", "textures/usertile34.bmp", "textureSpecular", "wet_frag.glsl"); + meshRenderDetail->addTexture("specular", "textures/2.png", "textureBump", "wet_frag.glsl"); meshRenderDetail->setTextureFilename("textures/cube.jpg"); // auto renderingMesh = femObject->getVolumetricMesh()->getRenderingMesh(); diff --git a/VTKRendering/VTKMeshRenderDelegate.cpp b/VTKRendering/VTKMeshRenderDelegate.cpp index 21b82669305e8b67b17a8fa988111947858d6a52..9deb779d2908abc925a0299f4814c11849c57921 100644 --- a/VTKRendering/VTKMeshRenderDelegate.cpp +++ b/VTKRendering/VTKMeshRenderDelegate.cpp @@ -44,6 +44,7 @@ #include <vtkCellArray.h> #include <vtkGeometryFilter.h> #include <vtkPolyDataNormals.h> + #include <vtkFloatArray.h> #include <vtkTexture.h> #include <vtkOpenGLPolyDataMapper.h> @@ -54,6 +55,11 @@ #include <vtkXMLImageDataReader.h> #include <vtkImageReader.h> #include <vtkImageReader2Factory.h> +#include "RenderDetail.h" +#include "vtkTextureObject.h" +#include "vtkOpenGLTexture.h" +#include "vtkOpenGLRenderWindow.h" +#include "vtkIndent.h" vtkStandardNewMacro(CustomGLPolyDataMapper) @@ -150,26 +156,45 @@ void MeshRenderDelegate::initDraw() actor->GetProperty()->SetInterpolationToPhong(); } - vtkSmartPointer<vtkTexture> texture; - if(renderDetail && renderDetail->renderTexture()) + //vtkSmartPointer<vtkTexture> texture; + vtkOpenGLTexture* texture; + + + int nbrTextures = renderDetail->getNumberOfTextures(); + if ((renderDetail && renderDetail->renderTexture()) || nbrTextures>0) { // Read texture file vtkSmartPointer<vtkImageReader2Factory> readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New(); - vtkImageReader2 *imageReader = - readerFactory->CreateImageReader2(mesh->getRenderDetail()->getTextureFilename().c_str()); - cout << mesh->getRenderDetail()->getTextureFilename() << endl; - imageReader->SetFileName(mesh->getRenderDetail()->getTextureFilename().c_str()); - if (imageReader == NULL) - { - cout << "Error in opening the file" << endl; + std::map<std::string, TextureDetail>& textures = renderDetail->getTextures(); + for (auto &t : textures){ + TextureDetail &textureDetail = t.second; + //textureDetail.fileName + vtkSmartPointer<vtkImageReader2> imageReader = + readerFactory->CreateImageReader2(textureDetail.fileName.c_str()); + if (imageReader == NULL) + { + cout << "Error in opening the file" << endl; + continue; + } + imageReader->SetFileName(textureDetail.fileName.c_str()); + imageReader->Update(); + texture = vtkOpenGLTexture::New(); + //vtkTextureObject *textureObject = vtkTextureObject::New(); + + texture->SetInputConnection(imageReader->GetOutputPort()); + + //texture->SetTextureObject(textureObject); + //textureObject->Create2D + textureDetail.vtexture = texture; + cout << "Image File Loaded"<<textureDetail.fileName.c_str() << endl; } - imageReader->Update(); - - - texture = vtkTexture::New(); - texture->SetInputConnection(imageReader->GetOutputPort()); + + //vtkSmartPointer<vtkImageReader2> imageReader = + /// readerFactory->CreateImageReader2(mesh->getRenderDetail()->getTextureFilename().c_str()); + //cout << mesh->getRenderDetail()->getTextureFilename() << endl; + //imageReader->SetFileName(mesh->getRenderDetail()->getTextureFilename().c_str()); vtkNew<vtkFloatArray> textureCoordinates; textureCoordinates->SetNumberOfComponents(3); @@ -202,6 +227,9 @@ void MeshRenderDelegate::initDraw() normals->AutoOrientNormalsOn(); mapper = CustomGLPolyDataMapper::New(); + + + ///The tangent computation needs to go out of the this block..tansel mapper->SetInputConnection(normals->GetOutputPort()); auto mapperCustom = CustomGLPolyDataMapper::SafeDownCast(mapper); mapperCustom->renderDetail = renderDetail; @@ -231,9 +259,9 @@ void MeshRenderDelegate::initDraw() mapper->SetInputDataObject(unstructuredMesh.GetPointer()); } - if(texture.GetPointer()) + if(texture) { - actor->SetTexture(texture); + actor->SetTexture(texture); } actor->SetMapper(mapper.GetPointer()); } @@ -288,6 +316,20 @@ void CustomGLPolyDataMapper::SetMapperShaderParameters(vtkOpenGLHelper &cellBO, program->SetUniformf("TestColor1", testColor1); program->SetUniformf("TestColor2", testColor2); program->SetUniformf("TestColor3", testColor3); + + std::map<std::string, TextureDetail>& textures = renderDetail->getTextures(); + + + for (auto &t : textures){ + TextureDetail &textureDetail = t.second; + textureDetail.vtexture->GetTextureObject(); + long a = textureDetail.vtexture->GetIndex(); + textureDetail.vtexture->Load(ren); + + + program->SetUniformi(textureDetail.shaderBinding.c_str(), textureDetail.vtexture->GetTextureUnit()); + + } cellBO.VAO->Bind(); if (!cellBO.VAO->AddAttributeArray(cellBO.Program, this->tangentsBuffer,