Render cell markers
Adds rendering of cell markers. Markers are displayed at center of cell and contain cell's coordinates.move
parent
40f4a9811e
commit
a34a08c212
@ -0,0 +1,62 @@
|
|||||||
|
#include "cellmarker.hpp"
|
||||||
|
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
#include <osg/AutoTransform>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Group>
|
||||||
|
#include <osgText/Text>
|
||||||
|
|
||||||
|
void CSVRender::CellMarker::buildMarker()
|
||||||
|
{
|
||||||
|
const int characterSize = 20;
|
||||||
|
|
||||||
|
// Set up marker text containing cell's coordinates.
|
||||||
|
osg::ref_ptr<osgText::Text> markerText (new osgText::Text);
|
||||||
|
markerText->setBackdropType(osgText::Text::OUTLINE);
|
||||||
|
markerText->setLayout(osgText::Text::LEFT_TO_RIGHT);
|
||||||
|
markerText->setCharacterSize(characterSize);
|
||||||
|
std::string coordinatesText =
|
||||||
|
"#" + boost::lexical_cast<std::string>(mCoordinates.getX()) +
|
||||||
|
" " + boost::lexical_cast<std::string>(mCoordinates.getY());
|
||||||
|
markerText->setText(coordinatesText);
|
||||||
|
|
||||||
|
// Add text to marker node.
|
||||||
|
osg::ref_ptr<osg::Geode> geode (new osg::Geode);
|
||||||
|
geode->addDrawable(markerText);
|
||||||
|
mMarkerNode->addChild(geode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::CellMarker::positionMarker()
|
||||||
|
{
|
||||||
|
const int cellSize = 8192;
|
||||||
|
const int markerHeight = 0;
|
||||||
|
|
||||||
|
// Move marker to center of cell.
|
||||||
|
int x = (mCoordinates.getX() * cellSize) + (cellSize / 2);
|
||||||
|
int y = (mCoordinates.getY() * cellSize) + (cellSize / 2);
|
||||||
|
mMarkerNode->setPosition(osg::Vec3f(x, y, markerHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVRender::CellMarker::CellMarker(
|
||||||
|
osg::Group *cellNode,
|
||||||
|
const CSMWorld::CellCoordinates& coordinates
|
||||||
|
) : mCellNode(cellNode),
|
||||||
|
mCoordinates(coordinates)
|
||||||
|
{
|
||||||
|
// Set up node for cell marker.
|
||||||
|
mMarkerNode = new osg::AutoTransform();
|
||||||
|
mMarkerNode->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);
|
||||||
|
mMarkerNode->setAutoScaleToScreen(true);
|
||||||
|
mMarkerNode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
mCellNode->addChild(mMarkerNode);
|
||||||
|
|
||||||
|
buildMarker();
|
||||||
|
positionMarker();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVRender::CellMarker::~CellMarker()
|
||||||
|
{
|
||||||
|
mCellNode->removeChild(mMarkerNode);
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef OPENCS_VIEW_CELLMARKER_H
|
||||||
|
#define OPENCS_VIEW_CELLMARKER_H
|
||||||
|
|
||||||
|
#include <osg/ref_ptr>
|
||||||
|
|
||||||
|
#include "../../model/world/cellcoordinates.hpp"
|
||||||
|
|
||||||
|
namespace osg
|
||||||
|
{
|
||||||
|
class AutoTransform;
|
||||||
|
class Group;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSVRender
|
||||||
|
{
|
||||||
|
/// \brief Marker to display cell coordinates.
|
||||||
|
class CellMarker
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
osg::Group* mCellNode;
|
||||||
|
osg::ref_ptr<osg::AutoTransform> mMarkerNode;
|
||||||
|
CSMWorld::CellCoordinates mCoordinates;
|
||||||
|
|
||||||
|
// Not implemented.
|
||||||
|
CellMarker(const CellMarker&);
|
||||||
|
CellMarker& operator=(const CellMarker&);
|
||||||
|
|
||||||
|
/// \brief Build marker containing cell's coordinates.
|
||||||
|
void buildMarker();
|
||||||
|
|
||||||
|
/// \brief Position marker above center of cell.
|
||||||
|
void positionMarker();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// \brief Constructor.
|
||||||
|
/// \param cellNode Cell to create marker for.
|
||||||
|
/// \param coordinates Coordinates of cell.
|
||||||
|
CellMarker(
|
||||||
|
osg::Group *cellNode,
|
||||||
|
const CSMWorld::CellCoordinates& coordinates);
|
||||||
|
|
||||||
|
~CellMarker();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue