X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Flevel2.c;h=623fa34c0783db84a86a61520d20829a53edd47d;hb=8addcb17f030c9d9330f125f6160eedbccddf63d;hp=271dfbe2c8af009d006eb3cdf1ff3c5fb591453c;hpb=6d2c00f5012aed76508611e1fa85ac3d87f33e9c;p=aweather diff --git a/src/plugins/level2.c b/src/plugins/level2.c index 271dfbe..623fa34 100644 --- a/src/plugins/level2.c +++ b/src/plugins/level2.c @@ -58,15 +58,12 @@ static void _bscan_sweep(Sweep *sweep, AWeatherColormap *colormap, 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 + guint8 *data = colormap_get(colormap, value); + buf[buf_i+0] = data[0]; + buf[buf_i+1] = data[1]; + buf[buf_i+2] = data[2]; + buf[buf_i+3] = data[3]*0.75; // TESTING } } @@ -77,20 +74,20 @@ static void _bscan_sweep(Sweep *sweep, AWeatherColormap *colormap, } /* Load a sweep into an OpenGL texture */ -static void _load_sweep_gl(AWeatherLevel2 *self) +static void _load_sweep_gl(AWeatherLevel2 *level2) { g_debug("AWeatherLevel2: _load_sweep_gl"); guint8 *data; gint width, height; - _bscan_sweep(self->sweep, self->sweep_colors, &data, &width, &height); + _bscan_sweep(level2->sweep, level2->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; + level2->sweep_coords[0] = (double)width / tex_width; + level2->sweep_coords[1] = (double)height / tex_height; - if (!self->sweep_tex) - glGenTextures(1, &self->sweep_tex); - glBindTexture(GL_TEXTURE_2D, self->sweep_tex); + if (!level2->sweep_tex) + glGenTextures(1, &level2->sweep_tex); + glBindTexture(GL_TEXTURE_2D, level2->sweep_tex); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0, @@ -161,7 +158,7 @@ static VolGrid *_load_grid(Volume *vol) gint nsweeps = vol->h.nsweeps; gint nrays = sweep->h.nrays/(1/sweep->h.beam_width)+1; gint nbins = ray->h.nbins /(1000/ray->h.gate_size); - nbins = MIN(nbins, 100); + nbins = MIN(nbins, 150); VolGrid *grid = vol_grid_new(nrays, nbins, nsweeps); @@ -206,15 +203,15 @@ static VolGrid *_load_grid(Volume *vol) /********************* * Drawing functions * *********************/ -void aweather_level2_draw(GritsObject *_self, GritsOpenGL *opengl) +void aweather_level2_draw(GritsObject *_level2, GritsOpenGL *opengl) { - AWeatherLevel2 *self = AWEATHER_LEVEL2(_self); - if (!self->sweep || !self->sweep_tex) + AWeatherLevel2 *level2 = AWEATHER_LEVEL2(_level2); + if (!level2->sweep || !level2->sweep_tex) return; /* Draw wsr88d */ - Sweep *sweep = self->sweep; - glDisable(GL_ALPHA_TEST); + Sweep *sweep = level2->sweep; + //glDisable(GL_ALPHA_TEST); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); @@ -223,9 +220,9 @@ void aweather_level2_draw(GritsObject *_self, GritsOpenGL *opengl) 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); + gdouble xscale = level2->sweep_coords[0]; + gdouble yscale = level2->sweep_coords[1]; + glBindTexture(GL_TEXTURE_2D, level2->sweep_tex); glBegin(GL_TRIANGLE_STRIP); for (int ri = 0; ri <= sweep->h.nrays; ri++) { Ray *ray = NULL; @@ -268,43 +265,50 @@ void aweather_level2_draw(GritsObject *_self, GritsOpenGL *opengl) //glEnd(); } +void aweather_level2_hide(GritsObject *_level2, gboolean hidden) +{ + AWeatherLevel2 *level2 = AWEATHER_LEVEL2(_level2); + if (level2->volume) + grits_object_hide(GRITS_OBJECT(level2->volume), hidden); +} + /*********** * Methods * ***********/ -static gboolean _set_sweep_cb(gpointer _self) +static gboolean _set_sweep_cb(gpointer _level2) { g_debug("AWeatherLevel2: _set_sweep_cb"); - AWeatherLevel2 *self = _self; - _load_sweep_gl(self); - grits_object_queue_draw(_self); - g_object_unref(self); + AWeatherLevel2 *level2 = _level2; + _load_sweep_gl(level2); + grits_object_queue_draw(_level2); + g_object_unref(level2); return FALSE; } -void aweather_level2_set_sweep(AWeatherLevel2 *self, +void aweather_level2_set_sweep(AWeatherLevel2 *level2, int type, float elev) { g_debug("AWeatherLevel2: set_sweep - %d %f", type, elev); /* Find sweep */ - Volume *volume = RSL_get_volume(self->radar, type); + Volume *volume = RSL_get_volume(level2->radar, type); if (!volume) return; - self->sweep = RSL_get_closest_sweep(volume, elev, 90); - if (!self->sweep) return; + level2->sweep = RSL_get_closest_sweep(volume, elev, 90); + if (!level2->sweep) return; /* Find colormap */ - self->sweep_colors = NULL; - 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) { + level2->sweep_colors = NULL; + for (int i = 0; level2->colormap[i].file; i++) + if (level2->colormap[i].type == type) + level2->sweep_colors = &level2->colormap[i]; + if (!level2->sweep_colors) { g_warning("AWeatherLevel2: set_sweep - missing colormap[%d]", type); - self->sweep_colors = &self->colormap[0]; + level2->sweep_colors = &level2->colormap[0]; } /* Load data */ - g_object_ref(self); - g_idle_add(_set_sweep_cb, self); + g_object_ref(level2); + g_idle_add(_set_sweep_cb, level2); } void aweather_level2_set_iso(AWeatherLevel2 *level2, gfloat level) @@ -320,19 +324,19 @@ void aweather_level2_set_iso(AWeatherLevel2 *level2, gfloat level) vol->disp = GRITS_VOLUME_SURFACE; GRITS_OBJECT(vol)->center = GRITS_OBJECT(level2)->center; grits_viewer_add(GRITS_OBJECT(level2)->viewer, - GRITS_OBJECT(vol), GRITS_LEVEL_WORLD, TRUE); + GRITS_OBJECT(vol), GRITS_LEVEL_WORLD+1, FALSE); level2->volume = vol; } if (ISO_MIN < level && level < ISO_MAX) { - AWeatherColormap *cm = &level2->colormap[0]; - level2->volume->color[0] = cm->data[(gint)level][0]; - level2->volume->color[1] = cm->data[(gint)level][1]; - level2->volume->color[2] = cm->data[(gint)level][2]; - level2->volume->color[3] = cm->data[(gint)level][3]; + guint8 *data = colormap_get(&level2->colormap[0], level); + level2->volume->color[0] = data[0]; + level2->volume->color[1] = data[1]; + level2->volume->color[2] = data[2]; + level2->volume->color[3] = data[3]; grits_volume_set_level(level2->volume, level); - GRITS_OBJECT(level2->volume)->hidden = FALSE; + grits_object_hide(GRITS_OBJECT(level2->volume), FALSE); } else { - GRITS_OBJECT(level2->volume)->hidden = TRUE; + grits_object_hide(GRITS_OBJECT(level2->volume), TRUE); } } @@ -340,18 +344,18 @@ AWeatherLevel2 *aweather_level2_new(Radar *radar, AWeatherColormap *colormap) { g_debug("AWeatherLevel2: new - %s", radar->h.radar_name); RSL_sort_radar(radar); - AWeatherLevel2 *self = g_object_new(AWEATHER_TYPE_LEVEL2, NULL); - self->radar = radar; - self->colormap = colormap; - aweather_level2_set_sweep(self, DZ_INDEX, 0); + AWeatherLevel2 *level2 = g_object_new(AWEATHER_TYPE_LEVEL2, NULL); + level2->radar = radar; + level2->colormap = colormap; + aweather_level2_set_sweep(level2, 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; + GRITS_OBJECT(level2)->center = center; + return level2; } AWeatherLevel2 *aweather_level2_new_from_file(const gchar *file, const gchar *site, @@ -392,7 +396,7 @@ static void _on_sweep_clicked(GtkRadioButton *button, gpointer _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; + //level2->colormap = level2->sweep_colors; } } @@ -504,20 +508,33 @@ GtkWidget *aweather_level2_get_config(AWeatherLevel2 *level2) * GObject code * ****************/ G_DEFINE_TYPE(AWeatherLevel2, aweather_level2, GRITS_TYPE_OBJECT); -static void aweather_level2_init(AWeatherLevel2 *self) +static void aweather_level2_init(AWeatherLevel2 *level2) +{ +} +static void aweather_level2_dispose(GObject *_level2) { + AWeatherLevel2 *level2 = AWEATHER_LEVEL2(_level2); + g_debug("AWeatherLevel2: dispose - %p", _level2); + if (level2->volume) { + grits_viewer_remove(GRITS_OBJECT(level2->volume)->viewer, + GRITS_OBJECT(level2->volume)); + level2->volume = NULL; + } + G_OBJECT_CLASS(aweather_level2_parent_class)->dispose(_level2); } -static void aweather_level2_finalize(GObject *_self) +static void aweather_level2_finalize(GObject *_level2) { - AWeatherLevel2 *self = AWEATHER_LEVEL2(_self); - g_debug("AWeatherLevel2: finalize - %p", _self); - RSL_free_radar(self->radar); - if (self->sweep_tex) - glDeleteTextures(1, &self->sweep_tex); - G_OBJECT_CLASS(aweather_level2_parent_class)->finalize(_self); + AWeatherLevel2 *level2 = AWEATHER_LEVEL2(_level2); + g_debug("AWeatherLevel2: finalize - %p", _level2); + RSL_free_radar(level2->radar); + if (level2->sweep_tex) + glDeleteTextures(1, &level2->sweep_tex); + G_OBJECT_CLASS(aweather_level2_parent_class)->finalize(_level2); } static void aweather_level2_class_init(AWeatherLevel2Class *klass) { + G_OBJECT_CLASS(klass)->dispose = aweather_level2_dispose; G_OBJECT_CLASS(klass)->finalize = aweather_level2_finalize; - GRITS_OBJECT_CLASS(klass)->draw = aweather_level2_draw; + GRITS_OBJECT_CLASS(klass)->draw = aweather_level2_draw; + GRITS_OBJECT_CLASS(klass)->hide = aweather_level2_hide; }