FD3D9VertexBufferPtr FD3D9DynamicDrv::CreateVertexBuffer(UINT Size, void* ResourceData, UBOOL bIsDynamic) { check(Size > 0); const DWORD Usage = bIsDynamic ? (D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY) : 0; const D3DPOOL Pool = bIsDynamic ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED; IDirect3DVertexBuffer9* D3DVertexBuffer; VERIFYD3DRESULT(_Direct3DDevice->CreateVertexBuffer( Size, Usage, 0, Pool, (IDirect3DVertexBuffer9**)&D3DVertexBuffer, NULL)); FD3D9VertexBuffer* VertexBuffer = new FD3D9VertexBuffer(D3DVertexBuffer); if( ResourceData ) { void* Buffer = LockVertexBuffer(VertexBuffer, 0, Size, FALSE); check(Buffer); appMemcpy(Buffer, ResourceData, Size); UnlockVertexBuffer(VertexBuffer); } return VertexBuffer; }
void CCampathDrawer::AutoPolyLineFlush() { if(!m_LockedVertexBuffer) return; UnlockVertexBuffer(); m_Device->SetStreamSource(0, m_VertexBuffer, 0, sizeof(Vertex)); UINT startVertex = 0; UINT primitiveCount = m_VertexBufferVertexCount -2; // Draw lines: m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, startVertex, primitiveCount); startVertex += 2*(primitiveCount+1); m_VertexBufferVertexCount = 0; }
void CCampathDrawer::AutoSingleLineFlush() { if(!m_LockedVertexBuffer) return; UnlockVertexBuffer(); m_Device->SetStreamSource(0, m_VertexBuffer, 0, sizeof(Vertex)); UINT startVertex = 0; UINT lineCount = m_VertexBufferVertexCount / 4; for(UINT i=0; i<lineCount; ++i) { // Draw line: m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, startVertex, 2); startVertex += 4; } m_VertexBufferVertexCount = 0; }
bool CCampathDrawer::LockVertexBuffer() { if(m_VertexBuffer) { if(!SUCCEEDED(m_VertexBuffer->Lock(0, c_VertexBufferVertexCount * sizeof(Vertex), (void **)&m_LockedVertexBuffer, 0))) { m_LockedVertexBuffer = 0; return false; } return true; } UnlockVertexBuffer(); if(!SUCCEEDED(m_Device->CreateVertexBuffer( c_VertexBufferVertexCount * sizeof(Vertex), D3DUSAGE_WRITEONLY, CCampathDrawer_VertexFVF, D3DPOOL_DEFAULT, &m_VertexBuffer, NULL ))) { if(m_VertexBuffer) m_VertexBuffer->Release(); m_VertexBuffer = 0; return false; } if(m_VertexBuffer) { if(!SUCCEEDED(m_VertexBuffer->Lock(0, c_VertexBufferVertexCount * sizeof(Vertex), (void **)&m_LockedVertexBuffer, 0))) { m_LockedVertexBuffer = 0; return 0; } return true; } return false; }
void FUE1Model::BuildVertexBuffer( FModelRenderer *renderer ) { if (GetVertexBuffer(renderer)) return; if ( !mDataLoaded ) LoadGeometry(); int vsize = 0; for ( int i=0; i<numGroups; i++ ) vsize += groups[i].numPolys*3; vsize *= numFrames; auto vbuf = renderer->CreateVertexBuffer(false,numFrames==1); SetVertexBuffer(renderer, vbuf); FModelVertex *vptr = vbuf->LockVertexBuffer(vsize); int vidx = 0; for ( int i=0; i<numFrames; i++ ) { for ( int j=0; j<numGroups; j++ ) { for ( int k=0; k<groups[j].numPolys; k++ ) { for ( int l=0; l<3; l++ ) { UE1Vertex V = verts[polys[groups[j].P[k]].V[l]+i*numVerts]; FVector2 C = polys[groups[j].P[k]].C[l]; FModelVertex *vert = &vptr[vidx++]; vert->Set(V.Pos.X,V.Pos.Y,V.Pos.Z,C.X,C.Y); if ( groups[j].type&PT_Curvy ) // use facet normal { vert->SetNormal(polys[groups[j].P[k]].Normals[i].X, polys[groups[j].P[k]].Normals[i].Y, polys[groups[j].P[k]].Normals[i].Z); } else vert->SetNormal(V.Normal.X,V.Normal.Y,V.Normal.Z); } } } } vbuf->UnlockVertexBuffer(); }