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

Hook Direct3D light and material interfaces

This commit is contained in:
narzoul 2020-04-17 23:53:18 +02:00
parent 1294e5df0d
commit 652bf67706
12 changed files with 268 additions and 8 deletions

View File

@ -46,6 +46,8 @@ namespace Compat
DEFINE_BASE_INTF(IDirect3D7, IDirectDraw);
DEFINE_BASE_INTF(IDirect3DDevice2, IDirect3DDevice);
DEFINE_BASE_INTF(IDirect3DDevice3, IDirect3DDevice);
DEFINE_BASE_INTF(IDirect3DMaterial2, IDirect3DMaterial);
DEFINE_BASE_INTF(IDirect3DMaterial3, IDirect3DMaterial);
DEFINE_BASE_INTF(IDirect3DTexture, IDirectDrawSurface);
DEFINE_BASE_INTF(IDirect3DTexture2, IDirectDrawSurface);
DEFINE_BASE_INTF(IDirect3DViewport2, IDirect3DViewport);
@ -81,6 +83,9 @@ namespace Compat
DEFINE_INTF_ID(IDirect3DDevice2);
DEFINE_INTF_ID(IDirect3DDevice3);
DEFINE_INTF_ID(IDirect3DDevice7);
DEFINE_INTF_ID(IDirect3DMaterial);
DEFINE_INTF_ID(IDirect3DMaterial2);
DEFINE_INTF_ID(IDirect3DMaterial3);
DEFINE_INTF_ID(IDirect3DTexture);
DEFINE_INTF_ID(IDirect3DTexture2);
DEFINE_INTF_ID(IDirect3DViewport);

View File

@ -195,6 +195,8 @@
<ClInclude Include="Direct3d\DepthBuffer.h" />
<ClInclude Include="Direct3d\Direct3d.h" />
<ClInclude Include="Direct3d\Direct3dDevice.h" />
<ClInclude Include="Direct3d\Direct3dLight.h" />
<ClInclude Include="Direct3d\Direct3dMaterial.h" />
<ClInclude Include="Direct3d\Direct3dTexture.h" />
<ClInclude Include="Direct3d\Direct3dVertexBuffer.h" />
<ClInclude Include="Direct3d\Direct3dViewport.h" />
@ -202,6 +204,8 @@
<ClInclude Include="Direct3d\Log.h" />
<ClInclude Include="Direct3d\Types.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dLightVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dMaterialVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dVertexBufferVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dViewportVtblVisitor.h" />
@ -267,6 +271,8 @@
<ClCompile Include="Direct3d\DepthBuffer.cpp" />
<ClCompile Include="Direct3d\Direct3d.cpp" />
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
<ClCompile Include="Direct3d\Direct3dLight.cpp" />
<ClCompile Include="Direct3d\Direct3dMaterial.cpp" />
<ClCompile Include="Direct3d\Direct3dTexture.cpp" />
<ClCompile Include="Direct3d\Direct3dVertexBuffer.cpp" />
<ClCompile Include="Direct3d\Direct3dViewport.cpp" />

View File

@ -369,6 +369,18 @@
<ClInclude Include="Win32\TimeFunctions.h">
<Filter>Header Files\Win32</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Direct3dMaterial.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Visitors\Direct3dMaterialVtblVisitor.h">
<Filter>Header Files\Direct3d\Visitors</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Visitors\Direct3dLightVtblVisitor.h">
<Filter>Header Files\Direct3d\Visitors</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Direct3dLight.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">
@ -569,6 +581,12 @@
<ClCompile Include="Win32\TimeFunctions.cpp">
<Filter>Source Files\Win32</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Direct3dMaterial.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Direct3dLight.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Dll\DDrawCompat.def">

View File

@ -0,0 +1,8 @@
#include <Direct3d/Direct3dLight.h>
namespace Direct3d
{
void Direct3dLight::setCompatVtable(IDirect3DLightVtbl& /*vtable*/)
{
}
}

View File

@ -0,0 +1,16 @@
#pragma once
#include <Common/CompatVtable.h>
#include <Direct3d/Log.h>
#include <Direct3d/Visitors/Direct3dLightVtblVisitor.h>
namespace Direct3d
{
class Direct3dLight : public CompatVtable<IDirect3DLightVtbl>
{
public:
static void setCompatVtable(IDirect3DLightVtbl& vtable);
};
}
SET_COMPAT_VTABLE(IDirect3DLightVtbl, Direct3d::Direct3dLight);

