]> Pileus Git - grits/commitdiff
adding initial ridge overlay code, swiching from cubes to teapots, and a few other...
authorAndy Spencer <andy753421@gmail.com>
Mon, 4 May 2009 11:37:30 +0000 (11:37 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 4 May 2009 11:37:30 +0000 (11:37 +0000)
src/Makefile.am
src/aweather.c
src/cube.c [deleted file]
src/cube.h [deleted file]
src/example.c [new file with mode: 0644]
src/example.h [new file with mode: 0644]
src/opengl.c
src/radar.c
src/ridge.c [new file with mode: 0644]
src/ridge.h [new file with mode: 0644]

index 4bbe43a7c5da267488caf33d32aa781700481fdb..46a3cda65f2d9648753c80cbb6e838dad5415e07 100644 (file)
@@ -1,9 +1,9 @@
 AM_CPPFLAGS  = $(GTK_CFLAGS) -I/usr/local/trmm/GVBOX/include/
-AM_CFLAGS    = -Wall -Werror --std=gnu99
+AM_CFLAGS    = -O3 -Wall -Werror --std=gnu99
 
 bin_PROGRAMS = aweather
 
-aweather_SOURCES  = aweather.c opengl.c cube.c radar.c 
+aweather_SOURCES  = aweather.c opengl.c radar.c ridge.c example.c 
 aweather_LDADD    = $(GTK_LIBS) -L/usr/local/trmm/GVBOX/lib/ -lrsl
 
 test: all
index 35eede0f9805ff1b1260c51b186ebc78d8961e68..22479bf2866d800232ed639f1e5c41af40f5b3b9 100644 (file)
@@ -5,7 +5,8 @@
 
 #include "opengl.h"
 #include "radar.h"
-#include "cube.h"
+#include "ridge.h"
+#include "example.h"
 
 static void destroy(GtkWidget *widget, gpointer data)
 {
@@ -71,9 +72,10 @@ int main(int argc, char *argv[])
        //gtk_notebook_append_page(GTK_NOTEBOOK(tab_area), contents, label);
 
        /* Load plugins */
-       opengl_init(GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
-       radar_init (GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
-       cube_init  (GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
+       opengl_init (GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
+       ridge_init  (GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
+       radar_init  (GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
+       example_init(GTK_DRAWING_AREA(drawing), GTK_NOTEBOOK(tab_area));
 
        gtk_widget_show_all(window);
        gtk_main();
diff --git a/src/cube.c b/src/cube.c
deleted file mode 100644 (file)
index 8592545..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-#include <config.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkgl.h>
-#include <gdk/gdkkeysyms.h>
-#include <GL/gl.h>
-#include <math.h>
-
-static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data);
-static gboolean rotate(gpointer user_data);
-
-static GtkWidget *rotate_button;
-
-float boxv[][3] = {
-       { -0.5, -0.5, -0.5 },
-       {  0.5, -0.5, -0.5 },
-       {  0.5,  0.5, -0.5 },
-       { -0.5,  0.5, -0.5 },
-       { -0.5, -0.5,  0.5 },
-       {  0.5, -0.5,  0.5 },
-       {  0.5,  0.5,  0.5 },
-       { -0.5,  0.5,  0.5 }
-};
-#define ALPHA 0.5
-
-static float ang = 30.;
-
-static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
-{
-       //GdkGLContext  *glcontext  = gtk_widget_get_gl_context (da);
-       //GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
-
-       /* draw in here */
-       glPushMatrix();
-       
-       glRotatef (ang, 1, 0, 1);
-
-       glShadeModel(GL_FLAT);
-
-       glBegin (GL_LINES);
-       glColor3f (1., 0., 0.);
-       glVertex3f (0., 0., 0.);
-       glVertex3f (1., 0., 0.);
-       glEnd ();
-       
-       glBegin (GL_LINES);
-       glColor3f (0., 1., 0.);
-       glVertex3f (0., 0., 0.);
-       glVertex3f (0., 1., 0.);
-       glEnd ();
-       
-       glBegin (GL_LINES);
-       glColor3f (0., 0., 1.);
-       glVertex3f (0., 0., 0.);
-       glVertex3f (0., 0., 1.);
-       glEnd ();
-
-       glBegin(GL_LINES);
-       glColor3f (1., 1., 1.);
-       glVertex3fv(boxv[0]);
-       glVertex3fv(boxv[1]);
-       
-       glVertex3fv(boxv[1]);
-       glVertex3fv(boxv[2]);
-       
-       glVertex3fv(boxv[2]);
-       glVertex3fv(boxv[3]);
-       
-       glVertex3fv(boxv[3]);
-       glVertex3fv(boxv[0]);
-       
-       glVertex3fv(boxv[4]);
-       glVertex3fv(boxv[5]);
-       
-       glVertex3fv(boxv[5]);
-       glVertex3fv(boxv[6]);
-       
-       glVertex3fv(boxv[6]);
-       glVertex3fv(boxv[7]);
-       
-       glVertex3fv(boxv[7]);
-       glVertex3fv(boxv[4]);
-       
-       glVertex3fv(boxv[0]);
-       glVertex3fv(boxv[4]);
-       
-       glVertex3fv(boxv[1]);
-       glVertex3fv(boxv[5]);
-       
-       glVertex3fv(boxv[2]);
-       glVertex3fv(boxv[6]);
-       
-       glVertex3fv(boxv[3]);
-       glVertex3fv(boxv[7]);
-       glEnd();
-
-       glPopMatrix ();
-
-       return FALSE;
-}
-
-static gboolean rotate(gpointer user_data)
-{
-       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rotate_button)))
-               return TRUE;
-
-       GtkWidget *da = GTK_WIDGET (user_data);
-
-       ang++;
-
-       gdk_window_invalidate_rect(da->window, &da->allocation, FALSE);
-       gdk_window_process_updates(da->window, FALSE);
-
-       return TRUE;
-}
-
-gboolean cube_init(GtkDrawingArea *drawing, GtkNotebook *config)
-{
-       /* Add configuration tab */
-       GtkWidget *label = gtk_label_new("Cube");
-       rotate_button = gtk_toggle_button_new_with_label("Rotate");
-       gtk_notebook_append_page(GTK_NOTEBOOK(config), rotate_button, label);
-
-       /* Set up OpenGL Stuff */
-       g_signal_connect(drawing, "expose-event", G_CALLBACK(expose), NULL);
-       g_timeout_add(1000/60, rotate, drawing);
-       return TRUE;
-}
diff --git a/src/cube.h b/src/cube.h
deleted file mode 100644 (file)
index d1b641d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef CUBE_H
-#define CUBE_H
-
-gboolean cube_init(GtkDrawingArea *drawing, GtkNotebook *config);
-
-#endif
diff --git a/src/example.c b/src/example.c
new file mode 100644 (file)
index 0000000..a53d62e
--- /dev/null
@@ -0,0 +1,69 @@
+#include <config.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkgl.h>
+#include <gdk/gdkkeysyms.h>
+#include <GL/gl.h>
+#include <math.h>
+
+static GtkWidget *rotate_button;
+
+static float ang = 30.;
+
+static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
+{
+       glPushMatrix();
+       glLoadIdentity();
+       glTranslatef(0.5, -0.5, 0);
+
+       float light_ambient[]  = {0.1f, 0.1f, 0.0f};
+       float light_diffuse[]  = {0.9f, 0.9f, 0.9f};
+       float light_position[] = {-20.0f, 40.0f, -40.0f, 1.0f};
+       glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_COLOR_MATERIAL);
+       glEnable(GL_DEPTH_TEST);
+
+       glRotatef(ang, 1, 0, 1);
+       glColor3f(0.9, 0.9, 0.7);
+       gdk_gl_draw_teapot(TRUE, 0.25);
+       glColor3f(1.0, 1.0, 1.0);
+
+       glDisable(GL_LIGHT0);
+       glDisable(GL_LIGHTING);
+       glDisable(GL_COLOR_MATERIAL);
+       glDisable(GL_DEPTH_TEST);
+
+       glPopMatrix();
+       return FALSE;
+}
+
+static gboolean rotate(gpointer user_data)
+{
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rotate_button)))
+               return TRUE;
+
+       GtkWidget *da = GTK_WIDGET (user_data);
+
+       ang++;
+
+       gdk_window_invalidate_rect(da->window, &da->allocation, FALSE);
+       gdk_window_process_updates(da->window, FALSE);
+
+       return TRUE;
+}
+
+gboolean example_init(GtkDrawingArea *drawing, GtkNotebook *config)
+{
+       /* Add configuration tab */
+       GtkWidget *label = gtk_label_new("example");
+       rotate_button = gtk_toggle_button_new_with_label("Rotate");
+       gtk_notebook_append_page(GTK_NOTEBOOK(config), rotate_button, label);
+
+       /* Set up OpenGL Stuff */
+       g_signal_connect(drawing, "expose-event", G_CALLBACK(expose), NULL);
+       g_timeout_add(1000/60, rotate, drawing);
+       return TRUE;
+}
diff --git a/src/example.h b/src/example.h
new file mode 100644 (file)
index 0000000..a896e64
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef EXAMPLE_H
+#define EXAMPLE_H
+
+gboolean example_init(GtkDrawingArea *drawing, GtkNotebook *config);
+
+#endif
index f348d71a0d05e5d9f3f6077421c49c561ad36f85..9a369eca3afb096bb7c0a08bc8a0faedfacf44a6 100644 (file)
@@ -30,9 +30,9 @@ static gboolean expose_end(GtkWidget *da, GdkEventExpose *event, gpointer user_d
 
        return FALSE;
 }
