+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, nchan, width, height, 0,
+ (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+
+ g_debug("GisPluginSrtm: load_opengl %d", opengl);
+ return opengl;
+}
+static void _load_tile(GisTile *tile, gpointer _self)
+{
+ GisPluginSrtm *self = _self;
+ g_debug("GisPluginSrtm: _load_tile");
+
+ struct _TileData *data = g_new0(struct _TileData, 1);
+ gchar *path = gis_wms_make_local(self->wms, tile);
+ if (LOAD_BIL || LOAD_OPENGL)
+ data->bil = _load_bil(path);
+ g_free(path);
+ if (LOAD_OPENGL) {
+ GdkPixbuf *pixbuf = _load_pixbuf(data->bil);
+ data->opengl = _load_opengl(pixbuf);
+ g_object_unref(pixbuf);
+ }
+
+ /* Do necessasairy processing */
+ if (LOAD_BIL)
+ gis_opengl_set_height_func(self->opengl, tile,
+ _height_func, self, TRUE);
+
+ /* Cleanup unneeded things */
+ if (!LOAD_BIL)
+ g_free(data->bil);
+
+ tile->data = data;
+}
+
+static void _free_tile(GisTile *tile, gpointer _self)
+{
+ GisPluginSrtm *self = _self;
+ struct _TileData *data = tile->data;
+ g_debug("GisPluginSrtm: _free_tile: %p=%d", data, data->opengl);
+ if (LOAD_BIL)
+ g_free(data->bil);
+ if (LOAD_OPENGL)
+ glDeleteTextures(1, &data->opengl);
+ g_free(data);
+}
+
+static gpointer _update_tiles(gpointer _self)
+{
+ GisPluginSrtm *self = _self;
+ gdouble lat, lon, elev;
+ gis_view_get_location(self->view, &lat, &lon, &elev);
+ gis_tile_update(self->tiles,
+ MAX_RESOLUTION, TILE_WIDTH, TILE_WIDTH,
+ lat, lon, elev,
+ _load_tile, self);
+ gis_tile_gc(self->tiles, time(NULL)-10,
+ _free_tile, self);
+ return NULL;
+}
+
+/*************
+ * Callbacks *
+ *************/
+static void _on_location_changed(GisView *view, gdouble lat, gdouble lon, gdouble elev,
+ GisPluginSrtm *self)
+{
+ _update_tiles(self);
+}