mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-21 11:53:53 +00:00
Merge remote-tracking branch 'rcutmore/feature-3043'
This commit is contained in:
commit
dad38d901c
5 changed files with 180 additions and 2 deletions
|
@ -90,7 +90,7 @@ opencs_units (view/render
|
||||||
|
|
||||||
opencs_units_noqt (view/render
|
opencs_units_noqt (view/render
|
||||||
lighting lightingday lightingnight
|
lighting lightingday lightingnight
|
||||||
lightingbright object cell terrainstorage tagbase cellarrow
|
lightingbright object cell terrainstorage tagbase cellarrow cellmarker
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_hdrs_noqt (view/render
|
opencs_hdrs_noqt (view/render
|
||||||
|
@ -192,6 +192,7 @@ endif(APPLE)
|
||||||
target_link_libraries(openmw-cs
|
target_link_libraries(openmw-cs
|
||||||
${OSG_LIBRARIES}
|
${OSG_LIBRARIES}
|
||||||
${OPENTHREADS_LIBRARIES}
|
${OPENTHREADS_LIBRARIES}
|
||||||
|
${OSGTEXT_LIBRARIES}
|
||||||
${OSGUTIL_LIBRARIES}
|
${OSGUTIL_LIBRARIES}
|
||||||
${OSGVIEWER_LIBRARIES}
|
${OSGVIEWER_LIBRARIES}
|
||||||
${OSGGA_LIBRARIES}
|
${OSGGA_LIBRARIES}
|
||||||
|
|
|
@ -70,6 +70,8 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, osg::Group* rootNode, const std::st
|
||||||
mCellNode = new osg::Group;
|
mCellNode = new osg::Group;
|
||||||
rootNode->addChild(mCellNode);
|
rootNode->addChild(mCellNode);
|
||||||
|
|
||||||
|
setCellMarker();
|
||||||
|
|
||||||
if (!mDeleted)
|
if (!mDeleted)
|
||||||
{
|
{
|
||||||
CSMWorld::IdTable& references = dynamic_cast<CSMWorld::IdTable&> (
|
CSMWorld::IdTable& references = dynamic_cast<CSMWorld::IdTable&> (
|
||||||
|
@ -303,6 +305,17 @@ void CSVRender::Cell::setCellArrows (int mask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVRender::Cell::setCellMarker()
|
||||||
|
{
|
||||||
|
bool cellExists = false;
|
||||||
|
int cellIndex = mData.getCells().searchId(mId);
|
||||||
|
if (cellIndex > -1)
|
||||||
|
{
|
||||||
|
cellExists = !mData.getCells().getRecord(cellIndex).isDeleted();
|
||||||
|
}
|
||||||
|
mCellMarker.reset(new CellMarker(mCellNode, mCoordinates, cellExists));
|
||||||
|
}
|
||||||
|
|
||||||
CSMWorld::CellCoordinates CSVRender::Cell::getCoordinates() const
|
CSMWorld::CellCoordinates CSVRender::Cell::getCoordinates() const
|
||||||
{
|
{
|
||||||
return mCoordinates;
|
return mCoordinates;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "object.hpp"
|
#include "object.hpp"
|
||||||
#include "cellarrow.hpp"
|
#include "cellarrow.hpp"
|
||||||
|
#include "cellmarker.hpp"
|
||||||
|
|
||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ namespace CSVRender
|
||||||
std::auto_ptr<Terrain::TerrainGrid> mTerrain;
|
std::auto_ptr<Terrain::TerrainGrid> mTerrain;
|
||||||
CSMWorld::CellCoordinates mCoordinates;
|
CSMWorld::CellCoordinates mCoordinates;
|
||||||
std::auto_ptr<CellArrow> mCellArrows[4];
|
std::auto_ptr<CellArrow> mCellArrows[4];
|
||||||
|
std::auto_ptr<CellMarker> mCellMarker;
|
||||||
bool mDeleted;
|
bool mDeleted;
|
||||||
|
|
||||||
/// Ignored if cell does not have an object with the given ID.
|
/// Ignored if cell does not have an object with the given ID.
|
||||||
|
@ -105,6 +107,9 @@ namespace CSVRender
|
||||||
|
|
||||||
void setCellArrows (int mask);
|
void setCellArrows (int mask);
|
||||||
|
|
||||||
|
/// \brief Set marker for this cell.
|
||||||
|
void setCellMarker();
|
||||||
|
|
||||||
/// Returns 0, 0 in case of an unpaged cell.
|
/// Returns 0, 0 in case of an unpaged cell.
|
||||||
CSMWorld::CellCoordinates getCoordinates() const;
|
CSMWorld::CellCoordinates getCoordinates() const;
|
||||||
|
|
||||||
|
|
91
apps/opencs/view/render/cellmarker.cpp
Normal file
91
apps/opencs/view/render/cellmarker.cpp
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include "cellmarker.hpp"
|
||||||
|
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
#include <osg/AutoTransform>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Group>
|
||||||
|
#include <osgText/Text>
|
||||||
|
|
||||||
|
#include "mask.hpp"
|
||||||
|
|
||||||
|
CSVRender::CellMarkerTag::CellMarkerTag(CellMarker *marker)
|
||||||
|
: TagBase(Mask_CellMarker), mMarker(marker)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CSVRender::CellMarker *CSVRender::CellMarkerTag::getCellMarker() const
|
||||||
|
{
|
||||||
|
return mMarker;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::CellMarker::buildMarker()
|
||||||
|
{
|
||||||
|
const int characterSize = 20;
|
||||||
|
|
||||||
|
// Set up attributes of marker text.
|
||||||
|
osg::ref_ptr<osgText::Text> markerText (new osgText::Text);
|
||||||
|
markerText->setLayout(osgText::Text::LEFT_TO_RIGHT);
|
||||||
|
markerText->setCharacterSize(characterSize);
|
||||||
|
markerText->setAlignment(osgText::Text::CENTER_CENTER);
|
||||||
|
markerText->setDrawMode(osgText::Text::TEXT | osgText::Text::FILLEDBOUNDINGBOX);
|
||||||
|
|
||||||
|
// If cell exists then show black bounding box otherwise show red.
|
||||||
|
if (mExists)
|
||||||
|
{
|
||||||
|
markerText->setBoundingBoxColor(osg::Vec4f(0.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
markerText->setBoundingBoxColor(osg::Vec4f(1.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add text containing cell's coordinates.
|
||||||
|
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,
|
||||||
|
const bool cellExists
|
||||||
|
) : mCellNode(cellNode),
|
||||||
|
mCoordinates(coordinates),
|
||||||
|
mExists(cellExists)
|
||||||
|
{
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
mMarkerNode->setUserData(new CellMarkerTag(this));
|
||||||
|
mMarkerNode->setNodeMask(Mask_CellMarker);
|
||||||
|
|
||||||
|
mCellNode->addChild(mMarkerNode);
|
||||||
|
|
||||||
|
buildMarker();
|
||||||
|
positionMarker();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVRender::CellMarker::~CellMarker()
|
||||||
|
{
|
||||||
|
mCellNode->removeChild(mMarkerNode);
|
||||||
|
}
|
68
apps/opencs/view/render/cellmarker.hpp
Normal file
68
apps/opencs/view/render/cellmarker.hpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#ifndef OPENCS_VIEW_CELLMARKER_H
|
||||||
|
#define OPENCS_VIEW_CELLMARKER_H
|
||||||
|
|
||||||
|
#include "tagbase.hpp"
|
||||||
|
|
||||||
|
#include <osg/ref_ptr>
|
||||||
|
|
||||||
|
#include "../../model/world/cellcoordinates.hpp"
|
||||||
|
|
||||||
|
namespace osg
|
||||||
|
{
|
||||||
|
class AutoTransform;
|
||||||
|
class Group;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSVRender
|
||||||
|
{
|
||||||
|
class CellMarker;
|
||||||
|
|
||||||
|
class CellMarkerTag : public TagBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
CellMarker *mMarker;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CellMarkerTag(CellMarker *marker);
|
||||||
|
|
||||||
|
CellMarker *getCellMarker() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \brief Marker to display cell coordinates.
|
||||||
|
class CellMarker
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
osg::Group* mCellNode;
|
||||||
|
osg::ref_ptr<osg::AutoTransform> mMarkerNode;
|
||||||
|
CSMWorld::CellCoordinates mCoordinates;
|
||||||
|
bool mExists;
|
||||||
|
|
||||||
|
// Not implemented.
|
||||||
|
CellMarker(const CellMarker&);
|
||||||
|
CellMarker& operator=(const CellMarker&);
|
||||||
|
|
||||||
|
/// \brief Build marker containing cell's coordinates.
|
||||||
|
void buildMarker();
|
||||||
|
|
||||||
|
/// \brief Position marker at center of cell.
|
||||||
|
void positionMarker();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// \brief Constructor.
|
||||||
|
/// \param cellNode Cell to create marker for.
|
||||||
|
/// \param coordinates Coordinates of cell.
|
||||||
|
/// \param cellExists Whether or not cell exists.
|
||||||
|
CellMarker(
|
||||||
|
osg::Group *cellNode,
|
||||||
|
const CSMWorld::CellCoordinates& coordinates,
|
||||||
|
const bool cellExists);
|
||||||
|
|
||||||
|
~CellMarker();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue