+#ifndef MSP_GL_TEXTURECUBE_H_
+#define MSP_GL_TEXTURECUBE_H_
+
+#include "datatype.h"
+#include "pixelformat.h"
+#include "texture.h"
+
+namespace Msp {
+namespace GL {
+
+enum TextureCubeFace
+{
+ POSITIVE_X = GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+ NEGATIVE_X = GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+ POSITIVE_Y = GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+ NEGATIVE_Y = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+ POSITIVE_Z = GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+ NEGATIVE_Z = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+};
+
+/**
+Cube map texture, consisting of six square faces. All of the faces must be of
+the same size. A cube map texture is addressed by three-dimensional texture
+coordinates. The face is first selected according to the largest coordinate,
+and the remaining two coordinates are used to sample the face image.
+
+All faces of a cube map texture must be allocated for it to be usable.
+
+Requires OpenGL version 1.3.
+*/
+class TextureCube: public Texture
+{
+private:
+ PixelFormat ifmt;
+ unsigned size;
+ unsigned allocated;
+
+public:
+ TextureCube();
+
+ /** Defines storage structure for the texture. Must be called before an
+ image can be uploaded. Once storage is defined, it can't be changed. */
+ void storage(PixelFormat fmt, unsigned size);
+
+ /** Allocates storage for the cube faces. The contents are initially
+ undefined. If storage has already been allocated, does nothing. */
+ void allocate(unsigned level);
+
+ /** Uploads image data to a face. Storage must be defined beforehand. The
+ image data must have dimensions and format compatible with the defined
+ storage. */
+ void image(TextureCubeFace face, unsigned level,
+ PixelFormat fmt, DataType type, const void *data);
+
+ /** Updates a rectangular region of a face. Storage must be defined and
+ allocated beforehand. The update region must be fully inside the texture.
+ The data format must be compatible with the defined storage. */
+ void sub_image(TextureCubeFace face, unsigned level,
+ int x, int y, unsigned w, unsigned h,
+ PixelFormat fmt, DataType type, const void *data);
+
+ unsigned get_size() const { return size; }
+private:
+ unsigned get_level_size(unsigned);
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif