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