W2S for Shader Driven Games Original Thread: http://www.uc-forum.com/forum/d3d-tu...ven-games.html
By ntKid
Hello guys, i started playing a game called Hunter and i noticed it did not use settransform to set the matrices so after reading Azorbix posts about shader driven games and his amazing tips i came up with this. Code: struct ModelInfo_t
{
int X,Y,Team;
char* Name;
};
std::vector<ModelInfo_t>ModelInfo;
void AddModel(IDirect3DDevice9* Device,char* oName,int oTeam)
{
D3DVIEWPORT9 Viewport;
D3DXMATRIX ViewProjectionMatrix,LocalToWorld,WorldToLocal;
D3DXVECTOR3 Vector3D(0,0,0),Vector2D;
Device->GetVertexShaderConstantF(7,ViewProjectionMatrix,1);//change this to match your game matrix
Device->GetVertexShaderConstantF(8,LocalToWorld,1);//change this to match your game matrix
Device->GetViewport(&Viewport);
D3DXMatrixIdentity(&WorldToLocal);
D3DXVec3Project(&Vector2D,&Vector3D,&Viewport,&ViewProjectionMatrix,&LocalToWorld,&WorldToLocal);
if(Vector2D.z < 1.0f)
{
ModelInfo_t pModelInfo = {static_cast<int>(Vector2D.x),static_cast<int>(Vector2D.y),oTeam,oName};
ModelInfo.push_back(pModelInfo);
}
}
void RenderNames()
{
if(ModelInfo.size() != NULL)
{
for(int i = 0; i < ModelInfo.size(); i++)
{
iD3DFont.Draw(ModelInfo[i].X,ModelInfo[i].Y,ModelInfo[i].Name,D3DCOLOR_XRGB(255,0,0));
}
}
else{return;}
}
HRESULT (WINAPI* pEndScene)(LPDIRECT3DDEVICE9);
HRESULT WINAPI myEndScene(LPDIRECT3DDEVICE9 pDevice)
{
RenderNames();
ModelInfo.clear();
return pEndScene(pDevice);
}
int MuleDeerMale[] =
{
22,
38,
79,
86,
93,
101,
128,
129,
157,
173,
174,
177,
188,
198,
269,
293
};
bool bCheckNum(int rec[],int vert)
{
int i = 0;
while(rec[i] != 0)
{
if(rec[i]==vert){return(true);}
i++;
}
return(false);
}
HRESULT (WINAPI* pDrawIndexedPrimitive)(LPDIRECT3DDEVICE9,D3DPRIMITIVETYPE,int,int,int,int,int);
HRESULT WINAPI myDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE pType,int BaseVertexIndex,int uiMinIndex,int uiNumVertices,int uiStartIndex,int uiPrimitiveCount)
{
if(g_Stride==20)
{
if(BaseVertexIndex==0 && uiStartIndex==0 && pType==4)
{
if(bCheckNum(MuleDeerMale,uiNumVertices))
{//this should be done just with the head recognition for aimbot and performance but i am tired and lazy to go trough vert log again...
AddModel(pDevice,"Deer",1);
}
}
}
return pDrawIndexedPrimitive(pDevice,pType,BaseVertexIndex,uiMinIndex,uiNumVertices,uiStartIndex,uiPrimitiveCount);
}
---updated how i achieved the right registers for hunter---(i dont know if this method will work for all games since im not a d3d guru) Code: void doDisassembleShader(LPDIRECT3DDEVICE9 pDevice,char* FileName)
{
std::ofstream oLogFile(FileName,std::ios::trunc);
if (!oLogFile.is_open())
return;
IDirect3DVertexShader9* pShader;
pDevice->GetVertexShader(&pShader);
UINT pSizeOfData;
pShader->GetFunction(NULL,&pSizeOfData);
BYTE* pData = new BYTE[pSizeOfData];
pShader->GetFunction(pData,&pSizeOfData);
LPD3DXBUFFER bOut;
D3DXDisassembleShader(reinterpret_cast<DWORD*>(pData),NULL,NULL,&bOut);
oLogFile << static_cast<char*>(bOut->GetBufferPointer()) << std::endl;
oLogFile.close();
delete[] pData;
pShader->Release();
}
void ReadConstantTable(LPDIRECT3DDEVICE9 pDevice,char* FileName)
{
std::ofstream oLogFile(FileName,std::ios::trunc);
if (!oLogFile.is_open())
return;
LPD3DXCONSTANTTABLE pConstantTable;
D3DXCONSTANT_DESC pConstantDesc[32];
LPD3DXBUFFER pShaderBuffer,pErrorBuffer;
UINT pConstantNum = 32;
IDirect3DVertexShader9* pShader;
pDevice->GetVertexShader(&pShader);
UINT pSizeOfData;
pShader->GetFunction(NULL,&pSizeOfData);
BYTE* pData = new BYTE[pSizeOfData];
pShader->GetFunction(pData,&pSizeOfData);
D3DXGetShaderConstantTable(reinterpret_cast<DWORD*>(pData),&pConstantTable);
D3DXCONSTANTTABLE_DESC pDesc;
pConstantTable->GetDesc(&pDesc);
for(UINT StartRegister = 0; StartRegister < pDesc.Constants; StartRegister++)
{
D3DXHANDLE Handle = pConstantTable->GetConstant(NULL,StartRegister);
char* bClass[6] = {"D3DXPC_SCALAR","D3DXPC_VECTOR","D3DXPC_MATRIX_ROWS","D3DXPC_MATRIX_COLUMNS","D3DXPC_OBJECT","D3DXPC_STRUCT"};
char* bRegisterSet[4] = {"D3DXRS_BOOL","D3DXRS_INT4","D3DXRS_FLOAT4","D3DXRS_SAMPLER"};
char* bType[19] = {"D3DXPT_VOID","D3DXPT_BOOL","D3DXPT_INT","D3DXPT_FLOAT","D3DXPT_STRING","D3DXPT_TEXTURE","D3DXPT_TEXTURE1D","D3DXPT_TEXTURE2D","D3DXPT_TEXTURE3D","D3DXPT_TEXTURECUBE","D3DXPT_SAMPLER","D3DXPT_SAMPLER1D","D3DXPT_SAMPLER2D","D3DXPT_SAMPLER3D","D3DXPT_SAMPLERCUBE","D3DXPT_PIXELSHADER","D3DXPT_VERTEXSHADER","D3DXPT_PIXELFRAGMENT","D3DXPT_VERTEXFRAGMENT"};
if(Handle != NULL)
{
pConstantTable->GetConstantDesc(Handle,pConstantDesc,&pConstantNum);
char bString[MAX_PATH];
for(UINT i =0; i < pConstantNum; i++)
{
sprintf(bString,"Name=[%s]\nRegisterSet=[%s]\nRegisterIndex=[%d]\nRegisterCount=[%d]\nClass=[%s]\nType=[%s]\nRows=[%d]\nColumns=[%d]\nElemets=[%d]\nStructMembers=[%d]\nBytes=[%d]\nDefaultValue=[0x%X]\nStartRegister=[%d]\nEND\n",
pConstantDesc[i].Name,
bRegisterSet[pConstantDesc[i].RegisterSet],
pConstantDesc[i].RegisterIndex,
pConstantDesc[i].RegisterCount,
bClass[pConstantDesc[i].Class],
bType[pConstantDesc[i].Type],
pConstantDesc[i].Rows,
pConstantDesc[i].Columns,
pConstantDesc[i].Elements,
pConstantDesc[i].StructMembers,
pConstantDesc[i].Bytes,
(DWORD)pConstantDesc[i].DefaultValue,
StartRegister);
oLogFile << static_cast<char*>(bString) << std::endl;
}
}
}
oLogFile.close();
pConstantTable->Release();
pShader->Release();
delete[] pData;
}
HRESULT (WINAPI* pDrawIndexedPrimitive)(LPDIRECT3DDEVICE9,D3DPRIMITIVETYPE,int,int,int,int,int);
HRESULT WINAPI myDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE pType,int BaseVertexIndex,int uiMinIndex,int uiNumVertices,int uiStartIndex,int uiPrimitiveCount)
{
if(g_Stride==20)
{
if(BaseVertexIndex==0 && uiStartIndex==0 && pType==4)
{
if(bCheckNum(MuleDeerMale,uiNumVertices))
{
doDisassembleShader(pDevice,"shader.txt")
}
}
}
return pDrawIndexedPrimitive(pDevice,pType,BaseVertexIndex,uiMinIndex,uiNumVertices,uiStartIndex,uiPrimitiveCount);
}
Result Shader.txt: Code: //
//
// Generated by Microsoft (R) D3DX9 Shader Compiler 9.15.779.0000
//
// Registers:
//
// Name Reg Size
// ------------------------- ----- ----
// ViewProjectionMatrix c7 1(GetVertexShaderConstantF(7,ViewProjectionMatrix,1);)
// LocalToWorld c8 1(GetVertexShaderConstantF(8,LocalToWorld,1);)
// ShadowCoordinateScaleBias c11 1
// CameraPosition c12 1
//
vs_3_0
def c13, -101010.008, 1, 0, -0.00784313772
dcl_position v0
dcl_position1 v1
dcl_position2 v2
dcl_position3 v3
dcl_tangent v4
dcl_binormal v5
dcl_normal v6
dcl_texcoord v7
dcl_color v8
dcl_position o0
dcl_texcoord o1.xy
dcl_texcoord1 o2
dcl_texcoord5 o3
dcl_texcoord6 o4.xyz
dcl_texcoord7 o5.xyz
mul r0, c1, v0.y
mad r0, c0, v0.x, r0
mad r0, c2, v0.z, r0
mad r2, c3, v0.w, r0
mov r0.w, c13.x
add r0.w, r0.w, c3.w
sge r3.w, -r0_abs.w, r0_abs.w
mad r0, v0.xyzx, c13.yyyz, c13.zzzy
mov r1.w, c13.y
dp4 r1.x, r0, v1
dp4 r1.y, r0, v2
dp4 r1.z, r0, v3
lrp r0, r3.w, r1, r2
mad r1.xyz, r0, -c12.w, c12
mul r2.xyz, r1.y, c9
mad r2.xyz, c8, r1.x, r2
mad r3.xyz, c10, r1.z, r2
mad r1.xyz, v4, -c13.w, -c13.y
mad o1.xy, v8, c11, c11.wzzw
dp3 o4.x, r1, r3
dp3 o5.x, r1, c10
mad r2.xyz, v5, -c13.w, -c13.y
dp3 o4.y, r2, r3
mul r1, r0.y, c5
dp3 o5.y, r2, c10
mad r1, c4, r0.x, r1
mad r2.xyz, v6, -c13.w, -c13.y
mad r1, c6, r0.z, r1
dp3 o4.z, r2, r3
mad r0, c7, r0.w, r1
dp3 o5.z, r2, c10
mov o0, r0
mov o3, r0
mul o2, c13.yyzz, v7.xyxx
Tutorial updated.
If this is somehow usefull to you dont forget to credit ntKid, Azorbix and Gamedeception.net
Please dont post this anywhere else.
Screenshot Bellow
|