Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/ogreode/demos/GranTurismOgre/src/GranTurismOgre.cpp @ 21

Last change on this file since 21 was 21, checked in by nicolasc, 16 years ago

added ogreode and Colladaplugin

File size: 12.9 KB
Line 
1#include "GranTurismOgre.h"
2
3#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
4#define WIN32_LEAN_AND_MEAN
5#include "windows.h"
6//------------------------------------------------------------------------------------------------
7INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
8#else
9int main(int argc, char *argv[])
10#endif
11{
12    GranTurismOgreApplication app;
13
14   
15    try 
16        {
17                app.go();
18    } 
19        catch( Ogre::Exception& e )
20        {
21#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
22        MessageBox( 0, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
23#else
24        std::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl;
25#endif
26    }
27
28    return 0;
29}
30
31
32using namespace Ogre;
33using namespace OgreOde;
34using namespace OgreOde_Prefab;
35using namespace OgreOde_Loader;
36
37//------------------------------------------------------------------------------------------------
38static const String carNames[] = {
39        "Jeep",
40        "JeepSway",
41        "Subaru"
42};
43static const String carFileNames[] = {
44        "jeep.ogreode",
45        "jeep.ogreode",
46        "subaru.ogreode"
47};
48static int sSelectedCar = 1;
49static int maxNumCar = 3;
50
51//------------------------------------------------------------------------------------------------
52GranTurismOgreFrameListener::GranTurismOgreFrameListener(RenderWindow* win, Camera* cam, Real time_step, Root *root, OgreOde::World *world) : 
53        ExampleFrameListener(win, cam),
54        _vehicle(0),
55    _world(world)
56{
57        // Reduce move speed
58    mMoveSpeed = 25;
59
60
61    dotOgreOdeLoader = new OgreOde_Loader::DotLoader(world);
62
63    const int _stepper_mode_choice = 2;
64    const int _stepper_choice = 3;
65    const Ogre::Real time_scale = Ogre::Real(1.0);
66    const Ogre::Real max_frame_time = Ogre::Real(1.0 / 4);
67    const Ogre::Real frame_rate = Ogre::Real(1.0 / 60);
68
69
70    StepHandler::StepModeType stepModeType;
71
72    switch(_stepper_mode_choice)
73    {
74    case 0: stepModeType = StepHandler::BasicStep; break;
75    case 1: stepModeType = StepHandler::FastStep; break;
76    case 2: stepModeType = StepHandler::QuickStep; break;
77
78    default: stepModeType = StepHandler::QuickStep; break;
79    }
80
81    switch (_stepper_choice)
82    {
83    case 0:
84        _stepper = new OgreOde::StepHandler(_world,
85            StepHandler::QuickStep, 
86            time_step,
87            max_frame_time,
88            time_scale);
89
90        break;
91    case 1:
92        _stepper = new OgreOde::ExactVariableStepHandler(_world, 
93                                                            stepModeType, 
94                                                                time_step,
95                                                                max_frame_time,
96                                                                time_scale);
97
98        break;
99    case 2:
100        _stepper = new OgreOde::ForwardFixedStepHandler(_world, 
101                                                    stepModeType, 
102                                                    time_step,
103                                                    max_frame_time,
104                                                    time_scale);
105
106        break;
107    case 3:
108    default:
109        _stepper = new OgreOde::ForwardFixedInterpolatedStepHandler (_world, 
110                                                                    stepModeType, 
111                                                                    time_step,
112                                                                    frame_rate,
113                                                                    max_frame_time,
114                                                                    time_scale);
115        break;
116    }
117
118        _stepper->setAutomatic(OgreOde::StepHandler::AutoMode_PostFrame, root);
119        //_stepper->setAutomatic(OgreOde::Stepper::AutoMode_PreFrame, root);
120
121        Root::getSingleton().setFrameSmoothingPeriod(5.0f);
122        //Root::getSingleton().setFrameSmoothingPeriod(0.0f);
123       
124        changeCar();
125
126        // Load up our UI and display it
127        Overlay* pOver = (Overlay*)OverlayManager::getSingleton().getByName("OgreOdeDemos/Overlay");   
128        OverlayManager::getSingleton().getOverlayElement("OgreOdeDemos/Name")->setCaption(String("Name: ") + "GranTurismo (car + trimesh)");
129        OverlayManager::getSingleton().getOverlayElement("OgreOdeDemos/Keys")->setCaption(String("Keys: ") + "I/K - Accelerate/Brake, J/L - Turn, X - Change drive mode, N - Change Car");
130        OverlayManager::getSingleton().getOverlayElement("OgreOdeDemos/OtherKeys")->setCaption(String("Extra: ") + "E - Debug Object");
131        pOver->show();
132
133}
134
135//------------------------------------------------------------------------------------------------
136GranTurismOgreFrameListener::~GranTurismOgreFrameListener()
137{
138        delete _stepper;
139}
140//------------------------------------------------------------------------------------------------
141void GranTurismOgreFrameListener::changeCar()
142{
143        sSelectedCar = (sSelectedCar + 1) % maxNumCar;
144
145        delete _vehicle;       
146    _vehicle = static_cast <OgreOde_Prefab::Vehicle *> (dotOgreOdeLoader->loadObject (carFileNames[sSelectedCar], carNames[sSelectedCar]));
147
148
149
150        // Initially (i.e. in the config file) it's rear wheel drive
151        _drive = 'R';
152
153        // Move the vehicle
154        Vector3 v_pos = mCamera->getPosition() + (mCamera->getDirection() * 15.0);
155        //v_pos.y += 10;
156        _vehicle->setPosition(v_pos);
157
158        updateInfo(); 
159}
160//------------------------------------------------------------------------------------------------
161void GranTurismOgreFrameListener::updateInfo()
162{
163        Overlay* pOver = (Overlay*)OverlayManager::getSingleton().getByName("OgreOdeDemos/Overlay"); 
164        String newInfo (String("Info: ") + carNames[sSelectedCar]);
165        switch(_drive)
166        {
167                // Switch from rear to front
168        case 'R':
169                newInfo = newInfo + " & Front wheel drive";
170                break;
171
172                // Switch from front to all
173        case 'F':
174                newInfo = newInfo + " & All wheel drive";
175                break;
176
177                // Switch from all to rear
178        case '4':
179                newInfo = newInfo + " & Rear wheel drive";
180                break;
181        }
182        OverlayManager::getSingleton().getOverlayElement("OgreOdeDemos/Info")->setCaption(newInfo);   
183}
184//------------------------------------------------------------------------------------------------
185bool GranTurismOgreFrameListener::frameStarted(const FrameEvent& evt)
186{
187        Real time = evt.timeSinceLastFrame;
188
189    bool ret = ExampleFrameListener::frameStarted(evt);
190
191        if (mTimeUntilNextToggle <= 0) 
192        {
193                // Switch debugging objects on or off
194                if (mKeyboard->isKeyDown(OIS::KC_E))
195                {
196            _world->setShowDebugGeometries(!_world->getShowDebugGeometries());
197                        mTimeUntilNextToggle = 0.5;
198        }
199        // Switch debugging Contacts on or off
200        if (mKeyboard->isKeyDown(OIS::KC_B))
201        {
202            _world->setShowDebugContact(!_world->getShowDebugContact());
203            mTimeUntilNextToggle = 0.5;
204        }
205
206                if(mKeyboard->isKeyDown(OIS::KC_N)) 
207                {
208                        changeCar();
209                        mTimeUntilNextToggle = 0.5;
210                }
211
212                if(mKeyboard->isKeyDown(OIS::KC_U)) 
213                {
214                        _stepper->pause(false);
215                        mTimeUntilNextToggle = 0.5;
216                }
217                if(mKeyboard->isKeyDown(OIS::KC_P)) 
218                {
219                        _stepper->pause(true);
220                        mTimeUntilNextToggle = 0.5;
221                }
222                // Change the drive mode between front, rear and 4wd
223        if ((mKeyboard->isKeyDown(OIS::KC_X)))
224                {
225                        switch(_drive)
226                        {
227                                // Switch from rear to front
228                        case 'R':
229                                _drive = 'F';
230
231                                _vehicle->getWheel(0)->setPowerFactor(1);
232                                _vehicle->getWheel(1)->setPowerFactor(1);
233                                _vehicle->getWheel(2)->setPowerFactor(0);
234                                _vehicle->getWheel(3)->setPowerFactor(0);
235
236                                updateInfo();
237                                break;
238
239                                // Switch from front to all
240                        case 'F':
241                                _drive = '4';
242
243                                _vehicle->getWheel(0)->setPowerFactor(0.6);
244                                _vehicle->getWheel(1)->setPowerFactor(0.6);
245                                _vehicle->getWheel(2)->setPowerFactor(0.4);
246                                _vehicle->getWheel(3)->setPowerFactor(0.4);
247
248                                updateInfo();
249                                break;
250
251                                // Switch from all to rear
252                        case '4':
253                                _drive = 'R';
254
255                                _vehicle->getWheel(0)->setPowerFactor(0);
256                                _vehicle->getWheel(1)->setPowerFactor(0);
257                                _vehicle->getWheel(2)->setPowerFactor(1);
258                                _vehicle->getWheel(3)->setPowerFactor(1);
259
260                                updateInfo();
261                                break;
262                        }
263                        mTimeUntilNextToggle = 0.5;
264                }
265        }
266        if(!_stepper->isPaused())
267        {
268                _vehicle->setInputs(mKeyboard->isKeyDown(OIS::KC_J),
269                            mKeyboard->isKeyDown(OIS::KC_L),
270                            mKeyboard->isKeyDown(OIS::KC_I),
271                            mKeyboard->isKeyDown(OIS::KC_K));
272                _vehicle->update(time);
273
274                // Thanks to Ahmed!
275                const Ogre::Real followFactor = 0.2; 
276                const Ogre::Real camHeight = 2.0; 
277                const Ogre::Real camDistance = 7.0; 
278                const Ogre::Real camLookAhead = 8.0;
279
280                Quaternion q = _vehicle->getSceneNode()->getOrientation(); 
281                Vector3 toCam = _vehicle->getSceneNode()->getPosition(); 
282
283                toCam.y += camHeight; 
284                toCam.z -= camDistance * q.zAxis().z; 
285                toCam.x -= camDistance * q.zAxis().x; 
286             
287                mCamera->move( (toCam - mCamera->getPosition()) * followFactor ); 
288                mCamera->lookAt(_vehicle->getSceneNode()->getPosition() + ((_vehicle->getSceneNode()->getOrientation() * Ogre::Vector3::UNIT_Z) * camLookAhead));
289        }
290        return ret;
291}
292//------------------------------------------------------------------------------------------------
293GranTurismOgreApplication::GranTurismOgreApplication()
294{
295        _world = 0;
296        _time_step = 0.01;
297        _track = 0;
298}
299//------------------------------------------------------------------------------------------------
300void GranTurismOgreApplication::chooseSceneManager(void)
301{
302    mSceneMgr = mRoot->createSceneManager( ST_GENERIC, "ExampleGrandTurismo" );
303}
304//------------------------------------------------------------------------------------------------
305void GranTurismOgreApplication::setupResources(void)
306{
307        ExampleApplication::setupResources();
308        ResourceGroupManager *rsm = ResourceGroupManager::getSingletonPtr();
309        StringVector groups = rsm->getResourceGroups();       
310        if (std::find(groups.begin(), groups.end(), String("OgreOde")) == groups.end())
311        {
312                FileInfoListPtr finfo =  ResourceGroupManager::getSingleton().findResourceFileInfo (
313                        "Bootstrap", "axes.mesh");
314
315                const bool isSDK =  (!finfo->empty()) && 
316                        StringUtil::startsWith (finfo->begin()->archive->getName(), "../../media/packs/ogrecore.zip", true);
317
318
319                rsm->createResourceGroup("OgreOde");
320                if (isSDK)
321                {
322                        rsm->addResourceLocation("../../../ogreode/demos/Media","FileSystem", "OgreOde");
323                }
324                else
325                {
326                        rsm->addResourceLocation("../../../../../ogreaddons/ogreode/demos/Media","FileSystem", "OgreOde");
327                }
328        }
329}
330//------------------------------------------------------------------------------------------------
331void GranTurismOgreApplication::createCamera(void)
332{
333    // Create the camera
334    mCamera = mSceneMgr->createCamera("PlayerCam");
335
336    mCamera->setPosition(Vector3(125,-14,8));
337    mCamera->lookAt(mCamera->getPosition() + Ogre::Vector3(0,0,1));
338    mCamera->setNearClipDistance( 1 );
339    mCamera->setFarClipDistance( 1000 );
340}
341//------------------------------------------------------------------------------------------------
342// Just override the mandatory create scene method
343void GranTurismOgreApplication::createScene(void)
344{
345    // Set ambient light
346    mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
347        mSceneMgr->setSkyBox(true,"GranTurismOgre/Skybox");
348
349    // Create a light
350    Light* l = mSceneMgr->createLight("MainLight");
351
352        // Accept default settings: point light, white diffuse, just set position
353    // NB I could attach the light to a SceneNode if I wanted it to move automatically with
354    //  other objects, but I don't
355    l->setPosition(20,800,50);
356        l->setSpecularColour(1,0.9,0);
357
358        l->setCastShadows(true);
359
360        mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);
361        mSceneMgr->setShadowColour(ColourValue(0.5,0.5,0.5));
362
363    _world = new OgreOde::World(mSceneMgr);
364
365    _world->setGravity(Vector3(0,-9.80665,0));
366    _world->setCFM(10e-5);
367    _world->setERP(0.8);
368    _world->setAutoSleep(true);
369    _world->setContactCorrectionVelocity(1.0);
370
371        // Create something that will step the world automatically
372
373
374
375        _world->setCollisionListener(this);
376
377        SceneNode *track_node = mSceneMgr->getRootSceneNode()->createChildSceneNode("track");
378        Entity *track_mesh = mSceneMgr->createEntity("track","racingcircuit.mesh");
379        track_node->attachObject(track_mesh);
380
381        OgreOde::EntityInformer ei(track_mesh);
382        _track = ei.createStaticTriangleMesh(_world, _world->getDefaultSpace());
383    track_mesh->setUserObject (_track);
384 
385}
386//------------------------------------------------------------------------------------------------
387// Create new frame listener
388void GranTurismOgreApplication::createFrameListener(void)
389{
390    mFrameListener= new GranTurismOgreFrameListener(mWindow, mCamera,_time_step,mRoot, _world);
391    mRoot->addFrameListener(mFrameListener);
392}
393//------------------------------------------------------------------------------------------------
394bool GranTurismOgreApplication::collision(OgreOde::Contact* contact)
395{
396        if(!OgreOde_Prefab::Vehicle::handleTyreCollision(contact))
397        {
398                contact->setBouncyness(0.0);
399                contact->setCoulombFriction(18.0);
400        }
401        return true;
402}
403//------------------------------------------------------------------------------------------------
404GranTurismOgreApplication::~GranTurismOgreApplication()
405{
406        delete _track;
407        delete _world;
408}
409
Note: See TracBrowser for help on using the repository browser.