X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fobjects%2Fgrits-tile.c;h=75ce3a02ff5201f4d51778bc2754437c8b09d139;hb=27b837a6b4de2af4b749d2d859d3467b97e2dbf4;hp=cba5b7579eec9f16cef3a51715ac3a07d439ba45;hpb=b17ac2ecee76552feed27813f08d1e7087f26c6c;p=grits diff --git a/src/objects/grits-tile.c b/src/objects/grits-tile.c index cba5b75..75ce3a0 100644 --- a/src/objects/grits-tile.c +++ b/src/objects/grits-tile.c @@ -215,14 +215,17 @@ void grits_tile_update(GritsTile *tile, GritsPoint *eye, return; } - /* Need more resolution, split tile and update recursively */ - if (!tile->children[0][0]) { - switch (tile->proj) { - case GRITS_PROJ_LATLON: _grits_tile_split_latlon(tile); break; - case GRITS_PROJ_MERCATOR: _grits_tile_split_mercator(tile); break; + /* Split tile if needed */ + grits_tile_foreach(tile, child) { + if (child == NULL) { + switch (tile->proj) { + case GRITS_PROJ_LATLON: _grits_tile_split_latlon(tile); break; + case GRITS_PROJ_MERCATOR: _grits_tile_split_mercator(tile); break; + } } } + /* Update recursively */ grits_tile_foreach(tile, child) { GRITS_OBJECT(child)->hidden = FALSE; grits_tile_update(child, eye, res, width, height, @@ -430,7 +433,13 @@ static void grits_tile_draw_one(GritsTile *tile, GritsOpenGL *opengl, GList *tri glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, grits_tile_mask); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + /* Hack to show maps tiles with better color */ + float material_emission[] = {0.5, 0.5, 0.5, 1.0}; + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, material_emission); + + glEnable(GL_BLEND); } /* Draw triangle */ @@ -447,29 +456,38 @@ static void grits_tile_draw_one(GritsTile *tile, GritsOpenGL *opengl, GList *tri } /* Draw the tile */ -static void grits_tile_draw_rec(GritsTile *tile, GritsOpenGL *opengl) +static gboolean grits_tile_draw_rec(GritsTile *tile, GritsOpenGL *opengl) { if (!tile || !tile->data || GRITS_OBJECT(tile)->hidden) - return; + return FALSE; - /* Only draw children if possible */ - gboolean has_all_children = TRUE; - GritsTile *child; - grits_tile_foreach(tile, child) - if (!child || !child->data || GRITS_OBJECT(child)->hidden) - has_all_children = FALSE; - - /* Draw parent tile underneath */ - if (!has_all_children) { - GList *triangles = roam_sphere_get_intersect(opengl->sphere, FALSE, - tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w); - grits_tile_draw_one(tile, opengl, triangles); - g_list_free(triangles); - } + GritsTile *child = NULL; + gboolean done = FALSE; + while (!done) { + /* Only draw children if possible */ + gboolean draw_parent = FALSE; + grits_tile_foreach(tile, child) + if (!child || !child->data || GRITS_OBJECT(child)->hidden) + draw_parent = TRUE; + + /* Draw parent tile underneath */ + if (draw_parent) { + GList *triangles = roam_sphere_get_intersect(opengl->sphere, FALSE, + tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w); + grits_tile_draw_one(tile, opengl, triangles); + g_list_free(triangles); + } - /* Draw child tiles */ - grits_tile_foreach(tile, child) - grits_tile_draw_rec(child, opengl); + /* Draw child tiles */ + gboolean drew_all_children = TRUE; + grits_tile_foreach(tile, child) + if (!grits_tile_draw_rec(child, opengl)) + drew_all_children = FALSE; + + /* Check if tiles were hidden by a thread while drawing */ + done = draw_parent || drew_all_children; + } + return TRUE; } static void grits_tile_draw(GritsObject *tile, GritsOpenGL *opengl) @@ -477,7 +495,7 @@ static void grits_tile_draw(GritsObject *tile, GritsOpenGL *opengl) glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.5); + glAlphaFunc(GL_GREATER, 0.1); grits_tile_draw_rec(GRITS_TILE(tile), opengl); }