www.pudn.com > TestForNetwonOgre.rar > TestForNetwonOgre.cpp


/* 
----------------------------------------------------------------------------- 
Filename:    TestForNetwonOgre.cpp 
----------------------------------------------------------------------------- 
 
This source file is generated by the Ogre AppWizard. 
 
Check out: http://conglomerate.berlios.de/wiki/doku.php?id=ogrewizards 
 
Based on the Example Framework for OGRE 
(Object-oriented Graphics Rendering Engine) 
 
Copyright (c) 2000-2007 The OGRE Team 
For the latest info, see http://www.ogre3d.org/ 
 
You may use this sample code for anything you like, it is not covered by the 
LGPL like the rest of the OGRE engine. 
----------------------------------------------------------------------------- 
*/ 
 
#include "TestForNetwonOgre.h" 
bool TestForNetwonOgreApp::quit(const CEGUI::EventArgs &e) 
{ 
	mContinue = false; 
	return true; 
} 
 
void TestForNetwonOgreApp::ForceCallBack(OgreNewt::Body* body) 
{ 
	if (body)  
	{ 
		Real mass; 
		Vector3 v,forceVector; 
		body->getMassMatrix(mass,v); 
		forceVector.y=-9.8*mass; 
		forceVector.x=0; 
		forceVector.z=0; 
		if (mKeyPressed[OIS::KC_SPACE]==TRUE)  
		{ 
			forceVector.y+=9.8*mass*2; 
		} 
		else 
		{ 
 
		} 
 
		if (mKeyPressed[OIS::KC_W]==TRUE)  
		{ 
			forceVector.z-=9.8*mass; 
		} 
		else 
		{ 
		}		 
 
		if (mKeyPressed[OIS::KC_S]==TRUE)  
		{ 
			forceVector.z=9.8*mass; 
		} 
		else 
		{ 
 
		} 
		 
		if (mKeyPressed[OIS::KC_A]==TRUE)  
		{ 
			forceVector.x-=9.8*mass; 
		} 
		else 
		{ 
 
		}		 
		 
		if (mKeyPressed[OIS::KC_D]==TRUE)  
		{ 
			forceVector.x=9.8*mass; 
		} 
		else 
		{ 
 
		} 
		body->setForce(forceVector); 
	} 
} 
//------------------------------------------------------------------------------------- 
TestForNetwonOgreApp::TestForNetwonOgreApp(void) 
{ 
	//第一步 创建 OgreNewt world. 
	m_World = new OgreNewt::World(); 
} 
//------------------------------------------------------------------------------------- 
TestForNetwonOgreApp::~TestForNetwonOgreApp(void) 
{ 
	delete m_World; 
	OgreNewt::Debugger::getSingleton().deInit(); 
 
} 
bool TestForNetwonOgreApp::frameStarted(const FrameEvent& evt) 
{ 
	bool returnValue=true; 
	returnValue=BaseApplication::frameStarted(evt); 
	if (!mContinue)  
	{ 
		return false; 
	} 
	return returnValue; 
} 
//------------------------------------------------------------------------------------- 
void TestForNetwonOgreApp::createScene(void) 
{ 
	//CEGUI init 
	mRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr); 
	mSystem = new CEGUI::System(mRenderer); 
	//选择SKIN 
	CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme"); 
	//鼠标指针和字体 
	mSystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow"); 
	mSystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12"); 
 
	CEGUI::WindowManager *win = CEGUI::WindowManager::getSingletonPtr(); 
	CEGUI::Window *sheet = win->createWindow("DefaultGUISheet", "CEGUIDemo/Sheet"); 
 
	CEGUI::Window *quit = win->createWindow("TaharezLook/Button", "CEGUIDemo/QuitButton"); 
	quit->setText("Quit"); 
	quit->setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0))); 
 
