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 } |