9
9
#include " Shaders/Particle1.h"
10
10
#include " Shaders/RadialBlur.h"
11
11
#include " Shaders/Shadow.h"
12
+ #include " Shaders/Spherical.h"
12
13
#include " Shaders/Terrain.h"
13
14
#include " Shaders/Tex.h"
14
15
#include " Shaders/VolumeFog.h"
15
16
#include " util.h"
16
17
17
-
18
18
namespace atfix {
19
19
20
20
extern " C" bool IsAMD ();
21
-
22
21
/* * Hooking-related stuff */
23
22
using PFN_ID3D11Device_CreateVertexShader = HRESULT(STDMETHODCALLTYPE*) (ID3D11Device*, const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11VertexShader**);
24
23
using PFN_ID3D11Device_CreatePixelShader = HRESULT(STDMETHODCALLTYPE*) (ID3D11Device*, const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11PixelShader**);
@@ -41,6 +40,10 @@ const DeviceProcs* getDeviceProcs(ID3D11Device* pDevice) {
41
40
return &g_deviceProcs;
42
41
}
43
42
43
+ // This game hates and crashes when other shaders
44
+ // don't have a vertex shader when doing
45
+ // pixel shader changes, but it's fine the other way around.
46
+
44
47
HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader (
45
48
ID3D11Device* pDevice,
46
49
const void * pShaderBytecode,
@@ -155,6 +158,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreatePixelShader(
155
158
static constexpr std::array<uint32_t , 4 > ShadowShader = { 0xbb5a2d0a , 0x29d139b7 , 0x40992005 , 0xf3b46588 };
156
159
static constexpr std::array<uint32_t , 4 > TerrainShader = { 0x74a9f538 , 0x75cb0ce6 , 0x3da09498 , 0x7bc641bd };
157
160
static constexpr std::array<uint32_t , 4 > DefaultShader = { 0x5cbbb737 , 0x265384da , 0x36d6d037 , 0x1b052f54 };
161
+ static constexpr std::array<uint32_t , 4 > SphericalShader = { 0xba0db34b , 0xd2bc2581 , 0x36622cd8 , 0xacd2a10c };
158
162
159
163
const uint32_t * hash = reinterpret_cast <const uint32_t *>(reinterpret_cast <const uint8_t *>(pShaderBytecode) + 4 );
160
164
@@ -190,6 +194,13 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreatePixelShader(
190
194
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_SHADOW_SHADER, sizeof (SIMPLIFIED_FS_SHADOW_SHADER), pClassLinkage, ppPixelShader);
191
195
192
196
}
197
+ else if (std::equal (SphericalShader.begin (), SphericalShader.end (), hash)) {
198
+ if (!SphericalB) {
199
+ SphericalB = true ;
200
+ log (" Spherical Map found" );
201
+ }
202
+ return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_HIGH_SPHERICAL_SHADER, sizeof (SIMPLIFIED_FS_HIGH_SPHERICAL_SHADER), pClassLinkage, ppPixelShader);
203
+ }
193
204
#else
194
205
else if (std::equal (TerrainShader.begin (), TerrainShader.end (), hash)) {
195
206
@@ -198,6 +209,13 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreatePixelShader(
198
209
else if (std::equal (DefaultShader.begin (), DefaultShader.end (), hash)) {
199
210
200
211
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_DEFAULT_SHADER, sizeof (SIMPLIFIED_FS_DEFAULT_SHADER), pClassLinkage, ppPixelShader);
212
+ }
213
+ else if (std::equal (SphericalShader.begin (), SphericalShader.end (), hash)) {
214
+ if (!SphericalB) {
215
+ SphericalB = true ;
216
+ log (" Spherical Map found" );
217
+ }
218
+ return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_LOW_SPHERICAL_SHADER, sizeof (SIMPLIFIED_FS_LOW_SPHERICAL_SHADER), pClassLinkage, ppPixelShader);
201
219
}
202
220
#endif
203
221
return procs->CreatePixelShader (pDevice, pShaderBytecode, BytecodeLength, pClassLinkage, ppPixelShader);
0 commit comments