Code:
bool bGenerateShaders = true;
IDirect3DPixelShader9 * re_Red;
IDirect3DPixelShader9 * re_Green;
HRESULT GenerateShader(IDirect3DDevice9 *pD3Ddev, IDirect3DPixelShader9 **pShader, float r, float g, float b, float a)
{
char szShader[256];
ID3DXBuffer *pShaderBuf = NULL;
sprintf(szShader, "ps_3_0\ndef c0, %f, %f, %f, %f\nmov oC0, c0", r, g, b, a);
D3DXAssembleShader(szShader, sizeof(szShader), NULL, NULL, 0, &pShaderBuf, NULL);
if(FAILED(cod4_device->device->CreatePixelShader((const DWORD*)pShaderBuf->GetBufferPointer(), pShader)))
return E_FAIL;
return S_OK;
}
void (*oDrawXModelSkinnedCached)( int a1, xModel_t a2, int a3 );
void nDrawXModelSkinnedCached( int a1, xModel_t a2, int a3 )
{
if(bGenerateShaders) {
GenerateShader( cod4_device->device, &re_Red, 255, 0, 0, 255);
GenerateShader( cod4_device->device, &re_Green, 0, 255, 0, 255);
bGenerateShaders = false;
}
xModel_t * Skin = NULL;
__asm mov Skin, eax
cod4_device->device->SetRenderState(D3DRS_LIGHTING, FALSE);
cod4_device->device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
cod4_device->device->SetPixelShader(re_Red);
oDrawXModelSkinnedCached( a1, a2, a3 );
cod4_device->device->SetPixelShader(re_Green);
cod4_device->device->SetRenderState(D3DRS_LIGHTING, FALSE);
cod4_device->device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
oDrawXModelSkinnedCached( a1, a2, a3 );
__asm mov eax, Skin
cod4_device->device->SetPixelShader(NULL);
Code:
DetourFunction((PBYTE)0x646870, (PBYTE)nDrawXModelSkinnedCached);
_asm mov [oDrawXModelSkinnedCached], eax
Code:
typedef struct {
char szUnknown0[230];
} xModel_t;
typedef struct{
IDirect3DDevice9* device;
} cod4_device_t;
cod4_device_t * cod4_device = (cod4_device_t *)0xCC9A408;