| 244 | } |
| 245 | |
| 246 | void CRender::LoadBuffers(CStreamReader* base_fs, BOOL _alternative) |
| 247 | { |
| 248 | R_ASSERT(base_fs, "Could not load geometry. File not found."); |
| 249 | |
| 250 | xr_vector<VertexDeclarator>& _DC = _alternative ? xDC : nDC; |
| 251 | xr_vector<ID3DVertexBuffer*>& _VB = _alternative ? xVB : nVB; |
| 252 | xr_vector<ID3DIndexBuffer*>& _IB = _alternative ? xIB : nIB; |
| 253 | |
| 254 | // Vertex buffers |
| 255 | { |
| 256 | // Use DX9-style declarators |
| 257 | CStreamReader* fs = base_fs->open_chunk(fsL_VB); |
| 258 | R_ASSERT(fs, "Could not load geometry. File 'level.geom?' corrupted."); |
| 259 | const u32 count = fs->r_u32(); |
| 260 | _DC.resize(count); |
| 261 | _VB.resize(count); |
| 262 | |
| 263 | // decl |
| 264 | const u32 buffer_size = (MAXD3DDECLLENGTH + 1) * sizeof(D3DVERTEXELEMENT9); |
| 265 | auto* dcl = (D3DVERTEXELEMENT9*)_alloca(buffer_size); |
| 266 | |
| 267 | for (u32 i = 0; i < count; i++) |
| 268 | { |
| 269 | fs->r(dcl, buffer_size); |
| 270 | fs->advance(-(int)buffer_size); |
| 271 | |
| 272 | const u32 dcl_len = FVF::GetDeclLength(dcl) + 1; |
| 273 | _DC[i].resize(dcl_len); |
| 274 | fs->r(_DC[i].begin(), dcl_len * sizeof(D3DVERTEXELEMENT9)); |
| 275 | |
| 276 | // count, size |
| 277 | const u32 vCount = fs->r_u32(); |
| 278 | const u32 vSize = FVF::ComputeVertexSize(dcl, 0); |
| 279 | Msg("* [Loading VB] %d verts, %d Kb", vCount, (vCount * vSize) / 1024); |
| 280 | |
| 281 | // TODO: DX10: Check fragmentation. |
| 282 | // Check if buffer is less then 2048 kb |
| 283 | BYTE* pData = xr_alloc<BYTE>(vCount * vSize); |
| 284 | fs->r(pData, vCount * vSize); |
| 285 | R_CHK(dx10BufferUtils::CreateVertexBuffer(&_VB[i], pData, vCount * vSize)); |
| 286 | DXUT_SetDebugName(_VB[i], "fsL_VB"); |
| 287 | xr_free(pData); |
| 288 | |
| 289 | // fs->advance (vCount*vSize); |
| 290 | } |
| 291 | fs->close(); |
| 292 | } |
| 293 | |
| 294 | // Index buffers |
| 295 | { |
| 296 | CStreamReader* fs = base_fs->open_chunk(fsL_IB); |
| 297 | const u32 count = fs->r_u32(); |
| 298 | _IB.resize(count); |
| 299 | for (u32 i = 0; i < count; i++) |
| 300 | { |
| 301 | const u32 iCount = fs->r_u32(); |
| 302 | Msg("* [Loading IB] %d indices, %d Kb", iCount, (iCount * 2) / 1024); |
| 303 |
nothing calls this directly
no test coverage detected