From 4308f69c781166b035bc0d0782fd974a9e1372b6 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 4 May 2009 11:37:30 +0000 Subject: [PATCH] adding initial ridge overlay code, swiching from cubes to teapots, and a few other things --- src/Makefile.am | 4 +- src/aweather.c | 10 ++-- src/cube.c | 127 --------------------------------------------- src/cube.h | 6 --- src/example.c | 69 +++++++++++++++++++++++++ src/example.h | 6 +++ src/opengl.c | 26 ++++++---- src/radar.c | 133 ++++++++++++++++++++++++++++-------------------- src/ridge.c | 65 +++++++++++++++++++++++ src/ridge.h | 6 +++ 10 files changed, 246 insertions(+), 206 deletions(-) delete mode 100644 src/cube.c delete mode 100644 src/cube.h create mode 100644 src/example.c create mode 100644 src/example.h create mode 100644 src/ridge.c create mode 100644 src/ridge.h diff --git a/src/Makefile.am b/src/Makefile.am index 4bbe43a..46a3cda 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/aweather.c b/src/aweather.c index 35eede0..22479bf 100644 --- a/src/aweather.c +++ b/src/aweather.c @@ -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 index 8592545..0000000 --- a/src/cube.c +++ /dev/null @@ -1,127 +0,0 @@ -#include -#include -#include -#include -#include -#include - -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 index d1b641d..0000000 --- a/src/cube.h +++ /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 index 0000000..a53d62e --- /dev/null +++ b/src/example.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include + +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 index 0000000..a896e64 --- /dev/null +++ b/src/example.h @@ -0,0 +1,6 @@ +#ifndef EXAMPLE_H +#define EXAMPLE_H + +gboolean example_init(GtkDrawingArea *drawing, GtkNotebook *config); + +#endif diff --git a/src/opengl.c b/src/opengl.c index f348d71..9a369ec 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -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; } diff --git a/src/radar.c b/src/radar.c index 2fdf7d3..e757515 100644 --- a/src/radar.c +++ b/src/radar.c @@ -10,9 +10,44 @@ #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 index 0000000..fc1756e --- /dev/null +++ b/src/ridge.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include + +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 index 0000000..62e69de --- /dev/null +++ b/src/ridge.h @@ -0,0 +1,6 @@ +#ifndef RIDGE_H +#define RIDGE_H + +gboolean ridge_init(GtkDrawingArea *drawing, GtkNotebook *config); + +#endif -- 2.43.2