159 lines
3.7 KiB
C++
159 lines
3.7 KiB
C++
#ifndef GLW_GEOMETRYSHADER_H
|
|
#define GLW_GEOMETRYSHADER_H
|
|
|
|
#include "./shader.h"
|
|
|
|
namespace glw
|
|
{
|
|
|
|
class GeometryShaderArguments : public ShaderArguments
|
|
{
|
|
public:
|
|
|
|
typedef ShaderArguments BaseType;
|
|
typedef GeometryShaderArguments ThisType;
|
|
|
|
GeometryShaderArguments(void)
|
|
: BaseType()
|
|
{
|
|
;
|
|
}
|
|
|
|
void clear(void)
|
|
{
|
|
BaseType::clear();
|
|
}
|
|
};
|
|
|
|
class GeometryShader : public Shader
|
|
{
|
|
friend class Context;
|
|
|
|
public:
|
|
|
|
typedef Shader BaseType;
|
|
typedef GeometryShader ThisType;
|
|
|
|
virtual Type type(void) const
|
|
{
|
|
return GeometryShaderType;
|
|
}
|
|
|
|
protected:
|
|
|
|
GeometryShader(Context * ctx)
|
|
: BaseType(ctx)
|
|
{
|
|
;
|
|
}
|
|
|
|
virtual GLenum shaderType(void) const
|
|
{
|
|
return GL_GEOMETRY_SHADER;
|
|
}
|
|
|
|
bool create(const GeometryShaderArguments & args)
|
|
{
|
|
return BaseType::create(args);
|
|
}
|
|
};
|
|
|
|
namespace detail { template <> struct BaseOf <GeometryShader> { typedef Shader Type; }; };
|
|
typedef detail::ObjectSharedPointerTraits <GeometryShader> ::Type GeometryShaderPtr;
|
|
|
|
class SafeGeometryShader : public SafeShader
|
|
{
|
|
friend class Context;
|
|
friend class BoundGeometryShader;
|
|
|
|
public:
|
|
|
|
typedef SafeShader BaseType;
|
|
typedef SafeGeometryShader ThisType;
|
|
|
|
protected:
|
|
|
|
SafeGeometryShader(const GeometryShaderPtr & geometryShader)
|
|
: BaseType(geometryShader)
|
|
{
|
|
;
|
|
}
|
|
|
|
const GeometryShaderPtr & object(void) const
|
|
{
|
|
return static_cast<const GeometryShaderPtr &>(BaseType::object());
|
|
}
|
|
|
|
GeometryShaderPtr & object(void)
|
|
{
|
|
return static_cast<GeometryShaderPtr &>(BaseType::object());
|
|
}
|
|
};
|
|
|
|
namespace detail { template <> struct BaseOf <SafeGeometryShader> { typedef SafeShader Type; }; };
|
|
namespace detail { template <> struct ObjectBase <SafeGeometryShader> { typedef GeometryShader Type; }; };
|
|
namespace detail { template <> struct ObjectSafe <GeometryShader > { typedef SafeGeometryShader Type; }; };
|
|
typedef detail::ObjectSharedPointerTraits <SafeGeometryShader> ::Type GeometryShaderHandle;
|
|
|
|
class GeometryShaderBindingParams : public ShaderBindingParams
|
|
{
|
|
public:
|
|
|
|
typedef ShaderBindingParams BaseType;
|
|
typedef GeometryShaderBindingParams ThisType;
|
|
|
|
GeometryShaderBindingParams(void)
|
|
: BaseType(GL_GEOMETRY_SHADER, 0)
|
|
{
|
|
;
|
|
}
|
|
};
|
|
|
|
class BoundGeometryShader : public BoundShader
|
|
{
|
|
friend class Context;
|
|
|
|
public:
|
|
|
|
typedef BoundShader BaseType;
|
|
typedef BoundGeometryShader ThisType;
|
|
|
|
const GeometryShaderHandle & handle(void) const
|
|
{
|
|
return static_cast<const GeometryShaderHandle &>(BaseType::handle());
|
|
}
|
|
|
|
GeometryShaderHandle & handle(void)
|
|
{
|
|
return static_cast<GeometryShaderHandle &>(BaseType::handle());
|
|
}
|
|
|
|
protected:
|
|
|
|
BoundGeometryShader(const GeometryShaderHandle & handle, const ShaderBindingParams & params)
|
|
: BaseType(handle, params)
|
|
{
|
|
;
|
|
}
|
|
|
|
const GeometryShaderPtr & object(void) const
|
|
{
|
|
return this->handle()->object();
|
|
}
|
|
|
|
GeometryShaderPtr & object(void)
|
|
{
|
|
return this->handle()->object();
|
|
}
|
|
};
|
|
|
|
namespace detail { template <> struct ParamsOf <BoundGeometryShader> { typedef GeometryShaderBindingParams Type; }; };
|
|
namespace detail { template <> struct BaseOf <BoundGeometryShader> { typedef BoundShader Type; }; };
|
|
namespace detail { template <> struct ObjectBase <BoundGeometryShader> { typedef GeometryShader Type; }; };
|
|
namespace detail { template <> struct ObjectBound <GeometryShader > { typedef BoundGeometryShader Type; }; };
|
|
typedef detail::ObjectSharedPointerTraits <BoundGeometryShader> ::Type BoundGeometryShaderHandle;
|
|
|
|
};
|
|
|
|
#endif // GLW_GEOMETRYSHADER_H
|