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();
}