第一次发送超过字数了,被迫剪成两篇!
上一篇我们介绍了如何搭建开发环境,并创建了一个空白的窗口程序。
这里我们主要是实现在程序中装载一个简单的模型并显示出来。
首先看一下效果吧,(模型就是ogre例子中的robot.mesh),如下:
例子很简单,代码页不多,就4行。我们还是一步一步来分析吧。
首先我们上一个项目中的OgreDemo1类继承自ExampleApplication类,我们之所以什么都没
有做就能创建一个窗口,就是因为ExampleApplication为我们实现了。
首先我们打开ExampleApplication类,可以看到包含了如下几个成员变量(加入了少许注释)
-
- Root *mRoot;
-
- Camera* mCamera;
-
- SceneManager* mSceneMgr;
-
- ExampleFrameListener* mFrameListener;
-
- RenderWindow* mWindow;
-
- Ogre::String mResourcePath;
这里的ExampleFrameListener类,如果你暂时还不清楚是做什么的,不要紧,后面我们慢慢介绍。
知道了这些成员变量,我们在返回OgreDemo1.c文件中看看入口函数WinMain中是如何书写的呢?很简单就一句话:
- app.go();
先将源代码贴出来,加了详细注意:
ExampleApplication.h
- #ifndef __ExampleApplication_H__
- #define __ExampleApplication_H__
-
- #include "Ogre.h"
- #include "OgreConfigFile.h"
- #include "ExampleFrameListener.h"
-
- #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
- #include <CoreFoundation/CoreFoundation.h>
-
- std::string macBundlePath()
- {
- char path[1024];
- CFBundleRef mainBundle = CFBundleGetMainBundle();
- assert(mainBundle);
-
- CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle);
- assert(mainBundleURL);
-
- CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle);
- assert(cfStringRef);
-
- CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII);
-
- CFRelease(mainBundleURL);
- CFRelease(cfStringRef);
-
- return std::string(path);
- }
- #endif
-
- using namespace Ogre;
-
-
-
-
- class ExampleApplication
- {
- public:
- ExampleApplication()
- {
- mFrameListener = 0;
- mRoot = 0;
- #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
- mResourcePath = macBundlePath() + "/Contents/Resources/";
- #else
- mResourcePath = "";
- #endif
- }
-
- virtual ~ExampleApplication()
- {
- if (mFrameListener)
- delete mFrameListener;
- if (mRoot)
- OGRE_DELETE mRoot;
- }
-
-
- virtual void go(void)
- {
-
- if (!setup())
- return;
-
- mRoot->startRendering();
-
- destroyScene();
- }
-
- protected:
-
- Root *mRoot;
-
- Camera* mCamera;
-
- SceneManager* mSceneMgr;
-
- ExampleFrameListener* mFrameListener;
-
- RenderWindow* mWindow;
-
- Ogre::String mResourcePath;
-
- virtual bool setup(void)
- {
- String pluginsPath;
- #ifndef OGRE_STATIC_LIB
- pluginsPath = mResourcePath + "plugins.cfg";
- #endif
-
- mRoot = OGRE_NEW Root(pluginsPath,
- mResourcePath + "ogre.cfg", mResourcePath + "Ogre.log");
-
- setupResources();
-
- bool carryOn = configure();
- if (!carryOn) return false;
-
- chooseSceneManager();
-
- createCamera();
-
- createViewports();
-
- TextureManager::getSingleton().setDefaultNumMipmaps(5);
-
- createResourceListener();
-
- loadResources();
-
- createScene();
-
- createFrameListener();
- return true;
- }
-
- virtual bool configure(void)
- {
-
- if(mRoot->showConfigDialog())
- {
-
- mWindow = mRoot->initialise(true);
- return true;
- }
- else
- {
- return false;
- }
- }
-
- virtual void chooseSceneManager(void)
- {
-
- mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");
- }
- virtual void createCamera(void)
- {
-
- mCamera = mSceneMgr->createCamera("PlayerCam");
-
-
- mCamera->setPosition(Vector3(0,0,500));
-
- mCamera->lookAt(Vector3(0,0,-300));
-
- mCamera->setNearClipDistance(5);
-
-
- }
-
- virtual void createFrameListener(void)
- {
-
- mFrameListener= new ExampleFrameListener(mWindow, mCamera);
-
- mFrameListener->showDebugOverlay(true);
-
- mRoot->addFrameListener(mFrameListener);
- }
-
- virtual void createScene(void) = 0;
-
- virtual void destroyScene(void){}
-
- virtual void createViewports(void)
- {
-
- Viewport* vp = mWindow->addViewport(mCamera);
-
- vp->setBackgroundColour(ColourValue(0,0,0));
-
-
- mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
- }
-
-
- virtual void setupResources(void)
- {
- ConfigFile cf;
-
- cf.load(mResourcePath + "resources.cfg");
- ConfigFile::SectionIterator seci = cf.getSectionIterator();
- String secName, typeName, archName;
- while (seci.hasMoreElements())
- {
- secName = seci.peekNextKey();
- ConfigFile::SettingsMultiMap *settings = seci.getNext();
- ConfigFile::SettingsMultiMap::iterator i;
- for (i = settings->begin(); i != settings->end(); ++i)
- {
-
- typeName = i->first;
- archName = i->second;
- #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
- ResourceGroupManager::getSingleton().addResourceLocation(
- String(macBundlePath() + "/" + archName), typeName, secName);
- #else
- ResourceGroupManager::getSingleton().addResourceLocation(
- archName, typeName, secName);
- #endif
- }
- }
- }
-
-
- virtual void createResourceListener(void)
- {
- }
-
-
- virtual void loadResources(void)
- {
- ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
- }
- };
-
-
- #endif
ExampleFrameListener.h
- #ifndef __ExampleFrameListener_H__
- #define __ExampleFrameListener_H__
-
- #include "Ogre.h"
- #include "OgreStringConverter.h"
- #include "OgreException.h"
- #define OIS_DYNAMIC_LIB
- #include <OIS/OIS.h>
-
- using namespace Ogre;
-
- class ExampleFrameListener: public FrameListener, public WindowEventListener
- {
- protected:
- virtual void updateStats(void)
- {
- static String currFps = "Current FPS: ";
- static String avgFps = "Average FPS: ";
- static String bestFps = "Best FPS: ";
- static String worstFps = "Worst FPS: ";
- static String tris = "Triangle Count: ";
- static String batches = "Batch Count: ";
-
-
- try {
- OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");
- OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");
- OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
- OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");
-
- const RenderTarget::FrameStats& stats = mWindow->getStatistics();
- guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS));
- guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS));
- guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS)
- +" "+StringConverter::toString(stats.bestFrameTime)+" ms");
- guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS)
- +" "+StringConverter::toString(stats.worstFrameTime)+" ms");
-
- OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Core/NumTris");
- guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount));
-
- OverlayElement* guiBatches = OverlayManager::getSingleton().getOverlayElement("Core/NumBatches");
- guiBatches->setCaption(batches + StringConverter::toString(stats.batchCount));
-
- OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
- guiDbg->setCaption(mDebugText);
- }
- catch(...) { }
- }
-
- public:
-
- ExampleFrameListener(RenderWindow* win, Camera* cam, bool bufferedKeys = false, bool bufferedMouse = false,
- bool bufferedJoy = false ) :
- mCamera(cam), mTranslateVector(Vector3::ZERO), mCurrentSpeed(0), mWindow(win), mStatsOn(true), mNumScreenShots(0),
- mMoveScale(0.0f), mRotScale(0.0f), mTimeUntilNextToggle(0), mFiltering(TFO_BILINEAR),
- mAniso(1), mSceneDetailIndex(0), mMoveSpeed(100), mRotateSpeed(36), mDebugOverlay(0),
- mInputManager(0), mMouse(0), mKeyboard(0), mJoy(0)
- {
-
- mDebugOverlay = OverlayManager::getSingleton().getByName("Core/DebugOverlay");
-
- LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
- OIS::ParamList pl;
- size_t windowHnd = 0;
- std::ostringstream windowHndStr;
-
- win->getCustomAttribute("WINDOW", &windowHnd);
- windowHndStr << windowHnd;
- pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
-
- mInputManager = OIS::InputManager::createInputSystem( pl );
-
-
- mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, bufferedKeys ));
- mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, bufferedMouse ));
- try {
- mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject( OIS::OISJoyStick, bufferedJoy ));
- }
- catch(...) {
- mJoy = 0;
- }
-
-
- windowResized(mWindow);
-
- showDebugOverlay(true);
-
-
- WindowEventUtilities::addWindowEventListener(mWindow, this);
- }
-
-
- virtual void windowResized(RenderWindow* rw)
- {
- unsigned int width, height, depth;
- int left, top;
-
- rw->getMetrics(width, height, depth, left, top);
-
- const OIS::MouseState &ms = mMouse->getMouseState();
- ms.width = width;
- ms.height = height;
- }
-
-
- virtual void windowClosed(RenderWindow* rw)
- {
-
- if( rw == mWindow )
- {
- if( mInputManager )
- {
-
- mInputManager->destroyInputObject( mMouse );
- mInputManager->destroyInputObject( mKeyboard );
- mInputManager->destroyInputObject( mJoy );
-
- OIS::InputManager::destroyInputSystem(mInputManager);
- mInputManager = 0;
- }
- }
- }
-
- virtual ~ExampleFrameListener()
- {
-
- WindowEventUtilities::removeWindowEventListener(mWindow, this);
-
- windowClosed(mWindow);
- }
-
- virtual bool processUnbufferedKeyInput(const FrameEvent& evt)
- {
-
- if(mKeyboard->isKeyDown(OIS::KC_A))
- mTranslateVector.x = -mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_D))
- mTranslateVector.x = mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_UP) || mKeyboard->isKeyDown(OIS::KC_W) )
- mTranslateVector.z = -mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_DOWN) || mKeyboard->isKeyDown(OIS::KC_S) )
- mTranslateVector.z = mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_PGUP))
- mTranslateVector.y = mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_PGDOWN))
- mTranslateVector.y = -mMoveScale;
-
- if(mKeyboard->isKeyDown(OIS::KC_RIGHT))
- mCamera->yaw(-mRotScale);
-
- if(mKeyboard->isKeyDown(OIS::KC_LEFT))
- mCamera->yaw(mRotScale);
-
- if( mKeyboard->isKeyDown(OIS::KC_ESCAPE) || mKeyboard->isKeyDown(OIS::KC_Q) )
- return false;
-
- if( mKeyboard->isKeyDown(OIS::KC_F) && mTimeUntilNextToggle <= 0 )
- {
- mStatsOn = !mStatsOn;
- showDebugOverlay(mStatsOn);
- mTimeUntilNextToggle = 1;
- }
-
- if( mKeyboard->isKeyDown(OIS::KC_T) && mTimeUntilNextToggle <= 0 )
- {
- switch(mFiltering)
- {
- case TFO_BILINEAR:
- mFiltering = TFO_TRILINEAR;
- mAniso = 1;
- break;
- case TFO_TRILINEAR:
- mFiltering = TFO_ANISOTROPIC;
- mAniso = 8;
- break;
- case TFO_ANISOTROPIC:
- mFiltering = TFO_BILINEAR;
- mAniso = 1;
- break;
- default: break;
- }
- MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
- MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
-
- showDebugOverlay(mStatsOn);
- mTimeUntilNextToggle = 1;
- }
-
- if(mKeyboard->isKeyDown(OIS::KC_SYSRQ) && mTimeUntilNextToggle <= 0)
- {
- std::ostringstream ss;
- ss << "screenshot_" << ++mNumScreenShots << ".png";
- mWindow->writeContentsToFile(ss.str());
- mTimeUntilNextToggle = 0.5;
- mDebugText = "Saved: " + ss.str();
- }
-
- if(mKeyboard->isKeyDown(OIS::KC_R) && mTimeUntilNextToggle <=0)
- {
- mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;
- switch(mSceneDetailIndex) {
- case 0 : mCamera->setPolygonMode(PM_SOLID); break;
- case 1 : mCamera->setPolygonMode(PM_WIREFRAME); break;
- case 2 : mCamera->setPolygonMode(PM_POINTS); break;
- }
- mTimeUntilNextToggle = 0.5;
- }
-
- static bool displayCameraDetails = false;
- if(mKeyboard->isKeyDown(OIS::KC_P) && mTimeUntilNextToggle <= 0)
- {
- displayCameraDetails = !displayCameraDetails;
- mTimeUntilNextToggle = 0.5;
- if (!displayCameraDetails)
- mDebugText = "";
- }
-
- if(displayCameraDetails)
- mDebugText = "P: " + StringConverter::toString(mCamera->getDerivedPosition()) +
- " " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation());
- return true;
- }
-
- virtual bool processUnbufferedMouseInput(const FrameEvent& evt)
- {
-
-
-
- const OIS::MouseState &ms = mMouse->getMouseState();
- if( ms.buttonDown( OIS::MB_Right ) )
- {
- mTranslateVector.x += ms.X.rel * 0.13;
- mTranslateVector.y -= ms.Y.rel * 0.13;
- }
- else
- {
- mRotX = Degree(-ms.X.rel * 0.13);
- mRotY = Degree(-ms.Y.rel * 0.13);
- }
-
- return true;
- }
-
-
- virtual void moveCamera()
- {
-
- mCamera->yaw(mRotX);
-
- mCamera->pitch(mRotY);
-
- mCamera->moveRelative(mTranslateVector);
- }
-
- virtual void showDebugOverlay(bool show)
- {
- if (mDebugOverlay)
- {
- if (show)
- mDebugOverlay->show();
- else
- mDebugOverlay->hide();
- }
- }
-
-
- bool frameRenderingQueued(const FrameEvent& evt)
- {
-
- if(mWindow->isClosed()) return false;
-
- mSpeedLimit = mMoveScale * evt.timeSinceLastFrame;
-
-
- mKeyboard->capture();
- mMouse->capture();
- if( mJoy ) mJoy->capture();
-
- bool buffJ = (mJoy) ? mJoy->buffered() : true;
-
- Ogre::Vector3 lastMotion = mTranslateVector;
- if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )
- {
-
- if (mTimeUntilNextToggle >= 0)
- mTimeUntilNextToggle -= evt.timeSinceLastFrame;
-
-
- mMoveScale = mMoveSpeed * evt.timeSinceLastFrame;
-
- mRotScale = mRotateSpeed * evt.timeSinceLastFrame;
-
- mRotX = 0;
- mRotY = 0;
- mTranslateVector = Ogre::Vector3::ZERO;
-
- }
-
-
- if( !mKeyboard->buffered() )
- if( processUnbufferedKeyInput(evt) == false )
- return false;
- if( !mMouse->buffered() )
- if( processUnbufferedMouseInput(evt) == false )
- return false;
-
-
- if (mTranslateVector == Ogre::Vector3::ZERO)
- {
-
- mCurrentSpeed -= evt.timeSinceLastFrame * 0.3;
- mTranslateVector = lastMotion;
- }
- else
- {
-
- mCurrentSpeed += evt.timeSinceLastFrame;
-
- }
-
- if (mCurrentSpeed > 1.0)
- mCurrentSpeed = 1.0;
- if (mCurrentSpeed < 0.0)
- mCurrentSpeed = 0.0;
-
- mTranslateVector *= mCurrentSpeed;
-
-
- if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )
- moveCamera();
-
- return true;
- }
-
-
- bool frameEnded(const FrameEvent& evt)
- {
- updateStats();
- return true;
- }
-
- protected:
-
- Camera* mCamera;
-
- Vector3 mTranslateVector;
- Real mCurrentSpeed;
-
- RenderWindow* mWindow;
-
- bool mStatsOn;
-
- std::string mDebugText;
-
- unsigned int mNumScreenShots;
-
- float mMoveScale;
-
- float mSpeedLimit;
-
- Degree mRotScale;
-
- Real mTimeUntilNextToggle ;
-
- Radian mRotX, mRotY;
-
- TextureFilterOptions mFiltering;
- int mAniso;
- int mSceneDetailIndex ;
-
- Real mMoveSpeed;
-
- Degree mRotateSpeed;
-
- Overlay* mDebugOverlay;
-
-
- OIS::InputManager* mInputManager;
-
- OIS::Mouse* mMouse;
-
- OIS::Keyboard* mKeyboard;
-
- OIS::JoyStick* mJoy;
- };
-
- #endif
接续(二)
本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/382498,如需转载请自行联系原作者