History: Newton Game Dynamics 2.0 Code
Source of version: 2 (current)
Copy to clipboard
This is the source code for ((OgreNewt 2)) tutorial.
{maketoc}
!!OgreNewtApplication.h
{CODE(wrap="1", colors="c++")}#ifndef __OgreNewtApplication_h_
#define __OgreNewtTut_h_
#include "ExampleApplication.h"
#include <OgreNewt.h>
#include "OgreNewt_BasicFrameListener.h"
class OgreNewtApplication :
public ExampleApplication
{
public:
OgreNewtApplication(void);
~OgreNewtApplication(void);
void createScene();
void createFrameListener(void);
void crazyCallback(OgreNewt::Body* body, float timeStep, int threadIndex );
private:
OgreNewt::World *mWorld;
};
#endif {CODE}
!!OgreNewtApplication.cpp
{CODE(wrap="1", colors="c++")}
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif
#include "OgreNewtApplication.h"
OgreNewtApplication::OgreNewtApplication(void)
{
mWorld = new OgreNewt::World();
}
OgreNewtApplication::~OgreNewtApplication(void)
{
delete mWorld;
}
void OgreNewtApplication::createScene()
{
Ogre::Light *light = mSceneMgr->createLight("main_light");
light->setPosition(0, 50, 0);
light->setDiffuseColour(Ogre::ColourValue(1, 0.5, 0.5));
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5,0.5,0.5));
mCamera->setPosition(Ogre::Vector3(100,50,100));
mCamera->lookAt(0,0,0);
Ogre::Vector3 size(100.0,5.0,100.0);
Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
Ogre::Entity* ent = mSceneMgr->createEntity( "floorobj", "box.mesh" );
node->attachObject( ent );
node->setScale( size );
OgreNewt::CollisionPtr col( new OgreNewt::CollisionPrimitives::TreeCollision( mWorld, ent, true));
OgreNewt::Body* floorbody = new OgreNewt::Body( mWorld, col );
floorbody->attachNode(node);
floorbody->setPositionOrientation( Ogre::Vector3(0,-5,0), Ogre::Quaternion::IDENTITY );
// BOX
size = Ogre::Vector3( 5, 5, 5 );
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("box_body", "box.mesh" );
node->attachObject( ent );
node->setScale( size );
// rigid body.
OgreNewt::CollisionPrimitives::Box *boxcol = new OgreNewt::CollisionPrimitives::Box(mWorld, size);
col = OgreNewt::CollisionPtr(boxcol);
OgreNewt::Body* bod = new OgreNewt::Body( mWorld, col );
bod->attachNode( node );
// initial position
bod->setPositionOrientation( Ogre::Vector3(0,20,5), Ogre::Quaternion::IDENTITY );
Ogre::Real mass = 10.0;
Ogre::Vector3 inertia, centerOfMass;
boxcol->calculateInertialMatrix(inertia, centerOfMass);
inertia*=mass;
bod->setMassMatrix( mass, inertia );
bod->setCenterOfMass(centerOfMass);
bod->setStandardForceCallback();
// CYLINDER
// cylinder with a radius of 5.5, height of 10.3
size = Ogre::Vector3( 10.3, 5.5, 5.5 );
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("cylinder_body", "cylinder.mesh" );
node->attachObject( ent );
node->setScale( size );
// rigid body.
OgreNewt::CollisionPrimitives::Cylinder *cylCol = new OgreNewt::CollisionPrimitives::Cylinder(mWorld, 5.5, 10.3);
col = OgreNewt::CollisionPtr(cylCol);
bod = new OgreNewt::Body( mWorld, col );
bod->attachNode( node );
// initial position
bod->setPositionOrientation( Ogre::Vector3(20,15,15), Ogre::Quaternion(Ogre::Degree(45),Ogre::Vector3(1,1,0)) );
mass = 5.0;
cylCol->calculateInertialMatrix(inertia, centerOfMass);
inertia*=mass;
bod->setMassMatrix( mass, inertia );
bod->setCenterOfMass(centerOfMass);
bod->setStandardForceCallback();
// CONE
// cone with a radius of 4.8, height of 5.0
size = Ogre::Vector3( 5.0, 4.8, 4.8 );
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("cone_body", "cone.mesh" );
node->attachObject( ent );
node->setScale( size );
// rigid body.
OgreNewt::CollisionPrimitives::Cone *coneCol = new OgreNewt::CollisionPrimitives::Cone(mWorld, 4.8, 5.0);
col = OgreNewt::CollisionPtr(coneCol);
bod = new OgreNewt::Body( mWorld, col );
bod->attachNode( node );
// initial position
bod->setPositionOrientation( Ogre::Vector3(0,26,5), Ogre::Quaternion(Ogre::Degree(45), Ogre::Vector3(1,0,0)) );
mass = 15.0;
coneCol->calculateInertialMatrix(inertia, centerOfMass);
inertia*=mass;
bod->setMassMatrix( mass, inertia );
bod->setCenterOfMass(centerOfMass);
bod->setStandardForceCallback();
// CONE
// cone with a radius of 4.8, height of 10.0
size = Ogre::Vector3( 10.0, 4.8, 4.8 );
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("crazy_cone_body", "cone.mesh" );
node->attachObject( ent );
node->setScale( size );
// rigid body.
coneCol = new OgreNewt::CollisionPrimitives::Cone(mWorld, 4.8, 5.0);
col = OgreNewt::CollisionPtr(coneCol);
bod = new OgreNewt::Body( mWorld, col );
bod->attachNode( node );
// initial position
bod->setPositionOrientation( Ogre::Vector3(20,26,5), Ogre::Quaternion::IDENTITY );
mass = 20.0;
coneCol->calculateInertialMatrix(inertia, centerOfMass);
inertia*=mass;
bod->setMassMatrix( mass, inertia );
bod->setCenterOfMass(centerOfMass);
bod->setCustomForceAndTorqueCallback<OgreNewtApplication>(&OgreNewtApplication::crazyCallback, this);
}
void OgreNewtApplication::createFrameListener()
{
mFrameListener = new ExampleFrameListener( mWindow, mCamera );
mRoot->addFrameListener( mFrameListener );
OgreNewt::BasicFrameListener* mOgreNewtListener;
mOgreNewtListener = new OgreNewt::BasicFrameListener( mWindow, mWorld );
mRoot->addFrameListener( mOgreNewtListener );
}
void OgreNewtApplication::crazyCallback(OgreNewt::Body *body, float timeStep, int threadIndex)
{
Ogre::Vector3 force(0,10,0), pointToApply(4,4,4);
body->addLocalForce(force, pointToApply);
}
#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
OgreNewtApplication 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;
}{CODE}