Great!przemir wrote:QElapsedTimer was unnecessary. I've changed it to FrameListener.
Now, there is a signal (entitySelected) for element picking.
Edit: I've updated the wiki page for the last changes.
Great!przemir wrote:QElapsedTimer was unnecessary. I've changed it to FrameListener.
Code: Select all
m_ogreRoot = ::Ogre::Singleton< ::Ogre::Root >::getSingletonPtr();
if (m_ogreRoot == NULL)
{
#ifdef _MSC_VER
m_ogreRoot = new Ogre::Root(Ogre::String(<PATH_TO_THE_PLUGINS_CFG>));
#else
m_ogreRoot = new Ogre::Root(Ogre::String(<PATH_TO_THE_PLUGINS_CFG>));
#endif
}
Someone got any clue? Is this related to current OpenGL context?OgreSingleton.h :80 : Ogre::Singleton<Ogre::TextureManager>::Singleton() [T = Ogre::TextureManager]: assert « !msSingleton » failed.
Ludobaka wrote: However, is it possible to get multiple QTOgreWindow in the same App ?
You tried to call this function twice (because of two QTOgreWindows)? Inside initialise function OgreRoot allocate singletons, and TextureManager is one of them. Assertion protect from second allocation attempt.Ludobaka wrote: Now, I've got this error at the ogreRoot->initialise(false) call
Code: Select all
virtual void mouseWheelEvent(QWheelEvent* e);
Code: Select all
virtual void wheelEvent(QWheelEvent* e);
Code: Select all
mRoot = new Ogre::Root(Ogre::String("config/plugins.cfg"),
Ogre::String("config/ogre.cfg"),
Ogre::String("log/ogre.log"));
Ogre::LogManager::getSingleton().setLogDetail(Ogre::LL_BOREME);
initializeResources();
mRenderSystem = mRoot->getRenderSystemByName(mEngine.toStdString());
/* i did not need this block in 1.9 and 2.1 */
QString dimensions = QString("%1 x %2").arg(width()).arg(height());
mRenderSystem->setConfigOption("Video Mode", dimensions.toStdString());
mRenderSystem->setConfigOption("Full Screen", "No");
mRenderSystem->setConfigOption("VSync", "Yes");
/* end of block */
mRoot->setRenderSystem(mRenderSystem);
mRoot->initialise(false);
Ogre::NameValuePairList tParameters;
if (mRenderSystem->getName().find("GL") <= mRenderSystem->getName().size()) // i did not need this line in 1.9 and 2.1
tParameters["currentGLContext"] = Ogre::String("false"); // this value was true in 1.9 and 2.1
tParameters["externalWindowHandle"] = Ogre::StringConverter::toString((size_t) (winId()));
tParameters["parentWindowHandle"] = Ogre::StringConverter::toString((size_t) (winId())); // i did not need this line in 1.9 and 2.1
tParameters["vsync"] = Ogre::String("true");
tParameters["FSAA"] = "8";
mRenderWindow = mRoot->createRenderWindow(QString("QtWindow_%1").arg(mInstanceNumber).toStdString(), width(), height(), false, &tParameters);
mRenderWindow->setVisible(true);
Code: Select all
size_t StringConverter::parseSizeT(const String& val, size_t defaultValue)
{
// size_t ret;
//return sscanf(val.c_str(), "%zu", &ret) == 1 ? ret : defaultValue;
StringStream str(val);
//if (msUseLocale)
// str.imbue(msLocale);
size_t ret = defaultValue;
if (!(str >> ret))
return defaultValue;
return ret;
}
Try copying the registerResouces/registerHlms to your project, e.g:gabbsson wrote: ↑Wed Aug 08, 2018 9:36 am I used the wiki post http://wiki.ogre3d.org/Integrating+Ogre+into+QT5, which was based on this thread to create a working integration of Ogre 1.11 with Qt5. It rendered models, manual objects and so on.
I'm now trying to update to 2.1 and it has proven difficult. While I can compile and run the code the moment I try to add or create some type of mesh or manual object it crashes, claiming it can't find Hlms datablock. I have seen in other threads that it is required to register Hlms which I'm quite sure is not being done in my code (or the the wiki template). While I realize it is part of what needs to be added I haven't been able to understand how to go about it.
I have done my best to read and understand the tutorials provided for Ogre 2.1. The class GraphicsSystem is what registers Hlms but I'm not sure how to consolidate that with the QTOgreWindow.
My on topic question is:
Does anyone have a working example of QtOgreWindow for 2.1?
Ps. I am new to Ogre and C++ (not to mention posting on forums).
I usually just keep trying on my own til it works but figured it can't hurt to ask.
Code: Select all
//headers
#include "OgreHlmsManager.h"
#include "Hlms/Unlit/OgreHlmsUnlit.h"
#include "Hlms/Unlit/OgreHlmsUnlitDatablock.h"
#include "OgreHlms.h"
#include "OgreHlmsDatablock.h"
#include "Hlms/Pbs/OgreHlmsPbs.h"
#include "Hlms/Pbs/OgreHlmsPbsDatablock.h"
#include "Hlms/Pbs/OgreHlmsPbs.h"
..
virtual void registerResouces(void);
virtual void registerHlms(void);
//-----------------------------------------------------------------------------------
void QTOgreWindow::registerResouces(void)
{
Ogre::Root* mRoot = Ogre::Root::getSingletonPtr();
// Load resource paths from config file
Ogre::ConfigFile cf;
cf.load("resources.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();
if( secName != "Hlms" )
{
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);
}
}
}
}
//-----------------------------------------------------------------------------------
void QTOgreWindow::registerHlms(void)
{
Ogre::Root* mRoot = Ogre::Root::getSingletonPtr();
Ogre::ConfigFile cf;
Ogre::String mResourcePath="";
cf.load("./resources2.cfg" );
Ogre::String dataFolder = cf.getSetting( "DoNotUseAsResource", "Hlms", "" );
if( dataFolder.empty() )
dataFolder = "./";
else if( *(dataFolder.end() - 1) != '/' )
dataFolder += "/";
Ogre::RenderSystem *renderSystem = mRoot->getRenderSystem();
Ogre::String shaderSyntax = "GLSL";
if( renderSystem->getName() == "Direct3D11 Rendering Subsystem" )
shaderSyntax = "HLSL";
else if( renderSystem->getName() == "Metal Rendering Subsystem" )
shaderSyntax = "Metal";
Ogre::Archive *archiveLibrary = Ogre::ArchiveManager::getSingletonPtr()->load(
dataFolder + "Hlms/Common/" + shaderSyntax,
"FileSystem", true );
Ogre::Archive *archiveLibraryAny = Ogre::ArchiveManager::getSingletonPtr()->load(
dataFolder + "Hlms/Common/Any",
"FileSystem", true );
Ogre::Archive *archivePbsLibraryAny = Ogre::ArchiveManager::getSingletonPtr()->load(
dataFolder + "Hlms/Pbs/Any",
"FileSystem", true );
Ogre::ArchiveVec library;
library.push_back( archiveLibrary );
library.push_back( archiveLibraryAny );
Ogre::Archive *archiveUnlit = Ogre::ArchiveManager::getSingletonPtr()->load(
dataFolder + "Hlms/Unlit/" + shaderSyntax,
"FileSystem", true );
Ogre::HlmsUnlit *hlmsUnlit = OGRE_NEW Ogre::HlmsUnlit( archiveUnlit, &library );
Ogre::Root::getSingleton().getHlmsManager()->registerHlms( hlmsUnlit );
Ogre::Archive *archivePbs = Ogre::ArchiveManager::getSingletonPtr()->load(
dataFolder + "Hlms/Pbs/" + shaderSyntax,
"FileSystem", true );
library.push_back( archivePbsLibraryAny );
Ogre::HlmsPbs *hlmsPbs = OGRE_NEW Ogre::HlmsPbs( archivePbs, &library );
Ogre::Root::getSingleton().getHlmsManager()->registerHlms( hlmsPbs );
library.pop_back();
if( renderSystem->getName() == "Direct3D11 Rendering Subsystem" )
{
//Set lower limits 512kb instead of the default 4MB per Hlms in D3D 11.0
//and below to avoid saturating AMD's discard limit (8MB) or
//saturate the PCIE bus in some low end machines.
bool supportsNoOverwriteOnTextureBuffers;
renderSystem->getCustomAttribute( "MapNoOverwriteOnDynamicBufferSRV",
&supportsNoOverwriteOnTextureBuffers );
if( !supportsNoOverwriteOnTextureBuffers )
{
hlmsPbs->setTextureBufferDefaultSize( 512 * 1024 );
hlmsUnlit->setTextureBufferDefaultSize( 512 * 1024 );
}
}
}
Code: Select all
...
m_ogreWindow->setVisible(true);
registerResouces();
registerHlms();
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(true);
...
Code: Select all
// --- graphicssystem.h
class GraphicsSystem : public BaseSystem, public QWindow,
public Ogre::UniformScalableTask
{
protected:
Ogre::RenderWindow *mRenderWindow;
// --- mainwindow.h
class MainWindow : public QMainWindow
{
private:
QWidget* renderWidget;
Ogre::RenderWindow* renderWindow;
// mainwindow.cpp
MainWindow::MainWindow())
{
// ...
renderWindow = graphicsSystem.getRenderWindow();
// ...
renderWidget = QWidget::createWindowContainer(
static_cast<QWindow*>(renderWindow));
mainwindow.cpp: In constructor ‘MainWindow::MainWindow()’:
mainwindow.cpp:89:35: error: invalid static_cast from type ‘Ogre::RenderWindow*’ to type ‘QWindow*’
static_cast<QWindow*>(renderWindow));
^
make[4]: *** [Makefile:668: mainwindow.o] Error 1