1
0
Fork 0

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.
This commit is contained in:
curt 1998-07-24 21:42:06 +00:00
parent f6f21702ce
commit a7cf4f0a53
6 changed files with 125 additions and 52 deletions

View file

@ -52,10 +52,13 @@ fgMATERIAL::fgMATERIAL ( void ) {
// 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
@ -294,6 +297,12 @@ fgMATERIAL_MGR::~fgMATERIAL_MGR ( void ) {
// $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.
//

View file

@ -41,13 +41,14 @@
#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
@ -119,6 +120,12 @@ extern fgMATERIAL_MGR material_mgr;
// $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.
//

View file

@ -35,13 +35,14 @@
#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
@ -216,7 +217,7 @@ int fgObjLoad(char *path, fgTILE *t) {
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 =
@ -226,7 +227,7 @@ int fgObjLoad(char *path, fgTILE *t) {
"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
@ -466,6 +467,12 @@ int fgObjLoad(char *path, fgTILE *t) {
// $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.
//

View file

@ -256,16 +256,24 @@ int fgFRAGMENT::intersect( fgPoint3d *end0, fgPoint3d *end1, int side_flag,
// 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);
@ -287,17 +295,17 @@ int fgFRAGMENT::intersect( fgPoint3d *end0, fgPoint3d *end1, int side_flag,
// 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;
}
@ -312,55 +320,74 @@ int fgFRAGMENT::intersect( fgPoint3d *end0, fgPoint3d *end1, int side_flag,
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);
}
@ -419,6 +446,12 @@ fgTILE::~fgTILE ( void ) {
// $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.

View file

@ -41,7 +41,7 @@
#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
@ -163,6 +163,12 @@ public:
// $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.

View file

@ -55,6 +55,8 @@
#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.
@ -216,14 +218,16 @@ int fgTileMgrUpdate( void ) {
// 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);
@ -397,12 +401,13 @@ void fgTileMgrRender( void ) {
// 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();
@ -411,14 +416,14 @@ void fgTileMgrRender( void ) {
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
@ -559,6 +564,12 @@ void fgTileMgrRender( void ) {
// $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