From: curt Date: Sun, 24 May 1998 02:49:09 +0000 (+0000) Subject: Implimented fragment level view frustum culling. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=922f9e9ba119ec695a86d37dcf4e091b5b6d97d4;p=flightgear.git Implimented fragment level view frustum culling. --- diff --git a/Scenery/obj.cxx b/Scenery/obj.cxx index 11b5ab23f..05671b410 100644 --- a/Scenery/obj.cxx +++ b/Scenery/obj.cxx @@ -1,27 +1,25 @@ -/* - * obj.cxx -- routines to handle "sorta" WaveFront .obj format files. - * - * 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) - **************************************************************************/ +// obj.cxx -- routines to handle "sorta" WaveFront .obj format files. +// +// 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 HAVE_CONFIG_H @@ -56,7 +54,7 @@ static double nodes[MAXNODES][3]; static double normals[MAXNODES][3]; -/* given three points defining a triangle, calculate the normal */ +// given three points defining a triangle, calculate the normal static void calc_normal(double p1[3], double p2[3], double p3[3], double normal[3]) { @@ -69,8 +67,8 @@ static void calc_normal(double p1[3], double p2[3], MAT3cross_product(normal, v1, v2); MAT3_NORMALIZE_VEC(normal,temp); - /* fgPrintf( FG_TERRAIN, FG_DEBUG, " Normal = %.2f %.2f %.2f\n", - normal[0], normal[1], normal[2]);*/ + // fgPrintf( FG_TERRAIN, FG_DEBUG, " Normal = %.2f %.2f %.2f\n", + // normal[0], normal[1], normal[2]); } @@ -95,7 +93,7 @@ fgPolarPoint3d calc_tex_coords(double *node, fgCartesianPoint3d *ref) { } -/* Load a .obj file and build the GL fragment list */ +// Load a .obj file and build the GL fragment list int fgObjLoad(char *path, fgTILE *tile) { fgOPTIONS *o; fgFRAGMENT fragment; @@ -106,7 +104,7 @@ int fgObjLoad(char *path, fgTILE *tile) { // GLfloat sgenparams[] = { 1.0, 0.0, 0.0, 0.0 }; GLint display_list; fgFile f; - int first, ncount, vncount, n1, n2, n3, n4; + int in_fragment, in_faces, ncount, vncount, n1, n2, n3, n4; int last1, last2, odd; o = ¤t_options; @@ -131,50 +129,43 @@ int fgObjLoad(char *path, fgTILE *tile) { } } - display_list = xglGenLists(1); - xglNewList(display_list, GL_COMPILE); - - first = 1; + in_fragment = 0; ncount = 1; vncount = 1; tile->bounding_radius = 0.0; while ( fggets(f, line, 250) != NULL ) { if ( line[0] == '#' ) { - /* comment -- ignore */ + // comment -- ignore } else if ( line[0] == '\n' ) { - /* empty line -- ignore */ - } else if ( strncmp(line, "gb ", 3) == 0 ) { - /* reference point (center offset) */ - sscanf(line, "gb %lf %lf %lf %lf\n", + // empty line -- ignore + } else if ( strncmp(line, "gbs ", 4) == 0 ) { + // reference point (center offset) + sscanf(line, "gbs %lf %lf %lf %lf\n", &tile->center.x, &tile->center.y, &tile->center.z, &tile->bounding_radius); + } else if ( strncmp(line, "bs ", 3) == 0 ) { + // reference point (center offset) + sscanf(line, "bs %lf %lf %lf %lf\n", + &fragment.center.x, &fragment.center.y, &fragment.center.z, + &fragment.bounding_radius); } else if ( strncmp(line, "v ", 2) == 0 ) { - /* node (vertex) */ + // node (vertex) if ( ncount < MAXNODES ) { - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "vertex = %s", line); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "vertex = %s", line); sscanf(line, "v %lf %lf %lf\n", &nodes[ncount][0], &nodes[ncount][1], &nodes[ncount][2]); - // temporary code to calculate bounding radius - // dist = calc_dist(nodes[ncount]); - // printf("node = %.2f %.2f %.2f dist = %.2f\n", - // nodes[ncount][0], nodes[ncount][1], nodes[ncount][2], - // dist); - // if ( (dist > *radius) && (dist < 100000.0) ) { - // *radius = dist; - // } - ncount++; } else { fgPrintf( FG_TERRAIN, FG_EXIT, "Read too many nodes ... dying :-(\n"); } } else if ( strncmp(line, "vn ", 3) == 0 ) { - /* vertex normal */ + // vertex normal if ( vncount < MAXNODES ) { - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "vertex normal = %s", line); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "vertex normal = %s", line); sscanf(line, "vn %lf %lf %lf\n", &normals[vncount][0], &normals[vncount][1], &normals[vncount][2]); @@ -184,25 +175,38 @@ int fgObjLoad(char *path, fgTILE *tile) { "Read too many vertex normals ... dying :-(\n"); } } else if ( strncmp(line, "usemtl ", 7) == 0 ) { - /* material property specification */ - sscanf(line, "usemtl %s\n", material); - } else if ( line[0] == 't' ) { - /* start a new triangle strip */ + // material property specification - n1 = n2 = n3 = n4 = 0; - - if ( !first ) { - /* close out the previous structure and start the next */ + // this also signals the start of a new fragment + if ( in_fragment ) { + // close out the previous structure and start the next xglEnd(); + xglEndList(); + + // update fragment + fragment.display_list = display_list; + + // push this fragment onto the tile's object list + tile->fragment_list.push_back(fragment); } else { - first = 0; + in_fragment = 1; } - /* fgPrintf( FG_TERRAIN, FG_DEBUG, " new tri strip = %s", - line); */ + display_list = xglGenLists(1); + xglNewList(display_list, GL_COMPILE); + in_faces = 0; + + // scan the material line + sscanf(line, "usemtl %s\n", material); + } else if ( line[0] == 't' ) { + // start a new triangle strip + + n1 = n2 = n3 = n4 = 0; + + // fgPrintf( FG_TERRAIN, FG_DEBUG, " new tri strip = %s", line); sscanf(line, "t %d %d %d %d\n", &n1, &n2, &n3, &n4); - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "(t) = "); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "(t) = "); xglBegin(GL_TRIANGLE_STRIP); @@ -278,18 +282,14 @@ int fgObjLoad(char *path, fgTILE *tile) { last2 = n4; } } else if ( line[0] == 'f' ) { - /* unoptimized face */ + // unoptimized face - if ( !first ) { - /* close out the previous structure and start the next */ - xglEnd(); - } else { - first = 0; + if ( !in_faces ) { + xglBegin(GL_TRIANGLES); + in_faces = 1; } - xglBegin(GL_TRIANGLES); - - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "new triangle = %s", line);*/ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "new triangle = %s", line);*/ sscanf(line, "f %d %d %d\n", &n1, &n2, &n3); xglNormal3d(normals[n1][0], normals[n1][1], normals[n1][2]); @@ -307,13 +307,13 @@ int fgObjLoad(char *path, fgTILE *tile) { xglTexCoord2f(pp.lon, pp.lat); xglVertex3d(nodes[n3][0], nodes[n3][1], nodes[n3][2]); } else if ( line[0] == 'q' ) { - /* continue a triangle strip */ + // continue a triangle strip n1 = n2 = 0; - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "continued tri strip = %s ", - line); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "continued tri strip = %s ", + // line); sscanf(line, "q %d %d\n", &n1, &n2); - /* fgPrintf( FG_TERRAIN, FG_DEBUG, "read %d %d\n", n1, n2); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, "read %d %d\n", n1, n2); if ( o->shading ) { // Shading model is "GL_SMOOTH" @@ -341,7 +341,7 @@ int fgObjLoad(char *path, fgTILE *tile) { last2 = n1; if ( n2 > 0 ) { - /* fgPrintf( FG_TERRAIN, FG_DEBUG, " (cont)\n"); */ + // fgPrintf( FG_TERRAIN, FG_DEBUG, " (cont)\n"); if ( o->shading ) { // Shading model is "GL_SMOOTH" @@ -374,9 +374,19 @@ int fgObjLoad(char *path, fgTILE *tile) { } } - xglEnd(); + if ( in_fragment ) { + // close out the previous structure and start the next + xglEnd(); + xglEndList(); + + // update fragment + fragment.display_list = display_list; + + // push this fragment onto the tile's object list + tile->fragment_list.push_back(fragment); + } - /* Draw normal vectors (for visually verifying normals)*/ + // Draw normal vectors (for visually verifying normals) /* xglBegin(GL_LINES); xglColor3f(0.0, 0.0, 0.0); @@ -389,171 +399,165 @@ int fgObjLoad(char *path, fgTILE *tile) { nodes[i][2] + 500*normals[i][2]); } xglEnd(); - */ - - xglEndList(); + */ fgclose(f); - // temporary: create a fragment - fragment.center = tile->center; - fragment.bounding_radius = tile->bounding_radius; - fragment.display_list = display_list; - - // temporary: push this fragment onto the tile's object list - tile->fragment_list.push_back(fragment); - return(1); } -/* $Log$ -/* Revision 1.6 1998/05/23 14:09:20 curt -/* Added tile.cxx and tile.hxx. -/* Working on rewriting the tile management system so a tile is just a list -/* fragments, and the fragment record contains the display list for that fragment. -/* - * Revision 1.5 1998/05/20 20:53:53 curt - * Moved global ref point and radius (bounding sphere info, and offset) to - * data file rather than calculating it on the fly. - * Fixed polygon winding problem in scenery generation stage rather than - * compensating for it on the fly. - * Made a fgTILECACHE class. - * - * Revision 1.4 1998/05/16 13:09:57 curt - * Beginning to add support for view frustum culling. - * Added some temporary code to calculate bouding radius, until the - * scenery generation tools and scenery can be updated. - * - * Revision 1.3 1998/05/03 00:48:01 curt - * Updated texture coordinate fmod() parameter. - * - * Revision 1.2 1998/05/02 01:52:14 curt - * Playing around with texture coordinates. - * - * Revision 1.1 1998/04/30 12:35:28 curt - * Added a command line rendering option specify smooth/flat shading. - * - * Revision 1.35 1998/04/28 21:43:26 curt - * Wrapped zlib calls up so we can conditionally comment out zlib support. - * - * Revision 1.34 1998/04/28 01:21:42 curt - * Tweaked texture parameter calculations to keep the number smaller. This - * avoids the "swimming" problem. - * Type-ified fgTIME and fgVIEW. - * - * Revision 1.33 1998/04/27 15:58:15 curt - * Screwing around with texture coordinate generation ... still needs work. - * - * Revision 1.32 1998/04/27 03:30:13 curt - * Minor transformation adjustments to try to keep scenery tiles closer to - * (0, 0, 0) GLfloats run out of precision at the distances we need to model - * the earth, but we can do a bunch of pre-transformations using double math - * and then cast to GLfloat once everything is close in where we have less - * precision problems. - * - * Revision 1.31 1998/04/25 15:09:57 curt - * Changed "r" to "rb" in gzopen() options. This fixes bad behavior in win32. - * - * Revision 1.30 1998/04/24 14:21:08 curt - * Added "file.obj.gz" support. - * - * Revision 1.29 1998/04/24 00:51:07 curt - * Wrapped "#include " in "#ifdef HAVE_CONFIG_H" - * Tweaked the scenery file extentions to be "file.obj" (uncompressed) - * or "file.obz" (compressed.) - * - * Revision 1.28 1998/04/22 13:22:44 curt - * C++ - ifing the code a bit. - * - * Revision 1.27 1998/04/18 04:13:17 curt - * Added zlib on the fly decompression support for loading scenery objects. - * - * Revision 1.26 1998/04/03 22:11:36 curt - * Converting to Gnu autoconf system. - * - * 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. - * - * Revision 1.22 1998/02/01 03:39:54 curt - * Minor tweaks. - * - * Revision 1.21 1998/01/31 00:43:25 curt - * Added MetroWorks patches from Carmen Volpe. - * - * Revision 1.20 1998/01/29 00:51:39 curt - * First pass at tile cache, dynamic tile loading and tile unloading now works. - * - * Revision 1.19 1998/01/27 03:26:42 curt - * Playing with new fgPrintf command. - * - * Revision 1.18 1998/01/19 19:27:16 curt - * Merged in make system changes from Bob Kuehne - * This should simplify things tremendously. - * - * 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. - * - * Revision 1.14 1997/12/30 01:38:46 curt - * Switched back to per vertex normals and smooth shading for terrain. - * - * Revision 1.13 1997/12/18 23:32:36 curt - * First stab at sky dome actually starting to look reasonable. :-) - * - * Revision 1.12 1997/12/17 23:13:47 curt - * Began working on rendering the sky. - * - * Revision 1.11 1997/12/15 23:55:01 curt - * Add xgl wrappers for debugging. - * Generate terrain normals on the fly. - * - * Revision 1.10 1997/12/12 21:41:28 curt - * More light/material property tweaking ... still a ways off. - * - * Revision 1.9 1997/12/12 19:52:57 curt - * Working on lightling and material properties. - * - * Revision 1.8 1997/12/10 01:19:51 curt - * Tweaks for verion 0.15 release. - * - * Revision 1.7 1997/12/08 22:51:17 curt - * Enhanced to handle ccw and cw tri-stripe winding. This is a temporary - * admission of defeat. I will eventually go back and get all the stripes - * wound the same way (ccw). - * - * Revision 1.6 1997/11/25 19:25:35 curt - * Changes to integrate Durk's moon/sun code updates + clean up. - * - * Revision 1.5 1997/11/15 18:16:39 curt - * minor tweaks. - * - * Revision 1.4 1997/11/14 00:26:49 curt - * Transform scenery coordinates earlier in pipeline when scenery is being - * created, not when it is being loaded. Precalculate normals for each node - * as average of the normals of each containing polygon so Garoude shading is - * now supportable. - * - * Revision 1.3 1997/10/31 04:49:12 curt - * Tweaking vertex orders. - * - * Revision 1.2 1997/10/30 12:38:45 curt - * Working on new scenery subsystem. - * - * Revision 1.1 1997/10/28 21:14:54 curt - * Initial revision. - * - */ +// $Log$ +// Revision 1.7 1998/05/24 02:49:09 curt +// Implimented fragment level view frustum culling. +// +// Revision 1.6 1998/05/23 14:09:20 curt +// Added tile.cxx and tile.hxx. +// Working on rewriting the tile management system so a tile is just a list +// fragments, and the fragment record contains the display list for that +// fragment. +// +// Revision 1.5 1998/05/20 20:53:53 curt +// Moved global ref point and radius (bounding sphere info, and offset) to +// data file rather than calculating it on the fly. +// Fixed polygon winding problem in scenery generation stage rather than +// compensating for it on the fly. +// Made a fgTILECACHE class. +// +// Revision 1.4 1998/05/16 13:09:57 curt +// Beginning to add support for view frustum culling. +// Added some temporary code to calculate bouding radius, until the +// scenery generation tools and scenery can be updated. +// +// Revision 1.3 1998/05/03 00:48:01 curt +// Updated texture coordinate fmod() parameter. +// +// Revision 1.2 1998/05/02 01:52:14 curt +// Playing around with texture coordinates. +// +// Revision 1.1 1998/04/30 12:35:28 curt +// Added a command line rendering option specify smooth/flat shading. +// +// Revision 1.35 1998/04/28 21:43:26 curt +// Wrapped zlib calls up so we can conditionally comment out zlib support. +// +// Revision 1.34 1998/04/28 01:21:42 curt +// Tweaked texture parameter calculations to keep the number smaller. This +// avoids the "swimming" problem. +// Type-ified fgTIME and fgVIEW. +// +// Revision 1.33 1998/04/27 15:58:15 curt +// Screwing around with texture coordinate generation ... still needs work. +// +// Revision 1.32 1998/04/27 03:30:13 curt +// Minor transformation adjustments to try to keep scenery tiles closer to +// (0, 0, 0) GLfloats run out of precision at the distances we need to model +// the earth, but we can do a bunch of pre-transformations using double math +// and then cast to GLfloat once everything is close in where we have less +// precision problems. +// +// Revision 1.31 1998/04/25 15:09:57 curt +// Changed "r" to "rb" in gzopen() options. This fixes bad behavior in win32. +// +// Revision 1.30 1998/04/24 14:21:08 curt +// Added "file.obj.gz" support. +// +// Revision 1.29 1998/04/24 00:51:07 curt +// Wrapped "#include " in "#ifdef HAVE_CONFIG_H" +// Tweaked the scenery file extentions to be "file.obj" (uncompressed) +// or "file.obz" (compressed.) +// +// Revision 1.28 1998/04/22 13:22:44 curt +// C++ - ifing the code a bit. +// +// Revision 1.27 1998/04/18 04:13:17 curt +// Added zlib on the fly decompression support for loading scenery objects. +// +// Revision 1.26 1998/04/03 22:11:36 curt +// Converting to Gnu autoconf system. +// +// 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. +// +// Revision 1.22 1998/02/01 03:39:54 curt +// Minor tweaks. +// +// Revision 1.21 1998/01/31 00:43:25 curt +// Added MetroWorks patches from Carmen Volpe. +// +// Revision 1.20 1998/01/29 00:51:39 curt +// First pass at tile cache, dynamic tile loading and tile unloading now works. +// +// Revision 1.19 1998/01/27 03:26:42 curt +// Playing with new fgPrintf command. +// +// Revision 1.18 1998/01/19 19:27:16 curt +// Merged in make system changes from Bob Kuehne +// This should simplify things tremendously. +// +// 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. +// +// Revision 1.14 1997/12/30 01:38:46 curt +// Switched back to per vertex normals and smooth shading for terrain. +// +// Revision 1.13 1997/12/18 23:32:36 curt +// First stab at sky dome actually starting to look reasonable. :-) +// +// Revision 1.12 1997/12/17 23:13:47 curt +// Began working on rendering the sky. +// +// Revision 1.11 1997/12/15 23:55:01 curt +// Add xgl wrappers for debugging. +// Generate terrain normals on the fly. +// +// Revision 1.10 1997/12/12 21:41:28 curt +// More light/material property tweaking ... still a ways off. +// +// Revision 1.9 1997/12/12 19:52:57 curt +// Working on lightling and material properties. +// +// Revision 1.8 1997/12/10 01:19:51 curt +// Tweaks for verion 0.15 release. +// +// Revision 1.7 1997/12/08 22:51:17 curt +// Enhanced to handle ccw and cw tri-stripe winding. This is a temporary +// admission of defeat. I will eventually go back and get all the stripes +// wound the same way (ccw). +// +// Revision 1.6 1997/11/25 19:25:35 curt +// Changes to integrate Durk's moon/sun code updates + clean up. +// +// Revision 1.5 1997/11/15 18:16:39 curt +// minor tweaks. +// +// Revision 1.4 1997/11/14 00:26:49 curt +// Transform scenery coordinates earlier in pipeline when scenery is being +// created, not when it is being loaded. Precalculate normals for each node +// as average of the normals of each containing polygon so Garoude shading is +// now supportable. +// +// Revision 1.3 1997/10/31 04:49:12 curt +// Tweaking vertex orders. +// +// Revision 1.2 1997/10/30 12:38:45 curt +// Working on new scenery subsystem. +// +// Revision 1.1 1997/10/28 21:14:54 curt +// Initial revision. + + diff --git a/Scenery/obj.hxx b/Scenery/obj.hxx index 24580b669..8b00d8cd0 100644 --- a/Scenery/obj.hxx +++ b/Scenery/obj.hxx @@ -1,27 +1,25 @@ -/************************************************************************** - * obj.hxx -- routines to handle WaveFront .obj-ish format files. - * - * 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) - **************************************************************************/ +// obj.hxx -- routines to handle WaveFront .obj-ish format files. +// +// 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) #ifndef _OBJ_HXX @@ -48,62 +46,64 @@ #include "tile.hxx" -/* Load a .obj file and build the GL fragment list */ +// Load a .obj file and build the GL fragment list int fgObjLoad(char *path, fgTILE *tile); -// GLint fgObjLoad(char *path, fgCartesianPoint3d *ref, double *radius) { - - -#endif /* _OBJ_HXX */ - - -/* $Log$ -/* Revision 1.3 1998/05/23 14:09:21 curt -/* Added tile.cxx and tile.hxx. -/* Working on rewriting the tile management system so a tile is just a list -/* fragments, and the fragment record contains the display list for that fragment. -/* - * Revision 1.2 1998/05/02 01:52:15 curt - * Playing around with texture coordinates. - * - * Revision 1.1 1998/04/30 12:35:29 curt - * Added a command line rendering option specify smooth/flat shading. - * - * Revision 1.11 1998/04/25 22:06:31 curt - * Edited cvs log messages in source files ... bad bad bad! - * - * Revision 1.10 1998/04/24 00:51:07 curt - * Wrapped "#include " in "#ifdef HAVE_CONFIG_H" - * Tweaked the scenery file extentions to be "file.obj" (uncompressed) - * or "file.obz" (compressed.) - * - * Revision 1.9 1998/04/22 13:22:45 curt - * C++ - ifing the code a bit. - * - * Revision 1.8 1998/04/21 17:02:43 curt - * Prepairing for C++ integration. - * - * Revision 1.7 1998/04/03 22:11:37 curt - * Converting to Gnu autoconf system. - * - * Revision 1.6 1998/01/31 00:43:25 curt - * Added MetroWorks patches from Carmen Volpe. - * - * Revision 1.5 1998/01/27 00:48:03 curt - * Incorporated Paul Bleisch's new debug message - * system and commandline/config file processing code. - * - * Revision 1.4 1998/01/22 02:59:41 curt - * Changed #ifdef FILE_H to #ifdef _FILE_H - * - * Revision 1.3 1998/01/19 19:27:17 curt - * Merged in make system changes from Bob Kuehne - * This should simplify things tremendously. - * - * 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. - * - */ + + +#endif // _OBJ_HXX + + +// $Log$ +// Revision 1.4 1998/05/24 02:49:10 curt +// Implimented fragment level view frustum culling. +// +// Revision 1.3 1998/05/23 14:09:21 curt +// Added tile.cxx and tile.hxx. +// Working on rewriting the tile management system so a tile is just a list +// fragments, and the fragment record contains the display list for that +// fragment. +// +// Revision 1.2 1998/05/02 01:52:15 curt +// Playing around with texture coordinates. +// +// Revision 1.1 1998/04/30 12:35:29 curt +// Added a command line rendering option specify smooth/flat shading. +// +// Revision 1.11 1998/04/25 22:06:31 curt +// Edited cvs log messages in source files ... bad bad bad! +// +// Revision 1.10 1998/04/24 00:51:07 curt +// Wrapped "#include " in "#ifdef HAVE_CONFIG_H" +// Tweaked the scenery file extentions to be "file.obj" (uncompressed) +// or "file.obz" (compressed.) +// +// Revision 1.9 1998/04/22 13:22:45 curt +// C++ - ifing the code a bit. +// +// Revision 1.8 1998/04/21 17:02:43 curt +// Prepairing for C++ integration. +// +// Revision 1.7 1998/04/03 22:11:37 curt +// Converting to Gnu autoconf system. +// +// Revision 1.6 1998/01/31 00:43:25 curt +// Added MetroWorks patches from Carmen Volpe. +// +// Revision 1.5 1998/01/27 00:48:03 curt +// Incorporated Paul Bleisch's new debug message +// system and commandline/config file processing code. +// +// Revision 1.4 1998/01/22 02:59:41 curt +// Changed #ifdef FILE_H to #ifdef _FILE_H +// +// Revision 1.3 1998/01/19 19:27:17 curt +// Merged in make system changes from Bob Kuehne +// This should simplify things tremendously. +// +// 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. + diff --git a/Scenery/tilemgr.cxx b/Scenery/tilemgr.cxx index c1e326661..7993a9e8d 100644 --- a/Scenery/tilemgr.cxx +++ b/Scenery/tilemgr.cxx @@ -329,6 +329,7 @@ void fgTileMgrRender( void ) { offset.y = t->center.y - scenery.center.y; offset.z = t->center.z - scenery.center.z; + // Course (tile based) culling if ( viewable(&offset, t->bounding_radius) ) { // at least a portion of this tile is viewable @@ -343,22 +344,39 @@ void fgTileMgrRender( void ) { fragment = *current++; if ( fragment.display_list >= 0 ) { - xglCallList(fragment.display_list); + // Fine (fragment based) culling + offset.x = fragment.center.x - scenery.center.x; + offset.y = fragment.center.y - scenery.center.y; + offset.z = fragment.center.z - scenery.center.z; + + if ( viewable(&offset, fragment.bounding_radius * 2) ) { + xglCallList(fragment.display_list); + drawn++; + } else { + // printf("Culled a fragment %.2f %.2f %.2f %.2f\n", + // fragment.center.x, fragment.center.y, + // fragment.center.z, fragment.bounding_radius); + culled++; + } } } xglPopMatrix(); + } else { + culled += t->fragment_list.size(); } } - // v->vfc_ratio = (double)culled / (double)(drawn + culled); - v->vfc_ratio = 0.0; + v->vfc_ratio = (double)culled / (double)(drawn + culled); // printf("drawn = %d culled = %d saved = %.2f\n", drawn, culled, // v->vfc_ratio); } // $Log$ +// Revision 1.13 1998/05/24 02:49:10 curt +// Implimented fragment level view frustum culling. +// // Revision 1.12 1998/05/23 14:09:23 curt // Added tile.cxx and tile.hxx. // Working on rewriting the tile management system so a tile is just a list