]> Pileus Git - aweather/blobdiff - src/plugins/level2.c
Fix off-by-one-half calculating ray distances
[aweather] / src / plugins / level2.c
index 180aea33bad9e23eb22cda902799f6c6eaefbb5c..906561a513f1bdcc45b2bb963a5bea6bacd5882c 100644 (file)
@@ -19,7 +19,7 @@
 #include <math.h>
 #include <GL/gl.h>
 #include <glib/gstdio.h>
-#include <gis.h>
+#include <grits.h>
 #include <rsl.h>
 
 #include "level2.h"
@@ -68,19 +68,29 @@ static void _bscan_sweep(Sweep *sweep, AWeatherColormap *colormap,
 }
 
 /* Load a sweep into an OpenGL texture */
-static void _load_sweep_gl(Sweep *sweep, AWeatherColormap *colormap, guint *tex)
+static void _load_sweep_gl(AWeatherLevel2 *self)
 {
        g_debug("AWeatherLevel2: _load_sweep_gl");
-       int height, width;
        guint8 *data;
-       _bscan_sweep(sweep, colormap, &data, &width, &height);
-       glBindTexture(GL_TEXTURE_2D, *tex);
+       gint width, height;
+       _bscan_sweep(self->sweep, self->sweep_colors, &data, &width, &height);
+       gint tex_width  = pow(2, ceil(log(width )/log(2)));
+       gint tex_height = pow(2, ceil(log(height)/log(2)));
+       self->sweep_coords[0] = (double)width  / tex_width;
+       self->sweep_coords[1] = (double)height / tex_height;
+
+       if (!self->sweep_tex)
+                glGenTextures(1, &self->sweep_tex);
+       glBindTexture(GL_TEXTURE_2D, self->sweep_tex);
        glPixelStorei(GL_PACK_ALIGNMENT, 1);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0,
+                       GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+       glTexSubImage2D(GL_TEXTURE_2D, 0, 0,0, width,height,
+                       GL_RGBA, GL_UNSIGNED_BYTE, data);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
-                       GL_RGBA, GL_UNSIGNED_BYTE, data);
+
        g_free(data);
 }
 
@@ -120,7 +130,7 @@ static gboolean _decompress_radar(const gchar *file, const gchar *raw)
 /*********************
  * Drawing functions *
  *********************/
-static void _draw_radar(GisCallback *_self, gpointer _viewer)
+void aweather_level2_draw(GritsObject *_self, GritsOpenGL *opengl)
 {
        AWeatherLevel2 *self = AWEATHER_LEVEL2(_self);
        if (!self->sweep || !self->sweep_tex)
@@ -128,12 +138,6 @@ static void _draw_radar(GisCallback *_self, gpointer _viewer)
 
        /* Draw wsr88d */
        Sweep *sweep = self->sweep;
-       Radar_header *h = &self->radar->h;
-       gdouble lat  = (double)h->latd + (double)h->latm/60 + (double)h->lats/(60*60);
-       gdouble lon  = (double)h->lond + (double)h->lonm/60 + (double)h->lons/(60*60);
-       gdouble elev = h->height;
-       gis_viewer_center_position(self->viewer, lat, lon, elev);
-
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
@@ -143,6 +147,8 @@ static void _draw_radar(GisCallback *_self, gpointer _viewer)
        glColor4f(1,1,1,1);
 
        /* Draw the rays */
+       gdouble xscale = self->sweep_coords[0];
+       gdouble yscale = self->sweep_coords[1];
        glBindTexture(GL_TEXTURE_2D, self->sweep_tex);
        glBegin(GL_TRIANGLE_STRIP);
        for (int ri = 0; ri <= sweep->h.nrays; ri++) {
@@ -160,18 +166,18 @@ static void _draw_radar(GisCallback *_self, gpointer _viewer)
                double lx = sin(angle);
                double ly = cos(angle);
 
-               double near_dist = ray->h.range_bin1;
-               double far_dist  = ray->h.nbins*ray->h.gate_size + ray->h.range_bin1;
+               double near_dist = ray->h.range_bin1 - ((double)ray->h.gate_size/2.);
+               double far_dist  = near_dist + (double)ray->h.nbins*ray->h.gate_size;
 
                /* (find middle of bin) / scale for opengl */
                // near left
-               glTexCoord2f(0.0, (double)ri/sweep->h.nrays-0.01);
+               glTexCoord2f(0.0, ((double)ri/sweep->h.nrays)*yscale);
                glVertex3f(lx*near_dist, ly*near_dist, 2.0);
 
                // far  left
                // todo: correct range-height function
                double height = sin(deg2rad(ray->h.elev)) * far_dist;
-               glTexCoord2f(1.0, (double)ri/sweep->h.nrays-0.01);
+               glTexCoord2f(xscale, ((double)ri/sweep->h.nrays)*yscale);
                glVertex3f(lx*far_dist,  ly*far_dist, height);
        }
        glEnd();
@@ -194,9 +200,7 @@ static gboolean _set_sweep_cb(gpointer _self)
 {
        g_debug("AWeatherLevel2: _set_sweep_cb");
        AWeatherLevel2 *self = _self;
-       if (!self->sweep_tex)
-                glGenTextures(1, &self->sweep_tex);
-       _load_sweep_gl(self->sweep, self->sweep_colors, &self->sweep_tex);
+       _load_sweep_gl(self);
        gtk_widget_queue_draw(GTK_WIDGET(self->viewer));
        g_object_unref(self);
        return FALSE;
@@ -224,7 +228,7 @@ void aweather_level2_set_sweep(AWeatherLevel2 *self,
        g_idle_add(_set_sweep_cb, self);
 }
 
-AWeatherLevel2 *aweather_level2_new(GisViewer *viewer,
+AWeatherLevel2 *aweather_level2_new(GritsViewer *viewer,
                AWeatherColormap *colormap, Radar *radar)
 {
        g_debug("AWeatherLevel2: new - %s", radar->h.radar_name);
@@ -233,10 +237,17 @@ AWeatherLevel2 *aweather_level2_new(GisViewer *viewer,
        self->radar    = radar;
        self->colormap = colormap;
        aweather_level2_set_sweep(self, DZ_INDEX, 0);
+
+       GritsPoint center;
+       Radar_header *h = &radar->h;
+       center.lat  = (double)h->latd + (double)h->latm/60 + (double)h->lats/(60*60);
+       center.lon  = (double)h->lond + (double)h->lonm/60 + (double)h->lons/(60*60);
+       center.elev = h->height;
+       GRITS_OBJECT(self)->center = center;
        return self;
 }
 
-AWeatherLevel2 *aweather_level2_new_from_file(GisViewer *viewer,
+AWeatherLevel2 *aweather_level2_new_from_file(GritsViewer *viewer,
                AWeatherColormap *colormap,
                const gchar *file, const gchar *site)
 {
@@ -357,16 +368,9 @@ GtkWidget *aweather_level2_get_config(AWeatherLevel2 *level2)
 /****************
  * GObject code *
  ****************/
-G_DEFINE_TYPE(AWeatherLevel2, aweather_level2, GIS_TYPE_CALLBACK);
+G_DEFINE_TYPE(AWeatherLevel2, aweather_level2, GRITS_TYPE_OBJECT);
 static void aweather_level2_init(AWeatherLevel2 *self)
 {
-       GIS_CALLBACK(self)->callback  = _draw_radar;
-       GIS_CALLBACK(self)->user_data = self;
-}
-static void aweather_level2_dispose(GObject *_self)
-{
-       g_debug("AWeatherLevel2: dispose - %p", _self);
-       G_OBJECT_CLASS(aweather_level2_parent_class)->dispose(_self);
 }
 static void aweather_level2_finalize(GObject *_self)
 {
@@ -380,5 +384,5 @@ static void aweather_level2_finalize(GObject *_self)
 static void aweather_level2_class_init(AWeatherLevel2Class *klass)
 {
        G_OBJECT_CLASS(klass)->finalize = aweather_level2_finalize;
-       G_OBJECT_CLASS(klass)->dispose  = aweather_level2_dispose;
+       GRITS_OBJECT_CLASS(klass)->draw   = aweather_level2_draw;
 }