]> git.mxchange.org Git - flightgear.git/blobdiff - Scenery/tile.hxx
Attempting to iron out seg faults and crashes.
[flightgear.git] / Scenery / tile.hxx
index 3f4c8d96a10039e3ee08e87f9ea05ec9c1010efc..dff5e12f8141db136fa2223a60cdbab870919a9b 100644 (file)
 #include <GL/glut.h>
 #include <XGL/xgl.h>
 
+#if defined ( __sun__ )
+extern "C" void *memmove(void *, const void *, size_t);
+extern "C" void *memset(void *, int, size_t);
+#endif
+
 #include <list>         // STL list
 
 #include <Bucket/bucketutils.h>
 #include <Include/fg_types.h>
+#include <Math/mat3.h>
+
+#ifdef NEEDNAMESPACESTD
+using namespace std;
+#endif
+
+
+// Maximum nodes per tile
+#define MAX_NODES 2000
+
+
+// Forward declarations
+class fgTILE;
+class fgMATERIAL;
+
+
+class fgFACE {
+public:
+    int n1, n2, n3;
+
+    fgFACE();
+    ~fgFACE();
+    fgFACE( const fgFACE & image );
+    bool operator < ( const fgFACE & rhs );
+    bool operator == ( const fgFACE & rhs );
+};
 
 
 // Object fragment data class
@@ -52,26 +83,56 @@ class fgFRAGMENT {
 
 public:
     // culling data for this object fragment (fine grain culling)
-    fgCartesianPoint3d center;
+    fgPoint3d center;
     double bounding_radius;
 
     // variable offset data for this object fragment for this frame
-    fgCartesianPoint3d tile_offset;
+    // fgCartesianPoint3d tile_offset;
 
     // saved transformation matrix for this fragment (used by renderer)
     // GLfloat matrix[16];
+    
+    // tile_ptr & material_ptr are set so that when we traverse the
+    // list of fragments we can quickly reference back the tile or
+    // material property this fragment is assigned to.
 
     // material property pointer
-    void *material_ptr;
+    fgMATERIAL *material_ptr;
+
+    // tile pointer
+    fgTILE *tile_ptr;
 
     // OpenGL display list for fragment data
     GLint display_list;
 
-    // Constructor
-    fgFRAGMENT ( void );
+    // face list (this indexes into the master tile vertex list)
+    list < fgFACE > faces;
+
+    // number of faces in this fragment
+    int num_faces;
+
+    // Add a face to the face list
+    void add_face(int n1, int n2, int n3);
+
+    // test if line intesects with this fragment.  p0 and p1 are the
+    // two line end points of the line.  If side_flag is true, check
+    // to see that end points are on opposite sides of face.  Returns
+    // 1 if it intersection found, 0 otherwise.  If it intesects,
+    // result is the point of intersection
+    int intersect( fgPoint3d *end0, fgPoint3d *end1, int side_flag,
+                  fgPoint3d *result);
+
+    // Constructors
+    fgFRAGMENT ();
+    fgFRAGMENT ( const fgFRAGMENT &image );
 
     // Destructor
-    ~fgFRAGMENT ( void );
+    ~fgFRAGMENT ( );
+
+    // operators
+    fgFRAGMENT & operator = ( const fgFRAGMENT & rhs );
+    bool operator == ( const fgFRAGMENT & rhs );
+    bool operator <  ( const fgFRAGMENT & rhs );
 };
 
 
@@ -80,13 +141,18 @@ class fgTILE {
 
 public:
 
+    // node list (the per fragment face lists reference this node list)
+    double (*nodes)[3];
+    int ncount;
+
     // culling data for whole tile (course grain culling)
-    fgCartesianPoint3d center;
+    fgPoint3d center;
     double bounding_radius;
-    fgCartesianPoint3d offset;
+    fgPoint3d offset;
+    GLdouble model_view[16];
 
     // this tile's official location in the world
-    struct fgBUCKET tile_bucket;
+    fgBUCKET tile_bucket;
 
     // the tile cache will mark here if the tile is being used
     int used;
@@ -105,6 +171,63 @@ public:
 
 
 // $Log$
+// Revision 1.17  1998/08/22 14:49:58  curt
+// Attempting to iron out seg faults and crashes.
+// Did some shuffling to fix a initialization order problem between view
+// position, scenery elevation.
+//
+// Revision 1.16  1998/08/22 02:01:34  curt
+// increased fragment list size.
+//
+// Revision 1.15  1998/08/20 15:12:06  curt
+// Used a forward declaration of classes fgTILE and fgMATERIAL to eliminate
+// the need for "void" pointers and casts.
+// Quick hack to count the number of scenery polygons that are being drawn.
+//
+// Revision 1.14  1998/08/12 21:13:06  curt
+// material.cxx: don't load textures if they are disabled
+// obj.cxx: optimizations from Norman Vine
+// tile.cxx: minor tweaks
+// tile.hxx: addition of num_faces
+// tilemgr.cxx: minor tweaks
+//
+// Revision 1.13  1998/07/24 21:42:08  curt
+// material.cxx: whups, double method declaration with no definition.
+// obj.cxx: tweaks to avoid errors in SGI's CC.
+// tile.cxx: optimizations by Norman Vine.
+// tilemgr.cxx: optimizations by Norman Vine.
+//
+// Revision 1.12  1998/07/22 21:41:42  curt
+// Add basic fgFACE methods contributed by Charlie Hotchkiss.
+// intersect optimization from Norman Vine.
+//
+// Revision 1.11  1998/07/12 03:18:28  curt
+// Added ground collision detection.  This involved:
+// - saving the entire vertex list for each tile with the tile records.
+// - saving the face list for each fragment with the fragment records.
+// - code to intersect the current vertical line with the proper face in
+//   an efficient manner as possible.
+// Fixed a bug where the tiles weren't being shifted to "near" (0,0,0)
+//
+// Revision 1.10  1998/07/08 14:47:22  curt
+// Fix GL_MODULATE vs. GL_DECAL problem introduced by splash screen.
+// polare3d.h renamed to polar3d.hxx
+// fg{Cartesian,Polar}Point3d consolodated.
+// Added some initial support for calculating local current ground elevation.
+//
+// Revision 1.9  1998/07/06 21:34:34  curt
+// Added using namespace std for compilers that support this.
+//
+// Revision 1.8  1998/07/04 00:54:30  curt
+// Added automatic mipmap generation.
+//
+// When rendering fragments, use saved model view matrix from associated tile
+// rather than recalculating it with push() translate() pop().
+//
+// Revision 1.7  1998/06/12 00:58:05  curt
+// Build only static libraries.
+// Declare memmove/memset for Sloaris.
+//
 // Revision 1.6  1998/06/08 17:57:54  curt
 // Working first pass at material proporty sorting.
 //