Shader.hh 3.42 KB
Newer Older
Robert Menzel's avatar
Robert Menzel committed
1 2 3 4 5
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011, Computer Graphics Group RWTH Aachen University         //
// All rights reserved.                                                       //
////////////////////////////////////////////////////////////////////////////////

6 7
#ifndef ACGL_OPENGL_OBJECTS_SHADER_HH
#define ACGL_OPENGL_OBJECTS_SHADER_HH
Robert Menzel's avatar
Robert Menzel committed
8 9 10

#include <vector>
#include <string>
Robert Menzel's avatar
Robert Menzel committed
11 12 13 14
#include <tr1/memory>

#include <ACGL/ACGL.hh>

15
#include <ACGL/Base/Macros.hh>
Robert Menzel's avatar
Robert Menzel committed
16
#include <ACGL/OpenGL/GL.hh>
Robert Menzel's avatar
Robert Menzel committed
17 18

namespace ACGL{
Robert Menzel's avatar
Robert Menzel committed
19
namespace OpenGL{
Robert Menzel's avatar
Robert Menzel committed
20 21 22

class Shader
{
23 24
    ACGL_NOT_COPYABLE(Shader)

Robert Menzel's avatar
Robert Menzel committed
25 26 27 28
    // ===================================================================================================== \/
    // ============================================================================================ TYPEDEFS \/
    // ===================================================================================================== \/
public:
29 30
    typedef std::vector<std::string> AttributeNameVec;
    typedef std::vector<std::string> FragmentDataNameVec;
Robert Menzel's avatar
Robert Menzel committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

    // ========================================================================================================= \/
    // ============================================================================================ CONSTRUCTORS \/
    // ========================================================================================================= \/
public:
    Shader(GLenum _type)
    :   mContext(0),
        mType(_type)
    {
        mContext = glCreateShader(mType);
    }

    virtual ~Shader(void)
    {
        // "DeleteShader will silently ignore the value zero." - GL Spec
        glDeleteShader(mContext);
    }
    
    // ==================================================================================================== \/
    // ============================================================================================ GETTERS \/
    // ==================================================================================================== \/
public:
    inline GLuint getContext (void) const { return mContext; }
    inline GLenum getType    (void) const { return mType;    }

56 57 58
    inline const std::vector<std::string>& getAttributeNames    (void) const { return mAttributeNames;    }
    inline const std::vector<std::string>& getFragmentDataNames (void) const { return mFragmentDataNames; }

Robert Menzel's avatar
Robert Menzel committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72
    // ==================================================================================================== \/
    // ============================================================================================ METHODS \/
    // ==================================================================================================== \/
public:
    bool setFromFile (const std::string &_filename);
    bool setSource   (const std::string &_source  );

protected:
    bool compile (const char *_pProgramText) const;

    // =================================================================================================== \/
    // ============================================================================================ FIELDS \/
    // =================================================================================================== \/
protected:
73 74 75 76
    GLuint              mContext;
    GLenum              mType;
    AttributeNameVec    mAttributeNames;
    FragmentDataNameVec mFragmentDataNames;
Robert Menzel's avatar
Robert Menzel committed
77 78
};

79
ACGL_SHARED_TYPEDEF(Shader)
Robert Menzel's avatar
Robert Menzel committed
80 81

} // OpenGL
Robert Menzel's avatar
Robert Menzel committed
82 83
} // ACGL

84
#endif // ACGL_OPENGL_OBJECTS_SHADER_HH