mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-01 04:36:41 +00:00
Visibility mask implemented. For testing rigged up 'M' and 'N' keys for show/hide.
The scenewidget doesn't receive any mouse events for about a second after toggling the visibility flag. No idea what is causing this.
This commit is contained in:
parent
dbb2781817
commit
e38417e662
6 changed files with 105 additions and 31 deletions
|
@ -8,8 +8,10 @@
|
||||||
#include <OgreCamera.h>
|
#include <OgreCamera.h>
|
||||||
#include <OgreSceneManager.h>
|
#include <OgreSceneManager.h>
|
||||||
#include <OgreManualObject.h>
|
#include <OgreManualObject.h>
|
||||||
#include <Overlay/OgreOverlayContainer.h> // FIXME
|
#include <Overlay/OgreOverlayContainer.h>
|
||||||
#include <OgreSceneQuery.h> // FIXME
|
#include <Overlay/OgreOverlayManager.h>
|
||||||
|
#include <OgreRoot.h>
|
||||||
|
#include <OgreSceneQuery.h>
|
||||||
#include <OgreEntity.h>
|
#include <OgreEntity.h>
|
||||||
|
|
||||||
#include "../../../../components/esm/loadland.hpp"
|
#include "../../../../components/esm/loadland.hpp"
|
||||||
|
@ -115,32 +117,88 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
|
||||||
|
|
||||||
void CSVRender::PagedWorldspaceWidget::mouseReleaseEvent (QMouseEvent *event)
|
void CSVRender::PagedWorldspaceWidget::mouseReleaseEvent (QMouseEvent *event)
|
||||||
{
|
{
|
||||||
//std::cout << "Qt x: " + std::to_string(event->x()) << ", y: " + std::to_string(event->y()) << std::endl;
|
|
||||||
|
|
||||||
int viewportWidth = getCamera()->getViewport()->getActualWidth();
|
|
||||||
int viewportHeight = getCamera()->getViewport()->getActualHeight();
|
|
||||||
|
|
||||||
Ogre::Ray mouseRay = getCamera()->getCameraToViewportRay(event->x()/viewportWidth, event->y()/viewportHeight);
|
|
||||||
Ogre::RaySceneQuery *rayScnQuery = getSceneManager()->createRayQuery(Ogre::Ray());
|
|
||||||
rayScnQuery->setRay(mouseRay);
|
|
||||||
Ogre::RaySceneQueryResult &result = rayScnQuery->execute();
|
|
||||||
Ogre::RaySceneQueryResult::iterator it = result.begin();
|
|
||||||
|
|
||||||
std::list<TextOverlay *>::iterator iter = mTextOverlays.begin();
|
std::list<TextOverlay *>::iterator iter = mTextOverlays.begin();
|
||||||
for(; iter != mTextOverlays.end(); ++iter)
|
for(; iter != mTextOverlays.end(); ++iter)
|
||||||
{
|
{
|
||||||
if((*iter)->isEnabled() && (*iter)->container().contains(event->x(), event->y()))
|
if(mDisplayCellCoord &&
|
||||||
|
(*iter)->isEnabled() && (*iter)->container().contains(event->x(), event->y()))
|
||||||
{
|
{
|
||||||
std::cout << "clicked: " << (*iter)->getCaption() << std::endl;
|
std::cout << "clicked: " << (*iter)->getCaption() << std::endl;
|
||||||
(*iter)->enable(false);
|
//(*iter)->enable(false); // FIXME: for testing only
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// mouse picking
|
||||||
|
int viewportWidth = getCamera()->getViewport()->getActualWidth();
|
||||||
|
int viewportHeight = getCamera()->getViewport()->getActualHeight();
|
||||||
|
|
||||||
|
Ogre::Ray mouseRay = getCamera()->getCameraToViewportRay((float)(event->x()/viewportWidth),
|
||||||
|
(float)(event->y()/viewportHeight));
|
||||||
|
Ogre::RaySceneQuery *rayScnQuery = getSceneManager()->createRayQuery(Ogre::Ray());
|
||||||
|
rayScnQuery->setRay(mouseRay);
|
||||||
|
rayScnQuery->setSortByDistance(true);
|
||||||
|
Ogre::RaySceneQueryResult result = rayScnQuery->execute();
|
||||||
|
|
||||||
|
Ogre::RaySceneQueryResult::iterator it = result.begin();
|
||||||
|
for (; it != result.end(); it++)
|
||||||
|
{
|
||||||
|
if(it->worldFragment)
|
||||||
|
{
|
||||||
|
// FIXME: just testing
|
||||||
|
std::string str;
|
||||||
|
if (it->worldFragment->fragmentType == Ogre::SceneQuery::WorldFragmentType::WFT_NONE)
|
||||||
|
str = "no world geometry hits";
|
||||||
|
else if (it->worldFragment->fragmentType == Ogre::SceneQuery::WorldFragmentType::WFT_PLANE_BOUNDED_REGION)
|
||||||
|
str = "pointers to convex plane-bounded regions";
|
||||||
|
else if (it->worldFragment->fragmentType == Ogre::SceneQuery::WorldFragmentType::WFT_SINGLE_INTERSECTION)
|
||||||
|
str = "single intersection point";
|
||||||
|
else if(it->worldFragment->fragmentType == Ogre::SceneQuery::WorldFragmentType::WFT_CUSTOM_GEOMETRY)
|
||||||
|
str = "custom geometry";
|
||||||
|
else if (it->worldFragment->fragmentType == Ogre::SceneQuery::WorldFragmentType::WFT_RENDER_OPERATION)
|
||||||
|
str = "general render operation structure";
|
||||||
|
|
||||||
|
std::cout << "fragment type: " << str << std::endl;
|
||||||
|
}
|
||||||
|
else if (it->movable)
|
||||||
|
{
|
||||||
|
// FIXME: just testing
|
||||||
|
it->movable->getParentSceneNode()->showBoundingBox(true);
|
||||||
|
|
||||||
|
std::cout << "movable object: " + it->movable->getName() << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
std::cout << "nothing: " << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
getSceneManager()->destroyQuery(rayScnQuery);
|
||||||
|
#endif
|
||||||
|
|
||||||
SceneWidget::mouseReleaseEvent(event);
|
SceneWidget::mouseReleaseEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVRender::PagedWorldspaceWidget::updateOverlay()
|
void CSVRender::PagedWorldspaceWidget::updateOverlay()
|
||||||
{
|
{
|
||||||
|
Ogre::OverlayManager &overlayMgr = Ogre::OverlayManager::getSingleton();
|
||||||
|
Ogre::Overlay* overlay = overlayMgr.getByName("CellIDPanel");
|
||||||
|
if(overlay && !mTextOverlays.empty())
|
||||||
|
{
|
||||||
|
if(getCamera()->getViewport())
|
||||||
|
{
|
||||||
|
if((uint32_t)getCamera()->getViewport()->getVisibilityMask()
|
||||||
|
& (uint32_t)CSVRender::Elements::Element_CellMarker)
|
||||||
|
{
|
||||||
|
mDisplayCellCoord = true;
|
||||||
|
overlay->show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mDisplayCellCoord = false;
|
||||||
|
overlay->hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!mTextOverlays.empty())
|
if(!mTextOverlays.empty())
|
||||||
{
|
{
|
||||||
std::list<CSVRender::TextOverlay *>::iterator it = mTextOverlays.begin();
|
std::list<CSVRender::TextOverlay *>::iterator it = mTextOverlays.begin();
|
||||||
|
@ -229,7 +287,8 @@ std::string CSVRender::PagedWorldspaceWidget::getStartupInstruction()
|
||||||
}
|
}
|
||||||
|
|
||||||
CSVRender::PagedWorldspaceWidget::PagedWorldspaceWidget (QWidget* parent, CSMDoc::Document& document)
|
CSVRender::PagedWorldspaceWidget::PagedWorldspaceWidget (QWidget* parent, CSMDoc::Document& document)
|
||||||
: WorldspaceWidget(document, parent), mDocument(document), mWorldspace("std::default"), mTextOverlays(0)
|
: WorldspaceWidget(document, parent), mDocument(document), mWorldspace("std::default"), mDisplayCellCoord(true)
|
||||||
|
, mTextOverlays(0)
|
||||||
{
|
{
|
||||||
QAbstractItemModel *cells =
|
QAbstractItemModel *cells =
|
||||||
document.getData().getTableModel (CSMWorld::UniversalId::Type_Cells);
|
document.getData().getTableModel (CSMWorld::UniversalId::Type_Cells);
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace CSVRender
|
||||||
std::map<CSMWorld::CellCoordinates, Cell *> mCells;
|
std::map<CSMWorld::CellCoordinates, Cell *> mCells;
|
||||||
std::string mWorldspace;
|
std::string mWorldspace;
|
||||||
CSVWidget::SceneToolToggle *mControlElements;
|
CSVWidget::SceneToolToggle *mControlElements;
|
||||||
|
bool mDisplayCellCoord;
|
||||||
std::list<TextOverlay *> mTextOverlays;
|
std::list<TextOverlay *> mTextOverlays;
|
||||||
std::map<std::string, Ogre::Entity*> mEntities;
|
std::map<std::string, Ogre::Entity*> mEntities;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "navigation.hpp"
|
#include "navigation.hpp"
|
||||||
#include "lighting.hpp"
|
#include "lighting.hpp"
|
||||||
|
#include "elements.hpp" // FIXME: for testing only
|
||||||
|
|
||||||
namespace CSVRender
|
namespace CSVRender
|
||||||
{
|
{
|
||||||
|
@ -58,7 +59,7 @@ namespace CSVRender
|
||||||
|
|
||||||
setLighting (&mLightingDay);
|
setLighting (&mLightingDay);
|
||||||
|
|
||||||
Ogre::OverlaySystem *mOverlaySystem = new Ogre::OverlaySystem(); // FIXME: delete
|
Ogre::OverlaySystem *mOverlaySystem = new Ogre::OverlaySystem();
|
||||||
mSceneMgr->addRenderQueueListener(mOverlaySystem);
|
mSceneMgr->addRenderQueueListener(mOverlaySystem);
|
||||||
|
|
||||||
QTimer *timer = new QTimer (this);
|
QTimer *timer = new QTimer (this);
|
||||||
|
@ -162,8 +163,17 @@ namespace CSVRender
|
||||||
if (mWindow)
|
if (mWindow)
|
||||||
Ogre::Root::getSingleton().destroyRenderTarget (mWindow);
|
Ogre::Root::getSingleton().destroyRenderTarget (mWindow);
|
||||||
|
|
||||||
|
if (mOverlaySystem)
|
||||||
|
{
|
||||||
|
if (mSceneMgr)
|
||||||
|
mSceneMgr->removeRenderQueueListener (mOverlaySystem);
|
||||||
|
|
||||||
|
delete mOverlaySystem;
|
||||||
|
}
|
||||||
|
|
||||||
if (mSceneMgr)
|
if (mSceneMgr)
|
||||||
Ogre::Root::getSingleton().destroySceneManager (mSceneMgr);
|
Ogre::Root::getSingleton().destroySceneManager (mSceneMgr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneWidget::setVisibilityMask (unsigned int mask)
|
void SceneWidget::setVisibilityMask (unsigned int mask)
|
||||||
|
@ -287,6 +297,20 @@ namespace CSVRender
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//FIXME: for testing only
|
||||||
|
case Qt::Key_N:
|
||||||
|
setVisibilityMask((uint32_t)mViewport->getVisibilityMask()
|
||||||
|
& ~(uint32_t)CSVRender::Elements::Element_CellMarker);
|
||||||
|
updateOverlay();
|
||||||
|
break;
|
||||||
|
|
||||||
|
//FIXME: for testing only
|
||||||
|
case Qt::Key_M:
|
||||||
|
setVisibilityMask((uint32_t)mViewport->getVisibilityMask()
|
||||||
|
| (uint32_t)CSVRender::Elements::Element_CellMarker);
|
||||||
|
updateOverlay();
|
||||||
|
break;
|
||||||
|
|
||||||
default: QWidget::keyReleaseEvent (event);
|
default: QWidget::keyReleaseEvent (event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ namespace Ogre
|
||||||
class SceneManager;
|
class SceneManager;
|
||||||
class RenderWindow;
|
class RenderWindow;
|
||||||
class Viewport;
|
class Viewport;
|
||||||
|
class OverlaySystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSVWidget
|
namespace CSVWidget
|
||||||
|
@ -89,6 +90,7 @@ namespace CSVRender
|
||||||
Ogre::SceneManager* mSceneMgr;
|
Ogre::SceneManager* mSceneMgr;
|
||||||
Ogre::RenderWindow* mWindow;
|
Ogre::RenderWindow* mWindow;
|
||||||
Ogre::Viewport *mViewport;
|
Ogre::Viewport *mViewport;
|
||||||
|
Ogre::OverlaySystem *mOverlaySystem;
|
||||||
|
|
||||||
Navigation *mNavigation;
|
Navigation *mNavigation;
|
||||||
Lighting *mLighting;
|
Lighting *mLighting;
|
||||||
|
|
|
@ -259,20 +259,8 @@ int TextOverlay::fontHeight()
|
||||||
return mFontHeight;
|
return mFontHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextOverlay::update(bool toggleOverlay)
|
void TextOverlay::update()
|
||||||
{
|
{
|
||||||
if(toggleOverlay)
|
|
||||||
mEnabled = !mEnabled;
|
|
||||||
|
|
||||||
if (!mEnabled)
|
|
||||||
{
|
|
||||||
mOverlay->hide();
|
|
||||||
Ogre::Root::getSingleton().renderOneFrame();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
mOverlay->show();
|
|
||||||
|
|
||||||
float min_x, max_x, min_y, max_y;
|
float min_x, max_x, min_y, max_y;
|
||||||
getMinMaxEdgesOfTopAABBIn2D(min_x, min_y, max_x, max_y);
|
getMinMaxEdgesOfTopAABBIn2D(min_x, min_y, max_x, max_y);
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace CSVRender
|
||||||
void enable(bool enable);
|
void enable(bool enable);
|
||||||
bool isEnabled();
|
bool isEnabled();
|
||||||
void setCaption(const Ogre::String& text);
|
void setCaption(const Ogre::String& text);
|
||||||
void update(bool toggleOverlay = false);
|
void update();
|
||||||
QRect container();
|
QRect container();
|
||||||
Ogre::String getCaption() { return mCaption; } // FIXME: debug
|
Ogre::String getCaption() { return mCaption; } // FIXME: debug
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue