+static void on_time_changed(AWeatherView *view, const char *time, gpointer _self)
+{
+ AWeatherRadar *self = AWEATHER_RADAR(_self);
+ g_debug("AWeatherRadar: on_time_changed - setting time=%s", time);
+ // format: http://mesonet.agron.iastate.edu/data/nexrd2/raw/KABR/KABR_20090510_0323
+ char *site = aweather_view_get_site(view);
+ char *path = g_strdup_printf("nexrd2/raw/%s/%s_%s", site, site, time);
+
+ /* Set up progress bar */
+ GtkWidget *child = gtk_bin_get_child(GTK_BIN(self->config_body));
+ if (child) gtk_widget_destroy(child);
+
+ GtkWidget *vbox = gtk_vbox_new(FALSE, 10);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+ self->progress_bar = gtk_progress_bar_new();
+ self->progress_label = gtk_label_new("Loading radar...");
+ gtk_box_pack_start(GTK_BOX(vbox), self->progress_bar, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), self->progress_label, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(self->config_body), vbox);
+ gtk_widget_show_all(self->config_body);
+
+ /* Clear radar */
+ if (self->cur_radar)
+ RSL_free_radar(self->cur_radar);
+ self->cur_radar = NULL;
+ self->cur_sweep = NULL;
+ aweather_gui_gl_redraw(self->gui);
+
+ /* Start loading the new radar */
+ if (self->soup) {
+ soup_session_abort(self->soup);
+ self->soup = NULL;
+ }
+ if (aweather_view_get_offline(view))
+ self->soup = cache_file(nexrad_base, path, AWEATHER_ONCE,
+ cache_chunk_cb, cache_done_cb, self);
+ else
+ self->soup = cache_file(nexrad_base, path, AWEATHER_UPDATE,
+ cache_chunk_cb, cache_done_cb, self);
+ g_free(path);
+}
+
+static void on_site_changed(AWeatherView *view, char *site, gpointer _self)
+{
+ AWeatherRadar *self = AWEATHER_RADAR(_self);
+ g_debug("AWeatherRadar: on_site_changed - Loading wsr88d list for %s", site);
+ update_times(self, view, site), &time;
+}
+
+static void on_refresh(AWeatherView *view, gpointer _self)
+{
+ AWeatherRadar *self = AWEATHER_RADAR(_self);
+ char *site = aweather_view_get_site(view);
+ update_times(self, view, site);
+}
+
+/***********
+ * Methods *
+ ***********/
+AWeatherRadar *aweather_radar_new(AWeatherGui *gui)
+{
+ g_debug("AWeatherRadar: new");
+ AWeatherRadar *self = g_object_new(AWEATHER_TYPE_RADAR, NULL);
+ self->gui = gui;
+
+ GtkWidget *config = aweather_gui_get_widget(gui, "tabs");
+ AWeatherView *view = aweather_gui_get_view(gui);
+
+ /* Add configuration tab */
+ self->config_body = gtk_alignment_new(0, 0, 1, 1);
+ gtk_container_set_border_width(GTK_CONTAINER(self->config_body), 5);
+ gtk_container_add(GTK_CONTAINER(self->config_body), gtk_label_new("No radar loaded"));
+ gtk_notebook_prepend_page(GTK_NOTEBOOK(config), self->config_body, gtk_label_new("Radar"));
+
+ /* Set up OpenGL Stuff */
+ g_signal_connect(view, "site-changed", G_CALLBACK(on_site_changed), self);
+ g_signal_connect(view, "time-changed", G_CALLBACK(on_time_changed), self);
+ g_signal_connect(view, "refresh", G_CALLBACK(on_refresh), self);
+
+ return self;
+}
+
+static void _aweather_radar_expose(AWeatherPlugin *_self)
+{
+ AWeatherRadar *self = AWEATHER_RADAR(_self);
+ g_debug("AWeatherRadar: expose");
+ if (self->cur_sweep == NULL)
+ return;
+ Sweep *sweep = self->cur_sweep;
+
+#ifdef MARCHING
+ /* Draw the surface */
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glDisable(GL_TEXTURE_2D);
+ float light_ambient[] = {0.1f, 0.1f, 0.0f};
+ float light_diffuse[] = {0.9f, 0.9f, 0.9f};
+ float light_position[] = {-300000.0f, 500000.0f, 400000.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);
+ glColor4f(1,1,1,0.75);
+ g_debug("ntri=%d", self->cur_num_triangles);
+ glBegin(GL_TRIANGLES);
+ for (int i = 0; i < self->cur_num_triangles; i++) {
+ TRIANGLE t = self->cur_triangles[i];
+ do_normal(t.p[0].x, t.p[0].y, t.p[0].z,
+ t.p[1].x, t.p[1].y, t.p[1].z,
+ t.p[2].x, t.p[2].y, t.p[2].z);
+ glVertex3f(t.p[0].x, t.p[0].y, t.p[0].z);
+ glVertex3f(t.p[1].x, t.p[1].y, t.p[1].z);
+ glVertex3f(t.p[2].x, t.p[2].y, t.p[2].z);
+ }
+ glEnd();
+ glPopMatrix();
+#endif