From 2b5692498cd5adc576df051232b06a5c933e6070 Mon Sep 17 00:00:00 2001 From: josh Date: Thu, 21 Oct 2010 17:07:00 +0000 Subject: [PATCH] initial commit git-svn-id: svn://anubis/misc/sierpinski-gtk@246 bd8a9e45-a331-0410-811e-c64571078777 --- Makefile | 40 +++++++++++++++++++ SierpinskiDA.cc | 99 +++++++++++++++++++++++++++++++++++++++++++++++ SierpinskiDA.h | 28 ++++++++++++++ sierpinski-gtk.cc | 46 ++++++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 Makefile create mode 100644 SierpinskiDA.cc create mode 100644 SierpinskiDA.h create mode 100644 sierpinski-gtk.cc diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6392901 --- /dev/null +++ b/Makefile @@ -0,0 +1,40 @@ + +SHELL := bash +TARGET := sierpinski-gtk +OBJS := $(patsubst %.cc,%.o,$(wildcard *.cc)) +DEPS := $(OBJS:.o=.dep) + +export GTKMM_VERSION := 2.4 +export GTKGLEXTMM_VERSION := 1.2 + +ifdef WIN32 +export CPPFLAGS += -I"$(shell cd)" +else +export CPPFLAGS += -I"$(shell pwd)" +endif +export CXXFLAGS := -Wall -O2 \ + `pkg-config --cflags gtkmm-$(GTKMM_VERSION)` \ + `pkg-config --cflags gtkglextmm-$(GTKGLEXTMM_VERSION)` +export LDFLAGS := `pkg-config --libs gtkmm-$(GTKMM_VERSION)` \ + `pkg-config --libs gtkglextmm-$(GTKGLEXTMM_VERSION)` + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LDFLAGS) + +%.o: %.cc + $(CXX) -c -o $@ $(CPPFLAGS) $(CXXFLAGS) $< + +# Make dependency files +%.dep: %.cc + @set -e; rm -f $@; \ + $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +clean: + -$(RM) -f *.o *.dep $(TARGET) + +# Include dependency files +-include $(DEPS) diff --git a/SierpinskiDA.cc b/SierpinskiDA.cc new file mode 100644 index 0000000..be95cfe --- /dev/null +++ b/SierpinskiDA.cc @@ -0,0 +1,99 @@ + +#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); +} + +bool SierpinskiDA::draw() +{ + Glib::RefPtr glwindow = get_gl_window(); + if (!glwindow->gl_begin(get_gl_context())) + return false; + + glClearColor(0.1, 0.6, 1.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); + + if (glwindow->is_double_buffered()) + glwindow->swap_buffers(); + else + glFlush(); + + 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(); + + Glib::RefPtr glwindow = get_gl_window(); + glwindow->get_window()->set_cursor(Gdk::Cursor(Gdk::CROSSHAIR)); + + if (!glwindow->gl_begin(get_gl_context())) + return; + + glViewport(0, 0, get_width(), get_height()); + + glwindow->gl_end(); +} + +/* + * called on widget resizes + */ +bool SierpinskiDA::on_configure_event(GdkEventConfigure * event) +{ + Glib::RefPtr glwindow = get_gl_window(); + + if (!glwindow->gl_begin(get_gl_context())) + return false; + + glViewport(0, 0, get_width(), get_height()); + + glwindow->gl_end(); + + return true; +} + +bool SierpinskiDA::on_expose_event(GdkEventExpose * event) +{ + return draw(); +} diff --git a/SierpinskiDA.h b/SierpinskiDA.h new file mode 100644 index 0000000..7bc788f --- /dev/null +++ b/SierpinskiDA.h @@ -0,0 +1,28 @@ + +#ifndef GLWIDGET_H +#define GLWIDGET_H + +#include + +class SierpinskiDA : public Gtk::GL::DrawingArea +{ + public: + SierpinskiDA(const Glib::RefPtr & config); + + protected: + int m_x, m_y; + + virtual bool draw(); + virtual void on_realize(); + virtual bool on_configure_event(GdkEventConfigure * event); + virtual bool on_expose_event(GdkEventExpose * event); + + /* signal handlers */ + virtual bool on_motion_notify_event(GdkEventMotion * event); + virtual bool on_button_press_event(GdkEventButton * event); + virtual bool on_button_release_event(GdkEventButton * event); + virtual bool on_scroll_event(GdkEventScroll * event); +}; + +#endif + diff --git a/sierpinski-gtk.cc b/sierpinski-gtk.cc new file mode 100644 index 0000000..cd946f5 --- /dev/null +++ b/sierpinski-gtk.cc @@ -0,0 +1,46 @@ + +#include + +#include +#include +#include +#include + +#include "SierpinskiDA.h" + +int main(int argc, char * argv[]) +{ + Gtk::Main gtkmain(argc, argv); + Gtk::GL::init(argc, argv); + + Glib::RefPtr glconfig; + glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | + Gdk::GL::MODE_DEPTH | + Gdk::GL::MODE_DOUBLE); + + if (!glconfig) + { + std::cerr << "Could not create double-buffered GL visual" + << "Trying single-buffered visual." << std::endl; + + glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | + Gdk::GL::MODE_DEPTH); + + if (!glconfig) + { + std::cerr << "Cannot create OpenGL context!" << std::endl; + return -1; + } + } + + Gtk::Window mw; + mw.set_default_size(400, 500); + + Gtk::VBox vbox; + SierpinskiDA da(glconfig); + vbox.pack_start(da); + mw.add(vbox); + mw.show_all(); + + Gtk::Main::run(mw); +}