colobot/colobot-base/ui/mainmap.cpp

401 lines
9.1 KiB
C++

/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2023, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
#include "ui/mainmap.h"
#include "app/app.h"
#include "graphics/engine/engine.h"
#include "level/robotmain.h"
#include "ui/controls/interface.h"
#include "ui/controls/map.h"
#include "ui/controls/scroll.h"
#include "ui/controls/slider.h"
#include "ui/controls/window.h"
namespace Ui
{
const float ZOOM_MIN = 1.0f;
const float ZOOM_MAX = 16.0f;
// Constructor of the application card.
CMainMap::CMainMap()
{
m_interface = CRobotMain::GetInstancePointer()->GetInterface();
m_event = CApplication::GetInstancePointer()->GetEventQueue();
m_engine = Gfx::CEngine::GetInstancePointer();
m_bFixImage = false;
}
// Destructor of the application card.
CMainMap::~CMainMap()
{
}
// Created the mini-map and the corresponding buttons.
void CMainMap::CreateMap()
{
CWindow* pw;
glm::vec2 pos, dim;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
{
pos.x = 0.0f;
pos.y = 0.0f;
dim.x = 0.0f;
dim.y = 0.0f;
pw = m_interface->CreateWindows(pos, dim, 10, EVENT_WINDOW1);
}
dim.x = 10.0f / 640.0f;
dim.y = 10.0f / 480.0f;
pos.x = 10.0f / 640.0f;
pos.y = 10.0f / 480.0f;
pw->CreateMap (pos, dim, 2, EVENT_OBJECT_MAP);
pw->CreateSlider(pos, dim, 0, EVENT_OBJECT_MAPZOOM);
DimMap();
}
// Indicates whether the mini-map should display a still image.
void CMainMap::SetFixImage(const char *filename)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
pw->DeleteControl(EVENT_OBJECT_MAPZOOM);
m_bFixImage = true;
pm->SetFixImage(filename);
}
// Choosing colors of soil and water for the mini-map.
void CMainMap::FloorColorMap(Gfx::Color floor, Gfx::Color water)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
{
pm->SetFloorColor(floor);
pm->SetWaterColor(water);
}
}
// Shows or hides the minimap.
void CMainMap::ShowMap(bool bShow)
{
CWindow* pw;
CMap* pm;
CSlider* ps;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
pm->SetState(STATE_VISIBLE, bShow);
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps != nullptr)
ps->SetState(STATE_VISIBLE, bShow);
if (bShow)
{
DimMap();
}
}
// Dimensions of the mini-map.
void CMainMap::DimMap()
{
CWindow* pw;
CMap* pm;
CSlider* ps;
glm::vec2 pos, dim;
float value;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
dim.x = 100.0f/640.0f;
dim.y = 100.0f/480.0f;
pos.x = 540.0f/640.0f;
pos.y = 0.0f/480.0f;
pm->SetPos(pos);
pm->SetDim(dim);
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps != nullptr)
{
dim.x = SCROLL_WIDTH;
dim.y = 66.0f / 480.0f;
pos.x = 523.0f / 640.0f;
pos.y = 3.0f / 480.0f;
ps->SetPos(pos);
ps->SetDim(dim);
value = pm->GetZoom();
value = (value-ZOOM_MIN) / (ZOOM_MAX-ZOOM_MIN);
value = powf(value, 0.5f);
ps->SetVisibleValue(value);
ps->SetArrowStep(0.2f);
}
}
// Returns the current zoom of the minimap.
float CMainMap::GetZoomMap()
{
CWindow* pw;
CMap* pm;
CSlider* ps;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return ZOOM_MIN;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return ZOOM_MIN;
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps == nullptr)
return ZOOM_MIN;
return pm->GetZoom();
}
// Zoom the mini-map of any factor.
void CMainMap::ZoomMap(float zoom)
{
CWindow* pw;
CMap* pm;
CSlider* ps;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps == nullptr)
return;
if (zoom < ZOOM_MIN)
zoom = ZOOM_MIN;
if (zoom > ZOOM_MAX)
zoom = ZOOM_MAX;
pm->SetZoom(zoom);
DimMap();
}
// The mini-map zoom depending on the slider.
void CMainMap::ZoomMap()
{
CWindow* pw;
CMap* pm;
CSlider* ps;
float zoom;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps == nullptr)
return;
zoom = ps->GetVisibleValue();
zoom = powf(zoom, 2.0f);
zoom = ZOOM_MIN+zoom*(ZOOM_MAX - ZOOM_MIN);
pm->SetZoom(zoom);
DimMap();
}
// Enables or disables the card.
void CMainMap::MapEnable(bool bEnable)
{
CWindow* pw;
CMap* pm;
CSlider* ps;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
pm->SetEnable(bEnable);
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
if (ps != nullptr)
ps->SetState(STATE_ENABLE, bEnable);
}
// Specifies the type of icon for the selected object.
void CMainMap::SetToy(bool bToy)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
pm->SetToy(bToy);
}
// Specifies the parameters when using a still image.
void CMainMap::SetFixParam(float zoom, float ox, float oy, float angle,
int mode, bool bDebug)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return;
pm->SetZoom(zoom);
pm->SetOffset(ox, oy);
pm->SetAngle(angle);
pm->SetMode(mode);
pm->SetDebug(bDebug);
}
// Updates the mini-map following to a change of terrain.
void CMainMap::UpdateMap()
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
pm->UpdateTerrain();
}
// Indicates whether the mini-map displays a still image.
bool CMainMap::GetFixImage()
{
return m_bFixImage;
}
// The object is detected in the mini-map.
CObject* CMainMap::DetectMap(const glm::vec2& pos, bool &bInMap)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return nullptr;
bInMap = false;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm == nullptr)
return nullptr;
return pm->DetectObject(pos, bInMap);
}
// Indicates the object with the mouse hovers over.
void CMainMap::SetHighlight(CObject* pObj)
{
CWindow* pw;
CMap* pm;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
if (pw == nullptr)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
pm->SetHighlight(pObj);
}
}