diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index 59098ea93c962890101edd9598b2618e9fb9aba0..89a5738cee543684eaf5d0d51cafd2913a7eaa26 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -135,6 +135,8 @@ void export_Scene() .add_property("bg", &Scene::GetBackground, scene_set_bg1) + .add_property("bg_stereo_mode",&Scene::GetBackgroundStereoMode,&Scene::SetBackgroundStereoMode) + .add_property("bg_stereo_offset",&Scene::GetBackgroundStereoOffset,&Scene::SetBackgroundStereoOffset) .def("GetProjection",&Scene::GetProjection) .add_property("projection",&Scene::GetProjection) .def("GetInvertedProjection",&Scene::GetInvertedProjection) diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 57faf873cc5ca163c9ccb1ded63c6a0be1c55c6b..ad80008a5b631d769381f24a3f3e329947824666 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -138,6 +138,8 @@ Scene::Scene(): scene_right_tex_(), bg_mode_(0), update_bg_(false), + bg_stereo_mode_(false), + bg_stereo_offset_(20.0), bg_grad_(), bg_bm_(), bg_tex_(), @@ -649,6 +651,20 @@ void Scene::SetBackground(const Bitmap& bm) RequestRedraw(); } +void Scene::SetBackgroundStereoMode(bool m) +{ + if(bg_stereo_mode_==m) return; + bg_stereo_mode_=m; + RequestRedraw(); +} + +void Scene::SetBackgroundStereoOffset(float o) +{ + if(bg_stereo_offset_==o) return; + bg_stereo_offset_=o; + RequestRedraw(); +} + Color Scene::GetBackground() const { return background_; @@ -2075,6 +2091,26 @@ namespace { glEnd(); } + void DrawStereoTex(GLuint tex_id, int w, int h, float x_offset) { + glEnable(GL_TEXTURE_2D); +#if OST_SHADER_SUPPORT_ENABLED + if(OST_GL_VERSION_2_0) { + glActiveTexture(GL_TEXTURE0); + } +#endif + glBindTexture(GL_TEXTURE_2D, tex_id); + glColor3f(0.0,0.0,0.0); + glBegin(GL_QUADS); + float fracw = 0.5*static_cast<float>(vp_width_)/static_cast<float>(w); + float frach = 0.5*static_cast<float>(vp_height_)/static_cast<float>(h); + float xo = -x_offset/static_cast<float>(vp_width_); + glTexCoord2f(-fracw+xo,-frach); glVertex3i(0,0,1); + glTexCoord2f(-fracw+xo,frach); glVertex3i(0,vp_height_,1); + glTexCoord2f(fracw+xo,frach); glVertex3i(vp_width_,vp_height_,1); + glTexCoord2f(fracw+xo,-frach); glVertex3i(vp_width_,0,1); + glEnd(); + } + ~ViewportRenderer() { glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); @@ -2094,7 +2130,20 @@ namespace { #endif } }; -} + + double unproj_x() { + GLdouble gl_mmat[]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; + GLdouble gl_pmat[16]; + glGetDoublev(GL_PROJECTION_MATRIX,gl_pmat); + GLint gl_vp[]={0,0,1,1}; + + double res[3]; + gluUnProject(0.5,0.5,1.0, + gl_mmat,gl_pmat,gl_vp, + &res[0],&res[1],&res[2]); + return res[0]; + } +} // anon ns void Scene::render_bg() { @@ -2106,9 +2155,16 @@ void Scene::render_bg() update_bg_=false; } + //double zfar_x_offset=unproj_x(); + float zfar_x_offset=static_cast<float>(stereo_eye_)*bg_stereo_offset_; { + // this goes to orthogonal display mode ViewportRenderer vpr(vp_width_,vp_height_); - vpr.DrawTex(bg_tex_); + if(bg_stereo_mode_) { + vpr.DrawStereoTex(bg_tex_,bg_bm_.width,bg_bm_.height, zfar_x_offset); + } else { + vpr.DrawTex(bg_tex_); + } // dtor takes care of the rest } diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index 4b9483666a18a62929e87b0c3bf3213f4b702a66..0980ce561c69b1d31097458d6cb40ff6c2a91868 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -350,6 +350,15 @@ class DLLEXPORT_OST_GFX Scene { /// \brief get background color Color GetBackground() const; + /// \brief use bg bitmap for stereo mode + /// this tiles the background bitmap at the far plane + void SetBackgroundStereoMode(bool); + bool GetBackgroundStereoMode() const {return bg_stereo_mode_;} + + /// background tile left/right offset + void SetBackgroundStereoOffset(float); + float GetBackgroundStereoOffset() const {return bg_stereo_offset_;} + /// \brief center rotation on the given point void SetCenter(const geom::Vec3& cen); @@ -594,12 +603,14 @@ private: unsigned int stereo_mode_; unsigned int stereo_alg_; bool stereo_inverted_; - unsigned int stereo_eye_; + int stereo_eye_; Real stereo_iod_,stereo_distance_; unsigned int scene_left_tex_; unsigned int scene_right_tex_; unsigned int bg_mode_; bool update_bg_; + bool bg_stereo_mode_; + float bg_stereo_offset_; Gradient bg_grad_; Bitmap bg_bm_; unsigned int bg_tex_;