nuclear@0: #include "textureman.h" nuclear@0: #include "3dengine.h" nuclear@0: #include "d3dx8.h" nuclear@0: nuclear@0: using std::string; nuclear@0: nuclear@0: template nuclear@0: unsigned int Hash(const KeyType &key, unsigned long size) { nuclear@0: string str = (string)key; nuclear@0: return ((unsigned int)str[0] + (unsigned int)str[1] + (unsigned int)str[2]) % size; nuclear@0: } nuclear@0: nuclear@0: TextureManager::TextureManager(GraphicsContext *gc) { nuclear@0: this->gc = gc; nuclear@0: notfilecount = 0; nuclear@0: nuclear@0: textures.SetHashFunction(Hash); nuclear@0: nuclear@0: CreateStockTextures(); nuclear@0: } nuclear@0: nuclear@0: TextureManager::~TextureManager() {} nuclear@0: nuclear@0: #define STOCKSIZE 256 nuclear@0: #include nuclear@0: nuclear@0: void TextureManager::CreateStockTextures() { nuclear@0: Surface *surf; nuclear@0: nuclear@0: // ----- 1/d^2 blob texture ----- nuclear@0: Texture *tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true); nuclear@0: tmp->GetSurfaceLevel(0, &surf); nuclear@0: nuclear@0: dword *ptr, offs; nuclear@0: D3DLOCKED_RECT d3dlock; nuclear@0: assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK); nuclear@0: ptr = (dword*)d3dlock.pBits; nuclear@0: offs = (d3dlock.Pitch >> 2) - STOCKSIZE; nuclear@0: nuclear@0: Vector2 Center((float)(STOCKSIZE>>1), (float)(STOCKSIZE>>1)); nuclear@0: nuclear@0: for(int y=0; yUnlockRect(); nuclear@0: nuclear@0: Texture *Blob = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true); nuclear@0: gc->D3DDevice->UpdateTexture(tmp, Blob); nuclear@0: nuclear@0: UpdateMipmapChain(Blob); nuclear@0: nuclear@0: AddTexture(Blob, "STOCKTEX_BLOB"); nuclear@0: tmp->Release(); nuclear@0: nuclear@0: // ----- chessboard texture ----- nuclear@0: nuclear@0: tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true); nuclear@0: tmp->GetSurfaceLevel(0, &surf); nuclear@0: nuclear@0: assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK); nuclear@0: ptr = (dword*)d3dlock.pBits; nuclear@0: offs = (d3dlock.Pitch >> 2) - STOCKSIZE; nuclear@0: nuclear@0: for(int y=0; y>1); nuclear@0: int dy = y - (STOCKSIZE>>1); nuclear@0: if((dx > 0 && dy > 0) || (dx < 0 && dy < 0)) { nuclear@0: *ptr++ = 0xffffffff; nuclear@0: } else { nuclear@0: *ptr++ = 0xff000000; nuclear@0: } nuclear@0: } nuclear@0: ptr += offs; nuclear@0: } nuclear@0: nuclear@0: surf->UnlockRect(); nuclear@0: nuclear@0: Texture *ChessBoard = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true); nuclear@0: gc->D3DDevice->UpdateTexture(tmp, ChessBoard); nuclear@0: nuclear@0: UpdateMipmapChain(ChessBoard); nuclear@0: nuclear@0: AddTexture(ChessBoard, "STOCKTEX_CHESSBOARD"); nuclear@0: tmp->Release(); nuclear@0: nuclear@0: // ----- grid texture ----- nuclear@0: nuclear@0: tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true); nuclear@0: tmp->GetSurfaceLevel(0, &surf); nuclear@0: nuclear@0: assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK); nuclear@0: ptr = (dword*)d3dlock.pBits; nuclear@0: offs = (d3dlock.Pitch >> 2) - STOCKSIZE; nuclear@0: nuclear@0: for(int y=0; yUnlockRect(); nuclear@0: nuclear@0: Texture *Grid = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true); nuclear@0: gc->D3DDevice->UpdateTexture(tmp, Grid); nuclear@0: nuclear@0: UpdateMipmapChain(Grid); nuclear@0: nuclear@0: AddTexture(Grid, "STOCKTEX_GRID"); nuclear@0: tmp->Release(); nuclear@0: nuclear@0: nuclear@0: // ---------- biased linear falloff --------- nuclear@0: tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true); nuclear@0: tmp->GetSurfaceLevel(0, &surf); nuclear@0: nuclear@0: assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK); nuclear@0: ptr = (dword*)d3dlock.pBits; nuclear@0: offs = (d3dlock.Pitch >> 2) - STOCKSIZE; nuclear@0: nuclear@0: Center = Vector2((float)(STOCKSIZE>>1), (float)(STOCKSIZE>>1)); nuclear@0: nuclear@0: for(int y=0; yUnlockRect(); nuclear@0: nuclear@0: Texture *Blofm = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true); nuclear@0: gc->D3DDevice->UpdateTexture(tmp, Blofm); nuclear@0: nuclear@0: UpdateMipmapChain(Blofm); nuclear@0: nuclear@0: AddTexture(Blofm, "STOCKTEX_BLOFM"); nuclear@0: tmp->Release(); nuclear@0: } nuclear@0: nuclear@0: void TextureManager::SetGraphicsContext(GraphicsContext *gc) { nuclear@0: this->gc = gc; nuclear@0: } nuclear@0: nuclear@0: Texture *TextureManager::LoadTexture(const char *fname) { nuclear@0: if(!gc || !fname) return 0; nuclear@0: nuclear@0: Texture *tex; nuclear@0: nuclear@0: Pair *p; nuclear@0: if(!(p = textures.Find(fname))) { nuclear@0: if(D3DXCreateTextureFromFile(gc->D3DDevice, fname, &tex) != D3D_OK) return 0; nuclear@0: textures.Insert(fname, tex); nuclear@0: } else { nuclear@0: tex = p->val; nuclear@0: } nuclear@0: nuclear@0: return tex; nuclear@0: } nuclear@0: nuclear@0: Texture *TextureManager::CreateTexture(dword x, dword y, dword usage, bool mipmaps, bool local) { nuclear@0: if(!gc) return 0; nuclear@0: Texture *tex; nuclear@0: D3DPOOL pool = local ? D3DPOOL_SYSTEMMEM : D3DPOOL_DEFAULT; nuclear@0: D3DFORMAT fmt = usage == UsageDepthStencil ? gc->ZFormat : D3DFMT_A8R8G8B8; nuclear@0: if(usage == UsageDepthStencil) pool = D3DPOOL_MANAGED; nuclear@0: if(gc->D3DDevice->CreateTexture(x, y, (int)(!mipmaps), usage, fmt, pool, &tex) != D3D_OK) return 0; nuclear@0: return tex; nuclear@0: } nuclear@0: nuclear@0: Texture *TextureManager::AddTexture(Texture *tex, const char *name) { nuclear@0: string fname = name ? name : "not_a_file_" + notfilecount; nuclear@0: textures.Insert(fname, tex); nuclear@0: return tex; nuclear@0: } nuclear@0: nuclear@0: Texture *TextureManager::AddTexture(const char *fname) { nuclear@0: return LoadTexture(fname); nuclear@0: }