Revision: 2766
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2766&view=rev
Author:   ulteq
Date:     2012-06-01 05:54:01 +0000 (Fri, 01 Jun 2012)
Log Message:
-----------
merged trunk into branch

Modified Paths:
--------------
    branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.cpp
    branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.h
    branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.cpp
    branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.h
    branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehavior.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFixed.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFree.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorStatic.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicle.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleCineCam.h
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.cpp
    
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.h
    branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.cpp
    branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.h
    branches/20120601_Testing_v0.39.7/source/main/physics/Beam.cpp
    branches/20120601_Testing_v0.39.7/source/main/physics/Beam.h
    branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.cpp
    branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.h

Modified: branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.cpp       
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.cpp       
2012-06-01 05:54:01 UTC (rev 2766)
@@ -316,43 +316,130 @@
                }
        }
 
-       // gear hack
-       if (automode == AUTOMATIC && curGear >= 0 && !shifting && !postshifting 
&& (autoselect == DRIVE || autoselect == TWO))
+       if (doUpdate)
        {
-               if ((curEngineRPM > maxRPM - 100.0f && curGear > 1) || 
curWheelRevolutions * gearsRatio[curGear + 1] > maxRPM - 100.0f)
+               // gear hack
+               if (automode == AUTOMATIC && curGear >= 0 && !shifting && 
!postshifting && (autoselect == DRIVE || autoselect == TWO))
                {
-                       if ((autoselect == DRIVE && curGear < numGears) || 
(autoselect == TWO && curGear < 2))
+                       if ((curEngineRPM > maxRPM - 100.0f && curGear > 1) || 
curWheelRevolutions * gearsRatio[curGear + 1] > maxRPM - 100.0f)
                        {
-                               shift(1);
+                               if ((autoselect == DRIVE && curGear < numGears) 
|| (autoselect == TWO && curGear < 2))
+                               {
+                                       shift(1);
+                               }
+                       } else if (curGear > 1 && curEngineRPM < idleRPM)
+                       {
+                               shift(-1);
                        }
-               } else if (curGear > 1 && curEngineRPM < idleRPM)
-               {
-                       shift(-1);
                }
-       }
 
-       // engine speed limiter
-       if (curEngineRPM > maxRPM + 500.0f) // you could add a factor of 1.248f 
for legacy purposes (a factor of 1.0f significantly lowers the top speed of 
most vehicles)
-       {
-               setAcc(0.0f);
-       }
+               // gear hack++
+               if (automode == AUTOMATIC && autoselect == DRIVE && curGear > 0 
&& !shifting && !postshifting)
+               {
+                       static float oneThirdRPMRange = (maxRPM - idleRPM) / 
3.0f;
+                       static float halfRPMRange = (maxRPM - idleRPM) / 2.0f;
+                       static std::deque<float> rpms;
+                       static std::deque<float> accs;
+                       static std::deque<float> brakes;
 
-       // avoid over-revving
-       if (automode <= SEMIAUTO && curGear != 0)
-       {
-               if (std::abs(curWheelRevolutions * gearsRatio[curGear + 1]) > 
maxRPM * 1.05f)
-               {
-                       float clutch = 0.0f + 1.0f / (1.0f + 
std::abs(curWheelRevolutions * gearsRatio[curGear + 1] - maxRPM * 1.05f) / 
2.0f);
-                       curClutch = std::min(clutch, curClutch);
+                       rpms.push_front(curEngineRPM);
+                       accs.push_front(curAcc);
+                       brakes.push_front(curBrake);
+
+                       float avgRPM = 0.0f;
+                       float avgAcc = 0.0f;
+                       float avgBrake = 0.0f;
+
+                       for (unsigned int i=0; i < accs.size(); i++)
+                       {
+                               avgRPM += rpms[i];
+                               avgAcc += accs[i];
+                               avgBrake += brakes[i];
+                       }
+
+                       avgRPM /= rpms.size();
+                       avgAcc /= accs.size();
+                       avgBrake /= brakes.size();
+
+                       int newGear = curGear;
+                       
+                       if (avgAcc > 0.8f && curEngineRPM < maxRPM - 
oneThirdRPMRange)
+                       {
+                               while (newGear > 1 && curWheelRevolutions * 
gearsRatio[newGear] < maxRPM - oneThirdRPMRange)
+                               {
+                                       newGear--;
+                               }
+                       } else if (avgAcc > 0.6f && curAcc < 0.8f && curAcc > 
avgAcc + 0.3f && curEngineRPM < idleRPM + halfRPMRange)
+                       {
+                               if (newGear > 1 && curWheelRevolutions * 
gearsRatio[newGear] < idleRPM + halfRPMRange)
+                               {
+                                       newGear--;
+                               }
+                       } else if (avgAcc > 0.4f && curAcc < 0.8f && curAcc > 
avgAcc + 0.1f && curEngineRPM < idleRPM + halfRPMRange)
+                       {
+                               if (newGear > 1 && curWheelRevolutions * 
gearsRatio[newGear] < idleRPM + oneThirdRPMRange)
+                               {
+                                       newGear--;
+                               }
+                       } else if (avgBrake < 0.2f && curAcc < avgAcc + 0.1f && 
curEngineRPM > avgRPM - halfRPMRange / 10.0f)
+                       {
+                               if (avgAcc < 0.6f && avgAcc > 0.4f && 
curEngineRPM > idleRPM + oneThirdRPMRange && curEngineRPM < maxRPM - 
oneThirdRPMRange)
+                               {
+                                       if (newGear < numGears && 
curWheelRevolutions * gearsRatio[newGear + 2] > idleRPM + oneThirdRPMRange)
+                                       {
+                                               newGear++;
+                                       }
+                               } else if (avgAcc < 0.4f && avgAcc > 0.2f && 
curEngineRPM > idleRPM + oneThirdRPMRange)
+                               {
+                                       if (newGear < numGears && 
curWheelRevolutions * gearsRatio[newGear + 2] > idleRPM + oneThirdRPMRange / 
2.0f)
+                                       {
+                                               newGear++;
+                                       }
+                               } else if (avgAcc < 0.2f && curEngineRPM > 
idleRPM + oneThirdRPMRange / 2.0f && curEngineRPM < idleRPM + halfRPMRange)
+                               {
+                                       if (newGear < numGears && 
curWheelRevolutions * gearsRatio[newGear + 2] > idleRPM + oneThirdRPMRange / 
2.0f)
+                                       {
+                                               newGear++;
+                                       }
+                               }
+                       }
+
+                       if (newGear < curGear && std::abs(curWheelRevolutions * 
(gearsRatio[newGear + 1] - gearsRatio[curGear + 1])) > oneThirdRPMRange / 6.0f 
||
+                               newGear > curGear && 
std::abs(curWheelRevolutions * (gearsRatio[newGear + 1] - gearsRatio[curGear + 
1])) > oneThirdRPMRange / 3.0f)
+                       {
+                               shiftTo(newGear);
+                       }
+
+                       if (accs.size() > 50)
+                       {
+                               rpms.pop_back();
+                               accs.pop_back();
+                               brakes.pop_back();
+                       }
                }
-               if (curGear * curWheelRevolutions < -10.0f)
+#if 0
+               // engine speed limiter
+               if (curEngineRPM > maxRPM + 500.0f) // significantly lowers the 
top speed of most vehicles
+                       setAcc(0.0f);
+               }
+#endif
+               // avoid over-revving
+               if (automode <= SEMIAUTO && curGear != 0)
                {
-                       float clutch = 0.0f + 1.0f / (1.0f + std::abs(-10.0f - 
curGear * curWheelRevolutions) / 2.0f);
-                       curClutch = std::min(clutch, curClutch);
+                       if (std::abs(curWheelRevolutions * gearsRatio[curGear + 
1]) > maxRPM * 1.25f)
+                       {
+                               float clutch = 0.0f + 1.0f / (1.0f + 
std::abs(curWheelRevolutions * gearsRatio[curGear + 1] - maxRPM * 1.25f) / 
2.0f);
+                               curClutch = std::min(clutch, curClutch);
+                       }
+                       if (curGear * curWheelRevolutions < -10.0f)
+                       {
+                               float clutch = 0.0f + 1.0f / (1.0f + 
std::abs(-10.0f - curGear * curWheelRevolutions) / 2.0f);
+                               curClutch = std::min(clutch, curClutch);
+                       }
                }
        }
 
