00001 #ifndef GLW_VERTEXSHADER_H 00002 #define GLW_VERTEXSHADER_H 00003 00004 #include "./shader.h" 00005 00006 namespace glw 00007 { 00008 00009 class VertexShaderArguments : public ShaderArguments 00010 { 00011 public: 00012 00013 typedef ShaderArguments BaseType; 00014 typedef VertexShaderArguments ThisType; 00015 00016 VertexShaderArguments(void) 00017 : BaseType() 00018 { 00019 ; 00020 } 00021 00022 void clear(void) 00023 { 00024 BaseType::clear(); 00025 } 00026 }; 00027 00028 class VertexShader : public Shader 00029 { 00030 friend class Context; 00031 00032 public: 00033 00034 typedef Shader BaseType; 00035 typedef VertexShader ThisType; 00036 00037 virtual Type type(void) const 00038 { 00039 return VertexShaderType; 00040 } 00041 00042 protected: 00043 00044 VertexShader(Context * ctx) 00045 : BaseType(ctx) 00046 { 00047 ; 00048 } 00049 00050 virtual GLenum shaderType(void) const 00051 { 00052 return GL_VERTEX_SHADER; 00053 } 00054 00055 bool create(const VertexShaderArguments & args) 00056 { 00057 return BaseType::create(args); 00058 } 00059 }; 00060 00061 namespace detail { template <> struct BaseOf <VertexShader> { typedef Shader Type; }; }; 00062 typedef detail::ObjectSharedPointerTraits <VertexShader> ::Type VertexShaderPtr; 00063 00064 class SafeVertexShader : public SafeShader 00065 { 00066 friend class Context; 00067 friend class BoundVertexShader; 00068 00069 public: 00070 00071 typedef SafeShader BaseType; 00072 typedef SafeVertexShader ThisType; 00073 00074 protected: 00075 00076 SafeVertexShader(const VertexShaderPtr & vertexShader) 00077 : BaseType(vertexShader) 00078 { 00079 ; 00080 } 00081 00082 const VertexShaderPtr & object(void) const 00083 { 00084 return static_cast<const VertexShaderPtr &>(BaseType::object()); 00085 } 00086 00087 VertexShaderPtr & object(void) 00088 { 00089 return static_cast<VertexShaderPtr &>(BaseType::object()); 00090 } 00091 }; 00092 00093 namespace detail { template <> struct BaseOf <SafeVertexShader> { typedef SafeShader Type; }; }; 00094 namespace detail { template <> struct ObjectBase <SafeVertexShader> { typedef VertexShader Type; }; }; 00095 namespace detail { template <> struct ObjectSafe <VertexShader > { typedef SafeVertexShader Type; }; }; 00096 typedef detail::ObjectSharedPointerTraits <SafeVertexShader> ::Type VertexShaderHandle; 00097 00098 class VertexShaderBindingParams : public ShaderBindingParams 00099 { 00100 public: 00101 00102 typedef ShaderBindingParams BaseType; 00103 typedef VertexShaderBindingParams ThisType; 00104 00105 VertexShaderBindingParams(void) 00106 : BaseType(GL_VERTEX_SHADER, 0) 00107 { 00108 ; 00109 } 00110 }; 00111 00112 class BoundVertexShader : public BoundShader 00113 { 00114 friend class Context; 00115 00116 public: 00117 00118 typedef BoundShader BaseType; 00119 typedef BoundVertexShader ThisType; 00120 00121 const VertexShaderHandle & handle(void) const 00122 { 00123 return static_cast<const VertexShaderHandle &>(BaseType::handle()); 00124 } 00125 00126 VertexShaderHandle & handle(void) 00127 { 00128 return static_cast<VertexShaderHandle &>(BaseType::handle()); 00129 } 00130 00131 protected: 00132 00133 BoundVertexShader(const VertexShaderHandle & handle, const ShaderBindingParams & params) 00134 : BaseType(handle, params) 00135 { 00136 ; 00137 } 00138 00139 const VertexShaderPtr & object(void) const 00140 { 00141 return this->handle()->object(); 00142 } 00143 00144 VertexShaderPtr & object(void) 00145 { 00146 return this->handle()->object(); 00147 } 00148 }; 00149 00150 namespace detail { template <> struct ParamsOf <BoundVertexShader> { typedef VertexShaderBindingParams Type; }; }; 00151 namespace detail { template <> struct BaseOf <BoundVertexShader> { typedef BoundShader Type; }; }; 00152 namespace detail { template <> struct ObjectBase <BoundVertexShader> { typedef VertexShader Type; }; }; 00153 namespace detail { template <> struct ObjectBound <VertexShader > { typedef BoundVertexShader Type; }; }; 00154 typedef detail::ObjectSharedPointerTraits <BoundVertexShader> ::Type BoundVertexShaderHandle; 00155 00156 }; 00157 00158 #endif // GLW_VERTEXSHADER_H