absence_thelab

annotate src/3deng/textureman.cpp @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
rev   line source
nuclear@0 1 #include "textureman.h"
nuclear@0 2 #include "3dengine.h"
nuclear@0 3 #include "d3dx8.h"
nuclear@0 4
nuclear@0 5 using std::string;
nuclear@0 6
nuclear@0 7 template <class KeyType>
nuclear@0 8 unsigned int Hash(const KeyType &key, unsigned long size) {
nuclear@0 9 string str = (string)key;
nuclear@0 10 return ((unsigned int)str[0] + (unsigned int)str[1] + (unsigned int)str[2]) % size;
nuclear@0 11 }
nuclear@0 12
nuclear@0 13 TextureManager::TextureManager(GraphicsContext *gc) {
nuclear@0 14 this->gc = gc;
nuclear@0 15 notfilecount = 0;
nuclear@0 16
nuclear@0 17 textures.SetHashFunction(Hash);
nuclear@0 18
nuclear@0 19 CreateStockTextures();
nuclear@0 20 }
nuclear@0 21
nuclear@0 22 TextureManager::~TextureManager() {}
nuclear@0 23
nuclear@0 24 #define STOCKSIZE 256
nuclear@0 25 #include <cassert>
nuclear@0 26
nuclear@0 27 void TextureManager::CreateStockTextures() {
nuclear@0 28 Surface *surf;
nuclear@0 29
nuclear@0 30 // ----- 1/d^2 blob texture -----
nuclear@0 31 Texture *tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true);
nuclear@0 32 tmp->GetSurfaceLevel(0, &surf);
nuclear@0 33
nuclear@0 34 dword *ptr, offs;
nuclear@0 35 D3DLOCKED_RECT d3dlock;
nuclear@0 36 assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK);
nuclear@0 37 ptr = (dword*)d3dlock.pBits;
nuclear@0 38 offs = (d3dlock.Pitch >> 2) - STOCKSIZE;
nuclear@0 39
nuclear@0 40 Vector2 Center((float)(STOCKSIZE>>1), (float)(STOCKSIZE>>1));
nuclear@0 41
nuclear@0 42 for(int y=0; y<STOCKSIZE; y++) {
nuclear@0 43 for(int x=0; x<STOCKSIZE; x++) {
nuclear@0 44 Vector2 pos((float)x, (float)y);
nuclear@0 45 float p = 100.0f / (pos - Center).LengthSq();
nuclear@0 46
nuclear@0 47 Color col(p, p, p, p);
nuclear@0 48 *ptr++ = col.GetPacked32();
nuclear@0 49 }
nuclear@0 50 ptr += offs;
nuclear@0 51 }
nuclear@0 52
nuclear@0 53 surf->UnlockRect();
nuclear@0 54
nuclear@0 55 Texture *Blob = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true);
nuclear@0 56 gc->D3DDevice->UpdateTexture(tmp, Blob);
nuclear@0 57
nuclear@0 58 UpdateMipmapChain(Blob);
nuclear@0 59
nuclear@0 60 AddTexture(Blob, "STOCKTEX_BLOB");
nuclear@0 61 tmp->Release();
nuclear@0 62
nuclear@0 63 // ----- chessboard texture -----
nuclear@0 64
nuclear@0 65 tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true);
nuclear@0 66 tmp->GetSurfaceLevel(0, &surf);
nuclear@0 67
nuclear@0 68 assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK);
nuclear@0 69 ptr = (dword*)d3dlock.pBits;
nuclear@0 70 offs = (d3dlock.Pitch >> 2) - STOCKSIZE;
nuclear@0 71
nuclear@0 72 for(int y=0; y<STOCKSIZE; y++) {
nuclear@0 73 for(int x=0; x<STOCKSIZE; x++) {
nuclear@0 74 int dx = x - (STOCKSIZE>>1);
nuclear@0 75 int dy = y - (STOCKSIZE>>1);
nuclear@0 76 if((dx > 0 && dy > 0) || (dx < 0 && dy < 0)) {
nuclear@0 77 *ptr++ = 0xffffffff;
nuclear@0 78 } else {
nuclear@0 79 *ptr++ = 0xff000000;
nuclear@0 80 }
nuclear@0 81 }
nuclear@0 82 ptr += offs;
nuclear@0 83 }
nuclear@0 84
nuclear@0 85 surf->UnlockRect();
nuclear@0 86
nuclear@0 87 Texture *ChessBoard = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true);
nuclear@0 88 gc->D3DDevice->UpdateTexture(tmp, ChessBoard);
nuclear@0 89
nuclear@0 90 UpdateMipmapChain(ChessBoard);
nuclear@0 91
nuclear@0 92 AddTexture(ChessBoard, "STOCKTEX_CHESSBOARD");
nuclear@0 93 tmp->Release();
nuclear@0 94
nuclear@0 95 // ----- grid texture -----
nuclear@0 96
nuclear@0 97 tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true);
nuclear@0 98 tmp->GetSurfaceLevel(0, &surf);
nuclear@0 99
nuclear@0 100 assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK);
nuclear@0 101 ptr = (dword*)d3dlock.pBits;
nuclear@0 102 offs = (d3dlock.Pitch >> 2) - STOCKSIZE;
nuclear@0 103
nuclear@0 104 for(int y=0; y<STOCKSIZE; y++) {
nuclear@0 105 for(int x=0; x<STOCKSIZE; x++) {
nuclear@0 106 if(x == 0 || x == STOCKSIZE-1 || y == 0 || y == STOCKSIZE-1) {
nuclear@0 107 *ptr++ = 0xffffffff;
nuclear@0 108 } else {
nuclear@0 109 *ptr++ = 0xff000000;
nuclear@0 110 }
nuclear@0 111 }
nuclear@0 112 ptr += offs;
nuclear@0 113 }
nuclear@0 114
nuclear@0 115 surf->UnlockRect();
nuclear@0 116
nuclear@0 117 Texture *Grid = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true);
nuclear@0 118 gc->D3DDevice->UpdateTexture(tmp, Grid);
nuclear@0 119
nuclear@0 120 UpdateMipmapChain(Grid);
nuclear@0 121
nuclear@0 122 AddTexture(Grid, "STOCKTEX_GRID");
nuclear@0 123 tmp->Release();
nuclear@0 124
nuclear@0 125
nuclear@0 126 // ---------- biased linear falloff ---------
nuclear@0 127 tmp = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true, true);
nuclear@0 128 tmp->GetSurfaceLevel(0, &surf);
nuclear@0 129
nuclear@0 130 assert(surf->LockRect(&d3dlock, 0, 0) == D3D_OK);
nuclear@0 131 ptr = (dword*)d3dlock.pBits;
nuclear@0 132 offs = (d3dlock.Pitch >> 2) - STOCKSIZE;
nuclear@0 133
nuclear@0 134 Center = Vector2((float)(STOCKSIZE>>1), (float)(STOCKSIZE>>1));
nuclear@0 135
nuclear@0 136 for(int y=0; y<STOCKSIZE; y++) {
nuclear@0 137 for(int x=0; x<STOCKSIZE; x++) {
nuclear@0 138 Vector2 pos((float)x, (float)y);
nuclear@0 139 float dist = (pos - Center).Length();
nuclear@0 140 // f[x] / ((1/b - 2) * (1 - f[x]) + 1)
nuclear@0 141 float b = 0.3f;
nuclear@0 142 float p = dist ? ((STOCKSIZE - dist) / STOCKSIZE) / ((1/b-2) * (1-((STOCKSIZE - dist) / STOCKSIZE)) + 1) : 1.0f;
nuclear@0 143
nuclear@0 144 Color col(p, p, p, p);
nuclear@0 145 *ptr++ = col.GetPacked32();
nuclear@0 146 }
nuclear@0 147 ptr += offs;
nuclear@0 148 }
nuclear@0 149
nuclear@0 150 surf->UnlockRect();
nuclear@0 151
nuclear@0 152 Texture *Blofm = CreateTexture(STOCKSIZE, STOCKSIZE, 0, true);
nuclear@0 153 gc->D3DDevice->UpdateTexture(tmp, Blofm);
nuclear@0 154
nuclear@0 155 UpdateMipmapChain(Blofm);
nuclear@0 156
nuclear@0 157 AddTexture(Blofm, "STOCKTEX_BLOFM");
nuclear@0 158 tmp->Release();
nuclear@0 159 }
nuclear@0 160
nuclear@0 161 void TextureManager::SetGraphicsContext(GraphicsContext *gc) {
nuclear@0 162 this->gc = gc;
nuclear@0 163 }
nuclear@0 164
nuclear@0 165 Texture *TextureManager::LoadTexture(const char *fname) {
nuclear@0 166 if(!gc || !fname) return 0;
nuclear@0 167
nuclear@0 168 Texture *tex;
nuclear@0 169
nuclear@0 170 Pair<string, Texture*> *p;
nuclear@0 171 if(!(p = textures.Find(fname))) {
nuclear@0 172 if(D3DXCreateTextureFromFile(gc->D3DDevice, fname, &tex) != D3D_OK) return 0;
nuclear@0 173 textures.Insert(fname, tex);
nuclear@0 174 } else {
nuclear@0 175 tex = p->val;
nuclear@0 176 }
nuclear@0 177
nuclear@0 178 return tex;
nuclear@0 179 }
nuclear@0 180
nuclear@0 181 Texture *TextureManager::CreateTexture(dword x, dword y, dword usage, bool mipmaps, bool local) {
nuclear@0 182 if(!gc) return 0;
nuclear@0 183 Texture *tex;
nuclear@0 184 D3DPOOL pool = local ? D3DPOOL_SYSTEMMEM : D3DPOOL_DEFAULT;
nuclear@0 185 D3DFORMAT fmt = usage == UsageDepthStencil ? gc->ZFormat : D3DFMT_A8R8G8B8;
nuclear@0 186 if(usage == UsageDepthStencil) pool = D3DPOOL_MANAGED;
nuclear@0 187 if(gc->D3DDevice->CreateTexture(x, y, (int)(!mipmaps), usage, fmt, pool, &tex) != D3D_OK) return 0;
nuclear@0 188 return tex;
nuclear@0 189 }
nuclear@0 190
nuclear@0 191 Texture *TextureManager::AddTexture(Texture *tex, const char *name) {
nuclear@0 192 string fname = name ? name : "not_a_file_" + notfilecount;
nuclear@0 193 textures.Insert(fname, tex);
nuclear@0 194 return tex;
nuclear@0 195 }
nuclear@0 196
nuclear@0 197 Texture *TextureManager::AddTexture(const char *fname) {
nuclear@0 198 return LoadTexture(fname);
nuclear@0 199 }