From 34c7dbdf473f66024fd3ab3301b9921593d9d420 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 25 Jan 2010 20:35:13 +0000 Subject: [PATCH] Fix holes in the earth - Add user_data to tile before updating height, otherwise the latest tile doesn't get used. - Add flag to get_intersect to fetch all triangles, not just leaves. Update these heights when setting height funcs. --- src/gis-opengl.c | 4 ++-- src/gis_test.c | 2 +- src/plugins/srtm.c | 3 ++- src/roam.c | 21 ++++++++++++--------- src/roam.h | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/gis-opengl.c b/src/gis-opengl.c index dc26348..49fd84a 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -448,7 +448,7 @@ static void gis_opengl_render_tile(GisViewer *_self, GisTile *tile) GisOpenGL *self = GIS_OPENGL(_self); if (!tile || !tile->data) return; - GList *triangles = roam_sphere_get_intersect(self->sphere, + GList *triangles = roam_sphere_get_intersect(self->sphere, FALSE, tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w); if (!triangles) g_warning("GisOpenGL: render_tiles - No triangles to draw: edges=%f,%f,%f,%f", @@ -517,7 +517,7 @@ static void gis_opengl_set_height_func(GisViewer *_self, GisTile *tile, if (!tile) return; /* TODO: get points? */ - GList *triangles = roam_sphere_get_intersect(self->sphere, + GList *triangles = roam_sphere_get_intersect(self->sphere, TRUE, tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w); for (GList *cur = triangles; cur; cur = cur->next) { RoamTriangle *tri = cur->data; diff --git a/src/gis_test.c b/src/gis_test.c index 7a68afa..646de77 100644 --- a/src/gis_test.c +++ b/src/gis_test.c @@ -58,7 +58,7 @@ int main(int argc, char **argv) gdk_threads_leave(); gis_plugins_load(plugins, "bmng", viewer, prefs); - //gis_plugins_load(plugins, "srtm", viewer, prefs); + gis_plugins_load(plugins, "srtm", viewer, prefs); gis_plugins_load(plugins, "test", viewer, prefs); gdk_threads_enter(); diff --git a/src/plugins/srtm.c b/src/plugins/srtm.c index 15e5b37..70be7d9 100644 --- a/src/plugins/srtm.c +++ b/src/plugins/srtm.c @@ -159,6 +159,8 @@ static gboolean _load_tile_cb(gpointer _load) if (LOAD_OPENGL) data->opengl = _load_opengl(pixbuf); + tile->data = data; + /* Do necessasairy processing */ /* TODO: Lock this and move to thread, can remove self from _load then */ if (LOAD_BIL) @@ -170,7 +172,6 @@ static gboolean _load_tile_cb(gpointer _load) if (LOAD_OPENGL) g_object_unref(pixbuf); - tile->data = data; return FALSE; } static void _load_tile(GisTile *tile, gpointer _self) diff --git a/src/roam.c b/src/roam.c index 7f13182..33f5f7c 100644 --- a/src/roam.c +++ b/src/roam.c @@ -600,18 +600,19 @@ void roam_sphere_draw_normals(RoamSphere *self) g_debug("RoamSphere: draw_normal"); g_pqueue_foreach(self->triangles, (GFunc)roam_triangle_draw_normal, NULL); } -static GList *_roam_sphere_get_leaves(RoamTriangle *tri, GList *list) +static GList *_roam_sphere_get_leaves(RoamTriangle *tri, GList *list, gboolean all) { if (tri->kids[0] && tri->kids[1]) { - list = _roam_sphere_get_leaves(tri->kids[0], list); - list = _roam_sphere_get_leaves(tri->kids[1], list); + if (all) list = g_list_prepend(list, tri); + list = _roam_sphere_get_leaves(tri->kids[0], list, all); + list = _roam_sphere_get_leaves(tri->kids[1], list, all); return list; } else { return g_list_append(list, tri); } } static GList *_roam_sphere_get_intersect_rec(RoamTriangle *tri, GList *list, - gdouble n, gdouble s, gdouble e, gdouble w) + gboolean all, gdouble n, gdouble s, gdouble e, gdouble w) { gdouble tn = tri->edge.n; gdouble ts = tri->edge.s; @@ -632,12 +633,14 @@ static GList *_roam_sphere_get_intersect_rec(RoamTriangle *tri, GList *list, } else if (tn < n && ts > s && te < e && tw > w) { /* Triangle is completely contained */ if (debug) g_message("contained"); - return _roam_sphere_get_leaves(tri, list); + if (all) list = g_list_prepend(list, tri); + return _roam_sphere_get_leaves(tri, list, all); } else if (tri->kids[0] && tri->kids[1]) { /* Paritial intersect with children */ if (debug) g_message("edge w/ child"); - list = _roam_sphere_get_intersect_rec(tri->kids[0], list, n, s, e, w); - list = _roam_sphere_get_intersect_rec(tri->kids[1], list, n, s, e, w); + if (all) list = g_list_prepend(list, tri); + list = _roam_sphere_get_intersect_rec(tri->kids[0], list, all, n, s, e, w); + list = _roam_sphere_get_intersect_rec(tri->kids[1], list, all, n, s, e, w); return list; } else { /* This triangle is an edge case */ @@ -645,7 +648,7 @@ static GList *_roam_sphere_get_intersect_rec(RoamTriangle *tri, GList *list, return g_list_append(list, tri); } } -GList *roam_sphere_get_intersect(RoamSphere *self, +GList *roam_sphere_get_intersect(RoamSphere *self, gboolean all, gdouble n, gdouble s, gdouble e, gdouble w) { /* I think this is correct.. @@ -655,7 +658,7 @@ GList *roam_sphere_get_intersect(RoamSphere *self, GList *list = NULL; for (int i = 0; i < G_N_ELEMENTS(self->roots); i++) list = _roam_sphere_get_intersect_rec(self->roots[i], - list, n, s, e, w); + list, all, n, s, e, w); return list; } void roam_sphere_free_tri(RoamTriangle *tri) diff --git a/src/roam.h b/src/roam.h index 815390f..492ab39 100644 --- a/src/roam.h +++ b/src/roam.h @@ -124,7 +124,7 @@ void roam_sphere_merge_one(RoamSphere *sphere); gint roam_sphere_split_merge(RoamSphere *sphere); void roam_sphere_draw(RoamSphere *sphere); void roam_sphere_draw_normals(RoamSphere *sphere); -GList *roam_sphere_get_intersect(RoamSphere *sphere, +GList *roam_sphere_get_intersect(RoamSphere *sphere, gboolean all, gdouble n, gdouble s, gdouble e, gdouble w); void roam_sphere_free(RoamSphere *sphere); -- 2.43.2