Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef SHADERINTERFACE_H
Toshihiro Shimizu 890ddd
#define SHADERINTERFACE_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Glew includes
Shinya Kitaoka 120a6e
#include <gl glew.h="">  // Must be included before tgl.h</gl>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tparamuiconcept.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tpersist.h"
Toshihiro Shimizu 890ddd
#include "tfilepath.h"
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qdatetime></qdatetime>
Jeremy Bullock 1ef2a2
#include <qopenglshader></qopenglshader>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// STD includes
Toshihiro Shimizu 890ddd
#include <vector></vector>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TNZSTDFX_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//    Forward declarations
Toshihiro Shimizu 890ddd
Jeremy Bullock 1ef2a2
class QOpenGLShaderProgram;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//**********************************************************************
Toshihiro Shimizu 890ddd
//    ShaderInterface  declaration
Toshihiro Shimizu 890ddd
//**********************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  A ShaderInterface represents interface data to a GLSL shader program.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
\par Rationale
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  OpenGL shaders are supplied as text to be compiled at run-time by a
Toshihiro Shimizu 890ddd
  GLSL compiler. In our case, the specified text is assumed to be stored in
Toshihiro Shimizu 890ddd
  one or more files on hard-disk.
Toshihiro Shimizu 890ddd
\n\n
Toshihiro Shimizu 890ddd
  However, in order for an executable to correctly interface a GLSL
Toshihiro Shimizu 890ddd
  shader program, further interface data must be supplied in some form.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  Interface data include the path of the GLSL shader program file and
Toshihiro Shimizu 890ddd
  parameters to be bound by the executable before the shader is run.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
\par Usage
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  A ShaderInterface is loaded from an xml file. Since an interface could
Toshihiro Shimizu 890ddd
  be loaded incorrectly, remember to check the isValid() method to ensure
Toshihiro Shimizu 890ddd
  that the loading process succeeds.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  A loaded ShaderInterface allows access to shader parameters and
Toshihiro Shimizu 890ddd
  acts as a factory object to compiled QGLShaderProgram instances.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka d1f6c4
