Management class for vtkShader XML descriptions. More...
#include <mitkShaderRepository.h>
Classes | |
class | Shader |
Public Types | |
typedef ShaderRepository | Self |
typedef itk::Object | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
typedef itk::SmartPointer < const Self > | ConstPointer |
Public Member Functions | |
virtual const char * | GetClassName () const |
std::list< Shader::Pointer > * | GetShaders () |
Shader * | GetShader (const char *id) |
void | AddDefaultProperties (mitk::DataNode *node, mitk::BaseRenderer *renderer, bool overwrite) |
Adds all parsed shader uniforms to property list of the given DataNode; used by mappers. | |
void | ApplyProperties (mitk::DataNode *node, vtkActor *actor, mitk::BaseRenderer *renderer, itk::TimeStamp &MTime) |
Applies shader and shader specific variables of the specified DataNode to the VTK object by updating the shader variables of its vtkProperty. | |
void | LoadShader (std::string filename) |
Loads a shader from a given file. Make sure that this file is in the XML shader format. | |
Static Public Member Functions | |
static Pointer | New () |
static ShaderRepository * | GetGlobalShaderRepository () |
Protected Member Functions | |
void | LoadShaders () |
ShaderRepository () | |
~ShaderRepository () | |
Protected Attributes | |
std::list< Shader::Pointer > | shaders |
Management class for vtkShader XML descriptions.
Looks for all XML shader files in a given directory and adds default properties for each shader object (shader uniforms) to the specified mitk::DataNode.
Additionally, it provides a utility function for applying properties for shaders in mappers.
Definition at line 40 of file mitkShaderRepository.h.
typedef itk::SmartPointer<const Self> mitk::ShaderRepository::ConstPointer |
Definition at line 44 of file mitkShaderRepository.h.
typedef itk::SmartPointer<Self> mitk::ShaderRepository::Pointer |
Definition at line 44 of file mitkShaderRepository.h.
Definition at line 44 of file mitkShaderRepository.h.
typedef itk::Object mitk::ShaderRepository::Superclass |
Definition at line 44 of file mitkShaderRepository.h.
mitk::ShaderRepository::ShaderRepository | ( | ) | [protected] |
Constructor
Definition at line 36 of file mitkShaderRepository.cpp.
References LoadShaders().
{ LoadShaders(); }
mitk::ShaderRepository::~ShaderRepository | ( | ) | [protected] |
void mitk::ShaderRepository::AddDefaultProperties | ( | mitk::DataNode * | node, |
mitk::BaseRenderer * | renderer, | ||
bool | overwrite | ||
) |
Adds all parsed shader uniforms to property list of the given DataNode; used by mappers.
Definition at line 262 of file mitkShaderRepository.cpp.
References mitk::DataNode::AddProperty(), mitk::FloatProperty::New(), and mitk::ShaderProperty::New().
Referenced by mitk::SurfaceVtkMapper3D::SetDefaultPropertiesForVtkProperty().
{ node->AddProperty( "shader", mitk::ShaderProperty::New(), renderer, overwrite ); std::list<Shader::Pointer>::const_iterator i = shaders.begin(); while( i != shaders.end() ) { std::list<Shader::Uniform::Pointer> *l = (*i)->GetUniforms(); std::string shaderName = (*i)->name; std::list<Shader::Uniform::Pointer>::const_iterator j = l->begin(); while( j != l->end() ) { std::string propertyName = "shader." + shaderName + "." + (*j)->name; switch( (*j)->type ) { case Shader::Uniform::glsl_float: node->AddProperty( propertyName.c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[0] ), renderer, overwrite ); break; case Shader::Uniform::glsl_vec2: node->AddProperty( (propertyName+".x").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[0] ), renderer, overwrite ); node->AddProperty( (propertyName+".y").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[1] ), renderer, overwrite ); break; case Shader::Uniform::glsl_vec3: node->AddProperty( (propertyName+".x").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[0] ), renderer, overwrite ); node->AddProperty( (propertyName+".y").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[1] ), renderer, overwrite ); node->AddProperty( (propertyName+".z").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[2] ), renderer, overwrite ); break; case Shader::Uniform::glsl_vec4: node->AddProperty( (propertyName+".x").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[0] ), renderer, overwrite ); node->AddProperty( (propertyName+".y").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[1] ), renderer, overwrite ); node->AddProperty( (propertyName+".z").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[2] ), renderer, overwrite ); node->AddProperty( (propertyName+".w").c_str(), mitk::FloatProperty::New( (*j)->defaultFloat[3] ), renderer, overwrite ); break; default: break; } j++; } i++; } }
void mitk::ShaderRepository::ApplyProperties | ( | mitk::DataNode * | node, |
vtkActor * | actor, | ||
mitk::BaseRenderer * | renderer, | ||
itk::TimeStamp & | MTime | ||
) |
Applies shader and shader specific variables of the specified DataNode to the VTK object by updating the shader variables of its vtkProperty.
Definition at line 319 of file mitkShaderRepository.cpp.
References mitk::DataNode::GetFloatProperty(), mitk::DataNode::GetProperty(), mitk::EnumerationProperty::GetValueAsString(), mitk::ShaderRepository::Shader::name, mitk::ShaderRepository::Shader::path, and mitk::ShaderRepository::Shader::uniforms.
Referenced by mitk::SurfaceVtkMapper3D::ApplyProperties().
{ bool setMTime = false; vtkProperty* property = actor->GetProperty(); unsigned long ts = MTime.GetMTime(); mitk::ShaderProperty *sep=(mitk::ShaderProperty *)node->GetProperty("shader",renderer); if(!sep) { property->ShadingOff(); return; } std::string shader=sep->GetValueAsString(); // Need update pipeline mode if(sep->GetMTime() > ts) { if(shader.compare("fixed")==0) { //MITK_INFO << "disabling shader"; property->ShadingOff(); } else { Shader *s=GetShader(shader.c_str()); if(s) { //MITK_INFO << "enabling shader"; property->ShadingOn(); property->LoadMaterial(s->path.c_str()); } } setMTime = true; } if(shader.compare("fixed")!=0) { Shader *s=GetShader(shader.c_str()); if(!s) return; std::list<Shader::Uniform::Pointer>::const_iterator j = s->uniforms.begin(); while( j != s->uniforms.end() ) { std::string propertyName = "shader." + s->name + "." + (*j)->name; // MITK_INFO << "querying property: " << propertyName; // mitk::BaseProperty *p = node->GetProperty( propertyName.c_str(), renderer ); // if( p && p->GetMTime() > MTime.GetMTime() ) { float fval[4]; // MITK_INFO << "copying property " << propertyName << " ->->- " << (*j)->name << " type=" << (*j)->type ; switch( (*j)->type ) { case Shader::Uniform::glsl_float: node->GetFloatProperty( propertyName.c_str(), fval[0], renderer ); property->AddShaderVariable( (*j)->name.c_str(), 1 , fval ); break; case Shader::Uniform::glsl_vec2: node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer ); node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer ); property->AddShaderVariable( (*j)->name.c_str(), 2 , fval ); break; case Shader::Uniform::glsl_vec3: node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer ); node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer ); node->GetFloatProperty( (propertyName+".z").c_str(), fval[2], renderer ); property->AddShaderVariable( (*j)->name.c_str(), 3 , fval ); break; case Shader::Uniform::glsl_vec4: node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer ); node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer ); node->GetFloatProperty( (propertyName+".z").c_str(), fval[2], renderer ); node->GetFloatProperty( (propertyName+".w").c_str(), fval[3], renderer ); property->AddShaderVariable( (*j)->name.c_str(), 4 , fval ); break; default: break; } //setMTime=true; } j++; } } if(setMTime) MTime.Modified(); }
virtual const char* mitk::ShaderRepository::GetClassName | ( | ) | const [virtual] |
mitk::ShaderRepository * mitk::ShaderRepository::GetGlobalShaderRepository | ( | ) | [static] |
Definition at line 45 of file mitkShaderRepository.cpp.
References New().
Referenced by mitk::ShaderProperty::AddShaderTypes(), mitk::SurfaceVtkMapper3D::ApplyProperties(), QmitkMITKSurfaceMaterialEditorView::QmitkMITKSurfaceMaterialEditorView(), and mitk::SurfaceVtkMapper3D::SetDefaultPropertiesForVtkProperty().
{ static mitk::ShaderRepository::Pointer i; if(i.IsNull()) { i=mitk::ShaderRepository::New(); } return i; }
mitk::ShaderRepository::Shader * mitk::ShaderRepository::GetShader | ( | const char * | id ) |
Definition at line 188 of file mitkShaderRepository.cpp.
std::list<Shader::Pointer>* mitk::ShaderRepository::GetShaders | ( | ) | [inline] |
Definition at line 141 of file mitkShaderRepository.h.
Referenced by mitk::ShaderProperty::AddShaderTypes().
{ return &shaders; }
void mitk::ShaderRepository::LoadShader | ( | std::string | filename ) |
Loads a shader from a given file. Make sure that this file is in the XML shader format.
Definition at line 103 of file mitkShaderRepository.cpp.
References SR_INFO.
{ std::string extension = itksys::SystemTools::GetFilenameExtension(filename); if (extension.compare(".xml")==0) { Shader::Pointer element=Shader::New(); element->name = itksys::SystemTools::GetFilenameWithoutExtension(filename); element->path = filename; element->LoadPropertiesFromPath(); shaders.push_back(element); SR_INFO << "found shader '" << element->name << "'"; } else { SR_INFO << "Error: no xml shader file!"; } }
void mitk::ShaderRepository::LoadShaders | ( | ) | [protected] |
Definition at line 58 of file mitkShaderRepository.cpp.
References mitk::StandardFileLocations::FindFile(), mitk::StandardFileLocations::GetInstance(), and SR_INFO.
Referenced by ShaderRepository().
{ itk::Directory::Pointer dir = itk::Directory::New(); std::string mitkLighting = mitk::StandardFileLocations::GetInstance()->FindFile("mitkShaderLighting.xml", "Core/Code/Rendering"); std::string dirPath = "./vtk_shader"; if(mitkLighting.size() > 0) { // we found the default shader dirPath = itksys::SystemTools::GetFilenamePath( mitkLighting ); SR_INFO << "found default mitk shader at '" << dirPath << "'"; } if( dir->Load( dirPath.c_str() ) ) { int n = dir->GetNumberOfFiles(); for(int r=0;r<n;r++) { const char *filename = dir->GetFile( r ); std::string extension = itksys::SystemTools::GetFilenameExtension(filename); if(extension.compare(".xml")==0) { Shader::Pointer element=Shader::New(); element->name = itksys::SystemTools::GetFilenameWithoutExtension(filename); element->path = dirPath + std::string("/") + element->name + std::string(".xml"); SR_INFO << "found shader '" << element->name << "'"; element->LoadPropertiesFromPath(); shaders.push_back(element); } } } }
static Pointer mitk::ShaderRepository::New | ( | ) | [static] |
Referenced by GetGlobalShaderRepository().
std::list<Shader::Pointer> mitk::ShaderRepository::shaders [protected] |
Definition at line 125 of file mitkShaderRepository.h.