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
This commit is contained in:
madbad 2023-12-07 14:23:51 +00:00
parent 0e1e18d94f
commit 14d77f48a2
11 changed files with 200 additions and 5 deletions

View File

@ -21,7 +21,7 @@
<!DOCTYPE params SYSTEM "../tgf/params.dtd">
<params name="controlconfigmenu" version="1.3">
<params name="controlconfigmenu" version="1.4">
<section name="dynamic controls">
@ -625,6 +625,31 @@
<attstr name="pushed color" val="0xFFCC00"/>
</section>
<section name="camera look back">
<attstr name="type" val="label"/>
<attnum name="x" val="290"/>
<attnum name="y" val="204"/>
<attstr name="text" val="Look back camera:"/>
<attstr name="h align" val="right"/>
<attnum name="width" val="140"/>
<attstr name="font" val="small_t"/>
</section>
<section name="camera look back button">
<attstr name="type" val="text button"/>
<attstr name="show box" val="no"/>
<attstr name="text" val="MOUSE_MIDDLE_BUTTON"/>
<attstr name="tip" val="Click to configure"/>
<attnum name="x" val="435"/>
<attnum name="y" val="204"/>
<attstr name="h align" val="center"/>
<attnum name="width" val="140"/>
<attstr name="font" val="medium"/>
<attstr name="color" val="0xFFFFFF"/>
<attstr name="focused color" val="0xFFFFFF"/>
<attstr name="pushed color" val="0xFFCC00"/>
</section>
<section name="dashboard next item">
<attstr name="type" val="label"/>
<attnum name="x" val="290"/>

View File

@ -14,7 +14,7 @@
<!DOCTYPE params SYSTEM "../../libs/tgf/params.dtd">
<params mode="mw" type="template" name="Player Pref" version="1.8">
<params mode="mw" type="template" name="Player Pref" version="1.9">
<section name="Preferences">
@ -53,6 +53,7 @@
<attstr name="ABS cmd" val="a"/>
<attstr name="Light1 cmd" val="l"/>
<attstr name="Speed Limiter" val="s"/>
<attstr name="camera look behind" val="b"/>
<attstr name="dashboard next item" val="u"/>
<attstr name="dashboard previous item" val="j"/>
<attstr name="dashboard increase" val="k"/>

View File

@ -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 {

View File

@ -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_ */

View File

@ -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])

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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<osg::Node> node);
void toggleHUD();
void toggleHUDwidget(const std::string &widget);

View File

@ -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

View File

@ -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