D3D9Wrapper::IDirect3DVertexBuffer9::IDirect3DVertexBuffer9( D3D9Base::LPDIRECT3DVERTEXBUFFER9 pVertexBuffer ) : IDirect3DResource9((D3D9Base::LPDIRECT3DRESOURCE9) pVertexBuffer) { m_pVertexBuffer = pVertexBuffer; Locked = false; } D3D9Wrapper::IDirect3DVertexBuffer9* D3D9Wrapper::IDirect3DVertexBuffer9::GetVertexBuffer(D3D9Base::LPDIRECT3DVERTEXBUFFER9 pVertexBuffer) { return new D3D9Wrapper::IDirect3DVertexBuffer9(pVertexBuffer); } STDMETHODIMP D3D9Wrapper::IDirect3DVertexBuffer9::Lock(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) { if(IgnoringBufferLocks || g_Globals.VideoCaptureMode) { return m_pVertexBuffer->Lock(OffsetToLock, SizeToLock, ppbData, Flags); } if(Locked) { g_Globals.ErrorFile() << "Double lock\n"; } HRESULT hr = m_pVertexBuffer->Lock(OffsetToLock, SizeToLock, &m_LockData.pVideoBuffer, Flags); if(FAILED(hr)) { return hr; } Locked = true; m_LockData.Handle = m_pVertexBuffer; m_LockData.Flags = Flags; m_LockData.OffsetToLock = OffsetToLock; m_LockData.SizeToLock = SizeToLock; m_LockData.pRAMBuffer = NULL; m_LockData.Create = false; D3DVERTEXBUFFER_DESC Desc; m_pVertexBuffer->GetDesc(&Desc); if(m_LockData.SizeToLock == 0 && m_LockData.OffsetToLock == 0) { m_LockData.SizeToLock = Desc.Size; } ReportLockVertexBuffer(m_LockData, Desc); if(m_LockData.pRAMBuffer == NULL) { g_Globals.ErrorFile() << "Lock, m_LockData.pRAMBuffer == NULL\n"; *ppbData = m_LockData.pVideoBuffer; } else { *ppbData = m_LockData.pRAMBuffer; } return hr; } STDMETHODIMP D3D9Wrapper::IDirect3DVertexBuffer9::Unlock(THIS) { if(!IgnoringBufferLocks && !g_Globals.VideoCaptureMode) { Locked = false; if(m_LockData.pRAMBuffer == NULL) { g_Globals.ErrorFile() << "Unlock, m_LockData.pRAMBuffer == NULL\n"; } else { memcpy(m_LockData.pVideoBuffer, m_LockData.pRAMBuffer, m_LockData.SizeToLock); } } return m_pVertexBuffer->Unlock(); } STDMETHODIMP D3D9Wrapper::IDirect3DVertexBuffer9::GetDesc(THIS_ D3DVERTEXBUFFER_DESC *pDesc) { return m_pVertexBuffer->GetDesc(pDesc); }