View File

@ -0,0 +1,13 @@
#include <Direct3d/Direct3dMaterial.h>
namespace Direct3d
{
template <typename TDirect3dMaterial>
void Direct3dMaterial<TDirect3dMaterial>::setCompatVtable(Vtable<TDirect3dMaterial>& /*vtable*/)
{
}
template Direct3dMaterial<IDirect3DMaterial>;
template Direct3dMaterial<IDirect3DMaterial2>;
template Direct3dMaterial<IDirect3DMaterial3>;
}

View File

@ -0,0 +1,19 @@
#pragma once
#include <Common/CompatVtable.h>
#include <Direct3d/Log.h>
#include <Direct3d/Visitors/Direct3dMaterialVtblVisitor.h>
namespace Direct3d
{
template <typename TDirect3dMaterial>
class Direct3dMaterial : public CompatVtable<Vtable<TDirect3dMaterial>>
{
public:
static void setCompatVtable(Vtable<TDirect3dMaterial>& vtable);
};
}
SET_COMPAT_VTABLE(IDirect3DMaterialVtbl, Direct3d::Direct3dMaterial<IDirect3DMaterial>);
SET_COMPAT_VTABLE(IDirect3DMaterial2Vtbl, Direct3d::Direct3dMaterial<IDirect3DMaterial2>);
SET_COMPAT_VTABLE(IDirect3DMaterial3Vtbl, Direct3d::Direct3dMaterial<IDirect3DMaterial3>);

View File