-static gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
+static gboolean configure_start(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
 {
-       GdkGLContext *glcontext = gtk_widget_get_gl_context(da);
+       GdkGLContext  *glcontext  = gtk_widget_get_gl_context(da);
        GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
 
        if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
@@ -40,24 +40,28 @@ static gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user
 
        glLoadIdentity();
        glViewport(0, 0, da->allocation.width, da->allocation.height);
-       glOrtho(-10,10,-10,10,-20050,10000);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       //glEnable(GL_ALPHA_TEST);
+       //glAlphaFunc(GL_EQUAL, 0);
+       double scale = 500*1000; // 500 km
+       glOrtho(-scale,scale,-scale,scale,0,10000);
 
-       glScalef(10., 10., 10.);
-       
+       return FALSE;
+}
+static gboolean configure_end(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
+{
+       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
        gdk_gl_drawable_gl_end(gldrawable);
-
        return FALSE;
 }
 
 gboolean opengl_init(GtkDrawingArea *drawing, GtkNotebook *config)
 {
        /* Set up OpenGL Stuff */
-       g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL);
-       
-       //g_signal_connect(drawing, "expose-event", G_CALLBACK(expose), NULL);
-       g_signal_connect      (drawing, "expose-event", G_CALLBACK(expose_start), NULL);
-       g_signal_connect_after(drawing, "expose-event", G_CALLBACK(expose_end),   NULL);
+       g_signal_connect      (drawing, "configure-event", G_CALLBACK(configure_start), NULL);
+       g_signal_connect_after(drawing, "configure-event", G_CALLBACK(configure_end),   NULL);
+       g_signal_connect      (drawing, "expose-event",    G_CALLBACK(expose_start),    NULL);
+       g_signal_connect_after(drawing, "expose-event",    G_CALLBACK(expose_end),      NULL);
        return TRUE;
 }
index 2fdf7d385c6df2825db3422e8266681fd381bd70..e7575155f15a23da48be54498716bcbc5c91f05f 100644 (file)
 #include "radar.h"
 
 GtkWidget *drawing;
-static Sweep *cur_sweep; // make this not global
+static Sweep *cur_sweep = NULL;  // make this not global
 static int nred, ngreen, nblue;
 static char red[256], green[256], blue[256];
+static guint sweep_tex = 0;
+
+static guint8 get_alpha(guint8 db)
+{
+       if (db == BADVAL) return 0;
+       if (db == RFVAL ) return 0;
+       if (db == APFLAG) return 0;
+       if (db == NOECHO) return 0;
+       if (db == 0     ) return 0;
+       //if      (db > 60) return 0;
+       //else if (db < 10) return 0;
+       //else if (db < 25) return (db-10)*(255.0/15);
+       else              return 255;
+}
+
+//#ifdef USE_TWO_BYTE_PRECISION
+//#define F_FACTOR 100.0
+//#define F_DR_FACTOR 1000.0
+//#define F_DZ_RANGE_OFFSET 50
+//#else
+//#define F_FACTOR 2.0
+//#define F_DR_FACTOR 10.0
+//#define F_DZ_RANGE_OFFSET 32
+//#endif
+//#define F_OFFSET 4
+//static float dz_f(Range x)
+//{
+//     if (x >= F_OFFSET)
+//             return (((float)x-F_OFFSET)/F_FACTOR - F_DZ_RANGE_OFFSET);
+//     if (x == 0) return BADVAL;
+//     if (x == 1) return RFVAL;
+//     if (x == 2) return APFLAG;
+//     if (x == 3) return NOECHO;
+//     return BADVAL;
+//}
 
 /* Convert a sweep to an 2d array of data points */
 static void bscan_sweep(Sweep *sweep, guint8 **data, int *width, int *height)
@@ -23,18 +58,21 @@ static void bscan_sweep(Sweep *sweep, guint8 **data, int *width, int *height)
                max_bins = MAX(max_bins, sweep->ray[i]->h.nbins);
 
        /* Allocate buffer using max number of bins for each ray */
-       guint8 *buf = g_malloc0(sweep->h.nrays * max_bins * 3);
+       guint8 *buf = g_malloc0(sweep->h.nrays * max_bins * 4);
 
        /* Fill the data */
        int ri, bi;
        for (ri = 0; ri < sweep->h.nrays; ri++) {
-               Ray   *ray  = sweep->ray[ri];
+               Ray *ray  = sweep->ray[ri];
                for (bi = 0; bi < ray->h.nbins; bi++) {
-                       Range bin = ray->range[bi];
-                       /* copy RGB into buffer */
-                       buf[(ri*max_bins+bi)*3+0] =   red[(gint8)ray->h.f(bin)];
-                       buf[(ri*max_bins+bi)*3+1] = green[(gint8)ray->h.f(bin)];
-                       buf[(ri*max_bins+bi)*3+2] =  blue[(gint8)ray->h.f(bin)];
+                       /* copy RGBA into buffer */
+                       //guint val   = dz_f(ray->range[bi]);
+                       guint val   = ray->h.f(ray->range[bi]);
+                       guint buf_i = (ri*max_bins+bi)*4;
+                       buf[buf_i+0] =   red[val];
+                       buf[buf_i+1] = green[val];
+                       buf[buf_i+2] =  blue[val];
+                       buf[buf_i+3] = get_alpha(val);
                }
        }
 
@@ -42,19 +80,6 @@ static void bscan_sweep(Sweep *sweep, guint8 **data, int *width, int *height)
        *width  = max_bins;
        *height = sweep->h.nrays;
        *data   = buf;
-
-       /* debug */
-       //static int fi = 0;
-       //char fname[128];
-       //sprintf(fname, "image-%d.ppm", fi);
-       //FILE *fp = fopen(fname, "w+");
-       //fprintf(fp, "P6\n");
-       //fprintf(fp, "# Foo\n");
-       //fprintf(fp, "%d %d\n", *width, *height);
-       //fprintf(fp, "255\n");
-       //fwrite(buf, 3, *width * *height, fp);
-       //fclose(fp);
-       //fi++;
 }
 
 /* Load a sweep as the active texture */
