Skip to main content

History: IntermediateTutorial2Source

Source of version: 5

Copy to clipboard
            This is the source code for ((Intermediate Tutorial 2)).
{CODE(wrap="1",colors="c++")}
 #include <CEGUI/CEGUISystem.h>
 #include <CEGUI/CEGUISchemeManager.h>
 #include <CEGUI/RendererModules/Ogre/CEGUIOgreRenderer.h>
 
 #include "ExampleApplication.h"
 
 class MouseQueryListener : public ExampleFrameListener, public OIS::MouseListener
 {
 public:
 
     MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
         : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer)
     {
         // Setup default variables
         mCount = 0;
         mCurrentObject = NULL;
         mLMouseDown = false;
         mRMouseDown = false;
         mSceneMgr = sceneManager;
 
         // Reduce move speed
         mMoveSpeed = 50;
         mRotateSpeed /= 500;
 
         // Register this so that we get mouse events.
         mMouse->setEventCallback(this);
 
         // Create RaySceneQuery
         mRaySceneQuery = mSceneMgr->createRayQuery(Ray());
     } // MouseQueryListener
 
     ~MouseQueryListener()
     {
         mSceneMgr->destroyQuery(mRaySceneQuery);
     }
 
     bool frameStarted(const FrameEvent &evt)
     {
         // Process the base frame listener code.  Since we are going to be
         // manipulating the translate vector, we need this to happen first.
         if (!ExampleFrameListener::frameStarted(evt))
             return false;
 
         // Setup the scene query
         Vector3 camPos = mCamera->getPosition();
         Ray cameraRay(Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y);
         mRaySceneQuery->setRay(cameraRay);
 
         // Perform the scene query
         RaySceneQueryResult &result = mRaySceneQuery->execute();
         RaySceneQueryResult::iterator itr = result.begin();
 
         // Get the results, set the camera height
         if (itr != result.end() && itr->worldFragment)
         {
             Real terrainHeight = itr->worldFragment->singleIntersection.y;
             if ((terrainHeight + 10.0f) > camPos.y)
                 mCamera->setPosition( camPos.x, terrainHeight + 10.0f, camPos.z );
         }
 
         return true;
     }
 
     /* MouseListener callbacks. */
     bool mouseMoved(const OIS::MouseEvent &arg)
     {
         // Update CEGUI with the mouse motion
         CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
 
         // If we are dragging the left mouse button.
         if (mLMouseDown)
         {
             CEGUI::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition();
             Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width),mousePos.d_y/float(arg.state.height));
             mRaySceneQuery->setRay(mouseRay);
 
             RaySceneQueryResult &result = mRaySceneQuery->execute();
             RaySceneQueryResult::iterator itr = result.begin();
 
             if (itr != result.end() && itr->worldFragment)
                 mCurrentObject->setPosition(itr->worldFragment->singleIntersection);
         } // if
 
         // If we are dragging the right mouse button.
         else if (mRMouseDown)
         {
             mCamera->yaw(Degree(-arg.state.X.rel * mRotateSpeed));
             mCamera->pitch(Degree(-arg.state.Y.rel * mRotateSpeed));
         } // else if
 
         return true;
     }
 
     bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
     {
         // Left mouse button down
         if (id == OIS::MB_Left)
         {
             // Setup the ray scene query, use CEGUI's mouse position
             CEGUI::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition();
             Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height));
             mRaySceneQuery->setRay(mouseRay);
 
             // Execute query
             RaySceneQueryResult &result = mRaySceneQuery->execute();
             RaySceneQueryResult::iterator itr = result.begin( );
 
             // Get results, create a node/entity on the position
             if (itr != result.end() && itr->worldFragment)
             {
                 char name[16];
                 sprintf(name, "Robot%d", mCount++);
 
                 Entity *ent = mSceneMgr->createEntity(name, "robot.mesh");
                 mCurrentObject = mSceneMgr->getRootSceneNode()->createChildSceneNode(String(name) + "Node", itr->worldFragment->singleIntersection);
                 mCurrentObject->attachObject(ent);
                 mCurrentObject->setScale(0.1f, 0.1f, 0.1f);
             } // if
 
             mLMouseDown = true;
         } // if
 
         // Right mouse button down
         else if (id == OIS::MB_Right)
         {
             CEGUI::MouseCursor::getSingleton().hide();
             mRMouseDown = true;
         } // else if
 
         return true;
     }
 
     bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
     {
         // Left mouse button up
         if (id == OIS::MB_Left)
         {
             mLMouseDown = false;
         } // if
 
         // Right mouse button up
         else if (id == OIS::MB_Right)
         {
             CEGUI::MouseCursor::getSingleton().show();
             mRMouseDown = false;
         } // else if
 
         return true;
     }
 
 
 protected:
     RaySceneQuery *mRaySceneQuery;     // The ray scene query pointer
     bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
     int mCount;                        // The number of robots on the screen
     SceneManager *mSceneMgr;           // A pointer to the scene manager
     SceneNode *mCurrentObject;         // The newly created object
     CEGUI::Renderer *mGUIRenderer;     // CEGUI renderer
 };
 
 class MouseQueryApplication : public ExampleApplication
 {
 protected:
     CEGUI::OgreRenderer *mGUIRenderer;
 public:
     MouseQueryApplication()
     {
     }
 
     ~MouseQueryApplication() 
     {
     }
 protected:
     void chooseSceneManager(void)
     {
         // Use the terrain scene manager.
         mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
     }
 
     void createScene(void)
     {
         // Set ambient light
         mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
         mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
 
         // World geometry
         mSceneMgr->setWorldGeometry("terrain.cfg");
 
         // Set camera look point
         mCamera->setPosition(40, 100, 580);
         mCamera->pitch(Degree(-30));
         mCamera->yaw(Degree(-45));
 
         // CEGUI setup
         mGUIRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
 
         // Mouse
         CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"TaharezLook.scheme");
         CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
     }
 
     void createFrameListener(void)
     {
         mFrameListener = new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
         mFrameListener->showDebugOverlay(true);
         mRoot->addFrameListener(mFrameListener);
     }
 };
 
 
 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
 #define WIN32_LEAN_AND_MEAN
 #include "windows.h"
 
 INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
 #else
 int main(int argc, char **argv)
 #endif
 {
     // Create application object
     MouseQueryApplication app;
 
     try {
         app.go();
     } catch(Exception& e) {
 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
         MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
 #else
         fprintf(stderr, "An exception has occurred: %s\n",
             e.getFullDescription().c_str());
 #endif
     }
 
     return 0;
 }
 }{CODE}
        

History

Information Version
Wed 14 of Sep, 2011 11:48 GMT-0000 Flateno Added a comment on the #include "../res/resource.h" lines. My VC2010, OgreSDK 1.7.3 system did not like them, and compiled fine without. I don't have a ../res/resource.h file. 8
Wed 14 of Sep, 2011 11:40 GMT-0000 Flateno Deleted a } at the end of the .h file 7
Sat 21 of Aug, 2010 18:15 GMT-0000 atomr 6
Fri 30 of Apr, 2010 19:35 GMT-0000 jacmoe 5
Fri 30 of Apr, 2010 19:35 GMT-0000 jacmoe 4
Mon 04 of Jan, 2010 05:26 GMT-0000 jacmoe 3
Sun 06 of Dec, 2009 11:47 GMT-0000 jacmoe 2
Wed 15 of Oct, 2008 19:01 GMT-0000 OgreWikiBot Robot: Cosmetic changes 1