#include #include #include #include "SierpinskiDA.h" SierpinskiDA::SierpinskiDA(const Glib::RefPtr & config) : Gtk::GL::DrawingArea(config) { set_gl_capability(config); set_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); } void SierpinskiDA::regenerate(int npts) { gl_begin(); glNewList(m_dl, GL_COMPILE); glBegin(GL_QUADS); glVertex3f(1, 0, 1); glVertex3f(-1, 0, 1); glVertex3f(-1, 0, -1); glVertex3f(1, 0, -1); glEnd(); glEndList(); gl_end(); } bool SierpinskiDA::gl_begin() { Glib::RefPtr glwindow = get_gl_window(); return glwindow->gl_begin(get_gl_context()); } void SierpinskiDA::gl_end() { Glib::RefPtr glwindow = get_gl_window(); glwindow->gl_end(); } bool SierpinskiDA::draw() { if (!gl_begin()) return false; glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -2, 0, 0, 0, 0, 0, 0, 1); glCallList(m_dl); if (get_gl_window()->is_double_buffered()) get_gl_window()->swap_buffers(); else glFlush(); gl_end(); return true; } bool SierpinskiDA::on_motion_notify_event(GdkEventMotion * event) { get_pointer(m_x, m_y); return true; } bool SierpinskiDA::on_button_press_event(GdkEventButton * event) { return false; } bool SierpinskiDA::on_button_release_event(GdkEventButton * event) { return false; } bool SierpinskiDA::on_scroll_event(GdkEventScroll * event) { return false; } void SierpinskiDA::on_realize() { Gtk::GL::DrawingArea::on_realize(); if (gl_begin()) return; glViewport(0, 0, get_width(), get_height()); m_dl = glGenLists(1); gl_end(); regenerate(10); } /* * called on widget resizes */ bool SierpinskiDA::on_configure_event(GdkEventConfigure * event) { if (gl_begin()) return false; glViewport(0, 0, get_width(), get_height()); gl_end(); return true; } bool SierpinskiDA::on_expose_event(GdkEventExpose * event) { return draw(); }