@@ -64,45 +89,35 @@ static void load_sweep(Sweep *sweep)
        int height, width;
        guint8 *data;
        bscan_sweep(sweep, &data, &width, &height);
+       glGenTextures(1, &sweep_tex);
+       glBindTexture(GL_TEXTURE_2D, sweep_tex);
        glPixelStorei(GL_PACK_ALIGNMENT, 1);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
        g_free(data);
-       glEnable(GL_TEXTURE_2D);
        gdk_window_invalidate_rect(drawing->window, &drawing->allocation, FALSE);
 }
 
 /* Load the default sweep */
 static gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
 {
-       GdkGLContext *glcontext = gtk_widget_get_gl_context(da);
-       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
-
-       if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
-               g_assert_not_reached();
-
-       /* Load the texture */
-       load_sweep(cur_sweep);
-
-       gdk_gl_drawable_gl_end(gldrawable);
-
+       Sweep *first = (Sweep*)user_data;
+       if (cur_sweep == NULL)
+               load_sweep(first);
        return FALSE;
 }
 
 static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
 {
+       //g_message("radar:expose");
        Sweep *sweep = cur_sweep;
 
-       //GdkGLContext *glcontext = gtk_widget_get_gl_context(da);
-       //GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
-
-       /* draw in here */
-       glPushMatrix();
-       glRotatef(0, 0, 0, 0);
-
        /* Draw the rays */
+       glBindTexture(GL_TEXTURE_2D, sweep_tex);
        glEnable(GL_TEXTURE_2D);
+
        glBegin(GL_QUAD_STRIP);
        int _ri; // not really used, creates strange fragments..
        for (_ri = 0; _ri < sweep->h.nrays; _ri++) {
@@ -117,17 +132,21 @@ static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
                double lx = sin(left);
                double ly = cos(left);
 
-               /* TODO: change this to meters instead of 0..1 */
-               double max_dist  = ray->h.nbins*ray->h.gate_size + ray->h.range_bin1;
-               double near_dist = (double)(ray->h.range_bin1) / max_dist;
-               double far_dist  = (double)(ray->h.nbins*ray->h.gate_size + ray->h.range_bin1) / max_dist;
+               double near_dist = ray->h.range_bin1;
+               double far_dist  = ray->h.nbins*ray->h.gate_size + ray->h.range_bin1;
 
                /* (find middle of bin) / scale for opengl */
-               glTexCoord2d(0.0, ((double)ri)/sweep->h.nrays); glVertex3f(lx*near_dist, ly*near_dist, 0.); // near left
-               glTexCoord2d(0.7, ((double)ri)/sweep->h.nrays); glVertex3f(lx*far_dist,  ly*far_dist,  0.); // far  left
+               // near left
+               glTexCoord2f(0.0, (double)ri/sweep->h.nrays);
+               glVertex3f(lx*near_dist, ly*near_dist, 0.0);
+
+               // far  left
+               glTexCoord2f(1.0, (double)ri/sweep->h.nrays);
+               glVertex3f(lx*far_dist,  ly*far_dist,  0.0);
        }
        //g_print("ri=%d, nr=%d, bw=%f\n", _ri, sweep->h.nrays, sweep->h.beam_width);
        glEnd();
+
        /* Texture debug */
        //glBegin(GL_QUADS);
        //glTexCoord2d( 0.,  0.); glVertex3f(-1.,  0., 0.); // bot left
@@ -135,20 +154,21 @@ static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
        //glTexCoord2d( 1.,  1.); glVertex3f( 0.,  1., 0.); // top right
        //glTexCoord2d( 1.,  0.); glVertex3f( 0.,  0., 0.); // bot right
        //glEnd();
-       glDisable(GL_TEXTURE_2D);
 
        /* Print the color table */
+       glDisable(GL_TEXTURE_2D);
+       glPushMatrix();
+       glLoadIdentity();
        glBegin(GL_QUADS);
        int i;
        for (i = 0; i < nred; i++) {
-               glColor3ub(red[i], green[i], blue[i]);
+               glColor4ub(red[i], green[i], blue[i], get_alpha(i));
                glVertex3f(-1., (float)((i  ) - nred/2)/(nred/2), 0.); // bot left
                glVertex3f(-1., (float)((i+1) - nred/2)/(nred/2), 0.); // top left
                glVertex3f(-.9, (float)((i+1) - nred/2)/(nred/2), 0.); // top right
                glVertex3f(-.9, (float)((i  ) - nred/2)/(nred/2), 0.); // bot right
        }
        glEnd();
-       
        glPopMatrix();
 
        return FALSE;
@@ -157,21 +177,17 @@ static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
 gboolean radar_init(GtkDrawingArea *_drawing, GtkNotebook *config)
 {
        drawing = GTK_WIDGET(_drawing);
-       /* Set up OpenGL Stuff */
-       g_signal_connect(drawing, "expose-event",    G_CALLBACK(expose),    NULL);
-       g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL);
 
        /* Parse hard coded file.. */
        RSL_read_these_sweeps("all", NULL);
        //RSL_read_these_sweeps("all", NULL);
-       Radar *radar = RSL_wsr88d_to_radar("/scratch/aweather/data/KNQA_20090501_1925.raw", "KNQA");
+       Radar *radar = RSL_wsr88d_to_radar("/scratch/aweather/data/level2/KNQA_20090501_1925.raw", "KNQA");
        RSL_load_refl_color_table();
        RSL_get_color_table(RSL_RED_TABLE,   red,   &nred);
        RSL_get_color_table(RSL_GREEN_TABLE, green, &ngreen);
        RSL_get_color_table(RSL_BLUE_TABLE,  blue,  &nblue);
        if (radar->h.nvolumes < 1 || radar->v[0]->h.nsweeps < 1)
                g_print("No sweeps found\n");
-       cur_sweep = radar->v[0]->sweep[6];
 
        /* Add configuration tab */
        GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
@@ -194,5 +210,10 @@ gboolean radar_init(GtkDrawingArea *_drawing, GtkNotebook *config)
        }
        GtkWidget *label = gtk_label_new("Radar");
        gtk_notebook_append_page(GTK_NOTEBOOK(config), hbox, label);
