Advertisement
Guest User

hogrewidget.cpp

a guest
May 10th, 2012
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.31 KB | None | 0 0
  1. #include "hogrewidget.h"
  2.  
  3. HOgreWidget::HOgreWidget (QWidget *parent, bool bAutoCreated) : QGLWidget (parent) {
  4.     mbAutoCreated = bAutoCreated;
  5.  
  6.     mOgrePluginsCfg = "plugins.cfg";
  7.     mRenderSystemCfg = "ogre.cfg";
  8.     mOgreResourcesCfg = "resources.cfg";
  9.  
  10.     TheInputCameraFile = "cameraParametrs.yml";
  11.  
  12.     mOgreRoot = 0x0;
  13.     mOgreRenderWindow = 0x0;
  14.     mOgreCamera = 0x0;
  15.     mOgreViewport = 0x0;
  16.     mOgreSceneMngr = 0x0;
  17.     mOgreCameraNode = 0x0;
  18.  
  19.     unsigned int i = 0;
  20.     for (i; i < 64; i ++) {
  21.         marOgreEntity [i] = 0x0, marOgreObjectNode [i] = 0x0;
  22.         marBaseAnim [i] = 0x0, marTopAnim [i] = 0;
  23.     }
  24.  
  25.     mOgreScale = 0.00675f * pow (2.0, 0.0);
  26.     TheMarkerSize = 0.21;
  27. }
  28.  
  29. HOgreWidget::~HOgreWidget () {
  30.     Ogre::WindowEventUtilities::removeWindowEventListener (mOgreRenderWindow, this);
  31.  
  32. //    mOgreRenderWindow->destroy ();
  33.     delete mOgreRenderWindow;
  34.  
  35.     mOgreRoot->destroySceneManager (mOgreSceneMngr);
  36.  
  37.     delete mOgreRoot;
  38. }
  39.  
  40. int HOgreWidget::init (void) {
  41.     int iRes = -1;
  42.  
  43.     mOgreRoot = new Root();
  44.  
  45.     if (mOgreRoot)
  46.         if (loadResources () == 0)
  47.             if (initAR () == 0)
  48.                 if (initRenderSystem () == 0)
  49.                     if (createOgreRenderWindow () == 0)
  50.                         if (createOgreSceneManager () == 0)
  51.                             if (setupResource () == 0)
  52.                                 if (createCameraBackground () == 0)
  53.                                     if (createOgreCamera () == 0)
  54.                                         if (createOgreViewport () == 0)
  55.                                             if (createOgreScene () == 0)
  56.                                                 iRes = 0;
  57.  
  58.     cout << "HOgreWidget::init: " << iRes << endl;
  59.     return iRes;
  60. }
  61.  
  62. int HOgreWidget::initRenderSystem (void) {
  63.     int iRes = 0; //Success
  64.  
  65.     if(! (mOgreRoot->restoreConfig () || mOgreRoot->showConfigDialog ()))
  66.         return -1;
  67.  
  68.     // setup a renderer OF KTHUCHA's
  69.     Ogre::RenderSystemList::const_iterator renderers = mOgreRoot->getAvailableRenderers ().begin ();
  70.     while (renderers != mOgreRoot->getAvailableRenderers().end ()) {
  71.         Ogre::String rName = (*renderers)->getName ();
  72.         if (rName == "OpenGL Rendering Subsystem")
  73.             break;
  74.  
  75.         renderers++;
  76.     }
  77.  
  78.     if (*renderers != NULL) {
  79.         mOgreRoot->setRenderSystem (*renderers);
  80.  
  81.         //QString dimensions = QString ("%1x%2").arg (this->width ()).arg (this->height ());
  82.  
  83.         //renderSystem->setConfigOption ("Video Mode", dimensions.toStdString ());
  84.         mOgreRoot->getRenderSystem ()->setConfigOption ("Video Mode", "800 x 600 @ 32-bit colour");
  85.  
  86.         // initialize without creating window
  87.         mOgreRoot->getRenderSystem ()->setConfigOption ("Full Screen", "No");
  88.         mOgreRoot->saveConfig ();
  89.     }
  90.     else
  91.         iRes = -1;
  92.  
  93.     cout << "HOgreWidget::initRenderSystem: " << iRes << endl;
  94.     return iRes;
  95. }
  96.  
  97. int HOgreWidget::createOgreRenderWindow (void) {
  98.     int iRes = 0; //Success
  99.  
  100. //    mOgreRenderWindow = mOgreRoot->getAutoCreatedWindow ();
  101.  
  102.     if (mbAutoCreated)
  103.         mOgreRenderWindow = mOgreRoot->initialise (true, "BasicTutorial6 Render Window"); //???
  104.     else {
  105.         mOgreRenderWindow = mOgreRoot->initialise (false); //???
  106.  
  107.         Ogre::NameValuePairList params;
  108.         Ogre::String externalWindowHandleParams;
  109.  
  110.         QX11Info info = x11Info ();
  111.         externalWindowHandleParams  = Ogre::StringConverter::toString ((unsigned long)(info.display ()));
  112.         externalWindowHandleParams += ":";
  113.  
  114.         externalWindowHandleParams += Ogre::StringConverter::toString ((unsigned int)(info.screen ()));
  115.         externalWindowHandleParams += ":";
  116.  
  117.         externalWindowHandleParams += Ogre::StringConverter::toString ((unsigned long) winId ());
  118.         externalWindowHandleParams += Ogre::StringConverter::toString ((unsigned long) parentWidget ()->winId ());
  119.  
  120. //        externalWindowHandleParams += ":";
  121. //        externalWindowHandleParams += Ogre::StringConverter::toString((unsigned long) (info.visual ()));
  122.  
  123.         cout << "externalWindowHandleParams=" << externalWindowHandleParams << endl;
  124.  
  125. //        params ["parentWindowHandle"] = externalWindowHandleParams;
  126.         params ["externalWindowHandle"] = externalWindowHandleParams;
  127.  
  128.         params ["externalGLControl"] = "true";
  129.         params ["currentGLContext"] = "0";
  130.  
  131.         //        params ["FSAA"] = "0";
  132.         //        params ["displayFrequency"] = "60 MHz";
  133.         //        params ["gamma"] = "Yes";
  134.         //        params ["vsync"] = "No";
  135.  
  136.         cout << "HOgreWidget::width ()=" << width () << ", height ()=" << height () << endl;
  137.         cout << "HOgreWidget::mWidth=" << mWidth << ", mHeight=" << mHeight << endl;
  138.  
  139.         //Finally create our window
  140.         mOgreRenderWindow = mOgreRoot->createRenderWindow ("OgreRenderWindow", width (), height (), false, &params); //???
  141. //        mOgreRenderWindow = mOgreRoot->createRenderWindow ("OgreRenderWindow", mWidth, mHeight, false, &params); //???
  142.  
  143.         mOgreRenderWindow->setActive (true);
  144. //        WId ogreWinId = 0x0;
  145. //        mOgreRenderWindow->getCustomAttribute ("WINDOW", &ogreWinId );
  146.  
  147. //        assert (ogreWinId);
  148.  
  149. //        // bug fix, extract geometry
  150. //        QRect geo = this->frameGeometry ( );
  151.  
  152. //        // create new window
  153. //        this->create (ogreWinId);
  154.  
  155. //        // set geometrie infos to new window
  156. //        this->setGeometry (geo);
  157.     }
  158.  
  159.     if (mOgreRenderWindow)
  160.         mOgreRenderWindow->setVisible (true);
  161.     else
  162.         iRes = -1;
  163.  
  164.     cout << "HOgreWidget::createOgreRenderWindow: " << iRes << endl;
  165.     return iRes;
  166. }
  167.  
  168. int HOgreWidget::loadResources (void) {
  169.     int iRes = 0; //Success
  170.  
  171.     // set up resources
  172.     // Load resource paths from config file
  173.     Ogre::ConfigFile cf;
  174.     try { cf.load (mOgreResourcesCfg); }
  175.     catch (Ogre::Exception &e) {
  176.         iRes = -1;
  177.         std::cerr << "An exception has occured: " << e.getFullDescription ().c_str () << std::endl;
  178.     }
  179.  
  180.     if ((iRes == 0) && (! (Ogre::ResourceGroupManager::getSingletonPtr () == 0x0))) {
  181.         // Go through all sections & settings in the file
  182.         Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator ();
  183.  
  184.         Ogre::String secName, typeName, archName;
  185.         while (seci.hasMoreElements ())
  186.         {
  187.             secName = seci.peekNextKey ();
  188.             Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext ();
  189.             Ogre::ConfigFile::SettingsMultiMap::iterator i;
  190.             for (i = settings->begin (); i != settings->end (); ++i)
  191.             {
  192.                 typeName = i->first;
  193.                 archName = i->second;
  194.                 Ogre::ResourceGroupManager::getSingleton ().addResourceLocation (archName, typeName, secName);
  195.             }
  196.         }
  197.     }
  198.     else
  199.         iRes = -1;
  200.  
  201.     cout << "HOgreWidget::loadResources: " << iRes << endl;
  202.     return iRes;
  203. }
  204.  
  205. int HOgreWidget::setupResource (void) {
  206.     int iRes = 0; //Success
  207.  
  208.     if (Ogre::TextureManager::getSingletonPtr ()) {
  209.         // Set default mipmap level (note: some APIs ignore this)
  210.         Ogre::TextureManager::getSingletonPtr ()->setDefaultNumMipmaps (5);
  211.         // initialise all resource groups
  212.         Ogre::ResourceGroupManager::getSingletonPtr ()->initialiseAllResourceGroups ();
  213.     }
  214.     else
  215.         iRes = -1;
  216.  
  217.     cout << "HOgreWidget::setupResource: " << iRes << endl;
  218.     return iRes;
  219. }
  220.  
  221. int HOgreWidget::createOgreSceneManager (void) {
  222.     int iRes = 0; //Success
  223.  
  224.     // Create the SceneManager, in this case a generic one
  225.     mOgreSceneMngr = mOgreRoot->createSceneManager ("DefaultSceneManager");
  226.  
  227.     if (mOgreSceneMngr == NULL)
  228.         iRes = -1;
  229.  
  230.     cout << "HOgreWidget::createOgreSceneManager: " << iRes << endl;
  231.     return iRes;
  232. }
  233.  
  234. int HOgreWidget::createOgreViewport (void) {
  235.     int iRes = 0; //Success
  236.  
  237.     if (mOgreRenderWindow && mOgreCamera) {
  238.         //mViewport->setCamera (mCamera);
  239.         mOgreViewport = mOgreRenderWindow->addViewport (mOgreCamera);
  240.  
  241.         if (mOgreViewport == NULL)
  242.             iRes = -1;
  243.         else {
  244.             setAttribute(Qt::WA_OpaquePaintEvent);
  245. //            setAttribute(Qt::WA_PaintOnScreen);
  246. //            setAttribute(Qt::WA_NoSystemBackground);
  247.  
  248.             mOgreViewport->setBackgroundColour (Ogre::ColourValue (0.5, 0.5, 0.5));
  249.         }
  250.     }
  251.     else
  252.         iRes = -1;
  253.  
  254.     cout << "HOgreWidget::createOgreViewport: " << iRes << endl;
  255.     return iRes;
  256. }
  257.  
  258. int HOgreWidget::createOgreCamera (void) {
  259.     int iRes = 0; //Success
  260.  
  261.     mOgreCamera = mOgreSceneMngr->createCamera ("camera");
  262.  
  263.     if (mOgreCamera) {
  264.         //FROM A 'aruco_test_ogre.cpp'
  265.         // configure Ogre Camera
  266.     mOgreCamera->setProjectionType (Ogre::PT_ORTHOGRAPHIC);
  267.     mOgreCamera->setNearClipDistance (0.01f);
  268.     mOgreCamera->setFarClipDistance (10.0f);
  269.  
  270.         double pMatrix [16];
  271.         CameraParamsUnd.OgreGetProjectionMatrix (CameraParamsUnd.CamSize,
  272.                                                  CameraParamsUnd.CamSize,
  273.                                                  pMatrix,
  274.                                                  0.05,
  275.                                                  10,
  276.                                                  false);
  277.  
  278.         Ogre::Matrix4 PM (pMatrix [0], pMatrix [1], pMatrix [2] , pMatrix [3],
  279.                          pMatrix [4], pMatrix [5], pMatrix [6] , pMatrix [7],
  280.                          pMatrix [8], pMatrix [9], pMatrix [10], pMatrix [11],
  281.                          pMatrix [12], pMatrix [13], pMatrix [14], pMatrix [15]);
  282.  
  283.         mOgreCamera->setCustomProjectionMatrix (true, PM);
  284.         mOgreCamera->setCustomViewMatrix (true, Ogre::Matrix4::IDENTITY);
  285.  
  286.  
  287.         //FROM A 'OgreARAppLogic'
  288. //        mOgreCamera->setNearClipDistance (0.5);
  289. //        mOgreCamera->setFarClipDistance (50000);
  290. //        mOgreCamera->setPosition (0, 0, 0);
  291. //        mOgreCamera->lookAt (-11, 0, 0);
  292.         //mOgreCamera->setFOVy (Degree(40)); //FOVy camera Ogre = 40
  293.         //mOgreCamera->setAspectRatio ((float) mViewport->getActualWidth () / (float) mViewport->getActualHeight ());
  294.  
  295.  
  296.         /*
  297.         //FROM A TUTORIAL6
  298.         // Position it at 80 in Z direction
  299.         mOgreCamera->setPosition (Ogre::Vector3(0, 0, 80));
  300.         // Look back along -Z
  301.         mOgreCamera->lookAt (Ogre::Vector3 (0, 0, -300));
  302.         mOgreCamera->setNearClipDistance (5);
  303.  
  304.         // Create one viewport, entire window
  305.         Ogre::Viewport* vp = mOgreWindow->addViewport (mOgreCamera);
  306.         vp->setBackgroundColour (Ogre::ColourValue (0, 0, 0));
  307.  
  308.         // Alter the camera aspect ratio to match the viewport
  309.         mOgreCamera->setAspectRatio (Ogre::Real (vp->getActualWidth ()) / Ogre::Real (vp->getActualHeight ()));
  310.         */
  311.  
  312.         mOgreCameraNode = mOgreSceneMngr->getRootSceneNode ()->createChildSceneNode ("cameraNode");
  313.  
  314.         if (mOgreCameraNode) {
  315.             //mOgreCameraNode->setPosition (0, 1700, 0);//
  316.             //mOgreCameraNode->lookAt (Vector3 (0, 1700, -1), Node::TS_WORLD);//
  317.             mOgreCameraNode->attachObject (mOgreCamera);
  318.             //mCameraNode->setFixedYawAxis (true, Vector3::UNIT_Y);//
  319.         }
  320.         else
  321.             iRes = -1;
  322.     }
  323.     else
  324.         iRes = -1;
  325.  
  326.     cout << "HOgreWidget::createOgreCamera: " << iRes << endl;
  327.     return iRes;
  328. }
  329.  
  330. int HOgreWidget::createOgreScene (void) {
  331.     int iRes = 0; //Success
  332.  
  333.     unsigned int i = 0;
  334.  
  335.     for (i; i < 64; i ++) {
  336.         std::stringstream entityName;
  337.         entityName << "marker_" << i;
  338.         cout << entityName.str () << endl;
  339.  
  340.         marOgreEntity [i] = mOgreSceneMngr->createEntity (entityName.str (), "Sinbad.mesh");
  341.  
  342.         if (marOgreEntity [i]) {
  343.             marOgreObjectNode [i] = mOgreSceneMngr->getRootSceneNode ()->createChildSceneNode ();
  344.  
  345.             if (marOgreObjectNode [i]) {
  346.                 marOgreObjectNode [i]->attachObject (marOgreEntity [i]);
  347.  
  348.                 marOgreObjectNode [i]->setScale (mOgreScale, mOgreScale, mOgreScale);
  349.                 marOgreObjectNode [i]->setVisible (false);
  350.  
  351.                 // Init animation
  352.                 marOgreEntity [i]->getSkeleton ()->setBlendMode (Ogre::ANIMBLEND_CUMULATIVE);
  353.                 marBaseAnim [i] = marOgreEntity [i]->getAnimationState ("RunBase");
  354.                 marTopAnim [i] = marOgreEntity [i]->getAnimationState ("Dance");
  355.                 marBaseAnim [i]->setLoop (true);
  356.                 marTopAnim [i]->setLoop (true);
  357.                 marBaseAnim [i]->setEnabled (true);
  358.                 marTopAnim [i]->setEnabled (true);
  359.             }
  360.             else
  361.                 iRes = -1;
  362.         }
  363.         else
  364.             iRes = -1;
  365.  
  366.         if (! (iRes == 0))
  367.             break;
  368.     }
  369.  
  370.     if (iRes == 0) {
  371.         // Set ambient light
  372. //        mOgreSceneMngr->setAmbientLight (Ogre::ColourValue (0.5, 0.5, 0.5));
  373.  
  374.         // Create a light
  375.         Ogre::Light* l = mOgreSceneMngr->createLight ("MainLight");
  376. //        l->setPosition (20, 80, 50);
  377.         l->setPosition (0, 1, -10);
  378.  
  379.         mOgreSceneMngr->getRootSceneNode()->attachObject (l);
  380.     }
  381.     else
  382.         iRes = -1;
  383.  
  384.     cout << "HOgreWidget::createOgreScene: " << iRes << endl;
  385.     return iRes;
  386. }
  387.  
  388. int HOgreWidget::initAR (void) {
  389.     int iRes = 0; //Success
  390.  
  391.     // read input video
  392.     TheVideoCapturer.open (0);
  393.  
  394.     if (! (TheVideoCapturer.isOpened ())) {
  395.         std::cerr << "Could not open video" << endl;
  396.  
  397.         iRes = -1;
  398.     }
  399.     else {
  400.         // read intrinsic file
  401.         try { CameraParams.readFromXMLFile (TheInputCameraFile); }
  402.         catch (std::exception &ex) {
  403.             cout << ex.what() << endl;
  404.  
  405.             iRes = -1;
  406.         }
  407.  
  408.         if (iRes == 0) {
  409.             // capture first frame
  410.             TheVideoCapturer.grab ();
  411.             TheVideoCapturer.retrieve (TheInputImage);
  412.  
  413.             cv::undistort (TheInputImage, TheInputImageUnd, CameraParams.CameraMatrix, CameraParams.Distorsion);
  414.  
  415.             CameraParamsUnd = CameraParams;
  416.             CameraParamsUnd.Distorsion = cv::Mat::zeros (4, 1, CV_32F);
  417.  
  418.             float fltCoeff = 1.25;
  419.             sgnResized (TheInputImageUnd.cols * fltCoeff, TheInputImageUnd.rows * fltCoeff);
  420.  
  421.             // This two lines has to be defined in order to update background image
  422.             mWidth = TheInputImageUnd.cols, mHeight = TheInputImageUnd.rows;
  423.             mBuffer = TheInputImageUnd.ptr <unsigned char> (0); // TheInputImageUnd will be shown as background
  424.         }
  425.         else
  426.             ;
  427.     }
  428.  
  429.     cout << "HOgreWidget::initAR: " << iRes << endl;
  430.     return iRes;
  431. }
  432.  
  433. int HOgreWidget::createCameraBackground (void) {
  434.     int iRes = 0; //Success
  435.  
  436.     if (mWidth == 0 || mHeight == 0 || mBuffer == 0) {
  437.         std::cout << "Image size or buffer not defined in user-defined init function" << std::endl;
  438.  
  439.         iRes = -1;
  440.     }
  441.     else {
  442.         // create background texture
  443.         mPixelBox = Ogre::PixelBox(mWidth, mHeight, 1, Ogre::PF_R8G8B8, mBuffer);
  444.         // Create Texture
  445.         mTexture = Ogre::TextureManager::getSingleton().createManual (
  446.                   "CameraTexture",
  447.                   Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
  448.                   Ogre::TEX_TYPE_2D,
  449.                   mWidth,
  450.                   mHeight,
  451.                   0,
  452.                   Ogre::PF_R8G8B8,
  453.                   Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
  454.  
  455.         //Create Camera Material
  456.         MaterialPtr material = MaterialManager::getSingleton().create("CameraMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
  457.         Ogre::Technique *technique = material->createTechnique();
  458.         technique->createPass();
  459.         material->getTechnique(0)->getPass(0)->setLightingEnabled (false);
  460.         material->getTechnique(0)->getPass(0)->setDepthWriteEnabled (false);
  461.         material->getTechnique(0)->getPass(0)->createTextureUnitState ("CameraTexture");
  462.  
  463.         // Create background rectangle covering the whole screen
  464.         Rectangle2D* rect = new Rectangle2D(true);
  465.         rect->setCorners (-1.0, 1.0, 1.0, -1.0);
  466.         rect->setMaterial ("CameraMaterial");
  467.  
  468.         // Render the background before everything else
  469.         rect->setRenderQueueGroup (RENDER_QUEUE_BACKGROUND);
  470.  
  471.         // Hacky, but we need to set the bounding box to something big
  472.         // Use infinite AAB to always stay visible
  473.         AxisAlignedBox aabInf;
  474.         aabInf.setInfinite();
  475.         rect->setBoundingBox (aabInf);
  476.  
  477.         // Attach background to the scene
  478.         SceneNode* node = mOgreSceneMngr->getRootSceneNode ()->createChildSceneNode ("Background666");
  479.         node->attachObject (rect);
  480.     }
  481.  
  482.     cout << "HOgreWidget::createCameraBackground: " << iRes << endl;
  483.     return iRes;
  484. }
  485.  
  486. // Ogre::FrameListener
  487. bool HOgreWidget::frameRenderingQueued (const Ogre::FrameEvent &evt) {
  488.     cout << "In RenderingQueued..." << endl;
  489.  
  490.     mOgreViewport->setBackgroundColour (Ogre::ColourValue (0.5, 0.5, 0.5));
  491.  
  492.     unsigned int i;
  493.     int iMarkerCount = -1;
  494.     double position [3], orientation [4];
  495.     Ogre::Quaternion qtrnRotationX (sqrt (0.5), sqrt (0.5), 0, 0), qtrnRotationAruco, qtrnRotationTotal;
  496.  
  497.     // capture a frame
  498.     if (TheVideoCapturer.grab ()) {//Hay alguna imagen para procesar?
  499.         // undistort image
  500.         TheVideoCapturer.retrieve (TheInputImage);
  501.  
  502.         if (! mTexture.isNull ())
  503.         {
  504.             cout << "update backGround...";
  505.  
  506.             //Pedimos a ogre que actualice la imagen desde el PixelBox
  507.             Ogre::HardwarePixelBufferSharedPtr pixelBuffer = mTexture->getBuffer ();
  508.             cout << pixelBuffer.isNull () << endl;
  509.             pixelBuffer->blitFromMemory (mPixelBox);
  510.         }
  511.         else {
  512.             cout << "update backGround...mTexture.isNull () = true!" << endl;
  513.  
  514.             return false;
  515.         }
  516.  
  517.         cv::undistort (TheInputImage,
  518.                        TheInputImageUnd,
  519.                        CameraParams.CameraMatrix,
  520.                        CameraParams.Distorsion);
  521.  
  522.         // detect markers
  523.         MDetector.detect (  TheInputImageUnd,
  524.                             TheMarkers,
  525.                             CameraParamsUnd,
  526.                             TheMarkerSize);
  527.  
  528. //        iMarkerCount = TheMarkers.size ();
  529. //        cout << iMarkerCount << endl;
  530.  
  531.         // set object poses
  532.         try { i = 0; }
  533.         catch (Ogre::Exception &e) {
  534.             std::cerr << "An exception has occured: " << e.getFullDescription ().c_str () << std::endl;
  535.  
  536.             return false;
  537.         }
  538.  
  539.         if (TheMarkers.size ()) {
  540.             i = 0;
  541.             do {
  542.                 cout << TheMarkers [i].id;
  543.                 if ((++ i) < TheMarkers.size ())
  544.                     cout << ", ";
  545.                 else
  546.                     cout << endl;
  547.             }
  548.             while (i < TheMarkers.size ());
  549.  
  550. //            for (i = 0; i < TheMarkers.size (); i ++) {
  551. //                cout << TheMarkers [i].id;
  552. //                if ((i + 1) < TheMarkers.size ())
  553. //                    cout << ", ";
  554. //                else
  555. //                    cout << endl;
  556. //            }
  557.         }
  558.         else
  559.             ;
  560.  
  561.         for (i = 0; i < 64; i ++) {
  562.             if (TheMarkers.size ()) {
  563.                 if (i < TheMarkers.size ()) {
  564.                     if (marOgreObjectNode [i]) {
  565.                         marOgreObjectNode [i] ->setVisible (true);
  566.  
  567.                         try { TheMarkers [i].OgreGetPoseParameters (position, orientation); }
  568.                         catch (Ogre::Exception &e) {
  569.                             std::cerr << "An exception has occured: " << e.getFullDescription ().c_str () << std::endl;
  570.                         }
  571.  
  572.                         cout << "position={" << position [0] << ":"  << position [1] << ":"  << position [2] << "}" << endl;
  573.                         marOgreObjectNode [i]->setPosition (position [0], position [1], position [2]);
  574.  
  575.                         cout << "orientation={" << orientation [0] << ":"  << orientation [1] << ":"  << orientation [2] << ":"  << orientation [3] << "}" << endl;
  576.                         cout << "orientation={" << orientation [0]*180/M_PI << ":"  << orientation [1]*180/M_PI << ":"  << orientation [2]*180/M_PI << ":"  << orientation [3]*180/M_PI << "}" << endl;
  577.  
  578.                         qtrnRotationAruco = Ogre::Quaternion (orientation [0], orientation [1], orientation [2], orientation [3]);
  579.                         qtrnRotationTotal = qtrnRotationAruco * qtrnRotationX;
  580.                         orientation [0] = qtrnRotationTotal.w, orientation [1] = qtrnRotationTotal.x, orientation [2] = qtrnRotationTotal.y, orientation [3] = qtrnRotationTotal.z;
  581.  
  582.                         marOgreObjectNode [i]->setOrientation (orientation [0], orientation [1], orientation [2], orientation [3]);
  583.  
  584. //                        // Update animation and correct position
  585.                         marBaseAnim [i]->addTime (0.08);
  586.                         marTopAnim [i]->addTime (0.08);
  587.  
  588.                         Ogre::Real offset = marOgreEntity [i]->getBoundingBox ().getHalfSize ().y;
  589.  
  590.                         marOgreObjectNode [i]->translate (0, +offset * mOgreScale, 0, Ogre::Node::TS_LOCAL);
  591.                     }
  592.                     else //Не создан ОДиН из 'entity'
  593.                         ;
  594.                 }
  595.                 else
  596.                     ; //Счётчик 'i' МЕНьШе числа РАСПОЗНАНных МАРКЕРов
  597.             }
  598.             else //МАРКЕРы ВОВСе НЕ ОБНАРУЖены
  599.                 marOgreObjectNode [i]->setVisible (false);
  600.         } //Цикл 'for'
  601.     }
  602.     else
  603.         ; //Нет изображения с 'КАМЕРа'
  604.  
  605.     cout << "Out RenderingQueued..." << endl;
  606.  
  607.     return true;
  608. }
  609.  
  610. bool HOgreWidget::frameStarted (const FrameEvent &evt) {
  611.     cout << "HOgreWidget::frameStarted" << endl;
  612.     return true;
  613. }
  614.  
  615. bool HOgreWidget::frameEnded (const FrameEvent &evt) {
  616.     cout << "HOgreWidget::frameEnded" << endl;
  617.     return true;
  618. }
  619.  
  620. Ogre::RenderSystem* HOgreWidget::chooseRenderer (RenderSystemList *renderers) {
  621.     // It would probably be wise to do something more friendly
  622.     // that just use the first available renderer
  623.     return *renderers->begin();
  624. }
  625.  
  626. int HOgreWidget::initLoop (void) {
  627.     cout << "HOgreWidget::initLoop" << endl;
  628.  
  629.     //Register as a Window listener
  630.     Ogre::WindowEventUtilities::addWindowEventListener (mOgreRenderWindow, this);
  631.  
  632.     //Adding as a Window listener
  633.     mOgreRoot->addFrameListener (this);
  634.  
  635.     return 0;
  636. }
  637.  
  638. void HOgreWidget::startLoop (void) {
  639.     cout << "HOgreWidget::startLoop" << endl;
  640.  
  641.     bool bRes = false;
  642.  
  643. //    while (true) {
  644. //        // Pump window messages for nice behaviour
  645. //        Ogre::WindowEventUtilities::messagePump ();
  646.  
  647. //        if (mOgreRenderWindow->isClosed ())
  648. //            return ;
  649.  
  650. //            // Render a frame
  651. //        try { bRes = mOgreRoot->renderOneFrame ();  }
  652. //        catch (Exception &err)
  653. //        {
  654. //            std::cerr << "An exception has occured: " << err.getFullDescription ().c_str () << std::endl;
  655. //        }
  656.  
  657. //        if (! bRes)
  658. //            return ;
  659. //    }
  660.  
  661.     cout << mOgreRoot->getNextFrameNumber () << endl;
  662.     if (mOgreRoot->getNextFrameNumber () == 0) {
  663.         try { mOgreRoot->startRendering (); }
  664.         catch (Exception &err)
  665.         {
  666.             std::cerr << "An exception has occured: " << err.getFullDescription ().c_str () << std::endl;
  667.         }
  668.     }
  669.     else
  670.         ;
  671. }
  672.  
  673. // Ogre::WindowEventListener
  674. void HOgreWidget::windowResized (Ogre::RenderWindow *rw) {
  675.     cout << "HOgreWidget::windowResized" << endl;
  676.     cout << "RenderWindow::width ()=" << rw->getWidth () << ", height ()=" << rw->getHeight () << endl;
  677.     cout << "HOgreWidget::width ()=" << width () << ", height ()=" << height () << endl;
  678.     cout << "HOgreWidget::mWidth=" << mWidth << ", mHeight=" << mHeight << endl;
  679.     cout << "call HOgreWidget::resize" << endl;
  680. //    resize (rw->getWidth (), rw->getHeight ());
  681.     cout << "HOgreWidget::width ()=" << width () << ", height ()=" << height () << endl;
  682.     cout << "HOgreWidget::mWidth=" << mWidth << ", mHeight=" << mHeight << endl;
  683. }
  684.  
  685. // Ogre::WindowEventListener
  686. void HOgreWidget::windowClosed (Ogre::RenderWindow *rw) {
  687.     cout << "HOgreWidget::windowClosed" << endl;
  688. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement