如果ogre已经安装好,参考的网址主要是 民警小刘的 两篇 , 安装的和修改的各一篇。
http://liusir.name/cegui0-7-1-installation.html搞了小半天, 是。lua下的路径没设置对。 也因为自己对ogre不熟悉,OGRE源码编译的OIS在OgreMain里,1.74版本OGRE OIS都在INclude里(源码编译的ogre有OgreMain,sdk的没有)。
http://liusir.name/ogre1-7-1-changes-in-the-use-of-cegui.html
进入C:\OGRESDK\CEGUI-0.7.1\projects\premake
用记事本打开目录下的config.lua,
建议用查找的方法,找到下面的这些变量,修改为下面的
OGRE_PATHS = { "C:\OGRESDK\ogre-v1-7-0 ", "OgreMain/include", "lib" }
OIS_PATHS = { "C:\OGRESDK\ogre-v1-7-0 ","Dependencies/include/OIS", "lib" },大家注意这里面的斜杠,方向是不一样的
OGRE_PATHS = { "E:\OGRE\OgreSDK_vc9_v1-7-4", "include/OGRE", "lib" }
OIS_PATHS = { "E:\OGRE\OgreSDK_vc9_v1-7-4", "include/OIS", "lib" }
找到CEGUI_OLD_OIS_API变量,修改为false
找到OGRE_RENDERER变量,修改为true
找到SAMPLES_OGRE变量,修改为true
还有一点非常重要, CEGUI里的 datafiles 需要拷贝到 Ogre里, 其实只要ogre bin里resource.cfg路径设置对就行,来载入datefiles
我是直接在resource.cfg里添加:
[Imagesets]
FileSystem=E:/OGRE2013/Ogre_Src_v1-7-4/datafiles/imagesets
[Fonts]
FileSystem=E:/OGRE2013/Ogre_Src_v1-7-4/datafiles/fonts
[Schemes]
FileSystem=E:/OGRE2013/Ogre_Src_v1-7-4/datafiles/schemes
[LookNFeels]
FileSystem=E:/OGRE2013/Ogre_Src_v1-7-4/datafiles/looknfeel
[Layouts]
FileSystem=E:/OGRE2013/Ogre_Src_v1-7-4/datafiles/layouts
检测对不对:
#include <CEGUISystem.h>
#include <CEGUISchemeManager.h>
//#include <OgreCEGUIRenderer.h>
#include <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)
{
mCurrentObject = NULL;
mLMouseDown = false;
mSceneMgr = sceneManager;
mMouse->setEventCallback(this); // 注册鼠标监听器,方便得到鼠标事件.
mRaySceneQuery = mSceneMgr->createRayQuery(Ray()); // 创建射线场景查询
}
~MouseQueryListener()
{
mSceneMgr->destroyQuery(mRaySceneQuery); // 销毁射线场景查询指针.
}
bool frameStarted(const FrameEvent &evt)
{
// 调用ExampleFrameListener::frameStarted方法。如果它返回false,则我们也会返回false。
if (!ExampleFrameListener::frameStarted(evt))
return false;
return true;
}
bool mouseMoved(const OIS::MouseEvent &arg)
{
// 鼠标移动,更新CEGUI,调用后,鼠标指针就可以移动了
CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
return true;
}
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
// 鼠标左键按下
if (id == OIS::MB_Left)
{
onLeftPressed(arg);
mLMouseDown = true;
}
return true;
}
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
// 鼠标左键按下
if (id == OIS::MB_Left)
{
onLeftReleased(arg);
mLMouseDown = false;
}
return true;
}
//执行拾取判断的函数************************************************************
void onLeftPressed(const OIS::MouseEvent &arg)
{
if(mCurrentObject)
mCurrentObject->showBoundingBox(false);
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);
mRaySceneQuery->setSortByDistance(true);
// Execute query
RaySceneQueryResult &result = mRaySceneQuery->execute();
RaySceneQueryResult::iterator itr;
// Get results, create a node/entity on the position
for ( itr = result.begin(); itr != result.end(); itr++ )
{
if (itr->movable && itr->movable->getName().substr(0, 5) != "tile[")
{
mCurrentObject = itr->movable->getParentSceneNode();
break;
} // if
} // for
if(mCurrentObject)
mCurrentObject->showBoundingBox(true);
}
void onLeftReleased(const OIS::MouseEvent &arg)
{
}
protected:
//
// 帧监听器
RaySceneQuery *mRaySceneQuery; // 射线场景查询指针
bool mLMouseDown; // 如果按下鼠标按钮,返回True
SceneManager *mSceneMgr; // 指向场景管理器的指针
SceneNode *mCurrentObject; // 新创建的物休
CEGUI::Renderer *mGUIRenderer; // CEGUI渲染器
bool mRobotMode; //当前机器人状态
};
class MouseQueryApplication : public ExampleApplication
{
protected:
CEGUI::OgreRenderer *mGUIRenderer;
//CEGUI::System *mGUISystem;
public:
MouseQueryApplication()
{
}
~MouseQueryApplication()
{
}
protected:
void chooseSceneManager(void)
{
// 创建一个地形场景管理器.
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
}
void createScene(void)
{
// 设定摄像机的参数
mCamera->setPosition(40, 100, 580);
//待选取的节点
SceneNode* node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();
Entity *ent1 = mSceneMgr->createEntity("ninja", "ninja.mesh");
node1->attachObject(ent1);
node1->setPosition(Vector3(100,0,0));
SceneNode* node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();
Entity *ent3 = mSceneMgr->createEntity("robot", "robot.mesh");
node3->attachObject(ent3);
node3->setPosition(Vector3(-100,0,0));
// 启用CEGUI
mGUIRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"TaharezLook.scheme");
CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
// CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::LoggingLevel::Informative);
///new chance
//CEGUI::SchemeManager::getSingleton().create("TaharezLook.scheme");
//CEGUI::System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow");
//CEGUI::MouseCursor::getSingleton().setImage("TaharezLook","MouseMoveCursor");
// 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);
}
};
int main()
{
MouseQueryApplication cpp;
cpp.go();
return 0;
}