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