Curtis L.Olson writes:
>
>Norman Vine writes:
>> another problem is in simgear / sky / cloud.cxx
>>
>> bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double
>lon, double lat,
>> double alt )
>> {
>> ....
>> // now calculate update texture coordinates
>> if ( last_lon < -900 ) {
>> cout << "last_lon < -900" << endl;
>> last_lon = lon;
>> last_lat = lat;
>> }
>> // change if( lon - lat_lon != 0 || lat-last_lat != 0 ) to
>> if ( fabs(lon-last_lon) > FLT_EPSILON || fabs(lat-last_lat) >
>> FLT_EPSILON ) {
>> ...
>> }
>
>Norman, can you provide any further information as to how this change
>eliminates problems on the windows side?
when there is no change there is a floating point exception in
calc_gc_course_dist(). I tied this with both the original and the
optimized versions.
>I understand that in general with floating point compares you want to
>test if the absolute value of the difference is < some epsilon,
>however, in this case I think I'm justified with my code. The current
>code is actually:
>
> if ( lon != last_lon || lat != last_lat ) {
>
Ooops sorry about the code rearangment, I wrote the email from
memory and should have used cut and paste :-)
Anyway if ther is no change the direction part of the
calc_course_dist() is undefined.
Think about it
if I do not move, what direction did I move in ? :-)))
Better yet enable FPE exception reporting
// I think this is correct for Linux
======== cut ========
// Add the following code to main.cxx
// and set it up as
// SetSignals(CATCH_SIGFPE_FLAG)
#define CATCH_SIGINT_FLAG 1
#define CATCH_SIGFPE_FLAG 2
#define CATCH_SIGSEGV_FLAG 4
#define CATCH_SIGILL_FLAG 8
#define CATCH_SIGBUS_FLAG 16
#define CATCH_ALL_SIGNAL_FLAGS 31
#ifdef linux
#define SAY_IT_AGAIN
/* use sysv_signal in libc6 -- signal broken for SIGINT */
#define _XOPEN_SOURCE 1
#endif
#ifdef WIN32
#ifndef __CYGWIN__
#include <io.h>
#endif
#define NO_GETPWNAM
#define NO_SOFT_LINKS
#define SAY_IT_AGAIN
#include <float.h>
#endif
#include <signal.h>
extern void SetSignals(int flags);
extern int matherr(int *);
static void HandleSignals(int sig);
static void InitializeSignals(void);
static int sg_catch_category;
static int setSignalsCalled= 0;
InitializeSignals()
{
#ifdef linux
__setfpucw(0x1372);
#endif
#if defined(WIN32)
#if !defined(__CYGWIN__)
/* Need to unmask exceptions after every interrupt under Windows */
/* Initialize floating-point package. */
_fpreset();
/* first argument specifies the exceptions that should remain masked */
/* WARNING!!!! With Visual C++ 4.2 and Windows NT 4.0, the overflow
interrupt
is not reported immediately - it shows up on the NEXT floating point
operation! */
_controlfp( _EM_DENORMAL | _EM_INEXACT | _EM_UNDERFLOW | _EM_OVERFLOW,
_MCW_EM );
#else
// !!!! NO CYGWIN SUPPORT YET
#endif
#endif
}
void SetSignals(int flags)
{
if (!setSignalsCalled) InitializeSignals();
signal(SIGINT, flags&1? &HandleSignals : SIG_DFL);
signal(SIGFPE, flags&2? &HandleSignals : SIG_DFL);
signal(SIGSEGV, flags&4? &HandleSignals : SIG_DFL);
signal(SIGILL, flags&8? &HandleSignals : SIG_DFL);
#ifdef SIGBUS
signal(SIGBUS, flags&16? &HandleSignals : SIG_DFL);
#endif
}
then
static void HandleSignals(int sig)
{
signal(sig, &HandleSignals);
#ifdef SAY_IT_AGAIN
InitializeSignals();
#endif
if (sig==SIGINT)
{
sg_catch_category= 0x04;
SG_LOG(SG_GENERAL, SG_ALERT,"Keyboard interrupt received (SIGINT)");
}
else if (sig==SIGFPE)
{
sg_catch_category= 0x01;
SG_LOG(SG_GENERAL, SG_ALERT,"Floating point interrupt (SIGFPE)");
#define NASTY
#ifdef NASTY
SetSignals( 0 );
exit( 0 );
#endif
}
else if (sig==SIGSEGV)
SG_LOG(SG_GENERAL, SG_ALERT,"Segmentation violation interrupt
(SIGSEGV)");
else if (sig==SIGILL)
SG_LOG(SG_GENERAL, SG_ALERT,"Illegal instruction interrupt (SIGILL)");
#ifdef SIGBUS
else if (sig==SIGBUS)
SG_LOG(SG_GENERAL, SG_ALERT,"Misaligned address interrupt (SIGBUS)");
#endif
SG_LOG(SG_GENERAL, SG_ALERT,"Unrecognized signal delivered to
HandleSignals");
}
======= cut =======
Cheers
Norman
_______________________________________________
Flightgear-devel mailing list
[EMAIL PROTECTED]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel