diff options
Diffstat (limited to 'tests/gtk_gl.cc')
-rw-r--r-- | tests/gtk_gl.cc | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/tests/gtk_gl.cc b/tests/gtk_gl.cc new file mode 100644 index 0000000..0423612 --- /dev/null +++ b/tests/gtk_gl.cc @@ -0,0 +1,388 @@ +// -*- C++ -*- +/* + * simple.cc: + * Simple gtkglextmm example. + * + * written by Naofumi Yasufuku <naofumi@users.sourceforge.net> + */ + +#include <iostream> +#include <cstdlib> + +#include <gtkmm.h> + +#include <gtkglmm.h> + +#ifdef G_OS_WIN32 +#define WIN32_LEAN_AND_MEAN 1 +#include <windows.h> +#endif + +#include <GL/gl.h> +#include <GL/glu.h> + + +// +// OpenGL frame buffer configuration utilities. +// + +struct GLConfigUtil +{ + static void print_gl_attrib(const Glib::RefPtr<const Gdk::GL::Config>& glconfig, + const char* attrib_str, + int attrib, + bool is_boolean); + + static void examine_gl_attrib(const Glib::RefPtr<const Gdk::GL::Config>& glconfig); +}; + +// +// Print a configuration attribute. +// +void GLConfigUtil::print_gl_attrib(const Glib::RefPtr<const Gdk::GL::Config>& glconfig, + const char* attrib_str, + int attrib, + bool is_boolean) +{ + int value; + + if (glconfig->get_attrib(attrib, value)) + { + std::cout << attrib_str << " = "; + if (is_boolean) + std::cout << (value == true ? "true" : "false") << std::endl; + else + std::cout << value << std::endl; + } + else + { + std::cout << "*** Cannot get " + << attrib_str + << " attribute value\n"; + } +} + +// +// Print configuration attributes. +// +void GLConfigUtil::examine_gl_attrib(const Glib::RefPtr<const Gdk::GL::Config>& glconfig) +{ + std::cout << "\nOpenGL visual configurations :\n\n"; + + std::cout << "glconfig->is_rgba() = " + << (glconfig->is_rgba() ? "true" : "false") + << std::endl; + std::cout << "glconfig->is_double_buffered() = " + << (glconfig->is_double_buffered() ? "true" : "false") + << std::endl; + std::cout << "glconfig->is_stereo() = " + << (glconfig->is_stereo() ? "true" : "false") + << std::endl; + std::cout << "glconfig->has_alpha() = " + << (glconfig->has_alpha() ? "true" : "false") + << std::endl; + std::cout << "glconfig->has_depth_buffer() = " + << (glconfig->has_depth_buffer() ? "true" : "false") + << std::endl; + std::cout << "glconfig->has_stencil_buffer() = " + << (glconfig->has_stencil_buffer() ? "true" : "false") + << std::endl; + std::cout << "glconfig->has_accum_buffer() = " + << (glconfig->has_accum_buffer() ? "true" : "false") + << std::endl; + + std::cout << std::endl; + + print_gl_attrib(glconfig, "Gdk::GL::USE_GL", Gdk::GL::USE_GL, true); + print_gl_attrib(glconfig, "Gdk::GL::BUFFER_SIZE", Gdk::GL::BUFFER_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::LEVEL", Gdk::GL::LEVEL, false); + print_gl_attrib(glconfig, "Gdk::GL::RGBA", Gdk::GL::RGBA, true); + print_gl_attrib(glconfig, "Gdk::GL::DOUBLEBUFFER", Gdk::GL::DOUBLEBUFFER, true); + print_gl_attrib(glconfig, "Gdk::GL::STEREO", Gdk::GL::STEREO, true); + print_gl_attrib(glconfig, "Gdk::GL::AUX_BUFFERS", Gdk::GL::AUX_BUFFERS, false); + print_gl_attrib(glconfig, "Gdk::GL::RED_SIZE", Gdk::GL::RED_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::GREEN_SIZE", Gdk::GL::GREEN_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::BLUE_SIZE", Gdk::GL::BLUE_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::ALPHA_SIZE", Gdk::GL::ALPHA_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::DEPTH_SIZE", Gdk::GL::DEPTH_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::STENCIL_SIZE", Gdk::GL::STENCIL_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::ACCUM_RED_SIZE", Gdk::GL::ACCUM_RED_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::ACCUM_GREEN_SIZE", Gdk::GL::ACCUM_GREEN_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::ACCUM_BLUE_SIZE", Gdk::GL::ACCUM_BLUE_SIZE, false); + print_gl_attrib(glconfig, "Gdk::GL::ACCUM_ALPHA_SIZE", Gdk::GL::ACCUM_ALPHA_SIZE, false); + + std::cout << std::endl; +} + + +// +// Simple OpenGL scene. +// + +class SimpleGLScene : public Gtk::DrawingArea, + public Gtk::GL::Widget<SimpleGLScene> +{ + public: + SimpleGLScene(); + virtual ~SimpleGLScene(); + + protected: + virtual void on_realize(); + virtual bool on_configure_event(GdkEventConfigure* event); + virtual bool on_expose_event(GdkEventExpose* event); + +}; + +SimpleGLScene::SimpleGLScene() +{ + // + // Configure OpenGL-capable visual. + // + + Glib::RefPtr<Gdk::GL::Config> glconfig; + + // Try double-buffered visual + glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | + Gdk::GL::MODE_DEPTH | + Gdk::GL::MODE_DOUBLE); + if (!glconfig) + { + std::cerr << "*** Cannot find the double-buffered visual.\n" + << "*** Trying single-buffered visual.\n"; + + // Try single-buffered visual + glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | + Gdk::GL::MODE_DEPTH); + if (!glconfig) + { + std::cerr << "*** Cannot find any OpenGL-capable visual.\n"; + std::exit(1); + } + } + + // print frame buffer attributes. + GLConfigUtil::examine_gl_attrib(glconfig); + + // + // Set OpenGL-capability to the widget. + // + + set_gl_capability(glconfig); +} + +SimpleGLScene::~SimpleGLScene() +{ +} + +void SimpleGLScene::on_realize() +{ + // We need to call the base on_realize() + Gtk::DrawingArea::on_realize(); + + // + // Get GL::Window. + // + + Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); + + // + // GL calls. + // + + // *** OpenGL BEGIN *** + if (!glwindow->gl_begin(get_gl_context())) + return; + + GLUquadricObj* qobj = gluNewQuadric(); + gluQuadricDrawStyle(qobj, GLU_FILL); + glNewList(1, GL_COMPILE); + gluSphere(qobj, 1.0, 20, 20); + glEndList(); + + static GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; + static GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClearDepth(1.0); + + glViewport(0, 0, get_width(), get_height()); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(40.0, 1.0, 1.0, 10.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(0.0, 0.0, 3.0, + 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0); + glTranslatef(0.0, 0.0, -3.0); + + glwindow->gl_end(); + // *** OpenGL END *** +} + +bool SimpleGLScene::on_configure_event(GdkEventConfigure* event) +{ + // + // Get GL::Window. + // + + Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); + + // + // GL calls. + // + + // *** OpenGL BEGIN *** + if (!glwindow->gl_begin(get_gl_context())) + return false; + + glViewport(0, 0, get_width(), get_height()); + + glwindow->gl_end(); + // *** OpenGL END *** + + return true; +} + +bool SimpleGLScene::on_expose_event(GdkEventExpose* event) +{ + // + // Get GL::Window. + // + + Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); + + // + // GL calls. + // + + // *** OpenGL BEGIN *** + if (!glwindow->gl_begin(get_gl_context())) + return false; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glCallList(1); + + // Swap buffers. + if (glwindow->is_double_buffered()) + glwindow->swap_buffers(); + else + glFlush(); + + glwindow->gl_end(); + // *** OpenGL END *** + + return true; +} + + +// +// The application class. +// + +class Simple : public Gtk::Window +{ + public: + Simple(); + virtual ~Simple(); + + protected: + // signal handlers: + void on_button_quit_clicked(); + + protected: + // member widgets: + Gtk::VBox m_VBox; + SimpleGLScene m_SimpleGLScene; + Gtk::Button m_ButtonQuit; +}; + +Simple::Simple() + : m_VBox(false, 0), m_ButtonQuit("Quit") +{ + // + // Top-level window. + // + + set_title("Simple"); + + // Get automatically redrawn if any of their children changed allocation. + set_reallocate_redraws(true); + + add(m_VBox); + + // + // Simple OpenGL scene. + // + + m_SimpleGLScene.set_size_request(200, 200); + + m_VBox.pack_start(m_SimpleGLScene); + + // + // Simple quit button. + // + + m_ButtonQuit.signal_clicked().connect( + sigc::mem_fun(*this, &Simple::on_button_quit_clicked)); + + m_VBox.pack_start(m_ButtonQuit, Gtk::PACK_SHRINK, 0); + + // + // Show window. + // + + show_all(); +} + +Simple::~Simple() +{} + +void Simple::on_button_quit_clicked() +{ + Gtk::Main::quit(); +} + + +// +// Main. +// + +int main(int argc, char** argv) +{ + Gtk::Main kit(argc, argv); + + // + // Init gtkglextmm. + // + + Gtk::GL::init(argc, argv); + + // + // Query OpenGL extension version. + // + + int major, minor; + Gdk::GL::query_version(major, minor); + std::cout << "OpenGL extension version - " + << major << "." << minor << std::endl; + + // + // Instantiate and run the application. + // + + Simple simple; + + kit.run(simple); + + return 0; +} + |