Skip to content
Snippets Groups Projects
Commit f9199f34 authored by Tansel Halic's avatar Tansel Halic Committed by Alexis Girault
Browse files

Multiple textures are now supported.

The renderdetail has been changed to accommodate these modifications.
The wet shader shader code is a bit modified.

Clean-up of the code is needed
parent b9790131
No related branches found
No related tags found
No related merge requests found
......@@ -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();
}
......@@ -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
......@@ -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();
......
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment