]> Pileus Git - aweather/blobdiff - src/plugins/level2.c
Add dual-pole support and improve colormap handling
[aweather] / src / plugins / level2.c
index b5ac6f5b3976ee63689b3b80dcaf4fb07f544d4c..c1a70a5da6f081d209701e51c28dc4dca3bb80f1 100644 (file)
@@ -46,18 +46,25 @@ static void _bscan_sweep(Sweep *sweep, AWeatherColormap *colormap,
        for (int ri = 0; ri < sweep->h.nrays; ri++) {
                Ray *ray  = sweep->ray[ri];
                for (int bi = 0; bi < ray->h.nbins; bi++) {
-                       /* copy RGBA into buffer */
-                       //guint val   = dz_f(ray->range[bi]);
-                       guint8 val   = (guint8)ray->h.f(ray->range[bi]);
                        guint  buf_i = (ri*max_bins+bi)*4;
-                       buf[buf_i+0] = colormap->data[val][0];
-                       buf[buf_i+1] = colormap->data[val][1];
-                       buf[buf_i+2] = colormap->data[val][2];
-                       buf[buf_i+3] = colormap->data[val][3]*0.75; // TESTING
-                       if (val == BADVAL     || val == RFVAL      || val == APFLAG ||
-                           val == NOTFOUND_H || val == NOTFOUND_V || val == NOECHO) {
+                       float  value = ray->h.f(ray->range[bi]);
+
+                       /* Check for bad values */
+                       if (value == BADVAL     || value == RFVAL      || value == APFLAG ||
+                           value == NOTFOUND_H || value == NOTFOUND_V || value == NOECHO) {
                                buf[buf_i+3] = 0x00; // transparent
+                               continue;
                        }
+
+                       /* Convert data value to index */
+                       gint idx = value * colormap->scale + colormap->shift;
+                       idx = CLAMP(idx, 0, colormap->len);
+
+                       /* Copy color to buffer */
+                       buf[buf_i+0] = colormap->data[idx][0];
+                       buf[buf_i+1] = colormap->data[idx][1];
+                       buf[buf_i+2] = colormap->data[idx][2];
+                       buf[buf_i+3] = colormap->data[idx][3]*0.75; // TESTING
                }
        }
 
@@ -201,7 +208,7 @@ static gboolean _set_sweep_cb(gpointer _self)
        g_debug("AWeatherLevel2: _set_sweep_cb");
        AWeatherLevel2 *self = _self;
        _load_sweep_gl(self);
-       gtk_widget_queue_draw(GTK_WIDGET(self->viewer));
+       grits_object_queue_draw(_self);
        g_object_unref(self);
        return FALSE;
 }
@@ -218,22 +225,23 @@ void aweather_level2_set_sweep(AWeatherLevel2 *self,
 
        /* Find colormap */
        self->sweep_colors = NULL;
-       for (int i = 0; self->colormap[i].name; i++)
+       for (int i = 0; self->colormap[i].file; i++)
                if (self->colormap[i].type == type)
                        self->sweep_colors = &self->colormap[i];
-       if (!self->sweep_colors) return;
+       if (!self->sweep_colors) {
+               g_warning("AWeatherLevel2: set_sweep - missing colormap[%d]", type);
+               self->sweep_colors = &self->colormap[0];
+       }
 
        /* Load data */
        g_object_ref(self);
        g_idle_add(_set_sweep_cb, self);
 }
 
-AWeatherLevel2 *aweather_level2_new(GritsViewer *viewer,
-               AWeatherColormap *colormap, Radar *radar)
+AWeatherLevel2 *aweather_level2_new(Radar *radar, AWeatherColormap *colormap)
 {
        g_debug("AWeatherLevel2: new - %s", radar->h.radar_name);
        AWeatherLevel2 *self = g_object_new(AWEATHER_TYPE_LEVEL2, NULL);
-       self->viewer   = viewer;
        self->radar    = radar;
        self->colormap = colormap;
        aweather_level2_set_sweep(self, DZ_INDEX, 0);
@@ -247,9 +255,8 @@ AWeatherLevel2 *aweather_level2_new(GritsViewer *viewer,
        return self;
 }
 
-AWeatherLevel2 *aweather_level2_new_from_file(GritsViewer *viewer,
-               AWeatherColormap *colormap,
-               const gchar *file, const gchar *site)
+AWeatherLevel2 *aweather_level2_new_from_file(const gchar *file, const gchar *site,
+               AWeatherColormap *colormap)
 {
        g_debug("AWeatherLevel2: new_from_file %s %s", site, file);
 
@@ -276,16 +283,18 @@ AWeatherLevel2 *aweather_level2_new_from_file(GritsViewer *viewer,
        if (!radar)
                return NULL;
 
-       return aweather_level2_new(viewer, colormaps, radar);
+       return aweather_level2_new(radar, colormaps);
 }
 
 static void _on_sweep_clicked(GtkRadioButton *button, gpointer _level2)
 {
        AWeatherLevel2 *level2 = _level2;
-       gint type = (gint)g_object_get_data(G_OBJECT(button), "type");
-       gint elev = (gint)g_object_get_data(G_OBJECT(button), "elev");
-       aweather_level2_set_sweep(level2, type, (float)elev/100);
-       //self->colormap = level2->sweep_colors;
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
+               gint type = (gint)g_object_get_data(G_OBJECT(button), "type");
+               gint elev = (gint)g_object_get_data(G_OBJECT(button), "elev");
+               aweather_level2_set_sweep(level2, type, (float)elev/100);
+               //self->colormap = level2->sweep_colors;
+       }
 }
 
 GtkWidget *aweather_level2_get_config(AWeatherLevel2 *level2)