| #pragma once |
| |
| #ifndef SHADERINTERFACE_H |
| #define SHADERINTERFACE_H |
| |
| |
| #include <GL/glew.h> // Must be included before tgl.h |
| |
| |
| #include "tparamuiconcept.h" |
| |
| |
| #include "tpersist.h" |
| #include "tfilepath.h" |
| #include "tgl.h" |
| |
| |
| #include <QString> |
| #include <QDateTime> |
| #include <QOpenGLShader> |
| |
| |
| #include <vector> |
| |
| #undef DVAPI |
| #undef DVVAR |
| #ifdef TNZSTDFX_EXPORTS |
| #define DVAPI DV_EXPORT_API |
| #define DVVAR DV_EXPORT_VAR |
| #else |
| #define DVAPI DV_IMPORT_API |
| #define DVVAR DV_IMPORT_VAR |
| #endif |
| |
| |
| |
| |
| |
| class QOpenGLShaderProgram; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class DVAPI ShaderInterface final : public TPersist { |
| public: |
| enum ParameterConceptType { |
| CONCEPT_NONE, |
| PERCENT, |
| LENGTH, |
| ANGLE, |
| POINT, |
| RADIUS_UI, |
| WIDTH_UI, |
| ANGLE_UI, |
| POINT_UI, |
| XY_UI, |
| VECTOR_UI, |
| POLAR_UI, |
| SIZE_UI, |
| QUAD_UI, |
| RECT_UI, |
| |
| CONCEPTSCOUNT, |
| UI_CONCEPTS = RADIUS_UI |
| }; |
| |
| enum ParameterType { |
| PARAMETER_UNKNOWN, |
| BOOL, |
| FLOAT, |
| VEC2, |
| VEC3, |
| VEC4, |
| INT, |
| IVEC2, |
| IVEC3, |
| IVEC4, |
| RGBA, |
| RGB, |
| TYPESCOUNT |
| }; |
| |
| enum HandledWorldTransformsType { HWT_UNKNOWN, ANY, ISOTROPIC, HWTCOUNT }; |
| |
| public: |
| class ParameterConcept final : public TPersist { |
| PERSIST_DECLARATION(ParameterConcept) |
| |
| public: |
| ParameterConceptType m_type; |
| QString m_label; |
| std::vector<QString> |
| m_parameterNames; |
| |
| public: |
| ParameterConcept() : m_type(CONCEPT_NONE) {} |
| ParameterConcept(ParameterConceptType type, const QString &label) |
| : m_type(type), m_label(label) {} |
| |
| bool isUI() const { |
| return m_type >= UI_CONCEPTS && m_type < CONCEPTSCOUNT; |
| } |
| |
| protected: |
| void saveData(TOStream &os) override; |
| void loadData(TIStream &is) override; |
| }; |
| |
| union ParameterValue { |
| GLboolean m_bool; |
| GLfloat m_float; |
| GLfloat m_vec2[2]; |
| GLfloat m_vec3[3]; |
| GLfloat m_vec4[4]; |
| GLint m_int; |
| GLint m_ivec2[2]; |
| GLint m_ivec3[3]; |
| GLint m_ivec4[4]; |
| GLubyte m_rgba[4]; |
| GLubyte m_rgb[3]; |
| }; |
| |
| class Parameter final : public TPersist { |
| PERSIST_DECLARATION(Parameter) |
| |
| public: |
| ParameterType m_type; |
| QString m_name; |
| |
| ParameterValue m_default; |
| ParameterValue m_range[2]; |
| |
| ParameterConcept m_concept; |
| |
| public: |
| Parameter() : m_type(PARAMETER_UNKNOWN) {} |
| Parameter(ParameterType type, const QString &name) |
| : m_type(type), m_name(name) {} |
| |
| protected: |
| void saveData(TOStream &os) override; |
| void loadData(TIStream &is) override; |
| }; |
| |
| class ShaderData final : public TPersist { |
| PERSIST_DECLARATION(ShaderData) |
| |
| public: |
| QString m_name; |
| TFilePath m_path; |
| QOpenGLShader::ShaderType m_type; |
| |
| public: |
| bool isValid() const { return !m_path.isEmpty(); } |
| |
| protected: |
| void saveData(TOStream &os) override; |
| void loadData(TIStream &is) override; |
| }; |
| |
| public: |
| ShaderInterface(); |
| |
| bool isValid() const; |
| |
| const std::vector<Parameter> ¶meters() const; |
| const std::vector<QString> &inputPorts() const; |
| |
| const ShaderData &mainShader() const; |
| const ShaderData &inputPortsShader() const; |
| const ShaderData &bboxShader() const; |
| |
| HandledWorldTransformsType hwtType() const; |
| |
| |
| |
| |
| |
| std::pair<QOpenGLShaderProgram *, QDateTime> makeProgram( |
| const ShaderData &sd, int varyingsCount = 0, |
| const GLchar **varyingNames = 0) const; |
| |
| protected: |
| void clear(); |
| |
| void saveData(TOStream &os) override; |
| void loadData(TIStream &is) override; |
| |
| private: |
| PERSIST_DECLARATION(ShaderInterface) |
| |
| ShaderData m_mainShader; |
| std::vector<Parameter> m_parameters; |
| std::vector<ParameterConcept> |
| m_parConcepts; |
| |
| std::vector<QString> m_ports; |
| ShaderData m_portsShader; |
| |
| ShaderData m_bboxShader; |
| |
| HandledWorldTransformsType m_hwt; |
| |
| }; |
| |
| #endif |