1 #ifndef GLW_TEXTURECUBE_H 2 #define GLW_TEXTURECUBE_H 3 4 #include "./texture.h" 5 6 namespace glw 7 { 8 9 class TextureCubeArguments : public TextureArguments 10 { 11 public: 12 13 typedef TextureArguments BaseType; 14 typedef TextureCubeArguments ThisType; 15 16 GLsizei size; 17 GLenum dataFormat; 18 GLenum dataType; 19 const void * data; 20 TextureSampleMode sampler; 21 TextureCubeArguments(void)22 TextureCubeArguments(void) 23 { 24 this->clear(); 25 } 26 clear(void)27 void clear(void) 28 { 29 BaseType::clear(); 30 this->size = 0; 31 this->dataFormat = GL_NONE; 32 this->dataType = GL_NONE; 33 this->data = 0; 34 this->sampler.clear(); 35 } 36 }; 37 38 class TextureCube : public Texture 39 { 40 friend class Context; 41 42 public: 43 44 typedef Texture BaseType; 45 typedef TextureCube ThisType; 46 type(void)47 virtual Type type(void) const 48 { 49 return TextureCubeType; 50 } 51 imageDimensions(void)52 virtual int imageDimensions(void) const 53 { 54 return 2; 55 } 56 isArray(void)57 virtual bool isArray(void) const 58 { 59 return false; 60 } 61 size(void)62 GLsizei size(void) const 63 { 64 return this->m_size; 65 } 66 width(void)67 GLsizei width(void) const 68 { 69 return this->size(); 70 } 71 height(void)72 GLsizei height(void) const 73 { 74 return this->size(); 75 } 76 setImage(GLenum target,GLint unit,GLint level,GLsizei size,GLenum dataFormat,GLenum dataType,const void * data)77 void setImage(GLenum target, GLint unit, GLint level, GLsizei size, GLenum dataFormat, GLenum dataType, const void * data) 78 { 79 (void)unit; 80 GLW_ASSERT(this->isValid()); 81 glTexImage2D(target, level, this->m_format, size, size, 0, dataFormat, dataType, data); 82 } 83 getImage(GLenum target,GLint unit,GLint level,GLenum dataFormat,GLenum dataType,void * data)84 void getImage(GLenum target, GLint unit, GLint level, GLenum dataFormat, GLenum dataType, void * data) 85 { 86 (void)unit; 87 GLW_ASSERT(this->isValid()); 88 glGetTexImage(target, level, dataFormat, dataType, data); 89 } 90 setSubImage(GLenum target,GLint unit,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum dataFormat,GLenum dataType,const void * data)91 void setSubImage(GLenum target, GLint unit, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data) 92 { 93 (void)unit; 94 GLW_ASSERT(this->isValid()); 95 glTexSubImage2D(target, level, xoffset, yoffset, width, height, dataFormat, dataType, data); 96 } 97 generateMipmap(GLenum target,GLint unit)98 void generateMipmap(GLenum target, GLint unit) 99 { 100 (void)unit; 101 GLW_ASSERT(this->isValid()); 102 glGenerateMipmap(target); 103 } 104 setSampleMode(GLenum target,GLint unit,const TextureSampleMode & sampler)105 void setSampleMode(GLenum target, GLint unit, const TextureSampleMode & sampler) 106 { 107 (void)unit; 108 GLW_ASSERT(this->isValid()); 109 if (GLW_CARE_OF(sampler.minFilter)) glTexParameteri(target, GL_TEXTURE_MIN_FILTER, sampler.minFilter); 110 if (GLW_CARE_OF(sampler.magFilter)) glTexParameteri(target, GL_TEXTURE_MAG_FILTER, sampler.magFilter); 111 if (GLW_CARE_OF(sampler.wrapS )) glTexParameteri(target, GL_TEXTURE_WRAP_S, sampler.wrapS ); 112 if (GLW_CARE_OF(sampler.wrapT )) glTexParameteri(target, GL_TEXTURE_WRAP_T, sampler.wrapT ); 113 } 114 115 protected: 116 117 GLsizei m_size; 118 TextureCube(Context * ctx)119 TextureCube(Context * ctx) 120 : BaseType (ctx) 121 , m_size (0) 122 { 123 ; 124 } 125 create(const TextureCubeArguments & args)126 bool create(const TextureCubeArguments & args) 127 { 128 this->destroy(); 129 GLint boundName = 0; 130 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &boundName); 131 glGenTextures(1, &(this->m_name)); 132 glBindTexture(GL_TEXTURE_CUBE_MAP, this->m_name); 133 for (int f=0; f<6; ++f) 134 { 135 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, 0, args.format, args.size, args.size, 0, args.dataFormat, args.dataType, args.data); 136 } 137 this->m_format = args.format; 138 this->m_size = args.size; 139 this->setSampleMode(GL_TEXTURE_CUBE_MAP, 0, args.sampler); 140 glBindTexture(GL_TEXTURE_CUBE_MAP, boundName); 141 return true; 142 } 143 doDestroy(void)144 virtual void doDestroy(void) 145 { 146 BaseType::doDestroy(); 147 this->m_format = GL_NONE; 148 this->m_size = 0; 149 } 150 doIsValid(void)151 virtual bool doIsValid(void) const 152 { 153 return ((this->m_format != GL_NONE) && (this->m_size > 0)); 154 } 155 }; 156 157 namespace detail { template <> struct BaseOf <TextureCube> { typedef Texture Type; }; }; 158 typedef detail::ObjectSharedPointerTraits <TextureCube> ::Type TextureCubePtr; 159 160 class SafeTextureCube : public SafeTexture 161 { 162 friend class Context; 163 friend class BoundTextureCube; 164 165 public: 166 167 typedef SafeTexture BaseType; 168 typedef SafeTextureCube ThisType; 169 170 SafeTextureCube(void) 171 : BaseType() 172 { 173 ; 174 } 175 176 GLsizei size(void) const 177 { 178 return this->object()->size(); 179 } 180 181 GLsizei width(void) const 182 { 183 return this->object()->width(); 184 } 185 186 GLsizei height(void) const 187 { 188 return this->object()->height(); 189 } 190 191 protected: 192 193 SafeTextureCube(const TextureCubePtr & texture2D) 194 : BaseType(texture2D) 195 { 196 ; 197 } 198 199 const TextureCubePtr & object(void) const 200 { 201 return static_cast<const TextureCubePtr &>(BaseType::object()); 202 } 203 204 TextureCubePtr & object(void) 205 { 206 return static_cast<TextureCubePtr &>(BaseType::object()); 207 } 208 }; 209 210 namespace detail { template <> struct BaseOf <SafeTextureCube> { typedef SafeTexture Type; }; }; 211 namespace detail { template <> struct ObjectBase <SafeTextureCube> { typedef TextureCube Type; }; }; 212 namespace detail { template <> struct ObjectSafe <TextureCube > { typedef SafeTextureCube Type; }; }; 213 typedef detail::ObjectSharedPointerTraits <SafeTextureCube> ::Type TextureCubeHandle; 214 215 class TextureCubeBindingParams : public TextureBindingParams 216 { 217 public: 218 219 typedef TextureBindingParams BaseType; 220 typedef TextureCubeBindingParams ThisType; 221 222 TextureCubeBindingParams(void) 223 : BaseType() 224 { 225 ; 226 } 227 228 TextureCubeBindingParams(GLenum aUnit) 229 : BaseType(GL_TEXTURE_CUBE_MAP, aUnit) 230 { 231 ; 232 } 233 }; 234 235 class BoundTextureCube : public BoundTexture 236 { 237 friend class Context; 238 239 public: 240 241 typedef BoundTexture BaseType; 242 typedef BoundTextureCube ThisType; 243 244 BoundTextureCube(void) 245 : BaseType() 246 { 247 ; 248 } 249 250 const TextureCubeHandle & handle(void) const 251 { 252 return static_cast<const TextureCubeHandle &>(BaseType::handle()); 253 } 254 255 TextureCubeHandle & handle(void) 256 { 257 return static_cast<TextureCubeHandle &>(BaseType::handle()); 258 } 259 260 void setSampleMode(const TextureSampleMode & sampler) 261 { 262 this->object()->setSampleMode(this->m_target, this->m_unit, sampler); 263 } 264 265 void setImage(GLenum face, GLint level, GLsizei size, GLenum dataFormat, GLenum dataType, const void * data) 266 { 267 this->object()->setImage(face, this->m_unit, level, size, dataFormat, dataType, data); 268 } 269 270 void getImage(GLenum face, GLint level, GLenum dataFormat, GLenum dataType, void * data) 271 { 272 this->object()->getImage(face, this->m_unit, level, dataFormat, dataType, data); 273 } 274 275 void setSubImage(GLenum face, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum dataFormat, GLenum dataType, const void * data) 276 { 277 this->object()->setSubImage(face, this->m_unit, level, xoffset, yoffset, width, height, dataFormat, dataType, data); 278 } 279 280 void generateMipmap(void) 281 { 282 this->object()->generateMipmap(this->m_target, this->m_unit); 283 } 284 285 protected: 286 287 BoundTextureCube(const TextureCubeHandle & handle, const TextureCubeBindingParams & params) 288 : BaseType(handle, params) 289 { 290 ; 291 } 292 293 const TextureCubePtr & object(void) const 294 { 295 return this->handle()->object(); 296 } 297 298 TextureCubePtr & object(void) 299 { 300 return this->handle()->object(); 301 } 302 }; 303 304 namespace detail { template <> struct ParamsOf <BoundTextureCube> { typedef TextureCubeBindingParams Type; }; }; 305 namespace detail { template <> struct BaseOf <BoundTextureCube> { typedef BoundObject Type; }; }; 306 namespace detail { template <> struct ObjectBase <BoundTextureCube> { typedef TextureCube Type; }; }; 307 namespace detail { template <> struct ObjectBound <TextureCube > { typedef BoundTextureCube Type; }; }; 308 typedef detail::ObjectSharedPointerTraits <BoundTextureCube> ::Type BoundTextureCubeHandle; 309 310 }; 311 312 #endif // GLW_TEXTURECUBE_H 313