From 14d77f48a2437b072e91d14eebd1d843f9ce0cad Mon Sep 17 00:00:00 2001 From: madbad Date: Thu, 7 Dec 2023 14:23:51 +0000 Subject: [PATCH] Implement a look back command that swtiches the camera to one looking behind the driver car (for now only in OSG, SSG pending) git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@9225 30fe4595-0a0c-4342-8851-515496e4dcbd --- data/data/menu/controlconfigmenu.xml | 27 ++++++- data/drivers/human/preferences.xml | 3 +- src/interfaces/car.h | 2 + src/interfaces/playerpref.h | 5 +- src/libs/robottools/rthumandriver.cpp | 34 ++++++++- src/modules/graphic/osggraph/OsgMain.cpp | 22 +++++- .../graphic/osggraph/Viewer/OsgCamera.cpp | 70 +++++++++++++++++++ .../graphic/osggraph/Viewer/OsgScreens.cpp | 36 ++++++++++ .../graphic/osggraph/Viewer/OsgScreens.h | 2 + src/modules/simu/simureplay/simu.cpp | 1 + .../legacymenu/confscreens/controlconfig.cpp | 3 + 11 files changed, 200 insertions(+), 5 deletions(-) diff --git a/data/data/menu/controlconfigmenu.xml b/data/data/menu/controlconfigmenu.xml index 94d30f09a..5f1bb9a02 100644 --- a/data/data/menu/controlconfigmenu.xml +++ b/data/data/menu/controlconfigmenu.xml @@ -21,7 +21,7 @@ - +
@@ -625,6 +625,31 @@
+
+ + + + + + + +
+ +
+ + + + + + + + + + + + +
+
diff --git a/data/drivers/human/preferences.xml b/data/drivers/human/preferences.xml index 55e0feb73..a22b728ee 100644 --- a/data/drivers/human/preferences.xml +++ b/data/drivers/human/preferences.xml @@ -14,7 +14,7 @@ - +
@@ -53,6 +53,7 @@ + diff --git a/src/interfaces/car.h b/src/interfaces/car.h index 7bbc14e15..db7d801da 100644 --- a/src/interfaces/car.h +++ b/src/interfaces/car.h @@ -293,6 +293,7 @@ typedef struct { tPosd corner[4]; tdble glance; /* Glance angle degrees, left -ve, right +ve */ tdble oldglance; + bool lookback; /*if true temporary enable the look back camera*/ } tPublicCar; /* structure access */ #define _DynGC pub.DynGC @@ -319,6 +320,7 @@ typedef struct { #define _posMat pub.posMat #define _glance pub.glance #define _oldglance pub.oldglance +#define _lookback pub.lookback /** Dynamic wheel information */ typedef struct { diff --git a/src/interfaces/playerpref.h b/src/interfaces/playerpref.h index 00f12b2ca..b76334481 100644 --- a/src/interfaces/playerpref.h +++ b/src/interfaces/playerpref.h @@ -136,6 +136,8 @@ #define HM_ATT_R_GLANCE_MIN "right glance min" #define HM_ATT_R_GLANCE_MAX "right glance max" +#define HM_ATT_CAM_LOOKBACK "camera look back" + #define HM_ATT_DASHB_NEXT "dashboard next item" #define HM_ATT_DASHB_NEXT_MIN "dashboard next item min" #define HM_ATT_DASHB_NEXT_MAX "dashboard next item max" @@ -212,7 +214,8 @@ typedef enum { #define CMD_DASHB_PREV 25 #define CMD_DASHB_INC 26 #define CMD_DASHB_DEC 27 +#define CMD_LOOKBACK 28 -#define CMD_END_OF_LIST 27 /* Change this to same value as last item */ +#define CMD_END_OF_LIST 28 /* Change this to same value as last item */ #endif /* _PLAYERPREF_H_ */ diff --git a/src/libs/robottools/rthumandriver.cpp b/src/libs/robottools/rthumandriver.cpp index 1eda57c7f..55269231f 100644 --- a/src/libs/robottools/rthumandriver.cpp +++ b/src/libs/robottools/rthumandriver.cpp @@ -201,6 +201,7 @@ const static int hboxChanges[] = { 0x02, // 0b00000010, // R static int preGear = 0; +/*self note: apparently these should follow thew order of definition of the cmd definitions (see playerpref.h)*/ static const tControlCmd CmdControlRef[] = { {HM_ATT_UP_SHFT, GFCTRL_TYPE_JOY_BUT, 0, HM_ATT_UP_SHFT_MIN, 0.0, 0.0, HM_ATT_UP_SHFT_MAX, 1.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_DN_SHFT, GFCTRL_TYPE_JOY_BUT, 1, HM_ATT_DN_SHFT_MIN, 0.0, 0.0, HM_ATT_DN_SHFT_MAX, 1.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, @@ -230,7 +231,8 @@ static const tControlCmd CmdControlRef[] = { {HM_ATT_DASHB_NEXT ,GFCTRL_TYPE_NOT_AFFECTED, -1, HM_ATT_DASHB_NEXT_MIN, 0.0, 0.0, HM_ATT_DASHB_NEXT_MAX, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_DASHB_PREV ,GFCTRL_TYPE_NOT_AFFECTED, -1, HM_ATT_DASHB_PREV_MIN, 0.0, 0.0, HM_ATT_DASHB_PREV_MAX, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_DASHB_INC ,GFCTRL_TYPE_NOT_AFFECTED, -1, HM_ATT_DASHB_INC_MIN, 0.0, 0.0, HM_ATT_DASHB_INC_MAX, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, - {HM_ATT_DASHB_DEC ,GFCTRL_TYPE_NOT_AFFECTED, -1, HM_ATT_DASHB_DEC_MIN, 0.0, 0.0, HM_ATT_DASHB_DEC_MAX, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0} + {HM_ATT_DASHB_DEC ,GFCTRL_TYPE_NOT_AFFECTED, -1, HM_ATT_DASHB_DEC_MIN, 0.0, 0.0, HM_ATT_DASHB_DEC_MAX, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, + {HM_ATT_CAM_LOOKBACK,GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, }; static const int NbCmdControl = sizeof(CmdControlRef) / sizeof(CmdControlRef[0]); @@ -725,6 +727,10 @@ void HumanDriver::new_race(int index, tCarElt* car, tSituation *s) // Set up glancing car->_oldglance = 0; car->_glance = 0; + + // Set default for looking back command + car->_lookback = false; + //GfOut("SteerCmd : Left : sens=%4.1f, spSens=%4.2f, deadZ=%4.2f\n", // cmd[CMD_LEFTSTEER].sens, cmd[CMD_LEFTSTEER].spdSens, cmd[CMD_LEFTSTEER].deadZone); @@ -1325,6 +1331,32 @@ static void common_drive(const int index, tCarElt* car, tSituation *s) car->_glance = 0; } + //look back camera command + if ( + (//if the look back camera button is pressed + (cmd[CMD_LOOKBACK].type == GFCTRL_TYPE_JOY_BUT && joyInfo->levelup[cmd[CMD_LOOKBACK].val]) //if is a joypad button check if the button is pressed + || (cmd[CMD_LOOKBACK].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->button[cmd[CMD_LOOKBACK].val]) //if is a mouse button check if the button is pressed + || (cmd[CMD_LOOKBACK].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_LOOKBACK].val)].state)//if is a keyboard key check if the key is pressed + || (cmd[CMD_LOOKBACK].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_LOOKBACK].deadZone != 0)//if it's a joypad axis check if the axis is not at rest position (0) + ) + || + (//or if both glance left and glance right buttons are pressed simultaneously + ((cmd[CMD_RIGHTGLANCE].type == GFCTRL_TYPE_JOY_BUT && joyInfo->levelup[cmd[CMD_RIGHTGLANCE].val]) + || (cmd[CMD_RIGHTGLANCE].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->button[cmd[CMD_RIGHTGLANCE].val]) + || (cmd[CMD_RIGHTGLANCE].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_RIGHTGLANCE].val)].state) + || (cmd[CMD_RIGHTGLANCE].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_RIGHTGLANCE].deadZone != 0)) + && + ((cmd[CMD_LEFTGLANCE].type == GFCTRL_TYPE_JOY_BUT && joyInfo->levelup[cmd[CMD_LEFTGLANCE].val]) + || (cmd[CMD_LEFTGLANCE].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->button[cmd[CMD_LEFTGLANCE].val]) + || (cmd[CMD_LEFTGLANCE].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_LEFTGLANCE].val)].state) + || (cmd[CMD_LEFTGLANCE].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_LEFTGLANCE].deadZone != 0)) + ) + ) + { + car->_lookback=true; + }else{ + car->_lookback=false; + } // dashboard handling if ((cmd[CMD_DASHB_NEXT].type == GFCTRL_TYPE_JOY_BUT && joyInfo->edgeup[cmd[CMD_DASHB_NEXT].val]) diff --git a/src/modules/graphic/osggraph/OsgMain.cpp b/src/modules/graphic/osggraph/OsgMain.cpp index 25a592312..4d74703f3 100644 --- a/src/modules/graphic/osggraph/OsgMain.cpp +++ b/src/modules/graphic/osggraph/OsgMain.cpp @@ -127,6 +127,16 @@ void SDSelectCamera(void *vp) screens->changeCamera(t); } +void SDSelectCameraTemporaryOn(void *vp)//temporary select a different camera +{ + screens->changeCameraTemporaryOn(); +} + +void SDSelectCameraTemporaryOff(void *vp)//temporary select a different camera +{ + screens->changeCameraTemporaryOff(); +} + void SDSetZoom(void *vp) { long t = (long)vp; @@ -327,6 +337,16 @@ int refresh(tSituation *s) frameInfo.fInstFps, frameInfo.fAvgFps); } adaptScreenSize(); + + tCarElt* curCar = screens->getActiveView()->getCurrentCar(); + + //switch to look back camera if requested by the driver + if (curCar->_lookback == true){ + SDSelectCameraTemporaryOn((void*)0); + }else{ + SDSelectCameraTemporaryOff((void*)0); + } + cam = screens->getActiveView()->getCameras()->getSelectedCamera(); osg::Vec3d eye = cam->getCameraPosition(); double X = eye[0]; @@ -335,6 +355,7 @@ int refresh(tSituation *s) render->UpdateSky(s->currentTime, s->accelTime, X, Y); tCarElt* curCar = screens->getActiveView()->getCurrentCar(); + int drawDriver = cam->getDrawDriver(); int drawCurrent = cam->getDrawCurrent(); cars->updateCars(s, curCar, drawCurrent, drawDriver); @@ -345,7 +366,6 @@ int refresh(tSituation *s) screens->update(s, &frameInfo, osg::Vec4f(render->getFogColor(),1.0f)); //refresh the hud - //tCarElt* curCar = screens->getActiveView()->getCurrentCar(); hud.Refresh(s, &frameInfo, curCar, Clouds, Rain, TimeOfDay); return 0; diff --git a/src/modules/graphic/osggraph/Viewer/OsgCamera.cpp b/src/modules/graphic/osggraph/Viewer/OsgCamera.cpp index 773e8db5e..4caf3a334 100644 --- a/src/modules/graphic/osggraph/Viewer/OsgCamera.cpp +++ b/src/modules/graphic/osggraph/Viewer/OsgCamera.cpp @@ -801,6 +801,61 @@ public: } }; +// cGrCarCamBehindReverse ================================================================ + +class SDCarCamBehindReverseFlipped : public SDPerspCamera +{ +public: + SDCarCamBehindReverseFlipped (SDView *myscreen, int id, int drawCurr, int drawBG, + float myfovy, float myfovymin, float myfovymax, + float myfnear, float myffar = 1500.0, + float myfogstart = 1400.0, float myfogend = 1500.0) + : SDPerspCamera(myscreen, id, drawCurr, 0, drawBG, 0, + myfovy, myfovymin, myfovymax, + myfnear, myffar, myfogstart, myfogend) {} + + void update(tCarElt *car, tSituation *s) + { + sgVec3 P, p; + float offset = 0; + + p[0] = car->_bonnetPos_x - (car->_dimension_x/2); + p[1] = car->_bonnetPos_y; + p[2] = car->_bonnetPos_z; + sgXformPnt3(p, car->_posMat); + + //our eye (camera) position + eye[0] = p[0]; + eye[1] = p[1]; + eye[2] = p[2]; + + // Compute offset angle and bezel compensation) + if (viewOffset) + { + offset += getSpanAngle(); + } + + P[0] = car->_bonnetPos_x + (car->_dimension_x/2) - 100 + 30.0 * cos(offset); + P[1] = car->_bonnetPos_y + 30.0 * sin(offset); + P[2] = car->_bonnetPos_z; + sgXformPnt3(P, car->_posMat); + + //where the camera will be pointing at + center[0] = P[0]; + center[1] = P[1]; + center[2] = P[2]; + + up[0] = car->_posMat[2][0]; + up[1] = car->_posMat[2][1]; + up[2] = car->_posMat[2][2]; + + speed[0] =car->pub.DynGCg.vel.x; + speed[1] =car->pub.DynGCg.vel.y; + speed[2] =car->pub.DynGCg.vel.z; + } +}; + + // cGrCarCamFront ================================================================ class SDCarCamFront : public SDPerspCamera @@ -1925,6 +1980,21 @@ SDCameras::SDCameras(SDView *c, int ncars) fixedFar ? fixedFar/2 : 300.0 * fovFactor, /* fogstart */ fixedFar ? fixedFar : 600.0 * fovFactor /* fogend */ )); + id++; + /* TODO BUG F2 = just behind the car; camera looking back */ + cameras[0].push_back(new SDCarCamBehindReverseFlipped(myscreen, + id, + 1, /* drawCurr */ + 1, /* drawBG */ + 67.5f, /* fovy */ + 10.0f, /* fovymin */ + 95.0f, /* fovymax */ + 0.3f, /* near */ + fixedFar ? fixedFar : 600.0 * fovFactor, /* far */ + fixedFar ? fixedFar/2 : 300.0 * fovFactor, /* fogstart */ + fixedFar ? fixedFar : 600.0 * fovFactor /* fogend */ + )); + /* F3 - 3rd Person Views - cameras index 1*/ id=0; diff --git a/src/modules/graphic/osggraph/Viewer/OsgScreens.cpp b/src/modules/graphic/osggraph/Viewer/OsgScreens.cpp index 89fd5e671..eb2833e7a 100644 --- a/src/modules/graphic/osggraph/Viewer/OsgScreens.cpp +++ b/src/modules/graphic/osggraph/Viewer/OsgScreens.cpp @@ -230,6 +230,42 @@ void SDScreens::changeCamera(long p) } } +int prevCamList=0; +int prevCamNum=0; +bool usingRearCam = false; +void SDScreens::changeCameraTemporaryOn() +{ + //if we are already on rear cam do nothing + if(usingRearCam) return; + + int newCamList = 0; + int newCamNum = 0; + GfLogInfo("Switching camera\n"); + + //remember the currently selected cameras + int camList,camNum; + getActiveView()->getCameras()->getIntSelectedListAndCamera(&camList,&camNum); + GfLogInfo("Previous cam was %i %i \n",camList,camNum); + + //temporary switch to this the rear view one + newCamList = 0; //(see osgcamera.cpp for reference) + newCamNum = 5; + prevCamList = camList; + prevCamNum = camNum; + + this->getActiveView()->getCameras()->selectCamera(newCamList,newCamNum); + usingRearCam = true; +} + +void SDScreens::changeCameraTemporaryOff() +{ + //if we are already not on rear cam do nothing + if(!usingRearCam) return; + this->getActiveView()->getCameras()->selectCamera(prevCamList,prevCamNum); + usingRearCam = false; +} + + void SDScreens::toggleHUD() { hud.ToggleHUD(); diff --git a/src/modules/graphic/osggraph/Viewer/OsgScreens.h b/src/modules/graphic/osggraph/Viewer/OsgScreens.h index 0ffebe58a..1dae5d295 100644 --- a/src/modules/graphic/osggraph/Viewer/OsgScreens.h +++ b/src/modules/graphic/osggraph/Viewer/OsgScreens.h @@ -53,6 +53,8 @@ public: void InitCars(tSituation *s); void update(tSituation *s,SDFrameInfo* fi, osg::Vec4f(colorfog)); void changeCamera(long p); + void changeCameraTemporaryOn(); + void changeCameraTemporaryOff(); void registerViewDependantPreRenderNode(osg::ref_ptr node); void toggleHUD(); void toggleHUDwidget(const std::string &widget); diff --git a/src/modules/simu/simureplay/simu.cpp b/src/modules/simu/simureplay/simu.cpp index ec8416359..6cebdaa09 100644 --- a/src/modules/simu/simureplay/simu.cpp +++ b/src/modules/simu/simureplay/simu.cpp @@ -196,6 +196,7 @@ SimUpdate(tSituation *s, double deltaTime) memcpy(&pTgtCar->pub, &pSrcCar->pub, sizeof(tPublicCar)); pTgtCar->_glance = 0; pTgtCar->_oldglance = 0; + pTgtCar->_lookback = false; #endif #if 1 diff --git a/src/modules/userinterface/legacymenu/confscreens/controlconfig.cpp b/src/modules/userinterface/legacymenu/confscreens/controlconfig.cpp index 81ffce99c..cf46b3c98 100644 --- a/src/modules/userinterface/legacymenu/confscreens/controlconfig.cpp +++ b/src/modules/userinterface/legacymenu/confscreens/controlconfig.cpp @@ -72,6 +72,8 @@ static tCmdInfo Cmd[] = { {HM_ATT_EBRAKE_CMD, {-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_EBRAKE_MIN, 0, HM_ATT_EBRAKE_MAX, 0, 0, 0, 1, HM_ATT_JOY_REQ_BUT, 0}, {HM_ATT_HBOX_X, {-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_HBOX_X_MIN, -1, HM_ATT_HBOX_X_MAX, 1, 0, 0, 1, HM_ATT_JOY_REQ_AXIS, 0}, {HM_ATT_HBOX_Y, {-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_HBOX_Y_MIN, -1, HM_ATT_HBOX_Y_MAX, 1, 0, 0, 1, HM_ATT_JOY_REQ_AXIS, 0}, + + {HM_ATT_CAM_LOOKBACK ,{-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, 0, 0, 0, 0, 0, 0, 1, HM_ATT_JOY_REQ_BUT, 0}, {HM_ATT_LEFTGLANCE, {-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_L_GLANCE_MIN, -1, HM_ATT_L_GLANCE_MAX,-0.1, 0, 0, 1, HM_ATT_JOY_PREF_ANY, 0}, {HM_ATT_RIGHTGLANCE,{-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_R_GLANCE_MIN, 0.1, HM_ATT_R_GLANCE_MAX, 1, 0, 0, 1, HM_ATT_JOY_PREF_ANY, 0}, {HM_ATT_DASHB_NEXT, {-1, GFCTRL_TYPE_NOT_AFFECTED}, 0, 0, HM_ATT_DASHB_NEXT_MIN, 0, HM_ATT_DASHB_NEXT_MAX,0, 0, 0, 1, HM_ATT_JOY_REQ_BUT, 0}, @@ -113,6 +115,7 @@ static tCmdDispInfo CmdDispInfo[] = { { GEAR_MODE_AUTO | GEAR_MODE_SEQ | GEAR_MODE_GRID | GEAR_MODE_HBOX }, // EBRAKE_CMD { GEAR_MODE_HBOX }, // GEAR_X, { GEAR_MODE_HBOX }, // GEAR_Y, + { GEAR_MODE_AUTO | GEAR_MODE_SEQ | GEAR_MODE_GRID | GEAR_MODE_HBOX }, // LOOKBEHINDCAMERA, { GEAR_MODE_AUTO | GEAR_MODE_SEQ | GEAR_MODE_GRID | GEAR_MODE_HBOX }, // LEFTGLANCE, { GEAR_MODE_AUTO | GEAR_MODE_SEQ | GEAR_MODE_GRID | GEAR_MODE_HBOX }, // RIGHTGLANCE { GEAR_MODE_AUTO | GEAR_MODE_SEQ | GEAR_MODE_GRID | GEAR_MODE_HBOX }, // DASHBOARD NEXT