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:
parent
2d22ace9f1
commit
32259119c3
@ -197,11 +197,13 @@
|
|||||||
<ClInclude Include="Direct3d\Direct3d.h" />
|
<ClInclude Include="Direct3d\Direct3d.h" />
|
||||||
<ClInclude Include="Direct3d\Direct3dDevice.h" />
|
<ClInclude Include="Direct3d\Direct3dDevice.h" />
|
||||||
<ClInclude Include="Direct3d\Direct3dTexture.h" />
|
<ClInclude Include="Direct3d\Direct3dTexture.h" />
|
||||||
|
<ClInclude Include="Direct3d\Direct3dVertexBuffer.h" />
|
||||||
<ClInclude Include="Direct3d\Direct3dViewport.h" />
|
<ClInclude Include="Direct3d\Direct3dViewport.h" />
|
||||||
<ClInclude Include="Direct3d\Hooks.h" />
|
<ClInclude Include="Direct3d\Hooks.h" />
|
||||||
<ClInclude Include="Direct3d\Types.h" />
|
<ClInclude Include="Direct3d\Types.h" />
|
||||||
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
|
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
|
||||||
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h" />
|
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h" />
|
||||||
|
<ClInclude Include="Direct3d\Visitors\Direct3dVertexBufferVtblVisitor.h" />
|
||||||
<ClInclude Include="Direct3d\Visitors\Direct3dViewportVtblVisitor.h" />
|
<ClInclude Include="Direct3d\Visitors\Direct3dViewportVtblVisitor.h" />
|
||||||
<ClInclude Include="Direct3d\Visitors\Direct3dVtblVisitor.h" />
|
<ClInclude Include="Direct3d\Visitors\Direct3dVtblVisitor.h" />
|
||||||
<ClInclude Include="Dll\Procs.h" />
|
<ClInclude Include="Dll\Procs.h" />
|
||||||
@ -247,6 +249,7 @@
|
|||||||
<ClCompile Include="Direct3d\Direct3d.cpp" />
|
<ClCompile Include="Direct3d\Direct3d.cpp" />
|
||||||
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
|
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
|
||||||
<ClCompile Include="Direct3d\Direct3dTexture.cpp" />
|
<ClCompile Include="Direct3d\Direct3dTexture.cpp" />
|
||||||
|
<ClCompile Include="Direct3d\Direct3dVertexBuffer.cpp" />
|
||||||
<ClCompile Include="Direct3d\Direct3dViewport.cpp" />
|
<ClCompile Include="Direct3d\Direct3dViewport.cpp" />
|
||||||
<ClCompile Include="Direct3d\Hooks.cpp" />
|
<ClCompile Include="Direct3d\Hooks.cpp" />
|
||||||
<ClCompile Include="Dll\Procs.cpp" />
|
<ClCompile Include="Dll\Procs.cpp" />
|
||||||
|
@ -270,6 +270,12 @@
|
|||||||
<ClInclude Include="Direct3d\Direct3dTexture.h">
|
<ClInclude Include="Direct3d\Direct3dTexture.h">
|
||||||
<Filter>Header Files\Direct3d</Filter>
|
<Filter>Header Files\Direct3d</Filter>
|
||||||
</ClInclude>
|
</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>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Gdi\Gdi.cpp">
|
<ClCompile Include="Gdi\Gdi.cpp">
|
||||||
@ -407,6 +413,9 @@
|
|||||||
<ClCompile Include="Direct3d\Direct3dTexture.cpp">
|
<ClCompile Include="Direct3d\Direct3dTexture.cpp">
|
||||||
<Filter>Source Files\Direct3d</Filter>
|
<Filter>Source Files\Direct3d</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Direct3d\Direct3dVertexBuffer.cpp">
|
||||||
|
<Filter>Source Files\Direct3d</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Dll\DDrawCompat.def">
|
<None Include="Dll\DDrawCompat.def">
|
||||||
|
13
DDrawCompat/Direct3d/Direct3dVertexBuffer.cpp
Normal file
13
DDrawCompat/Direct3d/Direct3dVertexBuffer.cpp
Normal 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>;
|
||||||
|
}
|
17
DDrawCompat/Direct3d/Direct3dVertexBuffer.h
Normal file
17
DDrawCompat/Direct3d/Direct3dVertexBuffer.h
Normal 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>);
|
@ -1,5 +1,7 @@
|
|||||||
#define CINTERFACE
|
#define CINTERFACE
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
|
|
||||||
#include "Common/CompatPtr.h"
|
#include "Common/CompatPtr.h"
|
||||||
@ -9,6 +11,7 @@
|
|||||||
#include "Direct3d/Direct3d.h"
|
#include "Direct3d/Direct3d.h"
|
||||||
#include "Direct3d/Direct3dDevice.h"
|
#include "Direct3d/Direct3dDevice.h"
|
||||||
#include "Direct3d/Direct3dTexture.h"
|
#include "Direct3d/Direct3dTexture.h"
|
||||||
|
#include "Direct3d/Direct3dVertexBuffer.h"
|
||||||
#include "Direct3d/Direct3dViewport.h"
|
#include "Direct3d/Direct3dViewport.h"
|
||||||
#include "Direct3d/Hooks.h"
|
#include "Direct3d/Hooks.h"
|
||||||
#include "Dll/Procs.h"
|
#include "Dll/Procs.h"
|
||||||
@ -18,8 +21,14 @@ namespace
|
|||||||
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
|
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
|
||||||
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
|
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
|
||||||
void hookDirect3dTexture(CompatRef<IDirectDraw> dd);
|
void hookDirect3dTexture(CompatRef<IDirectDraw> dd);
|
||||||
|
void hookDirect3dVertexBuffer(CompatRef<IDirect3D3> d3d);
|
||||||
|
void hookDirect3dVertexBuffer7(CompatRef<IDirect3D7> d3d);
|
||||||
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d);
|
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d);
|
||||||
|
|
||||||
|
template <typename TDirect3dVertexBuffer>
|
||||||
|
void hookVertexBuffer(
|
||||||
|
const std::function<HRESULT(D3DVERTEXBUFFERDESC&, TDirect3dVertexBuffer*&)> createVertexBuffer);
|
||||||
|
|
||||||
template <typename Interface>
|
template <typename Interface>
|
||||||
void hookVtable(const CompatPtr<Interface>& intf);
|
void hookVtable(const CompatPtr<Interface>& intf);
|
||||||
|
|
||||||
@ -64,7 +73,7 @@ namespace
|
|||||||
desc.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
|
desc.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
|
||||||
desc.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
|
desc.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
|
||||||
desc.ddpfPixelFormat.dwBBitMask = 0x000000FF;
|
desc.ddpfPixelFormat.dwBBitMask = 0x000000FF;
|
||||||
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE;
|
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY;
|
||||||
|
|
||||||
CompatPtr<IDirectDrawSurface7> renderTarget;
|
CompatPtr<IDirectDrawSurface7> renderTarget;
|
||||||
HRESULT result = dd->CreateSurface(&dd, &desc, &renderTarget.getRef(), nullptr);
|
HRESULT result = dd->CreateSurface(&dd, &desc, &renderTarget.getRef(), nullptr);
|
||||||
@ -85,6 +94,7 @@ namespace
|
|||||||
hookVtable<IDirect3D3>(d3d);
|
hookVtable<IDirect3D3>(d3d);
|
||||||
hookDirect3dDevice(*d3d, renderTarget);
|
hookDirect3dDevice(*d3d, renderTarget);
|
||||||
hookDirect3dTexture(dd);
|
hookDirect3dTexture(dd);
|
||||||
|
hookDirect3dVertexBuffer(*d3d);
|
||||||
hookDirect3dViewport(*d3d);
|
hookDirect3dViewport(*d3d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,6 +106,7 @@ namespace
|
|||||||
{
|
{
|
||||||
hookVtable<IDirect3D7>(d3d);
|
hookVtable<IDirect3D7>(d3d);
|
||||||
hookDirect3dDevice7(*d3d, renderTarget);
|
hookDirect3dDevice7(*d3d, renderTarget);
|
||||||
|
hookDirect3dVertexBuffer7(*d3d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,6 +149,20 @@ namespace
|
|||||||
hookVtable<IDirect3DTexture2>(texture);
|
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)
|
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d)
|
||||||
{
|
{
|
||||||
CompatPtr<IDirect3DViewport3> viewport;
|
CompatPtr<IDirect3DViewport3> viewport;
|
||||||
@ -153,6 +178,26 @@ namespace
|
|||||||
hookVtable<IDirect3DViewport3>(viewport);
|
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>
|
template <typename Interface>
|
||||||
void hookVtable(const CompatPtr<Interface>& intf)
|
void hookVtable(const CompatPtr<Interface>& intf)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user