]> Pileus Git - aweather/commitdiff
Use power of two textures for level2 sweeps
authorAndy Spencer <andy753421@gmail.com>
Wed, 12 May 2010 03:40:24 +0000 (03:40 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 12 May 2010 04:00:25 +0000 (04:00 +0000)
TODO
src/plugins/level2.c
src/plugins/level2.h

diff --git a/TODO b/TODO
index afd4af233e42b457c23768a4ee61e979dea5ea6b..8f5558365646d212174718813df55661d90df64d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,8 +1,5 @@
 Road plan
 ---------
-0.4 - Beta:
-  * Fix 2^x texture sizes in Radar plugin
-
 0.x - Misc:
   * Fix all memory leaks
   * Pre-load textures and polys in OpenGL
index 180aea33bad9e23eb22cda902799f6c6eaefbb5c..6e0a0666457a16ad63f7d801247d8df0340846b7 100644 (file)
@@ -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);
 }
 
@@ -143,6 +153,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++) {
@@ -165,13 +177,13 @@ static void _draw_radar(GisCallback *_self, gpointer _viewer)
 
                /* (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 +206,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;
index 9f9eb9ca5b35b98deb18a4d3f763bdee6dc7304a..7f3d366f4ca7cfff7c6f4521b7fb7b41e1aafd36 100644 (file)
@@ -41,6 +41,7 @@ struct _AWeatherLevel2 {
        /* Private */
        Sweep            *sweep;
        AWeatherColormap *sweep_colors;
+       gdouble           sweep_coords[2];
        guint             sweep_tex;
 };