1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Hooked the IDirect3DVertexBuffer interfaces

This commit is contained in:
narzoul 2016-10-16 15:07:15 +02:00
parent 2d22ace9f1
commit 32259119c3
6 changed files with 123 additions and 1 deletions

View File

@ -197,11 +197,13 @@
<ClInclude Include="Direct3d\Direct3d.h" />
<ClInclude Include="Direct3d\Direct3dDevice.h" />
<ClInclude Include="Direct3d\Direct3dTexture.h" />
<ClInclude Include="Direct3d\Direct3dVertexBuffer.h" />
<ClInclude Include="Direct3d\Direct3dViewport.h" />
<ClInclude Include="Direct3d\Hooks.h" />
<ClInclude Include="Direct3d\Types.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dVertexBufferVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dViewportVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dVtblVisitor.h" />
<ClInclude Include="Dll\Procs.h" />
@ -247,6 +249,7 @@
<ClCompile Include="Direct3d\Direct3d.cpp" />
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
<ClCompile Include="Direct3d\Direct3dTexture.cpp" />
<ClCompile Include="Direct3d\Direct3dVertexBuffer.cpp" />
<ClCompile Include="Direct3d\Direct3dViewport.cpp" />
<ClCompile Include="Direct3d\Hooks.cpp" />
<ClCompile Include="Dll\Procs.cpp" />

View File

@ -270,6 +270,12 @@
<ClInclude Include="Direct3d\Direct3dTexture.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Visitors\Direct3dVertexBufferVtblVisitor.h">
<Filter>Header Files\Direct3d\Visitors</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Direct3dVertexBuffer.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">
@ -407,6 +413,9 @@
<ClCompile Include="Direct3d\Direct3dTexture.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Direct3dVertexBuffer.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Dll\DDrawCompat.def">

View File

@ -0,0 +1,13 @@
#include "Direct3d/Direct3dVertexBuffer.h"
namespace Direct3d
{
template <typename TDirect3dVertexBuffer>
void Direct3dVertexBuffer<TDirect3dVertexBuffer>::setCompatVtable(
Vtable<TDirect3dVertexBuffer>& /*vtable*/)
{
}
template Direct3dVertexBuffer<IDirect3DVertexBuffer>;
template Direct3dVertexBuffer<IDirect3DVertexBuffer7>;
}

View File

@ -0,0 +1,17 @@
#pragma once
#include "Common/CompatVtable.h"
#include "Direct3d/Visitors/Direct3dVertexBufferVtblVisitor.h"
namespace Direct3d
{
template <typename TDirect3dVertexBuffer>
class Direct3dVertexBuffer : public CompatVtable<Vtable<TDirect3dVertexBuffer>>
{
public:
static void setCompatVtable(Vtable<TDirect3dVertexBuffer>& vtable);
};
}
SET_COMPAT_VTABLE(IDirect3DVertexBufferVtbl, Direct3d::Direct3dVertexBuffer<IDirect3DVertexBuffer>);
SET_COMPAT_VTABLE(IDirect3DVertexBuffer7Vtbl, Direct3d::Direct3dVertexBuffer<IDirect3DVertexBuffer7>);

View File

@ -1,5 +1,7 @@
#define CINTERFACE
#include <functional>
#include <d3d.h>
#include "Common/CompatPtr.h"
@ -9,6 +11,7 @@
#include "Direct3d/Direct3d.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Direct3dTexture.h"
#include "Direct3d/Direct3dVertexBuffer.h"
#include "Direct3d/Direct3dViewport.h"
#include "Direct3d/Hooks.h"
#include "Dll/Procs.h"
@ -18,8 +21,14 @@ namespace
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
void hookDirect3dTexture(CompatRef<IDirectDraw> dd);
void hookDirect3dVertexBuffer(CompatRef<IDirect3D3> d3d);
void hookDirect3dVertexBuffer7(CompatRef<IDirect3D7> d3d);
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d);
template <typename TDirect3dVertexBuffer>
void hookVertexBuffer(
const std::function<HRESULT(D3DVERTEXBUFFERDESC&, TDirect3dVertexBuffer*&)> createVertexBuffer);
template <typename Interface>
void hookVtable(const CompatPtr<Interface>& intf);
@ -64,7 +73,7 @@ namespace
desc.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
desc.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
desc.ddpfPixelFormat.dwBBitMask = 0x000000FF;
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE;
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY;
CompatPtr<IDirectDrawSurface7> renderTarget;
HRESULT result = dd->CreateSurface(&dd, &desc, &renderTarget.getRef(), nullptr);
@ -85,6 +94,7 @@ namespace
hookVtable<IDirect3D3>(d3d);
hookDirect3dDevice(*d3d, renderTarget);
hookDirect3dTexture(dd);
hookDirect3dVertexBuffer(*d3d);
hookDirect3dViewport(*d3d);
}
}
@ -96,6 +106,7 @@ namespace
{
hookVtable<IDirect3D7>(d3d);
hookDirect3dDevice7(*d3d, renderTarget);
hookDirect3dVertexBuffer7(*d3d);
}
}
@ -138,6 +149,20 @@ namespace
hookVtable<IDirect3DTexture2>(texture);
}
void hookDirect3dVertexBuffer(CompatRef<IDirect3D3> d3d)
{
hookVertexBuffer<IDirect3DVertexBuffer>(
[&](D3DVERTEXBUFFERDESC& desc, IDirect3DVertexBuffer*& vb) {
return d3d->CreateVertexBuffer(&d3d, &desc, &vb, 0, nullptr); });
}
void hookDirect3dVertexBuffer7(CompatRef<IDirect3D7> d3d)
{
hookVertexBuffer<IDirect3DVertexBuffer7>(
[&](D3DVERTEXBUFFERDESC& desc, IDirect3DVertexBuffer7*& vb) {
return d3d->CreateVertexBuffer(&d3d, &desc, &vb, 0); });
}
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d)
{
CompatPtr<IDirect3DViewport3> viewport;
@ -153,6 +178,26 @@ namespace
hookVtable<IDirect3DViewport3>(viewport);
}
template <typename TDirect3dVertexBuffer>
void hookVertexBuffer(
const std::function<HRESULT(D3DVERTEXBUFFERDESC&, TDirect3dVertexBuffer*&)> createVertexBuffer)
{
D3DVERTEXBUFFERDESC desc = {};
desc.dwSize = sizeof(desc);
desc.dwCaps = D3DVBCAPS_SYSTEMMEMORY;
desc.dwFVF = D3DFVF_VERTEX;
desc.dwNumVertices = 1;
CompatPtr<TDirect3dVertexBuffer> vertexBuffer = nullptr;
HRESULT result = createVertexBuffer(desc, vertexBuffer.getRef());
if (FAILED(result))
{
Compat::Log() << "Failed to create a vertex buffer for hooking: " << result;
}
hookVtable<TDirect3dVertexBuffer>(vertexBuffer);
}
template <typename Interface>
void hookVtable(const CompatPtr<Interface>& intf)
{

View File

@ -0,0 +1,35 @@
#pragma once
#define CINTERFACE
#include <d3d.h>
#include "Common/VtableVisitor.h"
template <>
struct VtableForEach<IDirect3DVertexBufferVtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(Lock);
DD_VISIT(Unlock);
DD_VISIT(ProcessVertices);
DD_VISIT(GetVertexBufferDesc);
DD_VISIT(Optimize);
}
};
template <>
struct VtableForEach<IDirect3DVertexBuffer7Vtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IDirect3DVertexBufferVtbl>::forEach<Vtable>(visitor);
DD_VISIT(ProcessVerticesStrided);
}
};