00001 #pragma once
00002
00003 class TextureCache;
00004
00005 #include <d3d10.h>
00006 #include <d3dx10.h>
00007 #include <hash_map>
00008 #include "shader_unreal.h"
00009
00010
00011 class TextureCache
00012 {
00013
00014 public:
00019 enum TexturePass {PASS_DIFFUSE,PASS_LIGHT,PASS_DETAIL,PASS_FOG,PASS_MACRO,PASS_BUMP,PASS_HEIGHT,DUMMY_NUM_TEXTURE_PASSES};
00020
00024 enum ExternalTextures{EXTRA_TEX_DETAIL,EXTRA_TEX_BUMP,EXTRA_TEX_HEIGHT,DUMMY_NUM_EXTERNAL_TEXTURES};
00025
00026 struct ExternalTexture
00027 {
00028 wchar_t* suffix;
00029 UINT mipLevels;
00030 };
00031 static const ExternalTexture externalTextures[DUMMY_NUM_EXTERNAL_TEXTURES];
00032
00034 struct TextureMetaData
00035 {
00036
00037
00038
00040 FLOAT multU;
00041 FLOAT multV;
00042 bool masked;
00043 bool externalTextures[DUMMY_NUM_EXTERNAL_TEXTURES];
00044 DWORD customPolyFlags;
00045 };
00046
00048 struct CachedTexture
00049 {
00050 TextureMetaData metadata;
00051 ID3D10ShaderResourceView* resourceView;
00052 ID3D10ShaderResourceView* externalTextures[DUMMY_NUM_EXTERNAL_TEXTURES];
00053 };
00054
00055
00056 private:
00060 struct
00061 {
00062 DWORD64 boundTextureID[DUMMY_NUM_TEXTURE_PASSES];
00063 } texturePasses;
00064
00065
00066 stdext::hash_map <unsigned __int64, CachedTexture> textureCache;
00069 ID3D10Device *device;
00070
00071 public:
00074
00075 TextureCache(ID3D10Device *device);
00076 ID3D10Texture2D *createTexture(const D3D10_TEXTURE2D_DESC &desc, const D3D10_SUBRESOURCE_DATA &data) const;
00077 void updateMip(DWORD64 id,int mipNum, const D3D10_SUBRESOURCE_DATA &data) const;
00078 bool loadFileTexture(wchar_t* fileName, ID3D10Texture2D **tex, D3DX10_IMAGE_LOAD_INFO *loadInfo) const;
00079 void cacheTexture(DWORD64 id,const TextureMetaData &metadata, ID3D10Texture2D *tex,int extraIndex=-1);
00080 bool textureIsCached(DWORD64 id) const;
00081 const TextureMetaData &getTextureMetaData(DWORD64 id) const;
00082 const TextureMetaData *setTexture(const Shader_Unreal* shader, TexturePass pass,DWORD64 id,int extraIndex=-1);
00083 void deleteTexture(DWORD64 id);
00084 void flush();
00086 };