OSG: split screen working TODO : load/save params screens and cameras + check spansplit

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@5229 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 25b6e5f8ba1980d041e45502b54619714aae67c8
Former-commit-id: 6bbc4a636eda38a68466b44d8c0cd3ef000b3330
This commit is contained in:
rvlander 2013-02-28 11:56:23 +00:00
parent 4e71f19eb5
commit d2fb2380a3
7 changed files with 409 additions and 28 deletions

View file

@ -68,6 +68,10 @@ Camera * SDCamera::getGenericCamera(){
return c;
}
void SDCamera::setViewOffset(float v){
}
void SDCamera::update(tCarElt * car, tSituation * s)
{
/*osg::Vec3 P, p;
@ -2399,6 +2403,7 @@ void SDCameras::nextCamera(int list){
cameraHasChanged = true;
cameras[selectedList][selectedCamera]->setViewOffset(screen->getViewOffset());
cameras[selectedList][selectedCamera]->setProjection();
this->screen->de_activateMirror();

View file

@ -86,6 +86,7 @@ public:
virtual float getLODFactor(float x, float y, float z) = 0; /* Get the LOD factor for an object located at x,y,z */
virtual void setViewOffset(float newOffset)=0;
inline float getAspectRatio(){return 0.0;}
inline float getMirrorAllowed(){return mirrorAllowed;}
//camera for sound

View file

@ -152,6 +152,16 @@ void SDSwitchMirror(void * vp){
screens->getActiveView()->switchMirror();
}
void SDSplitScreen(void * vp){
long t = (long)vp;
screens->splitScreen(t);
}
void SDChangeScreen(void * vp){
long t = (long)vp;
screens->changeScreen(t);
}
int
initView(int x, int y, int width, int height, int /* flag */, void *screen)
{
@ -217,11 +227,11 @@ initView(int x, int y, int width, int height, int /* flag */, void *screen)
GfuiAddKey(screen, '-', GFUIM_CTRL, "Zoom Out", (void*)GR_ZOOM_OUT, SDSetZoom, NULL);
GfuiAddKey(screen, '>', "Zoom In", (void*)GR_ZOOM_IN, SDSetZoom, NULL);
GfuiAddKey(screen, '<', "Zoom Out", (void*)GR_ZOOM_OUT, SDSetZoom, NULL);
/*GfuiAddKey(screen, '(', "Split Screen", (void*)GR_SPLIT_ADD, grSplitScreen, NULL);
GfuiAddKey(screen, ')', "UnSplit Screen", (void*)GR_SPLIT_REM, grSplitScreen, NULL);
GfuiAddKey(screen, '_', "Split Screen Arrangement", (void*)GR_SPLIT_ARR, grSplitScreen, NULL);
GfuiAddKey(screen, GFUIK_TAB, "Next (split) Screen", (void*)GR_NEXT_SCREEN, grChangeScreen, NULL);
GfuiAddKey(screen, 'm', "Track Maps", (void*)0, grSelectTrackMap, NULL);*/
GfuiAddKey(screen, '(', "Split Screen", (void*)GR_SPLIT_ADD, SDSplitScreen, NULL);
GfuiAddKey(screen, ')', "UnSplit Screen", (void*)GR_SPLIT_REM, SDSplitScreen, NULL);
GfuiAddKey(screen, '_', "Split Screen Arrangement", (void*)GR_SPLIT_ARR, SDSplitScreen, NULL);
GfuiAddKey(screen, GFUIK_TAB, "Next (split) Screen", (void*)GR_NEXT_SCREEN, SDChangeScreen, NULL);
/*GfuiAddKey(screen, 'm', "Track Maps", (void*)0, grSelectTrackMap, NULL);*/
GfLogInfo("Current screen is #%d (out of %d)\n", nCurrentScreenIndex, grNbActiveScreens);

View file

@ -25,6 +25,7 @@
#include <osg/GraphicsContext>
#include "OsgScreens.h"
#include "OsgMain.h"
SDScreens::SDScreens()
{
@ -34,40 +35,64 @@ SDScreens::SDScreens()
void SDScreens::Init(int x,int y, int width, int height, osg::ref_ptr<osg::Group> m_sceneroot){
//int grWinx = x;
//int grWiny = y;
int grWinw = width;
int grWinh = height;
grWinx = x;
grWiny = y;
grWinw = width;
grWinh = height;
//intialising main screen
osg::Camera * mirrorCam = new osg::Camera;
view = new SDView(viewer->getCamera(),0,0,grWinw,grWinh,mirrorCam);
SDView * view = new SDView(viewer->getCamera(),0,0,grWinw,grWinh,mirrorCam);
viewer->setThreadingModel(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext);
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> gw = viewer->setUpViewerAsEmbeddedInWindow(0, 0, grWinw, grWinh);
//view->getOsgView()->setUpViewInWindow(0, 0, grWinw, grWinh,0);
viewer->getCamera()->setName("Cam one");
//viewer->getCamera()->setName("Cam one");
viewer->getCamera()->setViewport(new osg::Viewport(0, 0, grWinw, grWinh));
viewer->getCamera()->setGraphicsContext(gw);
viewer->getCamera()->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
//viewer->getCamera()->setProjectionMatrixAsPerspective(67.5f, static_cast<double>((float)grWinw / (float)grWinh), 0.1f, 12000.0f);
mirrorCam->setGraphicsContext(gw);
mirrorCam->setClearMask( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
//mirrorCam->setClearMask( GL_COLOR_BUFFER_BIT );
mirrorCam->setReferenceFrame( osg::Camera::ABSOLUTE_RF );
//mirrorCam->setClearMask( GL_DEPTH_BUFFER_BIT );
// mirrorCam->setRenderOrder( osg::Camera::POST_RENDER );
//mirrorCam->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
//mirrorCam->setProjectionMatrixAsPerspective(67.5f, static_cast<double>((float)grWinw / (float)grWinh), 0.1f, 12000.0f);
grScreens.insert(grScreens.end(),view);
root = new osg::Group;
root->addChild(m_sceneroot);
root->addChild(mirrorCam);
mirrorCam->addChild(m_sceneroot);
//viewer->addSlave(mirrorCam);//,osg::Matrix(),osg::Matrix(),true);
//adding all otherer cams
osg::Camera * screenCam;
for(int i=1;i<GR_NB_MAX_SCREEN;i++){
screenCam = new osg::Camera;
screenCam->setGraphicsContext(gw);
screenCam->setClearMask( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
screenCam->setReferenceFrame( osg::Camera::ABSOLUTE_RF );
screenCam->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
screenCam->addChild(m_sceneroot);
screenCam->setNodeMask(0);
mirrorCam = new osg::Camera;
mirrorCam->setGraphicsContext(gw);
mirrorCam->setClearMask( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
mirrorCam->setReferenceFrame( osg::Camera::ABSOLUTE_RF );
mirrorCam->addChild(m_sceneroot);
mirrorCam->setNodeMask(0);
view = new SDView(screenCam,0,0,grWinw,grWinh,mirrorCam);
grScreens.insert(grScreens.end(),view);
root->addChild(screenCam);
root->addChild(mirrorCam);
}
viewer->setSceneData(root);
@ -76,24 +101,315 @@ void SDScreens::Init(int x,int y, int width, int height, osg::ref_ptr<osg::Group
void SDScreens::InitCars(tSituation *s)
{
view->Init(s);
for (int i=0; i<grScreens.size();i++){
grScreens[i]->Init(s);
}
}
void SDScreens::update(tSituation * s,SDFrameInfo* fi)
{
view->update(s,fi);
for (int i=0;i< grScreens.size();i++){
grScreens[i]->update(s,fi);
}
if (!viewer->done())
viewer->frame();
}
void SDScreens::splitScreen(long p){
switch (p) {
case GR_SPLIT_ADD:
if (grNbActiveScreens < GR_NB_MAX_SCREEN)
grNbActiveScreens++;
if (grSpanSplit)
grNbArrangeScreens=1;
else
grNbArrangeScreens=0;
break;
case GR_SPLIT_REM:
if (grNbActiveScreens > 1)
grNbActiveScreens--;
if (grSpanSplit)
grNbArrangeScreens=1;
else
grNbArrangeScreens=0;
break;
case GR_SPLIT_ARR:
grNbArrangeScreens++;
}
// Ensure current screen index stays in the righ range.
if (nCurrentScreenIndex >= grNbActiveScreens)
nCurrentScreenIndex = grNbActiveScreens - 1;
// Save nb of active screens to user settings.
GfParmSetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_NB_SCREENS, NULL, grNbActiveScreens);
GfParmSetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_ARR_SCREENS, NULL, grNbArrangeScreens);
GfParmWriteFile(NULL, grHandle, "Graph");
grAdaptScreenSize();
}
void SDScreens::grAdaptScreenSize(){
int i;
switch (grNbActiveScreens)
{
default:
case 1:
// Hack to allow span-split to function OK
if (grNbArrangeScreens > 1) grNbArrangeScreens = 0;
// Always Full window.
grScreens[0]->activate(grWinx, grWiny, grWinw, grWinh, 0.0);
for (i=1; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
case 2:
switch (grNbArrangeScreens) {
default:
grNbArrangeScreens = 0;
case 0:
// Top & Bottom half of the window
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx, grWiny, grWinw, grWinh / 2, 0.0);
break;
case 1:
// Left & Right half of the window
grScreens[0]->activate(grWinx, grWiny, grWinw / 2, grWinh, grSpanSplit * (-0.5 + 10));
grScreens[1]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh, grSpanSplit * (0.5 + 10));
break;
case 2:
// 33/66% Left/Right
grScreens[0]->activate(grWinx, grWiny, grWinw / 3, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw * 2/3, grWinh, 0.0);
break;
case 3:
// 66/33% Left/Right
grScreens[0]->activate(grWinx, grWiny, grWinw * 2/3, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh, 0.0);
break;
}
for (i=2; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
case 3:
switch (grNbArrangeScreens) {
default:
grNbArrangeScreens = 0;
case 0:
// Left/Right below wide
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2, 0.0);
break;
case 1:
// All side by side
grScreens[0]->activate(grWinx, grWiny, grWinw / 3, grWinh, grSpanSplit * (-1 + 10));
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh, grSpanSplit * (0.0 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh, grSpanSplit * (1 + 10));
break;
case 2:
// Left/Right above wide
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx, grWiny, grWinw, grWinh / 2, 0.0);
break;
case 3:
// 50/50% Left plus Top/Bottom on Right
grScreens[0]->activate(grWinx, grWiny, grWinw / 2, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2, 0.0);
break;
case 5:
// 50/50% Top/Bottom on Left plus Right
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh, 0.0);
grScreens[2]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2, 0.0);
break;
case 6:
// 66/33% Left plus Top/Bottom on Right
grScreens[0]->activate(grWinx, grWiny, grWinw * 2/3, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw * 2/3, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh / 2, 0.0);
break;
case 7:
// 33/66% Top/Bottom on Left plus Right
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw * 2/3, grWinh, 0.0);
grScreens[2]->activate(grWinx, grWiny, grWinw / 3, grWinh / 2, 0.0);
break;
}
for (i=3; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
case 4:
switch (grNbArrangeScreens) {
case 8:
// 3 side by side + 1 for rear view - only when spanning splits
if (grSpanSplit) {
grScreens[0]->activate(grWinx, grWiny, grWinw / 4, grWinh, grSpanSplit * (-1 + 10));
grScreens[1]->activate(grWinx + grWinw / 4, grWiny, grWinw / 4, grWinh, grSpanSplit * (0.0 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/4, grWiny, grWinw / 4, grWinh, grSpanSplit * (1 + 10));
grScreens[3]->activate(grWinx + grWinw * 3/4, grWiny, grWinw / 4, grWinh, 0.0);
break;
}
default:
grNbArrangeScreens = 0;
case 0:
// Top/Bottom Left/Rigth Quarters
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2, 0.0);
grScreens[3]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2, 0.0);
break;
case 1:
// All side by side
grScreens[0]->activate(grWinx, grWiny, grWinw / 4, grWinh, grSpanSplit * (-1.5 + 10));
grScreens[1]->activate(grWinx + grWinw / 4, grWiny, grWinw / 4, grWinh, grSpanSplit * (-0.5 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/4, grWiny, grWinw / 4, grWinh, grSpanSplit * (0.5 + 10));
grScreens[3]->activate(grWinx + grWinw * 3/4, grWiny, grWinw / 4, grWinh, grSpanSplit * (1.5 + 10));
break;
case 2:
// Left/Middle/Right above wide
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 3, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[3]->activate(grWinx, grWiny, grWinw, grWinh / 2, 0.0);
break;
case 3:
// Left/Middle/Right below wide
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[3]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh / 2, 0.0);
break;
case 4:
// 50/50% Left plus Top/Middle/Bottom on Right
grScreens[0]->activate(grWinx, grWiny, grWinw / 2, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh * 2/3, grWinw / 2, grWinh / 3, 0.0);
grScreens[2]->activate(grWinx + grWinw / 2, grWiny + grWinh / 3, grWinw / 2, grWinh / 3, 0.0);
grScreens[3]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 3, 0.0);
break;
case 5:
// 50/50% Top/Middle/Bottom on Left plus Right
grScreens[0]->activate(grWinx, grWiny + grWinh * 2/3, grWinw / 2, grWinh / 3, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh, 0.0);
grScreens[2]->activate(grWinx, grWiny + grWinh / 3 , grWinw / 2, grWinh / 3, 0.0);
grScreens[3]->activate(grWinx, grWiny, grWinw / 2, grWinh / 3, 0.0);
break;
case 6:
// 66/33% Left plus Top/Middle/Bottom on Right
grScreens[0]->activate(grWinx, grWiny, grWinw * 2/3, grWinh, 0.0);
grScreens[1]->activate(grWinx + grWinw * 2/3, grWiny + grWinh * 2/3, grWinw / 3, grWinh / 3, 0.0);
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny + grWinh / 3, grWinw / 3, grWinh / 3, 0.0);
grScreens[3]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh / 3, 0.0);
break;
case 7:
// 33/66% Top/Middle/Bottom on Left plus Right
grScreens[0]->activate(grWinx, grWiny + grWinh * 2/3, grWinw / 3, grWinh / 3, 0.0);
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw * 2/3, grWinh, 0.0);
grScreens[2]->activate(grWinx, grWiny + grWinh / 3 , grWinw / 3, grWinh / 3, 0.0);
grScreens[3]->activate(grWinx, grWiny, grWinw / 3, grWinh / 3, 0.0);
break;
}
for (i=4; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
case 5:
switch (grNbArrangeScreens) {
default:
grNbArrangeScreens = 0;
case 0:
// Top/Bottom Left/Middle/Rigth Matrix
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 2 , grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[3]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[4]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh / 2, 0.0);
break;
case 1:
// All side by side
grScreens[0]->activate(grWinx, grWiny, grWinw / 5, grWinh, grSpanSplit * (-2.0 + 10));
grScreens[1]->activate(grWinx + grWinw / 5, grWiny, grWinw / 5, grWinh, grSpanSplit * (-1.0 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/5, grWiny, grWinw / 5, grWinh, grSpanSplit * (0.0 + 10));
grScreens[3]->activate(grWinx + grWinw * 3/5, grWiny, grWinw / 5, grWinh, grSpanSplit * (1.0 + 10));
grScreens[4]->activate(grWinx + grWinw * 4/5, grWiny, grWinw / 5, grWinh, grSpanSplit * (2.0 + 10));
break;
}
for (i=5; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
case 6:
switch (grNbArrangeScreens) {
case 2:
if (grSpanSplit) {
// five side by side + 1 for rear view - only when spanning splits
grScreens[0]->activate(grWinx, grWiny, grWinw / 6, grWinh, grSpanSplit * (-2.0 + 10));
grScreens[1]->activate(grWinx + grWinw / 6, grWiny, grWinw / 6, grWinh, grSpanSplit * (-1.0 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (0.0 + 10));
grScreens[3]->activate(grWinx + grWinw * 3/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (1.0 + 10));
grScreens[4]->activate(grWinx + grWinw * 4/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (2.0 + 10));
grScreens[5]->activate(grWinx + grWinw * 5/6, grWiny, grWinw / 6, grWinh, 0.0);
break;
}
default:
grNbArrangeScreens = 0;
case 0:
// Top/Bottom Left/Middle/Rigth Matrix
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[1]->activate(grWinx + grWinw / 3, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0);
grScreens[3]->activate(grWinx, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[4]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh / 2, 0.0);
grScreens[5]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh / 2, 0.0);
break;
case 1:
// All side by side
grScreens[0]->activate(grWinx, grWiny, grWinw / 6, grWinh, grSpanSplit * (-2.5 + 10));
grScreens[1]->activate(grWinx + grWinw / 6, grWiny, grWinw / 6, grWinh, grSpanSplit * (-1.5 + 10));
grScreens[2]->activate(grWinx + grWinw * 2/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (-0.5 + 10));
grScreens[3]->activate(grWinx + grWinw * 3/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (0.5 + 10));
grScreens[4]->activate(grWinx + grWinw * 4/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (1.5 + 10));
grScreens[5]->activate(grWinx + grWinw * 5/6, grWiny, grWinw / 6, grWinh, grSpanSplit * (2.5 + 10));
break;
}
for (i=6; i < GR_NB_MAX_SCREEN; i++)
grScreens[i]->deactivate();
break;
}
}
void SDScreens::changeScreen(long p){
switch (p) {
case GR_NEXT_SCREEN:
nCurrentScreenIndex = (nCurrentScreenIndex + 1) % grNbActiveScreens;
break;
case GR_PREV_SCREEN:
nCurrentScreenIndex = (nCurrentScreenIndex - 1 + grNbActiveScreens) % grNbActiveScreens;
break;
}
GfLogInfo("Changing current screen to #%d (out of %d)\n", nCurrentScreenIndex, grNbActiveScreens);
}
SDScreens::~SDScreens()
{
root.release();
for (int i=0;i< grScreens.size();i++){
delete grScreens[i];
}
//root.release();
//viewer->getSceneData();
//delete viewer->getSceneData();
delete view;
delete viewer;
}

View file

@ -25,16 +25,37 @@
#include <osg/Group>
#include <osgViewer/Viewer>
#include <raceman.h> //tSituation
#include <vector>
#include "OsgView.h"
#define GR_SPLIT_ADD 0
#define GR_SPLIT_REM 1
#define GR_SPLIT_ARR 2
#define GR_NEXT_SCREEN 0
#define GR_PREV_SCREEN 1
#define GR_NB_MAX_SCREEN 6
class SDScreens
{
protected:
osgViewer::Viewer *viewer;
SDView * view;
std::vector<SDView *> grScreens;
osg::ref_ptr<osg::Group> root;
int grWinx;
int grWiny;
int grWinw;
int grWinh;
int grNbActiveScreens;
int grNbArrangeScreens;
bool grSpanSplit;
int nCurrentScreenIndex;
void grAdaptScreenSize();
// int mirrorFlag;
// void loadParams(tSituation *s); // Load from parameters files.
@ -46,8 +67,10 @@ class SDScreens
void Init(int x, int y, int width, int height, osg::ref_ptr<osg::Group> m_sceneroot);
void InitCars(tSituation *s);
void update(tSituation *s,SDFrameInfo* fi);
void splitScreen(long p);
void changeScreen(long p);
inline SDView * getActiveView(){return view;}
inline SDView * getActiveView(){return grScreens[nCurrentScreenIndex];}
// void activate(int x, int y, int w, int h, float v);

View file

@ -40,6 +40,7 @@ SDView::SDView(osg::Camera * c, int x, int y, int width, int height,
this->y =y;
this->width= width;
this->height = height;
viewOffset =0;
cam = c;
mirrorCam = mc;
@ -78,7 +79,6 @@ SDView::SDView(osg::Camera * c, int x, int y, int width, int height,
selectNextFlag=false;
selectPrevFlag=false;
mirrorFlag=false;
}
SDView::~SDView()
@ -175,7 +175,26 @@ void SDView::update(tSituation *s, const SDFrameInfo* frameInfo)
mirror->setModelView();
}
void SDView::activate(int x, int y, int width, int height, float v){
this->x =x;
this->y =y;
this->width= width;
this->height = height;
cameras->getSelectedCamera()->setViewOffset(v);
viewOffset =v;
cam->setViewport(new osg::Viewport(x,y,width,height));
cameras->getSelectedCamera()->setProjection();
cam->setNodeMask(1);
this->de_activateMirror();
}
void SDView::deactivate(){
cam->setNodeMask(0);
mirrorCam->setNodeMask(0);
}
void SDView::de_activateMirror(){
mirror->adaptScreenSize();
if(mirrorFlag){
if(cameras->getSelectedCamera()->getMirrorAllowed()){
this->mirrorCam->setNodeMask(1);

View file

@ -41,6 +41,7 @@ class SDView
int id;
int x, y, width, height;
float viewOffset;
tCarElt *curCar; // Current car viewed.
tCarElt **cars; // List of cars.
@ -51,7 +52,7 @@ class SDView
bool hasChangedMirrorFlag;
SDCameras *cameras;
SDCamera * mirror;
SDCarCamMirror * mirror;
//class cGrPerspCamera *curCam; // The current camera.
//class cGrCarCamMirror *mirrorCam; // The mirror camera.
@ -62,6 +63,7 @@ class SDView
//class cGrBoard *board; // The board.
void loadParams(tSituation *s); // Load from parameters files.
@ -98,6 +100,11 @@ class SDView
inline int getScreenWidth(void) { return width; }
inline int getScreenHeight(void) { return height; }
inline float getViewOffset() {return viewOffset;}
void activate(int x, int y, int width, int height,float v);
void deactivate();
};