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:
parent
0e1e18d94f
commit
14d77f48a2
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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]);
|
||||
|
@ -726,6 +728,10 @@ void HumanDriver::new_race(int index, tCarElt* car, tSituation *s)
|
|||
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);
|
||||
//GfOut("SteerCmd : Right: sens=%4.1f, spSens=%4.2f, deadZ=%4.2f\n",
|
||||
|
@ -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])
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue