1
0
Fork 0

Initial changes to support loading and management of scenery tiles. Note,

there's still a fair amount of work left to be done.
This commit is contained in:
curt 1998-01-13 00:23:08 +00:00
parent 3cead5c91d
commit 0f64d76c81
11 changed files with 191 additions and 77 deletions

View file

@ -283,7 +283,8 @@ static void fgRenderFrame( void ) {
/* set lighting parameters */
xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_ambient );
xglLightfv(GL_LIGHT0, GL_DIFFUSE, l->scene_diffuse );
fgSceneryRender();
fgTileMgrRender();
/* fgSceneryRender(); */
/* display HUD */
if( show_hud ) {
@ -516,7 +517,7 @@ static void fgMainLoop( void ) {
/* fgAircraftOutputCurrent(a); */
/* see if we need to load any new scenery tiles */
fgTileMgrUpdate();
/* fgTileMgrUpdate(); */
/* Process/manage pending events */
fgEventProcess();
@ -632,9 +633,13 @@ int main( int argc, char *argv[] ) {
/* $Log$
/* Revision 1.46 1998/01/08 02:22:06 curt
/* Beginning to integrate Tile management subsystem.
/* Revision 1.47 1998/01/13 00:23:08 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.46 1998/01/08 02:22:06 curt
* Beginning to integrate Tile management subsystem.
*
* Revision 1.45 1998/01/07 03:18:55 curt
* Moved astronomical stuff from .../Src/Scenery to .../Src/Astro/
*

View file

@ -122,6 +122,12 @@ void fgInitSubsystems( void ) {
/* FG_Latitude = ( 119548.21 / 3600.0 ) * DEG_TO_RAD; */
/* FG_Altitude = 0.0 + 3.758099; */
/* Initial Posisition near where I used to live in Globe, AZ */
/* FG_Longitude = ( -398757.6 / 3600.0 ) * DEG_TO_RAD; */
/* FG_Latitude = ( 120160.0 / 3600.0 ) * DEG_TO_RAD; */
/* FG_Runway_altitude = 5000.0; */
/* FG_Altitude = FG_Runway_altitude + 3.758099; */
/* Initial Position: 10125 Jewell St. NE */
/* FG_Longitude = ( -93.15 ) * DEG_TO_RAD; */
/* FG_Latitude = ( 45.15 ) * DEG_TO_RAD; */
@ -130,6 +136,7 @@ void fgInitSubsystems( void ) {
/* A random test position */
/* FG_Longitude = ( 88128.00 / 3600.0 ) * DEG_TO_RAD; */
/* FG_Latitude = ( 93312.00 / 3600.0 ) * DEG_TO_RAD; */
FG_Runway_altitude = 4000.0;
FG_Altitude = FG_Runway_altitude + 3.758099;
@ -225,11 +232,12 @@ void fgInitSubsystems( void ) {
/* Initialize the Scenery Management subsystem */
fgTileMgrInit();
fgSceneryInit();
/* fgSceneryInit(); */
/* Tell the Scenery Management system where we are so it can load
* the correct scenery data */
fgSceneryUpdate(FG_Latitude, FG_Longitude, FG_Altitude);
fgTileMgrUpdate();
/* fgSceneryUpdate(FG_Latitude, FG_Longitude, FG_Altitude); */
/* I'm just sticking this here for now, it should probably move
* eventually */
@ -269,9 +277,13 @@ void fgInitSubsystems( void ) {
/* $Log$
/* Revision 1.29 1998/01/08 02:22:08 curt
/* Beginning to integrate Tile management subsystem.
/* Revision 1.30 1998/01/13 00:23:09 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.29 1998/01/08 02:22:08 curt
* Beginning to integrate Tile management subsystem.
*
* Revision 1.28 1998/01/07 03:18:58 curt
* Moved astronomical stuff from .../Src/Scenery to .../Src/Astro/
*

View file

@ -69,8 +69,8 @@ void fgViewUpdate(struct fgFLIGHT *f, struct fgVIEW *v, struct fgLIGHT *l) {
v->view_pos.y -= scenery.center.y;
v->view_pos.z -= scenery.center.z;
/* printf("View pos = %.4f, %.4f, %.4f\n",
v->view_pos.x, v->view_pos.y, v->view_pos.z); */
printf("View pos = %.4f, %.4f, %.4f\n",
v->view_pos.x, v->view_pos.y, v->view_pos.z);
/* make a vector to the current view position */
MAT3_SET_VEC(v0, v->view_pos.x, v->view_pos.y, v->view_pos.z);
@ -182,9 +182,13 @@ void fgViewUpdate(struct fgFLIGHT *f, struct fgVIEW *v, struct fgLIGHT *l) {
/* $Log$
/* Revision 1.8 1997/12/30 22:22:33 curt
/* Further integration of event manager.
/* Revision 1.9 1998/01/13 00:23:09 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.8 1997/12/30 22:22:33 curt
* Further integration of event manager.
*
* Revision 1.7 1997/12/30 20:47:45 curt
* Integrated new event manager with subsystem initializations.
*

View file

@ -63,10 +63,9 @@ void calc_normal(float p1[3], float p2[3], float p3[3], double normal[3])
/* Load a .obj file and generate the GL call list */
GLint fgObjLoad(char *path) {
GLint fgObjLoad(char *path, struct fgCartesianPoint *ref) {
char line[256], winding_str[256];
double v1[3], v2[3], approx_normal[3], normal[3], dot_prod, scale, temp;
struct fgCartesianPoint ref;
GLint area;
FILE *f;
int first, ncount, vncount, n1, n2, n3, n4;
@ -76,7 +75,8 @@ GLint fgObjLoad(char *path) {
if ( (f = fopen(path, "r")) == NULL ) {
printf("Cannot open file: %s\n", path);
exit(-1);
/* exit(-1); */
return(0);
}
area = xglGenLists(1);
@ -99,10 +99,10 @@ GLint fgObjLoad(char *path) {
&nodes[ncount][0], &nodes[ncount][1], &nodes[ncount][2]);
if ( ncount == 1 ) {
/* first node becomes the reference point */
ref.x = nodes[ncount][0];
ref.y = nodes[ncount][1];
ref.z = nodes[ncount][2];
scenery.center = ref;
ref->x = nodes[ncount][0];
ref->y = nodes[ncount][1];
ref->z = nodes[ncount][2];
/* scenery.center = ref; */
}
ncount++;
} else {
@ -166,18 +166,18 @@ GLint fgObjLoad(char *path) {
if ( use_vertex_norms ) {
MAT3_SCALE_VEC(normal, normals[n1], scale);
xglNormal3dv(normal);
xglVertex3d(nodes[n1][0] - ref.x, nodes[n1][1] - ref.y,
nodes[n1][2] - ref.z);
xglVertex3d(nodes[n1][0] - ref->x, nodes[n1][1] - ref->y,
nodes[n1][2] - ref->z);
MAT3_SCALE_VEC(normal, normals[n2], scale);
xglNormal3dv(normal);
xglVertex3d(nodes[n2][0] - ref.x, nodes[n2][1] - ref.y,
nodes[n2][2] - ref.z);
xglVertex3d(nodes[n2][0] - ref->x, nodes[n2][1] - ref->y,
nodes[n2][2] - ref->z);
MAT3_SCALE_VEC(normal, normals[n3], scale);
xglNormal3dv(normal);
xglVertex3d(nodes[n3][0] - ref.x, nodes[n3][1] - ref.y,
nodes[n3][2] - ref.z);
xglVertex3d(nodes[n3][0] - ref->x, nodes[n3][1] - ref->y,
nodes[n3][2] - ref->z);
} else {
if ( odd ) {
calc_normal(nodes[n1], nodes[n2], nodes[n3], approx_normal);
@ -187,12 +187,12 @@ GLint fgObjLoad(char *path) {
MAT3_SCALE_VEC(normal, approx_normal, scale);
xglNormal3dv(normal);
xglVertex3d(nodes[n1][0] - ref.x, nodes[n1][1] - ref.y,
nodes[n1][2] - ref.z);
xglVertex3d(nodes[n2][0] - ref.x, nodes[n2][1] - ref.y,
nodes[n2][2] - ref.z);
xglVertex3d(nodes[n3][0] - ref.x, nodes[n3][1] - ref.y,
nodes[n3][2] - ref.z);
xglVertex3d(nodes[n1][0] - ref->x, nodes[n1][1] - ref->y,
nodes[n1][2] - ref->z);
xglVertex3d(nodes[n2][0] - ref->x, nodes[n2][1] - ref->y,
nodes[n2][2] - ref->z);
xglVertex3d(nodes[n3][0] - ref->x, nodes[n3][1] - ref->y,
nodes[n3][2] - ref->z);
}
odd = 1 - odd;
@ -207,8 +207,8 @@ GLint fgObjLoad(char *path) {
MAT3_SCALE_VEC(normal, approx_normal, scale);
}
xglNormal3dv(normal);
xglVertex3d(nodes[n4][0] - ref.x, nodes[n4][1] - ref.y,
nodes[n4][2] - ref.z);
xglVertex3d(nodes[n4][0] - ref->x, nodes[n4][1] - ref->y,
nodes[n4][2] - ref->z);
odd = 1 - odd;
last1 = n3;
@ -230,16 +230,16 @@ GLint fgObjLoad(char *path) {
sscanf(line, "f %d %d %d\n", &n1, &n2, &n3);
xglNormal3d(normals[n1][0], normals[n1][1], normals[n1][2]);
xglVertex3d(nodes[n1][0] - ref.x, nodes[n1][1] - ref.y,
nodes[n1][2] - ref.z);
xglVertex3d(nodes[n1][0] - ref->x, nodes[n1][1] - ref->y,
nodes[n1][2] - ref->z);
xglNormal3d(normals[n2][0], normals[n2][1], normals[n2][2]);
xglVertex3d(nodes[n2][0] - ref.x, nodes[n2][1] - ref.y,
nodes[n2][2] - ref.z);
xglVertex3d(nodes[n2][0] - ref->x, nodes[n2][1] - ref->y,
nodes[n2][2] - ref->z);
xglNormal3d(normals[n3][0], normals[n3][1], normals[n3][2]);
xglVertex3d(nodes[n3][0] - ref.x, nodes[n3][1] - ref.y,
nodes[n3][2] - ref.z);
xglVertex3d(nodes[n3][0] - ref->x, nodes[n3][1] - ref->y,
nodes[n3][2] - ref->z);
} else if ( line[0] == 'q' ) {
/* continue a triangle strip */
n1 = n2 = 0;
@ -263,8 +263,8 @@ GLint fgObjLoad(char *path) {
xglNormal3dv(normal);
}
xglVertex3d(nodes[n1][0] - ref.x, nodes[n1][1] - ref.y,
nodes[n1][2] - ref.z);
xglVertex3d(nodes[n1][0] - ref->x, nodes[n1][1] - ref->y,
nodes[n1][2] - ref->z);
odd = 1 - odd;
last1 = last2;
@ -288,8 +288,8 @@ GLint fgObjLoad(char *path) {
xglNormal3dv(normal);
}
xglVertex3d(nodes[n2][0] - ref.x, nodes[n2][1] - ref.y,
nodes[n2][2] - ref.z);
xglVertex3d(nodes[n2][0] - ref->x, nodes[n2][1] - ref->y,
nodes[n2][2] - ref->z);
odd = 1 -odd;
last1 = last2;
@ -307,12 +307,12 @@ GLint fgObjLoad(char *path) {
xglBegin(GL_LINES);
xglColor3f(0.0, 0.0, 0.0);
for ( i = 0; i < ncount; i++ ) {
xglVertex3d(nodes[i][0] - ref.x,
nodes[i][1] - ref.y,
nodes[i][2] - ref.z);
xglVertex3d(nodes[i][0] - ref.x + 500*normals[i][0],
nodes[i][1] - ref.y + 500*normals[i][1],
nodes[i][2] - ref.z + 500*normals[i][2]);
xglVertex3d(nodes[i][0] - ref->x,
nodes[i][1] - ref->y,
nodes[i][2] - ref->z);
xglVertex3d(nodes[i][0] - ref->x + 500*normals[i][0],
nodes[i][1] - ref->y + 500*normals[i][1],
nodes[i][2] - ref->z + 500*normals[i][2]);
}
xglEnd();
*/
@ -328,10 +328,14 @@ GLint fgObjLoad(char *path) {
/* $Log$
/* Revision 1.16 1997/12/30 23:09:40 curt
/* Worked on winding problem without luck, so back to calling glFrontFace()
/* 3 times for each scenery area.
/* Revision 1.17 1998/01/13 00:23:10 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.16 1997/12/30 23:09:40 curt
* Worked on winding problem without luck, so back to calling glFrontFace()
* 3 times for each scenery area.
*
* Revision 1.15 1997/12/30 20:47:51 curt
* Integrated new event manager with subsystem initializations.
*

View file

@ -34,16 +34,22 @@
#include <GL/glut.h>
#include "../Include/types.h"
/* Load a .obj file and generate the GL call list */
GLint fgObjLoad(char *file);
GLint fgObjLoad(char *file, struct fgCartesianPoint *ref);
#endif /* OBJ_H */
/* $Log$
/* Revision 1.1 1997/10/28 21:14:55 curt
/* Initial revision.
/* Revision 1.2 1998/01/13 00:23:10 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.1 1997/10/28 21:14:55 curt
* Initial revision.
*
*/

View file

@ -76,7 +76,7 @@ void fgSceneryUpdate(double lon, double lat, double elev) {
printf(" Loading Scenery: %s\n", path);
area_terrain = fgObjLoad(path);
area_terrain = fgObjLoad(path, &scenery.center);
}
@ -100,9 +100,13 @@ void fgSceneryRender() {
/* $Log$
/* Revision 1.30 1998/01/07 03:22:29 curt
/* Moved astro stuff to .../Src/Astro/
/* Revision 1.31 1998/01/13 00:23:11 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.30 1998/01/07 03:22:29 curt
* Moved astro stuff to .../Src/Astro/
*
* Revision 1.29 1997/12/30 20:47:52 curt
* Integrated new event manager with subsystem initializations.
*

View file

@ -31,14 +31,20 @@
#include <GL/glut.h>
#include "../XGL/xgl.h"
#include "scenery.h"
#include "tileutils.h"
#include "obj.h"
#include "../Aircraft/aircraft.h"
#include "../Include/constants.h"
#include "../Include/general.h"
#include "../Include/types.h"
/* here's where we keep the array of closest (potentially viewable) tiles */
static long int tile[49];
struct bucket local_tiles[49];
GLint local_display_lists[49];
struct fgCartesianPoint local_refs[49];
/* Initialize the Tile Manager subsystem */
@ -52,21 +58,73 @@ void fgTileMgrInit() {
* the chunk isn't already in the cache, then read it from disk. */
void fgTileMgrUpdate() {
struct fgFLIGHT *f;
struct fgGENERAL *g;
struct bucket p;
char base_path[256];
char file_name[256];
int i, j;
f = &current_aircraft.flight;
g = &general;
find_bucket(FG_Longitude * RAD_TO_DEG, FG_Latitude * RAD_TO_DEG, &p);
printf("Updating Tile list for %d,%d %d,%d\n", p.lon, p.lat, p.x, p.y);
gen_idx_array(&p, tile, 7, 7);
gen_idx_array(&p, local_tiles, 7, 7);
/* scenery.center = ref; */
for ( i = 0; i < 49; i++ ) {
gen_base_path(&local_tiles[i], base_path);
sprintf(file_name, "%s/Scenery/%s/%ld.obj",
g->root_dir, base_path, gen_index(&local_tiles[i]));
local_display_lists[i] =
fgObjLoad(file_name, &local_refs[i]);
if ( (local_tiles[i].lon == p.lon) &&
(local_tiles[i].lat == p.lat) &&
(local_tiles[i].x == p.x) &&
(local_tiles[i].y == p.y) ) {
scenery.center = local_refs[i];
}
}
}
/* Render the local tiles --- hack, hack, hack */
void fgTileMgrRender() {
static GLfloat terrain_color[4] = { 0.6, 0.8, 0.4, 1.0 };
static GLfloat terrain_ambient[4];
static GLfloat terrain_diffuse[4];
int i, j;
for ( i = 0; i < 4; i++ ) {
terrain_ambient[i] = terrain_color[i] * 0.5;
terrain_diffuse[i] = terrain_color[i];
}
xglMaterialfv(GL_FRONT, GL_AMBIENT, terrain_ambient);
xglMaterialfv(GL_FRONT, GL_DIFFUSE, terrain_diffuse);
for ( i = 0; i < 49; i++ ) {
xglPushMatrix();
xglTranslatef(local_refs[i].x - scenery.center.x,
local_refs[i].y - scenery.center.y,
local_refs[i].z - scenery.center.z);
xglCallList(local_display_lists[i]);
xglPopMatrix();
}
}
/* $Log$
/* Revision 1.2 1998/01/08 02:22:27 curt
/* Continue working on basic features.
/* Revision 1.3 1998/01/13 00:23:11 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.2 1998/01/08 02:22:27 curt
* Continue working on basic features.
*
* Revision 1.1 1998/01/07 23:50:51 curt
* "area" renamed to "tile"
*

View file

@ -33,10 +33,18 @@ void fgTileMgrInit();
void fgTileMgrUpdate();
/* Render the local tiles --- hack, hack, hack */
void fgTileMgrRender();
/* $Log$
/* Revision 1.1 1998/01/07 23:50:51 curt
/* "area" renamed to "tile"
/* Revision 1.2 1998/01/13 00:23:11 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.1 1998/01/07 23:50:51 curt
* "area" renamed to "tile"
*
* */

View file

@ -205,19 +205,20 @@ void find_bucket(double lon, double lat, struct bucket *p) {
/* Given a lat/lon, fill in the local tile index array */
void gen_idx_array(struct bucket *p1, long int *tiles,
void gen_idx_array(struct bucket *p1, struct bucket *tiles,
int width, int height) {
struct bucket p2;
struct bucket *p2;
int dw, dh, i, j;
dh = height / 2;
dw = width / 2;
for ( j = 0; j < height; j++ ) {
for ( i = 0; i < width; i++ ) {
offset_bucket(p1, &p2, i - dw, j - dh);
tiles[(j*width)+i] = gen_index(&p2);
offset_bucket(p1, &tiles[(j*width)+i], i - dw, j - dh);
p2 = &tiles[(j*width)+i];
printf(" bucket = %d %d %d %d index = %ld\n",
p2.lon, p2.lat, p2.x, p2.y, tiles[(j*width)+i]);
p2->lon, p2->lat, p2->x, p2->y,
gen_index(&tiles[(j*width)+i]));
}
}
}
@ -265,9 +266,13 @@ int main() {
/* $Log$
/* Revision 1.3 1998/01/10 00:01:47 curt
/* Misc api changes and tweaks.
/* Revision 1.4 1998/01/13 00:23:12 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.3 1998/01/10 00:01:47 curt
* Misc api changes and tweaks.
*
* Revision 1.2 1998/01/08 02:22:28 curt
* Continue working on basic features.
*

View file

@ -69,7 +69,7 @@ void find_bucket(double lon, double lat, struct bucket *p);
/* Given a lat/lon, fill in the local tile index array */
void gen_idx_array(struct bucket *p1, long int *tiles,
void gen_idx_array(struct bucket *p1, struct bucket *tiles,
int width, int height);
@ -77,9 +77,13 @@ void gen_idx_array(struct bucket *p1, long int *tiles,
/* $Log$
/* Revision 1.3 1998/01/10 00:01:48 curt
/* Misc api changes and tweaks.
/* Revision 1.4 1998/01/13 00:23:12 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.3 1998/01/10 00:01:48 curt
* Misc api changes and tweaks.
*
* Revision 1.2 1998/01/08 02:22:28 curt
* Continue working on basic features.
*

View file

@ -57,6 +57,7 @@ void fgTimeInit(struct fgTIME *t) {
t->gst_diff = -9999.0;
t->warp = 0;
t->warp = 5 * 3600;
t->warp_delta = 0;
}
@ -244,7 +245,6 @@ void fgTimeUpdate(struct fgFLIGHT *f, struct fgTIME *t) {
printf("Updating time\n");
/* get current Unix calendar time (in seconds) */
/* warp = 60; */
t->warp += t->warp_delta;
t->cur_time = time(NULL) + t->warp;
printf(" Current Unix calendar time = %ld warp = %ld delta = %ld\n",
@ -298,9 +298,13 @@ void fgTimeUpdate(struct fgFLIGHT *f, struct fgTIME *t) {
/* $Log$
/* Revision 1.26 1998/01/05 18:44:36 curt
/* Add an option to advance/decrease time from keyboard.
/* Revision 1.27 1998/01/13 00:23:13 curt
/* Initial changes to support loading and management of scenery tiles. Note,
/* there's still a fair amount of work left to be done.
/*
* Revision 1.26 1998/01/05 18:44:36 curt
* Add an option to advance/decrease time from keyboard.
*
* Revision 1.25 1997/12/31 17:46:50 curt
* Tweaked fg_time.c to be able to use ftime() instead of gettimeofday()
*