/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2018 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see
*/
#pragma once
#include
#include
#include
#include
#include
namespace osgEarth
{
using namespace osgEarth;
using namespace osgEarth::Util;
struct ViewpointsGUI : public ImGuiPanel
{
osg::observer_ptr _mapNode;
float _duration;
bool _initialized;
std::vector _viewpoints;
ViewpointsGUI() :
ImGuiPanel("Viewpoints"),
_initialized(false)
{
}
void draw(osg::RenderInfo& ri)
{
if (!isVisible())
return;
if (!findNodeOrHide(_mapNode, ri))
return;
if (!_initialized)
{
Config conf = _mapNode->getConfig();
for (auto& i : conf.children())
{
if (i.key() == "viewpoints")
{
_duration = i.value("time", 1.0f);
auto key = 0;
for (auto& j : i.children("viewpoint"))
{
_viewpoints.push_back(Viewpoint(j));
// warning, if viewpoints:map_keys == true, this will conflict.
if (false) //key < 9)
{
EventRouter::get(view(ri)).onKeyPress(
(osgGA::GUIEventAdapter::KeySymbol)((int)osgGA::GUIEventAdapter::KEY_1 + key),
[&, key](...) {
auto manip = dynamic_cast(view(ri)->getCameraManipulator());
if (manip)
manip->setViewpoint(_viewpoints[key]);
});
key++;
}
}
}
}
_initialized = true;
}
if (ImGui::Begin(name(), visible()))
{
OE_SOFT_ASSERT_AND_RETURN(view(ri), void());
auto manip = dynamic_cast(view(ri)->getCameraManipulator());
if (manip)
{
if (_viewpoints.empty())
ImGui::TextColored(ImVec4(1, .9, .9, 1), "No viewpoints");
for (auto& vp : _viewpoints)
{
ImGui::PushID(&vp);
bool selected = false;
std::string name = vp.name().get();
if (name.empty())
{
name = "";
}
if (manip)
{
ImGui::Selectable(name.c_str(), &selected);
if (selected)
manip->setViewpoint(vp, _duration);
}
else
{
ImGui::TextColored(ImVec4(.5, .5, .5, 1), name.c_str());
}
ImGui::PopID();
ImGui::Separator();
}
#if 0
ImGui::Separator();
ImGuiLTable::Begin("viewpoints-settings");
{
double xmin, xmax;
manip->getSettings()->getAutoViewpointDurationLimits(xmin, xmax);
if (ImGuiLTable::SliderDouble("Min fly time (s)", &xmin, 0.0, 4.0, "%.1lf"))
manip->getSettings()->setAutoViewpointDurationLimits(xmin, xmax);
if (ImGuiLTable::SliderDouble("Max fly time (s)", &xmax, xmin, 10.0, "%.1lf"))
manip->getSettings()->setAutoViewpointDurationLimits(xmin, xmax);
}
ImGuiLTable::End();
#endif
static bool show_xml = false;
ImGui::Checkbox("XML dump", &show_xml);
if (show_xml)
{
std::stringstream buf;
Util::XmlDocument xml(manip->getViewpoint().getConfig());
xml.store(buf);
std::string xml_str = buf.str();
xml_str = xml_str.substr(xml_str.find(""));
ImGui::InputTextMultiline("##vp_xml", (char*)xml_str.c_str(), xml_str.size(), ImVec2(-1, -1), ImGuiInputTextFlags_ReadOnly);
}
}
else
{
ImGui::TextColored(ImVec4(1, .9, .9, 1), "(Viewpoints not active)");
}
ImGui::End();
}
}
};
}