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\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" />
|
||||
|
@ -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">
|
||||
|
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
|
||||
|
||||
#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)
|
||||
{
|
||||
|
@ -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