#include <windows.h>
#include <string>
#include <assert.h>
#include "CSAMPFUNCS.h"
CSAMPFUNCS *SF = new CSAMPFUNCS();
stFontInfo *rFont;
float vect3_length(const float in[3])
{
return sqrtf(in[0] * in[0] + in[1] * in[1] + in[2] * in[2]);
}
void vect3_vect3_sub(const float in1[3], const float in2[3], float out[3])
{
int i;
for (i = 0; i < 3; i++)
out[i] = in1[i] - in2[i];
}
void CalcScreenCoors(D3DXVECTOR3 *vecWorld, D3DXVECTOR3 *vecScreen)
{
/** C++-ifyed function 0x71DA00, formerly called by CHudSA::CalcScreenCoors **/
// Get the static view matrix as D3DXMATRIX
D3DXMATRIX m((float *)(0xB6FA2C));
// Get the static virtual screen (x,y)-sizes
DWORD *dwLenX = (DWORD *)(0xC17044);
DWORD *dwLenY = (DWORD *)(0xC17048);
//DWORD *dwLenZ = (DWORD*)(0xC1704C);
//double aspectRatio = (*dwLenX) / (*dwLenY);
// Do a transformation
vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41;
vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42;
vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43;
// Get the correct screen coordinates
double fRecip = (double)1.0 / vecScreen->z; //(vecScreen->z - (*dwLenZ));
vecScreen->x *= (float)(fRecip * (*dwLenX));
vecScreen->y *= (float)(fRecip * (*dwLenY));
}
float vect3_dist(const float in1[3], const float in2[3])
{
float dist[3];
vect3_vect3_sub(in1, in2, dist);
return vect3_length(dist);
}
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
if (!SF->getGame()->isGTAMenuActive())
{
actor_info *self = SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped;
if (self != nullptr)
{
char rText[32]; // buf
float fObjPos[3];
float fScreen[2];
D3DXVECTOR3 eobjpos, escreen;
for (int i = 0; i < MAX_OBJECTS; i++)
{
if (SF->getSAMP()->getInfo()->pPools->pPool_Object->IsObjectExists(i))
{
object_info *obj = SF->getSAMP()->getInfo()->pPools->pPool_Object->object[i]->pGTAObject;
if (obj == nullptr)
continue;
fObjPos[0] = obj->base.matrix[4 * 3];
fObjPos[1] = obj->base.matrix[4 * 3 + 1];
fObjPos[2] = obj->base.matrix[4 * 3 + 2];
if (vect3_dist(fObjPos, &self->base.matrix[4 * 3]) > 30.0)
continue;
eobjpos.x = fObjPos[0];
eobjpos.y = fObjPos[1];
eobjpos.z = fObjPos[2];
CalcScreenCoors(&eobjpos, &escreen);
fScreen[0] = escreen.x;
fScreen[1] = escreen.y;
fScreen[2] = escreen.z;
if (fScreen[2] < 1.f)
continue;
sprintf(rText, "Object %d, model %d", i, obj->base.model_alt_id);
rFont->Print(rText, D3DCOLOR_XRGB(255, 255, 255), fScreen[0], fScreen[1], true);
}
}
}
}
SF->getRender()->EndRender();
}
return 1;
}
void CALLBACK mainloop( void )
{
static bool init = false;
if( !init )
{
if( !SF->getSAMP()->IsInitialized() )
return;
rFont = SF->getRender()->CreateNewFont("Trebuchet MS", 9, FCR_BORDER && FCR_BOLD);
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
init = true;
}
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved )
{
switch ( dwReasonForCall )
{
case DLL_PROCESS_ATTACH:
SF->initPlugin( mainloop, hModule );
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}