mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-29 03:26:38 +00:00 
			
		
		
		
	cell border markers
This commit is contained in:
		
							parent
							
								
									ebaeabc962
								
							
						
					
					
						commit
						7fb6807e65
					
				
					 5 changed files with 157 additions and 1 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 cellmarker |     lightingbright object cell terrainstorage tagbase cellarrow cellmarker cellborder | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| opencs_hdrs_noqt (view/render | opencs_hdrs_noqt (view/render | ||||||
|  |  | ||||||
|  | @ -93,6 +93,9 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, osg::Group* rootNode, const std::st | ||||||
|                 mTerrain.reset(new Terrain::TerrainGrid(mCellNode, data.getResourceSystem().get(), NULL, new TerrainStorage(mData), Mask_Terrain)); |                 mTerrain.reset(new Terrain::TerrainGrid(mCellNode, data.getResourceSystem().get(), NULL, new TerrainStorage(mData), Mask_Terrain)); | ||||||
|                 mTerrain->loadCell(esmLand.mX, |                 mTerrain->loadCell(esmLand.mX, | ||||||
|                                    esmLand.mY); |                                    esmLand.mY); | ||||||
|  | 
 | ||||||
|  |                 mCellBorder.reset(new CellBorder(mCellNode, mCoordinates)); | ||||||
|  |                 mCellBorder->buildShape(esmLand); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| #include "object.hpp" | #include "object.hpp" | ||||||
| #include "cellarrow.hpp" | #include "cellarrow.hpp" | ||||||
| #include "cellmarker.hpp" | #include "cellmarker.hpp" | ||||||
|  | #include "cellborder.hpp" | ||||||
| 
 | 
 | ||||||
| class QModelIndex; | class QModelIndex; | ||||||
| 
 | 
 | ||||||
|  | @ -44,6 +45,7 @@ namespace CSVRender | ||||||
|             CSMWorld::CellCoordinates mCoordinates; |             CSMWorld::CellCoordinates mCoordinates; | ||||||
|             std::auto_ptr<CellArrow> mCellArrows[4]; |             std::auto_ptr<CellArrow> mCellArrows[4]; | ||||||
|             std::auto_ptr<CellMarker> mCellMarker; |             std::auto_ptr<CellMarker> mCellMarker; | ||||||
|  |             std::auto_ptr<CellBorder> mCellBorder; | ||||||
|             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.
 | ||||||
|  |  | ||||||
							
								
								
									
										97
									
								
								apps/opencs/view/render/cellborder.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								apps/opencs/view/render/cellborder.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | #include "cellborder.hpp" | ||||||
|  | 
 | ||||||
|  | #include <osg/Group> | ||||||
|  | #include <osg/PositionAttitudeTransform> | ||||||
|  | #include <osg/Geode> | ||||||
|  | #include <osg/Geometry> | ||||||
|  | #include <osg/PrimitiveSet> | ||||||
|  | 
 | ||||||
|  | #include <components/esm/loadland.hpp> | ||||||
|  | 
 | ||||||
|  | #include "mask.hpp" | ||||||
|  | 
 | ||||||
|  | #include "../../model/world/cellcoordinates.hpp" | ||||||
|  | 
 | ||||||
|  | const int CSVRender::CellBorder::CellSize = ESM::Land::REAL_SIZE; | ||||||
|  | const int CSVRender::CellBorder::VertexCount = (ESM::Land::LAND_SIZE * 4) - 3; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | CSVRender::CellBorder::CellBorder(osg::Group* cellNode, const CSMWorld::CellCoordinates& coords) | ||||||
|  |     : mParentNode(cellNode) | ||||||
|  | { | ||||||
|  |     mBaseNode = new osg::PositionAttitudeTransform(); | ||||||
|  |     mBaseNode->setNodeMask(Mask_CellBorder); | ||||||
|  |     mBaseNode->setPosition(osg::Vec3f(coords.getX() * CellSize, coords.getY() * CellSize, 10)); | ||||||
|  | 
 | ||||||
|  |     mParentNode->addChild(mBaseNode); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CSVRender::CellBorder::~CellBorder() | ||||||
|  | { | ||||||
|  |     mParentNode->removeChild(mBaseNode); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CSVRender::CellBorder::buildShape(const ESM::Land& esmLand) | ||||||
|  | { | ||||||
|  |     const ESM::Land::LandData* landData = esmLand.getLandData(ESM::Land::DATA_VHGT); | ||||||
|  | 
 | ||||||
|  |     if (!landData) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry(); | ||||||
|  | 
 | ||||||
|  |     // Vertices
 | ||||||
|  |     osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(); | ||||||
|  | 
 | ||||||
|  |     int x = 0, y = 0; | ||||||
|  |     for (; x < ESM::Land::LAND_SIZE; ++x) | ||||||
|  |         vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); | ||||||
|  | 
 | ||||||
|  |     x = ESM::Land::LAND_SIZE - 1; | ||||||
|  |     for (; y < ESM::Land::LAND_SIZE; ++y) | ||||||
|  |         vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); | ||||||
|  | 
 | ||||||
|  |     y = ESM::Land::LAND_SIZE - 1; | ||||||
|  |     for (; x >= 0; --x) | ||||||
|  |         vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); | ||||||
|  | 
 | ||||||
|  |     x = 0; | ||||||
|  |     for (; y >= 0; --y) | ||||||
|  |         vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); | ||||||
|  | 
 | ||||||
|  |     geometry->setVertexArray(vertices); | ||||||
|  | 
 | ||||||
|  |     // Color
 | ||||||
|  |     osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array(); | ||||||
|  |     colors->push_back(osg::Vec4f(0.f, 0.5f, 0.f, 1.f)); | ||||||
|  | 
 | ||||||
|  |     geometry->setColorArray(colors); | ||||||
|  |     geometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET); | ||||||
|  | 
 | ||||||
