diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index 706767f8b2bfabffd6827e06c4aada663d986dc3..480b530a65b5a10bcc7698846c54444e4aff8b24 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -147,6 +147,9 @@ void export_Scene() .def("SetStereoIOD",&Scene::SetStereoIOD) .def("GetStereoIOD",&Scene::GetStereoIOD) .add_property("stereo_iod",&Scene::GetStereoIOD,&Scene::SetStereoIOD) + .def("SetStereoDistance",&Scene::SetStereoDistance) + .def("GetStereoDistance",&Scene::GetStereoDistance) + .add_property("stereo_distance",&Scene::GetStereoDistance,&Scene::SetStereoDistance) .def("SetStereoAlg",&Scene::SetStereoAlg) .def("GetStereoAlg",&Scene::GetStereoAlg) .add_property("stereo_alg",&Scene::GetStereoAlg,&Scene::SetStereoAlg) diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 1574d5f509b871524a7b6e76674f18561316a059..eb9ffe8401cad5560b59e4d34e3ed330d18b4ec7 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -127,7 +127,8 @@ Scene::Scene(): stereo_alg_(0), stereo_inverted_(false), stereo_eye_(0), - stereo_eye_dist_(40.0), + stereo_iod_(40.0), + stereo_distance_(100.0), scene_left_tex_(), scene_right_tex_() { @@ -1311,19 +1312,23 @@ void Scene::SetStereoView(int m) void Scene::SetStereoIOD(float d) { - stereo_eye_dist_=d; + stereo_iod_=d; if(stereo_mode_>0) { RequestRedraw(); } } -void Scene::SetStereoAlg(unsigned int a) +void Scene::SetStereoDistance(float d) { - if(a==0 || a==1) { - stereo_alg_=a; - } else { - stereo_alg_=0; + stereo_distance_=d; + if(stereo_mode_>0) { + RequestRedraw(); } +} + +void Scene::SetStereoAlg(unsigned int a) +{ + stereo_alg_=a; if(stereo_mode_>0) { RequestRedraw(); } @@ -1833,12 +1838,15 @@ void Scene::stereo_projection(int view) if(view!=0) { Real ff=(view<0 ? 1.0 : -1.0); - Real dist=-transform_.GetTrans()[2]; - if(stereo_alg_==1) { + if(stereo_alg_==2 || stereo_alg_==3 || stereo_alg_==4) { // physically precise stereo with skew, does // not handle z translation well // the 100.0 comes from visual matching with mode 0 at a reasonable distance - Real iod2=100.0/stereo_eye_dist_; + Real dist = -transform_.GetTrans()[2]; + if(stereo_alg_==3) dist=znear_; + else if(stereo_alg_==4) dist=stereo_distance_; + + Real iod2=100.0/stereo_iod_; geom::Mat4 skew=geom::Transpose(geom::Mat4(1.0,0.0,ff*iod2/dist,ff*iod2, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, @@ -1846,8 +1854,9 @@ void Scene::stereo_projection(int view) glMultMatrix(skew.Data()); } else { // default, dino style stereo, less physically precise but visually more pleasing + Real dist = stereo_alg_==1 ? znear_ : -transform_.GetTrans()[2]; glTranslated(0.0,0.0,-dist); - glRotated(180.0/M_PI*atan(ff/stereo_eye_dist_),0.0,1.0,0.0); + glRotated(180.0/M_PI*atan(ff/stereo_iod_),0.0,1.0,0.0); glTranslated(0.0,0.0,dist); } } diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index 5a93998485fbbe8428074f71149e2e4bbc349445..d07ac83607c59e50aa51e75edda28db3f1b0afe6 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -200,7 +200,12 @@ class DLLEXPORT_OST_GFX Scene { /// \brief set stereo eye distance void SetStereoIOD(float); /// \brief return current stereo eye distance - float GetStereoIOD() const {return stereo_eye_dist_;} + float GetStereoIOD() const {return stereo_distance_;} + + /// \brief set stereo distance + void SetStereoDistance(float); + /// \brief return current stereo distance + float GetStereoDistance() const {return stereo_distance_;} /// \brief set stereo algorithm /// one of 0 or 1 @@ -474,7 +479,7 @@ private: unsigned int stereo_alg_; bool stereo_inverted_; unsigned int stereo_eye_; - float stereo_eye_dist_; + float stereo_iod_,stereo_distance_; unsigned int scene_left_tex_; unsigned int scene_right_tex_;