#ifndef GLW_FRAGMENTSHADER_H #define GLW_FRAGMENTSHADER_H #include "./shader.h" namespace glw { class FragmentShaderArguments : public ShaderArguments { public: typedef ShaderArguments BaseType; typedef FragmentShaderArguments ThisType; FragmentShaderArguments(void) : BaseType() { ; } void clear(void) { BaseType::clear(); } }; class FragmentShader : public Shader { friend class Context; public: typedef Shader BaseType; typedef FragmentShader ThisType; virtual Type type(void) const { return FragmentShaderType; } protected: FragmentShader(Context * ctx) : BaseType(ctx) { ; } virtual GLenum shaderType(void) const { return GL_FRAGMENT_SHADER; } bool create(const FragmentShaderArguments & args) { return BaseType::create(args); } }; namespace detail { template <> struct BaseOf { typedef Shader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type FragmentShaderPtr; class SafeFragmentShader : public SafeShader { friend class Context; friend class BoundFragmentShader; public: typedef SafeShader BaseType; typedef SafeFragmentShader ThisType; protected: SafeFragmentShader(const FragmentShaderPtr & fragmentShader) : BaseType(fragmentShader) { ; } const FragmentShaderPtr & object(void) const { return static_cast(BaseType::object()); } FragmentShaderPtr & object(void) { return static_cast(BaseType::object()); } }; namespace detail { template <> struct BaseOf { typedef SafeShader Type; }; }; namespace detail { template <> struct ObjectBase { typedef FragmentShader Type; }; }; namespace detail { template <> struct ObjectSafe { typedef SafeFragmentShader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type FragmentShaderHandle; class FragmentShaderBindingParams : public ShaderBindingParams { public: typedef ShaderBindingParams BaseType; typedef FragmentShaderBindingParams ThisType; FragmentShaderBindingParams(void) : BaseType(GL_FRAGMENT_SHADER, 0) { ; } }; class BoundFragmentShader : public BoundShader { friend class Context; public: typedef BoundShader BaseType; typedef BoundFragmentShader ThisType; const FragmentShaderHandle & handle(void) const { return static_cast(BaseType::handle()); } FragmentShaderHandle & handle(void) { return static_cast(BaseType::handle()); } protected: BoundFragmentShader(const FragmentShaderHandle & handle, const ShaderBindingParams & params) : BaseType(handle, params) { ; } const FragmentShaderPtr & object(void) const { return this->handle()->object(); } FragmentShaderPtr & object(void) { return this->handle()->object(); } }; namespace detail { template <> struct ParamsOf { typedef FragmentShaderBindingParams Type; }; }; namespace detail { template <> struct BaseOf { typedef BoundShader Type; }; }; namespace detail { template <> struct ObjectBase { typedef FragmentShader Type; }; }; namespace detail { template <> struct ObjectBound { typedef BoundFragmentShader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type BoundFragmentShaderHandle; }; #endif // GLW_FRAGMENTSHADER_H