126 lines
2.3 KiB
C++
126 lines
2.3 KiB
C++
|
|
#include <GL/gl.h>
|
|
#include <GL/glu.h>
|
|
|
|
#include <gdkmm/cursor.h>
|
|
|
|
#include "SierpinskiDA.h"
|
|
|
|
SierpinskiDA::SierpinskiDA(const Glib::RefPtr<const Gdk::GL::Config> & 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<Gdk::GL::Window> glwindow = get_gl_window();
|
|
return glwindow->gl_begin(get_gl_context());
|
|
}
|
|
|
|
void SierpinskiDA::gl_end()
|
|
{
|
|
Glib::RefPtr<Gdk::GL::Window> 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();
|
|
}
|