Pre-requisite:

  1. OGRE3D Base Environment Setup (Windows)
  2. Object-Oriented Programming

Objectives:

  1. Refactor the ogre head and pack it into an object
  2. This is neither the only way nor the best way of doing it, it just shows the process of refactoring statements into class.
  3. Go through and then use it to your own application.
  4. At the end of this exercise, you will come an OgreApp runs EXACTLY THE SAME as the original generated app.
  5. So why is it useful?

Advance:

Descriptions:

  1. Use Ogre AppWizard to create a new OGRE project
  2. in the createScene method of your OgreApp

    Creating the ogrehead and the ambient light
     void Refactoring101::createScene(void)
    {
        Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
        Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
        headNode->attachObject(ogreHead);
        // Set ambient light
        mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
        // Create a light
        Ogre::Light* l = mSceneMgr->createLight("MainLight");
        l->setPosition(20,80,50);
    }
  3. Read the code : to display a 3D object, there needs to be an Entity and a Node
    1. A node can contain multiple entities.
    2. Entity cannot have the same name.
    3. Node can be unmaned, but it will be hard to retrieve.
    4. Node with same name is also not allowed.
  4. What we need is to put the ogrehead code into our custom class.
    1. Add file "HeadEntity.h" and "HeadEntity.cpp"
    2. The header file should be in <your project>\include and the cpp should be in <your project>\src (if you find error include cannot find "HeadEntity.h", it's probably because your .h file is outside include folder in the project root)
    3. Let's assume we only create one entity for each node for manipulation this time.
  5. Code into both files:
    1. header

      HeadEntity.h
      // Include used Ogre libraries
      #include <OgreEntity.h>
      #include <OgreSceneManager.h>
      #ifndef _HeadEntity_h_
      #define _HeadEntity_h_
      class HeadEntity{
      public:
      	HeadEntity();
      	~HeadEntity();
      protected:
      	Ogre::Entity* mHeadEntity;
      	Ogre::SceneNode* mHeadNode;
      };
      #endif	//_HeadEntity_h_
    2. cpp

      HeadEntity.cpp
      #include "HeadEntity.h"
      HeadEntity::HeadEntity(){
      }
      HeadEntity::~HeadEntity(){
      }
  6. Now what we want to refactoring into class are:
    1. The code that create the Ogrehead

      Need refactor
          Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
          Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
          headNode->attachObject(ogreHead);
    2. We see that the "mSceneMgr" is needed so, we overload the constructor and hide the default constructor
    3. header

      HeadEntity.h
      // Include used Ogre libraries
      #include <OgreEntity.h>
      #include <OgreSceneManager.h>
      #ifndef _HeadEntity_h_
      #define _HeadEntity_h_
      class HeadEntity{
      public:
      	HeadEntity(Ogre::SceneManager* SceneMgr);
      	~HeadEntity();
      protected:
      	HeadEntity();
      	Ogre::SceneManager* mSceneMgr;
      	Ogre::Entity* mHeadEntity;
      	Ogre::SceneNode* mHeadNode;
      };
      #endif	//_HeadEntity_h_
    4. cpp

      #include "HeadEntity.h"
      HeadEntity::HeadEntity(Ogre::SceneManager* SceneMgr):mSceneMgr(SceneMgr){
      	// Exactly the same sequence of create Scene in OgreApp
      	mHeadEntity = mSceneMgr->createEntity("Head", "ogrehead.mesh");
      	mHeadNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
      	mHeadNode->attachObject(mHeadEntity);
      }
      HeadEntity::HeadEntity(){
      }
      HeadEntity::~HeadEntity(){
      }
    5. Modify your OgreApp so it uses your class instead of creating objects separately

      #include "Refactoring101.h"
      #include "HeadEntity.h"
      //-------------------------------------------------------------------------------------
      Refactoring101::Refactoring101(void)
      {
      }
      //-------------------------------------------------------------------------------------
      Refactoring101::~Refactoring101(void)
      {
      }
      //-------------------------------------------------------------------------------------
      void Refactoring101::createScene(void)
      {
      	// Replace this with new object from class you just created
      	HeadEntity *OgreHead = new HeadEntity(mSceneMgr);
          // Set ambient light
          mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
          // Create a light
          Ogre::Light* l = mSceneMgr->createLight("MainLight");
          l->setPosition(20,80,50);
      }
  • No labels