vendredi 7 mars 2014

[Source] Nade Tracers topic




sup?

CNadeTracer.h:

Code:


#ifndef _CNADETRACER_H
#define _CNADETRACER_H

#include "SourceEngine.h"
#include "CRenderer.h"

#include <vector>
#include <chrono>

class CTimer
{
private:
        __int64 initialTS, currentTS;
        float secsPerCount;

public:
        CTimer()
        {
                __int64 countsPerSec = initialTS = currentTS = 0;
                QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
                if (countsPerSec == 0)
                        secsPerCount = 1.0f;
                else
                        secsPerCount = 1.0f / (float)countsPerSec;
        }
        void init()
        {
                QueryPerformanceCounter((LARGE_INTEGER*)&initialTS);
        }
        float diff()
        {
                QueryPerformanceCounter((LARGE_INTEGER*)&currentTS);
                return ((float)currentTS - (float)initialTS)*secsPerCount;
        }
};

class CTraceObj
{
public:
        CTraceObj(source_engine::CBaseEntity*, D3DCOLOR, int);
        source_engine::CBaseEntity* m_pNade;
        void* m_pNetworkable;

        void Update();
        void Draw(Renderer*, source_engine::Math*);
private:
        int m_iMaxLength;
        CTimer m_tDeadlock;
        std::vector<Vec3> m_vecTrace;
        D3DCOLOR m_colorTrace;
};

class CNadeTracer
{
private:
        Renderer* m_pRenderer;
        source_engine::Math* m_pMath;
        std::vector<CTraceObj*> vecTraceObjects;

public:
        CNadeTracer(Renderer*, source_engine::Math*);
        bool AddTracer(source_engine::CBaseEntity*, D3DCOLOR, int);
        void Draw();
        void Clear();
};

#endif


CNadeTracer.cpp:

Code:


#include "CNadeTracer.h"

CNadeTracer::CNadeTracer(Renderer* pRenderer, source_engine::Math* pMath)
{
        m_pRenderer = pRenderer;
        m_pMath = pMath;
}

bool CNadeTracer::AddTracer(source_engine::CBaseEntity* pNade, D3DCOLOR colorTrace, int iMaxLength)
{
        for (auto pObj : vecTraceObjects)
        {
                if (pNade == pObj->m_pNade)
                        return false;
        }

        vecTraceObjects.push_back(new CTraceObj(pNade, colorTrace, iMaxLength));
        return true;
}

void CNadeTracer::Draw()
{
        for (auto pObj = vecTraceObjects.begin(); pObj != vecTraceObjects.end(); pObj++)
        {
                CTraceObj* pTraceObj = *pObj;
               
                __try
                {
                        if ((*(void**)(pTraceObj->m_pNade + 8)) != pTraceObj->m_pNetworkable)
                                vecTraceObjects.erase(pObj);
                }
                __except (1)
                {
                        vecTraceObjects.erase(pObj);
                }       

                pTraceObj->Update();
                pTraceObj->Draw(m_pRenderer, m_pMath);
        }
}

void CNadeTracer::Clear()
{
        vecTraceObjects.clear();
}

CTraceObj::CTraceObj(source_engine::CBaseEntity* pNade, D3DCOLOR colorTrace, int iMaxLength)
{
        m_pNade = pNade;
        m_colorTrace = colorTrace;
        m_iMaxLength = iMaxLength;
        m_pNetworkable = *(void**)(pNade + 8);
        m_tDeadlock.init();
}

void CTraceObj::Update()
{
        if (m_tDeadlock.diff() >= 0.025f ) //50 ms
        {
                m_vecTrace.push_back(m_pNade->GetOrigin());
                if (m_vecTrace.size() > m_iMaxLength)
                        m_vecTrace.erase(m_vecTrace.begin());
                m_tDeadlock.init();
        }
}

void CTraceObj::Draw(Renderer* pRenderer, source_engine::Math* pMath)
{
        Vec3 vLastScreenPos;
        bool bInit = false;

        for (auto vecPos : m_vecTrace)
        {
                Vec3 vScreenPos = pMath->WorldToScreen(vecPos);
                if (vScreenPos.z > 0.001f && bInit)
                        pRenderer->DrawLine(vLastScreenPos.x, vLastScreenPos.y, vScreenPos.x, vScreenPos.y, m_colorTrace);
               
                vLastScreenPos = vScreenPos;
                bInit = true;
        }
}


Before entity iteration:

Code:


bool bGrenadePresent = false;

In entity iteration:

Code:


                if (sClassname.find("GrenadeProjectile") != std::string::npos) //grenades
                {
                        pNadeTracer->AddTracer(pBaseEntity, 0xFFFF0000, 50);
                        pNadeTracer->Draw();
                        bGrenadePresent = true;
                }


After entity iteration:

Code:


        if ( !bGrenadePresent )
                pNadeTracer->Clear();


Screenshot (with iMaxLength set to 500):







onClick="if (this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display != '')
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = '';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = 'none';
this.value = 'Hide Spoiler!';
}
else
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = 'none';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = '';
this.value = 'Show Spoiler!';
}" />








Aucun commentaire:

Enregistrer un commentaire