|  |     // Primitive
 | ||||||
|  |     osg::ref_ptr<osg::DrawElementsUShort> primitives = | ||||||
|  |         new osg::DrawElementsUShort(osg::PrimitiveSet::LINE_STRIP, VertexCount+1); | ||||||
|  | 
 | ||||||
|  |     for (size_t i = 0; i < VertexCount; ++i) | ||||||
|  |         primitives->setElement(i, i); | ||||||
|  | 
 | ||||||
|  |     primitives->setElement(VertexCount, 0); | ||||||
|  | 
 | ||||||
|  |     geometry->addPrimitiveSet(primitives); | ||||||
|  |     geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     osg::ref_ptr<osg::Geode> geode = new osg::Geode(); | ||||||
|  |     geode->addDrawable(geometry); | ||||||
|  |     mBaseNode->addChild(geode); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | size_t CSVRender::CellBorder::landIndex(int x, int y) | ||||||
|  | { | ||||||
|  |     return y * ESM::Land::LAND_SIZE + x; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float CSVRender::CellBorder::scaleToWorld(int value) | ||||||
|  | { | ||||||
|  |     return (CellSize + 128) * (float)value / ESM::Land::LAND_SIZE; | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								apps/opencs/view/render/cellborder.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								apps/opencs/view/render/cellborder.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | #ifndef OPENCS_VIEW_CELLBORDER_H | ||||||
|  | #define OPENCS_VIEW_CELLBORDER_H | ||||||
|  | 
 | ||||||
|  | #include <cstddef> | ||||||
|  | 
 | ||||||
|  | #include <osg/ref_ptr> | ||||||
|  | 
 | ||||||
|  | namespace osg | ||||||
|  | { | ||||||
|  |     class Group; | ||||||
|  |     class PositionAttitudeTransform; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | namespace ESM | ||||||
|  | { | ||||||
|  |     struct Land; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | namespace CSMWorld | ||||||
|  | { | ||||||
|  |     class CellCoordinates; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | namespace CSVRender | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     class CellBorder | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  | 
 | ||||||
|  |         CellBorder(osg::Group* cellNode, const CSMWorld::CellCoordinates& coords); | ||||||
|  |         ~CellBorder(); | ||||||
|  | 
 | ||||||
|  |         void buildShape(const ESM::Land& esmLand); | ||||||
|  | 
 | ||||||
|  |     private: | ||||||
|  | 
 | ||||||
|  |         static const int CellSize; | ||||||
|  |         static const int VertexCount; | ||||||
|  | 
 | ||||||
|  |         size_t landIndex(int x, int y); | ||||||
|  |         float scaleToWorld(int val); | ||||||
|  | 
 | ||||||
|  |         // unimplemented
 | ||||||
|  |         CellBorder(const CellBorder&); | ||||||
|  |         CellBorder& operator=(const CellBorder&); | ||||||
|  | 
 | ||||||
|  |         osg::Group* mParentNode; | ||||||
|  |         osg::ref_ptr<osg::PositionAttitudeTransform> mBaseNode; | ||||||
|  | 
 | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
		Reference in a new issue