mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-03 23:56:43 +00:00 
			
		
		
		
	Incorporate terrain height to labels and camera.
This commit is contained in:
		
							parent
							
								
									bfd10a03c0
								
							
						
					
					
						commit
						3e5027abbb
					
				
					 3 changed files with 33 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -214,3 +214,11 @@ bool CSVRender::Cell::referenceAdded (const QModelIndex& parent, int start, int
 | 
			
		|||
 | 
			
		||||
    return addObjects (start, end);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float CSVRender::Cell::getTerrainHeightAt(const Ogre::Vector3 &pos) const
 | 
			
		||||
{
 | 
			
		||||
    if(mTerrain.get() != NULL)
 | 
			
		||||
        return mTerrain->getHeightAt(pos);
 | 
			
		||||
    else
 | 
			
		||||
        return -std::numeric_limits<float>::max();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,6 +70,8 @@ namespace CSVRender
 | 
			
		|||
            /// \return Did this call result in a modification of the visual representation of
 | 
			
		||||
            /// this cell?
 | 
			
		||||
            bool referenceAdded (const QModelIndex& parent, int start, int end);
 | 
			
		||||
 | 
			
		||||
            float getTerrainHeightAt(const Ogre::Vector3 &pos) const;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,6 +68,7 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
 | 
			
		|||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // check if name or region field has changed
 | 
			
		||||
                // FIXME: config setting
 | 
			
		||||
                std::string name = cells.getRecord(index).get().mName;
 | 
			
		||||
                std::string region = cells.getRecord(index).get().mRegion;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -113,26 +114,34 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
 | 
			
		|||
        if (index > 0 && cells.getRecord (index).mState!=CSMWorld::RecordBase::State_Deleted &&
 | 
			
		||||
            mCells.find (*iter)==mCells.end())
 | 
			
		||||
        {
 | 
			
		||||
            Cell *cell = new Cell (mDocument.getData(), getSceneManager(), iter->getId (mWorldspace));
 | 
			
		||||
            mCells.insert (std::make_pair (*iter, cell));
 | 
			
		||||
 | 
			
		||||
            float height = cell->getTerrainHeightAt(Ogre::Vector3(
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getX() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              0));
 | 
			
		||||
            if (setCamera)
 | 
			
		||||
            {
 | 
			
		||||
                setCamera = false;
 | 
			
		||||
                getCamera()->setPosition (ESM::Land::REAL_SIZE * iter->getX() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                                          ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2, 0);
 | 
			
		||||
                getCamera()->setPosition (
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getX() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              height);
 | 
			
		||||
                // better camera position at the start
 | 
			
		||||
                getCamera()->move(getCamera()->getDirection() * -6000); // FIXME: config setting
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            mCells.insert (std::make_pair (*iter,
 | 
			
		||||
                new Cell (mDocument.getData(), getSceneManager(), iter->getId (mWorldspace))));
 | 
			
		||||
 | 
			
		||||
            Ogre::ManualObject* manual = getSceneManager()->createManualObject("manual" + iter->getId(mWorldspace));
 | 
			
		||||
 | 
			
		||||
            Ogre::ManualObject* manual =
 | 
			
		||||
                    getSceneManager()->createManualObject("manual" + iter->getId(mWorldspace));
 | 
			
		||||
            manual->begin("BaseWhite", Ogre::RenderOperation::OT_LINE_LIST);
 | 
			
		||||
 | 
			
		||||
            // define start and end point (x, y, z)
 | 
			
		||||
            // FIXME: need terrain height to get the correct starting point
 | 
			
		||||
            manual-> position(ESM::Land::REAL_SIZE * iter->getX() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2, 0);
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              height);
 | 
			
		||||
            manual-> position(ESM::Land::REAL_SIZE * iter->getX() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2, 2000);
 | 
			
		||||
                              ESM::Land::REAL_SIZE * iter->getY() + ESM::Land::REAL_SIZE/2,
 | 
			
		||||
                              height+2000); // FIXME: config setting
 | 
			
		||||
            manual->end();
 | 
			
		||||
            Ogre::MeshPtr meshPtr = manual->convertToMesh("vLine" + iter->getId(mWorldspace));
 | 
			
		||||
            Ogre::Entity* entity = getSceneManager()->createEntity(meshPtr);
 | 
			
		||||
| 
						 | 
				
			
			@ -142,12 +151,13 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
 | 
			
		|||
            // keep pointers so that they can be deleted later
 | 
			
		||||
            mEntities.insert(std::make_pair(*iter, entity));
 | 
			
		||||
 | 
			
		||||
            CSVRender::TextOverlay *textDisp = new CSVRender::TextOverlay(entity, getCamera(), iter->getId(mWorldspace));
 | 
			
		||||
            CSVRender::TextOverlay *textDisp =
 | 
			
		||||
                    new CSVRender::TextOverlay(entity, getCamera(), iter->getId(mWorldspace));
 | 
			
		||||
            textDisp->enable(true);
 | 
			
		||||
            textDisp->setCaption(iter->getId(mWorldspace));
 | 
			
		||||
            std::string desc = cells.getRecord(index).get().mName;
 | 
			
		||||
            if(desc == "") desc = cells.getRecord(index).get().mRegion;
 | 
			
		||||
            textDisp->setDesc(desc);
 | 
			
		||||
            textDisp->setDesc(desc); // FIXME: config setting
 | 
			
		||||
            textDisp->update();
 | 
			
		||||
            mTextOverlays.insert(std::make_pair(*iter, textDisp));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -185,12 +195,6 @@ void CSVRender::PagedWorldspaceWidget::mouseDoubleClickEvent (QMouseEvent *event
 | 
			
		|||
 | 
			
		||||
void CSVRender::PagedWorldspaceWidget::updateOverlay()
 | 
			
		||||
{
 | 
			
		||||
    // better camera position at the start
 | 
			
		||||
    if(getCamera()->getViewport() && getCamera()->getPosition().z < 1)
 | 
			
		||||
    {
 | 
			
		||||
        getCamera()->move(getCamera()->getDirection() * -6000);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ogre::OverlayManager &overlayMgr = Ogre::OverlayManager::getSingleton();
 | 
			
		||||
    Ogre::Overlay* overlay = overlayMgr.getByName("CellIDPanel");
 | 
			
		||||
    if(overlay && !mTextOverlays.empty())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue