From: curt Date: Sat, 14 Mar 1998 00:30:50 +0000 (+0000) Subject: Beginning initial terrain texturing experiments. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=003267eed80a4903f9a5a572f829a422d46c13e3;p=flightgear.git Beginning initial terrain texturing experiments. --- diff --git a/Main/GLUTmain.c b/Main/GLUTmain.c index 52045c314..8cfebaed0 100644 --- a/Main/GLUTmain.c +++ b/Main/GLUTmain.c @@ -69,7 +69,7 @@ /* This is a record containing global housekeeping information */ -struct fgGENERAL general; +fgGENERAL general; /* view parameters */ static GLfloat win_ratio = 1.0; @@ -404,8 +404,19 @@ static void fgRenderFrame( void ) { /* set lighting parameters */ xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_ambient ); xglLightfv(GL_LIGHT0, GL_DIFFUSE, l->scene_diffuse ); + /* texture parameters */ + xglEnable( GL_TEXTURE_2D ); + xglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ) ; + xglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ) ; + xglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ) ; + xglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR /* GL_LINEAR_MIPMAP_LINEAR */ ) ; + xglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ; + xglHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ; + fgTileMgrRender(); - /* fgSceneryRender(); */ + + xglDisable( GL_TEXTURE_2D ); /* display HUD */ if( show_hud ) { @@ -800,9 +811,12 @@ extern "C" { #endif /* $Log$ -/* Revision 1.65 1998/03/09 22:45:57 curt -/* Minor tweaks for building on sparc platform. +/* Revision 1.66 1998/03/14 00:31:20 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.65 1998/03/09 22:45:57 curt + * Minor tweaks for building on sparc platform. + * * Revision 1.64 1998/02/20 00:16:23 curt * Thursday's tweaks. * diff --git a/Main/fg_debug.c b/Main/fg_debug.c index 4ea83bfb1..8c1e8f1c5 100644 --- a/Main/fg_debug.c +++ b/Main/fg_debug.c @@ -35,7 +35,7 @@ static int fg_DebugSem = 1; -fgDebugClass fg_DebugClass = FG_ALL; // Need visibility for +fgDebugClass fg_DebugClass = FG_NONE; // Need visibility for fgDebugPriority fg_DebugPriority = FG_INFO; // command line processing. static fgDebugCallback fg_DebugCallback = NULL; @@ -265,9 +265,12 @@ int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ) { /* $Log$ -/* Revision 1.9 1998/03/09 22:44:58 curt -/* Modified so that you can specify FG_DEBUGCLASS ***or*** FG_DEBUG_PRIORITY +/* Revision 1.10 1998/03/14 00:31:21 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.9 1998/03/09 22:44:58 curt + * Modified so that you can specify FG_DEBUGCLASS ***or*** FG_DEBUG_PRIORITY + * * Revision 1.8 1998/03/09 22:11:00 curt * Processed through the format-o-matic. * diff --git a/Main/fg_init.c b/Main/fg_init.c index 2acdc8e97..c919e19ec 100644 --- a/Main/fg_init.c +++ b/Main/fg_init.c @@ -60,7 +60,7 @@ extern const char *default_root; /* General house keeping initializations */ int fgInitGeneral( void ) { - struct fgGENERAL *g; + fgGENERAL *g; g = &general; @@ -136,7 +136,7 @@ int fgInitSubsystems( void ) { FG_Longitude = ( -110.6642444 ) * DEG_TO_RAD; FG_Latitude = ( 33.3528917 ) * DEG_TO_RAD; FG_Runway_altitude = (3234.5 + 300); - FG_Altitude = FG_Runway_altitude + 3.758099; + FG_Altitude = FG_Runway_altitude + 3.758099 + 30000; // Initial Position at (E81) Superior, AZ // FG_Longitude = ( -111.1270650 ) * DEG_TO_RAD; @@ -196,7 +196,7 @@ int fgInitSubsystems( void ) { // Initial Position: Somewhere near the Grand Canyon // FG_Longitude = ( -112.5 ) * DEG_TO_RAD; // FG_Latitude = ( 36.5 ) * DEG_TO_RAD; - // FG_Runway_altitude = 5000.0; + // FG_Runway_altitude = 8000.0; // FG_Altitude = FG_Runway_altitude + 3.758099; // Initial Position: (GCN) Grand Canyon Airport, AZ @@ -233,10 +233,10 @@ int fgInitSubsystems( void ) { // FG_Altitude = FG_Runway_altitude + 3.758099; // Test Position - FG_Longitude = ( -122.1469647 ) * DEG_TO_RAD; - FG_Latitude = ( 35.9523539 ) * DEG_TO_RAD; - FG_Runway_altitude = 2000.0; - FG_Altitude = FG_Runway_altitude + 3.758099; + // FG_Longitude = ( -122.1469647 ) * DEG_TO_RAD; + // FG_Latitude = ( 35.9523539 ) * DEG_TO_RAD; + // FG_Runway_altitude = 2000.0; + // FG_Altitude = FG_Runway_altitude + 3.758099; // A random test position // FG_Longitude = ( 88128.00 / 3600.0 ) * DEG_TO_RAD; @@ -339,6 +339,13 @@ int fgInitSubsystems( void ) { fgSkyInit(); // Initialize the Scenery Management subsystem + if ( fgSceneryInit() ) { + // Scenery initialized ok. + } else { + fgPrintf( FG_GENERAL, FG_EXIT, "Error in Scenery initialization!\n" ); + } + + if( fgTileMgrInit() ) { // Load the local scenery data fgTileMgrUpdate(); @@ -399,9 +406,12 @@ int fgInitSubsystems( void ) { /* $Log$ -/* Revision 1.50 1998/03/09 22:46:19 curt -/* Minor tweaks. +/* Revision 1.51 1998/03/14 00:31:22 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.50 1998/03/09 22:46:19 curt + * Minor tweaks. + * * Revision 1.49 1998/02/23 19:07:59 curt * Incorporated Durk's Astro/ tweaks. Includes unifying the sun position * calculation code between sun display, and other FG sections that use this diff --git a/Scenery/obj.c b/Scenery/obj.c index f11c38736..5d3e1b2b2 100644 --- a/Scenery/obj.c +++ b/Scenery/obj.c @@ -1,4 +1,5 @@ -/************************************************************************** +/* -*- Mode: C++ -*- + * * obj.c -- routines to handle WaveFront .obj format files. * * Written by Curtis Olson, started October 1997. @@ -33,8 +34,10 @@ #include #include +#include #include
#include +#include #include #include @@ -63,11 +66,33 @@ void calc_normal(double p1[3], double p2[3], double p3[3], double normal[3]) } +#define FG_TEX_CONSTANT 64.0 + +float calc_lon(double x, double y, double z) { + float tmp; + tmp = (RAD_TO_DEG*atan2(y, x)) * FG_TEX_CONSTANT; + + // printf("lon = %.2f\n", (float)tmp); + return (float)tmp; +} + + +float calc_lat(double x, double y, double z) { + float tmp; + + tmp = (90.0 - RAD_TO_DEG*atan2( sqrt(x*x + y*y), z )) * FG_TEX_CONSTANT; + + // printf("lat = %.2f\n", (float)tmp); + return (float)tmp; +} + + /* Load a .obj file and generate the GL call list */ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { char line[256], winding_str[256]; double approx_normal[3], normal[3], scale; double x, y, z, xmax, xmin, ymax, ymin, zmax, zmin; + GLfloat sgenparams[] = { 1.0, 0.0, 0.0, 0.0 }; GLint tile; FILE *f; int first, ncount, vncount, n1, n2, n3, n4; @@ -83,6 +108,17 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { tile = xglGenLists(1); xglNewList(tile, GL_COMPILE); + /* + xglTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + xglTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + xglTexGenfv(GL_S, GL_OBJECT_PLANE, sgenparams); + xglTexGenfv(GL_T, GL_OBJECT_PLANE, sgenparams); + // xglTexGenfv(GL_S, GL_SPHERE_MAP, 0); + // xglTexGenfv(GL_T, GL_SPHERE_MAP, 0); + xglEnable(GL_TEXTURE_GEN_S); + xglEnable(GL_TEXTURE_GEN_T); + */ + first = 1; ncount = 1; vncount = 1; @@ -182,14 +218,17 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { if ( use_per_vertex_norms ) { MAT3_SCALE_VEC(normal, normals[n1], scale); xglNormal3dv(normal); + xglTexCoord2f(calc_lon(nodes[n1][0], nodes[n1][1], nodes[n1][2]), calc_lat(nodes[n1][0], nodes[n1][1], nodes[n1][2])); xglVertex3d(nodes[n1][0], nodes[n1][1], nodes[n1][2]); MAT3_SCALE_VEC(normal, normals[n2], scale); xglNormal3dv(normal); + xglTexCoord2f(calc_lon(nodes[n2][0], nodes[n2][1], nodes[n2][2]), calc_lat(nodes[n2][0], nodes[n2][1], nodes[n2][2])); xglVertex3d(nodes[n2][0], nodes[n2][1], nodes[n2][2]); MAT3_SCALE_VEC(normal, normals[n3], scale); xglNormal3dv(normal); + xglTexCoord2f(calc_lon(nodes[n3][0], nodes[n3][1], nodes[n3][2]), calc_lat(nodes[n3][0], nodes[n3][1], nodes[n3][2])); xglVertex3d(nodes[n3][0], nodes[n3][1], nodes[n3][2]); } else { if ( odd ) { @@ -200,8 +239,11 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { MAT3_SCALE_VEC(normal, approx_normal, scale); xglNormal3dv(normal); + xglTexCoord2f(calc_lon(nodes[n1][0], nodes[n1][1], nodes[n1][2]), calc_lat(nodes[n1][0], nodes[n1][1], nodes[n1][2])); xglVertex3d(nodes[n1][0], nodes[n1][1], nodes[n1][2]); + xglTexCoord2f(calc_lon(nodes[n2][0], nodes[n2][1], nodes[n2][2]), calc_lat(nodes[n2][0], nodes[n2][1], nodes[n2][2])); xglVertex3d(nodes[n2][0], nodes[n2][1], nodes[n2][2]); + xglTexCoord2f(calc_lon(nodes[n3][0], nodes[n3][1], nodes[n3][2]), calc_lat(nodes[n3][0], nodes[n3][1], nodes[n3][2])); xglVertex3d(nodes[n3][0], nodes[n3][1], nodes[n3][2]); } @@ -217,6 +259,7 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { MAT3_SCALE_VEC(normal, approx_normal, scale); } xglNormal3dv(normal); + xglTexCoord2f(calc_lon(nodes[n4][0], nodes[n4][1], nodes[n4][2]), calc_lat(nodes[n4][0], nodes[n4][1], nodes[n4][2])); xglVertex3d(nodes[n4][0], nodes[n4][1], nodes[n4][2]); odd = 1 - odd; @@ -239,12 +282,15 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { sscanf(line, "f %d %d %d\n", &n1, &n2, &n3); xglNormal3d(normals[n1][0], normals[n1][1], normals[n1][2]); + xglTexCoord2f(calc_lon(nodes[n1][0], nodes[n1][1], nodes[n1][2]), calc_lat(nodes[n1][0], nodes[n1][1], nodes[n1][2])); xglVertex3d(nodes[n1][0], nodes[n1][1], nodes[n1][2]); xglNormal3d(normals[n2][0], normals[n2][1], normals[n2][2]); + xglTexCoord2f(calc_lon(nodes[n2][0], nodes[n2][1], nodes[n2][2]), calc_lat(nodes[n2][0], nodes[n2][1], nodes[n2][2])); xglVertex3d(nodes[n2][0], nodes[n2][1], nodes[n2][2]); - + xglNormal3d(normals[n3][0], normals[n3][1], normals[n3][2]); + xglTexCoord2f(calc_lon(nodes[n3][0], nodes[n3][1], nodes[n3][2]), calc_lat(nodes[n3][0], nodes[n3][1], nodes[n3][2])); xglVertex3d(nodes[n3][0], nodes[n3][1], nodes[n3][2]); } else if ( line[0] == 'q' ) { /* continue a triangle strip */ @@ -270,8 +316,9 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { xglNormal3dv(normal); } + xglTexCoord2f(calc_lon(nodes[n1][0], nodes[n1][1], nodes[n1][2]), calc_lat(nodes[n1][0], nodes[n1][1], nodes[n1][2])); xglVertex3d(nodes[n1][0], nodes[n1][1], nodes[n1][2]); - + odd = 1 - odd; last1 = last2; last2 = n1; @@ -294,6 +341,7 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { xglNormal3dv(normal); } + xglTexCoord2f(calc_lon(nodes[n2][0], nodes[n2][1], nodes[n2][2]), calc_lat(nodes[n2][0], nodes[n2][1], nodes[n2][2])); xglVertex3d(nodes[n2][0], nodes[n2][1], nodes[n2][2]); odd = 1 -odd; @@ -323,6 +371,9 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { xglEnd(); */ + // xglDisable(GL_TEXTURE_GEN_S); + // xglDisable(GL_TEXTURE_GEN_T); + xglFrontFace ( GL_CCW ); xglEndList(); @@ -339,9 +390,12 @@ GLint fgObjLoad(char *path, struct fgCartesianPoint *ref, double *radius) { /* $Log$ -/* Revision 1.24 1998/02/09 21:30:18 curt -/* Fixed a nagging problem with terrain tiles not "quite" matching up perfectly. +/* Revision 1.25 1998/03/14 00:30:50 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.24 1998/02/09 21:30:18 curt + * Fixed a nagging problem with terrain tiles not "quite" matching up perfectly. + * * Revision 1.23 1998/02/09 15:07:52 curt * Minor tweaks. * diff --git a/Scenery/scenery.c b/Scenery/scenery.c index 1753d69b7..fa1e81d4d 100644 --- a/Scenery/scenery.c +++ b/Scenery/scenery.c @@ -1,4 +1,5 @@ -/************************************************************************** +/* -*- Mode: C++ -*- + * * scenery.c -- data structures and routines for managing scenery. * * Written by Curtis Olson, started May 1997. @@ -38,10 +39,11 @@ #include
#include #include +#include -/* Temporary hack until we get the scenery management system running */ -GLint area_terrain; +/* Temporary hack until we get a better texture management system running */ +GLint area_texture; /* Shared structure to hold current scenery parameters */ @@ -49,18 +51,43 @@ struct fgSCENERY scenery; /* Initialize the Scenery Management system */ -void fgSceneryInit( void ) { +int fgSceneryInit( void ) { + fgGENERAL *g; + char path[1024]; + GLubyte *texbuf; + int width, height; + + g = &general; + fgPrintf(FG_TERRAIN, FG_INFO, "Initializing scenery subsystem\n"); /* set the default terrain detail level */ - scenery.terrain_skip = 6; + // scenery.terrain_skip = 6; + + /* temp: load in a demo texture */ + path[0] = '\0'; + strcat(path, g->root_dir); + strcat(path, "/Textures/"); + strcat(path, "desert.rgb"); + + if ( (texbuf = read_rgb_texture(path, &width, &height)) == NULL ) { + fgPrintf( FG_GENERAL, FG_EXIT, "Error in loading textures!\n" ); + return(0); + } + + /* xglTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, height, width, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, texbuf); */ + xglTexImage2D(GL_TEXTURE_2D, 0, 3, height, width, 0, + GL_RGB, GL_UNSIGNED_BYTE, texbuf); + + return(1); } /* Tell the scenery manager where we are so it can load the proper data, and * build the proper structures. */ void fgSceneryUpdate(double lon, double lat, double elev) { - struct fgGENERAL *g; + fgGENERAL *g; double max_radius; char path[1024]; @@ -75,35 +102,24 @@ void fgSceneryUpdate(double lon, double lat, double elev) { strcat(path, "/Scenery/"); strcat(path, "mesa-e.obj"); - fgPrintf(FG_TERRAIN, FG_DEBUG, " Loading Scenery: %s\n", path); + // fgPrintf(FG_TERRAIN, FG_DEBUG, " Loading Scenery: %s\n", path); - area_terrain = fgObjLoad(path, &scenery.center, &max_radius); + // area_terrain = fgObjLoad(path, &scenery.center, &max_radius); } /* Render out the current scene */ void fgSceneryRender( void ) { - 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; - - 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); - - xglCallList(area_terrain); } /* $Log$ -/* Revision 1.35 1998/01/31 00:43:26 curt -/* Added MetroWorks patches from Carmen Volpe. +/* Revision 1.36 1998/03/14 00:30:50 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.35 1998/01/31 00:43:26 curt + * Added MetroWorks patches from Carmen Volpe. + * * Revision 1.34 1998/01/27 03:26:43 curt * Playing with new fgPrintf command. * diff --git a/Scenery/scenery.h b/Scenery/scenery.h index 84cba5f6b..8c5943950 100644 --- a/Scenery/scenery.h +++ b/Scenery/scenery.h @@ -50,7 +50,7 @@ extern struct fgSCENERY scenery; /* Initialize the Scenery Management system */ -void fgSceneryInit( void ); +int fgSceneryInit( void ); /* Tell the scenery manager where we are so it can load the proper data, and @@ -66,9 +66,12 @@ void fgSceneryRender( void ); /* $Log$ -/* Revision 1.17 1998/02/20 00:16:24 curt -/* Thursday's tweaks. +/* Revision 1.18 1998/03/14 00:30:51 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.17 1998/02/20 00:16:24 curt + * Thursday's tweaks. + * * Revision 1.16 1998/01/27 00:48:03 curt * Incorporated Paul Bleisch's new debug message * system and commandline/config file processing code. diff --git a/Scenery/tilemgr.c b/Scenery/tilemgr.c index da9cb9f56..009763432 100644 --- a/Scenery/tilemgr.c +++ b/Scenery/tilemgr.c @@ -1,4 +1,5 @@ -/************************************************************************** +/* -*- Mode: C++ -*- + * * tilemgr.c -- routines to handle dynamic management of scenery tiles * * Written by Curtis Olson, started January 1998. @@ -180,9 +181,6 @@ int fgTileMgrUpdate( void ) { void fgTileMgrRender( void ) { fgFLIGHT *f; struct fgBUCKET p; - static GLfloat terrain_color[4] = { 0.6, 0.8, 0.4, 1.0 }; - static GLfloat terrain_ambient[4]; - static GLfloat terrain_diffuse[4]; struct fgCartesianPoint local_ref; GLint display_list; int i; @@ -190,14 +188,6 @@ void fgTileMgrRender( void ) { f = current_aircraft.flight; - 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); - /* Find current translation offset */ fgBucketFind(FG_Longitude * RAD_TO_DEG, FG_Latitude * RAD_TO_DEG, &p); index = fgTileCacheExists(&p); @@ -225,9 +215,12 @@ void fgTileMgrRender( void ) { /* $Log$ -/* Revision 1.19 1998/02/20 00:16:25 curt -/* Thursday's tweaks. +/* Revision 1.20 1998/03/14 00:30:51 curt +/* Beginning initial terrain texturing experiments. /* + * Revision 1.19 1998/02/20 00:16:25 curt + * Thursday's tweaks. + * * Revision 1.18 1998/02/19 13:05:54 curt * Incorporated some HUD tweaks from Michelle America. * Tweaked the sky's sunset/rise colors.