#include #include #include #include #ifdef __unix__ #include #include #endif // credits to https://github.com/Ekman/Qt-Ogre-Widget namespace RNR { OgreWidget::OgreWidget(Ogre::Root *root, QWidget *parent) : QWidget(parent) { this->ogreRoot = root; this->setMinimumSize(640, 480); this->ogreWindow = NULL; this->setAttribute(Qt::WA_OpaquePaintEvent); this->setAttribute(Qt::WA_PaintOnScreen); this->setMouseTracking(true); this->setCursor(QCursor(Qt::BlankCursor)); this->setFocusPolicy(Qt::StrongFocus); } void OgreWidget::initializeOgre() { Ogre::NameValuePairList options = this->getRenderOptions(); printf("OgreWidget::initializeOgre: initializing render window\n"); ogreWindow = ogreRoot->createRenderWindow("GLWidget-RenderWindow", width(), height(), false, &options); ogreWindow->setActive(true); ogreWindow->setVisible(true); ogreWindow->setAutoUpdated(true); Ogre::ResourceGroupManager::getSingletonPtr()->addResourceLocation("content", "FileSystem", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true); Ogre::ResourceGroupManager::getSingletonPtr()->addResourceLocation("../Content", "FileSystem", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true); Ogre::ResourceGroupManager::getSingletonPtr()->addResourceLocation("content/OgreInternal", "FileSystem", Ogre::ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME, true); Ogre::ResourceGroupManager::getSingletonPtr()->addResourceLocation("../Content/OgreInternal", "FileSystem", Ogre::ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME, true); Ogre::ResourceGroupManager::getSingletonPtr()->initialiseAllResourceGroups(); Ogre::MaterialManager::getSingletonPtr()->load("sky", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Ogre::MaterialManager::getSingletonPtr()->load("materials", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); ogreSceneManager = ogreRoot->createSceneManager(); ogreSceneManager->setSkyBox(true, "sky/null_plainsky512", 5.f); ogreSceneManager->setAmbientLight(Ogre::ColourValue(0.5f,0.5f,0.5f)); if(Ogre::RTShader::ShaderGenerator::initialize()) { ogreShaderGen = Ogre::RTShader::ShaderGenerator::getSingletonPtr(); ogreShaderGen->addSceneManager(ogreSceneManager); OgreBites::SGTechniqueResolverListener* schemeNotFoundHandler = new OgreBites::SGTechniqueResolverListener(ogreShaderGen); Ogre::MaterialManager::getSingleton().addListener(schemeNotFoundHandler); } else printf("OgreWidget::initializeOgre: unable to initialize ShaderGenerator\n"); Ogre::Light* light = ogreSceneManager->createLight("SunLight"); Ogre::SceneNode* lightNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode(); lightNode->setPosition(0, 10, 15); lightNode->setDirection(-0.25, -0.5, -0.5); lightNode->attachObject(light); light->setDiffuseColour(0.9, 0.9, 1.0); light->setSpecularColour(1.0, 1.0, 1.0); light->setType(Ogre::Light::LT_DIRECTIONAL); Ogre::SceneNode* camNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode(); camNode->setPosition(0, 0, 5); camNode->lookAt(Ogre::Vector3(0, sinf(render_time), cosf(render_time)), Ogre::Node::TS_PARENT); ogreCamera = ogreSceneManager->createCamera("myCam"); ogreCamera->setNearClipDistance(0.1); // specific to this sample ogreCamera->setFarClipDistance(1000.f); ogreCamera->setAutoAspectRatio(true); camNode->attachObject(ogreCamera); ogreWindow->addViewport(ogreCamera); this->render_time = 0.0; } void OgreWidget::render() { this->delta = ogreRoot->getTimer()->getMicroseconds() / 1000000.0; this->render_time += ogreRoot->getTimer()->getMilliseconds() / 1000.0; ogreRoot->getTimer()->reset(); ogreCamera->getParentSceneNode()->setPosition(Ogre::Vector3(sinf(this->render_time)*10,5.f,cosf(this->render_time)*10)); ogreCamera->getParentSceneNode()->lookAt(Ogre::Vector3(0,0,0), Ogre::Node::TS_PARENT); ogreRoot->renderOneFrame(this->delta); } Ogre::NameValuePairList OgreWidget::getRenderOptions() { Ogre::NameValuePairList options; options["externalWindowHandle"] = getWindowHandle(); #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE options["macAPI"] = "cocoa"; options["macAPICocoaUseNSView"] = "true"; #endif return options; } Ogre::String OgreWidget::getWindowHandle() { Ogre::String windowHandle; windowHandle = Ogre::StringConverter::toString((unsigned long)winId()); printf("OgreWidget::getWindowHandle(): %s\n", windowHandle.c_str()); return windowHandle; } void OgreWidget::resizeEvent(QResizeEvent *rEvent) { QWidget::resizeEvent(rEvent); if(ogreWindow) { QSize size = rEvent->size(); ogreWindow->resize(size.width(), size.height()); } } void OgreWidget::paintEvent(QPaintEvent *pEvent) { // } void OgreWidget::mouseMoveEvent(QMouseEvent *mEvent) { } void OgreWidget::closeEvent(QCloseEvent* event) { ogreWindow->destroy(); } QPaintEngine* OgreWidget::paintEngine() const { return 0; } }