ddnet/src/game/client/components/damageind.cpp
H-M-H 7ae4b39574 made recording demos work
- videorecorder only works for recording demos now
- demoplayer was modified to allow controll over the time that passed
  in order to get perfect fps, IVideo controlls how much time passed,
  basically every rendercall sets the time to record the next frame
2019-09-30 20:48:47 +08:00

100 lines
2.5 KiB
C++

/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#include <engine/demo.h>
#include <engine/graphics.h>
#include <game/generated/protocol.h>
#include <game/generated/client_data.h>
#include <game/gamecore.h> // get_angle
#include <game/client/ui.h>
#include <game/client/render.h>
#include "damageind.h"
CDamageInd::CDamageInd()
{
m_Lastupdate = 0;
m_NumItems = 0;
}
CDamageInd::CItem *CDamageInd::CreateI()
{
if(m_NumItems < MAX_ITEMS)
{
CItem *p = &m_aItems[m_NumItems];
m_NumItems++;
return p;
}
return 0;
}
void CDamageInd::DestroyI(CDamageInd::CItem *i)
{
m_NumItems--;
*i = m_aItems[m_NumItems];
}
void CDamageInd::Create(vec2 Pos, vec2 Dir)
{
CItem *i = CreateI();
if(i)
{
i->m_Pos = Pos;
i->m_StartTime = LocalTime();
i->m_Dir = Dir*-1;
i->m_StartAngle = (( (float)rand()/(float)RAND_MAX) - 1.0f) * 2.0f * pi;
}
}
void CDamageInd::OnRender()
{
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
static float s_LastLocalTime = LocalTime();
for(int i = 0; i < m_NumItems;)
{
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
if(pInfo->m_Paused)
m_aItems[i].m_StartTime += LocalTime()-s_LastLocalTime;
else
m_aItems[i].m_StartTime += (LocalTime()-s_LastLocalTime)*(1.0f-pInfo->m_Speed);
}
else
{
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
m_aItems[i].m_StartTime += LocalTime()-s_LastLocalTime;
}
float Life = 0.75f - (LocalTime() - m_aItems[i].m_StartTime);
if(Life < 0.0f)
DestroyI(&m_aItems[i]);
else
{
vec2 Pos = mix(m_aItems[i].m_Pos+m_aItems[i].m_Dir*75.0f, m_aItems[i].m_Pos, clamp((Life-0.60f)/0.15f, 0.0f, 1.0f));
Graphics()->SetColor(1.0f,1.0f,1.0f, Life/0.1f);
Graphics()->QuadsSetRotation(m_aItems[i].m_StartAngle + Life * 2.0f);
Graphics()->RenderQuadContainerAsSprite(m_DmgIndQuadContainerIndex, 0, Pos.x, Pos.y);
i++;
}
}
s_LastLocalTime = LocalTime();
}
void CDamageInd::OnInit()
{
Graphics()->QuadsSetRotation(0);
Graphics()->SetColor(1.f, 1.f, 1.f, 1.f);
m_DmgIndQuadContainerIndex = Graphics()->CreateQuadContainer();
RenderTools()->SelectSprite(SPRITE_STAR1);
RenderTools()->QuadContainerAddSprite(m_DmgIndQuadContainerIndex, 48.f);
}
void CDamageInd::Reset()
{
for(int i = 0; i < m_NumItems;)
{
DestroyI(&m_aItems[i]);
}
}