⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meshviewercnapplication.h

📁 由于Ogre自带的模型观察器无法处理中文名
💻 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 + -