class DVAPI ShaderInterface final : public TPersist {
Shinya Kitaoka 120a6e
public:  // Enums
Shinya Kitaoka 120a6e
  enum ParameterConceptType {
Shinya Kitaoka 120a6e
    CONCEPT_NONE,
Shinya Kitaoka 120a6e
    PERCENT,
Shinya Kitaoka 120a6e
    LENGTH,
Shinya Kitaoka 120a6e
    ANGLE,
Shinya Kitaoka 120a6e
    POINT,
Shinya Kitaoka 120a6e
    RADIUS_UI,
Shinya Kitaoka 120a6e
    WIDTH_UI,
Shinya Kitaoka 120a6e
    ANGLE_UI,
Shinya Kitaoka 120a6e
    POINT_UI,
Shinya Kitaoka 120a6e
    XY_UI,
Shinya Kitaoka 120a6e
    VECTOR_UI,
Shinya Kitaoka 120a6e
    POLAR_UI,
Shinya Kitaoka 120a6e
    SIZE_UI,
Shinya Kitaoka 120a6e
    QUAD_UI,
Shinya Kitaoka 120a6e
    RECT_UI,
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    CONCEPTSCOUNT,
Shinya Kitaoka 120a6e
    UI_CONCEPTS = RADIUS_UI
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  enum ParameterType {
Shinya Kitaoka 120a6e
    PARAMETER_UNKNOWN,
Shinya Kitaoka 120a6e
    BOOL,
Shinya Kitaoka 120a6e
    FLOAT,
Shinya Kitaoka 120a6e
    VEC2,
Shinya Kitaoka 120a6e
    VEC3,
Shinya Kitaoka 120a6e
    VEC4,
Shinya Kitaoka 120a6e
    INT,
Shinya Kitaoka 120a6e
    IVEC2,
Shinya Kitaoka 120a6e
    IVEC3,
Shinya Kitaoka 120a6e
    IVEC4,
Shinya Kitaoka 120a6e
    RGBA,
Shinya Kitaoka 120a6e
    RGB,
Shinya Kitaoka 120a6e
    TYPESCOUNT
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  enum HandledWorldTransformsType { HWT_UNKNOWN, ANY, ISOTROPIC, HWTCOUNT };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
public:  // Sub-classes
Shinya Kitaoka d1f6c4
  class ParameterConcept final : public TPersist {
Shinya Kitaoka 120a6e
    PERSIST_DECLARATION(ParameterConcept)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    ParameterConceptType m_type;  //!< The concept type (typically composite)
Shinya Kitaoka 120a6e
    QString m_label;              //!< Name to be shown for ui concepts
Shinya Kitaoka 120a6e
    std::vector<qstring></qstring>
Shinya Kitaoka 120a6e
        m_parameterNames;  //!< The involved parameters (by name)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    ParameterConcept() : m_type(CONCEPT_NONE) {}
Shinya Kitaoka 120a6e
    ParameterConcept(ParameterConceptType type, const QString &label)
Shinya Kitaoka 120a6e
        : m_type(type), m_label(label) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    bool isUI() const {
Shinya Kitaoka 120a6e
      return m_type >= UI_CONCEPTS && m_type < CONCEPTSCOUNT;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  protected:
Shinya Kitaoka 473e70
    void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
    void loadData(TIStream &is) override;
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  union ParameterValue {
Shinya Kitaoka 120a6e
    GLboolean m_bool;
Shinya Kitaoka 120a6e
    GLfloat m_float;
Shinya Kitaoka 120a6e
    GLfloat m_vec2[2];
Shinya Kitaoka 120a6e
    GLfloat m_vec3[3];
Shinya Kitaoka 120a6e
    GLfloat m_vec4[4];
Shinya Kitaoka 120a6e
    GLint m_int;
Shinya Kitaoka 120a6e
    GLint m_ivec2[2];
Shinya Kitaoka 120a6e
    GLint m_ivec3[3];
Shinya Kitaoka 120a6e
    GLint m_ivec4[4];
Shinya Kitaoka 120a6e
    GLubyte m_rgba[4];
Shinya Kitaoka 120a6e
    GLubyte m_rgb[3];
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka d1f6c4
  class Parameter final : public TPersist {
Shinya Kitaoka 120a6e
    PERSIST_DECLARATION(Parameter)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    ParameterType m_type;
Shinya Kitaoka 120a6e
    QString m_name;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ParameterValue m_default;
Shinya Kitaoka 120a6e
    ParameterValue m_range[2];
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ParameterConcept m_concept;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    Parameter() : m_type(PARAMETER_UNKNOWN) {}
Shinya Kitaoka 120a6e
    Parameter(ParameterType type, const QString &name)
Shinya Kitaoka 120a6e
        : m_type(type), m_name(name) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  protected:
Shinya Kitaoka 473e70
    void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
    void loadData(TIStream &is) override;
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka d1f6c4
  class ShaderData final : public TPersist {
Shinya Kitaoka 120a6e
    PERSIST_DECLARATION(ShaderData)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    QString m_name;                //!< A name associated to the shader action
Shinya Kitaoka 120a6e
    TFilePath m_path;              //!< The shader program's file path
Jeremy Bullock 1ef2a2
    QOpenGLShader::ShaderType m_type;  //!< The shader type
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    bool isValid() const { return !m_path.isEmpty(); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  protected:
Shinya Kitaoka 473e70
    void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
    void loadData(TIStream &is) override;
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
public:  // Public methods
Shinya Kitaoka 120a6e
  ShaderInterface();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isValid() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const std::vector<parameter> ¶meters() const;</parameter>
Shinya Kitaoka 120a6e
  const std::vector<qstring> &inputPorts() const;</qstring>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const ShaderData &mainShader() const;
Shinya Kitaoka 120a6e
  const ShaderData &inputPortsShader() const;
Shinya Kitaoka 120a6e
  const ShaderData &bboxShader() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  HandledWorldTransformsType hwtType() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
Returns a compiled shader program against current OpenGL context, and the
Shinya Kitaoka 120a6e
last modified date of the associated shader file.
Shinya Kitaoka 120a6e
*/
Jeremy Bullock 1ef2a2
  std::pair<qopenglshaderprogram *,="" qdatetime=""> makeProgram(</qopenglshaderprogram>
Shinya Kitaoka 120a6e
      const ShaderData &sd, int varyingsCount = 0,
Shinya Kitaoka 120a6e
      const GLchar **varyingNames = 0) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  void clear();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
  void loadData(TIStream &is) override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  PERSIST_DECLARATION(ShaderInterface)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ShaderData m_mainShader;              //!< Main (fragment) shader data
Shinya Kitaoka 120a6e
  std::vector<parameter> m_parameters;  //!< List of parameters for the shader</parameter>
Shinya Kitaoka 120a6e
  std::vector<parameterconcept></parameterconcept>
Shinya Kitaoka 120a6e
      m_parConcepts;  //!< List of (composite) parameter concepts
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<qstring> m_ports;</qstring>
Shinya Kitaoka 120a6e
  ShaderData m_portsShader;  //!< (Vertex) shader dedicated to input
Shinya Kitaoka 120a6e
                             //!< ports' geometries calculation
Shinya Kitaoka 120a6e
  ShaderData m_bboxShader;   //!< (Vertex) shader dedicated to extracting
Shinya Kitaoka 120a6e
                             //!< the fx's bbox
Shinya Kitaoka 120a6e
  HandledWorldTransformsType m_hwt;  //!< World transform types \a handled by
Shinya Kitaoka 120a6e
                                     //!< associated ShaderFx instances
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // SHADERINTERFACE_H