📄 meshviewercnapplication.h
字号:
/*
天龙八部模型查看工具
作者:shangguanw2
E-mail: songnianhu@163.com
QQ:329967612
2009-1-5
代码可以随意使用,Enjoy!
*/
#ifndef _MESHVIEWER_CN_H_
#define _MESHVIEWER_CN_H_
#include <ExampleApplication.h>
#include "MeshViewerCnListener.h"
#include <CEGUI/CEGUIImageset.h>
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUILogger.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <CEGUI/CEGUIWindowManager.h>
#include <CEGUI/CEGUIWindow.h>
#include <CEGUI/CEGUIPropertyHelper.h>
#include <CEGUI/elements/CEGUICombobox.h>
#include <CEGUI/elements/CEGUIListbox.h>
#include <CEGUI/elements/CEGUIListboxTextItem.h>
#include <CEGUI/elements/CEGUIPushButton.h>
#include <CEGUI/elements/CEGUIScrollbar.h>
#include <CEGUI/elements/CEGUIRadioButton.h>
#include <CEGUI/elements/CEGUIFrameWindow.h>
#include <OgreCEGUIRenderer.h>
#include <OgreCEGUIResourceProvider.h>
#include <locale.h>
#include <string.h>
#define GUI_LAYOUT "meshviewercn.layout"
#define LOOKNFEEL "TaharezLook"
#define BRUSH "ClientBrush"
#define SELECTED_COLOR CEGUI::colour(0.0, 1, 0.0)
#define BASIC_COLOR CEGUI::colour(1.0, 1.0, 1.0)
static Ogre::AnimationState* animState;
void Utf8ToAscii(char* szUtf8,char* outAscii)
{
//得到UTF8编码的字符串长度
int nLen = MultiByteToWideChar(CP_UTF8,0,szUtf8,-1,NULL,NULL);
LPWSTR lpwsz = new WCHAR[nLen];
MultiByteToWideChar(CP_UTF8,0,szUtf8,-1,lpwsz,nLen);
int nLen1 = WideCharToMultiByte(CP_ACP,0,lpwsz,nLen,NULL,NULL,NULL,NULL);
LPSTR lpsz = new CHAR[nLen1];
WideCharToMultiByte(CP_ACP,0,lpwsz,nLen,lpsz,nLen1,NULL,NULL);
strncpy(outAscii,lpsz,nLen1);
delete lpsz;
delete lpwsz;
}
using namespace CEGUI;
//定义类MeshViewerCnApplication
class MeshViewerCnApplication:public ExampleApplication
{
private:
CEGUI::OgreCEGUIRenderer* mGUIRenderer;
CEGUI::System* mGUISystem;
CEGUI::Window* mEditorGuiSheet; //主窗口
Ogre::Animation* mAnim; //当前选择的Mesh的动画状
Ogre::AnimationState* mAnimState;
Ogre::SkeletonPtr mSkel;
Ogre::Entity* mEntity;
Ogre::SceneNode* mNode;
bool mHasSkel;
CUSTOM_PARAM* mParam;
bool mAnimStateEnable;
public:
//构造函数
MeshViewerCnApplication():mGUIRenderer(0),mGUISystem(0),mEditorGuiSheet(0)
{
mAnim=NULL;
mAnimState=NULL;
//mSkel=NULL;
mEntity=NULL;
mNode=NULL;
mHasSkel=false;
//自定义参数
mParam = new CUSTOM_PARAM();
mParam->animState=NULL;
mParam->stateEnabled=false;
mParam->node=NULL;
}
~MeshViewerCnApplication()
{
if(mEditorGuiSheet)
{
CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
}
if(mGUISystem){
delete mGUISystem;
mGUISystem = 0;
}
if(mGUIRenderer)
{
delete mGUIRenderer;
mGUIRenderer=0;
}
}
//初始化CEGUI系统
void InitCEGUI()
{
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow,Ogre::RENDER_QUEUE_OVERLAY,false,3000,mSceneMgr);
mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
//Load scheme
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook",(CEGUI::utf8*)"MouseArrow");
mGUISystem->setDefaultFont((CEGUI::utf8*)"simhei");
CEGUI::Window* sheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout(
(CEGUI::utf8*)GUI_LAYOUT);
mGUISystem->setGUISheet(sheet);
//向组合框添加mesh文件列表
CEGUI::Combobox* meshesbox = (CEGUI::Combobox*)CEGUI::WindowManager::getSingleton().getWindow("Root/SelectMesh");
loadGroup();
/*
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem((CEGUI::utf8*)Ogre::UTFString(L"中文示例").asUTF8_c_str(), 0);
meshesbox->addItem(item);
*/
setupEventHandlers();
}
void loadGroup()
{
//CEGUI::Combobox* cGroupBox = (CEGUI::Combobox*)CEGUI::WindowManager::getSingleton().getWindow("Root/SelectGroup");
//向组合框添加mesh文件列表
CEGUI::Combobox* cMeshBox = (CEGUI::Combobox*)CEGUI::WindowManager::getSingleton().getWindow("Root/SelectMesh");
//取得ResourceGroupManager
ResourceGroupManager* rsm = ResourceGroupManager::getSingletonPtr();
rsm->initialiseAllResourceGroups();
StringVector groupNamesList;
groupNamesList = rsm->getResourceGroups();
std::vector<Ogre::String>::const_iterator itGroup = groupNamesList.begin();
itGroup = groupNamesList.begin();
while (itGroup != groupNamesList.end())
{
StringVectorPtr resourceNames =
ResourceGroupManager::getSingleton().findResourceNames(*itGroup,
"*.mesh" );
std::vector<Ogre::String>::const_iterator itResourceName = resourceNames->begin();
while ( itResourceName != resourceNames->end() )
{
//printf("FileName: %s\n",(*itResourceName).c_str());
wchar_t wcs[100];
setlocale(LC_CTYPE,"");
mbstowcs(wcs,(*itResourceName).c_str(),99);
std::wstring name(wcs);
//CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem((CEGUI::String)name);
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem((CEGUI::utf8*)Ogre::UTFString(name).asUTF8_c_str());
cMeshBox->addItem(item);
++itResourceName;
}
++itGroup;
}
}
//设置事件处理函数
void setupEventHandlers(void)
{
/*
//欢迎窗口的OK按钮
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
wmgr.getWindow((CEGUI::utf8*)"Havok/btnOK")->subscribeEvent(
CEGUI::PushButton::EventClicked,
CEGUI::Event::Subscriber(&MeshViewerCnApplication::handleExitWelcom,this));
//设置Radio的事件处理函数
wmgr.getWindow((CEGUI::utf8*)"CreateConstraints/Radio/radioBallAndSocket")->subscribeEvent(
RadioButton::EventSelectStateChanged,Event::Subscriber(&MeshViewerCnApplication::handleRadio, this));
wmgr.getWindow((CEGUI::utf8*)"CreateConstraints/Radio/radioBreakableConstraint")->subscribeEvent(
RadioButton::EventSelectStateChanged,Event::Subscriber(&MeshViewerCnApplication::handleRadio, this));
//创建按钮
wmgr.getWindow((CEGUI::utf8*)"CreateConstraints/btnCreate")->subscribeEvent(
CEGUI::PushButton::EventClicked,
CEGUI::Event::Subscriber(&MeshViewerCnApplication::handleCreate,this));
*/
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
wmgr.getWindow("Root/SelectMesh")->subscribeEvent(
CEGUI::Combobox::EventListSelectionAccepted,
CEGUI::Event::Subscriber(&MeshViewerCnApplication::handleMeshSelect, this));
wmgr.getWindow("Root/MeshInfo/Animations")->subscribeEvent(
CEGUI::Listbox::EventSelectionChanged,
CEGUI::Event::Subscriber(&MeshViewerCnApplication::handleSelectAnimation,this));
}
//处理当选择combobox的模型
bool handleMeshSelect(const CEGUI::EventArgs& e)
{
//当模型变化时,先通知FrameListener动画状态已经无效
mParam->stateEnabled=false;
using namespace CEGUI;
const WindowEventArgs& wEventArgs = static_cast<const WindowEventArgs&>(e);
ListboxItem* item = static_cast<Combobox*>(wEventArgs.window)->getSelectedItem();
if (! item)
return false;
CEGUI::FrameWindow* w = static_cast<CEGUI::FrameWindow*>(CEGUI::WindowManager::getSingleton().getWindow("Root/MeshInfo"));
w->setText(item->getText());
char str[100];
//转换UTF8编码到Ascii
Utf8ToAscii((char*)item->getText().c_str(),str);
Ogre::String name = str;
//loadMesh(name, true);
updateAnimList(name);
return true;
}
//更新动画名列表
void updateAnimList(Ogre::String& meshname)
{
//取得显示骨骼动画的列表控件
CEGUI::Listbox* listBox = static_cast<CEGUI::Listbox*>(CEGUI::WindowManager::getSingleton().getWindow("Root/MeshInfo/Animations"));
//清空列表
listBox->resetList();
//加载mesh,创建Entity
if(mEntity!=NULL){
mSceneMgr->destroyEntity(mEntity->getName());
}
//创建Entity
mEntity=mSceneMgr->createEntity("MeshViewerCnEntity",meshname);
if(mEntity->hasSkeleton()){ //mesh包含骨骼动画文件
mHasSkel=true;
//更新动画列表
unsigned short numAnim = mEntity->getSkeleton()->getNumAnimations();
for(int i=0;i<numAnim;++i){
Ogre::String strAnimName = mEntity->getSkeleton()->getAnimation(i)->getName();
wchar_t wcs[100];
setlocale(LC_CTYPE,"");
mbstowcs(wcs,strAnimName.c_str(),99);
std::wstring name(wcs);
CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem((CEGUI::utf8*)Ogre::UTFString(name).asUTF8_c_str());
item->setSelectionBrushImage(LOOKNFEEL, BRUSH);
item->setSelectionColours(SELECTED_COLOR);
item->setTextColours (BASIC_COLOR);
listBox->addItem(item);
}
}
//挂载Entity到场景节点
//先销毁之前的场景节点
if(mNode!=NULL) mSceneMgr->destroySceneNode(mNode->getName());
mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
mNode->attachObject(mEntity);
mParam->node=mNode;
}
bool handleSelectAnimation(const CEGUI::EventArgs& e)
{
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
CEGUI::Listbox* lbox = static_cast<CEGUI::Listbox*>(wmgr.getWindow((CEGUI::utf8*)"Root/MeshInfo/Animations"));
//没有选中Item,直接退出
if(!lbox->getFirstSelectedItem()) return false;
char str[100];
Utf8ToAscii((char*)lbox->getFirstSelectedItem()->getText().c_str(),str);
std::cout<<"AnimationName:"<<str<<std::endl;
Ogre::String animname = str;
Ogre::LogManager::getSingleton().logMessage("AnimationName: "+ animname);
mAnim=mEntity->getSkeleton()->getAnimation(animname);
mAnimState = mEntity->getAnimationState(animname);
mAnimState->setEnabled(true);
mAnimState->setLoop(true);
mParam->animState=mAnimState;
mParam->stateEnabled=true;
return true;
}
void createFrameListener()
{
mFrameListener= new MeshViewerCnListener(mWindow, mCamera, mGUIRenderer,mParam);
mRoot->addFrameListener(mFrameListener);
}
void createScene(void)
{
mSceneMgr->setAmbientLight(ColourValue(1.0,1.0,1.0));
mCamera->getViewport()->setBackgroundColour(Ogre::ColourValue(0.7,0.8,0.9));
InitCEGUI();
//为显示mesh创建场景节点
//mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
Animation::setDefaultInterpolationMode(Animation::IM_LINEAR);
Animation::setDefaultRotationInterpolationMode(Animation::RIM_LINEAR);
}
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -