mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 22:48:18 +00:00
started writing map background in menu
This commit is contained in:
parent
b52144fef8
commit
fcabed11b4
|
@ -45,6 +45,14 @@ public:
|
||||||
operator const T* () { return &x; }
|
operator const T* () { return &x; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline vector2_base<T> rotate(const vector2_base<T> &a, float angle)
|
||||||
|
{
|
||||||
|
angle = angle * 3.1415926535897932384626433f / 180.0f;
|
||||||
|
float s = sin(angle);
|
||||||
|
float c = cos(angle);
|
||||||
|
return vector2_base<T>((T)(c*a.x - s*a.y), (T)(s*a.x + c*a.y));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T length(const vector2_base<T> &a)
|
inline T length(const vector2_base<T> &a)
|
||||||
|
|
|
@ -19,6 +19,9 @@ protected:
|
||||||
float m_GameIntraTick;
|
float m_GameIntraTick;
|
||||||
float m_GameTickTime;
|
float m_GameTickTime;
|
||||||
|
|
||||||
|
int m_CurMenuTick;
|
||||||
|
int64 m_MenuStartTime;
|
||||||
|
|
||||||
int m_PredTick;
|
int m_PredTick;
|
||||||
float m_PredIntraTick;
|
float m_PredIntraTick;
|
||||||
|
|
||||||
|
@ -61,6 +64,7 @@ public:
|
||||||
// tick time access
|
// tick time access
|
||||||
inline int PrevGameTick() const { return m_PrevGameTick; }
|
inline int PrevGameTick() const { return m_PrevGameTick; }
|
||||||
inline int GameTick() const { return m_CurGameTick; }
|
inline int GameTick() const { return m_CurGameTick; }
|
||||||
|
inline int MenuTick() const { return m_CurMenuTick; }
|
||||||
inline int PredGameTick() const { return m_PredTick; }
|
inline int PredGameTick() const { return m_PredTick; }
|
||||||
inline float IntraGameTick() const { return m_GameIntraTick; }
|
inline float IntraGameTick() const { return m_GameIntraTick; }
|
||||||
inline float PredIntraGameTick() const { return m_PredIntraTick; }
|
inline float PredIntraGameTick() const { return m_PredIntraTick; }
|
||||||
|
@ -85,6 +89,8 @@ public:
|
||||||
// networking
|
// networking
|
||||||
virtual void EnterGame() = 0;
|
virtual void EnterGame() = 0;
|
||||||
|
|
||||||
|
virtual void LoadBackgroundMap(const char *pName, const char *pFilename) = 0;
|
||||||
|
virtual bool MapLoaded() = 0;
|
||||||
//
|
//
|
||||||
virtual int MapDownloadAmount() = 0;
|
virtual int MapDownloadAmount() = 0;
|
||||||
virtual int MapDownloadTotalsize() = 0;
|
virtual int MapDownloadTotalsize() = 0;
|
||||||
|
|
|
@ -497,6 +497,7 @@ void CClient::OnEnterGame()
|
||||||
m_CurrentRecvTick = 0;
|
m_CurrentRecvTick = 0;
|
||||||
m_CurGameTick = 0;
|
m_CurGameTick = 0;
|
||||||
m_PrevGameTick = 0;
|
m_PrevGameTick = 0;
|
||||||
|
m_CurMenuTick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CClient::EnterGame()
|
void CClient::EnterGame()
|
||||||
|
@ -774,6 +775,24 @@ void CClient::Render()
|
||||||
DebugRender();
|
DebugRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CClient::MapLoaded()
|
||||||
|
{
|
||||||
|
return m_pMap->IsLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CClient::LoadBackgroundMap(const char *pName, const char *pFilename)
|
||||||
|
{
|
||||||
|
if(!m_pMap->Load(pFilename))
|
||||||
|
return;
|
||||||
|
|
||||||
|
char aBuf[256];
|
||||||
|
str_format(aBuf, sizeof(aBuf), "loaded map '%s'", pFilename);
|
||||||
|
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf);
|
||||||
|
|
||||||
|
str_copy(m_aCurrentMap, pName, sizeof(m_aCurrentMap));
|
||||||
|
m_CurrentMapCrc = m_pMap->Crc();
|
||||||
|
}
|
||||||
|
|
||||||
const char *CClient::LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc)
|
const char *CClient::LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc)
|
||||||
{
|
{
|
||||||
static char aErrorMsg[128];
|
static char aErrorMsg[128];
|
||||||
|
@ -1716,6 +1735,8 @@ void CClient::Run()
|
||||||
atexit(SDL_Quit); // ignore_convention
|
atexit(SDL_Quit); // ignore_convention
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_MenuStartTime = time_get();
|
||||||
|
|
||||||
// init graphics
|
// init graphics
|
||||||
{
|
{
|
||||||
if(g_Config.m_GfxThreaded)
|
if(g_Config.m_GfxThreaded)
|
||||||
|
@ -1935,6 +1956,14 @@ void CClient::Run()
|
||||||
if(State() == IClient::STATE_QUITING)
|
if(State() == IClient::STATE_QUITING)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// menu tick
|
||||||
|
if(State() == IClient::STATE_OFFLINE)
|
||||||
|
{
|
||||||
|
int64 t = time_get();
|
||||||
|
while(t > TickStartTime(m_CurMenuTick+1))
|
||||||
|
m_CurMenuTick++;
|
||||||
|
}
|
||||||
|
|
||||||
// beNice
|
// beNice
|
||||||
if(g_Config.m_DbgStress)
|
if(g_Config.m_DbgStress)
|
||||||
thread_sleep(5);
|
thread_sleep(5);
|
||||||
|
@ -1980,6 +2009,10 @@ void CClient::Run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64 CClient::TickStartTime(int Tick)
|
||||||
|
{
|
||||||
|
return m_MenuStartTime + (time_freq()*Tick)/m_GameTickSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
void CClient::Con_Connect(IConsole::IResult *pResult, void *pUserData)
|
void CClient::Con_Connect(IConsole::IResult *pResult, void *pUserData)
|
||||||
{
|
{
|
||||||
|
|
|
@ -181,6 +181,8 @@ class CClient : public IClient, public CDemoPlayer::IListner
|
||||||
static void GraphicsThreadProxy(void *pThis) { ((CClient*)pThis)->GraphicsThread(); }
|
static void GraphicsThreadProxy(void *pThis) { ((CClient*)pThis)->GraphicsThread(); }
|
||||||
void GraphicsThread();
|
void GraphicsThread();
|
||||||
|
|
||||||
|
int64 TickStartTime(int Tick);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IEngine *Engine() { return m_pEngine; }
|
IEngine *Engine() { return m_pEngine; }
|
||||||
IEngineGraphics *Graphics() { return m_pGraphics; }
|
IEngineGraphics *Graphics() { return m_pGraphics; }
|
||||||
|
@ -252,6 +254,8 @@ public:
|
||||||
|
|
||||||
virtual const char *ErrorString();
|
virtual const char *ErrorString();
|
||||||
|
|
||||||
|
bool MapLoaded();
|
||||||
|
void LoadBackgroundMap(const char *pName, const char *pFilename);
|
||||||
const char *LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc);
|
const char *LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc);
|
||||||
const char *LoadMapSearch(const char *pMapName, int WantedCrc);
|
const char *LoadMapSearch(const char *pMapName, int WantedCrc);
|
||||||
|
|
||||||
|
|
|
@ -13,48 +13,61 @@
|
||||||
CCamera::CCamera()
|
CCamera::CCamera()
|
||||||
{
|
{
|
||||||
m_CamType = CAMTYPE_UNDEFINED;
|
m_CamType = CAMTYPE_UNDEFINED;
|
||||||
|
m_RotationCenter = vec2(0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCamera::OnRender()
|
void CCamera::OnRender()
|
||||||
{
|
{
|
||||||
//vec2 center;
|
if(Client()->State() != IClient::STATE_OFFLINE)
|
||||||
m_Zoom = 1.0f;
|
|
||||||
|
|
||||||
// update camera center
|
|
||||||
if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition)
|
|
||||||
{
|
{
|
||||||
if(m_CamType != CAMTYPE_SPEC)
|
m_Zoom = 1.0f;
|
||||||
|
|
||||||
|
// update camera center
|
||||||
|
if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition)
|
||||||
{
|
{
|
||||||
m_pClient->m_pControls->m_MousePos = m_PrevCenter;
|
if(m_CamType != CAMTYPE_SPEC)
|
||||||
m_pClient->m_pControls->ClampMousePos();
|
{
|
||||||
m_CamType = CAMTYPE_SPEC;
|
m_pClient->m_pControls->m_MousePos = m_PrevCenter;
|
||||||
|
m_pClient->m_pControls->ClampMousePos();
|
||||||
|
m_CamType = CAMTYPE_SPEC;
|
||||||
|
}
|
||||||
|
m_Center = m_pClient->m_pControls->m_MousePos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(m_CamType != CAMTYPE_PLAYER)
|
||||||
|
{
|
||||||
|
m_pClient->m_pControls->ClampMousePos();
|
||||||
|
m_CamType = CAMTYPE_PLAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 CameraOffset(0, 0);
|
||||||
|
|
||||||
|
float l = length(m_pClient->m_pControls->m_MousePos);
|
||||||
|
if(l > 0.0001f) // make sure that this isn't 0
|
||||||
|
{
|
||||||
|
float DeadZone = g_Config.m_ClMouseDeadzone;
|
||||||
|
float FollowFactor = g_Config.m_ClMouseFollowfactor/100.0f;
|
||||||
|
float OffsetAmount = max(l-DeadZone, 0.0f) * FollowFactor;
|
||||||
|
|
||||||
|
CameraOffset = normalize(m_pClient->m_pControls->m_MousePos)*OffsetAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_pClient->m_Snap.m_SpecInfo.m_Active)
|
||||||
|
m_Center = m_pClient->m_Snap.m_SpecInfo.m_Position + CameraOffset;
|
||||||
|
else
|
||||||
|
m_Center = m_pClient->m_LocalCharacterPos + CameraOffset;
|
||||||
}
|
}
|
||||||
m_Center = m_pClient->m_pControls->m_MousePos;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(m_CamType != CAMTYPE_PLAYER)
|
m_Zoom = 0.7f;
|
||||||
{
|
|
||||||
m_pClient->m_pControls->ClampMousePos();
|
|
||||||
m_CamType = CAMTYPE_PLAYER;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 CameraOffset(0, 0);
|
// do little rotation
|
||||||
|
static vec2 Dir = vec2(1.0f, 0.0f);
|
||||||
float l = length(m_pClient->m_pControls->m_MousePos);
|
float RotPerTick = 18.0f * Client()->FrameTime(); // 20 sec for one rotation (18° per sec)
|
||||||
if(l > 0.0001f) // make sure that this isn't 0
|
Dir = rotate(Dir, RotPerTick);
|
||||||
{
|
m_Center = m_RotationCenter+Dir*30.0f;
|
||||||
float DeadZone = g_Config.m_ClMouseDeadzone;
|
|
||||||
float FollowFactor = g_Config.m_ClMouseFollowfactor/100.0f;
|
|
||||||
float OffsetAmount = max(l-DeadZone, 0.0f) * FollowFactor;
|
|
||||||
|
|
||||||
CameraOffset = normalize(m_pClient->m_pControls->m_MousePos)*OffsetAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_pClient->m_Snap.m_SpecInfo.m_Active)
|
|
||||||
m_Center = m_pClient->m_Snap.m_SpecInfo.m_Position + CameraOffset;
|
|
||||||
else
|
|
||||||
m_Center = m_pClient->m_LocalCharacterPos + CameraOffset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_PrevCenter = m_Center;
|
m_PrevCenter = m_Center;
|
||||||
|
|
|
@ -19,6 +19,7 @@ class CCamera : public CComponent
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vec2 m_Center;
|
vec2 m_Center;
|
||||||
|
vec2 m_RotationCenter;
|
||||||
float m_Zoom;
|
float m_Zoom;
|
||||||
|
|
||||||
CCamera();
|
CCamera();
|
||||||
|
|
|
@ -98,7 +98,7 @@ void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void
|
||||||
|
|
||||||
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
|
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
|
||||||
}
|
}
|
||||||
else
|
else if(pThis->Client()->State() != IClient::STATE_OFFLINE)
|
||||||
{
|
{
|
||||||
if(pThis->m_pClient->m_Snap.m_pGameInfoObj && !(pThis->m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
|
if(pThis->m_pClient->m_Snap.m_pGameInfoObj && !(pThis->m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
|
||||||
{
|
{
|
||||||
|
@ -114,11 +114,16 @@ void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void
|
||||||
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
|
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
|
||||||
s_LastLocalTime = pThis->Client()->LocalTime();
|
s_LastLocalTime = pThis->Client()->LocalTime();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Time = pThis->Client()->MenuTick() / (float)pThis->Client()->GameTickSpeed();
|
||||||
|
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, Time, pChannels);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLayers::OnRender()
|
void CMapLayers::OnRender()
|
||||||
{
|
{
|
||||||
if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
|
if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK && !Client()->MapLoaded())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CUIRect Screen;
|
CUIRect Screen;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <game/generated/protocol.h>
|
#include <game/generated/protocol.h>
|
||||||
|
|
||||||
#include <game/generated/client_data.h>
|
#include <game/generated/client_data.h>
|
||||||
|
#include <game/client/components/camera.h>
|
||||||
#include <game/client/components/sounds.h>
|
#include <game/client/components/sounds.h>
|
||||||
#include <game/client/gameclient.h>
|
#include <game/client/gameclient.h>
|
||||||
#include <game/client/lineinput.h>
|
#include <game/client/lineinput.h>
|
||||||
|
@ -541,6 +542,7 @@ int CMenus::RenderMenubar(CUIRect r)
|
||||||
static int s_InternetButton=0;
|
static int s_InternetButton=0;
|
||||||
if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL) && m_ActivePage!=PAGE_INTERNET)
|
if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL) && m_ActivePage!=PAGE_INTERNET)
|
||||||
{
|
{
|
||||||
|
m_pClient->m_pCamera->m_RotationCenter = vec2(500.0f, 500.0f);
|
||||||
ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
|
ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
|
||||||
NewPage = PAGE_INTERNET;
|
NewPage = PAGE_INTERNET;
|
||||||
}
|
}
|
||||||
|
@ -550,6 +552,7 @@ int CMenus::RenderMenubar(CUIRect r)
|
||||||
static int s_LanButton=0;
|
static int s_LanButton=0;
|
||||||
if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage==PAGE_LAN, &Button, 0) && m_ActivePage!=PAGE_LAN)
|
if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage==PAGE_LAN, &Button, 0) && m_ActivePage!=PAGE_LAN)
|
||||||
{
|
{
|
||||||
|
m_pClient->m_pCamera->m_RotationCenter = vec2(1000.0f, 1000.0f);
|
||||||
ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
|
ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
|
||||||
NewPage = PAGE_LAN;
|
NewPage = PAGE_LAN;
|
||||||
}
|
}
|
||||||
|
@ -559,6 +562,7 @@ int CMenus::RenderMenubar(CUIRect r)
|
||||||
static int s_FavoritesButton=0;
|
static int s_FavoritesButton=0;
|
||||||
if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage==PAGE_FAVORITES, &Button, CUI::CORNER_TR) && m_ActivePage!=PAGE_FAVORITES)
|
if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage==PAGE_FAVORITES, &Button, CUI::CORNER_TR) && m_ActivePage!=PAGE_FAVORITES)
|
||||||
{
|
{
|
||||||
|
m_pClient->m_pCamera->m_RotationCenter = vec2(2000.0f, 500.0f);
|
||||||
ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
|
ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
|
||||||
NewPage = PAGE_FAVORITES;
|
NewPage = PAGE_FAVORITES;
|
||||||
}
|
}
|
||||||
|
@ -779,7 +783,7 @@ int CMenus::Render()
|
||||||
s_First = false;
|
s_First = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Client()->State() == IClient::STATE_ONLINE)
|
if(Client()->State() == IClient::STATE_ONLINE || Client()->MapLoaded())
|
||||||
{
|
{
|
||||||
ms_ColorTabbarInactive = ms_ColorTabbarInactiveIngame;
|
ms_ColorTabbarInactive = ms_ColorTabbarInactiveIngame;
|
||||||
ms_ColorTabbarActive = ms_ColorTabbarActiveIngame;
|
ms_ColorTabbarActive = ms_ColorTabbarActiveIngame;
|
||||||
|
|
|
@ -255,6 +255,8 @@ void CGameClient::OnInit()
|
||||||
for(int i = m_All.m_Num-1; i >= 0; --i)
|
for(int i = m_All.m_Num-1; i >= 0; --i)
|
||||||
m_All.m_paComponents[i]->OnInit();
|
m_All.m_paComponents[i]->OnInit();
|
||||||
|
|
||||||
|
Client()->LoadBackgroundMap("dm1", "maps/dm1.map");
|
||||||
|
|
||||||
// setup load amount// load textures
|
// setup load amount// load textures
|
||||||
for(int i = 0; i < g_pData->m_NumImages; i++)
|
for(int i = 0; i < g_pData->m_NumImages; i++)
|
||||||
{
|
{
|
||||||
|
@ -265,6 +267,13 @@ void CGameClient::OnInit()
|
||||||
for(int i = 0; i < m_All.m_Num; i++)
|
for(int i = 0; i < m_All.m_Num; i++)
|
||||||
m_All.m_paComponents[i]->OnReset();
|
m_All.m_paComponents[i]->OnReset();
|
||||||
|
|
||||||
|
m_Layers.Init(Kernel());
|
||||||
|
m_Collision.Init(Layers());
|
||||||
|
|
||||||
|
RenderTools()->RenderTilemapGenerateSkip(Layers());
|
||||||
|
|
||||||
|
m_pMapimages->OnMapLoad();
|
||||||
|
|
||||||
int64 End = time_get();
|
int64 End = time_get();
|
||||||
char aBuf[256];
|
char aBuf[256];
|
||||||
str_format(aBuf, sizeof(aBuf), "initialisation finished after %.2fms", ((End-Start)*1000)/(float)time_freq());
|
str_format(aBuf, sizeof(aBuf), "initialisation finished after %.2fms", ((End-Start)*1000)/(float)time_freq());
|
||||||
|
|
Loading…
Reference in a new issue