-       // audio stuff  
+       // audio stuff
        updateAudio(doUpdate);
 }
 
@@ -392,7 +479,7 @@
 
 void BeamEngine::toggleAutoMode()
 {
-       automode = (automode + 1) % MANUAL_RANGES;
+       automode = (automode + 1) % (MANUAL_RANGES + 1);
 
        // this switches off all automatic symbols when in manual mode
        if (automode != AUTOMATIC)
@@ -440,6 +527,11 @@
        curAcc = val * 0.94f + 0.06f;
 }
 
+void BeamEngine::setBrake(float val)
+{
+       curBrake = val;
+}
+
 float BeamEngine::getTurboPSI()
 {
        return curTurboRPM / 10000.0f;

Modified: branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.h
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.h 
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gameplay/BeamEngine.h 
2012-06-01 05:54:01 UTC (rev 2766)
@@ -45,6 +45,7 @@
 
        void setAcc(float val);
        void setAutoMode(int mode);
+       void setBrake(float val);
        void setClutch(float clutch);
        void setOptions(float einertia, char etype, float eclutch, float ctime, 
float stime, float pstime);
        void setRPM(float rpm);
@@ -117,6 +118,7 @@
        char type;
        float brakingTorque;
        float curAcc;
+       float curBrake;
        float curEngineRPM;
        float engineTorque;
        float hydropump;

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.cpp 
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.cpp 
2012-06-01 05:54:01 UTC (rev 2766)
@@ -1819,7 +1819,7 @@
 #endif //USE_MYGUI
 }
 
-void updateCruiseControl(Beam* curr_truck, float dt)
+void RoRFrameListener::updateCruiseControl(Beam* curr_truck, float dt)
 {
        if (INPUTENGINE.getEventValue(EV_TRUCK_BRAKE) > 0.05f ||
                INPUTENGINE.getEventValue(EV_TRUCK_MANUAL_CLUTCH) > 0.05f ||
@@ -1903,7 +1903,7 @@
        }
 }
 
-void checkSpeedlimit(Beam* curr_truck, float dt)
+void RoRFrameListener::checkSpeedlimit(Beam* curr_truck, float dt)
 {
        if (curr_truck->sl_enabled && curr_truck->engine->getGear() != 0)
        {
@@ -2398,22 +2398,24 @@
                                                {
                                                        bool arcadeControls = 
BSETTING("ArcadeControls", false);
 
-                                                       float accval = 
INPUTENGINE.getEventValue(EV_TRUCK_ACCELERATE);
-                                                       float brake  = 
INPUTENGINE.getEventValue(EV_TRUCK_BRAKE);
+                                                       float accl  = 
INPUTENGINE.getEventValue(EV_TRUCK_ACCELERATE);
+                                                       float brake = 
INPUTENGINE.getEventValue(EV_TRUCK_BRAKE);
 
+                                                       
curr_truck->engine->setBrake(brake);
+
                                                        // arcade controls are 
only working with auto-clutch!
                                                        if (!arcadeControls || 
curr_truck->engine->getAutoMode() > BeamEngine::SEMIAUTO)
                                                        {
                                                                // classic 
mode, realistic
                                                                if 
(curr_truck->engine)
                                                                {
-                                                                       
curr_truck->engine->autoSetAcc(accval);
+                                                                       
curr_truck->engine->autoSetAcc(accl);
                                                                }
                                                                
curr_truck->brake = brake * curr_truck->brakeforce;
                                                        } else
                                                        {
                                                                // start engine
-                                                               if (accval > 0 
&& curr_truck->engine && curr_truck->engine->hasContact() && 
!curr_truck->engine->isRunning())
+                                                               if 
(curr_truck->engine->hasContact() && !curr_truck->engine->isRunning() && (accl 
> 0 || brake > 0))
                                                                {
                                                                        
curr_truck->engine->start();
                                                                }
@@ -2424,7 +2426,7 @@
                                                                        // 
neutral or drive forward, everything is as its used to be: brake is brake and 
accel. is accel.
                                                                        if 
(curr_truck->engine)
                                                                        {
-                                                                               
curr_truck->engine->autoSetAcc(accval);
+                                                                               
curr_truck->engine->autoSetAcc(accl);
                                                                        }
                                                                        
curr_truck->brake = brake * curr_truck->brakeforce;
                                                                } else
@@ -2434,14 +2436,14 @@
                                                                        {
                                                                                
curr_truck->engine->autoSetAcc(brake);
                                                                        }
-                                                                       
curr_truck->brake = accval * curr_truck->brakeforce;
+                                                                       
curr_truck->brake = accl * curr_truck->brakeforce;
                                                                }
 
                                                                // only when 
the truck really is not moving anymore
                                                                if 
(fabs(curr_truck->WheelSpeed) <= 0.1f)
                                                                {
                                                                        // 
switching point, does the user want to drive forward from backward or the other 
way round? change gears?
-                                                                       if 
(brake > 0.5f && accval < 0.5f && curr_truck->engine->getGear() >= 0)
+                                                                       if 
(brake > 0.5f && accl < 0.5f && curr_truck->engine->getGear() >= 0)
                                                                        {
                                                                                
// we are on the brake, jump to reverse gear
                                                                                
if (curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
@@ -2451,7 +2453,7 @@
                                                                                
{
                                                                                
        curr_truck->engine->setGear(-1);
                                                                                
}
-                                                                       } else 
if (brake < 0.5f && accval > 0.5f && curr_truck->engine->getGear() < 0)
+                                                                       } else 
if (brake < 0.5f && accl > 0.5f && curr_truck->engine->getGear() < 0)
                                                                        {
                                                                                
// we are on the gas pedal, jump to first gear when we were in rear gear
                                                                                
if (curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
@@ -2547,6 +2549,7 @@
                                                                } else if 
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_DOWN))
                                                                {
                                                                        if 
(shiftmode  > BeamEngine::SEMIAUTO ||
+                                                                               
shiftmode == BeamEngine::SEMIAUTO  && !arcadeControls ||
                                                                                
shiftmode == BeamEngine::SEMIAUTO  && curr_truck->engine->getGear() > 0 ||
                                                                                
shiftmode == BeamEngine::AUTOMATIC && curr_truck->engine->getGear() > 1)
                                                                        {
@@ -2559,11 +2562,11 @@
                                                                }
                                                        } else //if (shiftmode 
> BeamEngine::MANUAL) // h-shift or h-shift with ranges shifting
                                                        {
-                                                               bool 
gear_changed       = false;
-                                                               bool found      
                = false;
-                                                               int curgear     
            = curr_truck->engine->getGear();
-                                                               int 
curgearrange    = curr_truck->engine->getGearRange();
-                                                               int gearoffset  
    = std::max(0, curgear - curgearrange * 6);
+                                                               bool 
gear_changed = false;
+                                                               bool found      
  = false;
+                                                               int curgear     
  = curr_truck->engine->getGear();
+                                                               int 
curgearrange  = curr_truck->engine->getGearRange();
+                                                               int gearoffset  
  = std::max(0, curgear - curgearrange * 6);
 
                                                                // one can 
select range only if in natural
                                                                if 
(shiftmode==BeamEngine::MANUAL_RANGES && curgear == 0)
@@ -2647,36 +2650,47 @@
                                                                        }
                                                                } // end of if 
