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:
parent
f6f21702ce
commit
a7cf4f0a53
6 changed files with 125 additions and 52 deletions
|
@ -52,10 +52,13 @@ fgMATERIAL::fgMATERIAL ( void ) {
|
||||||
|
|
||||||
|
|
||||||
// Sorting routines
|
// 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
|
// Destructor
|
||||||
|
@ -294,6 +297,12 @@ fgMATERIAL_MGR::~fgMATERIAL_MGR ( void ) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.9 1998/07/13 21:01:57 curt
|
||||||
// Wrote access functions for current fgOPTIONS.
|
// Wrote access functions for current fgOPTIONS.
|
||||||
//
|
//
|
||||||
|
|
|
@ -41,13 +41,14 @@
|
||||||
#include <GL/glut.h>
|
#include <GL/glut.h>
|
||||||
#include <XGL/xgl.h>
|
#include <XGL/xgl.h>
|
||||||
|
|
||||||
#ifdef __sun__
|
#if defined ( __sun__ )
|
||||||
extern "C" void *memmove(void *, const void *, size_t);
|
extern "C" void *memmove(void *, const void *, size_t);
|
||||||
extern "C" void *memset(void *, int, size_t);
|
extern "C" void *memset(void *, int, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string> // Standard C++ string library
|
#include <string> // Standard C++ string library
|
||||||
#include <map> // STL associative "array"
|
#include <map> // STL associative "array"
|
||||||
|
|
||||||
#ifdef NEEDNAMESPACESTD
|
#ifdef NEEDNAMESPACESTD
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#endif
|
#endif
|
||||||
|
@ -119,6 +120,12 @@ extern fgMATERIAL_MGR material_mgr;
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.9 1998/07/06 21:34:33 curt
|
||||||
// Added using namespace std for compilers that support this.
|
// Added using namespace std for compilers that support this.
|
||||||
//
|
//
|
||||||
|
|
|
@ -35,13 +35,14 @@
|
||||||
#include <GL/glut.h>
|
#include <GL/glut.h>
|
||||||
#include <XGL/xgl.h>
|
#include <XGL/xgl.h>
|
||||||
|
|
||||||
#ifdef __sun__
|
#if defined ( __sun__ )
|
||||||
extern "C" void *memmove(void *, const void *, size_t);
|
extern "C" void *memmove(void *, const void *, size_t);
|
||||||
extern "C" void *memset(void *, int, size_t);
|
extern "C" void *memset(void *, int, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string> // Standard C++ library
|
#include <string> // Standard C++ library
|
||||||
#include <map> // STL
|
#include <map> // STL
|
||||||
|
|
||||||
#ifdef NEEDNAMESPACESTD
|
#ifdef NEEDNAMESPACESTD
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#endif
|
#endif
|
||||||
|
@ -216,7 +217,7 @@ int fgObjLoad(char *path, fgTILE *t) {
|
||||||
sscanf(line, "usemtl %s\n", material);
|
sscanf(line, "usemtl %s\n", material);
|
||||||
|
|
||||||
// give the fragment a pointer back to the tile
|
// 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
|
// find this material in the properties list
|
||||||
map < string, fgMATERIAL, less<string> > :: iterator myfind =
|
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",
|
"Ack! unknown usemtl name = %s in %s\n",
|
||||||
material, path);
|
material, path);
|
||||||
} else {
|
} else {
|
||||||
(fgMATERIAL *)fragment.material_ptr = &(*myfind).second;
|
fragment.material_ptr = (void *)(&(*myfind).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize the fragment transformation matrix
|
// initialize the fragment transformation matrix
|
||||||
|
@ -466,6 +467,12 @@ int fgObjLoad(char *path, fgTILE *t) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.19 1998/07/13 21:01:58 curt
|
||||||
// Wrote access functions for current fgOPTIONS.
|
// Wrote access functions for current fgOPTIONS.
|
||||||
//
|
//
|
||||||
|
|
|
@ -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
|
// check to see if end0 and end1 are on opposite sides of
|
||||||
// plane
|
// plane
|
||||||
if ( (x - x0) > FG_EPSILON ) {
|
if ( (x - x0) > FG_EPSILON ) {
|
||||||
t1 = x; t2 = x0; t3 = x1;
|
t1 = x;
|
||||||
|
t2 = x0;
|
||||||
|
t3 = x1;
|
||||||
} else if ( (y - y0) > FG_EPSILON ) {
|
} else if ( (y - y0) > FG_EPSILON ) {
|
||||||
t1 = y; t2 = y0; t3 = y1;
|
t1 = y;
|
||||||
|
t2 = y0;
|
||||||
|
t3 = y1;
|
||||||
} else if ( (z - z0) > FG_EPSILON ) {
|
} else if ( (z - z0) > FG_EPSILON ) {
|
||||||
t1 = z; t2 = z0; t3 = z1;
|
t1 = z;
|
||||||
|
t2 = z0;
|
||||||
|
t3 = z1;
|
||||||
} else {
|
} else {
|
||||||
// everything is too close together to tell the difference
|
// everything is too close together to tell the difference
|
||||||
// so the current intersection point should work as good
|
// so the current intersection point should work as good
|
||||||
// as any
|
// as any
|
||||||
result->x = x; result->y = y; result->z = z;
|
result->x = x;
|
||||||
|
result->y = y;
|
||||||
|
result->z = z;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
side1 = FG_SIGN (t1 - t2);
|
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",
|
// printf("bounding cube = %.2f,%.2f,%.2f %.2f,%.2f,%.2f\n",
|
||||||
// xmin, ymin, zmin, xmax, ymax, zmax);
|
// xmin, ymin, zmin, xmax, ymax, zmax);
|
||||||
// punt if outside bouding cube
|
// punt if outside bouding cube
|
||||||
if ( x < xmin ) {
|
if ( x < (xmin = fg_min3 (p1[0], p2[0], p3[0])) ) {
|
||||||
continue;
|
continue;
|
||||||
} else if ( x > xmax ) {
|
} else if ( x > (xmax = fg_max3 (p1[0], p2[0], p3[0])) ) {
|
||||||
continue;
|
continue;
|
||||||
} else if ( y < ymin ) {
|
} else if ( y < (ymin = fg_min3 (p1[1], p2[1], p3[1])) ) {
|
||||||
continue;
|
continue;
|
||||||
} else if ( y > ymax ) {
|
} else if ( y > (ymax = fg_max3 (p1[1], p2[1], p3[1])) ) {
|
||||||
continue;
|
continue;
|
||||||
} else if ( z < zmin ) {
|
} else if ( z < (zmin = fg_min3 (p1[2], p2[2], p3[2])) ) {
|
||||||
continue;
|
continue;
|
||||||
} else if ( z > zmax ) {
|
} else if ( z > (zmax = fg_max3 (p1[2], p2[2], p3[2])) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,55 +320,74 @@ int fgFRAGMENT::intersect( fgPoint3d *end0, fgPoint3d *end1, int side_flag,
|
||||||
min_dim = fg_min3 (dx, dy, dz);
|
min_dim = fg_min3 (dx, dy, dz);
|
||||||
if ( fabs(min_dim - dx) <= FG_EPSILON ) {
|
if ( fabs(min_dim - dx) <= FG_EPSILON ) {
|
||||||
// x is the smallest dimension
|
// x is the smallest dimension
|
||||||
x1 = p1[1]; y1 = p1[2];
|
x1 = p1[1];
|
||||||
x2 = p2[1]; y2 = p2[2];
|
y1 = p1[2];
|
||||||
x3 = p3[1]; y3 = p3[2];
|
x2 = p2[1];
|
||||||
rx = y; ry = z;
|
y2 = p2[2];
|
||||||
|
x3 = p3[1];
|
||||||
|
y3 = p3[2];
|
||||||
|
rx = y;
|
||||||
|
ry = z;
|
||||||
} else if ( fabs(min_dim - dy) <= FG_EPSILON ) {
|
} else if ( fabs(min_dim - dy) <= FG_EPSILON ) {
|
||||||
// y is the smallest dimension
|
// y is the smallest dimension
|
||||||
x1 = p1[0]; y1 = p1[2];
|
x1 = p1[0];
|
||||||
x2 = p2[0]; y2 = p2[2];
|
y1 = p1[2];
|
||||||
x3 = p3[0]; y3 = p3[2];
|
x2 = p2[0];
|
||||||
rx = x; ry = z;
|
y2 = p2[2];
|
||||||
|
x3 = p3[0];
|
||||||
|
y3 = p3[2];
|
||||||
|
rx = x;
|
||||||
|
ry = z;
|
||||||
} else if ( fabs(min_dim - dz) <= FG_EPSILON ) {
|
} else if ( fabs(min_dim - dz) <= FG_EPSILON ) {
|
||||||
// z is the smallest dimension
|
// z is the smallest dimension
|
||||||
x1 = p1[0]; y1 = p1[1];
|
x1 = p1[0];
|
||||||
x2 = p2[0]; y2 = p2[1];
|
y1 = p1[1];
|
||||||
x3 = p3[0]; y3 = p3[1];
|
x2 = p2[0];
|
||||||
rx = x; ry = y;
|
y2 = p2[1];
|
||||||
|
x3 = p3[0];
|
||||||
|
y3 = p3[1];
|
||||||
|
rx = x;
|
||||||
|
ry = y;
|
||||||
} else {
|
} else {
|
||||||
// all dimensions are really small so lets call it close
|
// all dimensions are really small so lets call it close
|
||||||
// enough and return a successful match
|
// 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);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if intersection point is on the same side of p1 <-> p2 as p3
|
// 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));
|
t1 = (y1 - y2) / (x1 - x2);
|
||||||
side2 = FG_SIGN ((y1 - y2) * ((rx) - x2) / (x1 - x2) + y2 - (ry));
|
side1 = FG_SIGN (t1 * ((x3) - x2) + y2 - (y3));
|
||||||
|
side2 = FG_SIGN (t1 * ((rx) - x2) + y2 - (ry));
|
||||||
if ( side1 != side2 ) {
|
if ( side1 != side2 ) {
|
||||||
// printf("failed side 1 check\n");
|
// printf("failed side 1 check\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if intersection point is on correct side of p2 <-> p3 as p1
|
// check if intersection point is on correct side of p2 <-> p3 as p1
|
||||||
side1 = FG_SIGN ((y2 - y3) * ((x1) - x3) / (x2 - x3) + y3 - (y1));
|
t1 = (y2 - y3) / (x2 - x3);
|
||||||
side2 = FG_SIGN ((y2 - y3) * ((rx) - x3) / (x2 - x3) + y3 - (ry));
|
side1 = FG_SIGN (t1 * ((x1) - x3) + y3 - (y1));
|
||||||
|
side2 = FG_SIGN (t1 * ((rx) - x3) + y3 - (ry));
|
||||||
if ( side1 != side2 ) {
|
if ( side1 != side2 ) {
|
||||||
// printf("failed side 2 check\n");
|
// printf("failed side 2 check\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if intersection point is on correct side of p1 <-> p3 as p2
|
// check if intersection point is on correct side of p1 <-> p3 as p2
|
||||||
side1 = FG_SIGN ((y1 - y3) * ((x2) - x3) / (x1 - x3) + y3 - (y2));
|
t1 = (y1 - y3) / (x1 - x3);
|
||||||
side2 = FG_SIGN ((y1 - y3) * ((rx) - x3) / (x1 - x3) + y3 - (ry));
|
side1 = FG_SIGN (t1 * ((x2) - x3) + y3 - (y2));
|
||||||
|
side2 = FG_SIGN (t1 * ((rx) - x3) + y3 - (ry));
|
||||||
if ( side1 != side2 ) {
|
if ( side1 != side2 ) {
|
||||||
// printf("failed side 3 check\n");
|
// printf("failed side 3 check\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf( "intersection point = %.2f %.2f %.2f\n", x, y, z);
|
// 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);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,6 +446,12 @@ fgTILE::~fgTILE ( void ) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.4 1998/07/22 21:41:42 curt
|
||||||
// Add basic fgFACE methods contributed by Charlie Hotchkiss.
|
// Add basic fgFACE methods contributed by Charlie Hotchkiss.
|
||||||
// intersect optimization from Norman Vine.
|
// intersect optimization from Norman Vine.
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include <GL/glut.h>
|
#include <GL/glut.h>
|
||||||
#include <XGL/xgl.h>
|
#include <XGL/xgl.h>
|
||||||
|
|
||||||
#ifdef __sun__
|
#if defined ( __sun__ )
|
||||||
extern "C" void *memmove(void *, const void *, size_t);
|
extern "C" void *memmove(void *, const void *, size_t);
|
||||||
extern "C" void *memset(void *, int, size_t);
|
extern "C" void *memset(void *, int, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
@ -163,6 +163,12 @@ public:
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.12 1998/07/22 21:41:42 curt
|
||||||
// Add basic fgFACE methods contributed by Charlie Hotchkiss.
|
// Add basic fgFACE methods contributed by Charlie Hotchkiss.
|
||||||
// intersect optimization from Norman Vine.
|
// intersect optimization from Norman Vine.
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
|
|
||||||
#define FG_LOCAL_X_Y 81 // max(o->tile_diameter) ** 2
|
#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.
|
// closest (potentially viewable) tiles, centered on current tile.
|
||||||
// This is an array of pointers to cache indexes.
|
// This is an array of pointers to cache indexes.
|
||||||
|
@ -216,14 +218,16 @@ int fgTileMgrUpdate( void ) {
|
||||||
|
|
||||||
|
|
||||||
// Calculate shortest distance from point to line
|
// 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;
|
MAT3vec p, p0;
|
||||||
double dist;
|
double dist;
|
||||||
|
|
||||||
p[0] = tc->x; p[1] = tc->y; p[2] = tc->z;
|
p[0] = tc->x; p[1] = tc->y; p[2] = tc->z;
|
||||||
p0[0] = vp->x; p0[1] = vp->y; p0[2] = vp->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);
|
// printf("dist = %.2f\n", dist);
|
||||||
|
|
||||||
|
@ -397,12 +401,13 @@ void fgTileMgrRender( void ) {
|
||||||
// calculate distance from vertical tangent line at
|
// calculate distance from vertical tangent line at
|
||||||
// current position to center of tile.
|
// current position to center of tile.
|
||||||
|
|
||||||
/* printf("distance = %.2f, bounding radius = %.2f\n",
|
/* printf("distance squared = %.2f, bounding radius = %.2f\n",
|
||||||
point_line_dist(&(t->offset), &(v->view_pos), v->local_up),
|
point_line_dist_squared(&(t->offset), &(v->view_pos),
|
||||||
t->bounding_radius); */
|
v->local_up), t->bounding_radius); */
|
||||||
|
|
||||||
dist = point_line_dist(&(t->center), &(v->abs_view_pos), v->local_up);
|
dist = point_line_dist_squared( &(t->center), &(v->abs_view_pos),
|
||||||
if ( dist < t->bounding_radius ) {
|
v->local_up );
|
||||||
|
if ( dist < FG_SQUARE(t->bounding_radius) ) {
|
||||||
|
|
||||||
// traverse fragment list for tile
|
// traverse fragment list for tile
|
||||||
current = t->fragment_list.begin();
|
current = t->fragment_list.begin();
|
||||||
|
@ -411,14 +416,14 @@ void fgTileMgrRender( void ) {
|
||||||
while ( current != last ) {
|
while ( current != last ) {
|
||||||
frag_ptr = &(*current);
|
frag_ptr = &(*current);
|
||||||
current++;
|
current++;
|
||||||
/* printf("distance = %.2f, bounding radius = %.2f\n",
|
/* printf("distance squared = %.2f, bounding radius = %.2f\n",
|
||||||
point_line_dist( &(frag_ptr->center),
|
point_line_dist_squared( &(frag_ptr->center),
|
||||||
&(v->abs_view_pos), v->local_up),
|
&(v->abs_view_pos), v->local_up),
|
||||||
frag_ptr->bounding_radius); */
|
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);
|
&(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),
|
if ( frag_ptr->intersect( &(v->abs_view_pos),
|
||||||
&earth_center, 0, &result ) ) {
|
&earth_center, 0, &result ) ) {
|
||||||
// compute geocentric coordinates of tile center
|
// compute geocentric coordinates of tile center
|
||||||
|
@ -559,6 +564,12 @@ void fgTileMgrRender( void ) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $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
|
// Revision 1.26 1998/07/20 12:51:26 curt
|
||||||
// Added far clip plane to fragment clipping calculations and tie this to
|
// Added far clip plane to fragment clipping calculations and tie this to
|
||||||
// weather->visibility. This way you can increase framerates by increasing
|
// weather->visibility. This way you can increase framerates by increasing
|
||||||
|
|
Loading…
Add table
Reference in a new issue