obj.cxx: tweaks to avoid errors in SGI's CC.
tile.cxx: optimizations by Norman Vine.
tilemgr.cxx: optimizations by Norman Vine.
// Sorting routines
-void fgMATERIAL::init_sort_list( void );
+void fgMATERIAL::init_sort_list( void ) {
+}
-int fgMATERIAL::append_sort_list( fgFRAGMENT *object );
+int fgMATERIAL::append_sort_list( fgFRAGMENT *object ) {
+ return(0);
+}
// Destructor
// $Log$
+// Revision 1.10 1998/07/24 21:42:06 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.9 1998/07/13 21:01:57 curt
// Wrote access functions for current fgOPTIONS.
//
#include <GL/glut.h>
#include <XGL/xgl.h>
-#ifdef __sun__
+#if defined ( __sun__ )
extern "C" void *memmove(void *, const void *, size_t);
extern "C" void *memset(void *, int, size_t);
#endif
-#include <string> // Standard C++ string library
-#include <map> // STL associative "array"
+#include <string> // Standard C++ string library
+#include <map> // STL associative "array"
+
#ifdef NEEDNAMESPACESTD
using namespace std;
#endif
// $Log$
+// Revision 1.10 1998/07/24 21:42:06 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.9 1998/07/06 21:34:33 curt
// Added using namespace std for compilers that support this.
//
#include <GL/glut.h>
#include <XGL/xgl.h>
-#ifdef __sun__
+#if defined ( __sun__ )
extern "C" void *memmove(void *, const void *, size_t);
extern "C" void *memset(void *, int, size_t);
#endif
-#include <string> // Standard C++ library
-#include <map> // STL
+#include <string> // Standard C++ library
+#include <map> // STL
+
#ifdef NEEDNAMESPACESTD
using namespace std;
#endif
sscanf(line, "usemtl %s\n", material);
// give the fragment a pointer back to the tile
- (fgTILE *)fragment.tile_ptr = t;
+ (fgTILE *)(fragment.tile_ptr) = t;
// find this material in the properties list
map < string, fgMATERIAL, less<string> > :: iterator myfind =
"Ack! unknown usemtl name = %s in %s\n",
material, path);
} else {
- (fgMATERIAL *)fragment.material_ptr = &(*myfind).second;
+ fragment.material_ptr = (void *)(&(*myfind).second);
}
// initialize the fragment transformation matrix
// $Log$
+// Revision 1.20 1998/07/24 21:42:07 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.19 1998/07/13 21:01:58 curt
// Wrote access functions for current fgOPTIONS.
//
// check to see if end0 and end1 are on opposite sides of
// plane
if ( (x - x0) > FG_EPSILON ) {
- t1 = x; t2 = x0; t3 = x1;
+ t1 = x;
+ t2 = x0;
+ t3 = x1;
} else if ( (y - y0) > FG_EPSILON ) {
- t1 = y; t2 = y0; t3 = y1;
+ t1 = y;
+ t2 = y0;
+ t3 = y1;
} else if ( (z - z0) > FG_EPSILON ) {
- t1 = z; t2 = z0; t3 = z1;
+ t1 = z;
+ t2 = z0;
+ t3 = z1;
} else {
// everything is too close together to tell the difference
// so the current intersection point should work as good
// as any
- result->x = x; result->y = y; result->z = z;
+ result->x = x;
+ result->y = y;
+ result->z = z;
return(1);
}
side1 = FG_SIGN (t1 - t2);
// printf("bounding cube = %.2f,%.2f,%.2f %.2f,%.2f,%.2f\n",
// xmin, ymin, zmin, xmax, ymax, zmax);
// punt if outside bouding cube
- if ( x < xmin ) {
+ if ( x < (xmin = fg_min3 (p1[0], p2[0], p3[0])) ) {
continue;
- } else if ( x > xmax ) {
+ } else if ( x > (xmax = fg_max3 (p1[0], p2[0], p3[0])) ) {
continue;
- } else if ( y < ymin ) {
+ } else if ( y < (ymin = fg_min3 (p1[1], p2[1], p3[1])) ) {
continue;
- } else if ( y > ymax ) {
+ } else if ( y > (ymax = fg_max3 (p1[1], p2[1], p3[1])) ) {
continue;
- } else if ( z < zmin ) {
+ } else if ( z < (zmin = fg_min3 (p1[2], p2[2], p3[2])) ) {
continue;
- } else if ( z > zmax ) {
+ } else if ( z > (zmax = fg_max3 (p1[2], p2[2], p3[2])) ) {
continue;
}
min_dim = fg_min3 (dx, dy, dz);
if ( fabs(min_dim - dx) <= FG_EPSILON ) {
// x is the smallest dimension
- x1 = p1[1]; y1 = p1[2];
- x2 = p2[1]; y2 = p2[2];
- x3 = p3[1]; y3 = p3[2];
- rx = y; ry = z;
+ x1 = p1[1];
+ y1 = p1[2];
+ x2 = p2[1];
+ y2 = p2[2];
+ x3 = p3[1];
+ y3 = p3[2];
+ rx = y;
+ ry = z;
} else if ( fabs(min_dim - dy) <= FG_EPSILON ) {
// y is the smallest dimension
- x1 = p1[0]; y1 = p1[2];
- x2 = p2[0]; y2 = p2[2];
- x3 = p3[0]; y3 = p3[2];
- rx = x; ry = z;
+ x1 = p1[0];
+ y1 = p1[2];
+ x2 = p2[0];
+ y2 = p2[2];
+ x3 = p3[0];
+ y3 = p3[2];
+ rx = x;
+ ry = z;
} else if ( fabs(min_dim - dz) <= FG_EPSILON ) {
// z is the smallest dimension
- x1 = p1[0]; y1 = p1[1];
- x2 = p2[0]; y2 = p2[1];
- x3 = p3[0]; y3 = p3[1];
- rx = x; ry = y;
+ x1 = p1[0];
+ y1 = p1[1];
+ x2 = p2[0];
+ y2 = p2[1];
+ x3 = p3[0];
+ y3 = p3[1];
+ rx = x;
+ ry = y;
} else {
// all dimensions are really small so lets call it close
// enough and return a successful match
- result->x = x; result->y = y; result->z = z;
+ result->x = x;
+ result->y = y;
+ result->z = z;
return(1);
}
// check if intersection point is on the same side of p1 <-> p2 as p3
- side1 = FG_SIGN ((y1 - y2) * ((x3) - x2) / (x1 - x2) + y2 - (y3));
- side2 = FG_SIGN ((y1 - y2) * ((rx) - x2) / (x1 - x2) + y2 - (ry));
+ t1 = (y1 - y2) / (x1 - x2);
+ side1 = FG_SIGN (t1 * ((x3) - x2) + y2 - (y3));
+ side2 = FG_SIGN (t1 * ((rx) - x2) + y2 - (ry));
if ( side1 != side2 ) {
// printf("failed side 1 check\n");
continue;
}
// check if intersection point is on correct side of p2 <-> p3 as p1
- side1 = FG_SIGN ((y2 - y3) * ((x1) - x3) / (x2 - x3) + y3 - (y1));
- side2 = FG_SIGN ((y2 - y3) * ((rx) - x3) / (x2 - x3) + y3 - (ry));
+ t1 = (y2 - y3) / (x2 - x3);
+ side1 = FG_SIGN (t1 * ((x1) - x3) + y3 - (y1));
+ side2 = FG_SIGN (t1 * ((rx) - x3) + y3 - (ry));
if ( side1 != side2 ) {
// printf("failed side 2 check\n");
continue;
}
// check if intersection point is on correct side of p1 <-> p3 as p2
- side1 = FG_SIGN ((y1 - y3) * ((x2) - x3) / (x1 - x3) + y3 - (y2));
- side2 = FG_SIGN ((y1 - y3) * ((rx) - x3) / (x1 - x3) + y3 - (ry));
+ t1 = (y1 - y3) / (x1 - x3);
+ side1 = FG_SIGN (t1 * ((x2) - x3) + y3 - (y2));
+ side2 = FG_SIGN (t1 * ((rx) - x3) + y3 - (ry));
if ( side1 != side2 ) {
// printf("failed side 3 check\n");
continue;
}
// printf( "intersection point = %.2f %.2f %.2f\n", x, y, z);
- result->x = x; result->y = y; result->z = z;
+ result->x = x;
+ result->y = y;
+ result->z = z;
return(1);
}
// $Log$
+// Revision 1.5 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.4 1998/07/22 21:41:42 curt
// Add basic fgFACE methods contributed by Charlie Hotchkiss.
// intersect optimization from Norman Vine.
#include <GL/glut.h>
#include <XGL/xgl.h>
-#ifdef __sun__
+#if defined ( __sun__ )
extern "C" void *memmove(void *, const void *, size_t);
extern "C" void *memset(void *, int, size_t);
#endif
// $Log$
+// 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.
#define FG_LOCAL_X_Y 81 // max(o->tile_diameter) ** 2
+#define FG_SQUARE(X) ((X) * (X))
+
// closest (potentially viewable) tiles, centered on current tile.
// This is an array of pointers to cache indexes.
// Calculate shortest distance from point to line
-static double point_line_dist( fgPoint3d *tc, fgPoint3d *vp, MAT3vec d) {
+static double point_line_dist_squared( fgPoint3d *tc, fgPoint3d *vp,
+ MAT3vec d )
+{
MAT3vec p, p0;
double dist;
p[0] = tc->x; p[1] = tc->y; p[2] = tc->z;
p0[0] = vp->x; p0[1] = vp->y; p0[2] = vp->z;
- dist = fgPointLine(p, p0, d);
+ dist = fgPointLineSquared(p, p0, d);
// printf("dist = %.2f\n", dist);
// calculate distance from vertical tangent line at
// current position to center of tile.
- /* printf("distance = %.2f, bounding radius = %.2f\n",
- point_line_dist(&(t->offset), &(v->view_pos), v->local_up),
- t->bounding_radius); */
+ /* printf("distance squared = %.2f, bounding radius = %.2f\n",
+ point_line_dist_squared(&(t->offset), &(v->view_pos),
+ v->local_up), t->bounding_radius); */
- dist = point_line_dist(&(t->center), &(v->abs_view_pos), v->local_up);
- if ( dist < t->bounding_radius ) {
+ dist = point_line_dist_squared( &(t->center), &(v->abs_view_pos),
+ v->local_up );
+ if ( dist < FG_SQUARE(t->bounding_radius) ) {
// traverse fragment list for tile
current = t->fragment_list.begin();
while ( current != last ) {
frag_ptr = &(*current);
current++;
- /* printf("distance = %.2f, bounding radius = %.2f\n",
- point_line_dist( &(frag_ptr->center),
+ /* printf("distance squared = %.2f, bounding radius = %.2f\n",
+ point_line_dist_squared( &(frag_ptr->center),
&(v->abs_view_pos), v->local_up),
frag_ptr->bounding_radius); */
- dist = point_line_dist( &(frag_ptr->center),
+ dist = point_line_dist_squared( &(frag_ptr->center),
&(v->abs_view_pos), v->local_up);
- if ( dist <= frag_ptr->bounding_radius ) {
+ if ( dist <= FG_SQUARE(frag_ptr->bounding_radius) ) {
if ( frag_ptr->intersect( &(v->abs_view_pos),
&earth_center, 0, &result ) ) {
// compute geocentric coordinates of tile center
// $Log$
+// Revision 1.27 1998/07/24 21:42:09 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.26 1998/07/20 12:51:26 curt
// Added far clip plane to fragment clipping calculations and tie this to
// weather->visibility. This way you can increase framerates by increasing