(gear_changed)
                                                        } // end of shitmode > 
BeamEngine::MANUAL
-
+                                                       
                                                        // anti roll back in 
BeamEngine::AUTOMATIC (DRIVE, TWO, ONE) mode
                                                        if 
(curr_truck->engine->getAutoMode()  == BeamEngine::AUTOMATIC &&
                                                           
(curr_truck->engine->getAutoShift() == BeamEngine::DRIVE ||
                                                            
curr_truck->engine->getAutoShift() == BeamEngine::TWO ||
                                                            
curr_truck->engine->getAutoShift() == BeamEngine::ONE) &&
-                                                               
curr_truck->WheelSpeed < 0.1f)
+                                                               
curr_truck->WheelSpeed < +0.1f)
                                                        {
                                                                Vector3 dirDiff 
= (curr_truck->nodes[curr_truck->cameranodepos[0]].RelPosition - 
curr_truck->nodes[curr_truck->cameranodedir[0]].RelPosition).normalisedCopy();
                                                                Degree 
pitchAngle = Radian(asin(dirDiff.dotProduct(Vector3::UNIT_Y)));
-                                                               float accl = 
INPUTENGINE.getEventValue(EV_TRUCK_ACCELERATE);
 
-                                                               if 
(pitchAngle.valueDegrees() > 1.0f)
+                                                               if 
(pitchAngle.valueDegrees() > +1.0f)
                                                                {
-                                                                       
curr_truck->brake = curr_truck->brakeforce * (1.0f - accl);
+                                                                       if 
(sin(pitchAngle.valueRadians()) * curr_truck->getTotalMass() > 
curr_truck->engine->getTorque() / 2.0f)
+                                                                       {
+                                                                               
curr_truck->brake = curr_truck->brakeforce;
+                                                                       } else
+                                                                       {
+                                                                               
curr_truck->brake = curr_truck->brakeforce * (1.0f - accl);
+                                                                       }
                                                                }
                                                        }
 
                                                        // anti roll forth in 
BeamEngine::AUTOMATIC (REAR) mode
                                                        if 
(curr_truck->engine->getAutoMode()  == BeamEngine::AUTOMATIC &&
                                                            
curr_truck->engine->getAutoShift() == BeamEngine::REAR &&
-                                                               
curr_truck->WheelSpeed > 0.1f)
+                                                               
curr_truck->WheelSpeed > -0.1f)
                                                        {
                                                                Vector3 dirDiff 
= (curr_truck->nodes[curr_truck->cameranodepos[0]].RelPosition - 
curr_truck->nodes[curr_truck->cameranodedir[0]].RelPosition).normalisedCopy();
                                                                Degree 
pitchAngle = Radian(asin(dirDiff.dotProduct(Vector3::UNIT_Y)));
                                                                float accl = 
INPUTENGINE.getEventValue(EV_TRUCK_ACCELERATE);
 
-                                                               if 
(pitchAngle.valueDegrees() < 1.0f)
+                                                               if 
(pitchAngle.valueDegrees() < -1.0f)
                                                                {
-                                                                       
curr_truck->brake = curr_truck->brakeforce * (1.0f - accl);
+                                                                       if 
(sin(pitchAngle.valueRadians()) * curr_truck->getTotalMass() < 
curr_truck->engine->getTorque() / 2.0f)
+                                                                       {
+                                                                               
curr_truck->brake = curr_truck->brakeforce;
+                                                                       } else
+                                                                       {
+                                                                               
curr_truck->brake = curr_truck->brakeforce * (1.0f - accl);
+                                                                       }
                                                                }
                                                        }
                                                } // end of ->engine
@@ -4838,7 +4852,7 @@
        collisions->finishLoadingTerrain();
 }
 
