Code formatting.
[familia.git] / src / ui / drawing_area.c
index ee915e941ac47f683f9139c146f3b40375d8c562..06ba5e51399375b89bef3035827d1cba31047536 100644 (file)
@@ -2,9 +2,11 @@
 #include <gtk/gtkgl.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
+#include <assert.h>
 
 #include "../debug.h"
 #include "drawing_area.h"
+#include "../math/3d.h"
 #include "../graphics/constants.h"
 #include "../graphics/individual.h"
 #include "../graphics/family.h"
@@ -26,6 +28,8 @@ gboolean drawing_area_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
        unsigned int i;
        unsigned int individuals_no;
        unsigned int families_no;
+       struct familia_storage * storage;
+       struct position * pos;
 
        /*** OpenGL BEGIN ***/
        if (!gtk_widget_begin_gl (widget)) {
@@ -38,17 +42,29 @@ gboolean drawing_area_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
 
        gluLookAt (camera_pos_x, camera_pos_y, camera_pos_z, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);
 
-       individuals_no = familia_storage_get_current()->individuals_no;
+       storage = familia_storage_get_current();
+       individuals_no = storage->individuals_no;
 
        for (i = 0; i < individuals_no; i++) {
+               pos = calculate_individual_position(storage->individuals[i]);
+
        glPushMatrix ();
-               glTranslatef(i * (GR_IND_RADIUS + 1), 0, -10);
+               glTranslatef(
+                       (pos != NULL) ? pos->x : 0,
+                       (pos != NULL) ? pos->y : 0,
+                       (pos != NULL) ? pos->z : -10
+               );
                glColor3f (1.0, 1.0, 1.0);
                graphics_render_individual();
        glPopMatrix ();
+
+               if (pos != NULL) {
+                       free(pos);
+                       pos = NULL;
+               }
        }
 
-       families_no = familia_storage_get_current()->families_no;
+       families_no = storage->families_no;
 
        for (i = 0; i < families_no; i++) {
        glPushMatrix ();
@@ -133,3 +149,24 @@ void drawing_area_unrealize (GtkWidget *widget, gpointer data)
 {
        /* Code */
 }
+
+/**
+ * The "scroll-event" signal handler. Responsible for correctly scrolling
+ * drawing area.
+ */
+void drawing_area_event_scroll (GtkWidget *widget,
+                               GdkEventScroll *event, gpointer user_data)
+{
+       assert(event->type == GDK_SCROLL);
+
+       switch(event->direction) {
+               case GDK_SCROLL_UP:
+                       camera_pos_y++;
+                       gtk_widget_queue_draw(widget);
+                       break;
+               case GDK_SCROLL_DOWN:
+                       camera_pos_y--;
+                       gtk_widget_queue_draw(widget);
+                       break;
+       }
+}