Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::ShaderRepository Class Reference

Management class for vtkShader XML descriptions. More...

#include <mitkShaderRepository.h>

List of all members.

Classes

class  Shader

Public Types

typedef ShaderRepository Self
typedef itk::Object Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
std::list< Shader::Pointer > * GetShaders ()
ShaderGetShader (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 ShaderRepositoryGetGlobalShaderRepository ()

Protected Member Functions

void LoadShaders ()
 ShaderRepository ()
 ~ShaderRepository ()

Protected Attributes

std::list< Shader::Pointershaders

Detailed Description

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.


Member Typedef Documentation

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.

Definition at line 44 of file mitkShaderRepository.h.


Constructor & Destructor Documentation

mitk::ShaderRepository::ShaderRepository (  ) [protected]

Constructor

Definition at line 36 of file mitkShaderRepository.cpp.

References LoadShaders().

{
  LoadShaders();
}
mitk::ShaderRepository::~ShaderRepository (  ) [protected]

Destructor

Definition at line 41 of file mitkShaderRepository.cpp.

{
}

Member Function Documentation

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]
mitk::ShaderRepository::Shader * mitk::ShaderRepository::GetShader ( const char *  id )

Definition at line 188 of file mitkShaderRepository.cpp.

{
  std::list<Shader::Pointer>::const_iterator i = shaders.begin();

  while( i != shaders.end() )
  {
    if( (*i)->name.compare(id) == 0)
      return (*i);

    i++;
  }

  return 0;
}
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]

Member Data Documentation

Definition at line 125 of file mitkShaderRepository.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines