Revision: 2462
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2462&view=rev
Author:   rorthomas
Date:     2012-03-15 13:18:01 +0000 (Thu, 15 Mar 2012)
Log Message:
-----------
work++ on new camera system

Modified Paths:
--------------
    trunk/source/main/gameplay/RoRFrameListener.cpp
    trunk/source/main/gameplay/RoRFrameListener.h
    trunk/source/main/gameplay/Savegame.cpp
    trunk/source/main/gameplay/SceneMouse.cpp
    trunk/source/main/gameplay/SceneMouse.h
    trunk/source/main/gfx/PreviewRenderer.cpp
    trunk/source/main/gfx/camera/CameraBehavior.h
    trunk/source/main/gfx/camera/CameraManager.cpp
    trunk/source/main/gfx/camera/CameraManager.h

Modified: trunk/source/main/gameplay/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.cpp     2012-03-15 09:20:58 UTC 
(rev 2461)
+++ trunk/source/main/gameplay/RoRFrameListener.cpp     2012-03-15 13:18:01 UTC 
(rev 2462)
@@ -37,6 +37,8 @@
 #include "SceneMouse.h"
 #include "DashBoardManager.h"
 
+#include "CameraManager.h"
+
 #include "RigsOfRods.h"
 
 #include "CharacterFactory.h"
@@ -780,7 +782,7 @@
 
 #ifdef USE_MYGUI
        // init GUI
-       new SceneMouse(scm, this);
+       new SceneMouse(scm);
        new GUIManager(root, scm, win);
        // create console, must be done early
        Console::getSingleton();
@@ -802,7 +804,6 @@
        //ScriptEngine::getSingleton().exploreScripts();
 #endif
 
-       enforceCameraFOVUpdate=true;
        gameStartTime = getTimeStamp();
        loadedTerrain="none";
        terrainUID="";
@@ -1935,7 +1936,7 @@
        if(loading_state==ALL_LOADED && net)
                CharacterFactory::getSingleton().updateCharacters(dt);
        else if(loading_state==ALL_LOADED && !net)
