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::AutoPolyLinePoint(Vector3 previous, Vector3 current, DWORD colorCurrent, Vector3 next) { // make sure we have enough space: if(c_VertexBufferVertexCount < m_VertexBufferVertexCount+2) AutoPolyLineFlush(); bool isFirst = 0 == m_VertexBufferVertexCount; if(!m_LockedVertexBuffer) { bool locked = LockVertexBuffer(); if(!locked) return; } Vertex * curBuf = &(m_LockedVertexBuffer[m_VertexBufferVertexCount]); if(isFirst && !m_PolyLineStarted) { BuildPolyLinePoint(m_OldPreviousPolyLinePoint, previous, m_OldCurrentColor, current, curBuf); curBuf += 2; m_VertexBufferVertexCount += 2; } BuildPolyLinePoint(previous, current, colorCurrent, next, curBuf); m_VertexBufferVertexCount += 2; m_PolyLineStarted = false; m_OldCurrentColor = colorCurrent; m_OldPreviousPolyLinePoint = previous; }
void CCampathDrawer::AutoSingleLine(Vector3 from, DWORD colorFrom, Vector3 to, DWORD colorTo) { // make sure we have space for another line: if(c_VertexBufferVertexCount < m_VertexBufferVertexCount+4) AutoSingleLineFlush(); if(!m_LockedVertexBuffer) { bool locked = LockVertexBuffer(); if(!locked) return; } Vertex * curBuf = &(m_LockedVertexBuffer[m_VertexBufferVertexCount]); BuildSingleLine(from, to, curBuf); BuildSingleLine(colorFrom, colorTo, curBuf); m_VertexBufferVertexCount += 4; }
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(); }