-void RoRFrameListener::initTrucks(bool loadmanual, Ogre::String selected, 
Ogre::String selectedExtension, std::vector<Ogre::String> *truckconfig, bool 
enterTruck, Skin *skin)
+void RoRFrameListener::initTrucks(bool loadmanual, Ogre::String selected, 
Ogre::String selectedExtension /* = "" */, std::vector<Ogre::String> 
*truckconfig/* =0 */, bool enterTruck /* = false */, Skin *skin /* = NULL */)
 {
        //we load truck
        char *selectedchr = const_cast< char *> (selected.c_str());

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.h
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.h   
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gameplay/RoRFrameListener.h   
2012-06-01 05:54:01 UTC (rev 2766)
@@ -240,16 +240,20 @@
 
        unsigned int mNumScreenShots;
        
+       void checkSpeedlimit(Beam* curr_truck, float dt);
+       void updateCruiseControl(Beam* curr_truck, float dt);
+
        bool updateAnimatedObjects(float dt);
        bool updateTruckMirrors(float dt);
 
        int setupBenchmark();
-
        void gridScreenshots(Ogre::RenderWindow* pRenderWindow, Ogre::Camera* 
pCamera, const int& pGridSize, const Ogre::String& path, const Ogre::String& 
pFileName, const Ogre::String& pFileExtention, const bool& pStitchGridImages);
+       
        void initDust();
        void initHDR();
        void initSoftShadows();
        void initializeCompontents();
+
        void updateGUI(float dt); // update engine panel
        void updateIO(float dt);
        void updateStats(void);
@@ -296,7 +300,7 @@
        void checkRemoteStreamResultsChanged();
        void hideGUI(bool visible);
        void hideMap();
-       void initTrucks(bool loadmanual, Ogre::String selected, Ogre::String 
selectedExtension = Ogre::String(), std::vector<Ogre::String> *truckconfig=0, 
bool enterTruck=false, Skin *skin=NULL);
+       void initTrucks(bool loadmanual, Ogre::String selected, Ogre::String 
selectedExtension = "", std::vector<Ogre::String> *truckconfig=0, bool 
enterTruck = false, Skin *skin = NULL);
        void loadClassicTerrain(Ogre::String terrainfile);
        void loadNetTerrain(char *preselected_map);
        void loadObject(const char* name, float px, float py, float pz, float 
rx, float ry, float rz, Ogre::SceneNode * bakeNode, const char* instancename, 
bool enable_collisions=true, int scripthandler=-1, const char *type=0, bool 
uniquifyMaterial=false);

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehavior.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehavior.cpp 
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehavior.cpp 
2012-06-01 05:54:01 UTC (rev 2766)
@@ -20,8 +20,9 @@
 #include "CameraBehavior.h"
 
 #include "Beam.h"
+#include "collisions.h"
+#include "heightfinder.h"
 #include "InputEngine.h"
-#include "heightfinder.h"
 #include "Ogre.h"
 
 using namespace Ogre;
@@ -122,7 +123,15 @@
 
        Vector3 camPosition = (1.0f / (camRatio + 1.0f)) * desiredPosition + 
(camRatio / (camRatio + 1.0f)) * precedingPosition;
 
-       ctx.mCamera->setPosition(camPosition);
+       if ( ctx.mCollisions && ctx.mCollisions->forcecam )
+       {
+               ctx.mCamera->setPosition(ctx.mCollisions->forcecampos);
+               ctx.mCollisions->forcecam = false;
+       } else
+       {
+               ctx.mCamera->setPosition(camPosition);
+       }
+
        ctx.mCamera->lookAt(camLookAt);
 }
 
@@ -144,5 +153,6 @@
 void CameraBehavior::reset(const CameraManager::cameraContext_t &ctx)
 {
        camRotX = 0.0f;
+       camRotY = 0.3f;
        ctx.mCamera->setFOVy(ctx.fovExternal);
 }

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFixed.cpp
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFixed.cpp
    2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFixed.cpp
    2012-06-01 05:54:01 UTC (rev 2766)
@@ -20,17 +20,12 @@
 #include "CameraBehaviorFixed.h"
 
 #include "Console.h"
-#include "DepthOfFieldEffect.h"
 #include "language.h"
 
 using namespace Ogre;
 
 void CameraBehaviorFixed::activate(const CameraManager::cameraContext_t &ctx, 
bool reset /* = true */)
 {
-       if ( ctx.mDof )
-       {
-               ctx.mDof->setFocusMode(DOFManager::Auto);
-       }
 #ifdef USE_MYGUI
        Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("fixed free camera"), "camera_link.png", 
3000);
 #endif // USE_MYGUI

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFree.cpp
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFree.cpp 
    2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorFree.cpp 
    2012-06-01 05:54:01 UTC (rev 2766)
@@ -20,7 +20,6 @@
 #include "CameraBehaviorFree.h"
 
 #include "Console.h"
-#include "DepthOfFieldEffect.h"
 #include "heightfinder.h"
 #include "InputEngine.h"
 #include "language.h"
@@ -126,10 +125,6 @@
 
 void CameraBehaviorFree::activate(const CameraManager::cameraContext_t &ctx, 
bool reset /* = true */)
 {
-       if ( ctx.mDof )
-       {
-               ctx.mDof->setFocusMode(DOFManager::Auto);
-       }
 #ifdef USE_MYGUI
        Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("free camera"), "camera_go.png", 3000);
 #endif // USE_MYGUI

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorStatic.cpp
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorStatic.cpp
   2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorStatic.cpp
   2012-06-01 05:54:01 UTC (rev 2766)
@@ -62,7 +62,6 @@
 
        if ( ctx.mDof )
        {
-               ctx.mDof->setFocusMode(DOFManager::Manual);
                ctx.mDof->setFocus(camDist);
                ctx.mDof->setLensFOV(Radian(fov));
        }
@@ -71,6 +70,11 @@
 void CameraBehaviorStatic::activate(const CameraManager::cameraContext_t &ctx, 
bool reset /* = true */)
 {
        fovPreviously = ctx.mCamera->getFOVy();
+
+       if ( ctx.mDof )
+       {
+               ctx.mDof->setFocusMode(DOFManager::Manual);
+       }
 }
 
 void CameraBehaviorStatic::deactivate(const CameraManager::cameraContext_t 
&ctx)

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicle.cpp
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicle.cpp
  2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicle.cpp
  2012-06-01 05:54:01 UTC (rev 2766)
@@ -49,7 +49,7 @@
 
        camRatio = 1.0f / (ctx.mCurrTruck->tdt * 4.0f);
 
-       camDistMin = ctx.mCurrTruck->getMinimalCameraRadius() * 2.0f;
+       camDistMin = std::min(ctx.mCurrTruck->getMinimalCameraRadius() * 2.0f, 
33.0f);
 
        camLookAt = ctx.mCurrTruck->getPosition();
 