-               person->update(dt, (cameramode == CAMERA_FREE));
+               person->update(dt, (CAMERA_MODE == CAMERA_FREE));
 
        if(INPUTENGINE.getEventBoolValueBounce(EV_COMMON_QUIT_GAME))
        {
@@ -1979,7 +1980,7 @@
                        as->addData("MP_ServerName", SSETTING("Server name", 
""));
                        as->addData("MP_ServerPort", SSETTING("Server port", 
""));
                        as->addData("MP_NetworkEnabled", SSETTING("Network 
enable", "No"));
-                       as->addData("Camera_Mode", TOSTRING(cameramode));
+                       as->addData("Camera_Mode", TOSTRING(CAMERA_MODE));
                        as->addData("Camera_Position", 
TOSTRING(mCamera->getPosition()));
 
                        const RenderTarget::FrameStats& stats = 
mWindow->getStatistics();
@@ -2101,7 +2102,7 @@
        {
 
                bool enablegrab = true;
-               if (cameramode != CAMERA_FREE)
+               if (CAMERA_MODE != CAMERA_FREE)
                {
                        if (!curr_truck)
                        {
@@ -2109,26 +2110,7 @@
                                {
                                        person->setPhysicsEnabled(true);
                                }
-                               //camera mode
-                               if 
(INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) && cameramode != 
CAMERA_FREE && cameramode != CAMERA_FREE_FIXED)
-                               {
-                                       if (cameramode==CAMERA_INT)
-                                       {
-                                               //end of internal cam
-                                               camRotX=pushcamRotX;
-                                               camRotY=pushcamRotY;
-                                       }
-                                       cameramode++;
-                                       if (cameramode==CAMERA_INT)
-                                       {
-                                               //start of internal cam
-                                               pushcamRotX=camRotX;
-                                               pushcamRotY=camRotY;
-                                               camRotX=0;
-                                               
camRotY=DEFAULT_INTERNAL_CAM_PITCH;
-                                       }
-                                       if (cameramode==CAMERA_END) 
cameramode=0;
-                               }
+
                        }
                        else //we are in a vehicle
                        {
@@ -2927,52 +2909,7 @@
                                {
                                        curr_truck->beaconsToggle();
                                }
-                               //camera mode
-                               if 
(INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) && cameramode != 
CAMERA_FREE && cameramode != CAMERA_FREE_FIXED)
-                               {
-                                       if (cameramode==CAMERA_INT && 
curr_truck->currentcamera < curr_truck->freecinecamera-1)
-                                       {
-                                               curr_truck->currentcamera++;
-                                               curr_truck->changedCamera();
-                                       }
-                                       else
-                                       {
-                                               if (cameramode==CAMERA_INT)
-                                               {
-                                                       //end of internal cam
-                                                       camRotX=pushcamRotX;
-                                                       camRotY=pushcamRotY;
-                                                       
curr_truck->prepareInside(false);
-                                                       if(ow) 
ow->showDashboardOverlays(true, curr_truck);
-                                                       
curr_truck->currentcamera=-1;
-                                                       //if(bigMap) 
bigMap->setVisibility(true);
-                                                       
curr_truck->changedCamera();
-                                               }
-                                               cameramode++;
-                                               if (cameramode==CAMERA_INT)
-                                               {
-                                                       //start of internal cam
-                                                       pushcamRotX=camRotX;
-                                                       pushcamRotY=camRotY;
-                                                       camRotX=0;
-                                                       
camRotY=DEFAULT_INTERNAL_CAM_PITCH;
-                                                       
curr_truck->prepareInside(true);
-                                                       //if(bigMap) 
bigMap->setVisibility(false);
-                                                       // airplane dashboard 
in the plane visible
-                                                       if(ow)
-                                                       {
-                                                               
if(curr_truck->driveable == AIRPLANE)
-                                                                       
ow->showDashboardOverlays(true, curr_truck);
-                                                               else
-                                                                       
ow->showDashboardOverlays(false, curr_truck);
-                                                       }
-                                                       
curr_truck->currentcamera=0;
-                                                       
curr_truck->changedCamera();
-                                               }
 
-                                               if (cameramode==CAMERA_END) 
cameramode = CAMERA_EXT;
-                                       }
-                               }
                                //camera mode
                                if 
(INPUTENGINE.getEventBoolValue(EV_COMMON_PRESSURE_LESS) && curr_truck)
                                {
@@ -3063,7 +3000,7 @@
                                if(mapMode==0)
                                {
                                        bigMap->setVisibility(true);
-                                       if(cameramode!=CAMERA_INT)
+                                       if(CAMERA_MODE != CAMERA_INT)
                                        {
                                                //make it small again
                                                
bigMap->updateRenderMetrics(mWindow);
@@ -5143,9 +5080,9 @@
 
 void RoRFrameListener::changedCurrentTruck(Beam *previousTruck, Beam 
*currentTruck)
 {
-       if (cameramode==CAMERA_FREE) return;
+       if (CAMERA_MODE == CAMERA_FREE) return;
 
-       enforceCameraFOVUpdate = true;
+       CameraManager::getSingleton().triggerFOVUpdate();
 
        // hide any old dashes
        if(previousTruck && previousTruck->dash)
@@ -5226,10 +5163,6 @@
                } //make trucks synchronous
                //lastangle=0;
 
-               camRotX=0;
-               camRotY=Degree(12);
-               camDist=20;
-               
                TRIGGER_EVENT(SE_TRUCK_EXIT, 
previousTruck?previousTruck->trucknum:-1);
        }
        else
@@ -5308,6 +5241,7 @@
                }
 
                //lastangle=0;
+#if 0
                camRotX=0;
                camRotY=Degree(12);
                camDist=20;
@@ -5318,7 +5252,7 @@
                        camRotY=DEFAULT_INTERNAL_CAM_PITCH;
                        //if(bigMap) bigMap->setVisibility(false);
                }
-
+#endif // 0
                TRIGGER_EVENT(SE_TRUCK_ENTER, 
currentTruck?currentTruck->trucknum:-1);
        }
 }
@@ -5426,7 +5360,7 @@
 
        }
 
-       moveCamera(dt); //antishaking
+       CameraManager::getSingleton().update(dt); //antishaking
 
        // update mirrors after moving the camera as we use the camera position 
in mirrors
        updateTruckMirrors(dt);
@@ -5703,7 +5637,7 @@
        }
        else
        {
-               if(curr_truck && cameramode!=CAMERA_INT)
+               if(curr_truck && CAMERA_MODE != CAMERA_INT)
                {
                        if(ow) ow->showDashboardOverlays(true, curr_truck);
                        //if(bigMap) bigMap->setVisibility(true);
@@ -5881,8 +5815,8 @@
        }
 
        // store camera settings
-       Radian camRotX_saved = camRotX;
-       Radian camRotY_saved = camRotY;
+       //Radian camRotX_saved = camRotX;
+       //Radian camRotY_saved = camRotY;
 
        // store current trucks node positions
        Vector3 *nodeStorage = (Vector3 *)malloc(sizeof(Vector3) * 
curr_truck->free_node + 10);
@@ -5929,8 +5863,8 @@
 
 
        // restore camera position
-       camRotX = camRotX_saved;
-       camRotY = camRotY_saved;
+       //camRotX = camRotX_saved;
+       //camRotY = camRotY_saved;
 }
 
 
@@ -6005,4 +5939,4 @@
        overlay->add2D(panel);
        overlay->show();
 #endif // USE_SKIA
-}
\ No newline at end of file
+}

Modified: trunk/source/main/gameplay/RoRFrameListener.h
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.h       2012-03-15 09:20:58 UTC 
(rev 2461)
+++ trunk/source/main/gameplay/RoRFrameListener.h       2012-03-15 13:18:01 UTC 
(rev 2462)
@@ -78,8 +78,6 @@
 #define EVENT_AIRPLANE 4
 #define EVENT_DELETE 5
 
-#define DEFAULT_INTERNAL_CAM_PITCH Degree(-15)
-
 #define MAX_PLAYLIST_ENTRIES 20
 
 #ifdef USE_PAGED
@@ -319,7 +317,6 @@
        void setNetQuality(int q);
        int getNetQuality(bool ack=false);
        bool getNetQualityChanged();
-       bool enforceCameraFOVUpdate;
        pthread_mutex_t mutex_data;
 
        bool freeTruckPosition;

Modified: trunk/source/main/gameplay/Savegame.cpp
===================================================================
--- trunk/source/main/gameplay/Savegame.cpp     2012-03-15 09:20:58 UTC (rev 
2461)
+++ trunk/source/main/gameplay/Savegame.cpp     2012-03-15 13:18:01 UTC (rev 
2462)
@@ -32,6 +32,8 @@
 #include "RoRFrameListener.h"
 #include "OverlayWrapper.h"
 
+#include "CameraManager.h"
+
 using namespace Ogre;
 
 const char *Savegame::current_version = "ROR_SAVEGAME_v2";
@@ -97,22 +99,23 @@
                                memcpy(&h.cam_pos, pos.ptr(), sizeof(float) * 
3);
                        }
                        
-                       h.camRotX = 
RoRFrameListener::eflsingleton->camRotX.valueRadians();
-                       h.camRotY = 
RoRFrameListener::eflsingleton->camRotY.valueRadians();
-                       h.camDist = RoRFrameListener::eflsingleton->camDist;
+                       // TODO: FIX savegame camera integration
+                       //h.camRotX = 
RoRFrameListener::eflsingleton->camRotX.valueRadians();
+                       //h.camRotY = 
RoRFrameListener::eflsingleton->camRotY.valueRadians();
+                       //h.camDist = RoRFrameListener::eflsingleton->camDist;
 
 
-                       memcpy(&h.cam_ideal_pos, 
RoRFrameListener::eflsingleton->camIdealPosition.ptr(), sizeof(float) * 3);
+                       //memcpy(&h.cam_ideal_pos, 
RoRFrameListener::eflsingleton->camIdealPosition.ptr(), sizeof(float) * 3);
 
-                       h.pushcamRotX = 
RoRFrameListener::eflsingleton->pushcamRotX.valueRadians();
-                       h.pushcamRotY = 
RoRFrameListener::eflsingleton->pushcamRotY.valueRadians();
-                       h.mMoveScale  = 
RoRFrameListener::eflsingleton->mMoveScale;
-                       h.mRotScale   = 
RoRFrameListener::eflsingleton->mRotScale.valueRadians();
+                       //h.pushcamRotX = 
RoRFrameListener::eflsingleton->pushcamRotX.valueRadians();
+                       //h.pushcamRotY = 
RoRFrameListener::eflsingleton->pushcamRotY.valueRadians();
+                       //h.mMoveScale  = 
RoRFrameListener::eflsingleton->mMoveScale;
+                       //h.mRotScale   = 
RoRFrameListener::eflsingleton->mRotScale.valueRadians();
 