//	CEGUI::WindowManager *wmgr = CEGUI::WindowManager::getSingletonPtr(); 
//	CEGUI::Window *quit = wmgr->getWindow((CEGUI::utf8*)"CEGUIDemo/QuitButton"); 
	quit->subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&TestForNetwonOgreApp::quit, this)); 
 
	sheet->addChildWindow(quit); 
	mSystem->setGUISheet(sheet); 
	// sky box.创建天空 
	mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox"); 
 
	// shadows on!启动影子 
	mSceneMgr->setShadowTechnique( Ogre::SHADOWTYPE_STENCIL_ADDITIVE ); 
	Entity* floor; 
	SceneNode* floornode; 
	floor = mSceneMgr->createEntity("Floor", "simple_terrain.mesh" ); 
	floornode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "FloorNode" ); 
	floornode->attachObject( floor ); 
	floor->setMaterialName( "Examples/EnvMappedRustySteel" ); 
	floor->setCastShadows( false ); 
 
	//------------------------------------------------------------- 
	// add some other objects. 
	Entity* floor2; 
	SceneNode* floornode2; 
	floor2 = mSceneMgr->createEntity("Floor2", "simple_terrain.mesh" ); 
	floornode2 = floornode->createChildSceneNode( "FloorNode2" ); 
	floornode2->attachObject( floor2 ); 
	floor2->setMaterialName( "Examples/EnvMappedRustySteel" ); 
	floor2->setCastShadows( false ); 
	floornode2->setPosition( Ogre::Vector3(80.0f, 0.0f, 0.0f) ); 
 
	Entity* floor3; 
	SceneNode* floornode3; 
	floor3 = mSceneMgr->createEntity("Floor3", "simple_terrain.mesh" ); 
	floornode3 = floornode->createChildSceneNode( "FloorNode3" ); 
	floornode3->attachObject( floor3 ); 
	floor3->setMaterialName( "Examples/Chrome" ); 
	floor3->setCastShadows( false ); 
	floornode3->setPosition( Ogre::Vector3(-80.0f, -12.0f, 0.0f) ); 
	floornode3->setOrientation( Ogre::Quaternion( Ogre::Degree(15.0f), Ogre::Vector3::UNIT_Z ) ); 
	//------------------------------------------------------------- 
 
	// using the new "SceneParser" TreeCollision primitive.  this will automatically parse an entire tree of 
	// SceneNodes (parsing all children), and add collision for all meshes in the tree. 
	OgreNewt::CollisionPrimitives::TreeCollisionSceneParser* stat_col = new OgreNewt::CollisionPrimitives::TreeCollisionSceneParser( m_World ); 
	stat_col->parseScene( floornode, true ); 
	OgreNewt::Body* bod = new OgreNewt::Body( m_World, stat_col ); 
	delete stat_col; 
 
	bod->attachToNode( floornode ); 
	bod->setPositionOrientation( Ogre::Vector3(0.0,-20.0,0.0), Ogre::Quaternion::IDENTITY ); 
 
	//make a light 
	Ogre::Light* light; 
 
	light = mSceneMgr->createLight( "Light1" ); 
	light->setType( Ogre::Light::LT_POINT ); 
	light->setPosition( Ogre::Vector3(0.0, 100.0, 100.0) ); 
 
	Entity* ent=mSceneMgr->createEntity("MoveObjectEnt","ogrehead.mesh"); 
	ent->setNormaliseNormals(true); 
	SceneNode* node=mSceneMgr->getRootSceneNode()->createChildSceneNode("MoveObjectNode"); 
	node->scale(0.2,0.2,0.2); 
	node->attachObject(ent); 
	OgreNewt::Collision* col = new OgreNewt::CollisionPrimitives::Box(m_World,Vector3(10,10,10)); 
	MoveBody=new OgreNewt::Body(m_World,col); 
	Ogre::Vector3 inertia = OgreNewt::MomentOfInertia::CalcBoxSolid( 10.0, Vector3(10,10,10)); 
	MoveBody->setMassMatrix( 10.0, inertia ); 
	MoveBody->attachToNode(node); 