@@ -72,6 +72,6 @@
 {
        CameraBehavior::reset(ctx);
        camRotY = 0.35f;
-       camDist = ctx.mCurrTruck->getMinimalCameraRadius() * 3.0f + 2.0f;
-       camDistMin = ctx.mCurrTruck->getMinimalCameraRadius() * 2.0f;
+       camDistMin = std::min(ctx.mCurrTruck->getMinimalCameraRadius() * 2.0f, 
33.0f);
+       camDist = camDistMin * 1.5f + 2.0f;
 }

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleCineCam.h
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleCineCam.h
     2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleCineCam.h
     2012-06-01 05:54:01 UTC (rev 2766)
@@ -42,6 +42,7 @@
 
        Beam *currTruck;
        int lastCineCam;
+
        static const int DEFAULT_INTERNAL_CAM_PITCH = -15;
 };
 

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.cpp
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.cpp
    2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.cpp
    2012-06-01 05:54:01 UTC (rev 2766)
@@ -20,17 +20,21 @@
 #include "CameraBehaviorVehicleSpline.h"
 
 #include "Beam.h"
+#include "Console.h"
 #include "InputEngine.h"
+#include "language.h"
 #include "Ogre.h"
-#include "Settings.h"
 
 using namespace Ogre;
 
 CameraBehaviorVehicleSpline::CameraBehaviorVehicleSpline() :
          CameraBehaviorVehicle()
-       , myManualObject(0)
-       , mySceneNode(0)
+       , autoTracking(true)
+       , numLinkedBeams(0)
        , spline(new SimpleSpline())
+       , splineClosed(false)
+       , splineLength(1.0f)
+       , splineObject(0)
        , splinePos(0.5f)
 {
 }
@@ -38,81 +42,245 @@
 void CameraBehaviorVehicleSpline::update(const CameraManager::cameraContext_t 
&ctx)
 {
        Vector3 dir = 
(ctx.mCurrTruck->nodes[ctx.mCurrTruck->cameranodepos[0]].smoothpos
-                                - 
ctx.mCurrTruck->nodes[ctx.mCurrTruck->cameranodedir[0]].smoothpos).normalisedCopy();
+               - 
ctx.mCurrTruck->nodes[ctx.mCurrTruck->cameranodedir[0]].smoothpos).normalisedCopy();
 
-       targetDirection = -atan2(dir.dotProduct(Vector3::UNIT_X), 
dir.dotProduct(-Vector3::UNIT_Z));
-       targetPitch     = 0.0f;
+       targetPitch = 0.0f;
 
-       camRatio = 1.0f / (ctx.mCurrTruck->tdt * 4.0f);
+       if ( camPitching )
+       {
+               targetPitch = -asin(dir.dotProduct(Vector3::UNIT_Y));
+       }
 
        if ( ctx.mCurrTruck->free_camerarail > 0 )
        {
-               spline->clear();
-               for (int i = 0; i < ctx.mCurrTruck->free_camerarail; i++)
+               if ( ctx.mCurrTruck->getAllLinkedBeams().size() != 
numLinkedBeams )
                {
-                       
spline->addPoint(ctx.mCurrTruck->nodes[ctx.mCurrTruck->cameraRail[i]].AbsPosition);
+                       createSpline(ctx);
                }
-
+               updateSpline();
                updateSplineDisplay();
 
                camLookAt = spline->interpolate(splinePos);
-       } else
-       {
-               // fallback :-/
-               camLookAt = ctx.mCurrTruck->getPosition();
+
+               if ( INPUTENGINE.isKeyDown(OIS::KC_LSHIFT) && 
INPUTENGINE.isKeyDownValueBounce(OIS::KC_SPACE) )
+               {
+                       autoTracking = !autoTracking;
+#ifdef USE_MYGUI
+                       if ( autoTracking )
+                       {
+                               
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("auto tracking") + U(" ") + _L("enabled"), 
"camera_go.png", 3000);
+                       } else
+                       {
+                               
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, 
Console::CONSOLE_SYSTEM_NOTICE, _L("auto tracking") + U(" ") + _L("disabled"), 
"camera_go.png", 3000);
+                       }
+#endif // USE_MYGUI
+               }
+
+               if ( autoTracking )
+               {
+                       Vector3 centerDir = ctx.mCurrTruck->getPosition() - 
camLookAt;
+                       if ( centerDir.length() > 1.0f )
+                       {
+                               centerDir.normalise();
+                               Radian oldTargetDirection = targetDirection;
+                               targetDirection = 
-atan2(centerDir.dotProduct(Vector3::UNIT_X), 
centerDir.dotProduct(-Vector3::UNIT_Z));
+                               if ( targetDirection.valueRadians() * 
oldTargetDirection.valueRadians() < 0.0f && centerDir.length() < camDistMin)
+                               {
+                                       camRotX = -camRotX;
+                               }
+                       }
+               }
        }
 
        CameraBehavior::update(ctx);
 }
 
+bool CameraBehaviorVehicleSpline::mouseMoved(const 
CameraManager::cameraContext_t &ctx, const OIS::MouseEvent& _arg)
+{
+       const OIS::MouseState ms = _arg.state;
+
+       if ( INPUTENGINE.isKeyDown(OIS::KC_LCONTROL) && 
ms.buttonDown(OIS::MB_Right) )
+       {
+               Real splinePosDiff = ms.X.rel * std::max(0.00005f, splineLength 
* 0.0000001f);
+               
+               if ( INPUTENGINE.isKeyDown(OIS::KC_LSHIFT) || 
INPUTENGINE.isKeyDown(OIS::KC_RSHIFT) )
+               {
+                       splinePosDiff *= 3.0f;
+               }
+
+               if ( INPUTENGINE.isKeyDown(OIS::KC_LMENU) )
+               {
+                       splinePosDiff *= 0.1f;
+               }
+
+               splinePos += splinePosDiff;
+               
+               if ( ms.X.rel > 0 && splinePos > 0.99f )
+               {
+                       if ( splineClosed )
+                       {
+                               splinePos -= 1.0f;
+                       } else
+                       {
+                               // u - turn
+                       }
+               } else if ( ms.X.rel < 0 && splinePos < 0.01f )
+               {
+                       if ( splineClosed )
+                       {
+                               splinePos += 1.0f;
+                       } else
+                       {
+                               // u - turn
+                       }
+               }
+
+               splinePos  = std::max(0.0f, splinePos);
+               splinePos  = std::min(splinePos, 1.0f);
+
+               camRatio = 0.0f;
+
+               return true;
+       } else
+       {
+               camRatio = 5.0f;
+
+               return CameraBehavior::mouseMoved(ctx, _arg);
+       }
+}
+
 void CameraBehaviorVehicleSpline::activate(const 
CameraManager::cameraContext_t &ctx, bool reset /* = true */)
 {
        if ( !ctx.mCurrTruck || ctx.mCurrTruck->free_camerarail <= 0 )
        {
                CameraManager::getSingleton().switchToNextBehavior();
                return;
+       } else if ( reset )
+       {
+               this->reset(ctx);
+               createSpline(ctx);
        }
+}
 
-       if ( !myManualObject )
+void CameraBehaviorVehicleSpline::reset(const CameraManager::cameraContext_t 
&ctx)
+{
+       CameraBehavior::reset(ctx);
+
+       camDistMin = camDist = 
std::min(ctx.mCurrTruck->getMinimalCameraRadius(), 10.0f);
+       camDist = camDistMin * 2.0f;
+       
+       splinePos = 0.5f;
+}
+
+void CameraBehaviorVehicleSpline::createSpline(const 
CameraManager::cameraContext_t &ctx)
+{
+       splineClosed = false;
+       splineLength = 1.0f;
+
+       spline->clear();
+       splineNodes.clear();
+
+       for (int i = 0; i < ctx.mCurrTruck->free_camerarail; i++)
        {
-               myManualObject =  ctx.mSceneMgr->createManualObject();
-               mySceneNode = 
ctx.mSceneMgr->getRootSceneNode()->createChildSceneNode();
+               
splineNodes.push_back(&ctx.mCurrTruck->nodes[ctx.mCurrTruck->cameraRail[i]]);
+       }
 
-               myManualObject->begin("tracks/transred", 
Ogre::RenderOperation::OT_LINE_STRIP);
+       std::list<Beam*> linkedBeams = ctx.mCurrTruck->getAllLinkedBeams();
+
+       numLinkedBeams = linkedBeams.size();
+
+       if ( numLinkedBeams > 0 )
+       {
+               for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+               {
+                       if ( (*it)->free_camerarail <= 0 ) continue;
+
+                       Vector3 curSplineFront = 
splineNodes.front()->AbsPosition;
+                       Vector3 curSplineBack  = splineNodes.back() 
->AbsPosition;
+
+                       Vector3 linkedSplineFront = 
(*it)->nodes[(*it)->cameraRail[0]].AbsPosition;
+                       Vector3 linkedSplineBack  = 
(*it)->nodes[(*it)->cameraRail[(*it)->free_camerarail - 1]].AbsPosition;
+
+                       if        ( curSplineBack.distance(linkedSplineFront) < 
5.0f )
+                       {
+                               for (int i = 1; i < (*it)->free_camerarail; i++)
+                               {
+                                       
splineNodes.push_back(&(*it)->nodes[(*it)->cameraRail[i]]);
+                               }
+                       } else if ( curSplineFront.distance(linkedSplineFront) 
< 5.0f )
+                       {
+                               for (int i = 1; i < (*it)->free_camerarail; i++)
+                               {
+                                       
splineNodes.push_front(&(*it)->nodes[(*it)->cameraRail[i]]);
+                               }
+                       } else if ( curSplineBack.distance(linkedSplineBack) < 
5.0f )
+                       {
+                               for (int i = (*it)->free_camerarail - 2; i >= 
0; i--)
+                               {
+                                       
splineNodes.push_back(&(*it)->nodes[(*it)->cameraRail[i]]);
+                               }
+                       } else if ( curSplineFront.distance(linkedSplineBack) < 
5.0f )
+                       {
+                               for (int i = (*it)->free_camerarail - 2; i >= 
0; i--)
+                               {
+                                       
splineNodes.push_front(&(*it)->nodes[(*it)->cameraRail[i]]);
+                               }
+                       }
+               }
+       }
+
+       for (unsigned int i = 0; i < splineNodes.size(); i++)
+       {
+               spline->addPoint(splineNodes[i]->AbsPosition);
+       }
+
+       Vector3 firstPoint = spline->getPoint(0);
+       Vector3 lastPoint  = spline->getPoint(spline->getNumPoints() - 1);
+
+       if ( firstPoint.distance(lastPoint) < 1.0f )
+       {
+               splineClosed = true;
+       }
+
+       for (int i = 1; i < spline->getNumPoints(); i++)
+       {
+               splineLength += spline->getPoint(i - 
1).distance(spline->getPoint(i));
+       }
+
+       splineLength /= 2.0f;
+
+       if ( !splineObject )
+       {
+               splineObject = ctx.mSceneMgr->createManualObject();
+               SceneNode* splineNode = 
ctx.mSceneMgr->getRootSceneNode()->createChildSceneNode();
+
+               splineObject->begin("tracks/transred", 
Ogre::RenderOperation::OT_LINE_STRIP);
                for (int i = 0; i < splineDrawResolution; i++)
                {
-                       myManualObject->position(0, 0, 0);
+                       splineObject->position(0, 0, 0);
                }
-               myManualObject->end();
+               splineObject->end();
 
-               mySceneNode->attachObject(myManualObject);
+               splineNode->attachObject(splineObject);
        }
 }
 
-bool CameraBehaviorVehicleSpline::mouseMoved(const 
CameraManager::cameraContext_t &ctx, const OIS::MouseEvent& _arg)
+void CameraBehaviorVehicleSpline::updateSpline()
 {
-       const OIS::MouseState ms = _arg.state;
-
-       if ( INPUTENGINE.isKeyDown(OIS::KC_LCONTROL) && 
ms.buttonDown(OIS::MB_Right) )
+       for (int i = 0; i < spline->getNumPoints(); i++)
        {
-               splinePos += ms.X.rel * 0.001f;
-               splinePos  = std::max(0.0f, splinePos);
-               splinePos  = std::min(splinePos, 1.0f);
-               return true;
-       } else
-       {
-               return CameraBehavior::mouseMoved(ctx, _arg);
+               spline->updatePoint(i, splineNodes[i]->AbsPosition);
        }
 }
 
 void CameraBehaviorVehicleSpline::updateSplineDisplay()
 {
-       myManualObject->beginUpdate(0);
+       splineObject->beginUpdate(0);
        for (int i = 0; i < splineDrawResolution; i++)
        {
-               float pos1d = i / (float)splineDrawResolution;
-               Vector3 pos3d = spline->interpolate(pos1d);
-               myManualObject->position(pos3d);
+               Real parametricDist = i / (float)splineDrawResolution;
+               Vector3 position = spline->interpolate(parametricDist);
+               splineObject->position(position);
        }
-       myManualObject->end();
+       splineObject->end();
 }

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.h
===================================================================
--- 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.h
      2012-06-01 05:41:20 UTC (rev 2765)
+++ 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraBehaviorVehicleSpline.h
      2012-06-01 05:54:01 UTC (rev 2766)
@@ -35,17 +35,25 @@
        bool mouseMoved(const CameraManager::cameraContext_t &ctx, const 
OIS::MouseEvent& _arg);
 
        void activate(const CameraManager::cameraContext_t &ctx, bool reset = 
true);
+       void reset(const CameraManager::cameraContext_t &ctx);
 
-
+       void createSpline(const CameraManager::cameraContext_t &ctx);
+       void updateSpline();
        void updateSplineDisplay();
 
 protected:
 
-       Ogre::ManualObject *myManualObject;
-       Ogre::SceneNode* mySceneNode;
-       Ogre::SimpleSpline *spline;
-       float splinePos;
-       static const int splineDrawResolution = 20;
+       Ogre::ManualObject* splineObject;
+       Ogre::SimpleSpline* spline;
+       Ogre::Real splineLength;
+       Ogre::Real splinePos;
+       bool splineClosed;
+       bool autoTracking;
+
+       std::deque<node*> splineNodes;
+       int numLinkedBeams;
+
+       static const int splineDrawResolution = 200;
 };
 
 #endif // __CAMERA_BEHAVIOR_VEHICLE_SPLINE_H_

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.cpp  
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.cpp  
2012-06-01 05:54:01 UTC (rev 2766)
@@ -28,6 +28,7 @@
 #include "CameraBehaviorCharacter.h"
 #include "CameraBehaviorFixed.h"
 #include "CameraBehaviorFree.h"
+#include "CameraBehaviorIsometric.h"
 #include "CameraBehaviorStatic.h"
 #include "CameraBehaviorVehicle.h"
 #include "CameraBehaviorVehicleCineCam.h"
@@ -79,6 +80,7 @@
        mTransScale = mTransSpeed  * dt;
        mRotScale   = mRotateSpeed * dt;
 
+       ctx.mCollisions = RoRFrameListener::eflsingleton->getCollisions();
        ctx.mCurrTruck  = BeamFactory::getSingleton().getCurrentTruck();
        ctx.mDt         = dt;
        ctx.mHfinder    = RoRFrameListener::hfinder;
@@ -212,6 +214,7 @@
        globalBehaviors.insert(std::pair<int, 
ICameraBehavior*>(CAMERA_BEHAVIOR_VEHICLE_CINECAM, new 
CameraBehaviorVehicleCineCam()));
        globalBehaviors.insert(std::pair<int, 
ICameraBehavior*>(CAMERA_BEHAVIOR_FREE, new CameraBehaviorFree()));
        globalBehaviors.insert(std::pair<int, 
ICameraBehavior*>(CAMERA_BEHAVIOR_FIXED, new CameraBehaviorFixed()));
+       globalBehaviors.insert(std::pair<int, 
ICameraBehavior*>(CAMERA_BEHAVIOR_ISOMETRIC, new CameraBehaviorIsometric()));
 }
 
 bool CameraManager::mouseMoved(const OIS::MouseEvent& _arg)

Modified: 
branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.h
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.h    
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/gfx/camera/CameraManager.h    
2012-06-01 05:54:01 UTC (rev 2766)
@@ -17,8 +17,8 @@
 You should have received a copy of the GNU General Public License
 along with Rigs of Rods.  If not, see <http://www.gnu.org/licenses/>.
 */
-#ifndef __CAMERA_MODE_H_
-#define __CAMERA_MODE_H_
+#ifndef __CAMERA_MANAGER_H_
+#define __CAMERA_MANAGER_H_
 
 #include "RoRPrerequisites.h"
 
@@ -39,6 +39,7 @@
        typedef struct cameraContext {
                Beam *mCurrTruck;
                Character *mCharacter;
+               Collisions *mCollisions;
                DOFManager *mDof;
                HeightFinder *mHfinder;
                Ogre::Camera *mCamera;
@@ -60,7 +61,8 @@
                CAMERA_BEHAVIOR_VEHICLE_CINECAM,
                CAMERA_BEHAVIOR_END,
                CAMERA_BEHAVIOR_FREE,
-               CAMERA_BEHAVIOR_FIXED
+               CAMERA_BEHAVIOR_FIXED,
+               CAMERA_BEHAVIOR_ISOMETRIC
        };
 
        void update(float dt);
@@ -94,4 +96,4 @@
        bool mouseReleased(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
 };
 
-#endif // __CAMERA_MODE_H_
+#endif // __CAMERA_MANAGER_H_

Modified: branches/20120601_Testing_v0.39.7/source/main/physics/Beam.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/physics/Beam.cpp      
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/physics/Beam.cpp      
2012-06-01 05:54:01 UTC (rev 2766)
@@ -128,6 +128,7 @@
        , lastwspeed(0.0)
        , leftMirrorAngle(0.52)
        , lights(1)
+       , linkedBeams(std::list<Beam*>())
        , lockSkeletonchange(false)
        , mTimeUntilNextToggle(0)
        , mWindow(win)
@@ -1360,17 +1361,17 @@
 
        float mass = totalmass;
        
-       std::list<Beam*> linkedBeams = getAllLinkedBeams();
-
        for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+       {
                mass += (*it)->totalmass;
+       }
 
        return mass;
 }
 
-std::list<Beam*> Beam::getAllLinkedBeams()
+void Beam::determineLinkedBeams()
 {
-       std::list<Beam*> result;
+       linkedBeams.clear();
 
        bool found = true;
        std::map< Beam*, bool> lookup_table;
@@ -1393,7 +1394,7 @@
                                                ret = 
lookup_table.insert(std::pair< Beam*, bool>(it_hook->lockTruck, false));
                                                if (ret.second)
                                                {
-                                                       
result.push_back(it_hook->lockTruck);
+                                                       
linkedBeams.push_back(it_hook->lockTruck);
                                                        found = true;
                                                }
                                        }
@@ -1402,8 +1403,6 @@
                        }
                }
        }
-
-       return result;
 }
 
 int Beam::getWheelNodeCount()
@@ -1614,28 +1613,18 @@
 
        return 0;
 }
