You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.5 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkShader
* @brief encapsulate a glsl shader
*
* vtkShader represents a shader, vertex, fragment, geometry etc
*/
#ifndef vtkShader_h
#define vtkShader_h
#include "vtkObject.h"
#include "vtkRenderingOpenGL2Module.h" // for export macro
#include <string> // For member variables.
#include <vector> // For member variables.
/**
* @brief Vertex or Fragment shader, combined into a ShaderProgram.
*
* This class creates a Vertex, Fragment or Geometry shader, that can be
* attached to a ShaderProgram in order to render geometry etc.
*/
class VTKRENDERINGOPENGL2_EXPORT vtkShader : public vtkObject
{
public:
static vtkShader* New();
vtkTypeMacro(vtkShader, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/** Available shader types. */
enum Type
{
Vertex, /**< Vertex shader */
Fragment, /**< Fragment shader */
Geometry, /**< Geometry shader */
Unknown /**< Unknown (default) */
};
/** Set the shader type. */
void SetType(Type type);
/** Get the shader type, typically Vertex or Fragment. */
Type GetType() const { return this->ShaderType; }
/** Set the shader source to the supplied string. */
void SetSource(const std::string& source);
/** Get the source for the shader. */
std::string GetSource() const { return this->Source; }
/** Get the error message (empty if none) for the shader. */
std::string GetError() const { return this->Error; }
/** Get the handle of the shader. */
int GetHandle() const { return this->Handle; }
/** Compile the shader.
* @note A valid context must to current in order to compile the shader.
*/
bool Compile();
/** Delete the shader.
* @note This should only be done once the ShaderProgram is done with the
* Shader.
*/
void Cleanup();
class ReplacementSpec
{
public:
std::string OriginalValue;
vtkShader::Type ShaderType;
bool ReplaceFirst;
bool operator<(const ReplacementSpec& v1) const
{
if (this->OriginalValue != v1.OriginalValue)
{
return this->OriginalValue < v1.OriginalValue;
}
if (this->ShaderType != v1.ShaderType)
{
return this->ShaderType < v1.ShaderType;
}
return (this->ReplaceFirst < v1.ReplaceFirst);
}
bool operator>(const ReplacementSpec& v1) const
{
if (this->OriginalValue != v1.OriginalValue)
{
return this->OriginalValue > v1.OriginalValue;
}
if (this->ShaderType != v1.ShaderType)
{
return this->ShaderType > v1.ShaderType;
}
return (this->ReplaceFirst > v1.ReplaceFirst);
}
};
class ReplacementValue
{
public:
std::string Replacement;
bool ReplaceAll;
};
protected:
vtkShader();
~vtkShader() override;
Type ShaderType;
int Handle;
bool Dirty;
std::string Source;
std::string Error;
private:
vtkShader(const vtkShader&) = delete;
void operator=(const vtkShader&) = delete;
};
#endif