#include <gtk/gtkgl.h>
#include <GL/gl.h>
#include <GL/glu.h>
+#include <assert.h>
#include "../debug.h"
+#include "../familia.h"
#include "drawing_area.h"
+#include "../math/3d.h"
#include "../graphics/constants.h"
#include "../graphics/individual.h"
#include "../graphics/family.h"
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)) {
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 ();
{
/* Code */
}
+
+/**
+ * The "scroll-event" signal handler. Responsible for correctly scrolling
+ * drawing area using mouse or touchpad.
+ */
+void drawing_area_event_scroll (GtkWidget *widget,
+ GdkEventScroll *event, FamiliaData *data)
+{
+ GtkAdjustment *adjustment = NULL;
+ gdouble value = 0;
+ gdouble step = 0;
+
+ assert(event->type == GDK_SCROLL);
+
+ switch(event->direction) {
+ case GDK_SCROLL_UP:
+ adjustment = data->vadjustment;
+ step = 1;
+ break;
+ case GDK_SCROLL_DOWN:
+ adjustment = data->vadjustment;
+ step = -1;
+ break;
+ case GDK_SCROLL_LEFT:
+ adjustment = data->hadjustment;
+ step = -1;
+ break;
+ case GDK_SCROLL_RIGHT:
+ adjustment = data->hadjustment;
+ step = 1;
+ break;
+ }
+
+ if (adjustment != NULL) {
+ value = gtk_adjustment_get_value (adjustment);
+ step = step * gtk_adjustment_get_step_increment(adjustment);
+ value += step;
+
+ gtk_adjustment_set_value (adjustment, value);
+ gtk_adjustment_value_changed (adjustment);
+ }
+}