+
 void Beam::updateTruckPosition()
 {
-       // calculate average position (and smooth)
-       if(externalcameramode == 0)
+       if (externalcameramode == 1 && freecinecamera > 0)
        {
-               // the classic approach: average over all nodes and beams
-               Vector3 aposition = Vector3::ZERO;
-               for (int n=0; n < free_node; n++)
-               {
-                       nodes[n].smoothpos = nodes[n].AbsPosition;
-                       aposition += nodes[n].smoothpos;
-               }
-               position = aposition / free_node;
-       } else if(externalcameramode == 1 && freecinecamera > 0)
-       {
                // the new (strange) approach: reuse the cinecam node
                for (int n=0; n < free_node; n++)
                {
                        nodes[n].smoothpos = nodes[n].AbsPosition;
                }
                position = nodes[cinecameranodepos[0]].AbsPosition;
-       } else if(externalcameramode == 2 && externalcameranode >= 0)
+       } else if (externalcameramode == 2 && externalcameranode >= 0)
        {
                // the new (strange) approach #2: reuse a specified node
                for (int n=0; n < free_node; n++)
@@ -1645,6 +1634,7 @@
                position = nodes[externalcameranode].AbsPosition;
        } else
        {
+               // calculate average position (and smooth)
                Vector3 aposition = Vector3::ZERO;
                for (int n=0; n < free_node; n++)
                {
@@ -1948,6 +1938,17 @@
        //this is a hook assistance beam and needs to be disabled after reset
        for(std::vector <hook_t>::iterator it = hooks.begin(); it!=hooks.end(); 
it++)
        {
+               if (it->lockTruck)
+               {
+                       it->lockTruck->determineLinkedBeams();
+                       it->lockTruck->hideSkeleton(true, false);
+                       
+                       for (std::list<Beam*>::iterator it_truck = 
it->lockTruck->linkedBeams.begin(); it_truck != 
it->lockTruck->linkedBeams.end(); ++it)
+                       {
+                               (*it_truck)->determineLinkedBeams();
+                               (*it_truck)->hideSkeleton(true, false);
+                       }
+               }
                it->beam->mSceneNode->detachAllObjects();
                it->beam->disabled = true;
                it->locked        = UNLOCKED;
@@ -4368,10 +4369,10 @@
        if (linked)
        {
                // apply to the locked truck
-               std::list<Beam*> linkedBeams = getAllLinkedBeams();
-
                for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+               {
                        (*it)->showSkeleton(meshes, newMode, false);
+               }
        }
 
        lockSkeletonchange=false;
@@ -4457,10 +4458,10 @@
        if (linked)
        {
                // apply to the locked truck
-               std::list<Beam*> linkedBeams = getAllLinkedBeams();
-
                for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+               {
                        (*it)->hideSkeleton(newMode, false);
+               }
        }
 
        lockSkeletonchange=false;
@@ -4559,10 +4560,10 @@
        if (linked)
        {
                // apply to the locked truck
-               std::list<Beam*> linkedBeams = getAllLinkedBeams();
-
                for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+               {
                        (*it)->setBeamVisibility(visible, false);
+               }
        }
 }
 
@@ -4602,10 +4603,10 @@
        if (linked)
        {
                // apply to the locked truck
-               std::list<Beam*> linkedBeams = getAllLinkedBeams();
-
                for (std::list<Beam*>::iterator it = linkedBeams.begin(); it != 
linkedBeams.end(); ++it)
+               {
                        (*it)->setMeshVisibility(visible, false);
+               }
        }
 }
 
@@ -4843,7 +4844,7 @@
                {
                        //manually triggerd (EV_COMMON_LOCK). Toggle all hooks 
groups with group#: -1, 0, 1 ++
                        if (it->group <= -2)
-                                       continue;
+                               continue;
                }
 
                if (mode == HOOK_LOCK && group == -2)
@@ -4872,6 +4873,8 @@
                        continue;
                }
 
+               Beam* lastLockTruck = it->lockTruck; // memorize current value
+
                //this is a locked or prelocked hook and its not a locking 
attempt
                if ((it->locked == LOCKED || it->locked == PRELOCK) && mode != 
HOOK_LOCK)
                {
@@ -4986,6 +4989,30 @@
                                        //break;
                        }
                }
+
+               if (it->lockTruck != lastLockTruck)
+               {
+                       std::list<Beam*> linkedBeams (linkedBeams);
+
+                       linkedBeams.push_back(this);
+                       linkedBeams.push_back(std::max(lastLockTruck, 
it->lockTruck));
+                       linkedBeams.splice(linkedBeams.end(), 
linkedBeams.back()->linkedBeams);
+                       linkedBeams.sort();
+                       linkedBeams.unique();
+
+                       for (std::list<Beam*>::iterator it = 
linkedBeams.begin(); it != linkedBeams.end(); ++it)
+                       {
+                               (*it)->determineLinkedBeams();
+
+                               if (skeleton && this != (*it) && 
!(*it)->skeleton)
+                               {
+                                       (*it)->showSkeleton(true, true, false);
+                               } else if (skeleton && this != (*it) && 
(*it)->skeleton)
+                               {
+                                       (*it)->hideSkeleton(true, false);
+                               }
+                       }
+               }
        }
 }
 

Modified: branches/20120601_Testing_v0.39.7/source/main/physics/Beam.h
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/physics/Beam.h        
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/physics/Beam.h        
2012-06-01 05:54:01 UTC (rev 2766)
@@ -292,7 +292,9 @@
        /*
         *@return Returns a list of all connected (hooked) beams 
         */
-       std::list<Beam*> getAllLinkedBeams();
+       std::list<Beam*> getAllLinkedBeams() { return linkedBeams; };
+       std::list<Beam*> linkedBeams;
+       void determineLinkedBeams();
 
        // this must be in the header as the network stuff is using it...
        bool getBrakeLightVisible();

Modified: branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.cpp
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.cpp 
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.cpp 
2012-06-01 05:54:01 UTC (rev 2766)
@@ -2402,6 +2402,18 @@
        return this->mKeyboard->isKeyDown(key);
 }
 
+bool InputEngine::isKeyDownValueBounce(OIS::KeyCode mod, float time)
+{
+       if(event_times[-mod] > 0)
+               return false;
+       else
+       {
+               bool res = isKeyDown(mod);
+               if(res) event_times[-mod] = time;
+               return res;
+       }
+}
+
 Ogre::String InputEngine::getDeviceName(event_trigger_t evt)
 {
        switch(evt.eventtype)

Modified: branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.h
===================================================================
--- branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.h   
2012-06-01 05:41:20 UTC (rev 2765)
+++ branches/20120601_Testing_v0.39.7/source/main/utils/InputEngine.h   
2012-06-01 05:54:01 UTC (rev 2766)
@@ -432,6 +432,7 @@
        bool setup(Ogre::RenderWindow* rw, Ogre::String hwnd, bool 
capture=false, bool capturemouse=false, int grabMode=0, bool captureKbd=true);
        Ogre::String getKeyForCommand(int eventID);
        bool isKeyDown(OIS::KeyCode mod);
+       bool isKeyDownValueBounce(OIS::KeyCode mod, float time=0.2f);
 
        std::map<int, std::vector<event_trigger_t> > &getEvents() { return 
events; };
 

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


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to