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:
parent
1294e5df0d
commit
652bf67706
@ -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);
|
||||
|
@ -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" />
|
||||
|
@ -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">
|
||||
|
8
DDrawCompat/Direct3d/Direct3dLight.cpp
Normal file
8
DDrawCompat/Direct3d/Direct3dLight.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
#include <Direct3d/Direct3dLight.h>
|
||||
|
||||
namespace Direct3d
|
||||
{
|
||||
void Direct3dLight::setCompatVtable(IDirect3DLightVtbl& /*vtable*/)
|
||||
{
|
||||
}
|
||||
}
|
16
DDrawCompat/Direct3d/Direct3dLight.h
Normal file
16
DDrawCompat/Direct3d/Direct3dLight.h
Normal 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);
|
13
DDrawCompat/Direct3d/Direct3dMaterial.cpp
Normal file
13
DDrawCompat/Direct3d/Direct3dMaterial.cpp
Normal 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>;
|
||||
}
|
19
DDrawCompat/Direct3d/Direct3dMaterial.h
Normal file
19
DDrawCompat/Direct3d/Direct3dMaterial.h
Normal 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>);
|
@ -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 = {};
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
19
DDrawCompat/Direct3d/Visitors/Direct3dLightVtblVisitor.h
Normal file
19
DDrawCompat/Direct3d/Visitors/Direct3dLightVtblVisitor.h
Normal 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);
|
||||
}
|
||||
};
|
46
DDrawCompat/Direct3d/Visitors/Direct3dMaterialVtblVisitor.h
Normal file
46
DDrawCompat/Direct3d/Visitors/Direct3dMaterialVtblVisitor.h
Normal 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);
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user