MCPcopy Create free account
hub / github.com/OGSR/OGSR-Engine / LoadBuffers

Method LoadBuffers

ogsr_engine/Layers/xrRenderPC_R4/r4_loader.cpp:246–316  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

244}
245
246void 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

Callers

nothing calls this directly

Calls 11

MsgFunction · 0.85
CreateVertexBufferFunction · 0.85
xr_freeFunction · 0.85
CreateIndexBufferFunction · 0.85
open_chunkMethod · 0.45
r_u32Method · 0.45
resizeMethod · 0.45
rMethod · 0.45
advanceMethod · 0.45
beginMethod · 0.45
closeMethod · 0.45

Tested by

no test coverage detected