Energy Reload
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вот где я его вижу, он сделан на получении матрицы и собственных расчетах. А не проще все это делать на стороне клиента?
1. Заводим структуру
2. Обзаводимся функцией/
Как бы и все, зачем юзать свое что-то, если можно это все сделать на стороне игры. Этот метод не менялся очень долго.
Зачем????
1. Заводим структуру
C++:
struct VecToScreen
{
public:
float toX;
float toY;
float toZ;
float* outX;
float* outY;
float* outZ;
};
C++:
bool WorldToScreen(Vec3 vEntPos, Vec3& vOut)
{
VecToScreen pVecToScreen;//<-Наша структура
//Пилим в неё данные
pVecToScreen.toX = vEntPos.x;
pVecToScreen.toY = vEntPos.y;
pVecToScreen.toZ = vEntPos.z;
pVecToScreen.outX = &vOut.x;
pVecToScreen.outY = &vOut.y;
pVecToScreen.outZ = &vOut.z;
//Дальше юзаем наш ProjectToScreen
IRenderer::Singleton()->ProjectToScreen(&pVecToScreen);
vOut.x *= (IRenderer::Singleton()->GetWidth() * 0.01f);
vOut.y *= (IRenderer::Singleton()->GetHeight() * 0.01f);
vOut.z *= 1.0f;
return ((vOut.z < 1.0f) && (vOut.x > 0) && (vOut.x < (float)IRenderer::Singleton()->GetWidth()) && (vOut.y > 0) && (vOut.y < (float)IRenderer::Singleton()->GetHeight()));
}
C++:
enum _IRender :DWORD64
{
OffSets_ru = 42704,
//r_Height 7-й
getWidth_offset_ru = 0x9428,
getHeight_offset_ru = 0x942C ,
index_ProjectToScreen_ru = 872 / 8,
OffSets_eur = 42704,
getWidth_offset_eur = 0x9428,
getHeight_offset_eur = 0x942C,
index_ProjectToScreen_eur = 872 / 8
};
class IRenderer
{
public:
static IRenderer* Singleton()
{
return *(IRenderer**)((DWORD64)(Check_version_game ? _SSystemGlobalEnvironment::_IRendererGlobalEnvironment_eur : _SSystemGlobalEnvironment::_IRendererGlobalEnvironment_ru));
}
Device* GetDevice()
{
return (Device*)*(DWORD64*)((DWORD64)this + (Check_version_game ? _IRender::OffSets_eur: _IRender::OffSets_ru));
}
int GetWidth()//Высота
{
//typedef int(__thiscall* oFunc)(PVOID);
//return vFun_Call<oFunc>(this, (Check_version_game ? getWidth_offset_eur : getWidth_offset_ru))(this);
return *(int*)((DWORD64)this + (Check_version_game ? getWidth_offset_eur : getWidth_offset_ru));//
}
int GetHeight()//Ширина
{
//typedef int(__thiscall* oFunc)(PVOID);
//return vFun_Call<oFunc>(this, (Check_version_game ? getHeight_offset_eur : getHeight_offset_ru))(this);
return *(int*)((DWORD64)this + (Check_version_game ? getHeight_offset_eur : getHeight_offset_ru));//
}
bool ProjectToScreen(VecToScreen* pVecToScreen)
{
typedef bool(__thiscall* oProjectToScreen)(PVOID, VecToScreen*);
return vFun_Call<oProjectToScreen>(this, (Check_version_game ? index_ProjectToScreen_eur : index_ProjectToScreen_ru))(this, pVecToScreen);
}
C++:
BOOL WorldToScreen(Vec3 Pos, Vec3& Out)
{
D3DXVECTOR3 PosM = { Pos.x, Pos.y, Pos.z };
D3DXMATRIX temp;
D3DXMatrixTranspose(&temp, &this->GetCameraMatrix());
D3DXVECTOR3 translationVector = D3DXVECTOR3(temp._41, temp._42, temp._43);
D3DXVECTOR3 up = D3DXVECTOR3(temp._21, temp._22, temp._23);
D3DXVECTOR3 right = D3DXVECTOR3(temp._11, temp._12, temp._13);
FLOAT w = D3DXVec3Dot(&translationVector, &PosM) + temp._44;
if (w < 1.29f)return Out.x = Out.y = 0;
FLOAT y = D3DXVec3Dot(&up, &PosM) + temp._24;
FLOAT x = D3DXVec3Dot(&right, &PosM) + temp._14;
Out.x = (sCEnableSFunc.ScreenCX) * (1 + (x / w));
Out.y = (sCEnableSFunc.ScreenCY) * (1 - (y / w));
return TRUE;
}
Последнее редактирование: