174 lines
5.0 KiB
C++
174 lines
5.0 KiB
C++
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
|
*
|
|
* This library is open source and may be redistributed and/or modified under
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
* included with this distribution, and on the openscenegraph.org website.
|
|
*
|
|
* This library 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
|
|
* OpenSceneGraph Public License for more details.
|
|
*/
|
|
|
|
#include <osgViewer/HelpHandler>
|
|
|
|
#include <osg/PolygonMode>
|
|
|
|
#include <osgText/Text>
|
|
|
|
using namespace osgViewer;
|
|
|
|
HelpHandler::HelpHandler(osg::ApplicationUsage* au):
|
|
_applicationUsage(au),
|
|
_keyEventTogglesOnScreenHelp('h'),
|
|
_helpEnabled(false)
|
|
{
|
|
}
|
|
|
|
bool HelpHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
|
|
{
|
|
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
|
|
if (!viewer) return false;
|
|
|
|
switch(ea.getEventType())
|
|
{
|
|
case(osgGA::GUIEventAdapter::KEYDOWN):
|
|
{
|
|
if (ea.getKey()==_keyEventTogglesOnScreenHelp)
|
|
{
|
|
if (!_camera.valid())
|
|
{
|
|
setUpHUDCamera(viewer);
|
|
setUpScene(viewer);
|
|
}
|
|
|
|
_helpEnabled = !_helpEnabled;
|
|
|
|
if (_helpEnabled)
|
|
{
|
|
_camera->setNodeMask(0xffffffff);
|
|
}
|
|
else
|
|
{
|
|
_camera->setNodeMask(0);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
default: break;
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
void HelpHandler::setUpHUDCamera(osgViewer::Viewer* viewer)
|
|
{
|
|
osgViewer::Viewer::Windows windows;
|
|
viewer->getWindows(windows);
|
|
|
|
if (windows.empty()) return;
|
|
|
|
osgViewer::GraphicsWindow* window = windows.front();
|
|
|
|
_camera = new osg::Camera;
|
|
_camera->setGraphicsContext(window);
|
|
_camera->setViewport(0, 0, window->getTraits()->width, window->getTraits()->height);
|
|
|
|
_camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1280,0,1024));
|
|
_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
|
|
_camera->setViewMatrix(osg::Matrix::identity());
|
|
|
|
// only clear the depth buffer
|
|
_camera->setClearMask(0);
|
|
|
|
viewer->setUpRenderingSupport();
|
|
}
|
|
|
|
void HelpHandler::setUpScene(osgViewer::Viewer* viewer)
|
|
{
|
|
_switch = new osg::Switch;
|
|
|
|
_camera->addChild(_switch.get());
|
|
|
|
osg::StateSet* stateset = _switch->getOrCreateStateSet();
|
|
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
|
|
stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
|
|
stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
|
|
stateset->setAttribute(new osg::PolygonMode(), osg::StateAttribute::PROTECTED);
|
|
|
|
std::string font("fonts/arial.ttf");
|
|
|
|
if (!_applicationUsage) setApplicationUsage(new osg::ApplicationUsage());
|
|
|
|
viewer->getUsage(*_applicationUsage);
|
|
|
|
float leftPos = 10.0f;
|
|
float startDescription = 200.0f;
|
|
float characterSize = 20.0f;
|
|
|
|
osg::Vec3 pos(leftPos,1000.0f,0.0f);
|
|
osg::Vec4 color(1.0f,1.0f,1.0f,1.0f);
|
|
|
|
osg::Geode* geode = new osg::Geode();
|
|
_switch->addChild(geode, true);
|
|
|
|
// application description
|
|
if (!_applicationUsage->getDescription().empty())
|
|
{
|
|
|
|
osg::ref_ptr<osgText::Text> label = new osgText::Text;
|
|
geode->addDrawable( label.get() );
|
|
|
|
label->setColor(color);
|
|
label->setBackdropType(osgText::Text::OUTLINE);
|
|
label->setFont(font);
|
|
label->setCharacterSize(characterSize);
|
|
label->setPosition(pos);
|
|
label->setText(_applicationUsage->getDescription());
|
|
|
|
pos.x() = label->getBound().xMax();
|
|
pos.y() -= characterSize*2.5f;
|
|
}
|
|
|
|
const osg::ApplicationUsage::UsageMap& keyboardBinding = _applicationUsage->getKeyboardMouseBindings();
|
|
|
|
for(osg::ApplicationUsage::UsageMap::const_iterator itr = keyboardBinding.begin();
|
|
itr != keyboardBinding.end();
|
|
++itr)
|
|
{
|
|
pos.x() = leftPos;
|
|
|
|
osg::ref_ptr<osgText::Text> key = new osgText::Text;
|
|
geode->addDrawable( key.get() );
|
|
key->setColor(color);
|
|
key->setBackdropType(osgText::Text::OUTLINE);
|
|
key->setFont(font);
|
|
key->setCharacterSize(characterSize);
|
|
key->setPosition(pos);
|
|
key->setText(itr->first);
|
|
|
|
pos.x() = startDescription;
|
|
|
|
osg::ref_ptr<osgText::Text> description = new osgText::Text;
|
|
geode->addDrawable( description.get() );
|
|
description->setColor(color);
|
|
description->setBackdropType(osgText::Text::OUTLINE);
|
|
description->setFont(font);
|
|
description->setCharacterSize(characterSize);
|
|
description->setPosition(pos);
|
|
|
|
description->setText(itr->second);
|
|
|
|
pos.y() -= characterSize*1.5f;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void HelpHandler::getUsage(osg::ApplicationUsage& usage) const
|
|
{
|
|
usage.addKeyboardMouseBinding("h","Onscreen help.");
|
|
}
|