00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __RE_OGLTextureCache__
00020 #define __RE_OGLTextureCache__
00021
00022 #include "RE_API.h"
00023
00024 #include <SYS/SYS_Math.h>
00025 #include <SYS/SYS_Types.h>
00026 #include <UT/UT_IntArray.h>
00027 #include <UT/UT_PtrArray.h>
00028 #include <UT/UT_RefArray.h>
00029
00030 #include <boost/shared_array.hpp>
00031
00032 class RE_Render;
00033 class PXL_Raster;
00034 class re_DeferTexDraw;
00035
00036 enum RE_OGLTextureType
00037 {
00038 RE_TEXTURE_FIXED,
00039 RE_TEXTURE_MIPMAP
00040 };
00041
00042 struct RE_OGLTextureInfo
00043 {
00044 RE_OGLTextureInfo()
00045 {}
00046
00047 RE_OGLTextureInfo(RE_OGLTextureType t, uint w, uint h)
00048 : myTextureType(t),
00049 myWidth(w),
00050 myHeight(h),
00051 myS(double(myWidth) / SYSmakePow2(w)),
00052 myT(double(myHeight) / SYSmakePow2(h))
00053 {}
00054
00055 RE_OGLTextureType myTextureType;
00056 int myWidth;
00057 int myHeight;
00058
00059
00060
00061
00062 double myS;
00063 double myT;
00064 };
00065
00066 typedef UT_RefArray<RE_OGLTextureInfo> RE_OGLTextureInfoArray;
00067
00068 class RE_API RE_OGLTextureCache
00069 {
00070 public:
00071 RE_OGLTextureCache();
00072 ~RE_OGLTextureCache();
00073
00074
00075 int addTexture(RE_Render *r, PXL_Raster *texture);
00076
00077
00078
00079
00080
00081 int addMipMapTexture(RE_Render *r, UT_PtrArray<PXL_Raster *> levels);
00082
00083
00084 void removeTexture(int id);
00085
00086
00087 void clearTextureCache();
00088
00089
00090
00091 int getTextureVersion() const { return myVersion; }
00092
00093
00094 void renderTexture(RE_Render *r, int x, int y, int w, int h, int id,
00095 fpreal alpha = 1.0f);
00096
00097
00098
00099
00100 bool startTexture(RE_Render *r, int id, int &cacheindex);
00101
00102
00103 void endTexture(RE_Render *r, int id);
00104
00105
00106
00107
00108 void beginTextureDefer(RE_Render *r);
00109 void endTextureDefer(RE_Render *r);
00110
00111
00112 static bool isTexture(int id);
00113
00114 private:
00115
00116 boost::shared_array<int8> makePow2Texture(int8 *imgdata, uint w, uint h);
00117
00118 void createTextureImage(int level, PXL_Raster *texture, bool mipmap);
00119
00120 private:
00121
00122
00123 UT_IntArray myTextures;
00124
00125
00126 RE_OGLTextureInfoArray myTextureInfo;
00127
00128
00129 int myVersion;
00130 bool myTextureEnabled;
00131
00132
00133
00134 int myTextureDefer;
00135 UT_PtrArray<re_DeferTexDraw *> myDeferTexDraw;
00136 UT_IntArray myTextureDeferStart;
00137 };
00138
00139
00140 RE_API extern RE_OGLTextureCache *REgetOGLTextureCache();
00141
00142 #endif
00143