mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 12:26:44 +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
				
			
		|  | @ -35,7 +35,7 @@ opencs_hdrs_noqt (model/world | |||
| 
 | ||||
| 
 | ||||
| opencs_units (model/tools | ||||
|     tools reportmodel mergeoperation  | ||||
|     tools reportmodel mergeoperation | ||||
|     ) | ||||
| 
 | ||||
| opencs_units_noqt (model/tools | ||||
|  | @ -90,7 +90,7 @@ opencs_units (view/render | |||
| 
 | ||||
| opencs_units_noqt (view/render | ||||
|     lighting lightingday lightingnight | ||||
|     lightingbright object cell terrainstorage tagbase cellarrow | ||||
|     lightingbright object cell terrainstorage tagbase cellarrow cellmarker | ||||
|     ) | ||||
| 
 | ||||
| opencs_hdrs_noqt (view/render | ||||
|  | @ -192,6 +192,7 @@ endif(APPLE) | |||
| target_link_libraries(openmw-cs | ||||
|     ${OSG_LIBRARIES} | ||||
|     ${OPENTHREADS_LIBRARIES} | ||||
|     ${OSGTEXT_LIBRARIES} | ||||
|     ${OSGUTIL_LIBRARIES} | ||||
|     ${OSGVIEWER_LIBRARIES} | ||||
|     ${OSGGA_LIBRARIES} | ||||
|  |  | |||
|  | @ -70,6 +70,8 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, osg::Group* rootNode, const std::st | |||
|     mCellNode = new osg::Group; | ||||
|     rootNode->addChild(mCellNode); | ||||
| 
 | ||||
|     setCellMarker(); | ||||
| 
 | ||||
|     if (!mDeleted) | ||||
|     { | ||||
|         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 | ||||
| { | ||||
|     return mCoordinates; | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ | |||
| 
 | ||||
| #include "object.hpp" | ||||
| #include "cellarrow.hpp" | ||||
| #include "cellmarker.hpp" | ||||
| 
 | ||||
| class QModelIndex; | ||||
| 
 | ||||
|  | @ -42,6 +43,7 @@ namespace CSVRender | |||
|             std::auto_ptr<Terrain::TerrainGrid> mTerrain; | ||||
|             CSMWorld::CellCoordinates mCoordinates; | ||||
|             std::auto_ptr<CellArrow> mCellArrows[4]; | ||||
|             std::auto_ptr<CellMarker> mCellMarker; | ||||
|             bool mDeleted; | ||||
| 
 | ||||
|             /// Ignored if cell does not have an object with the given ID.
 | ||||
|  | @ -105,6 +107,9 @@ namespace CSVRender | |||
| 
 | ||||
|             void setCellArrows (int mask); | ||||
| 
 | ||||
|             /// \brief Set marker for this cell.
 | ||||
|             void setCellMarker(); | ||||
| 
 | ||||
|             /// Returns 0, 0 in case of an unpaged cell.
 | ||||
|             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