@ -1,17 +1,21 @@
#include <d3d.h>
#include "Common/CompatRef.h"
#include "Common/Log.h"
#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 <Common/CompatRef.h>
#include <Common/Log.h>
#include <Direct3d/Direct3d.h>
#include <Direct3d/Direct3dDevice.h>
#include <Direct3d/Direct3dLight.h>
#include <Direct3d/Direct3dMaterial.h>
#include <Direct3d/Direct3dTexture.h>
#include <Direct3d/Direct3dVertexBuffer.h>
#include <Direct3d/Direct3dViewport.h>
#include <Direct3d/Hooks.h>
namespace
{
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
void hookDirect3dLight(CompatRef<IDirect3D3> d3d);
void hookDirect3dMaterial(CompatRef<IDirect3D3> d3d);
void hookDirect3dTexture(CompatRef<IDirectDraw> dd);
void hookDirect3dVertexBuffer(CompatRef<IDirect3D3> d3d);
void hookDirect3dVertexBuffer7(CompatRef<IDirect3D7> d3d);
@ -70,6 +74,8 @@ namespace
hookVtable<IDirect3D2>(d3d);
hookVtable<IDirect3D3>(d3d);
hookDirect3dDevice(*d3d, renderTarget);
hookDirect3dLight(*d3d);
hookDirect3dMaterial(*d3d);
hookDirect3dTexture(dd);
hookDirect3dVertexBuffer(*d3d);
hookDirect3dViewport(*d3d);
@ -102,6 +108,34 @@ namespace
hookVtable<IDirect3DDevice3>(d3dDevice);
}
void hookDirect3dLight(CompatRef<IDirect3D3> d3d)
{
CompatPtr<IDirect3DLight> light;
HRESULT result = d3d->CreateLight(&d3d, &light.getRef(), nullptr);
if (FAILED(result))
{
Compat::Log() << "ERROR: Failed to create a light for hooking: " << Compat::hex(result);
return;
}
hookVtable<IDirect3DLight>(light);
}
void hookDirect3dMaterial(CompatRef<IDirect3D3> d3d)
{
CompatPtr<IDirect3DMaterial3> material;
HRESULT result = d3d->CreateMaterial(&d3d, &material.getRef(), nullptr);
if (FAILED(result))
{
Compat::Log() << "ERROR: Failed to create a material for hooking: " << Compat::hex(result);
return;
}
hookVtable<IDirect3DMaterial>(material);
hookVtable<IDirect3DMaterial2>(material);
hookVtable<IDirect3DMaterial3>(material);
}
void hookDirect3dTexture(CompatRef<IDirectDraw> dd)
{
DDSURFACEDESC desc = {};

View File

@ -1,5 +1,14 @@
#include <Direct3d/Log.h>
std::ostream& operator<<(std::ostream& os, const D3DCOLORVALUE& data)
{
return Compat::LogStruct(os)
<< data.r
<< data.g
<< data.b
<< data.a;
}
std::ostream& operator<<(std::ostream& os, const D3DDP_PTRSTRIDE& data)
{
return Compat::LogStruct(os)
@ -17,6 +26,67 @@ std::ostream& operator<<(std::ostream& os, const D3DDRAWPRIMITIVESTRIDEDDATA& da
<< Compat::array(data.textureCoords, D3DDP_MAXTEXCOORD);
}
std::ostream& operator<<(std::ostream& os, const D3DLIGHT& data)
{
D3DLIGHT2 light = {};
reinterpret_cast<D3DLIGHT&>(light) = data;
return os << light;
}
std::ostream& operator<<(std::ostream& os, const D3DLIGHT2& data)
{
return Compat::LogStruct(os)
<< data.dltType
<< data.dcvColor
<< data.dvPosition
<< data.dvDirection
<< data.dvRange
<< data.dvFalloff
<< data.dvAttenuation0
<< data.dvAttenuation1
<< data.dvAttenuation2
<< data.dvTheta
<< data.dvPhi
<< Compat::hex(data.dwFlags);
}
std::ostream& operator<<(std::ostream& os, const D3DLIGHT7& data)
{
return Compat::LogStruct(os)
<< data.dltType
<< data.dcvDiffuse
<< data.dcvSpecular
<< data.dcvAmbient
<< data.dvPosition
<< data.dvDirection
<< data.dvRange
<< data.dvFalloff
<< data.dvAttenuation0
<< data.dvAttenuation1
<< data.dvAttenuation2
<< data.dvTheta
<< data.dvPhi;
}
std::ostream& operator<<(std::ostream& os, const D3DMATERIAL& data)
{
return Compat::LogStruct(os)
<< data.diffuse
<< data.ambient
<< data.specular
<< data.emissive
<< data.power
<< Compat::hex(data.hTexture)
<< data.dwRampSize;
}
std::ostream& operator<<(std::ostream& os, const D3DMATERIAL7& data)
{
D3DMATERIAL material = {};
reinterpret_cast<D3DMATERIAL7&>(material) = data;
return os << material;
}
std::ostream& operator<<(std::ostream& os, const D3DVERTEXBUFFERDESC& data)
{
return Compat::LogStruct(os)

View File

@ -4,6 +4,12 @@
#include <Common/Log.h>
std::ostream& operator<<(std::ostream& os, const D3DCOLORVALUE& data);
std::ostream& operator<<(std::ostream& os, const D3DDP_PTRSTRIDE& data);
std::ostream& operator<<(std::ostream& os, const D3DDRAWPRIMITIVESTRIDEDDATA& data);
std::ostream& operator<<(std::ostream& os, const D3DLIGHT& data);
std::ostream& operator<<(std::ostream& os, const D3DLIGHT2& data);
std::ostream& operator<<(std::ostream& os, const D3DLIGHT7& data);
std::ostream& operator<<(std::ostream& os, const D3DMATERIAL& data);
std::ostream& operator<<(std::ostream& os, const D3DMATERIAL7& data);
std::ostream& operator<<(std::ostream& os, const D3DVERTEXBUFFERDESC& data);

View File

@ -0,0 +1,19 @@
#pragma once
#include <d3d.h>
#include <Common/VtableVisitor.h>
template <>
struct VtableForEach<IDirect3DLightVtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(Initialize);
DD_VISIT(SetLight);
DD_VISIT(GetLight);
}
};

View File

@ -0,0 +1,46 @@
#pragma once
#include <d3d.h>
#include <Common/VtableVisitor.h>
template <>
struct VtableForEach<IDirect3DMaterialVtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(Initialize);
DD_VISIT(SetMaterial);
DD_VISIT(GetMaterial);
DD_VISIT(GetHandle);
DD_VISIT(Reserve);
DD_VISIT(Unreserve);
}
};
template <>
struct VtableForEach<IDirect3DMaterial2Vtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(SetMaterial);
DD_VISIT(GetMaterial);
DD_VISIT(GetHandle);
}
};
template <>
struct VtableForEach<IDirect3DMaterial3Vtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IDirect3DMaterial2Vtbl>::forEach<Vtable>(visitor);
}
};