#ifndef GLW_VERTEXSHADER_H #define GLW_VERTEXSHADER_H #include "./shader.h" namespace glw { class VertexShaderArguments : public ShaderArguments { public: typedef ShaderArguments BaseType; typedef VertexShaderArguments ThisType; VertexShaderArguments(void) : BaseType() { ; } void clear(void) { BaseType::clear(); } }; class VertexShader : public Shader { friend class Context; public: typedef Shader BaseType; typedef VertexShader ThisType; virtual Type type(void) const { return VertexShaderType; } protected: VertexShader(Context * ctx) : BaseType(ctx) { ; } virtual GLenum shaderType(void) const { return GL_VERTEX_SHADER; } bool create(const VertexShaderArguments & args) { return BaseType::create(args); } }; namespace detail { template <> struct BaseOf { typedef Shader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type VertexShaderPtr; class SafeVertexShader : public SafeShader { friend class Context; friend class BoundVertexShader; public: typedef SafeShader BaseType; typedef SafeVertexShader ThisType; protected: SafeVertexShader(const VertexShaderPtr & vertexShader) : BaseType(vertexShader) { ; } const VertexShaderPtr & object(void) const { return static_cast(BaseType::object()); } VertexShaderPtr & object(void) { return static_cast(BaseType::object()); } }; namespace detail { template <> struct BaseOf { typedef SafeShader Type; }; }; namespace detail { template <> struct ObjectBase { typedef VertexShader Type; }; }; namespace detail { template <> struct ObjectSafe { typedef SafeVertexShader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type VertexShaderHandle; class VertexShaderBindingParams : public ShaderBindingParams { public: typedef ShaderBindingParams BaseType; typedef VertexShaderBindingParams ThisType; VertexShaderBindingParams(void) : BaseType(GL_VERTEX_SHADER, 0) { ; } }; class BoundVertexShader : public BoundShader { friend class Context; public: typedef BoundShader BaseType; typedef BoundVertexShader ThisType; const VertexShaderHandle & handle(void) const { return static_cast(BaseType::handle()); } VertexShaderHandle & handle(void) { return static_cast(BaseType::handle()); } protected: BoundVertexShader(const VertexShaderHandle & handle, const ShaderBindingParams & params) : BaseType(handle, params) { ; } const VertexShaderPtr & object(void) const { return this->handle()->object(); } VertexShaderPtr & object(void) { return this->handle()->object(); } }; namespace detail { template <> struct ParamsOf { typedef VertexShaderBindingParams Type; }; }; namespace detail { template <> struct BaseOf { typedef BoundShader Type; }; }; namespace detail { template <> struct ObjectBase { typedef VertexShader Type; }; }; namespace detail { template <> struct ObjectBound { typedef BoundVertexShader Type; }; }; typedef detail::ObjectSharedPointerTraits ::Type BoundVertexShaderHandle; }; #endif // GLW_VERTEXSHADER_H