Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/gui/ObjectTypes/CMiniMap.cpp
Show All 30 Lines | |||||
#include "graphics/TerrainTextureManager.h" | #include "graphics/TerrainTextureManager.h" | ||||
#include "gui/CGUI.h" | #include "gui/CGUI.h" | ||||
#include "gui/GUIManager.h" | #include "gui/GUIManager.h" | ||||
#include "gui/GUIMatrix.h" | #include "gui/GUIMatrix.h" | ||||
#include "lib/bits.h" | #include "lib/bits.h" | ||||
#include "lib/external_libraries/libsdl.h" | #include "lib/external_libraries/libsdl.h" | ||||
#include "lib/ogl.h" | #include "lib/ogl.h" | ||||
#include "lib/timer.h" | #include "lib/timer.h" | ||||
#include "maths/MathUtil.h" | |||||
#include "ps/CLogger.h" | #include "ps/CLogger.h" | ||||
#include "ps/ConfigDB.h" | #include "ps/ConfigDB.h" | ||||
#include "ps/CStrInternStatic.h" | #include "ps/CStrInternStatic.h" | ||||
#include "ps/Filesystem.h" | #include "ps/Filesystem.h" | ||||
#include "ps/Game.h" | #include "ps/Game.h" | ||||
#include "ps/GameSetup/Config.h" | #include "ps/GameSetup/Config.h" | ||||
#include "ps/Profile.h" | #include "ps/Profile.h" | ||||
#include "ps/World.h" | #include "ps/World.h" | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | |||||
const CStr CMiniMap::EventNameWorldClick = "WorldClick"; | const CStr CMiniMap::EventNameWorldClick = "WorldClick"; | ||||
CMiniMap::CMiniMap(CGUI& pGUI) : | CMiniMap::CMiniMap(CGUI& pGUI) : | ||||
IGUIObject(pGUI), | IGUIObject(pGUI), | ||||
m_MapSize(0), m_MapScale(1.f), m_Mask(this, "mask", false), | m_MapSize(0), m_MapScale(1.f), m_Mask(this, "mask", false), | ||||
m_FlareTextureCount(this, "flare_texture_count", 0), m_FlareRenderSize(this, "flare_render_size", 0), | m_FlareTextureCount(this, "flare_texture_count", 0), m_FlareRenderSize(this, "flare_render_size", 0), | ||||
m_FlareInterleave(this, "flare_interleave", false), m_FlareAnimationSpeed(this, "flare_animation_speed", 0.0f), | m_FlareInterleave(this, "flare_interleave", false), m_FlareAnimationSpeed(this, "flare_animation_speed", 0.0f), | ||||
m_FlareLifetimeSeconds(this, "flare_lifetime_seconds", 0.0f) | m_FlareLifetimeSeconds(this, "flare_lifetime_seconds", 0.0f), | ||||
m_FlareStartFadeSeconds(this, "flare_start_fade_seconds", 0.0f), | |||||
m_FlareStopFadeSeconds(this, "flare_stop_fade_seconds", 0.0f) | |||||
{ | { | ||||
m_Clicking = false; | m_Clicking = false; | ||||
m_MouseHovering = false; | m_MouseHovering = false; | ||||
} | } | ||||
CMiniMap::~CMiniMap() = default; | CMiniMap::~CMiniMap() = default; | ||||
void CMiniMap::HandleMessage(SGUIMessage& Message) | void CMiniMap::HandleMessage(SGUIMessage& Message) | ||||
▲ Show 20 Lines • Show All 188 Lines • ▼ Show 20 Lines | if (m_FlareTextures.empty()) | ||||
return; | return; | ||||
const CVector2D flareCenter = WorldSpaceToMiniMapSpace(CVector3D(flare.pos.X, 0.0f, flare.pos.Y)); | const CVector2D flareCenter = WorldSpaceToMiniMapSpace(CVector3D(flare.pos.X, 0.0f, flare.pos.Y)); | ||||
const CRect destination( | const CRect destination( | ||||
flareCenter.X - m_FlareRenderSize, flareCenter.Y - m_FlareRenderSize, | flareCenter.X - m_FlareRenderSize, flareCenter.Y - m_FlareRenderSize, | ||||
flareCenter.X + m_FlareRenderSize, flareCenter.Y + m_FlareRenderSize); | flareCenter.X + m_FlareRenderSize, flareCenter.Y + m_FlareRenderSize); | ||||
const u32 flooredStep = floor((currentTime - flare.time) * m_FlareAnimationSpeed); | const double deltaTime = currentTime - flare.time; | ||||
const double remainingTime = m_FlareLifetimeSeconds - deltaTime; | |||||
const u32 flooredStep = floor(deltaTime * m_FlareAnimationSpeed); | |||||
const float startFadeAlpha = m_FlareStartFadeSeconds > 0.0f ? deltaTime / m_FlareStartFadeSeconds : 1.0f; | |||||
const float stopFadeAlpha = m_FlareStopFadeSeconds > 0.0f ? remainingTime / m_FlareStopFadeSeconds : 1.0f; | |||||
const float alpha = Clamp(std::min( | |||||
SmoothStep(0.0f, 1.0f, startFadeAlpha), SmoothStep(0.0f, 1.0f, stopFadeAlpha)), | |||||
0.0f, 1.0f); | |||||
CTexturePtr texture = m_FlareTextures[flooredStep % m_FlareTextures.size()]; | DrawFlareFrame(canvas, flooredStep % m_FlareTextures.size(), destination, flare.color, alpha); | ||||
// TODO: Only draw inside the minimap circle. | |||||
canvas.DrawTexture(texture, destination, CRect(0, 0, texture->GetWidth(), texture->GetHeight()), flare.color, CColor(0.0f, 0.0f, 0.0f, 0.0f), 0.0f); | |||||
// Draw a second circle if the first has reached half of the animation | // Draw a second circle if the first has reached half of the animation. | ||||
if (m_FlareInterleave && flooredStep >= m_FlareTextures.size() / 2) | if (m_FlareInterleave && flooredStep >= m_FlareTextures.size() / 2) | ||||
{ | { | ||||
texture = m_FlareTextures[(flooredStep - m_FlareTextures.size() / 2) % m_FlareTextures.size()]; | DrawFlareFrame(canvas, (flooredStep - m_FlareTextures.size() / 2) % m_FlareTextures.size(), | ||||
// TODO: Only draw inside the minimap circle. | destination, flare.color, alpha); | ||||
canvas.DrawTexture(texture, destination, CRect(0, 0, texture->GetWidth(), texture->GetHeight()), flare.color, CColor(0.0f, 0.0f, 0.0f, 0.0f), 0.0f); | } | ||||
} | } | ||||
void CMiniMap::DrawFlareFrame(CCanvas2D& canvas, const u32 frameIndex, | |||||
const CRect& destination, const CColor& color, float alpha) const | |||||
{ | |||||
// TODO: Only draw inside the minimap circle. | |||||
CTexturePtr texture = m_FlareTextures[frameIndex % m_FlareTextures.size()]; | |||||
CColor finalColor = color; | |||||
finalColor.a *= alpha; | |||||
canvas.DrawTexture(texture, destination, | |||||
CRect(0, 0, texture->GetWidth(), texture->GetHeight()), finalColor, | |||||
CColor(0.0f, 0.0f, 0.0f, 0.0f), 0.0f); | |||||
} | } | ||||
void CMiniMap::Draw(CCanvas2D& canvas) | void CMiniMap::Draw(CCanvas2D& canvas) | ||||
{ | { | ||||
PROFILE3("render minimap"); | PROFILE3("render minimap"); | ||||
// The terrain isn't actually initialized until the map is loaded, which | // The terrain isn't actually initialized until the map is loaded, which | ||||
// happens when the game is started, so abort until then. | // happens when the game is started, so abort until then. | ||||
▲ Show 20 Lines • Show All 76 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator