]> git.mxchange.org Git - flightgear.git/commitdiff
Implimented fragment level view frustum culling.
authorcurt <curt>
Sun, 24 May 1998 02:49:09 +0000 (02:49 +0000)
committercurt <curt>
Sun, 24 May 1998 02:49:09 +0000 (02:49 +0000)
Scenery/obj.cxx
Scenery/obj.hxx
Scenery/tilemgr.cxx

index 11b5ab23f66a3d5884fa42da255ea5492e01237d..05671b4106045986000d3d5a9e372d1f461d414a 100644 (file)
@@ -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 = &current_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 <config.h>" 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 <rpk@sgi.com>
- * 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 <config.h>" 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 <rpk@sgi.com>
+// 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.
+
+
index 24580b669927783668ebcc01821666ae4ffc941b..8b00d8cd0b1df6b45c35158a85324bfe12583a23 100644 (file)
@@ -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
 #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 <config.h>" 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 <pbleisch@acm.org> 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 <rpk@sgi.com>
- * 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 <config.h>" 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 <pbleisch@acm.org> 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 <rpk@sgi.com>
+// 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.
+
index c1e326661998aeb673953456d0ac26402f7a42e5..7993a9e8d85ce2ed3f5688da5eefb43356a1e273 100644 (file)
@@ -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