X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=Scenery%2Ftilemgr.cxx;h=fa70e32c0c15e4d890df07fe71b043be913a9ec1;hb=e33dbca8149be986b05c5a25e0b8dff4b0b771b4;hp=3f715114c4946e4e465131f1c5da3f5a0f6ad787;hpb=f4ddd8811d97363815a451916bd6d443ccd5e920;p=flightgear.git diff --git a/Scenery/tilemgr.cxx b/Scenery/tilemgr.cxx index 3f715114c..fa70e32c0 100644 --- a/Scenery/tilemgr.cxx +++ b/Scenery/tilemgr.cxx @@ -322,6 +322,111 @@ static int viewable( fgPoint3d *cp, double radius ) { } +// Determine scenery altitude. Normally this just happens when we +// render the scene, but we'd also like to be able to do this +// explicitely. lat & lon are in radians. abs_view_pos in meters. +// Returns result in meters. +double fgTileMgrCurElev( double lon, double lat, fgPoint3d *abs_view_pos ) { + fgTILECACHE *c; + fgTILE *t; + // fgVIEW *v; + fgFRAGMENT *frag_ptr; + fgBUCKET p; + fgPoint3d earth_center, result; + fgPoint3d pp; + MAT3vec local_up; + list < fgFRAGMENT > :: iterator current; + list < fgFRAGMENT > :: iterator last; + double dist, min_dist, lat_geod, alt, sea_level_r; + double x, y, z; + int index, tile_diameter, i; + + c = &global_tile_cache; + // v = ¤t_view; + + local_up[0] = abs_view_pos->x; + local_up[1] = abs_view_pos->y; + local_up[2] = abs_view_pos->z; + + tile_diameter = current_options.get_tile_diameter(); + + // Find current translation offset + fgBucketFind(lon * RAD_TO_DEG, lat * RAD_TO_DEG, &p); + index = c->Exists(&p); + t = c->GetTile(index); + + scenery.next_center.x = t->center.x; + scenery.next_center.y = t->center.y; + scenery.next_center.z = t->center.z; + + earth_center.x = 0.0; + earth_center.y = 0.0; + earth_center.z = 0.0; + + fgPrintf( FG_TERRAIN, FG_DEBUG, + "Pos = (%.2f, %.2f) Current bucket = %d %d %d %d Index = %ld\n", + lon * RAD_TO_DEG, lat * RAD_TO_DEG, + p.lon, p.lat, p.x, p.y, fgBucketGenIndex(&p) ); + + // traverse the potentially viewable tile list + for ( i = 0; i < (tile_diameter * tile_diameter); i++ ) { + index = tiles[i]; + // fgPrintf( FG_TERRAIN, FG_DEBUG, "Index = %d\n", index); + t = c->GetTile(index); + + // calculate tile offset + x = (t->offset.x = t->center.x - scenery.center.x); + y = (t->offset.y = t->center.y - scenery.center.y); + z = (t->offset.z = t->center.z - scenery.center.z); + + // calc current terrain elevation calculate distance from + // vertical tangent line at current position to center of + // tile. + + /* printf("distance squared = %.2f, bounding radius = %.2f\n", + point_line_dist_squared(&(t->offset), &(v->view_pos), + v->local_up), t->bounding_radius); */ + + dist = point_line_dist_squared( &(t->center), abs_view_pos, + local_up ); + if ( dist < FG_SQUARE(t->bounding_radius) ) { + + // traverse fragment list for tile + current = t->fragment_list.begin(); + last = t->fragment_list.end(); + + while ( current != last ) { + frag_ptr = &(*current); + current++; + /* printf("distance squared = %.2f, bounding radius = %.2f\n", + point_line_dist_squared( &(frag_ptr->center), + &abs_view_pos), local_up), + frag_ptr->bounding_radius); */ + + dist = point_line_dist_squared( &(frag_ptr->center), + abs_view_pos, local_up); + if ( dist <= FG_SQUARE(frag_ptr->bounding_radius) ) { + if ( frag_ptr->intersect( abs_view_pos, + &earth_center, 0, &result ) ) { + // compute geocentric coordinates of tile center + pp = fgCartToPolar3d(result); + // convert to geodetic coordinates + fgGeocToGeod(pp.lat, pp.radius, &lat_geod, + &alt, &sea_level_r); + // printf("alt = %.2f\n", alt); + // exit since we found an intersection + return(alt); + } + } + } + } + } + + printf("no terrain intersection found\n"); + return(0); +} + + // Render the local tiles void fgTileMgrRender( void ) { fgTILECACHE *c; @@ -572,6 +677,11 @@ void fgTileMgrRender( void ) { // $Log$ +// Revision 1.30 1998/08/22 14:49:59 curt +// Attempting to iron out seg faults and crashes. +// Did some shuffling to fix a initialization order problem between view +// position, scenery elevation. +// // Revision 1.29 1998/08/20 15:12:06 curt // Used a forward declaration of classes fgTILE and fgMATERIAL to eliminate // the need for "void" pointers and casts.