Raw File
TextureDesc.h
#pragma once

#include <vector>
#include <stack>
#include <GL/glew.h>

#ifdef __APPLE__
#  include <GLUT/glut.h>
#else
#  include <GL/glut.h>
#endif

#include "TextureUtil.h"

class cTextureDesc
{
public:
	cTextureDesc(int width, int height, int channels, GLenum format, 
				GLenum type, bool mipmaps);
	cTextureDesc(int width, int height, int depth, int channels, GLenum format, 
				GLenum type, bool mipmaps);
	cTextureDesc(GLuint obj, GLuint tex, GLuint ds, int width, int height, int depth, 
					int channels, GLenum format);
	virtual ~cTextureDesc();

	virtual void BindBuffer() const;
	virtual void UnbindBuffer() const;
	virtual void BindBuffer3DSlice(int slice) const;
	virtual void BindTex(GLint tex_slot) const;
	virtual void UnbindTex(GLint tex_slot) const;

	virtual GLuint GetObj() const;
	virtual GLuint GetTexture() const;
	virtual GLuint GetDepthStencil() const;
	virtual bool IsValid() const;
	virtual bool IsRenderBuffer() const;

	virtual int GetWidth() const;
	virtual int GetHeight() const;
	virtual int GetNumTexels() const;

	virtual void Reshape(int w, int h);
	virtual void ReadPixels(std::vector<GLubyte>& out_data);

protected:
	static const int gNumViewportParams = 4;
	struct tTexEntry
	{
		GLint mTex;
		GLint mViewportParams[gNumViewportParams];
		tTexEntry();
	};
	static std::stack<tTexEntry> mTexStack;

	int mWidth;
	int mHeight;
	int mDepth;
	int mChannels;
	GLenum mFormat;
	GLenum mType;
	bool mHasMips;

	GLuint mObject;
	GLuint mTexture;
	GLuint mDepthStencil;

	cTextureDesc();
	virtual void RestorePrevParams() const;
	virtual void RecordPrevParams() const;
};
back to top