diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index 6e40adce4eb487dd36d48335571948a50b2e47b8..2d43b17d006039058ac4abce80f4d2d975131242 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -188,5 +188,7 @@ void export_Scene() .add_property("root_node", &Scene::GetRootNode) .def("SetBeaconOff",&Scene::SetBeaconOff) .def("__getitem__",scene_getitem) + .add_property("show_center",&Scene::GetShowCenter, &Scene::SetShowCenter) + .add_property("fix_center",&Scene::GetFixCenter, &Scene::SetFixCenter) ; } diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 19ab68e6172fd38155170317c895efcaef22285f..38e57d30e1fb152edcabcac77ecebe1c20e6286e 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -109,7 +109,8 @@ Scene::Scene(): light_amb_(0.1,0.1,0.1), light_diff_(0.9,0.9,0.9), light_spec_(0.5,0.5,0.5), - axis_flag_(false), + cor_flag_(false), + fix_cor_flag_(true), fog_flag_(true), fog_color_(0.0,0.0,0.0,0.0), auto_autoslab_(true), @@ -973,10 +974,18 @@ void Scene::OnInput(const InputEvent& e) gluUnProject(wx+2.0,wy+2.0,wz,mm,pm,vp,&ox,&oy,&oz); Vec2 fxy = Vec2(ox,oy); - if(e.GetCommand()==INPUT_COMMAND_TRANSX) { - transform_.ApplyXAxisTranslation(e.GetDelta()*fxy[0]); + if(fix_cor_flag_) { + if(e.GetCommand()==INPUT_COMMAND_TRANSX) { + transform_.SetCenter(transform_.GetCenter()+Transpose(transform_.GetRot())*Vec3(-fxy[0]*e.GetDelta(),0.0,0.0)); + } else { + transform_.SetCenter(transform_.GetCenter()+Transpose(transform_.GetRot())*Vec3(0.0,-fxy[1]*e.GetDelta(),0.0)); + } } else { - transform_.ApplyYAxisTranslation(e.GetDelta()*fxy[1]); + if(e.GetCommand()==INPUT_COMMAND_TRANSX) { + transform_.ApplyXAxisTranslation(e.GetDelta()*fxy[0]); + } else { + transform_.ApplyYAxisTranslation(e.GetDelta()*fxy[1]); + } } } else if(e.GetCommand()==INPUT_COMMAND_TRANSZ) { float currz=transform_.GetTrans()[2]; @@ -1766,6 +1775,12 @@ void Scene::SetTestMode(bool f) } } +void Scene::SetShowCenter(bool f) +{ + cor_flag_=f; + RequestRedraw(); +} + void Scene::prep_glyphs() { glGenTextures(1,&glyph_tex_id_); @@ -1826,6 +1841,32 @@ void Scene::render_scene() impl::SceneFX::Instance().Preprocess(); #endif + if(cor_flag_) { + geom::Vec3 cen=transform_.GetCenter(); + glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_LINE_BIT | GL_CURRENT_BIT); +#if OST_SHADER_SUPPORT_ENABLED + Shader::Instance().PushProgram(); + Shader::Instance().Activate(""); +#endif + glLineWidth(1.5); + glDisable(GL_LIGHTING); + glDisable(GL_COLOR_MATERIAL); + + glBegin(GL_LINES); + glColor3f(0.5,0.5,0.5); + glVertex3f(cen[0]-1.0,cen[1],cen[2]); + glVertex3f(cen[0]+1.0,cen[1],cen[2]); + glVertex3f(cen[0],cen[1]-1.0,cen[2]); + glVertex3f(cen[0],cen[1]+1.0,cen[2]); + glVertex3f(cen[0],cen[1],cen[2]-1.0); + glVertex3f(cen[0],cen[1],cen[2]+1.0); + glEnd(); + glPopAttrib(); +#if OST_SHADER_SUPPORT_ENABLED + Shader::Instance().PopProgram(); +#endif + } + root_node_->RenderGL(STANDARD_RENDER_PASS); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index 63d9909bcb7e44e490010e500d3e791031b7eb75..0d40e1bc64b865738c48bbe95f6b7ae0213c4074 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -414,6 +414,17 @@ class DLLEXPORT_OST_GFX Scene { /// \brief stops offline rendering in interactive mode void StopOffscreenMode(); + /// \brief show center of rotation of true + void SetShowCenter(bool f); + + bool GetShowCenter() const {return cor_flag_;} + + /// \brief if true fix center of rotation upon input induced shift + void SetFixCenter(bool f) {fix_cor_flag_=f;} + + /// \brief return flag + bool GetFixCenter() const {return fix_cor_flag_;} + /// experimental feature void SetBlur(uint n); /// experimental feature @@ -477,7 +488,8 @@ private: Color light_diff_; Color light_spec_; - bool axis_flag_; + bool cor_flag_; + bool fix_cor_flag_; bool fog_flag_; Color fog_color_; bool auto_autoslab_;