Revision: 2485 http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2485&view=rev Author: ulteq Date: 2012-04-28 19:52:33 +0000 (Sat, 28 Apr 2012) Log Message: ----------- -Codechange: CameraSystem WIP
Modified Paths: -------------- trunk/source/main/gameplay/BeamEngine.h trunk/source/main/gameplay/RoRFrameListener.cpp trunk/source/main/gfx/camera/CameraBehavior.h trunk/source/main/gfx/camera/CameraBehaviorCharacterOrbit.cpp trunk/source/main/gfx/camera/CameraBehaviorFree.cpp trunk/source/main/gfx/camera/CameraBehaviorOrbit.cpp trunk/source/main/gfx/camera/CameraBehaviorOrbit.h trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.cpp trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.h trunk/source/main/gfx/camera/CameraManager.cpp trunk/source/main/gfx/camera/CameraManager.h trunk/source/main/physics/Beam.cpp trunk/source/main/physics/BeamData.h trunk/source/main/physics/input_output/SerializedRig.cpp Modified: trunk/source/main/gameplay/BeamEngine.h =================================================================== --- trunk/source/main/gameplay/BeamEngine.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gameplay/BeamEngine.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -17,62 +17,18 @@ 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 __Engine_H__ -#define __Engine_H__ +#ifndef _Engine_H__ +#define _Engine_H__ #include "RoRPrerequisites.h" -#include <stdio.h> -#include <stdlib.h> -#include <vector> - - -#define AUTOMATIC 0 -#define SEMIAUTO 1 -#define MANUAL 2 -#define MANUAL_STICK 3 -#define MANUAL_RANGES 4 - -enum autoswitch {REAR=0, NEUTRAL=1, DRIVE=2, TWO=3, ONE=4, MANUALMODE=5}; - class BeamEngine { -protected: - float clutch_time; - float shift_time; - float post_shift_time; +public: - int numGears; - std::vector<float> gearsRatio; - float inertia; - float clutchForce; + enum shiftmodes {AUTOMATIC, SEMIAUTO, MANUAL, MANUAL_STICK, MANUAL_RANGES}; + enum autoswitch {REAR, NEUTRAL, DRIVE, TWO, ONE, MANUALMODE}; - int curGear; - int curGearRange; - float curEngineRPM; - float curGearboxRPM; - float curClutch; - float curAcc; - float curClutchTorque; - //shifting - int shifting; - int shiftval; - float shiftclock; - int postshifting; - float postshiftclock; - //auto - float autocurAcc; - int starter; - autoswitch autoselect; - //turbo - float curTurboRPM; - //air pressure - float apressure; - int automode; - int trucknum; - TorqueCurve *torqueCurve; - -public: float iddleRPM; float maxRPM; float stallRPM; @@ -89,6 +45,7 @@ int prime; BeamEngine(float iddle, float max, float torque, std::vector<float> gears, float diff, int trucknum); + ~BeamEngine(); void setOptions(float einertia, char etype, float eclutch, float ctime, float stime, float pstime); void update(float dt, int doUpdate); void updateAudio(int doUpdate); @@ -140,8 +97,42 @@ char getType() { return type; }; TorqueCurve *getTorqueCurve() { return torqueCurve; }; float getEngineTorque() { return engineTorque; }; - ~BeamEngine(); -}; +protected: -#endif + float clutch_time; + float shift_time; + float post_shift_time; + + int numGears; + std::vector<float> gearsRatio; + float inertia; + float clutchForce; + + int curGear; + int curGearRange; + float curEngineRPM; + float curGearboxRPM; + float curClutch; + float curAcc; + float curClutchTorque; + //shifting + int shifting; + int shiftval; + float shiftclock; + int postshifting; + float postshiftclock; + //auto + float autocurAcc; + int starter; + autoswitch autoselect; + //turbo + float curTurboRPM; + //air pressure + float apressure; + int automode; + int trucknum; + TorqueCurve *torqueCurve; +}; + +#endif // _Engine_H__ Modified: trunk/source/main/gameplay/RoRFrameListener.cpp =================================================================== --- trunk/source/main/gameplay/RoRFrameListener.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gameplay/RoRFrameListener.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -2106,7 +2106,7 @@ { bool enablegrab = true; - if (CAMERA_MODE != CAMERA_FREE) + if (CAMERA_MODE != CameraManager::CAMERA_FREE) { if (!curr_truck) { @@ -2364,17 +2364,17 @@ // when in automatic mode: shift as well // only when the truck really is not moving anymore - if (fabs(curr_truck->WheelSpeed) <= 0.1f && curr_truck->nodes[0].Velocity.length() < 0.2f && curr_truck->engine && curr_truck->engine->getAutoMode() == AUTOMATIC) + if (fabs(curr_truck->WheelSpeed) <= 0.1f && curr_truck->nodes[0].Velocity.length() < 0.2f && curr_truck->engine && curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC) { // 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) { // we are on the brake, jump to reverse gear - curr_truck->engine->autoShiftSet(REAR); + curr_truck->engine->autoShiftSet(BeamEngine::REAR); } else if(brake < 0.5f && accval > 0.5f && curr_truck->engine->getGear() < 0) { // we are on the gas pedal, jump to first gear when we were in rear gear - curr_truck->engine->autoShiftSet(DRIVE); + curr_truck->engine->autoShiftSet(BeamEngine::DRIVE); } } } @@ -2417,19 +2417,19 @@ #ifdef USE_MYGUI switch(curr_truck->engine->getAutoMode()) { - case AUTOMATIC: + case BeamEngine::AUTOMATIC: Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Automatic shift"), "cog.png", 3000); break; - case SEMIAUTO: + case BeamEngine::SEMIAUTO: Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Manual shift - Auto clutch"), "cog.png", 3000); break; - case MANUAL: + case BeamEngine::MANUAL: Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: sequential shift"), "cog.png", 3000); break; - case MANUAL_STICK: + case BeamEngine::MANUAL_STICK: Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Fully manual: stick shift"), "cog.png", 3000); break; - case MANUAL_RANGES: + case BeamEngine::MANUAL_RANGES: Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: stick shift with ranges"), "cog.png", 3000); break; } @@ -2444,7 +2444,7 @@ int shiftmode = curr_truck->engine->getAutoMode(); // if (shiftmode==SEMIAUTO || shiftmode==MANUAL) // manual sequencial shifting - if (shiftmode<=MANUAL) // manual sequencial shifting, semi auto shifting, auto shifting + if (shiftmode<=BeamEngine::MANUAL) // manual sequencial shifting, semi auto shifting, auto shifting { if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_UP)) { @@ -2470,7 +2470,7 @@ int gearoffset = curgear-curgearrange*6; if (gearoffset<0) gearoffset = 0; // one can select range only if in natural - if(shiftmode==MANUAL_RANGES && curgear == 0) + if(shiftmode==BeamEngine::MANUAL_RANGES && curgear == 0) { // maybe this should not be here, but should experiment if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_LOWRANGE) && curgearrange!=0) @@ -2506,7 +2506,7 @@ } else if(curgear > 0 && curgear < 19) { - if (shiftmode==MANUAL) gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + curgear -1); + if (shiftmode==BeamEngine::MANUAL) gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + curgear -1); else gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + gearoffset-1); // range mode } @@ -2524,7 +2524,7 @@ } else { - if (shiftmode==MANUAL_STICK) + if (shiftmode==BeamEngine::MANUAL_STICK) { for (int i=1;i<19 && !found;i++) { @@ -3004,7 +3004,7 @@ if(mapMode==0) { bigMap->setVisibility(true); - if(CAMERA_MODE != CAMERA_INT) + if(CAMERA_MODE != CameraManager::CAMERA_VEHICLE_INTERNAL) { //make it small again bigMap->updateRenderMetrics(mWindow); @@ -4981,7 +4981,7 @@ b = BeamFactory::getSingleton().createLocal(spawnpos, spawnrot, selectedchr, 0, false, flaresMode, truckconfig, skin); if (b && enterTruck) { - //cameramode = CAMERA_INT; + //cameramode = CAMERA_VEHICLE_INTERNAL; BeamFactory::getSingleton().setCurrentTruck(b->trucknum); } else if(!b && enterTruck) BeamFactory::getSingleton().setCurrentTruck(-1); @@ -5050,7 +5050,7 @@ if (persostart!=Vector3(0,0,0)) person->setPosition(persostart); //bigMap->getEntityByName("person")->onTop(); - /*cameramode=CAMERA_INT; + /*cameramode=CAMERA_VEHICLE_INTERNAL; pushcamRotX=camRotX; pushcamRotY=camRotY; camRotX=0; @@ -5084,7 +5084,7 @@ void RoRFrameListener::changedCurrentTruck(Beam *previousTruck, Beam *currentTruck) { - if (CAMERA_MODE == CAMERA_FREE) return; + if (CAMERA_MODE == CameraManager::CAMERA_FREE) return; CameraManager::getSingleton().triggerFOVUpdate(); @@ -5249,7 +5249,7 @@ camRotX=0; camRotY=Degree(12); camDist=20; - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { currentTruck->prepareInside(true); if(ow) ow->showDashboardOverlays(false, currentTruck); @@ -5636,7 +5636,7 @@ } else { - if(curr_truck && CAMERA_MODE != CAMERA_INT) + if(curr_truck && CAMERA_MODE != CameraManager::CAMERA_VEHICLE_INTERNAL) { if(ow) ow->showDashboardOverlays(true, curr_truck); //if(bigMap) bigMap->setVisibility(true); Modified: trunk/source/main/gfx/camera/CameraBehavior.h =================================================================== --- trunk/source/main/gfx/camera/CameraBehavior.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehavior.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -35,7 +35,7 @@ { protected: float mMoveScale, mRotScale, mMoveSpeed, mRotateSpeed; -; + public: virtual ~CameraBehavior() {}; Modified: trunk/source/main/gfx/camera/CameraBehaviorCharacterOrbit.cpp =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorCharacterOrbit.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorCharacterOrbit.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -19,24 +19,14 @@ */ #include "CameraBehaviorCharacterOrbit.h" -#include <Ogre.h> -#include "CameraManager.h" -#include "Console.h" -#include "InputEngine.h" -#include "language.h" -#include "Settings.h" - -#include "Character.h" #include "RoRFrameListener.h" -using namespace Ogre; - void CameraBehaviorCharacterOrbit::update(cameraContext_t &ctx) { Character *person = RoRFrameListener::eflsingleton->person; targetDirection = -person->getAngle() - Math::HALF_PI; - camCenterPoint = person->getPosition() + Vector3(0, 1.1f, 0); + camCenterPoint = person->getPosition() + Vector3(0.0f, 1.1f, 0.0f); CameraBehaviorOrbit::update(ctx); } Modified: trunk/source/main/gfx/camera/CameraBehaviorFree.cpp =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorFree.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorFree.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -19,15 +19,14 @@ */ #include "CameraBehaviorFree.h" -#include <Ogre.h> #include "CameraManager.h" #include "Console.h" #include "InputEngine.h" #include "language.h" +#include <Ogre.h> using namespace Ogre; - void CameraBehaviorFree::activate(cameraContext_t &ctx) { // enter free camera mode @@ -62,12 +61,10 @@ void CameraBehaviorFree::update(cameraContext_t &ctx) { - Ogre::Degree mRotX(0); - Ogre::Degree mRotY(0); + Degree mRotX(0.0f); + Degree mRotY(0.0f); Vector3 mTranslateVector = Vector3::ZERO; - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_SIDESTEP_LEFT)) mTranslateVector.x -= ctx.translationScale; // Move camera left Modified: trunk/source/main/gfx/camera/CameraBehaviorOrbit.cpp =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorOrbit.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorOrbit.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -19,29 +19,27 @@ */ #include "CameraBehaviorOrbit.h" -#include <Ogre.h> #include "CameraManager.h" #include "Console.h" #include "InputEngine.h" -#include "language.h" #include "Settings.h" +#include "language.h" +#include <Ogre.h> using namespace Ogre; CameraBehaviorOrbit::CameraBehaviorOrbit() : - camRotX(0) - , camRotY(0) - , camDist(5) - , minCamDist(3) - , camRatio(11) + camRotX(0.0f) + , camRotY(0.35f) + , camDist(5.0f) + , minCamDist(3.0f) + , camRatio(11.0f) , camIdealPosition(Vector3::ZERO) , camCenterPoint(Vector3::ZERO) , camTranslation(Vector3::ZERO) - , targetDirection(0) - , targetPitch(0) + , targetDirection(0.0f) + , targetPitch(0.0f) { - - } void CameraBehaviorOrbit::activate(cameraContext_t &ctx) @@ -69,44 +67,12 @@ { Camera *cam = CameraManager::getSingleton().getCamera(); - /* - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_SIDESTEP_LEFT)) - camTranslation.x -= mMoveScale; // Move camera left - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_SIDESTEP_RIGHT)) - camTranslation.x += mMoveScale; // Move camera RIGHT - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_FORWARD)) - camTranslation.z -= mMoveScale; // Move camera forward - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_BACKWARDS)) - camTranslation.z += mMoveScale; // Move camera backward - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_UP)) - camTranslation.y += mMoveScale; // Move camera up - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_DOWN)) - camTranslation.y -= mMoveScale; // Move camera down - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_ROT_UP)) - camRotY += mRotScale; - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_ROT_DOWN)) - camRotY -= mRotScale; - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_RIGHT)) - camRotX -= mRotScale; - - if(INPUTENGINE.getEventBoolValue(EV_CHARACTER_LEFT)) - camRotX += mRotScale; -*/ - if (INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_LOOKBACK)) { if(camRotX > Degree(0)) - camRotX=Degree(0); + camRotX = Degree(0); else - camRotX=Degree(180); + camRotX = Degree(180); } if (INPUTENGINE.getEventBoolValue(EV_CAMERA_ROTATE_LEFT)) { @@ -153,19 +119,14 @@ } if (INPUTENGINE.getEventBoolValue(EV_CAMERA_RESET)) { - camRotX=0; - //if (cameramode!=CAMERA_INT) - // camRotY=Degree(12); - //else - camRotY = DEFAULT_INTERNAL_CAM_PITCH; - camDist=20; + camRotX = 0; + camRotY = DEFAULT_INTERNAL_CAM_PITCH; + camDist = 20; } - - - // set Minimal Cam distance - if(camDist < minCamDist) camDist = minCamDist; - + // set minimum distance + camDist = std::max(camDist, minCamDist); + camIdealPosition = camDist * 0.5f * Vector3( \ sin(targetDirection + camRotX.valueRadians()) * cos(targetPitch + camRotY.valueRadians()) \ , sin(targetPitch + camRotY.valueRadians()) \ @@ -175,7 +136,7 @@ float real_camdist = camIdealPosition.length(); camIdealPosition = camIdealPosition + camCenterPoint + camTranslation; - Vector3 newposition = ( camIdealPosition + camRatio * cam->getPosition() ) / (camRatio+1.0f); + Vector3 newPosition = ( camIdealPosition + camRatio * cam->getPosition() ) / (camRatio+1.0f); /* Real h=hfinder->getHeightAt(newposition.x,newposition.z); @@ -187,11 +148,9 @@ if (newposition.y<h) newposition.y=h; */ - cam->setPosition(newposition); + cam->setPosition(newPosition); cam->lookAt(camCenterPoint); - lastPosition = camCenterPoint; - DOFManager *dof = CameraManager::getSingleton().getDOFManager(); if(dof) { Modified: trunk/source/main/gfx/camera/CameraBehaviorOrbit.h =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorOrbit.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorOrbit.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -28,7 +28,7 @@ protected: Ogre::Radian camRotX, camRotY; float camDist, minCamDist, camRatio; - Ogre::Vector3 camIdealPosition, camCenterPoint, lastPosition, camTranslation; + Ogre::Vector3 camIdealPosition, camCenterPoint, camTranslation; float targetDirection, targetPitch; public: Modified: trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.cpp =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -19,21 +19,16 @@ */ #include "CameraBehaviorVehicleOrbit.h" -#include <Ogre.h> -#include "CameraManager.h" -#include "Console.h" -#include "InputEngine.h" -#include "language.h" +#include "BeamFactory.h" #include "Settings.h" -#include "BeamFactory.h" - -using namespace Ogre; - CameraBehaviorVehicleOrbit::CameraBehaviorVehicleOrbit() : - externalCameraMode(0) + externalCameraMode(false) { - externalCameraMode = (SSETTING("External Camera Mode", "Pitching") == "Static")? 1 : 0; + minCamDist = 8.0f; + + if (SSETTING("External Camera Mode", "Pitching") == "Static") + externalCameraMode = true; } void CameraBehaviorVehicleOrbit::update(cameraContext_t &ctx) @@ -41,15 +36,16 @@ Beam *curr_truck = BeamFactory::getSingleton().getCurrentTruck(); if(!curr_truck) return; - // Make all the changes to the camera Vector3 dir = curr_truck->nodes[curr_truck->cameranodepos[0]].smoothpos - curr_truck->nodes[curr_truck->cameranodedir[0]].smoothpos; dir.normalise(); + targetDirection = -atan2(dir.dotProduct(Vector3::UNIT_X), dir.dotProduct(-Vector3::UNIT_Z)); + targetPitch = 0.0f; if(!externalCameraMode) + { targetPitch = -asin(dir.dotProduct(Vector3::UNIT_Y)); - else - targetPitch = 0; + } camRatio = 1.0f / (curr_truck->tdt * 4.0f); Modified: trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.h =================================================================== --- trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraBehaviorVehicleOrbit.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -26,7 +26,7 @@ class CameraBehaviorVehicleOrbit : public CameraBehaviorOrbit { protected: - int externalCameraMode; + bool externalCameraMode; public: CameraBehaviorVehicleOrbit(); void update(cameraContext_t &ctx); Modified: trunk/source/main/gfx/camera/CameraManager.cpp =================================================================== --- trunk/source/main/gfx/camera/CameraManager.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraManager.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -19,13 +19,14 @@ */ #include "CameraManager.h" -#include "Ogre.h" +#include "BeamFactory.h" +#include "Console.h" #include "InputEngine.h" +#include "Ogre.h" #include "Settings.h" -#include "Console.h" +#include "SoundScriptManager.h" #include "language.h" -#include "BeamFactory.h" #include "OverlayWrapper.h" #include "CameraBehaviorFree.h" @@ -39,32 +40,21 @@ using namespace Ogre; - CameraManager::CameraManager(Ogre::SceneManager *scm, Ogre::Camera *cam) : - mSceneMgr(scm) - , mCamera(cam) - , currentBehavior(0) + currentBehavior(0) , currentBehaviorID(-1) - // TODO: initialize other vars here + , mCamera(cam) + , mDOF(0) + , mLastPosition(Vector3::ZERO) + , mMoveScale(1.0f) + , mMoveSpeed(50) + , mRotScale(0.1f) + , mRotateSpeed(100) + , mSceneMgr(scm) { setSingleton(this); - lastcameramode=CAMERA_EXT; - cameramode=CAMERA_EXT; - mMoveScale = 1.0f; - mRotScale = 0.1f; - lastPosition = Vector3::ZERO; - camCollided=false; - camPosColl=Vector3::ZERO; - mSceneDetailIndex = 0; - mDOF=0; - mRotateSpeed = 100; - mMoveSpeed = 50; - enforceCameraFOVUpdate=true; - - // DOF? - bool useDOF = (BSETTING("DOF", false)); - if(useDOF) + if ( BSETTING("DOF", false) ) { mDOF = new DOFManager(mSceneMgr, mCamera->getViewport(), Ogre::Root::getSingletonPtr(), mCamera); mDOF->setEnabled(true); @@ -73,10 +63,10 @@ createGlobalBehaviors(); ctx.cam = mCamera; ctx.scm = mSceneMgr; - - - //switchBehavior(CAMBEHAVIOR_CHARACTER_ORBIT); - switchBehavior(CAMBEHAVIOR_VEHICLE_SPLINE); + + switchBehavior(CAMERA_CHARACTER_ORBIT); + switchBehavior(CAMERA_VEHICLE_ORBIT); + //switchBehavior(CAMERA_VEHICLE_SPLINE); } CameraManager::~CameraManager() @@ -86,30 +76,37 @@ void CameraManager::createGlobalBehaviors() { - globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMBEHAVIOR_FREE, new CameraBehaviorFree()) ); - globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMBEHAVIOR_CHARACTER_ORBIT, new CameraBehaviorCharacterOrbit()) ); - globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMBEHAVIOR_VEHICLE_ORBIT, new CameraBehaviorVehicleOrbit()) ); - globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMBEHAVIOR_VEHICLE_WHEELCHASE, new CameraBehaviorWheelChase()) ); - globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMBEHAVIOR_VEHICLE_SPLINE, new CameraBehaviorVehicleSpline()) ); + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_CHARACTER_ORBIT, new CameraBehaviorCharacterOrbit()) ); + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_VEHICLE_ORBIT, new CameraBehaviorVehicleOrbit()) ); + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_VEHICLE_SPLINE, new CameraBehaviorVehicleSpline()) ); + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_FREE, new CameraBehaviorFree()) ); + // TODO: Create a CameraBehavior for internal camera perspectives (e.g. cockpit, rear seats, ...) + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_VEHICLE_INTERNAL, new CameraBehaviorCharacterOrbit()) ); + + // TODO: Think about this. Do we really need this CameraBehavior? Or can it be part of the CAMERA_VEHICLE_INTERNAL behavior? + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_VEHICLE_WHEELCHASE, new CameraBehaviorWheelChase()) ); + + // TODO: Create a CameraBehavior for a fixed camera perspective + globalBehaviors.insert( std::pair<int, CameraBehavior*>(CAMERA_FIX, new CameraBehaviorFree()) ); } +#if 0 void CameraManager::updateInput() { -#if 0 Beam *curr_truck = BeamFactory::getSingleton().getCurrentTruck(); //camera mode if (cameramode != CAMERA_FREE && INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) && cameramode != CAMERA_FREE_FIXED) { - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { //end of internal cam camRotX=pushcamRotX; camRotY=pushcamRotY; } cameramode++; - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { //start of internal cam pushcamRotX=camRotX; @@ -122,7 +119,7 @@ //camera mode if (curr_truck && INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_CHANGE) && cameramode != CAMERA_FREE && cameramode != CAMERA_FREE_FIXED) { - if (cameramode==CAMERA_INT && curr_truck->currentcamera < curr_truck->freecinecamera-1) + if (cameramode==CAMERA_VEHICLE_INTERNAL && curr_truck->currentcamera < curr_truck->freecinecamera-1) { curr_truck->currentcamera++; curr_truck->changedCamera(); @@ -130,7 +127,7 @@ else { OverlayWrapper *ow = OverlayWrapper::getSingletonPtrNoCreation(); - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { //end of internal cam camRotX=pushcamRotX; @@ -142,7 +139,7 @@ curr_truck->changedCamera(); } cameramode++; - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { //start of internal cam pushcamRotX=camRotX; @@ -177,7 +174,7 @@ Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("FOV: ") + TOSTRING(fov), "camera_edit.png", 2000); #endif // USE_MYGUI // save the settings - if (cameramode == CAMERA_INT) + if (cameramode == CAMERA_VEHICLE_INTERNAL) SETTINGS.setSetting("FOV Internal", TOSTRING(fov)); else if (cameramode == CAMERA_EXT) SETTINGS.setSetting("FOV External", TOSTRING(fov)); @@ -193,7 +190,7 @@ Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("FOV: ") + TOSTRING(fov), "camera_edit.png", 2000); #endif // USE_MYGUI // save the settings - if (cameramode == CAMERA_INT) + if (cameramode == CAMERA_VEHICLE_INTERNAL) SETTINGS.setSetting("FOV Internal", TOSTRING(fov)); else if (cameramode == CAMERA_EXT) SETTINGS.setSetting("FOV External", TOSTRING(fov)); @@ -201,12 +198,7 @@ if (INPUTENGINE.getEventBoolValueBounce(EV_COMMON_TOGGLE_RENDER_MODE, 0.5f)) { - mSceneDetailIndex = (mSceneDetailIndex+1)%3 ; - switch(mSceneDetailIndex) { - case 0 : mCamera->setPolygonMode(Ogre::PM_SOLID) ; break ; - case 1 : mCamera->setPolygonMode(Ogre::PM_WIREFRAME) ; break ; - case 2 : mCamera->setPolygonMode(Ogre::PM_POINTS) ; break ; - } + mCamera->setPolygonMode( (mCamera->getPolygonMode() + 1) % 3 ); } if (INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_FREE_MODE_FIX)) { @@ -232,16 +224,14 @@ if (INPUTENGINE.getEventBoolValueBounce(EV_CAMERA_FREE_MODE)) { - currentBehavior = globalBehaviors[CAMBEHAVIOR_FREE]; + currentBehavior = globalBehaviors[CAMERA_FREE]; } -#endif // 0 } +#endif // 0 void CameraManager::switchToNextBehavior() { - int i = currentBehaviorID + 1; - if(i >= CAMBEHAVIOR_END) - i=0; + int i = (currentBehaviorID + 1) % CAMERA_END; switchBehavior(i); } @@ -273,7 +263,7 @@ switchToNextBehavior(); } #ifdef MYGUI - if (SceneMouse::getSingleton().isMouseGrabbed()) return; //freeze camera + if (SceneMouse::getSingleton().isMouseGrabbed()) return; // freeze camera #endif //MYGUI ctx.dt = dt; @@ -302,9 +292,18 @@ // update current behavior if(currentBehavior) + { currentBehavior->update(ctx); + } +#ifdef USE_OPENAL + // update audio listener position + Vector3 cameraSpeed = (mCamera->getPosition() - mLastPosition) / dt; + mLastPosition = mCamera->getPosition(); + SoundScriptManager::getSingleton().setCamera(mCamera->getPosition(), mCamera->getDirection(), mCamera->getUp(), cameraSpeed); +#endif //USE_OPENAL + #if 0 Beam *curr_truck = BeamFactory::getSingleton().getCurrentTruck(); @@ -358,7 +357,7 @@ } } - else if (cameramode==CAMERA_INT) + else if (cameramode==CAMERA_VEHICLE_INTERNAL) { float fov = FSETTING("FOV Internal", 75); if(changeCamMode) @@ -460,7 +459,7 @@ } } } - if (cameramode==CAMERA_INT) + if (cameramode==CAMERA_VEHICLE_INTERNAL) { int currentcamera=curr_truck->currentcamera; @@ -575,19 +574,6 @@ #endif // USE_CAELUM } } - - //position audio listener - Vector3 cpos=mCamera->getPosition(); - Vector3 cdir=mCamera->getDirection(); - Vector3 cup=mCamera->getUp(); - Vector3 cspeed=(cpos-cdoppler)/dt; - cdoppler=cpos; - // XXX maybe thats the source of sound destorsion: runtime order??? -#ifdef USE_OPENAL - SoundScriptManager::getSingleton().setCamera(cpos, cdir, cup, cspeed); -#endif // OPENAL - //if (cspeed.length()>50.0) {cspeed.normalise(); cspeed=50.0*cspeed;}; - //if (audioManager) audioManager->setListenerPosition(cpos.x, cpos.y, cpos.z, cspeed.x, cspeed.y, cspeed.z, cdir.x, cdir.y, cdir.z, cup.x, cup.y, cup.z); //water if (w) { @@ -599,14 +585,6 @@ #endif // 0 } - -bool CameraManager::setCameraPositionWithCollision(Vector3 newPos) -{ - // no collision of camera, normal mode - mCamera->setPosition(newPos); - return true; -} - bool CameraManager::mouseMoved(const OIS::MouseEvent& _arg) { if(!currentBehavior) return false; @@ -625,11 +603,6 @@ return currentBehavior->mouseReleased(_arg, _id); } -void CameraManager::triggerFOVUpdate() -{ - enforceCameraFOVUpdate = true; -} - bool CameraManager::allowInteraction() { if(!currentBehavior) return false; Modified: trunk/source/main/gfx/camera/CameraManager.h =================================================================== --- trunk/source/main/gfx/camera/CameraManager.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/gfx/camera/CameraManager.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -24,87 +24,68 @@ #include "DepthOfFieldEffect.h" #include "OIS.h" +#include "Ogre.h" #include "Singleton.h" -#include <map> - #include "CameraBehavior.h" #define MAIN_CAMERA CameraManager::getSingleton().getCamera() #define CAMERA_MODE CameraManager::getSingleton().getCameraMode() -#define DEFAULT_INTERNAL_CAM_PITCH Degree(-15) +#define DEFAULT_INTERNAL_CAM_PITCH Ogre::Degree(-15) class CameraManager : public RoRSingletonNoCreation < CameraManager > { friend class SceneMouse; + protected: - Ogre::SceneManager *mSceneMgr; + + DOFManager *mDOF; Ogre::Camera *mCamera; - int cameramode, lastcameramode; - bool camCollided; - Ogre::Vector3 camPosColl; Ogre::Radian pushcamRotX, pushcamRotY; + Ogre::SceneManager *mSceneMgr; + Ogre::Vector3 mLastPosition; + cameraContext_t ctx; float mMoveScale, mRotScale; - Ogre::Vector3 lastPosition; - int mSceneDetailIndex; - // Real dirSpeed; float mMoveSpeed, mRotateSpeed; - DOFManager *mDOF; - bool enforceCameraFOVUpdate; - Ogre::Vector3 cdoppler; - cameraContext_t ctx; CameraBehavior *currentBehavior; int currentBehaviorID; - enum { CAMBEHAVIOR_FREE - , CAMBEHAVIOR_CHARACTER_ORBIT - , CAMBEHAVIOR_VEHICLE_ORBIT - , CAMBEHAVIOR_VEHICLE_WHEELCHASE - , CAMBEHAVIOR_VEHICLE_SPLINE - , CAMBEHAVIOR_END - }; - std::map <int , CameraBehavior *> globalBehaviors; + void switchBehavior(int newBehavior); + void switchToNextBehavior(); + void createGlobalBehaviors(); + bool mouseMoved(const OIS::MouseEvent& _arg); bool mousePressed(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id); bool mouseReleased(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id); public: + CameraManager(Ogre::SceneManager *scm, Ogre::Camera *cam); ~CameraManager(); - void updateInput(); - void switchBehavior(int newBehavior); - void switchToNextBehavior(); - - enum { CAMERA_EXT=0, - CAMERA_FIX, - CAMERA_INT, - CAMERA_END, - CAMERA_FREE, - CAMERA_FREE_FIXED, - CAMERA_EXTERNALCONTROL=9999 + enum + { + CAMERA_CHARACTER_ORBIT=0 + , CAMERA_VEHICLE_INTERNAL + , CAMERA_VEHICLE_ORBIT + , CAMERA_VEHICLE_WHEELCHASE + , CAMERA_VEHICLE_SPLINE + , CAMERA_END + , CAMERA_FREE + , CAMERA_FIX }; + + void triggerFOVUpdate() { /*TODO: Think about this*/ }; + void update(float dt); - //void setCameraRotation(Ogre::Radian x, Ogre::Radian y, Ogre::Real distance) { camRotX=x; camRotY=y; camDist=distance;}; - //Ogre::Radian getCameraRotationX() { return camRotX; }; + bool allowInteraction(); - void update(float dt); - bool setCameraPositionWithCollision(Ogre::Vector3 newPos); Ogre::Camera *getCamera() { return mCamera; }; - int getCameraMode() { return cameramode; }; + int getCameraMode() { return mCamera->getPolygonMode(); }; inline DOFManager *getDOFManager() { return mDOF; } - - - - void createGlobalBehaviors(); - void triggerFOVUpdate(); - - bool allowInteraction(); }; #endif // CAMERAMANAGER_H__ - - Modified: trunk/source/main/physics/Beam.cpp =================================================================== --- trunk/source/main/physics/Beam.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/physics/Beam.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -1099,11 +1099,11 @@ if (engine) { int automode = -1; - if ((flagmask&NETMASK_ENGINE_MODE_AUTOMATIC)!=0) automode = AUTOMATIC; - else if ((flagmask&NETMASK_ENGINE_MODE_SEMIAUTO)!=0) automode = SEMIAUTO; - else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL)!=0) automode = MANUAL; - else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL_STICK)!=0) automode = MANUAL_STICK; - else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL_RANGES)!=0) automode = MANUAL_RANGES; + if ((flagmask&NETMASK_ENGINE_MODE_AUTOMATIC)!=0) automode = BeamEngine::AUTOMATIC; + else if ((flagmask&NETMASK_ENGINE_MODE_SEMIAUTO)!=0) automode = BeamEngine::SEMIAUTO; + else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL)!=0) automode = BeamEngine::MANUAL; + else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL_STICK)!=0) automode = BeamEngine::MANUAL_STICK; + else if ((flagmask&NETMASK_ENGINE_MODE_MANUAL_RANGES)!=0) automode = BeamEngine::MANUAL_RANGES; bool contact = ((flagmask&NETMASK_ENGINE_CONT) != 0); bool running = ((flagmask&NETMASK_ENGINE_RUN) != 0); @@ -2229,11 +2229,11 @@ if (engine->contact) send_oob->flagmask += NETMASK_ENGINE_CONT; if (engine->running) send_oob->flagmask += NETMASK_ENGINE_RUN; - if (engine->getAutoMode() == AUTOMATIC) send_oob->flagmask += NETMASK_ENGINE_MODE_AUTOMATIC; - else if (engine->getAutoMode() == SEMIAUTO) send_oob->flagmask += NETMASK_ENGINE_MODE_SEMIAUTO; - else if (engine->getAutoMode() == MANUAL) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL; - else if (engine->getAutoMode() == MANUAL_STICK) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL_STICK; - else if (engine->getAutoMode() == MANUAL_RANGES) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL_RANGES; + if (engine->getAutoMode() == BeamEngine::AUTOMATIC) send_oob->flagmask += NETMASK_ENGINE_MODE_AUTOMATIC; + else if (engine->getAutoMode() == BeamEngine::SEMIAUTO) send_oob->flagmask += NETMASK_ENGINE_MODE_SEMIAUTO; + else if (engine->getAutoMode() == BeamEngine::MANUAL) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL; + else if (engine->getAutoMode() == BeamEngine::MANUAL_STICK) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL_STICK; + else if (engine->getAutoMode() == BeamEngine::MANUAL_RANGES) send_oob->flagmask += NETMASK_ENGINE_MODE_MANUAL_RANGES; } if(free_aeroengine>0) @@ -5453,7 +5453,7 @@ void Beam::updateAI(float dt) { - if(driveable != TRUCK || CAMERA_MODE != CAMERA_FREE) + if(driveable != TRUCK || CAMERA_MODE != CameraManager::CAMERA_FREE) return; // start engine if not running Modified: trunk/source/main/physics/BeamData.h =================================================================== --- trunk/source/main/physics/BeamData.h 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/physics/BeamData.h 2012-04-28 19:52:33 UTC (rev 2485) @@ -170,16 +170,6 @@ EVENT_DELETE }; -enum camera_modes { - CAMERA_EXT=0, - CAMERA_FIX, - CAMERA_INT, - CAMERA_END, - // the free modes are on purpose behind end, so they require a special key to be triggered - CAMERA_FREE, - CAMERA_FREE_FIXED -}; - enum game_states { NONE_LOADED=0, TERRAIN_LOADED, Modified: trunk/source/main/physics/input_output/SerializedRig.cpp =================================================================== --- trunk/source/main/physics/input_output/SerializedRig.cpp 2012-04-28 18:47:43 UTC (rev 2484) +++ trunk/source/main/physics/input_output/SerializedRig.cpp 2012-04-28 19:52:33 UTC (rev 2485) @@ -2731,13 +2731,13 @@ // are there any startup shifter settings? Ogre::String gearboxMode = SSETTING("GearboxMode", "Automatic shift"); if (gearboxMode == "Manual shift - Auto clutch") - engine->setAutoMode(SEMIAUTO); + engine->setAutoMode(BeamEngine::SEMIAUTO); else if (gearboxMode == "Fully Manual: sequential shift") - engine->setAutoMode(MANUAL); + engine->setAutoMode(BeamEngine::MANUAL); else if (gearboxMode == "Fully Manual: stick shift") - engine->setAutoMode(MANUAL_STICK); + engine->setAutoMode(BeamEngine::MANUAL_STICK); else if (gearboxMode == "Fully Manual: stick shift with ranges") - engine->setAutoMode(MANUAL_RANGES); + engine->setAutoMode(BeamEngine::MANUAL_RANGES); //engine->start(); continue; 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