Go to the documentation of this file.00001
00002
00003
00004
00005 #pragma once
00006
00007 #include "../base/Setup.h"
00008
00009 #ifdef MPMA_COMPILE_GFX
00010
00011 #include "../base/Types.h"
00012 #include "../base/ReferenceCount.h"
00013 #include "../base/File.h"
00014 #include "../gfxsetup/GL.h"
00015 #include "../gfxsetup/Extensions.h"
00016
00017 #include <string>
00018
00019 namespace GFX
00020 {
00022 struct TextureDimensions
00023 {
00024 nuint Width;
00025 nuint Height;
00026
00027
00029 inline TextureDimensions(nuint wid=0, nuint hei=1)
00030 { Width=wid; Height=hei; }
00031 };
00032
00034 struct TextureCreateParameters
00035 {
00037 GLint Format;
00039 bool GenerateMipMaps;
00041 TextureDimensions Dimensions;
00042
00043
00044
00045 inline TextureCreateParameters(): Format(GL_RGBA8), GenerateMipMaps(true)
00046 {}
00047 };
00048
00049 struct TextureData
00050 {
00051 GLuint object;
00052 TextureDimensions origDimensions;
00053
00054 inline TextureData(): object(0)
00055 {}
00056 };
00057
00059 class TextureBase: public MPMA::ReferenceCountedData<TextureData>
00060 {
00061 public:
00062 virtual ~TextureBase();
00063
00065 bool Create();
00067 void Free();
00068
00069
00070 inline operator GLuint() const { return Data().object; }
00071
00073 inline const nuint& OriginalWidth() const { return Data().origDimensions.Width; }
00075 inline const nuint& OriginalHeight() const { return Data().origDimensions.Height; }
00076
00077
00078 #ifdef GFX_USES_IMAGEMAGICK
00079
00080 bool CreateFromFile(const MPMA::Filename &filename, const TextureCreateParameters *properties=0);
00081
00082 #endif
00083
00084 bool CreateFromMemory(void *sourceData, const TextureCreateParameters *properties, GLint pixelFormat=GL_RGBA, GLenum pixelSize=GL_UNSIGNED_BYTE, GLenum usage=GL_STATIC_DRAW);
00085
00087 inline void BindAndSetState(int stage)
00088 {
00089 glActiveTextureARB(GL_TEXTURE0_ARB+stage);
00090 glBindTexture(target, *this);
00091 glEnable(target);
00092 }
00093
00095 inline void Unbind(int stage)
00096 {
00097 glActiveTextureARB(GL_TEXTURE0_ARB+stage);
00098 glBindTexture(target, 0);
00099 glDisable(target);
00100 }
00101
00102 protected:
00103 inline TextureBase(GLenum textureTarget): target(textureTarget)
00104 {}
00105
00106 GLenum target;
00107 };
00108
00110 class Texture2D: public TextureBase
00111 {
00112 public:
00113 inline Texture2D(): TextureBase(GL_TEXTURE_2D)
00114 {}
00115 };
00116
00118 class AutoBindTexture
00119 {
00120 public:
00121 inline AutoBindTexture(TextureBase &texToBind, int stage=0): tex(texToBind), boundStage(stage) { tex.BindAndSetState(stage); }
00122 inline ~AutoBindTexture() { tex.Unbind(boundStage); }
00123
00124 private:
00125 TextureBase &tex;
00126 int boundStage;
00127
00128
00129 AutoBindTexture(const AutoBindTexture &o);
00130 bool operator=(const AutoBindTexture &o);
00131 };
00132 }
00133
00134 #endif //#ifdef MPMA_COMPILE_GFX