//	MoveBody->setCustomForceAndTorqueCallback( &ForceCallBack); 
	MoveBody->setCustomForceAndTorqueCallback( boost::bind( &TestForNetwonOgreApp::ForceCallBack, this, _1 ) );   
	MoveBody->setPositionOrientation(Vector3(0,20,0),Quaternion()); 
	OgreNewt::Joint* joint; 
	joint=new OgreNewt::BasicJoints::UpVector(m_World,MoveBody,Vector3(0,1,0)); 
//	MoveBody->setLinearDamping(0); 
	MoveBody->setAutoFreeze(FALSE); 
 
	delete col; 
	//渲染到贴图 
	//RenderTexture *tex = mRoot->getRenderSystem()->createRenderTexture("RttTex", 512, 512, TEX_TYPE_2D, PF_R8G8B8); 
 
	//Camera *cam = mSceneMgr->createCamera("RttCam"); 
	//cam->setPosition(100, 100, 100); 
	//cam->lookAt(0, 0, -300); 
 
	//Viewport *v = tex->addViewport(cam); 
	//v->setOverlaysEnabled(false); 
	//v->setClearEveryFrame(true); 
	//v->setBackgroundColour(ColourValue::Black); 
	//CEGUI::Texture *cTex = mRenderer->createTexture((CEGUI::utf8*)"RttTex"); 
 
	//CEGUI::Imageset *imageSet = CEGUI::ImagesetManager::getSingleton().createImageset((CEGUI::utf8*)"RttImageset", cTex); 
	//imageSet->defineImage((CEGUI::utf8*)"RttImage",  
	//	CEGUI::Point(0.0f, 0.0f), 
	//	CEGUI::Size(cTex->getWidth(), cTex->getHeight()), 
	//	CEGUI::Point(0.0f,0.0f)); 
 
	//CEGUI::Window *si = win->createWindow((CEGUI::utf8*)"TaharezLook/StaticImage", "RTTWindow"); 
	//si->setSize(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0.4f, 0))); 
	//si->setPosition(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0.5, 0))); 
 
	//si->setProperty("Image", CEGUI::PropertyHelper::imageToString(&imageSet->getImage((CEGUI::utf8*)"RttImage"))); 
 
	//sheet->addChildWindow(si); 
 
 
 
} 
 
void TestForNetwonOgreApp::createFrameListener() 
{ 
	// this is our custom frame listener for this app, that lets us shoot cylinders with the space bar, move 
	// the camera, etc. 
//	mFrameListener = new OgreNewtonFrameListener( mWindow, mCamera, mSceneMgr, m_World, msnCam ); 
//	mRoot->addFrameListener(mFrameListener); 
 
	// this is a basic frame listener included with OgreNewt that does nothing but update the 
	// physics at a set framerate for you.  complex project will want more control, but this 
	// works for simple demos like this.  feel free to look at the source to see how it works. 
	//	2 创建一个NewtFramListener 用于物理环境的模拟的更新 最后的一个参数用于确定理想的时间 
	mNewtonListener = new OgreNewt::BasicFrameListener( mWindow, mSceneMgr, m_World, 120 ); 
	mRoot->addFrameListener(mNewtonListener); 
	BaseApplication::createFrameListener(); 
	mContinue=TRUE; 
} 
 
 
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 
#define WIN32_LEAN_AND_MEAN 
#include "windows.h" 
#endif 
 
#ifdef __cplusplus 
	extern "C" { 
#endif 
 
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 
		INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) 
#else 
		int main(int argc, char *argv[]) 
#endif 
		{ 
			// Create application object 
			TestForNetwonOgreApp app; 
 
			try { 
				app.go(); 
			} catch( Ogre::Exception& e ) { 
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 
				MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
#else 
				std::cerr << "An exception has occured: " << 
					e.getFullDescription().c_str() << std::endl; 
#endif 
			} 
 
			return 0; 
		} 
 
#ifdef __cplusplus 
	} 
#endif