+
+       /* Set up OpenGL Stuff */
+       g_signal_connect(drawing, "expose-event",    G_CALLBACK(expose),    NULL);
+       g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), radar->v[0]->sweep[0]);
+
        return TRUE;
 }
diff --git a/src/ridge.c b/src/ridge.c
new file mode 100644 (file)
index 0000000..fc1756e
--- /dev/null
@@ -0,0 +1,65 @@
+#include <config.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkgl.h>
+#include <gdk/gdkkeysyms.h>
+#include <GL/gl.h>
+#include <math.h>
+
+static guint topo_tex;
+
+guint load_texture(char *filename)
+{
+       /* Load image */
+       GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
+       guchar    *pixels = gdk_pixbuf_get_pixels(pixbuf);
+       int        width  = gdk_pixbuf_get_width(pixbuf);
+       int        height = gdk_pixbuf_get_height(pixbuf);
+
+       /* Create Texture */
+       guint id;
+       glGenTextures(1, &id);
+       glBindTexture(GL_TEXTURE_2D, id);   // 2d texture (x and y size)
+
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+       glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
+                       GL_RGB, GL_UNSIGNED_BYTE, pixels);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+       g_message("loaded %s: w=%d h=%d", filename, width, height);
+       return id;
+}
+
+static gboolean expose(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
+{
+       //g_message("ridge:expose");
+       glPushMatrix();
+       glScaled(500*1000, 500*1000, 0);
+
+       glBindTexture(GL_TEXTURE_2D, topo_tex);
+       glEnable(GL_TEXTURE_2D);
+
+       glBegin(GL_POLYGON);
+       glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0, 0.1);
+       glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.1);
+       glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, -1.0, 0.1);
+       glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0, 0.1);
+       glEnd();
+
+       glPopMatrix();
+       return FALSE;
+}
+
+static gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
+{
+       topo_tex = load_texture("../data/topo.jpg");
+       return FALSE;
+}
+
+gboolean ridge_init(GtkDrawingArea *drawing, GtkNotebook *config)
+{
+       /* Set up OpenGL Stuff */
+       g_signal_connect(drawing, "expose-event",    G_CALLBACK(expose),    NULL);
+       g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL);
+       return TRUE;
+}
diff --git a/src/ridge.h b/src/ridge.h
new file mode 100644 (file)
index 0000000..62e69de
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef RIDGE_H
+#define RIDGE_H
+
+gboolean ridge_init(GtkDrawingArea *drawing, GtkNotebook *config);
+
+#endif