www.pudn.com > sancedit.rar > OgreFrameWork.cpp


#include "StdAfx.h" 
#include ".\ogreframework.h" 
#include "WireCube.h" 
#include "NewSimpleRenderable.h" 
float *pvertexData; 
CWireCube *pWireCube2; 
 
COgreFrameWork::COgreFrameWork(void) 
{ 
	mIsInit=false; 
} 
//---------------------------------------------------------------------------------------------- 
COgreFrameWork::~COgreFrameWork(void) 
{ 
} 
//---------------------------------------------------------------------------------------------------- 
bool COgreFrameWork::IsInitOgre() 
{ 
 
	if(mIsInit) 
		return true; 
	else 
		return false; 
 
} 
//-------------------------------------------------------------------------------------------------------- 
COgreFrameWork * COgreFrameWork::mInstance=NULL; 
COgreFrameWork * COgreFrameWork::GetInstance() 
{ 
	if(mInstance) 
		return mInstance; 
	else 
		return mInstance= new COgreFrameWork(); 
 
} 
//------------------------------------------------------------------------------------------------------- 
void COgreFrameWork::InitOgre(CView * pView) 
{ 
	mRoot=new Root(); 
	SetUpResources(); 
	RenderSystemList * rl=Root::getSingleton().getAvailableRenderers(); 
	GLRenderSystem * renderSys=NULL; 
	RenderSystemList::iterator it = rl->begin(); 
	while(it != rl->end()) 
	{ 
		if(-1!=(*it)->getName().find("GL") ) 
		{ 
			renderSys=(GLRenderSystem *)(*it); 
			break; 
		} 
		it++; 
	} 
		//设置色深 
	//rsys->initConfigOptions();  
	renderSys->setConfigOption("Colour Depth", "32" ); 
	//rsys->setConfigOption("Anti aliasing", "None" ); 
	//rsys->setConfigOption("Floating-point mode", "Fastest" ); 
	renderSys->setConfigOption( "Full Screen", "No" ); 
	//rsys->setConfigOption("Rendering Device","NVIDIA GeForce FX 5700VE"); 
	renderSys->setConfigOption( "VSync", "No" ); 
	//rsys->setConfigOption( "Video Mode", "800 x 600 @ 32-bit colour" ); 
	renderSys->setConfigOption( "Video Mode", "800 x 600" ); 
	renderSys->setConfigOption( "Display Frequency", "60" ); 
 
	//启用刚才设置的renderSys 
	mRoot->setRenderSystem(renderSys); 
	mRoot->initialise(false);//不自动创建窗口,手动创建----->就是我们自己指定窗口 
 
	NameValuePairList miscParams;//NameValuePairList   ======   std::map(String ,String) 
	unsigned int myHandle=(unsigned int )pView->GetSafeHwnd(); 
	mView=(CMapGenView*)pView; 
	//mWin=pView->GetWindow(SW_SHOW); 
	miscParams["externalWindowHandle"] = StringConverter::toString(myHandle); 
	mWindow=NULL; 
	mWindow=mRoot->createRenderWindow("View",800,600,false,&miscParams); 
	mSceneMgr=mRoot->getSceneManager(ST_EXTERIOR_CLOSE); 
	mCamera=mSceneMgr->createCamera("PlayCam"); 
 
 
	//AxisAlignedBox aab2; 
	// 
	//aab2.setExtents(100,100,100,155,155,155); 
	//pWireCube2 = new CWireCube(); 
	//pWireCube2->InitCube(aab2,"cube2",mSceneMgr); 
	////pWireCube2->Highlight(true,CWireCube::EBlue);*/ 
 
 
	// 
	mIsInit=true; 
	 
	 
 
 
} 
//-------------------------------------------------------------------------------------------------- 
void COgreFrameWork::SetUpResources() 
{ 
	ConfigFile cf; 
	cf.load("resources.cfg"); 
	ConfigFile::SectionIterator secti=cf.getSectionIterator(); 
	String secName,typeName,archName; 
	while(secti.hasMoreElements()) 
	{ 
		secName=secti.peekNextKey(); 
		ConfigFile::SettingsMultiMap * settings=secti.getNext(); 
		ConfigFile::SettingsMultiMap::iterator i; 
		for(i=settings->begin();i!=settings->end();++i) 
		{ 
			typeName=i->first; 
			archName=i->second; 
			ResourceGroupManager::getSingleton().addResourceLocation(archName,typeName,secName); 
 
		} 
	} 
 
} 
//---------------------------------------------------------------------------------------------- 
void COgreFrameWork::SetupScene() 
{ 
	mCamera->setPosition(20,220,20); 
 
	mCamera->lookAt(0,0,0); 
	mCamera->setNearClipDistance(1); 
	mCamera->setFarClipDistance(0); 
	Viewport *vp=mWindow->addViewport(mCamera); 
	vp->setBackgroundColour(ColourValue::White); 
	TextureManager::getSingleton().setDefaultNumMipmaps(5); 
	mSceneMgr->setAmbientLight(ColourValue(0,0,0)); 
 
	//创建灯光 
	Light *l =mSceneMgr->createLight("MainLight"); 
	l->setPosition(20,80,20); 
	mSceneMgr->setWorldGeometry("terrain.cfg"); 
 
	//// 
	//Entity *ent; 
	//ent=mSceneMgr->createEntity("Head","ogrehead.mesh"); 
	//SceneNode * head=mSceneMgr->getRootSceneNode()->createChildSceneNode("Header"); 
	//head->attachObject(ent); 
 
	 
	 
	mWindow->update(); 
 
	 
 
} 
 