-                       memcpy(&h.lastPosition, 
RoRFrameListener::eflsingleton->lastPosition.ptr(), sizeof(float) * 3);
+                       //memcpy(&h.lastPosition, 
RoRFrameListener::eflsingleton->lastPosition.ptr(), sizeof(float) * 3);
 
-                       h.cameramode     = 
RoRFrameListener::eflsingleton->cameramode;
-                       h.lastcameramode = 
RoRFrameListener::eflsingleton->lastcameramode;
+                       //h.cameramode     = 
RoRFrameListener::eflsingleton->cameramode;
+                       //h.lastcameramode = 
RoRFrameListener::eflsingleton->lastcameramode;
                }
 
                // write header to file
@@ -263,6 +266,9 @@
                {
                        
RoRFrameListener::eflsingleton->person->setPosition(Vector3(h.player_pos));
                }
+
+               // TODO: FIX savegame camera integration
+               /*
                if(RoRFrameListener::eflsingleton->getCamera())
                {
                        
RoRFrameListener::eflsingleton->getCamera()->setPosition(Vector3(h.cam_pos));
@@ -283,6 +289,7 @@
 
                RoRFrameListener::eflsingleton->cameramode = h.cameramode;
                RoRFrameListener::eflsingleton->lastcameramode = 
h.lastcameramode;
+               */
        }
 
        // iterate the trucks

Modified: trunk/source/main/gameplay/SceneMouse.cpp
===================================================================
--- trunk/source/main/gameplay/SceneMouse.cpp   2012-03-15 09:20:58 UTC (rev 
2461)
+++ trunk/source/main/gameplay/SceneMouse.cpp   2012-03-15 13:18:01 UTC (rev 
2462)
@@ -23,15 +23,16 @@
 #include "BeamFactory.h"
 #include <Ogre.h>
 
+#include "CameraManager.h"
+
 #ifdef USE_MYGUI
 # include <MyGUI.h>
 #endif //USE_MYGUI
 
 using namespace Ogre;
 
-SceneMouse::SceneMouse(Ogre::SceneManager *scm, RoRFrameListener *rfl) :
+SceneMouse::SceneMouse(Ogre::SceneManager *scm) :
          scm(scm)
-       , rfl(rfl)
 {
        setSingleton(this);
        mouseGrabForce = 30000.0f;
@@ -89,6 +90,10 @@
 {
        const OIS::MouseState ms = _arg.state;
 
+       // check if handled by the camera
+       if(CameraManager::getSingleton().mouseMoved(_arg))
+               return true;
+
        // experimental mouse hack
        if(ms.buttonDown(OIS::MB_Left) && mouseGrabState == 0)
        {
@@ -157,7 +162,8 @@
                // not fixed
                return false;
        }
-       
+
+       /*
        if(ms.buttonDown(OIS::MB_Right))
        {
                rfl->camRotX += Degree( (float)ms.X.rel * 0.13f);
@@ -176,6 +182,8 @@
 #endif // USE_MYGUI
                return true;
        }
+       */
+
        return false;
 }
 
@@ -225,7 +233,7 @@
 
 Ray SceneMouse::getMouseRay()
 {
-       Camera *cam = rfl->getCamera();
+       Camera *cam = MAIN_CAMERA;//CameraManager::getSingleton()->getCamera();
        Viewport *vp = cam->getViewport();
        return 
cam->getCameraToViewportRay((float)lastMouseX/(float)vp->getActualWidth(),(float)lastMouseY/(float)vp->getActualHeight());
 }

Modified: trunk/source/main/gameplay/SceneMouse.h
===================================================================
--- trunk/source/main/gameplay/SceneMouse.h     2012-03-15 09:20:58 UTC (rev 
2461)
+++ trunk/source/main/gameplay/SceneMouse.h     2012-03-15 13:18:01 UTC (rev 
2462)
@@ -33,7 +33,7 @@
 {
        friend class RoRSingletonNoCreation<SceneMouse>;
 public:
-       SceneMouse(Ogre::SceneManager *scm, RoRFrameListener *rfl);
+       SceneMouse(Ogre::SceneManager *scm);
        ~SceneMouse();
 
     bool mouseMoved(const OIS::MouseEvent& _arg);
@@ -48,7 +48,6 @@
 
 protected:
        Ogre::SceneManager *scm;
-       RoRFrameListener *rfl;
        Ogre::ManualObject *pickLine;
        Ogre::SceneNode *pickLineNode;
        float mouseGrabForce;

Modified: trunk/source/main/gfx/PreviewRenderer.cpp
===================================================================
--- trunk/source/main/gfx/PreviewRenderer.cpp   2012-03-15 09:20:58 UTC (rev 
2461)
+++ trunk/source/main/gfx/PreviewRenderer.cpp   2012-03-15 13:18:01 UTC (rev 
2462)
@@ -31,6 +31,8 @@
 #include "BeamEngine.h"
 #include "utils.h"
 
+#include "CameraManager.h"
+
 PreviewRenderer::PreviewRenderer()
 {
        fn = SSETTING("OPT_IMGPATH", "");
@@ -114,7 +116,7 @@
 
        SceneNode *camNode = 
sceneMgr->getRootSceneNode()->createChildSceneNode();
 
-       Camera *cam = RoRFrameListener::eflsingleton->getCamera();
+       Camera *cam = MAIN_CAMERA; 
//RoRFrameListener::eflsingleton->getCamera();
        cam->setLodBias(1000.0f);
        cam->setAspectRatio(1.0f);
 

Modified: trunk/source/main/gfx/camera/CameraBehavior.h
===================================================================
--- trunk/source/main/gfx/camera/CameraBehavior.h       2012-03-15 09:20:58 UTC 
(rev 2461)
+++ trunk/source/main/gfx/camera/CameraBehavior.h       2012-03-15 13:18:01 UTC 
(rev 2462)
@@ -24,7 +24,15 @@
 
 class CameraBehavior
 {
+public:
        void update(float dt);
+
+       bool mouseMoved(const OIS::MouseEvent& _arg);
+       bool mousePressed(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
+       bool mouseReleased(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
+
+       void activate();
+       void deactivate();
 };
 
 #endif // CAMERAMANAGER_H__

Modified: trunk/source/main/gfx/camera/CameraManager.cpp
===================================================================
--- trunk/source/main/gfx/camera/CameraManager.cpp      2012-03-15 09:20:58 UTC 
(rev 2461)
+++ trunk/source/main/gfx/camera/CameraManager.cpp      2012-03-15 13:18:01 UTC 
(rev 2462)
@@ -25,9 +25,14 @@
 #include "Settings.h"
 #include "Console.h"
 #include "language.h"
+#include "BeamFactory.h"
 
+#include "CameraBehaviorFree.h"
+
 using namespace Ogre;
 
+#define DEFAULT_INTERNAL_CAM_PITCH Degree(-15)
+
 CameraManager::CameraManager(Ogre::SceneManager *scm, Ogre::Camera *cam) : 
          mSceneMgr(scm)
        , mCamera(cam)
@@ -52,6 +57,7 @@
        mDOF=0;
        mRotateSpeed = 100;
        mMoveSpeed = 50;
+       enforceCameraFOVUpdate=true;
 
        // DOF?
        bool useDOF = (BSETTING("DOF", false));
@@ -61,6 +67,8 @@
                mDOF->setEnabled(true);
        }
 
+
+
 }
 
 CameraManager::~CameraManager()
@@ -68,8 +76,81 @@
 
 }
 
+void CameraManager::createGlobalBehaviors()
+{
+       globalBehaviors["free"] = new CameraBehaviorFree();
+}
+
 void CameraManager::updateInput()
 {
+       Beam *curr_truck = BeamFactory::getSingleton().getCurrentTruck();
+
+       //camera mode
+       if (cameramode != CAMERA_FREE && 
INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) && cameramode != 
CAMERA_FREE_FIXED)
+       {
+               if (cameramode==CAMERA_INT)
+               {
+                       //end of internal cam
+                       camRotX=pushcamRotX;
+                       camRotY=pushcamRotY;
+               }
+               cameramode++;
+               if (cameramode==CAMERA_INT)
+               {
+                       //start of internal cam
+                       pushcamRotX=camRotX;
+                       pushcamRotY=camRotY;
+                       camRotX=0;
+                       camRotY=DEFAULT_INTERNAL_CAM_PITCH;
+               }
+               if (cameramode==CAMERA_END) cameramode=0;
+       }
+       //camera mode
+       if (curr_truck && INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) 
&& cameramode != CAMERA_FREE && cameramode != CAMERA_FREE_FIXED)
+       {
+               if (cameramode==CAMERA_INT && curr_truck->currentcamera < 
curr_truck->freecinecamera-1)
+               {
+                       curr_truck->currentcamera++;
+                       curr_truck->changedCamera();
+               }
+               else
+               {
+                       if (cameramode==CAMERA_INT)
+                       {
+                               //end of internal cam
+                               camRotX=pushcamRotX;
+                               camRotY=pushcamRotY;
+                               curr_truck->prepareInside(false);
+                               if(ow) ow->showDashboardOverlays(true, 
curr_truck);
+                               curr_truck->currentcamera=-1;
+                               //if(bigMap) bigMap->setVisibility(true);
+                               curr_truck->changedCamera();
+                       }
+                       cameramode++;
+                       if (cameramode==CAMERA_INT)
+                       {
+                               //start of internal cam
+                               pushcamRotX=camRotX;
+                               pushcamRotY=camRotY;
+                               camRotX=0;
+                               camRotY=DEFAULT_INTERNAL_CAM_PITCH;
+                               curr_truck->prepareInside(true);
+                               //if(bigMap) bigMap->setVisibility(false);
+                               // airplane dashboard in the plane visible
+                               if(ow)
+                               {
+                                       if(curr_truck->driveable == AIRPLANE)
+                                               ow->showDashboardOverlays(true, 
curr_truck);
+                                       else
+                                               
ow->showDashboardOverlays(false, curr_truck);
+                               }
+                               curr_truck->currentcamera=0;
+                               curr_truck->changedCamera();
+                       }
+
+                       if (cameramode==CAMERA_END) cameramode = CAMERA_EXT;
+               }
+       }
        // camera FOV settings
        if (INPUTENGINE.getEventBoolValueBounce(EV_COMMON_FOV_LESS))
        {
@@ -136,27 +217,7 @@
 
        if (INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_FREE_MODE))
        {
-               static int storedcameramode = -1;
-               if(cameramode == CAMERA_FREE || cameramode == CAMERA_FREE_FIXED)
-               {
-                       // change back to normal camera
-                       if(mDOF) mDOF->setFocusMode(DOFManager::Manual);
-                       cameramode = storedcameramode;
-                       LOG("exiting free camera mode");
-#ifdef USE_MYGUI
-                       
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("normal camera"), "camera.png", 3000);
-#endif // USE_MYGUI
-               } else if(cameramode != CAMERA_FREE && cameramode != 
CAMERA_FREE_FIXED )
-               {
-                       // enter free camera mode
-                       if(mDOF) mDOF->setFocusMode(DOFManager::Auto);
-                       storedcameramode = cameramode;
-                       cameramode = CAMERA_FREE;
-                       LOG("entering free camera mode");
-#ifdef USE_MYGUI
-                       
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("free camera"), "camera_go.png", 3000);
-#endif // USE_MYGUI
-               }
+               currentBehavior = globalBehaviors["free"];
        }
 
 }
