#include <QtDebug>
#include "ogrewidget.h"
OgreWidget
::OgreWidget(QWidget *parent
)ogreRoot(0), ogreSceneManager(0), ogreRenderWindow(0), ogreViewport(0),
ogreCamera(0)
{
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_PaintOnScreen);
setMinimumSize(240,240);
setFocusPolicy(Qt::ClickFocus);
}
OgreWidget::~OgreWidget()
{
if(ogreRenderWindow)
{
ogreRenderWindow->removeAllViewports();
}
if(ogreRoot)
{
ogreRoot->detachRenderTarget(ogreRenderWindow);
if(ogreSceneManager)
{
ogreRoot->destroySceneManager(ogreSceneManager);
}
}
delete ogreRoot;
}
void OgreWidget
::setBackgroundColor(QColor c
) {
if(ogreViewport)
{
Ogre::ColourValue ogreColour;
ogreColour.setAsARGB(c.rgba());
ogreViewport->setBackgroundColour(ogreColour);
}
}
void OgreWidget::setCameraPosition(const Ogre::Vector3 &pos)
{
ogreCamera->setPosition(pos);
ogreCamera->lookAt(0,50,0);
update();
emit cameraPositionChanged(pos);
}
{
static QMap<int, Ogre::Vector3> keyCoordModificationMapping;
static bool mappingInitialised = false;
if(!mappingInitialised)
{
keyCoordModificationMapping[Qt::Key_Z] = Ogre::Vector3(0, 0, -5);
keyCoordModificationMapping[Qt::Key_S] = Ogre::Vector3(0, 0, 5);
keyCoordModificationMapping[Qt::Key_Q] = Ogre::Vector3(-5, 0, 0);
keyCoordModificationMapping[Qt::Key_D] = Ogre::Vector3( 5, 0, 0);
keyCoordModificationMapping[Qt::Key_PageUp] = Ogre::Vector3(0, 5, 0);
keyCoordModificationMapping[Qt::Key_PageDown] = Ogre::Vector3(0, -5, 0);
mappingInitialised = true;
}
QMap<int, Ogre::Vector3>::iterator keyPressed =
keyCoordModificationMapping.find(e->key());
if(keyPressed != keyCoordModificationMapping.end() && ogreCamera)
{
const Ogre::Vector3 &actualCamPos = ogreCamera->getPosition();
setCameraPosition(actualCamPos + keyPressed.value());
e->accept();
}
else
{
}
}
{
if(e->isAccepted() && ogreRenderWindow)
{
ogreRenderWindow->windowMovedOrResized();
update();
}
}
{
ogreRoot->_fireFrameStarted();
ogreRenderWindow->update();
ogreRoot->_fireFrameEnded();
e->accept();
}
{
if(e->isAccepted())
{
const QSize &newSize
= e
->size
();
if(ogreRenderWindow)
{
ogreRenderWindow->resize(newSize.width(), newSize.height());
ogreRenderWindow->windowMovedOrResized();
}
if(ogreCamera)
{
Ogre::Real aspectRatio = Ogre::Real(newSize.width()) / Ogre::Real(newSize.height());
ogreCamera->setAspectRatio(aspectRatio);
}
}
}
{
if(!ogreRoot)
{
initOgreSystem();
}
}
/////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
void OgreWidget::initOgreSystem()
{
//ogreRoot = new Ogre::Root();
/* Ogre::Root**/ ogreRoot=new Ogre::Root("plugins_d.cfg");
//Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
// Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
ogreRoot->loadPlugin("RenderSystem_GL_d");
Ogre::RenderSystem* rs = ogreRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
if(!(rs->getName() == "OpenGL Rendering Subsystem"))
{
printf("no susystem"); //No RenderSystem found
}
//Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("ogre_pluginsRenderSystem_GL_d");
ogreRoot->setRenderSystem(/*renderSystem*/rs);
ogreRoot->initialise(false);
ogreSceneManager = ogreRoot->createSceneManager(Ogre::ST_GENERIC);
Ogre::NameValuePairList viewConfig;
Ogre::String widgetHandle;
#ifdef Q_WS_WIN
widgetHandle = Ogre::StringConverter::toString((size_t)((HWND)winId()));
#else
QWidget *q_parent
= dynamic_cast <QWidget
*>
(parent
());
widgetHandle = Ogre::StringConverter::toString ((unsigned long)xInfo.display()) +
":" + Ogre::StringConverter::toString ((unsigned int)xInfo.screen()) +
":" + Ogre::StringConverter::toString ((unsigned long)q_parent->winId());
#endif
viewConfig["externalWindowHandle"] = widgetHandle;
ogreRenderWindow = ogreRoot->createRenderWindow("Ogre rendering window",
width(), height(), false, &viewConfig);
ogreCamera = ogreSceneManager->createCamera("myCamera");
Ogre::Vector3 camPos(0, 50,150);
ogreCamera->setPosition(camPos);
ogreCamera->lookAt(0,50,0);
emit cameraPositionChanged(camPos);
ogreViewport = ogreRenderWindow->addViewport(ogreCamera);
ogreViewport->setBackgroundColour(Ogre::ColourValue(0,0,0));
ogreCamera->setAspectRatio(Ogre::Real(width()) / Ogre::Real(height()));
setupNLoadResources();
createScene();
}
void OgreWidget::setupNLoadResources()
{
// Load resource paths from config file
// Load resource paths from config file
Ogre::ConfigFile cf;
cf.load("resources_d.cfg");
// Go through all sections & settings in the file
Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
Ogre::String secName, typeName, archName;
while (seci.hasMoreElements())
{
secName = seci.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
archName, typeName, secName);
}
}
// Initialise, parse scripts etc
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
void OgreWidget::createScene()
{
ogreSceneManager->setAmbientLight(Ogre::ColourValue(1,1,1));
Ogre::Entity *robotEntity = ogreSceneManager->createEntity("Robot","robot.mesh");
Ogre::SceneNode *robotNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode("RobotNode");
robotNode->attachObject(robotEntity);
robotNode->yaw(Ogre::Radian(Ogre::Degree(-90)));
}
Bookmarks