//------------------------------------------------------------------------------------------------------------- 
void COgreFrameWork::UpdateOgreView() 
{ 
	if(mIsInit) 
	{ 
		mWindow->update(); 
	} 
} 
 
// 摄象机移动 
void COgreFrameWork::CameraMove(float *vec) 
{ 
	static Vector3 tempVec; 
	tempVec.x=vec[0]; 
	tempVec.y=vec[1]; 
	tempVec.z=vec[2]; 
	mCamera->moveRelative(tempVec); 
 
	 
	 
 
 
	 
} 
 
// //摄象机旋转 
void COgreFrameWork::CameraRotate(float rx, float ry) 
{ 
	Radian rarx=(Radian)rx; 
	Radian rary=(Radian)ry; 
	mCamera->pitch(rary); 
	mCamera->yaw(rarx); 
} 
 
// //在当前的摄象机所在的位置放下模型 
void COgreFrameWork::PlaceMeshAtCamera(char * meshFile, char * entityName, char * nodeName) 
{ 
	Entity * ent; 
	ent=mSceneMgr->createEntity(entityName,meshFile); 
 
	SceneNode *PlaceNode=mSceneMgr->getRootSceneNode()->createChildSceneNode(nodeName); 
	PlaceNode->attachObject(ent); 
 
	//get the camera position 
 
	Vector3 pos = mCamera->getPosition(); 
	//get the camera direction 
	Vector3 direction_vector = mCamera->getDirection(); 
	pos += direction_vector * 20.0; 
	//move the mesh to the camera's position 
	PlaceNode->translate(pos); 
 
	//update the window 
	UpdateOgreView(); 
 
 
 
 
} 
 
// //get the position of the node 
void COgreFrameWork::GetNodePosition(char * nodeName, float * pos) 
{ 
	SceneNode *pNode=mSceneMgr->getSceneNode(nodeName); 
	Vector3 vpos = pNode->getPosition(); 
	pos[0] = vpos.x; 
	pos[1] = vpos.y; 
	pos[2] = vpos.z; 
 
 
 
} 
 
void COgreFrameWork::GetNodeQuaternion(char * nodeName, float * q) 
{ 
	SceneNode * pNode=mSceneMgr->getSceneNode(nodeName); 
	Quaternion quat=pNode->getOrientation(); 
	q[0]=quat.x; 
	q[1]=quat.y; 
	q[2]=quat.z; 
	q[3]=quat.w; 
 
} 
 
// //get scale of the node 
void COgreFrameWork::GetNodeScale(char* nodeName, float * scale) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	Vector3 vscale = pNode->getScale(); 
	scale[0] = vscale.x; 
	scale[1] = vscale.y; 
	scale[2] = vscale.z; 
} 
 
// //旋转场景节点 rotate scene node 
void COgreFrameWork::RotateNode(char * nodeName, int axis , float delta) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	 
	Quaternion deltaq;  
	if (axis == 0)  
	{ 
		 
		deltaq.FromAngleAxis((Radian)delta*3.14/180.0, Vector3::UNIT_X);  
	} 
	if (axis == 1)  
	{ 
		deltaq.FromAngleAxis((Radian)delta*3.14/180.0, Vector3::UNIT_Y);  
	} 
	if (axis == 2)  
	{ 
		deltaq.FromAngleAxis((Radian)delta*3.14/180.0, Vector3::UNIT_Z);  
	} 
 
	Quaternion q = pNode->getOrientation(); 
	Quaternion totalq; 
	 
	totalq = q * deltaq;  
	pNode->setOrientation(totalq);  
	HighLight2(nodeName,true); 
} 
 
void COgreFrameWork::HighLight(char * nodeName, bool state) 
{ 
	SceneNode * pNode=mSceneMgr->getSceneNode(nodeName); 
 
	AxisAlignedBox aabNode = pNode->_getWorldAABB(); 
 
	Vector3 max = aabNode.getMaximum(); 
	Vector3 min = aabNode.getMinimum(); 
	Vector3 npos  = pNode->getPosition(); 
	Vector3 dimensionsMax; 
	Vector3 dimensionsMin; 
	dimensionsMax = max - npos; 
	dimensionsMin = min - npos; 
	AxisAlignedBox aabLocal; 
	aabLocal.setMinimum(dimensionsMin); 
	aabLocal.setMaximum(dimensionsMax); 
 
 
	// change the vertices to the new bounding box 
	//pWireCube2->InitCube(aabLocal,"cube2",mSceneMgr); 
	//NewSimpleRenderable *sr = (NewSimpleRenderable *)pWireCube2->GetNode()->getAttachedObject(0);   
	//sr->setBoundingBox(aabLocal); 
 
	//Vector3 vpos  = pNode->getPosition(); 
	//Vector3 vcube = pWireCube2->GetNode()->getPosition(); 
	//int num = pWireCube2->GetNode()->numAttachedObjects(); 
	//pWireCube2->GetNode()->setPosition(vpos); 
 
	UpdateOgreView(); 
 
	 
 
} 
 
void COgreFrameWork::HighLight2(char * nodeName, bool state) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	AxisAlignedBox aabNode = pNode->_getWorldAABB(); 
	Vector3 max = aabNode.getMaximum(); 
	Vector3 min = aabNode.getMinimum(); 
	Vector3 npos  = pNode->getPosition(); 
	Vector3 dimensionsMax; 
	Vector3 dimensionsMin; 
	dimensionsMax = max - npos; 
	dimensionsMin = min - npos; 
	AxisAlignedBox aabLocal; 
	aabLocal.setMinimum(dimensionsMin); 
	aabLocal.setMaximum(dimensionsMax); 
 
	// change the vertices to the new bounding box 
	//pWireCube2->InitCube(aabLocal,"cube2",mSceneMgr); 
 
	// change the bounding box of the SimpleRenderable 
	//SimpleRenderable *sr = (SimpleRenderable *)pWireCube2->GetNode()->getAttachedObject(0);   
	//sr->setBoundingBox(aabLocal); 
	 
	//Vector3 vpos  = pNode->getPosition(); 
	//Vector3 vcube = pWireCube2->GetNode()->getPosition(); 
	//int num = pWireCube2->GetNode()->numAttachedObjects(); 
	//pWireCube2->GetNode()->setPosition(vpos); 
 
	UpdateOgreView(); 
 
} 
 
// // scale the scene node  
void COgreFrameWork::ScaleNode(char * nodeName, int axis , float delta) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	Vector3 vscale = pNode->getScale(); 
	 
	Quaternion deltaq;  
	if (axis == 0)  
	{ 
		vscale.x += delta;  
	} 
	if (axis == 1) 
	{ 
		vscale.y += delta;  
	} 
	if (axis == 2)  
	{ 
		vscale.z += delta;  
	} 
	 
	pNode->setScale(vscale); 
	HighLight2(nodeName,true); 
} 
 
// set the position of the scene node 
void COgreFrameWork::SetNodePosition(char * nodeName, float * pos) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	pNode->setPosition(pos[0],pos[1],pos[2]); 
} 
 
void COgreFrameWork::SetNodeQuaternion(char * nodeName, float * q) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	Quaternion quat(q[3],q[0],q[1],q[2]); 
	pNode->setOrientation(quat); 
} 
 
void COgreFrameWork::SetNodeScale(char * nodeName , float * scale) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	pNode->setScale(scale[0],scale[1],scale[2]); 
 
} 
 
void COgreFrameWork::TranslateNode(char * nodeName, int axis, float delta) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
	Vector3 vpos = pNode->getPosition(); 
	 
	Quaternion deltaq;  
	if (axis == 0)  
	{ 
 
		// do this for camera space 
		float saved_y = vpos.y; 
		Vector3 direction_vector = mCamera->getDirection(); 
		vpos += direction_vector * delta; 
		vpos.y = saved_y; 
		 
		// do this for world space 
		//vpos.x += delta;  
	} 
	if (axis == 1)  
	{ 
		vpos.y += delta;  
	} 
	if (axis == 2)  
	{ 
		// do this for camera space 
		float saved_y = vpos.y; 
		Vector3 up = Vector3(0,1,0); 
		Vector3 direction_vector = mCamera->getDirection(); 
		Vector3 perpendicular = direction_vector.crossProduct(up); 
		vpos += perpendicular * delta; 
		vpos.y = saved_y; 
 
 
		// do this for world space 
		//vpos.z += delta;  
	} 
 
	pNode->setPosition(vpos); 
	HighLight2(nodeName,true); 
} 
 
void COgreFrameWork::WindowMovedOrResized(void) 
{ 
	if (IsInitOgre())  
	{ 
		//GLRenderSystem *glRendersystem = (GLRenderSystem *)mRoot->getRenderSystem(); 
		//glRendersystem->resizeRepositionWindow(mWindow); 
		 
		 
		RECT rect; 
		mView->GetWindowRect(&rect); 
		 
		mWindow->resize(rect.right-rect.left,rect.bottom-rect.top); 
		 
		 
	} 
} 
 
void COgreFrameWork::DeleteNode(char * nodeName) 
{ 
	SceneNode *pNode = mSceneMgr->getSceneNode (nodeName); 
 
	 
	// get the entity attached to this node 
	Entity *ent = (Entity *)pNode->getAttachedObject(0);   
 
	// remove the entity from this node 
	pNode->detachAllObjects(); 
 
	// delete the entity 
	mSceneMgr->removeEntity(ent); 
 
	// remove and destroy this child node 
	mSceneMgr->getRootSceneNode()->removeAndDestroyChild (nodeName); 
 
	UpdateOgreView(); 
 
}