diff --git a/DDrawCompat/Common/CompatQueryInterface.h b/DDrawCompat/Common/CompatQueryInterface.h index 629312d..8483241 100644 --- a/DDrawCompat/Common/CompatQueryInterface.h +++ b/DDrawCompat/Common/CompatQueryInterface.h @@ -47,6 +47,8 @@ namespace Compat DEFINE_BASE_INTF(IDirect3D7, IDirectDraw); DEFINE_BASE_INTF(IDirect3DDevice2, IDirect3DDevice); DEFINE_BASE_INTF(IDirect3DDevice3, IDirect3DDevice); + DEFINE_BASE_INTF(IDirect3DTexture, IDirectDrawSurface); + DEFINE_BASE_INTF(IDirect3DTexture2, IDirectDrawSurface); DEFINE_BASE_INTF(IDirect3DViewport2, IDirect3DViewport); DEFINE_BASE_INTF(IDirect3DViewport3, IDirect3DViewport); @@ -80,6 +82,8 @@ namespace Compat DEFINE_INTF_ID(IDirect3DDevice2); DEFINE_INTF_ID(IDirect3DDevice3); DEFINE_INTF_ID(IDirect3DDevice7); + DEFINE_INTF_ID(IDirect3DTexture); + DEFINE_INTF_ID(IDirect3DTexture2); DEFINE_INTF_ID(IDirect3DViewport); DEFINE_INTF_ID(IDirect3DViewport2); DEFINE_INTF_ID(IDirect3DViewport3); diff --git a/DDrawCompat/DDrawCompat.vcxproj b/DDrawCompat/DDrawCompat.vcxproj index e534258..5f7435f 100644 --- a/DDrawCompat/DDrawCompat.vcxproj +++ b/DDrawCompat/DDrawCompat.vcxproj @@ -196,10 +196,12 @@ + + @@ -244,6 +246,7 @@ + diff --git a/DDrawCompat/DDrawCompat.vcxproj.filters b/DDrawCompat/DDrawCompat.vcxproj.filters index d7f26b2..17de3a4 100644 --- a/DDrawCompat/DDrawCompat.vcxproj.filters +++ b/DDrawCompat/DDrawCompat.vcxproj.filters @@ -264,6 +264,12 @@ Header Files\Direct3d + + Header Files\Direct3d\Visitors + + + Header Files\Direct3d + @@ -398,6 +404,9 @@ Source Files\Direct3d + + Source Files\Direct3d + diff --git a/DDrawCompat/Direct3d/Direct3dTexture.cpp b/DDrawCompat/Direct3d/Direct3dTexture.cpp new file mode 100644 index 0000000..fa0201f --- /dev/null +++ b/DDrawCompat/Direct3d/Direct3dTexture.cpp @@ -0,0 +1,12 @@ +#include "Direct3d/Direct3dTexture.h" + +namespace Direct3d +{ + template + void Direct3dTexture::setCompatVtable(Vtable& /*vtable*/) + { + } + + template Direct3dTexture; + template Direct3dTexture; +} diff --git a/DDrawCompat/Direct3d/Direct3dTexture.h b/DDrawCompat/Direct3d/Direct3dTexture.h new file mode 100644 index 0000000..bdae7bb --- /dev/null +++ b/DDrawCompat/Direct3d/Direct3dTexture.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Common/CompatVtable.h" +#include "Direct3d/Visitors/Direct3dTextureVtblVisitor.h" + +namespace Direct3d +{ + template + class Direct3dTexture : public CompatVtable> + { + public: + static void setCompatVtable(Vtable& vtable); + }; +} + +SET_COMPAT_VTABLE(IDirect3DTextureVtbl, Direct3d::Direct3dTexture); +SET_COMPAT_VTABLE(IDirect3DTexture2Vtbl, Direct3d::Direct3dTexture); diff --git a/DDrawCompat/Direct3d/Hooks.cpp b/DDrawCompat/Direct3d/Hooks.cpp index 4e05c8c..f15d522 100644 --- a/DDrawCompat/Direct3d/Hooks.cpp +++ b/DDrawCompat/Direct3d/Hooks.cpp @@ -8,6 +8,7 @@ #include "DDraw/Repository.h" #include "Direct3d/Direct3d.h" #include "Direct3d/Direct3dDevice.h" +#include "Direct3d/Direct3dTexture.h" #include "Direct3d/Direct3dViewport.h" #include "Direct3d/Hooks.h" #include "Dll/Procs.h" @@ -16,6 +17,7 @@ namespace { void hookDirect3dDevice(CompatRef d3d, CompatRef renderTarget); void hookDirect3dDevice7(CompatRef d3d, CompatRef renderTarget); + void hookDirect3dTexture(CompatRef dd); void hookDirect3dViewport(CompatRef d3d); template @@ -82,6 +84,7 @@ namespace hookVtable(d3d); hookVtable(d3d); hookDirect3dDevice(*d3d, renderTarget); + hookDirect3dTexture(dd); hookDirect3dViewport(*d3d); } } @@ -114,6 +117,27 @@ namespace hookVtable(d3dDevice); } + void hookDirect3dTexture(CompatRef dd) + { + DDSURFACEDESC desc = {}; + desc.dwSize = sizeof(desc); + desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; + desc.dwWidth = 1; + desc.dwHeight = 1; + desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY; + + CompatPtr texture; + HRESULT result = dd->CreateSurface(&dd, &desc, &texture.getRef(), nullptr); + if (FAILED(result)) + { + Compat::Log() << "Failed to create a texture for hooking: " << result; + return; + } + + hookVtable(texture); + hookVtable(texture); + } + void hookDirect3dViewport(CompatRef d3d) { CompatPtr viewport; diff --git a/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h b/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h new file mode 100644 index 0000000..4418a91 --- /dev/null +++ b/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h @@ -0,0 +1,37 @@ +#pragma once + +#define CINTERFACE + +#include + +#include "Common/VtableVisitor.h" + +template <> +struct VtableForEach +{ + template + static void forEach(Visitor& visitor) + { + VtableForEach::forEach(visitor); + + DD_VISIT(Initialize); + DD_VISIT(GetHandle); + DD_VISIT(PaletteChanged); + DD_VISIT(Load); + DD_VISIT(Unload); + } +}; + +template <> +struct VtableForEach +{ + template + static void forEach(Visitor& visitor) + { + VtableForEach::forEach(visitor); + + DD_VISIT(GetHandle); + DD_VISIT(PaletteChanged); + DD_VISIT(Load); + } +};