#include "CollisionApp.h"
CollisionApp::CollisionApp(void):
mSelected(0),
mRayQuery(0),
mBoxQuery(0)
{
}
CollisionApp::~CollisionApp(void)
{
if(!mRayQuery)
mSceneMgr->destroyQuery(mRayQuery);
if(!mBoxQuery)
mSceneMgr->destroyQuery(mBoxQuery);
}
bool CollisionApp::configure(){
if(!mRoot->restoreConfig()){
if(!mRoot->showConfigDialog()){
return false;
}
}
mWindow = mRoot->initialise(true, "Collision Demonstration");
return true;
}
void CollisionApp::createScene(void)
{
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.25, 0.25, 0.25));
Ogre::Light *light = mSceneMgr->createLight("Light1");
light->setType(Ogre::Light::LT_POINT);
light->setPosition(Ogre::Vector3(0, 150, 250));
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue::White);
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -50);
Ogre::MeshManager::getSingleton().createPlane("Ground",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane, LENGTH, LENGTH, 20, 20, true, 1, LENGTH/128, LENGTH/128, Ogre::Vector3::UNIT_Z);
Ogre::Entity* entGround = mSceneMgr->createEntity("GroundEntity", "Ground");
Ogre::SceneNode *groundNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GroundNode");
groundNode->attachObject(entGround);
entGround->setMaterialName("Examples/BeachStones");
Ogre::Entity *ent = mSceneMgr->createEntity("Cube", "cube.mesh");
Ogre::MaterialPtr renderMaterial = Ogre::MaterialManager::getSingleton().create("RedMat",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
Ogre::Material *material = renderMaterial.getPointer();
material->setDiffuse(1, 0, 0, 1);
ent->setMaterial(renderMaterial);
Ogre::SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CubeNode");
node->attachObject(ent);
node->scale(0.125, 0.125, 0.125);
node->setPosition(0, 0, -100);
GameObject obj1;
obj1.init(mSceneMgr, "Object1", Ogre::Vector3(20, 0, -100), "sphere.mesh",
"Examples/Chrome");
mMap["Object1"] = obj1;
GameObject obj2;
obj2.init(mSceneMgr, "Object2", Ogre::Vector3(-20, 0, -100), "ninja.mesh");
mMap["Object2"] = obj2;
int n = 0;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
std::stringstream sstr;
sstr << "GridObject" << n;
n++;
Ogre::String name = sstr.str();
GameObject objN;
objN.init(mSceneMgr, name, Ogre::Vector3(i*20 - 50, j*20, -200),
"cube.mesh", "Examples/Rocky");
mMap[name] = objN;
}
}
}
void CollisionApp::createFrameListener(void){
BaseApplication::createFrameListener();
mTrayMgr->hideFrameStats();
mTrayMgr->hideLogo();
mTrayMgr->showCursor();
mRotate = 0.13;
mMove = SPEED;
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
mDirection = Ogre::Vector3::ZERO;
}
bool CollisionApp::frameRenderingQueued(const Ogre::FrameEvent& evt){
if (mWindow->isClosed())
return false;
if (mShutDown)
return false;
mKeyboard->capture();
mMouse->capture();
mTrayMgr->frameRenderingQueued(evt);
mCameraMan->frameRenderingQueued(evt);
std::map<Ogre::String, GameObject>::iterator it;
for(it = mMap.begin(); it != mMap.end(); it++){
(*it).second.update(evt);
}
return true;
}
bool CollisionApp::keyPressed( const OIS::KeyEvent& evt ){
switch (evt.key)
{
case OIS::KC_ESCAPE:
mShutDown = true;
break;
case OIS::KC_I:
mDirection.z = -mMove;
break;
case OIS::KC_K:
mDirection.z = mMove;
break;
case OIS::KC_J:
mDirection.x = -mMove;
break;
case OIS::KC_L:
mDirection.x = mMove;
break;
case OIS::KC_U:
mDirection.y = mMove;
break;
case OIS::KC_O:
mDirection.y = -mMove;
break;
default:
break;
}
if(mSelected){
mSelected->setDirection(mDirection);
}
mCameraMan->injectKeyDown(evt);
return true;
}
bool CollisionApp::keyReleased( const OIS::KeyEvent& evt ){
switch (evt.key)
{
case OIS::KC_I:
mDirection.z = 0;
break;
case OIS::KC_K:
mDirection.z = 0;
break;
case OIS::KC_J:
mDirection.x = 0;
break;
case OIS::KC_L:
mDirection.x = 0;
break;
case OIS::KC_U:
mDirection.y = 0;
break;
case OIS::KC_O:
mDirection.y = 0;
break;
default:
break;
}
if(mSelected){
mSelected->setDirection(mDirection);
}
mCameraMan->injectKeyUp(evt);
return true;
}
bool CollisionApp::mouseMoved( const OIS::MouseEvent& evt ){
if (evt.state.buttonDown(OIS::MB_Right))
{
mCameraMan->injectMouseMove(evt);
}
mTrayMgr->injectMouseMove(evt);
return true;
}
bool CollisionApp::mousePressed( const OIS::MouseEvent& evt, OIS::MouseButtonID id ){
if (evt.state.buttonDown(OIS::MB_Right))
{
mCameraMan->injectMouseDown(evt, id);
}
mTrayMgr->injectMouseDown(evt, id);
return true;
}
bool CollisionApp::mouseReleased( const OIS::MouseEvent& evt, OIS::MouseButtonID id ){
if (evt.state.buttonDown(OIS::MB_Right))
{
mCameraMan->injectMouseUp(evt, id);
}
mTrayMgr->injectMouseUp(evt, id);
return 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
{
CollisionApp app;
try {
app.go();
} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
std::cerr << "An exception has occurred: " <<
e.getFullDescription().c_str() << std::endl;
#endif
}
return 0;
}
#ifdef __cplusplus
}
#endif