1 // fragment.hxx -- routines to handle "atomic" display objects
3 // Written by Curtis Olson, started August 1998.
5 // Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 # error This library requires C++
43 #include <Include/compiler.h>
47 #include <Include/fg_constants.h>
48 #include <Math/point3d.hxx>
56 fgFACE( int a = 0, int b =0, int c =0 )
57 : n1(a), n2(b), n3(c) {}
59 fgFACE( const fgFACE & image )
60 : n1(image.n1), n2(image.n2), n3(image.n3) {}
62 fgFACE& operator= ( const fgFACE & image ) {
63 n1 = image.n1; n2 = image.n2; n3 = image.n3; return *this;
70 operator== ( const fgFACE& lhs, const fgFACE& rhs )
72 return (lhs.n1 == rhs.n1) && (lhs.n2 == rhs.n2) && (lhs.n3 == rhs.n3);
75 // Forward declarations
79 // Object fragment data class
85 // culling data for this object fragment (fine grain culling)
87 double bounding_radius;
89 // variable offset data for this object fragment for this frame
90 // fgCartesianPoint3d tile_offset;
92 // saved transformation matrix for this fragment (used by renderer)
93 // GLfloat matrix[16];
95 // tile_ptr & material_ptr are set so that when we traverse the
96 // list of fragments we can quickly reference back the tile or
97 // material property this fragment is assigned to.
99 // material property pointer
100 FGMaterialSlot *material_ptr;
103 FGTileEntry *tile_ptr;
105 // OpenGL display list for fragment data
106 // GLint display_list;
108 // face list (this indexes into the master tile vertex list)
109 typedef vector < fgFACE > container;
110 typedef container::iterator iterator;
111 typedef container::const_iterator const_iterator;
117 // number of faces in this fragment
122 // Add a face to the face list
123 void add_face(int n1, int n2, int n3) {
124 faces.push_back( fgFACE(n1,n2,n3) );
127 // test if line intesects with this fragment. p0 and p1 are the
128 // two line end points of the line. If side_flag is true, check
129 // to see that end points are on opposite sides of face. Returns
130 // 1 if it intersection found, 0 otherwise. If it intesects,
131 // result is the point of intersection
132 int intersect( const Point3D& end0,
135 Point3D& result) const;
138 fgFRAGMENT () { /*faces.reserve(512);*/}
139 fgFRAGMENT ( const fgFRAGMENT &image );
142 ~fgFRAGMENT() { faces.erase( faces.begin(), faces.end() ); }
145 fgFRAGMENT & operator = ( const fgFRAGMENT & rhs );
147 bool operator < ( const fgFRAGMENT & rhs ) const {
148 // This is completely arbitrary. It satisfies RW's STL implementation
149 return bounding_radius < rhs.bounding_radius;
153 faces.erase( faces.begin(), faces.end() );
156 // int deleteDisplayList() {
157 // xglDeleteLists( display_list, 1 ); return 0;
160 friend bool operator== ( const fgFRAGMENT & lhs, const fgFRAGMENT & rhs );
164 operator == ( const fgFRAGMENT & lhs, const fgFRAGMENT & rhs ) {
165 return lhs.center == rhs.center;
169 #endif // _FRAGMENT_HXX