@@ -174,9 +235,9 @@
        else
        {
                // Move about 100 units per second,
-               mMoveScale = mMoveSpeed * evt.timeSinceLastFrame;
+               mMoveScale = mMoveSpeed * dt;
                // Take about 10 seconds for full rotation
-               mRotScale = mRotateSpeed * evt.timeSinceLastFrame;
+               mRotScale = mRotateSpeed * dt;
        }
 
 
@@ -194,70 +255,6 @@
        enforceCameraFOVUpdate = false;
        lastcameramode = cameramode;
 
-       if (cameramode==CAMERA_FREE)
-       {
-               // this is a workaround for the free camera mode :)
-               Real mMoveScale = 0.1;
-               Ogre::Degree mRotScale(0.1f);
-               Ogre::Degree mRotX(0);
-               Ogre::Degree mRotY(0);
-               Vector3 mTranslateVector = Vector3::ZERO;
-
-               if(INPUTENGINE.isKeyDown(OIS::KC_LSHIFT) || 
INPUTENGINE.isKeyDown(OIS::KC_RSHIFT))
-               {
-                       mRotScale *= 3;
-                       mMoveScale *= 3;
-               }
-
-               if(INPUTENGINE.isKeyDown(OIS::KC_LCONTROL))
-               {
-                       mRotScale *= 30;
-                       mMoveScale *= 30;
-               }
-
-               if(INPUTENGINE.isKeyDown(OIS::KC_LMENU))
-               {
-                       mRotScale *= 0.05;
-                       mMoveScale *= 0.05;
-               }
-
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_SIDESTEP_LEFT))
-                       mTranslateVector.x = -mMoveScale;       // Move camera 
left
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_SIDESTEP_RIGHT))
-                       mTranslateVector.x = mMoveScale;        // Move camera 
RIGHT
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_FORWARD))
-                       mTranslateVector.z = -mMoveScale;       // Move camera 
forward
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_BACKWARDS))
-                       mTranslateVector.z = mMoveScale;        // Move camera 
backward
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_ROT_UP))
-                       mRotY += mRotScale;
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_ROT_DOWN))
-                       mRotY += -mRotScale;
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_UP))
-                       mTranslateVector.y = mMoveScale;        // Move camera 
up
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_DOWN))
-                       mTranslateVector.y = -mMoveScale;       // Move camera 
down
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_RIGHT))
-                       mRotX += -mRotScale;
-
-               if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_LEFT))
-                       mRotX += mRotScale;
-
-               mCamera->yaw(mRotX);
-               mCamera->pitch(mRotY);
-
-               Vector3 trans = mCamera->getOrientation() * mTranslateVector;
-               setCameraPositionWithCollision(mCamera->getPosition() + trans);
-       }
        if (!curr_truck)
        {
                //perso mode
@@ -649,4 +646,27 @@
        // no collision of camera, normal mode
        mCamera->setPosition(newPos);
        return true;
-}
\ No newline at end of file
+}
+
+bool CameraManager::mouseMoved(const OIS::MouseEvent& _arg)
+{
+       if(!currentBehavior) return false;
+       return currentBehavior->mouseMoved(_arg);
+}
+
+bool CameraManager::mousePressed(const OIS::MouseEvent& _arg, 
OIS::MouseButtonID _id)
+{
+       if(!currentBehavior) return false;
+       return currentBehavior->mousePressed(_arg, _id);
+}
+
+bool CameraManager::mouseReleased(const OIS::MouseEvent& _arg, 
OIS::MouseButtonID _id)
+{
+       if(!currentBehavior) return false;
+       return currentBehavior->mouseReleased(_arg, _id);
+}
+
+void triggerFOVUpdate()
+{
+       enforceCameraFOVUpdate = true;
+}

Modified: trunk/source/main/gfx/camera/CameraManager.h
===================================================================
--- trunk/source/main/gfx/camera/CameraManager.h        2012-03-15 09:20:58 UTC 
(rev 2461)
+++ trunk/source/main/gfx/camera/CameraManager.h        2012-03-15 13:18:01 UTC 
(rev 2462)
@@ -26,11 +26,16 @@
 #include "OIS.h"
 #include "Singleton.h"
 
+#include <map>
+
+#include "CameraBehavior.h"
+
 #define MAIN_CAMERA CameraManager::getSingleton().getCamera()
 #define CAMERA_MODE CameraManager::getSingleton().getCameraMode()
 
 class CameraManager : public RoRSingletonNoCreation < CameraManager >
 {
+       friend class SceneMouse;
 protected:
        Ogre::SceneManager *mSceneMgr;
        Ogre::Camera *mCamera;
@@ -47,10 +52,19 @@
        int externalCameraMode;
        int mSceneDetailIndex;
        //    Real dirSpeed;
-       Real mMoveSpeed;
-       Degree mRotateSpeed;
+       float mMoveSpeed;
+       Ogre::Degree mRotateSpeed;
        DOFManager *mDOF;
+       bool enforceCameraFOVUpdate;
 
+       CameraBehavior *currentBehavior;
+
+       std::map <Ogre::String , CameraBehavior *> globalBehaviors;
+
+       bool mouseMoved(const OIS::MouseEvent& _arg);
+       bool mousePressed(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
+       bool mouseReleased(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
+
 public:
        CameraManager(Ogre::SceneManager *scm, Ogre::Camera *cam);
        ~CameraManager();
@@ -74,8 +88,10 @@
        Ogre::Camera *getCamera() { return mCamera; };
        int getCameraMode() { return cameramode; };
 
-       bool mouseMoved(const OIS::MouseEvent& _arg);
 
+
+       void createGlobalBehaviors();
+       void triggerFOVUpdate();
 };
 
 #endif // CAMERAMANAGER_H__

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to