2023-08-14 14:52:17 +00:00
|
|
|
#include "map_grid.h"
|
|
|
|
|
|
|
|
#include <engine/keys.h>
|
|
|
|
|
|
|
|
#include "editor.h"
|
|
|
|
|
2023-11-11 17:12:10 +00:00
|
|
|
static constexpr int MIN_GRID_FACTOR = 1;
|
|
|
|
static constexpr int MAX_GRID_FACTOR = 15;
|
|
|
|
|
2023-08-14 14:52:17 +00:00
|
|
|
void CMapGrid::OnReset()
|
|
|
|
{
|
|
|
|
m_GridActive = false;
|
|
|
|
m_GridFactor = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMapGrid::OnRender(CUIRect View)
|
|
|
|
{
|
|
|
|
if(!m_GridActive)
|
|
|
|
return;
|
|
|
|
|
|
|
|
std::shared_ptr<CLayerGroup> pGroup = Editor()->GetSelectedGroup();
|
|
|
|
if(pGroup)
|
|
|
|
{
|
|
|
|
pGroup->MapScreen();
|
|
|
|
|
|
|
|
float aGroupPoints[4];
|
|
|
|
pGroup->Mapping(aGroupPoints);
|
|
|
|
|
2023-08-27 09:38:15 +00:00
|
|
|
const CUIRect *pScreen = UI()->Screen();
|
2023-08-14 14:52:17 +00:00
|
|
|
|
|
|
|
int LineDistance = GridLineDistance();
|
|
|
|
|
|
|
|
int XOffset = aGroupPoints[0] / LineDistance;
|
|
|
|
int YOffset = aGroupPoints[1] / LineDistance;
|
|
|
|
int XGridOffset = XOffset % m_GridFactor;
|
|
|
|
int YGridOffset = YOffset % m_GridFactor;
|
|
|
|
|
|
|
|
Graphics()->TextureClear();
|
|
|
|
Graphics()->LinesBegin();
|
|
|
|
|
2023-08-27 09:38:15 +00:00
|
|
|
for(int i = 0; i < (int)pScreen->w; i++)
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
|
|
|
if((i + YGridOffset) % m_GridFactor == 0)
|
|
|
|
Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f);
|
|
|
|
else
|
|
|
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f);
|
|
|
|
|
2023-08-27 09:38:15 +00:00
|
|
|
IGraphics::CLineItem Line = IGraphics::CLineItem(LineDistance * XOffset, LineDistance * i + LineDistance * YOffset, pScreen->w + aGroupPoints[2], LineDistance * i + LineDistance * YOffset);
|
2023-08-14 14:52:17 +00:00
|
|
|
Graphics()->LinesDraw(&Line, 1);
|
|
|
|
|
|
|
|
if((i + XGridOffset) % m_GridFactor == 0)
|
|
|
|
Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f);
|
|
|
|
else
|
|
|
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f);
|
|
|
|
|
2023-08-27 09:38:15 +00:00
|
|
|
Line = IGraphics::CLineItem(LineDistance * i + LineDistance * XOffset, LineDistance * YOffset, LineDistance * i + LineDistance * XOffset, pScreen->h + aGroupPoints[3]);
|
2023-08-14 14:52:17 +00:00
|
|
|
Graphics()->LinesDraw(&Line, 1);
|
|
|
|
}
|
|
|
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
Graphics()->LinesEnd();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int CMapGrid::GridLineDistance() const
|
|
|
|
{
|
|
|
|
if(Editor()->MapView()->Zoom()->GetValue() <= 100.0f)
|
|
|
|
return 16;
|
|
|
|
else if(Editor()->MapView()->Zoom()->GetValue() <= 250.0f)
|
|
|
|
return 32;
|
|
|
|
else if(Editor()->MapView()->Zoom()->GetValue() <= 450.0f)
|
|
|
|
return 64;
|
|
|
|
else if(Editor()->MapView()->Zoom()->GetValue() <= 850.0f)
|
|
|
|
return 128;
|
|
|
|
else if(Editor()->MapView()->Zoom()->GetValue() <= 1550.0f)
|
|
|
|
return 256;
|
|
|
|
else
|
|
|
|
return 512;
|
|
|
|
}
|
|
|
|
|
2023-10-06 11:02:56 +00:00
|
|
|
void CMapGrid::SnapToGrid(float &x, float &y) const
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
|
|
|
const int GridDistance = GridLineDistance() * m_GridFactor;
|
|
|
|
x = (int)((x + (x >= 0 ? 1.0f : -1.0f) * GridDistance / 2) / GridDistance) * GridDistance;
|
|
|
|
y = (int)((y + (y >= 0 ? 1.0f : -1.0f) * GridDistance / 2) / GridDistance) * GridDistance;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CMapGrid::IsEnabled() const
|
|
|
|
{
|
|
|
|
return m_GridActive;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMapGrid::Toggle()
|
|
|
|
{
|
|
|
|
m_GridActive = !m_GridActive;
|
|
|
|
}
|
|
|
|
|
2023-11-17 20:52:39 +00:00
|
|
|
int CMapGrid::Factor() const
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
|
|
|
return m_GridFactor;
|
|
|
|
}
|
|
|
|
|
2023-11-11 17:12:10 +00:00
|
|
|
void CMapGrid::SetFactor(int Factor)
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
2023-11-11 17:12:10 +00:00
|
|
|
m_GridFactor = clamp(Factor, MIN_GRID_FACTOR, MAX_GRID_FACTOR);
|
2023-08-14 14:52:17 +00:00
|
|
|
}
|
|
|
|
|
2023-11-11 17:12:10 +00:00
|
|
|
void CMapGrid::DoSettingsPopup(vec2 Position)
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
2023-11-11 17:12:10 +00:00
|
|
|
UI()->DoPopupMenu(&m_PopupGridSettingsId, Position.x, Position.y, 120.0f, 37.0f, this, PopupGridSettings);
|
2023-08-14 14:52:17 +00:00
|
|
|
}
|
|
|
|
|
2023-11-11 17:12:10 +00:00
|
|
|
CUI::EPopupMenuFunctionResult CMapGrid::PopupGridSettings(void *pContext, CUIRect View, bool Active)
|
2023-08-14 14:52:17 +00:00
|
|
|
{
|
2023-11-11 17:12:10 +00:00
|
|
|
CMapGrid *pMapGrid = static_cast<CMapGrid *>(pContext);
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
PROP_SIZE = 0,
|
|
|
|
NUM_PROPS,
|
|
|
|
};
|
|
|
|
CProperty aProps[] = {
|
|
|
|
{"Size", pMapGrid->Factor(), PROPTYPE_INT_STEP, MIN_GRID_FACTOR, MAX_GRID_FACTOR},
|
|
|
|
{nullptr},
|
|
|
|
};
|
|
|
|
|
|
|
|
static int s_aIds[NUM_PROPS];
|
|
|
|
int NewVal;
|
|
|
|
int Prop = pMapGrid->Editor()->DoProperties(&View, aProps, s_aIds, &NewVal);
|
|
|
|
|
|
|
|
if(Prop == PROP_SIZE)
|
|
|
|
{
|
|
|
|
pMapGrid->SetFactor(NewVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
CUIRect Button;
|
|
|
|
View.HSplitBottom(12.0f, &View, &Button);
|
|
|
|
|
|
|
|
static char s_DefaultButton;
|
|
|
|
if(pMapGrid->Editor()->DoButton_Ex(&s_DefaultButton, "Default", 0, &Button, 0, "Normal grid size", IGraphics::CORNER_ALL))
|
|
|
|
{
|
|
|
|
pMapGrid->SetFactor(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return CUI::POPUP_KEEP_OPEN;
|
2023-08-14 14:52:17 +00:00
|
|
|
}
|