From 3a3210a2de7625ff13a452624e782f8dafff41f9 Mon Sep 17 00:00:00 2001 From: curt Date: Wed, 7 Jan 1998 23:50:01 +0000 Subject: [PATCH] "area" renamed to "tile" --- Scenery/areamgr.c | 291 --------------------------- Scenery/tilemgr.c | 77 +++++++ Scenery/tilemgr.h | 42 ++++ Scenery/{areautils.c => tileutils.c} | 56 +++--- Scenery/{areautils.h => tileutils.h} | 33 +-- 5 files changed, 164 insertions(+), 335 deletions(-) delete mode 100644 Scenery/areamgr.c create mode 100644 Scenery/tilemgr.c create mode 100644 Scenery/tilemgr.h rename Scenery/{areautils.c => tileutils.c} (83%) rename Scenery/{areautils.h => tileutils.h} (63%) diff --git a/Scenery/areamgr.c b/Scenery/areamgr.c deleted file mode 100644 index 3491c26d1..000000000 --- a/Scenery/areamgr.c +++ /dev/null @@ -1,291 +0,0 @@ -/************************************************************************** - * areamgr.c -- routines to handle dynamic management of scenery areas - * - * Written by Curtis Olson, started October 1997. - * - * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * (Log is kept at end of this file) - **************************************************************************/ - - -#ifdef WIN32 -# include -#endif - -#include -#include "../XGL/xgl.h" - -#include - -#include "../Include/constants.h" -/* temporary */ -#include "../Math/fg_random.h" - - -struct ai { - int lon; /* longitude (-180 to 179) */ - int lat; /* latitude (-90 to 89) */ - int x; /* x (0 to 7) */ - int y; /* y (0 to 7) */ -}; - - -/* we're entering into hacking territory here ... what fun. ;-) */ -long int area_array[7][7]; - - -/* Generate the unique scenery area index containing the specified - lon/lat parameters. - - The index is constructed as follows: - - 9 bits - to represent 360 degrees of longitude (-180 to 179) - 8 bits - to represent 180 degrees of latitude (-90 to 89) - - Each 1 degree by 1 degree area is further broken down into an 8x8 - grid. So we also need: - - 3 bits - to represent x (0 to 7) - 3 bits - to represent y (0 to 7) */ -static long gen_index(struct ai *p) { - long index = 0; - - index = ((p->lon + 180) << 14) + ((p->lat + 90) << 6) + (p->y << 3) + p->x; - /* printf(" generated index = %ld\n", index); */ - - return(index); -} - - -/* Parse a unique scenery area index and find the lon, lat, x, and y */ -static void parse_index(long int index, struct ai *p) { - p->lon = index >> 14; - index -= p->lon << 14; - p->lon -= 180; - - p->lat = index >> 6; - index -= p->lat << 6; - p->lat -= 90; - - p->y = index >> 3; - index -= p->y << 3; - - p->x = index; -} - - -/* Build a path name from an area index */ -static void gen_path(long int index, char *path) { - struct ai p; - int top_lon, top_lat, main_lon, main_lat; - char hem, pole; - - parse_index(index, &p); - - path[0] = '\0'; - - top_lon = p.lon / 10; - main_lon = p.lon; - if ( (p.lon < 0) && (top_lon * 10 != p.lon) ) { - top_lon -= 1; - main_lon -= 1; - } - top_lon *= 10; - if ( top_lon >= 0 ) { - hem = 'e'; - } else { - hem = 'w'; - top_lon *= -1; - } - if ( main_lon < 0 ) { - main_lon *= -1; - } - - top_lat = p.lat / 10; - main_lat = p.lat; - if ( (p.lat < 0) && (top_lat * 10 != p.lat) ) { - top_lat -= 1; - main_lat -= 1; - } - top_lat *= 10; - if ( top_lat >= 0 ) { - pole = 'n'; - } else { - pole = 's'; - top_lat *= -1; - } - if ( main_lat < 0 ) { - main_lat *= -1; - } - - sprintf(path, "%c%03d%c%03d/%c%03d%c%03d/%ld.ter", - hem, top_lon, pole, top_lat, - hem, main_lon, pole, main_lat, - index); -} - - -/* offset an ai struct by the specified amounts in the X & Y direction */ -static void offset_ai(struct ai *in, struct ai *out, int x, int y) { - int diff, temp; - int dist_lat; - - out->lon = in->lon; - out->lat = in->lat; - out->x = in->x; - out->y = in->y; - - /* do X direction */ - diff = out->x + x; - /* printf(" reducing x (%d)\n", diff); */ - if ( diff >= 0 ) { - temp = diff / 8; - } else if ( diff < -7 ) { - temp = (diff + 1) / 8 - 1; - } else { - temp = diff / 8 - 1; - } - out->x = ((diff % 8) + 8) % 8; - out->lon = ( (out->lon + 180 + 360 + temp) % 360 ) - 180; - - /* do Y direction */ - diff = out->y + y; - /* printf(" reducing x (%d)\n", diff); */ - if ( diff >= 0 ) { - temp = diff / 8; - } else if ( diff < -7 ) { - temp = (diff + 1) / 8 - 1; - } else { - temp = diff / 8 - 1; - } - out->y = ((diff % 8) + 8) % 8; - out->lat = out->lat + temp; - - if ( out->lat >= 90 ) { - dist_lat = out->lat - 90; - /* printf(" +lat = %d +y = %d\n", dist_lat, out->y); */ - - out->lat = 90 - (dist_lat + 1); - out->lon = ( (out->lon + 180 + 180) % 360 ) - 180; - out->y = 7 - out->y; - } - - if ( out->lat < -90 ) { - dist_lat = -90 - out->lat; - /* printf(" +lat = %d +y = %d\n", dist_lat, out->y); */ - - out->lat = -90 + (dist_lat - 1); - out->lon = ( (out->lon + 180 + 180) % 360 ) - 180; - out->y = 7 - out->y; - } -} - - -/* Given a lat/lon, fill in the local area index array */ -static void gen_idx_array(double lon, double lat) { - struct ai p1, p2, p3; - double diff; - char path[256]; - long int index = 0; - int i, j; - - printf("lon = %.2f lat = %.2f\n", lon, lat); - - diff = lon - (double)(int)lon; - printf("diff = %.2f\n", diff); - if ( (lon >= 0) || (fabs(diff) < FG_EPSILON) ) { - p1.lon = (int)lon; - } else { - p1.lon = (int)lon - 1; - } - printf(" p1.lon = %d\n", p1.lon); - - diff = lat - (double)(int)lat; - printf("diff = %.2f\n", diff); - if ( (lat >= 0) || (fabs(diff) < FG_EPSILON) ) { - p1.lat = (int)lat; - } else { - p1.lat = (int)lat - 1; - } - printf(" p1.lat = %d\n", p1.lat); - - p1.x = (lon - p1.lon) * 8; - p1.y = (lat - p1.lat) * 8; - printf(" lon,lat = %d,%d x,y index = %d,%d\n", - p1.lon, p1.lat, p1.x, p1.y); - - for ( i = -3; i <= 3; i++ ) { - for ( j = -3; j <= 3; j++ ) { - offset_ai(&p1, &p2, i, j); - printf(" %d %d %d %d\n", p2.lon, p2.lat, p2.x, p2.y); - area_array[i][j] = gen_index(&p2); - printf(" generated index = %ld\n", area_array[i][j]); - - /* parse_index(area_array[i][j], &p3); */ - /* printf(" %d %d %d %d\n", p3.lon, p3.lat, p3.x, p3.y); */ - gen_path(area_array[i][j], path); - printf(" path = %s\n\n", path); - } - } -} - - -main() { - struct ai p1; - int i, j, index; - double lon, lat; - - fg_srandom(); - - p1.lon = 180; - p1.lat = 90; - p1.x = 7; - p1.y = 7; - - /* printf("Max index = %ld\n", gen_index(&p1)); */ - - lon = -50.0; - lat = -50.0; - gen_idx_array(lon, lat); - - lon = 50.0; - lat = 50.0; - gen_idx_array(lon, lat); - - for ( i = 0; i < 100; i++ ) { - lon = ( 360.0 * fg_random() ) - 180.0; - lat = ( 180.0 * fg_random() ) - 90.0; - - gen_idx_array(lon, lat); - } -} - - -/* $Log$ -/* Revision 1.2 1998/01/07 03:29:29 curt -/* Given an arbitrary lat/lon, we can now: -/* generate a unique index for the chunk containing the lat/lon -/* generate a path name to the chunk file -/* build a list of the indexes of all the nearby areas. -/* - * Revision 1.1 1998/01/07 02:05:48 curt - * Initial revision. - * */ - - diff --git a/Scenery/tilemgr.c b/Scenery/tilemgr.c new file mode 100644 index 000000000..d2ce0b359 --- /dev/null +++ b/Scenery/tilemgr.c @@ -0,0 +1,77 @@ +/************************************************************************** + * tilemgr.c -- routines to handle dynamic management of scenery tiles + * + * Written by Curtis Olson, started January 1998. + * + * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#ifdef WIN32 +# include +#endif + +#include +#include "../XGL/xgl.h" + +#include "tileutils.h" + +#include "../Aircraft/aircraft.h" + + +/* here's where we keep the array of closest (potentially viewable) tiles */ +static long int tile[49]; + + +/* Initialize the Tile Manager subsystem */ +void fgTileMgrInit() { + printf("Initializing Tile Manager subsystem.\n"); + /* fgTileCacheInit(); */ +} + + +/* given the current lon/lat, fill in the array of local chunks. If + * the chunk isn't already in the cache, then read it from disk. */ +void fgTileMgrUpdate() { + struct fgFLIGHT *f; + struct bucket p; + + f = ¤t_aircraft.flight; + + find_bucket(FG_Longitude, FG_Latitude, &p); + gen_idx_array(&p, tile, 7, 7); +} + + +/* $Log$ +/* Revision 1.1 1998/01/07 23:50:51 curt +/* "area" renamed to "tile" +/* + * Revision 1.2 1998/01/07 03:29:29 curt + * Given an arbitrary lat/lon, we can now: + * generate a unique index for the chunk containing the lat/lon + * generate a path name to the chunk file + * build a list of the indexes of all the nearby areas. + * + * Revision 1.1 1998/01/07 02:05:48 curt + * Initial revision. + * */ + + diff --git a/Scenery/tilemgr.h b/Scenery/tilemgr.h new file mode 100644 index 000000000..23d208bd1 --- /dev/null +++ b/Scenery/tilemgr.h @@ -0,0 +1,42 @@ +/************************************************************************** + * tilemgr.h -- routines to handle dynamic management of scenery tiles + * + * Written by Curtis Olson, started January 1998. + * + * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +/* Initialize the Tile Manager subsystem */ +void fgTileMgrInit(); + + +/* given the current lon/lat, fill in the array of local chunks. If + * the chunk isn't already in the cache, then read it from disk. */ +void fgTileMgrUpdate(); + + +/* $Log$ +/* Revision 1.1 1998/01/07 23:50:51 curt +/* "area" renamed to "tile" +/* + * */ + + diff --git a/Scenery/areautils.c b/Scenery/tileutils.c similarity index 83% rename from Scenery/areautils.c rename to Scenery/tileutils.c index 533ad5859..c4ac1eee1 100644 --- a/Scenery/areautils.c +++ b/Scenery/tileutils.c @@ -1,5 +1,5 @@ /************************************************************************** - * areautils.c -- support routines to handle dynamic management of scenery areas + * tileutils.c -- support routines to handle dynamic management of scenery tiles * * Written by Curtis Olson, started January 1998. * @@ -24,20 +24,14 @@ **************************************************************************/ -#ifdef WIN32 -# include -#endif - -#include -#include "../XGL/xgl.h" - #include +#include -#include "areautils.h" +#include "tileutils.h" #include "../Include/constants.h" -/* Generate the unique scenery area index containing the specified +/* Generate the unique scenery tile index containing the specified lon/lat parameters. The index is constructed as follows: @@ -45,7 +39,7 @@ 9 bits - to represent 360 degrees of longitude (-180 to 179) 8 bits - to represent 180 degrees of latitude (-90 to 89) - Each 1 degree by 1 degree area is further broken down into an 8x8 + Each 1 degree by 1 degree tile is further broken down into an 8x8 grid. So we also need: 3 bits - to represent x (0 to 7) @@ -60,7 +54,7 @@ static long gen_index(struct bucket *p) { } -/* Parse a unique scenery area index and find the lon, lat, x, and y */ +/* Parse a unique scenery tile index and find the lon, lat, x, and y */ static void parse_index(long int index, struct bucket *p) { p->lon = index >> 14; index -= p->lon << 14; @@ -77,8 +71,8 @@ static void parse_index(long int index, struct bucket *p) { } -/* Build a path name from an area index */ -static void gen_path(long int index, char *path) { +/* Build a path name from an tile index */ +void gen_path(long int index, char *path) { struct bucket p; int top_lon, top_lat, main_lon, main_lat; char hem, pole; @@ -184,8 +178,8 @@ static void offset_bucket(struct bucket *in, struct bucket *out, int x, int y) { } -/* Given a lat/lon, find the "bucket" or area that it falls within */ -static void find_bucket(double lon, double lat, struct bucket *p) { +/* Given a lat/lon, find the "bucket" or tile that it falls within */ +void find_bucket(double lon, double lat, struct bucket *p) { double diff; diff = lon - (double)(int)lon; @@ -213,8 +207,8 @@ static void find_bucket(double lon, double lat, struct bucket *p) { } -/* Given a lat/lon, fill in the local area index array */ -static void gen_idx_array(struct bucket *p1, long int *area, +/* Given a lat/lon, fill in the local tile index array */ +void gen_idx_array(struct bucket *p1, long int *tile, int width, int height) { struct bucket p2; int dw, dh, i, j; @@ -224,17 +218,18 @@ static void gen_idx_array(struct bucket *p1, long int *area, for ( j = 0; j < height; j++ ) { for ( i = 0; i < width; i++ ) { offset_bucket(p1, &p2, i - dw, j - dh); - area[(j*width)+i] = gen_index(&p2); + tile[(j*width)+i] = gen_index(&p2); printf(" bucket = %d %d %d %d index = %ld\n", - p2.lon, p2.lat, p2.x, p2.y, area[(j*width)+i]); + p2.lon, p2.lat, p2.x, p2.y, tile[(j*width)+i]); } } } +/* sample main for testing int main() { struct bucket p1; - long int area[49]; + long int tile[49]; char path[256]; double lon, lat; int i, j; @@ -244,15 +239,15 @@ int main() { p1.x = 7; p1.y = 7; - /* printf("Max index = %ld\n", gen_index(&p1)); */ + printf("Max index = %ld\n", gen_index(&p1)); lon = -50.0; lat = -50.0; find_bucket(lon, lat, &p1); - gen_idx_array(&p1, area, 7, 7); + gen_idx_array(&p1, tile, 7, 7); for ( j = 0; j < 7; j++ ) { for ( i = 0; i < 7; i++ ) { - gen_path(area[(j*7)+i], path); + gen_path(tile[(j*7)+i], path); printf(" path = %s\n", path); } } @@ -260,22 +255,25 @@ int main() { lon = 50.0; lat = 50.0; find_bucket(lon, lat, &p1); - gen_idx_array(&p1, area, 7, 7); + gen_idx_array(&p1, tile, 7, 7); for ( j = 0; j < 7; j++ ) { for ( i = 0; i < 7; i++ ) { - gen_path(area[(j*7)+i], path); + gen_path(tile[(j*7)+i], path); printf(" path = %s\n", path); } } return(1); -} +} */ /* $Log$ -/* Revision 1.1 1998/01/07 23:23:40 curt -/* Initial revision. +/* Revision 1.1 1998/01/07 23:50:52 curt +/* "area" renamed to "tile" /* + * Revision 1.1 1998/01/07 23:23:40 curt + * Initial revision. + * * */ diff --git a/Scenery/areautils.h b/Scenery/tileutils.h similarity index 63% rename from Scenery/areautils.h rename to Scenery/tileutils.h index 7a14df242..14374c5a3 100644 --- a/Scenery/areautils.h +++ b/Scenery/tileutils.h @@ -1,5 +1,5 @@ /************************************************************************** - * areautils.h -- support routines to handle dynamic management of scenery areas + * tileutils.h -- support routines to handle dynamic management of scenery tiles * * Written by Curtis Olson, started January 1998. * @@ -32,7 +32,7 @@ struct bucket { }; -/* Generate the unique scenery area index containing the specified +/* Generate the unique scenery tile index containing the specified lon/lat parameters. The index is constructed as follows: @@ -40,39 +40,42 @@ struct bucket { 9 bits - to represent 360 degrees of longitude (-180 to 179) 8 bits - to represent 180 degrees of latitude (-90 to 89) - Each 1 degree by 1 degree area is further broken down into an 8x8 + Each 1 degree by 1 degree tile is further broken down into an 8x8 grid. So we also need: 3 bits - to represent x (0 to 7) 3 bits - to represent y (0 to 7) */ -static long gen_index(struct bucket *p); +/* static long gen_index(struct bucket *p); */ -/* Parse a unique scenery area index and find the lon, lat, x, and y */ -static void parse_index(long int index, struct bucket *p); +/* Parse a unique scenery tile index and find the lon, lat, x, and y */ +/* static void parse_index(long int index, struct bucket *p); */ -/* Build a path name from an area index */ -static void gen_path(long int index, char *path); +/* Build a path name from an tile index */ +void gen_path(long int index, char *path); /* offset an bucket struct by the specified amounts in the X & Y direction */ -static void offset_bucket(struct bucket *in, struct bucket *out, int x, int y); +/* static void offset_bucket(struct bucket *in, struct bucket *out, int x, int y); */ -/* Given a lat/lon, find the "bucket" or area that it falls within */ -static void find_bucket(double lon, double lat, struct bucket *p); +/* Given a lat/lon, find the "bucket" or tile that it falls within */ +void find_bucket(double lon, double lat, struct bucket *p); -/* Given a lat/lon, fill in the local area index array */ -static void gen_idx_array(struct bucket *p1, long int *area, +/* Given a lat/lon, fill in the local tile index array */ +void gen_idx_array(struct bucket *p1, long int *tile, int width, int height); /* $Log$ -/* Revision 1.1 1998/01/07 23:23:40 curt -/* Initial revision. +/* Revision 1.1 1998/01/07 23:50:52 curt +/* "area" renamed to "tile" /* + * Revision 1.1 1998/01/07 23:23:40 curt + * Initial revision. + * * */ -- 2.39.2