mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-22 02:24:17 +00:00
7ae4b39574
- 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
100 lines
2.5 KiB
C++
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]);
|
|
}
|
|
}
|