Spaces:
Sleeping
Sleeping
int main(/*int argc, char* argv[]*/) | |
{ | |
// Create OpenGL window in single line | |
pangolin::CreateWindowAndBind("Main",640,480); | |
// 3D Mouse handler requires depth testing to be enabled | |
glEnable(GL_DEPTH_TEST); | |
// Define Camera Render Object (for view / scene browsing) | |
pangolin::OpenGlRenderState s_cam( | |
pangolin::ProjectionMatrix(640,480,420,420,320,240,0.1,1000), | |
pangolin::ModelViewLookAt(-0,0.5,-3, 0,0,0, pangolin::AxisY) | |
); | |
// Choose a sensible left UI Panel width based on the width of 20 | |
// charectors from the default font. | |
const int UI_WIDTH = 20* pangolin::default_font().MaxWidth(); | |
// Add named OpenGL viewport to window and provide 3D Handler | |
pangolin::View& d_cam = pangolin::CreateDisplay() | |
.SetBounds(0.0, 1.0, pangolin::Attach::Pix(UI_WIDTH), 1.0, 640.0f/480.0f) | |
.SetHandler(new pangolin::Handler3D(s_cam)); | |
// Add named Panel and bind to variables beginning 'ui' | |
// A Panel is just a View with a default layout and input handling | |
pangolin::CreatePanel("ui") | |
.SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(UI_WIDTH)); | |
// Safe and efficient binding of named variables. | |
// Specialisations mean no conversions take place for exact types | |
// and conversions between scalar types are cheap. | |
pangolin::Var<bool> a_button("ui.A_Button",false,false); | |
pangolin::Var<double> a_double("ui.A_Double",3,0,5); | |
pangolin::Var<int> an_int("ui.An_Int",2,0,5); | |
pangolin::Var<double> a_double_log("ui.Log_scale",3,1,1E4, true); | |
pangolin::Var<bool> a_checkbox("ui.A_Checkbox",false,true); | |
pangolin::Var<int> an_int_no_input("ui.An_Int_No_Input",2); | |
pangolin::Var<std::string> a_string("ui.A_String", "Edit ME!"); | |
// std::function objects can be used for Var's too. These work great with C++11 closures. | |
pangolin::Var<std::function<void(void)>> save_window("ui.Save_Window", [](){ | |
pangolin::SaveWindowOnRender("window"); | |
}); | |
pangolin::Var<std::function<void(void)>> save_cube_view("ui.Save_Cube", [&d_cam](){ | |
pangolin::SaveWindowOnRender("cube", d_cam.v); | |
}); | |
// Demonstration of how we can register a keyboard hook to alter a Var | |
pangolin::RegisterKeyPressCallback(pangolin::PANGO_CTRL + 'b', [&](){ | |
a_double = 3.5; | |
}); | |
// Default hooks for exiting (Esc) and fullscreen (tab). | |
while( !pangolin::ShouldQuit() ) | |
{ | |
// Clear entire screen | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
if( pangolin::Pushed(a_button) ) | |
std::cout << "You Pushed a button!" << std::endl; | |
// Overloading of Var<T> operators allows us to treat them like | |
// their wrapped types, eg: | |
if( a_checkbox ) | |
an_int = (int)a_double; | |
an_int_no_input = an_int; | |
if(d_cam.IsShown()) { | |
// Activate efficiently by object | |
d_cam.Activate(s_cam); | |
// Render some stuff | |
glColor3f(1.0,1.0,1.0); | |
pangolin::glDrawColouredCube(); | |
} | |
// Swap frames and Process Events | |
pangolin::FinishFrame(); | |
} | |
return 0; | |
} | |