diff --git a/src/buildstardb.cpp b/src/buildstardb.cpp index ad3a5119e..34f189818 100644 --- a/src/buildstardb.cpp +++ b/src/buildstardb.cpp @@ -1066,13 +1066,13 @@ void CompareTycho() { CheckStarRecord(tycDatabase); if (++recs % 10000 == 0) - { + { if (verbose>=0) cout << recs << " records.\n"; else cout << "."; - cout.flush(); - } + cout.flush(); + } } if (verbose<0) cout << "\n"; @@ -1137,13 +1137,13 @@ int main(int argc, char* argv[]) { ReadStarRecord(mainDatabase); if (stars.size() % 10000 == 0) - { + { if (verbose>=0) cout << stars.size() << " records.\n"; else cout << "."; - cout.flush(); - } + cout.flush(); + } } if (verbose<0) cout << "\n"; diff --git a/src/cel3ds/3dschunk.h b/src/cel3ds/3dschunk.h index 80b24d91a..3a406c688 100644 --- a/src/cel3ds/3dschunk.h +++ b/src/cel3ds/3dschunk.h @@ -1,5 +1,5 @@ // 3dschunk.h -// +// // Copyright (C) 2001, Chris Laurel // // This program is free software; you can redistribute it and/or diff --git a/src/cel3ds/3dsmodel.cpp b/src/cel3ds/3dsmodel.cpp index a59e85ded..ac0c960c7 100644 --- a/src/cel3ds/3dsmodel.cpp +++ b/src/cel3ds/3dsmodel.cpp @@ -1,5 +1,5 @@ // 3dsmodel.cpp -// +// // Copyright (C) 2000, Chris Laurel // // This program is free software; you can redistribute it and/or diff --git a/src/cel3ds/3dsmodel.h b/src/cel3ds/3dsmodel.h index c3c0ce30d..8afacbc95 100644 --- a/src/cel3ds/3dsmodel.h +++ b/src/cel3ds/3dsmodel.h @@ -1,5 +1,5 @@ // 3dsmodel.h -// +// // Copyright (C) 2001, Chris Laurel // // This program is free software; you can redistribute it and/or @@ -95,7 +95,7 @@ class M3DTriangleMesh void addMeshMaterialGroup(M3DMeshMaterialGroup* matGroup); M3DMeshMaterialGroup* getMeshMaterialGroup(uint32) const; uint32 getMeshMaterialGroupCount() const; - + private: std::vector points; std::vector texCoords; diff --git a/src/cel3ds/3dsread.h b/src/cel3ds/3dsread.h index d8ac25572..fa64302e5 100644 --- a/src/cel3ds/3dsread.h +++ b/src/cel3ds/3dsread.h @@ -1,5 +1,5 @@ // 3dsread.h -// +// // Copyright (C) 2000, Chris Laurel // // This program is free software; you can redistribute it and/or diff --git a/src/celengine/CGBuffer.h b/src/celengine/CGBuffer.h index dc71af92a..ebc609a0f 100755 --- a/src/celengine/CGBuffer.h +++ b/src/celengine/CGBuffer.h @@ -1,6 +1,6 @@ /* -Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. +Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, @@ -37,7 +37,7 @@ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer */ -// Note that this is modified Apple source code, and not in its entireity (some classes are, some aren't), +// Note that this is modified Apple source code, and not in its entireity (some classes are, some aren't), // but we might as well leave it in here, even though it doesn't sound like we have to. // -bob @@ -51,54 +51,54 @@ class CGFrame : public CGRect { public: - CGFrame(float x0, float y0, float w, float h) - { - *this = CGRectMake(x0,y0,w,h); - } - - explicit CGFrame(float w = 0, float h = 0) - { - *this = CGRectMake(0,0,w,h); - } - - CGFrame(const Rect& rect) - { - origin.x = rect.left, size.width = rect.right - rect.left; - origin.y = rect.top, size.height = rect.bottom - rect.top; - } - - CGFrame(const CGRect& copy) - { - origin = copy.origin; - size = copy.size; - } - - CGFrame(const CGSize& size) - { - origin.x = origin.y = 0; - this->size = size; - } - - CGFrame(float x, float y, const CGSize& size) - { - *this = CGRectMake(x, y, size.width, size.height); - } - - CGFrame(const CGPoint& pos, const CGSize& size) - { - *this = CGRectMake(pos.x, pos.y, size.width, size.height); - } - - void Offset(float dx, float dy) - { - origin.x += dx, origin.y += dy; - } - - void Inset(float dx, float dy) - { - origin.x += dx, origin.y += dy; - size.width -= dx*2, size.height -= dy*2; - } + CGFrame(float x0, float y0, float w, float h) + { + *this = CGRectMake(x0,y0,w,h); + } + + explicit CGFrame(float w = 0, float h = 0) + { + *this = CGRectMake(0,0,w,h); + } + + CGFrame(const Rect& rect) + { + origin.x = rect.left, size.width = rect.right - rect.left; + origin.y = rect.top, size.height = rect.bottom - rect.top; + } + + CGFrame(const CGRect& copy) + { + origin = copy.origin; + size = copy.size; + } + + CGFrame(const CGSize& size) + { + origin.x = origin.y = 0; + this->size = size; + } + + CGFrame(float x, float y, const CGSize& size) + { + *this = CGRectMake(x, y, size.width, size.height); + } + + CGFrame(const CGPoint& pos, const CGSize& size) + { + *this = CGRectMake(pos.x, pos.y, size.width, size.height); + } + + void Offset(float dx, float dy) + { + origin.x += dx, origin.y += dy; + } + + void Inset(float dx, float dy) + { + origin.x += dx, origin.y += dy; + size.width -= dx*2, size.height -= dy*2; + } }; class MemoryBuffer @@ -146,8 +146,8 @@ class Datafile { int ref_count; FILE* file; - -public: + +public: MemoryBuffer* data_buffer; unsigned long data_size; @@ -165,13 +165,13 @@ public: ++ref_count; return this; } - + void Release() { - if (--ref_count==0) + if (--ref_count==0) delete this; } - + int Open(const char* path) { file = fopen(path,"r"); @@ -191,7 +191,7 @@ public: //DPRINTF(0,"Datafile::Open() - Successfully opened '%s' %d bytes\n", path, data_size); return 1; } - + int Read() { if ((file == NULL) || (data_buffer == NULL) || (data_size == 0)) { @@ -199,18 +199,18 @@ public: Reset(); return 0; } - - fseek(file, 0, SEEK_SET); + + fseek(file, 0, SEEK_SET); if (fread((void*)data_buffer->data, 1, data_size, file) != data_size) { DPRINTF(0,"Datafile::Read() - Didn't read to finish?"); Reset(); return 0; } - + //DPRINTF(0,"Datafile::Read() - Successfully read all %d bytes into buffer\n",data_size); return 1; } - + void Close() { if (file) { @@ -218,7 +218,7 @@ public: file = NULL; } } - + void Reset() { Close(); @@ -231,176 +231,176 @@ public: class CGBuffer { - Datafile file; - CGImageRef image_ref; - CGContextRef context_ref; + Datafile file; + CGImageRef image_ref; + CGContextRef context_ref; - int ref_count; + int ref_count; - void Init() - { - ref_count = 1; - buffer = NULL; - image_ref = NULL; - context_ref = NULL; - image_finished = false; - } + void Init() + { + ref_count = 1; + buffer = NULL; + image_ref = NULL; + context_ref = NULL; + image_finished = false; + } - bool CreateCGContext() - { - if (context_ref) - { - CGContextRelease(context_ref); - context_ref = NULL; - } + bool CreateCGContext() + { + if (context_ref) + { + CGContextRelease(context_ref); + context_ref = NULL; + } - if (buffer) - { - buffer->Release(); - buffer = NULL; - } + if (buffer) + { + buffer->Release(); + buffer = NULL; + } - size_t buffer_rowbytes = (size_t)(image_size.width * ((image_depth == 8) ? 1 : 4)); //CGImageGetBytesPerRow(image_ref); - - buffer = MemoryBuffer::Create(buffer_rowbytes * (size_t)image_size.height); + size_t buffer_rowbytes = (size_t)(image_size.width * ((image_depth == 8) ? 1 : 4)); //CGImageGetBytesPerRow(image_ref); - if (!buffer) - return false; + buffer = MemoryBuffer::Create(buffer_rowbytes * (size_t)image_size.height); - CGColorSpaceRef colorspace_ref = (image_depth == 8) ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB(); - - if (!colorspace_ref) - return false; - - CGImageAlphaInfo alpha_info = (image_depth == 8) ? kCGImageAlphaNone : kCGImageAlphaPremultipliedLast; //kCGImageAlphaLast; //RGBA format + if (!buffer) + return false; - context_ref = CGBitmapContextCreate(buffer->data, (size_t)image_size.width, (size_t)image_size.height, 8, buffer_rowbytes, colorspace_ref, alpha_info); + CGColorSpaceRef colorspace_ref = (image_depth == 8) ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB(); - if (context_ref) - { - CGContextSetFillColorSpace(context_ref, colorspace_ref); - CGContextSetStrokeColorSpace(context_ref, colorspace_ref); - // move down, and flip vertically + if (!colorspace_ref) + return false; + + CGImageAlphaInfo alpha_info = (image_depth == 8) ? kCGImageAlphaNone : kCGImageAlphaPremultipliedLast; //kCGImageAlphaLast; //RGBA format + + context_ref = CGBitmapContextCreate(buffer->data, (size_t)image_size.width, (size_t)image_size.height, 8, buffer_rowbytes, colorspace_ref, alpha_info); + + if (context_ref) + { + CGContextSetFillColorSpace(context_ref, colorspace_ref); + CGContextSetStrokeColorSpace(context_ref, colorspace_ref); + // move down, and flip vertically // to turn postscript style coordinates to "screen style" - CGContextTranslateCTM(context_ref, 0.0, image_size.height); - CGContextScaleCTM(context_ref, 1.0, -1.0); - } - - CGColorSpaceRelease(colorspace_ref); - colorspace_ref = NULL; + CGContextTranslateCTM(context_ref, 0.0, image_size.height); + CGContextScaleCTM(context_ref, 1.0, -1.0); + } - return !!context_ref; - } + CGColorSpaceRelease(colorspace_ref); + colorspace_ref = NULL; + + return !!context_ref; + } + + void RenderCGImage(const CGRect& dst_rect) + { + if (!context_ref || !image_ref) + return; + + CGContextDrawImage(context_ref, dst_rect, image_ref); + } - void RenderCGImage(const CGRect& dst_rect) - { - if (!context_ref || !image_ref) - return; - - CGContextDrawImage(context_ref, dst_rect, image_ref); - } - public: - MemoryBuffer* buffer; - CGSize image_size; - size_t image_depth; - bool image_finished; - - CGBuffer(const char* path) - { - Init(); - Open(path); - } + MemoryBuffer* buffer; + CGSize image_size; + size_t image_depth; + bool image_finished; + + CGBuffer(const char* path) + { + Init(); + Open(path); + } ~CGBuffer() - { - Reset(); - } + { + Reset(); + } - CGBuffer* Retain() - { - ++ref_count; - return this; - } + CGBuffer* Retain() + { + ++ref_count; + return this; + } - void Release() - { - if (--ref_count == 0) - delete this; - } + void Release() + { + if (--ref_count == 0) + delete this; + } - bool Open(const char* path) - { - file.Reset(); - return file.Open(path); - } + bool Open(const char* path) + { + file.Reset(); + return file.Open(path); + } - bool LoadJPEG() - { - if (!file.Read()) - return false; + bool LoadJPEG() + { + if (!file.Read()) + return false; - file.Close(); + file.Close(); - CGDataProviderRef src_provider_ref = CGDataProviderCreateWithData(this, file.data_buffer->data, file.data_size, NULL); + CGDataProviderRef src_provider_ref = CGDataProviderCreateWithData(this, file.data_buffer->data, file.data_size, NULL); - if (!src_provider_ref) - return false; + if (!src_provider_ref) + return false; - image_ref = CGImageCreateWithJPEGDataProvider(src_provider_ref, NULL, true, kCGRenderingIntentDefault); + image_ref = CGImageCreateWithJPEGDataProvider(src_provider_ref, NULL, true, kCGRenderingIntentDefault); - CGDataProviderRelease(src_provider_ref); - src_provider_ref = NULL; + CGDataProviderRelease(src_provider_ref); + src_provider_ref = NULL; - if (!image_ref) - return false; + if (!image_ref) + return false; - image_size = CGSizeMake(CGImageGetWidth(image_ref), CGImageGetHeight(image_ref)); - image_depth = CGImageGetBitsPerPixel(image_ref); - - return !!image_ref; - } + image_size = CGSizeMake(CGImageGetWidth(image_ref), CGImageGetHeight(image_ref)); + image_depth = CGImageGetBitsPerPixel(image_ref); - bool Render() - { - if (!image_ref) - return false; - - if (!CreateCGContext()) - return false; - - RenderCGImage(CGFrame(image_size)); - - CGContextRelease(context_ref); - context_ref = NULL; + return !!image_ref; + } - CGImageRelease(image_ref); - image_ref = NULL; - - file.Reset(); + bool Render() + { + if (!image_ref) + return false; - return true; - } - - void Reset() - { - if (buffer) - { - buffer->Release(); - buffer = NULL; - } + if (!CreateCGContext()) + return false; - if (image_ref) - { - CGImageRelease(image_ref); - image_ref = NULL; - } - - if (context_ref) - { - CGContextRelease(context_ref); - context_ref = NULL; - } - } + RenderCGImage(CGFrame(image_size)); + + CGContextRelease(context_ref); + context_ref = NULL; + + CGImageRelease(image_ref); + image_ref = NULL; + + file.Reset(); + + return true; + } + + void Reset() + { + if (buffer) + { + buffer->Release(); + buffer = NULL; + } + + if (image_ref) + { + CGImageRelease(image_ref); + image_ref = NULL; + } + + if (context_ref) + { + CGContextRelease(context_ref); + context_ref = NULL; + } + } }; \ No newline at end of file diff --git a/src/celengine/asterism.cpp b/src/celengine/asterism.cpp index 79ee3b9dc..42de1d1f3 100644 --- a/src/celengine/asterism.cpp +++ b/src/celengine/asterism.cpp @@ -69,7 +69,7 @@ bool Asterism::getActive() const */ void Asterism::setActive(bool _active) { - active = _active; + active = _active; } @@ -106,7 +106,7 @@ void Asterism::unsetOverrideColor() * if it should be drawn in the default color. */ bool Asterism::isColorOverridden() const -{ +{ return useOverrideColor; } diff --git a/src/celengine/asterism.h b/src/celengine/asterism.h index fe1739f8c..1bb55fdb2 100644 --- a/src/celengine/asterism.h +++ b/src/celengine/asterism.h @@ -1,7 +1,7 @@ // asterism.h // // Copyright (C) 2001-2008, the Celestia Development Team -// Original version by Chris Laurel +// Original version by Chris Laurel // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -28,13 +28,13 @@ class Asterism int getChainCount() const; const Chain& getChain(int) const; - bool getActive() const; - void setActive(bool _active); + bool getActive() const; + void setActive(bool _active); Color getOverrideColor() const; - void setOverrideColor(Color c); - void unsetOverrideColor(); - bool isColorOverridden() const; + void setOverrideColor(Color c); + void unsetOverrideColor(); + bool isColorOverridden() const; void addChain(Chain&); @@ -43,8 +43,8 @@ class Asterism std::string i18nName; std::vector chains; - bool active; - bool useOverrideColor; + bool active; + bool useOverrideColor; Color color; }; diff --git a/src/celengine/astro.cpp b/src/celengine/astro.cpp index 78a435f91..50c3da6a4 100644 --- a/src/celengine/astro.cpp +++ b/src/celengine/astro.cpp @@ -66,7 +66,7 @@ static const Quaterniond EQUATORIAL_TO_GALACTIC_ROTATION = XRotation(degToRad(GALACTIC_INCLINATION)) * ZRotation(degToRad(-GALACTIC_LONGITUDE_AT_NODE)); static const Matrix3d EQUATORIAL_TO_GALACTIC_MATRIX = EQUATORIAL_TO_GALACTIC_ROTATION.toRotationMatrix(); - + // epoch B1950: 22:09 UT on 21 Dec 1949 #define B1950 2433282.423 @@ -395,7 +395,7 @@ void astro::anomaly(double meanAnomaly, double eccentricity, { double e, delta, err; double tol = 0.00000001745; - int iterations = 20; // limit while() to maximum of 20 iterations. + int iterations = 20; // limit while() to maximum of 20 iterations. e = meanAnomaly - 2*PI * (int) (meanAnomaly / (2*PI)); err = 1; @@ -573,8 +573,8 @@ const char* astro::Date::toCStr(Format format) const { case Locale: case TZName: - snprintf(date, sizeof(date), "%04d %s %02d %02d:%02d:%02d %s", - year, _(MonthAbbrList[month-1]), day, + snprintf(date, sizeof(date), "%04d %s %02d %02d:%02d:%02d %s", + year, _(MonthAbbrList[month-1]), day, hour, minute, (int)seconds, tzname.c_str()); break; case UTCOffset: @@ -582,8 +582,8 @@ const char* astro::Date::toCStr(Format format) const int sign = utc_offset < 0 ? -1:1; int h_offset = sign * utc_offset / 3600; int m_offset = (sign * utc_offset - h_offset * 3600) / 60; - snprintf(date, sizeof(date), "%04d %s %02d %02d:%02d:%02d %c%02d%02d", - year, _(MonthAbbrList[month-1]), day, + snprintf(date, sizeof(date), "%04d %s %02d %02d:%02d:%02d %c%02d%02d", + year, _(MonthAbbrList[month-1]), day, hour, minute, (int)seconds, (sign==1?'+':'-'), h_offset, m_offset); } break; @@ -678,7 +678,7 @@ astro::Date::systemDate() d.hour = gmt->tm_hour; d.minute = gmt->tm_min; d.seconds = (int) gmt->tm_sec; - + return d; } @@ -845,7 +845,7 @@ astro::TDBtoLocal(double tdb) hourdiff = -24; else hourdiff = 24; - d.utc_offset = (hourdiff + d.hour - utcDate.hour) * 3600 + d.utc_offset = (hourdiff + d.hour - utcDate.hour) * 3600 + (d.minute - utcDate.minute) * 60; } d.tzname = localt->tm_isdst ? _("DST"): _("STD"); @@ -920,7 +920,7 @@ bool astro::getLengthScale(string unitName, double& scale) break; } } - + return foundMatch; } @@ -939,7 +939,7 @@ bool astro::getTimeScale(string unitName, double& scale) break; } } - + return foundMatch; } @@ -958,7 +958,7 @@ bool astro::getAngleScale(string unitName, double& scale) break; } } - + return foundMatch; } diff --git a/src/celengine/astro.h b/src/celengine/astro.h index c5e947f5e..8aa1aace1 100644 --- a/src/celengine/astro.h +++ b/src/celengine/astro.h @@ -67,7 +67,7 @@ namespace astro const char* toCStr(Format format = Locale) const; operator double() const; - + static Date systemDate(); @@ -171,7 +171,7 @@ namespace astro double secondsToJulianDate(double); double julianDateToSeconds(double); - + bool isLengthUnit(string unitName); bool isTimeUnit(string unitName); bool isAngleUnit(string unitName); diff --git a/src/celengine/atmosphere.h b/src/celengine/atmosphere.h index bc734a6c5..fc8f7024c 100644 --- a/src/celengine/atmosphere.h +++ b/src/celengine/atmosphere.h @@ -45,12 +45,12 @@ class Atmosphere Color upperColor; Color skyColor; Color sunsetColor; - + float cloudHeight; float cloudSpeed; MultiResTexture cloudTexture; MultiResTexture cloudNormalMap; - + float mieCoeff; float mieScaleHeight; float miePhaseAsymmetry; diff --git a/src/celengine/axisarrow.cpp b/src/celengine/axisarrow.cpp index c112be546..831d1bf4b 100644 --- a/src/celengine/axisarrow.cpp +++ b/src/celengine/axisarrow.cpp @@ -32,11 +32,11 @@ static void RenderArrow(float shaftLength, { float sintab[MaxArrowSections]; float costab[MaxArrowSections]; - + unsigned int i; nSections = min(MaxArrowSections, nSections); - + // Initialize the trig tables for (i = 0; i < nSections; i++) { @@ -44,7 +44,7 @@ static void RenderArrow(float shaftLength, sintab[i] = (float) sin(theta); costab[i] = (float) cos(theta); } - + // Render the circle at the botton of the arrow shaft glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0f, 0.0f, 0.0f); @@ -54,7 +54,7 @@ static void RenderArrow(float shaftLength, glVertex3f(shaftRadius * costab[n], shaftRadius * sintab[n], 0.0f); } glEnd(); - + // Render the arrow shaft glBegin(GL_QUAD_STRIP); for (i = 0; i <= nSections; i++) @@ -64,17 +64,17 @@ static void RenderArrow(float shaftLength, glVertex3f(shaftRadius * costab[n], shaftRadius * sintab[n], 0.0f); } glEnd(); - + // Render the annulus glBegin(GL_QUAD_STRIP); for (i = 0; i <= nSections; i++) { unsigned int n = i % nSections; - glVertex3f(headRadius * costab[n], headRadius * sintab[n], shaftLength); + glVertex3f(headRadius * costab[n], headRadius * sintab[n], shaftLength); glVertex3f(shaftRadius * costab[n], shaftRadius * sintab[n], shaftLength); } glEnd(); - + // Render the head of the arrow glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0f, 0.0f, shaftLength + headLength); @@ -201,7 +201,7 @@ ArrowReferenceMark::render(Renderer* /* renderer */, float shaftRadius = 0.010f; float headRadius = 0.025f; unsigned int nSections = 30; - + glColor4f(color.red(), color.green(), color.blue(), opacity); RenderArrow(shaftLength, headLength, shaftRadius, headRadius, nSections); @@ -278,13 +278,13 @@ AxesReferenceMark::render(Renderer* /* renderer */, glPushMatrix(); glRotate(q.cast()); glScalef(size, size, size); - + glDisable(GL_LIGHTING); #if 0 // Simple line axes glBegin(GL_LINES); - + glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 0.0f, 0.0f); @@ -296,7 +296,7 @@ AxesReferenceMark::render(Renderer* /* renderer */, glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); - + glEnd(); #endif @@ -306,7 +306,7 @@ AxesReferenceMark::render(Renderer* /* renderer */, float headRadius = 0.025f; unsigned int nSections = 30; float labelScale = 0.1f; - + // x-axis glPushMatrix(); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); @@ -336,7 +336,7 @@ AxesReferenceMark::render(Renderer* /* renderer */, glScalef(labelScale, labelScale, labelScale); RenderZ(); glPopMatrix(); - + glPopMatrix(); glDisable(GL_DEPTH_TEST); diff --git a/src/celengine/body.cpp b/src/celengine/body.cpp index a6747df77..63d20bf1c 100644 --- a/src/celengine/body.cpp +++ b/src/celengine/body.cpp @@ -116,7 +116,7 @@ void Body::setDefaultProperties() */ const vector& Body::getNames() const { - return names; + return names; } @@ -125,7 +125,7 @@ const vector& Body::getNames() const */ string Body::getName(bool i18n) const { - if (!i18n) + if (!i18n) return names[0]; else return names[localizedNameIndex]; @@ -511,13 +511,13 @@ Vector3d Body::getVelocity(double tdb) const Vector3d v = phase->orbit()->velocityAtTime(tdb); v = orbitFrame->getOrientation(tdb).conjugate() * v + orbitFrame->getCenter().getVelocity(tdb); - if (!orbitFrame->isInertial()) - { + if (!orbitFrame->isInertial()) + { Vector3d r = Selection(const_cast(this)).getPosition(tdb).offsetFromKm(orbitFrame->getCenter().getPosition(tdb)); v += orbitFrame->getAngularVelocity(tdb).cross(r); } - return v; + return v; } @@ -531,10 +531,10 @@ Vector3d Body::getAngularVelocity(double tdb) const ReferenceFrame* bodyFrame = phase->bodyFrame(); v = bodyFrame->getOrientation(tdb).conjugate() * v; - if (!bodyFrame->isInertial()) - { + if (!bodyFrame->isInertial()) + { v += bodyFrame->getAngularVelocity(tdb); - } + } return v; } @@ -573,7 +573,7 @@ Quaterniond Body::getEclipticToFrame(double tdb) const } -/*! Get a rotation that converts from the ecliptic frame to the body's +/*! Get a rotation that converts from the ecliptic frame to the body's * mean equatorial frame. */ Quaterniond Body::getEclipticToEquatorial(double tdb) const @@ -609,7 +609,7 @@ Quaterniond Body::getEquatorialToBodyFixed(double tdb) const Matrix4d Body::getBodyFixedToAstrocentric(double tdb) const { //return getEquatorialToBodyFixed(tdb).toMatrix4() * getLocalToAstrocentric(tdb); - Matrix4d m = Eigen::Transform(getEquatorialToBodyFixed(tdb)).matrix(); + Matrix4d m = Eigen::Transform(getEquatorialToBodyFixed(tdb)).matrix(); return m * getLocalToAstrocentric(tdb); } @@ -693,7 +693,7 @@ float Body::getLuminosity(float sunLuminosity, double incidentEnergy = satIrradiance * circleArea(radius * 1000); double reflectedEnergy = incidentEnergy * albedo; - + // Compute the luminosity (i.e. power relative to solar power) return (float) (reflectedEnergy / astro::SOLAR_POWER); } @@ -884,7 +884,7 @@ Location* Body::findLocation(const string& name, bool i18n) const // Compute the positions of locations on an irregular object using ray-mesh // intersections. This is not automatically done when a location is added -// because it would force the loading of all meshes for objects with +// because it would force the loading of all meshes for objects with // defined locations; on-demand (i.e. when the object becomes visible to // a user) loading of meshes is preferred. void Body::computeLocations() @@ -1129,7 +1129,7 @@ PlanetarySystem::~PlanetarySystem() void PlanetarySystem::addAlias(Body* body, const string& alias) { assert(body->getSystem() == this); - + objectIndex.insert(make_pair(alias, body)); } @@ -1141,7 +1141,7 @@ void PlanetarySystem::addAlias(Body* body, const string& alias) void PlanetarySystem::removeAlias(const Body* body, const string& alias) { assert(body->getSystem() == this); - + ObjectIndex::iterator iter = objectIndex.find(alias); if (iter != objectIndex.end()) { @@ -1173,13 +1173,13 @@ void PlanetarySystem::addBodyToNameIndex(Body* body) void PlanetarySystem::removeBodyFromNameIndex(const Body* body) { assert(body->getSystem() == this); - + // Erase the object from the object indices const vector& names = body->getNames(); for (vector::const_iterator iter = names.begin(); iter != names.end(); iter++) { removeAlias(body, *iter); - } + } } @@ -1194,7 +1194,7 @@ void PlanetarySystem::removeBody(Body* body) break; } } - + removeBodyFromNameIndex(body); } @@ -1217,7 +1217,7 @@ void PlanetarySystem::replaceBody(Body* oldBody, Body* newBody) /*! Find a body with the specified name within a planetary system. - * + * * deepSearch: if true, recursively search the systems of child objects * i18n: if true, allow matching of localized body names. When responding * to a user query, this flag should be true. In other cases--such @@ -1230,7 +1230,7 @@ Body* PlanetarySystem::find(const string& _name, bool deepSearch, bool i18n) con if (firstMatch != objectIndex.end()) { Body* matchedBody = firstMatch->second; - + if (i18n) { return matchedBody; @@ -1293,13 +1293,13 @@ std::vector PlanetarySystem::getCompletion(const std::string& _name iter != objectIndex.end(); iter++) { const string& alias = iter->first; - + if (UTF8StringCompare(alias, _name, _name_length) == 0) { completion.push_back(alias); } } - + // Scan child objects if (deepSearch) { @@ -1313,7 +1313,7 @@ std::vector PlanetarySystem::getCompletion(const std::string& _name } } } - + return completion; } diff --git a/src/celengine/body.h b/src/celengine/body.h index a3fc33249..9b9dc36fb 100644 --- a/src/celengine/body.h +++ b/src/celengine/body.h @@ -41,7 +41,7 @@ class PlanetarySystem Body* getPrimaryBody() const { return primary; }; int getSystemSize() const { return satellites.size(); }; Body* getBody(int i) const { return satellites[i]; }; - + void addAlias(Body* body, const std::string& alias); void removeAlias(const Body* body, const std::string& alias); void addBody(Body* body); @@ -65,7 +65,7 @@ class PlanetarySystem private: void addBodyToNameIndex(Body* body); void removeBodyFromNameIndex(const Body* body); - + private: typedef std::map ObjectIndex; @@ -77,7 +77,7 @@ class PlanetarySystem }; -class RingSystem +class RingSystem { public: float innerRadius; @@ -201,7 +201,7 @@ class Body const Orbit* getOrbit(double tdb) const; const ReferenceFrame* getBodyFrame(double tdb) const; const RotationModel* getRotationModel(double tdb) const; - + // Size methods void setSemiAxes(const Eigen::Vector3f&); Eigen::Vector3f getSemiAxes() const; @@ -321,7 +321,7 @@ class Body SunDirection = 0x08, VelocityVector = 0x10, }; - + bool referenceMarkVisible(uint32) const; uint32 getVisibleReferenceMarks() const; void setVisibleReferenceMarks(uint32); diff --git a/src/celengine/cmdparser.cpp b/src/celengine/cmdparser.cpp index b9c0f7d37..97899aad4 100644 --- a/src/celengine/cmdparser.cpp +++ b/src/celengine/cmdparser.cpp @@ -121,8 +121,8 @@ void CommandParser::error(const string errMsg) static ObserverFrame::CoordinateSystem parseCoordinateSystem(const string& name) { - // 'geographic' is a deprecated name for the bodyfixed coordinate system, - // maintained here for compatibility with older scripts. + // 'geographic' is a deprecated name for the bodyfixed coordinate system, + // maintained here for compatibility with older scripts. if (compareIgnoringCase(name, "observer") == 0) return ObserverFrame::ObserverLocal; else if (compareIgnoringCase(name, "bodyfixed") == 0) @@ -558,31 +558,31 @@ Command* CommandParser::parseCommand() cmd = new CommandOrbitFlags(setFlags, clearFlags); } - else if (commandName == "constellations") + else if (commandName == "constellations") { string s; - CommandConstellations *cmdcons= new CommandConstellations(); - + CommandConstellations *cmdcons= new CommandConstellations(); + if (paramList->getString("set", s)) parseConstellations(cmdcons, s, 1); if (paramList->getString("clear", s)) - parseConstellations(cmdcons, s, 0); - cmd = cmdcons; + parseConstellations(cmdcons, s, 0); + cmd = cmdcons; } - else if (commandName == "constellationcolor") + else if (commandName == "constellationcolor") { string s; - CommandConstellationColor *cmdconcol= new CommandConstellationColor(); - - Vec3d colorv(1.0f, 0.0f, 0.0f); + CommandConstellationColor *cmdconcol= new CommandConstellationColor(); + + Vec3d colorv(1.0f, 0.0f, 0.0f); paramList->getVector("color", colorv); if (paramList->getString("set", s)) parseConstellationColor(cmdconcol, s, &colorv, 1); if (paramList->getString("clear", s)) - parseConstellationColor(cmdconcol, s, &colorv, 0); - cmd = cmdconcol; + parseConstellationColor(cmdconcol, s, &colorv, 0); + cmd = cmdconcol; } else if (commandName == "setvisibilitylimit") { @@ -668,12 +668,12 @@ Command* CommandParser::parseCommand() else if (compareIgnoringCase(symbolString, "disk") == 0) rep = MarkerRepresentation(MarkerRepresentation::Disk); } - + string label; paramList->getString("label", label); rep.setSize((float) size); rep.setColor(color); - rep.setLabel(label); + rep.setLabel(label); bool occludable = true; paramList->getBoolean("occludable", occludable); @@ -784,7 +784,7 @@ Command* CommandParser::parseCommand() float alpha; string filename; int fitscreen; - + if(!paramList->getNumber("duration", duration)) duration = 3; if(!paramList->getNumber("xoffset", xoffset)) @@ -804,7 +804,7 @@ Command* CommandParser::parseCommand() else if (commandName == "verbosity") { int level; - + if(!paramList->getNumber("level", level)) level = 2; @@ -923,12 +923,12 @@ int parseConstellations(CommandConstellations* cmd, string s, int act) if (ttype == Tokenizer::TokenName) { string name = tokenizer.getNameValue(); - if (compareIgnoringCase(name, "all") == 0 && act==1) - cmd->all=1; - else if (compareIgnoringCase(name, "all") == 0 && act==0) - cmd->none=1; - else - cmd->setValues(name,act); + if (compareIgnoringCase(name, "all") == 0 && act==1) + cmd->all=1; + else if (compareIgnoringCase(name, "all") == 0 && act==0) + cmd->none=1; + else + cmd->setValues(name,act); ttype = tokenizer.nextToken(); if (ttype == Tokenizer::TokenBar) @@ -951,10 +951,10 @@ int parseConstellationColor(CommandConstellationColor* cmd, string s, Vec3d *col Tokenizer tokenizer(&in); int flags = 0; - if(!act) - cmd->unsetColor(); - else - cmd->setColor((float)col->x, (float)col->y, (float)col->z); + if(!act) + cmd->unsetColor(); + else + cmd->setColor((float)col->x, (float)col->y, (float)col->z); Tokenizer::TokenType ttype = tokenizer.nextToken(); while (ttype != Tokenizer::TokenEnd) @@ -962,13 +962,13 @@ int parseConstellationColor(CommandConstellationColor* cmd, string s, Vec3d *col if (ttype == Tokenizer::TokenName) { string name = tokenizer.getNameValue(); - if (compareIgnoringCase(name, "all") == 0 && act==1) - cmd->all=1; - else if (compareIgnoringCase(name, "all") == 0 && act==0) - cmd->none=1; - else - cmd->setConstellations(name); - + if (compareIgnoringCase(name, "all") == 0 && act==1) + cmd->all=1; + else if (compareIgnoringCase(name, "all") == 0 && act==0) + cmd->none=1; + else + cmd->setConstellations(name); + ttype = tokenizer.nextToken(); if (ttype == Tokenizer::TokenBar) ttype = tokenizer.nextToken(); diff --git a/src/celengine/command.cpp b/src/celengine/command.cpp index 1a6aeee64..7d2e855f9 100644 --- a/src/celengine/command.cpp +++ b/src/celengine/command.cpp @@ -632,7 +632,7 @@ void CommandMark::process(ExecutionEnvironment& env) if (env.getSimulation()->getUniverse() != NULL) { - + env.getSimulation()->getUniverse()->markObject(sel, rep, 1, occludable); } } @@ -867,7 +867,7 @@ void CommandSetRadius::process(ExecutionEnvironment& env) { body->setSemiAxes(body->getSemiAxes() * ((float) radius / iradius)); } - + if (body->getRings() != NULL) { RingSystem rings(0.0f, 0.0f); @@ -1017,7 +1017,7 @@ void CommandScriptImage::process(ExecutionEnvironment& env) } // Verbosity command -CommandVerbosity::CommandVerbosity(int _level) : +CommandVerbosity::CommandVerbosity(int _level) : level(_level) { } @@ -1033,9 +1033,9 @@ void CommandVerbosity::process(ExecutionEnvironment& env) //==================================================== CommandConstellations::CommandConstellations() { - numConstellations = 0; - all = 0; - none = 0; + numConstellations = 0; + all = 0; + none = 0; } void CommandConstellations::process(ExecutionEnvironment& env) @@ -1043,72 +1043,72 @@ void CommandConstellations::process(ExecutionEnvironment& env) Universe* u = env.getSimulation()->getUniverse(); if (u != NULL) { - AsterismList* asterisms = u->getAsterisms(); + AsterismList* asterisms = u->getAsterisms(); for (AsterismList::const_iterator iter = asterisms->begin(); iter != asterisms->end(); iter++) { - Asterism* ast = *iter; - if (none) + Asterism* ast = *iter; + if (none) { - ast->setActive(0); + ast->setActive(0); } - else if (all) + else if (all) { - ast->setActive(1); + ast->setActive(1); } - else + else { - for (int i = 0; i < numConstellations; i++) + for (int i = 0; i < numConstellations; i++) { - if (compareIgnoringCase(constellation[i],ast->getName(false)) == 0) + if (compareIgnoringCase(constellation[i],ast->getName(false)) == 0) { - ast->setActive(active[i] != 0); - break; - } + ast->setActive(active[i] != 0); + break; + } } - } + } } } } void CommandConstellations::setValues(string cons, int act) { - int found = 0; - for (unsigned int j = 0; j < cons.size(); j++) + int found = 0; + for (unsigned int j = 0; j < cons.size(); j++) { - if(cons[j] == '_') - cons[j] = ' '; + if(cons[j] == '_') + cons[j] = ' '; } - - // ignore all above 99 constellations - if (numConstellations == MAX_CONSTELLATIONS) - return; - for (int i = 0; i < numConstellations; i++) + // ignore all above 99 constellations + if (numConstellations == MAX_CONSTELLATIONS) + return; + + for (int i = 0; i < numConstellations; i++) { - if (compareIgnoringCase(constellation[i], cons) == 0 ) + if (compareIgnoringCase(constellation[i], cons) == 0 ) { - active[i]=act; - found=1; - break; - } - } + active[i]=act; + found=1; + break; + } + } - if (!found) + if (!found) { - constellation[numConstellations]=cons; - active[numConstellations]=act; - numConstellations++; - } + constellation[numConstellations]=cons; + active[numConstellations]=act; + numConstellations++; + } } CommandConstellationColor::CommandConstellationColor() { - numConstellations=0; - all=0; - none=0; - unset=0; + numConstellations=0; + all=0; + none=0; + unset=0; } @@ -1117,33 +1117,33 @@ void CommandConstellationColor::process(ExecutionEnvironment& env) Universe* u = env.getSimulation()->getUniverse(); if (u != NULL) { - AsterismList* asterisms = u->getAsterisms(); + AsterismList* asterisms = u->getAsterisms(); for (AsterismList::const_iterator iter = asterisms->begin(); iter != asterisms->end(); iter++) { - Asterism* ast = *iter; - if (none) + Asterism* ast = *iter; + if (none) { - ast->unsetOverrideColor(); + ast->unsetOverrideColor(); } - else if (all) + else if (all) { - ast->setOverrideColor(rgb); + ast->setOverrideColor(rgb); } - else + else { - for(int i = 0; i < numConstellations; i++) + for(int i = 0; i < numConstellations; i++) { - if (compareIgnoringCase(constellation[i],ast->getName(false)) ==0 ) + if (compareIgnoringCase(constellation[i],ast->getName(false)) ==0 ) { - if(unset) - ast->unsetOverrideColor(); - else - ast->setOverrideColor(rgb); - break; - } + if(unset) + ast->unsetOverrideColor(); + else + ast->setOverrideColor(rgb); + break; + } } - } + } } } } @@ -1152,41 +1152,41 @@ void CommandConstellationColor::process(ExecutionEnvironment& env) void CommandConstellationColor::setColor(float r, float g, float b) { rgb = Color(r, g, b); - unset = 0; + unset = 0; } void CommandConstellationColor::unsetColor() { - unset = 1; + unset = 1; } void CommandConstellationColor::setConstellations(string cons) { - int found=0; - for (unsigned int j = 0; j < cons.size(); j++) + int found=0; + for (unsigned int j = 0; j < cons.size(); j++) { - if (cons[j] == '_') - cons[j] = ' '; + if (cons[j] == '_') + cons[j] = ' '; } - - // ignore all above 99 constellations - if (numConstellations == MAX_CONSTELLATIONS) - return; - for (int i=0; i= sizeof(constellationInfo) / sizeof(constellationInfo[0])) - return NULL; + n >= sizeof(constellationInfo) / sizeof(constellationInfo[0])) + return NULL; else - return constellations[n]; + return constellations[n]; } Constellation* Constellation::getConstellation(const string& name) { if (constellations == NULL) - initialize(); + initialize(); for (unsigned int i = 0; i < sizeof(constellationInfo) / sizeof(constellationInfo[0]); @@ -176,11 +176,11 @@ void Constellation::initialize() if (constellations != NULL) { - for (int i = 0; i < nConstellations; i++) + for (int i = 0; i < nConstellations; i++) { - constellations[i] = new Constellation(constellationInfo[i].name, - constellationInfo[i].gen, - constellationInfo[i].abbr); - } + constellations[i] = new Constellation(constellationInfo[i].name, + constellationInfo[i].gen, + constellationInfo[i].abbr); + } } } diff --git a/src/celengine/dds.cpp b/src/celengine/dds.cpp index 8087f2734..704956608 100644 --- a/src/celengine/dds.cpp +++ b/src/celengine/dds.cpp @@ -65,7 +65,7 @@ struct DDSurfaceDesc DDPixelFormat format; DDSCaps caps; - + uint32 textureStage; }; diff --git a/src/celengine/deepskyobj.cpp b/src/celengine/deepskyobj.cpp index de298b2c1..f42c8da97 100644 --- a/src/celengine/deepskyobj.cpp +++ b/src/celengine/deepskyobj.cpp @@ -123,59 +123,59 @@ bool DeepSkyObject::pick(const Ray3d& ray, void DeepSkyObject::hsv2rgb( float *r, float *g, float *b, float h, float s, float v ) { - // r,g,b values are from 0 to 1 - // h = [0,360], s = [0,1], v = [0,1] + // r,g,b values are from 0 to 1 + // h = [0,360], s = [0,1], v = [0,1] - int i; - float f, p, q, t; + int i; + float f, p, q, t; - if( s == 0 ) - { - // achromatic (grey) - *r = *g = *b = v; - return; - } + if( s == 0 ) + { + // achromatic (grey) + *r = *g = *b = v; + return; + } - h /= 60; // sector 0 to 5 - i = (int) floorf( h ); - f = h - (float) i; // factorial part of h - p = v * ( 1 - s ); - q = v * ( 1 - s * f ); - t = v * ( 1 - s * ( 1 - f ) ); + h /= 60; // sector 0 to 5 + i = (int) floorf( h ); + f = h - (float) i; // factorial part of h + p = v * ( 1 - s ); + q = v * ( 1 - s * f ); + t = v * ( 1 - s * ( 1 - f ) ); - switch( i ) - { - case 0: - *r = v; - *g = t; - *b = p; - break; - case 1: - *r = q; - *g = v; - *b = p; - break; - case 2: - *r = p; - *g = v; - *b = t; - break; - case 3: - *r = p; - *g = q; - *b = v; - break; - case 4: - *r = t; - *g = p; - *b = v; - break; - default: - *r = v; - *g = p; - *b = q; - break; - } + switch( i ) + { + case 0: + *r = v; + *g = t; + *b = p; + break; + case 1: + *r = q; + *g = v; + *b = p; + break; + case 2: + *r = p; + *g = v; + *b = t; + break; + case 3: + *r = p; + *g = q; + *b = v; + break; + case 4: + *r = t; + *g = p; + *b = v; + break; + default: + *r = v; + *g = p; + *b = q; + break; + } } bool DeepSkyObject::load(AssociativeArray* params, const string& resPath) @@ -194,7 +194,7 @@ bool DeepSkyObject::load(AssociativeArray* params, const string& resPath) params->getLength("Distance", distance, KM_PER_LY); params->getAngle("RA", RA, DEG_PER_HRA); params->getAngle("Dec", dec); - + Vector3d p = astro::equatorialToCelestialCart(RA, dec, distance); setPosition(p); } @@ -237,18 +237,18 @@ bool DeepSkyObject::load(AssociativeArray* params, const string& resPath) } setInfoURL(infoURL); } - + bool visible = true; if (params->getBoolean("Visible", visible)) { setVisible(visible); } - + bool clickable = true; if (params->getBoolean("Clickable", clickable)) { setClickable(clickable); } - + return true; } diff --git a/src/celengine/deepskyobj.h b/src/celengine/deepskyobj.h index 9a1c4dcd3..6dbbc8db5 100644 --- a/src/celengine/deepskyobj.h +++ b/src/celengine/deepskyobj.h @@ -43,10 +43,10 @@ class DeepSkyObject Eigen::Vector3d getPosition() const; void setPosition(const Eigen::Vector3d&); - - static void hsv2rgb( float*, float*, float*, float, float, float); - - virtual const char* getType() const = 0; + + static void hsv2rgb( float*, float*, float*, float, float, float); + + virtual const char* getType() const = 0; virtual void setType(const std::string&) = 0; virtual size_t getDescription(char* buf, size_t bufLength) const; @@ -62,11 +62,11 @@ class DeepSkyObject /*! Return the radius of the object. This radius will be displayed in the UI and * should match the conventional astronomical definition of the object size. - */ + */ float getRadius() const { return radius; } void setRadius(float r); virtual float getHalfMassRadius() const { return radius; } - + float getAbsoluteMagnitude() const; void setAbsoluteMagnitude(float); @@ -77,9 +77,9 @@ class DeepSkyObject void setVisible(bool _visible) { visible = _visible; } bool isClickable() const { return clickable; } void setClickable(bool _clickable) { clickable = _clickable; } - - virtual const char* getObjTypeName() const = 0; + + virtual const char* getObjTypeName() const = 0; virtual bool pick(const Ray3d& ray, double& distanceToPicker, @@ -106,7 +106,7 @@ class DeepSkyObject float radius; float absMag; std::string* infoURL; - + bool visible : 1; bool clickable : 1; }; diff --git a/src/celengine/dispmap.h b/src/celengine/dispmap.h index 409ca695e..31425c8fd 100644 --- a/src/celengine/dispmap.h +++ b/src/celengine/dispmap.h @@ -18,7 +18,7 @@ typedef float (*DisplacementMapFunc)(float, float, void*); class DisplacementMap { public: - DisplacementMap(int w, int h); + DisplacementMap(int w, int h); ~DisplacementMap(); int getWidth() const { return width; }; int getHeight() const { return height; }; @@ -26,7 +26,7 @@ class DisplacementMap inline void setDisplacement(int x, int y, float d); void generate(DisplacementMapFunc func, void* info = NULL); void clear(); - + private: int width; int height; diff --git a/src/celengine/dsodb.cpp b/src/celengine/dsodb.cpp index c0e9f0198..4f7af4e44 100644 --- a/src/celengine/dsodb.cpp +++ b/src/celengine/dsodb.cpp @@ -286,9 +286,9 @@ bool DSODatabase::load(istream& in, const string& resourcePath) DeepSkyObject* obj = NULL; if (compareIgnoringCase(objType, "Galaxy") == 0) obj = new Galaxy(); - else if (compareIgnoringCase(objType, "Globular") == 0) - obj = new Globular(); - else if (compareIgnoringCase(objType, "Nebula") == 0) + else if (compareIgnoringCase(objType, "Globular") == 0) + obj = new Globular(); + else if (compareIgnoringCase(objType, "Nebula") == 0) obj = new Nebula(); else if (compareIgnoringCase(objType, "OpenCluster") == 0) obj = new OpenCluster(); diff --git a/src/celengine/dsodb.h b/src/celengine/dsodb.h index f7a9cc5c5..a541ab99c 100644 --- a/src/celengine/dsodb.h +++ b/src/celengine/dsodb.h @@ -80,7 +80,7 @@ private: DeepSkyObject** catalogNumberIndex; DSOOctree* octreeRoot; uint32 nextAutoCatalogNumber; - + double avgAbsMag; }; diff --git a/src/celengine/execution.h b/src/celengine/execution.h index 2b03ea1da..71fe561e5 100644 --- a/src/celengine/execution.h +++ b/src/celengine/execution.h @@ -18,7 +18,7 @@ class Execution { public: Execution(CommandSequence&, ExecutionEnvironment&); - + bool tick(double); void reset(CommandSequence&); diff --git a/src/celengine/frame.cpp b/src/celengine/frame.cpp index 7911ed9d1..ba0f526b4 100644 --- a/src/celengine/frame.cpp +++ b/src/celengine/frame.cpp @@ -1,5 +1,5 @@ // frame.cpp -// +// // Reference frame base class. // // Copyright (C) 2003-2009, the Celestia Development Team @@ -57,11 +57,11 @@ static UniversalCoord rotate(const UniversalCoord& uc, const Quaterniond& q) { Matrix3d r = q.toRotationMatrix(); UniversalCoord uc1; - + uc1.x = uc.x * BigFix(r(0, 0)) + uc.y * BigFix(r(1, 0)) + uc.z * BigFix(r(2, 0)); uc1.y = uc.x * BigFix(r(0, 1)) + uc.y * BigFix(r(1, 1)) + uc.z * BigFix(r(2, 1)); uc1.z = uc.x * BigFix(r(0, 2)) + uc.y * BigFix(r(1, 2)) + uc.z * BigFix(r(2, 2)); - + return uc1; } @@ -152,7 +152,7 @@ ReferenceFrame::convertToAstrocentric(const Vector3d& p, double tjd) const // bad if the center object is a galaxy // what about locations? return Vector3d::Zero(); - } + } } @@ -175,11 +175,11 @@ ReferenceFrame::getAngularVelocity(double tjd) const if (std::abs(dq.w()) > 0.99999999) return Vector3d::Zero(); else - return dq.vec().normalized() * (2.0 * acos(dq.w()) / ANGULAR_VELOCITY_DIFF_DELTA); + return dq.vec().normalized() * (2.0 * acos(dq.w()) / ANGULAR_VELOCITY_DIFF_DELTA); #ifdef CELVEC Vector3d v(dq.x, dq.y, dq.z); - v.normalize(); - return v * (2.0 * acos(dq.w) / ANGULAR_VELOCITY_DIFF_DELTA); + v.normalize(); + return v * (2.0 * acos(dq.w) / ANGULAR_VELOCITY_DIFF_DELTA); #endif } @@ -216,7 +216,7 @@ getFrameDepth(const Selection& sel, unsigned int depth, unsigned int maxDepth, if (orbitFrameDepth > maxDepth) return orbitFrameDepth; } - + if (body->getBodyFrame(0.0) != NULL && frameType == ReferenceFrame::OrientationFrame) { bodyFrameDepth = body->getBodyFrame(0.0)->nestingDepth(depth + 1, maxDepth, frameType); @@ -238,7 +238,7 @@ J2000EclipticFrame::J2000EclipticFrame(Selection center) : bool J2000EclipticFrame::isInertial() const { - return true; + return true; } @@ -269,7 +269,7 @@ J2000EquatorFrame::getOrientation(double /* tjd */) const bool J2000EquatorFrame::isInertial() const { - return true; + return true; } @@ -318,11 +318,11 @@ BodyFixedFrame::getOrientation(double tjd) const Vector3d BodyFixedFrame::getAngularVelocity(double tjd) const { - switch (fixObject.getType()) - { - case Selection::Type_Body: + switch (fixObject.getType()) + { + case Selection::Type_Body: return fixObject.body()->getAngularVelocity(tjd); - case Selection::Type_Star: + case Selection::Type_Star: return fixObject.star()->getRotationModel()->angularVelocityAtTime(tjd); case Selection::Type_Location: if (fixObject.location()->getParentBody()) @@ -331,14 +331,14 @@ BodyFixedFrame::getAngularVelocity(double tjd) const return Vector3d::Zero(); default: return Vector3d::Zero(); - } + } } bool BodyFixedFrame::isInertial() const { - return false; + return false; } @@ -403,12 +403,12 @@ BodyMeanEquatorFrame::getOrientation(double tjd) const Vector3d BodyMeanEquatorFrame::getAngularVelocity(double tjd) const { - if (isFrozen) - { + if (isFrozen) + { return Vector3d::Zero(); - } - else - { + } + else + { if (equatorObject.body() != NULL) { return equatorObject.body()->getBodyFrame(tjd)->getAngularVelocity(tjd); @@ -417,32 +417,32 @@ BodyMeanEquatorFrame::getAngularVelocity(double tjd) const { return Vector3d::Zero(); } - } + } } bool BodyMeanEquatorFrame::isInertial() const { - if (isFrozen) - { - return true; - } - else - { - // Although the mean equator of an object may vary slightly due to precession, - // treat it as an inertial frame as long as the body frame of the object is - // also inertial. - if (equatorObject.body() != NULL) - { + if (isFrozen) + { + return true; + } + else + { + // Although the mean equator of an object may vary slightly due to precession, + // treat it as an inertial frame as long as the body frame of the object is + // also inertial. + if (equatorObject.body() != NULL) + { // TIMELINE-TODO: isInertial must take a time argument. - return equatorObject.body()->getBodyFrame(0.0)->isInertial(); - } + return equatorObject.body()->getBodyFrame(0.0)->isInertial(); + } else { return true; } - } + } } @@ -471,9 +471,9 @@ CachingFrame::CachingFrame(Selection _center) : ReferenceFrame(_center), lastTime(-1.0e50), lastOrientation(Quaterniond::Identity()), - lastAngularVelocity(0.0, 0.0, 0.0), - orientationCacheValid(false), - angularVelocityCacheValid(false) + lastAngularVelocity(0.0, 0.0, 0.0), + orientationCacheValid(false), + angularVelocityCacheValid(false) { } @@ -481,39 +481,39 @@ CachingFrame::CachingFrame(Selection _center) : Quaterniond CachingFrame::getOrientation(double tjd) const { - if (tjd != lastTime) - { - lastTime = tjd; - lastOrientation = computeOrientation(tjd); - orientationCacheValid = true; - angularVelocityCacheValid = false; - } - else if (!orientationCacheValid) - { - lastOrientation = computeOrientation(tjd); - orientationCacheValid = true; - } + if (tjd != lastTime) + { + lastTime = tjd; + lastOrientation = computeOrientation(tjd); + orientationCacheValid = true; + angularVelocityCacheValid = false; + } + else if (!orientationCacheValid) + { + lastOrientation = computeOrientation(tjd); + orientationCacheValid = true; + } - return lastOrientation; + return lastOrientation; } Vector3d CachingFrame::getAngularVelocity(double tjd) const { - if (tjd != lastTime) - { - lastTime = tjd; - lastAngularVelocity = computeAngularVelocity(tjd); - orientationCacheValid = false; - angularVelocityCacheValid = true; - } - else if (!angularVelocityCacheValid) - { - lastAngularVelocity = computeAngularVelocity(tjd); - angularVelocityCacheValid = true; - } + if (tjd != lastTime) + { + lastTime = tjd; + lastAngularVelocity = computeAngularVelocity(tjd); + orientationCacheValid = false; + angularVelocityCacheValid = true; + } + else if (!angularVelocityCacheValid) + { + lastAngularVelocity = computeAngularVelocity(tjd); + angularVelocityCacheValid = true; + } - return lastAngularVelocity; + return lastAngularVelocity; } @@ -525,10 +525,10 @@ Vector3d CachingFrame::computeAngularVelocity(double tjd) const { Quaterniond q0 = getOrientation(tjd); - // Call computeOrientation() instead of getOrientation() so that we - // don't affect the cached value. - // TODO: check the valid ranges of the frame to make sure that - // jd+dt is still in range. + // Call computeOrientation() instead of getOrientation() so that we + // don't affect the cached value. + // TODO: check the valid ranges of the frame to make sure that + // jd+dt is still in range. Quaterniond q1 = computeOrientation(tjd + ANGULAR_VELOCITY_DIFF_DELTA); Quaterniond dq = q0.conjugate() * q1; @@ -639,7 +639,7 @@ TwoVectorFrame::computeOrientation(double tjd) const } // The axes are the rows of a rotation matrix. The getOrientation - // method must return the quaternion representation of the + // method must return the quaternion representation of the // orientation, so convert the rotation matrix to a quaternion now. Quatd q = Quatd::matrixToQuaternion(Mat3d(v[0], v[1], v[2])); #endif @@ -679,10 +679,10 @@ TwoVectorFrame::computeOrientation(double tjd) const bool TwoVectorFrame::isInertial() const { - // Although it's possible to specify an inertial two-vector frame, we won't - // bother trying to distinguish these cases: all two-vector frames will be - // treated as non-inertial. - return true; + // Although it's possible to specify an inertial two-vector frame, we won't + // bother trying to distinguish these cases: all two-vector frames will be + // treated as non-inertial. + return true; } @@ -735,7 +735,7 @@ FrameVector::operator=(const FrameVector& fv) frame = fv.frame; if (frame != NULL) frame->addRef(); - + return *this; } diff --git a/src/celengine/frame.h b/src/celengine/frame.h index 254276cef..ecfe0578c 100644 --- a/src/celengine/frame.h +++ b/src/celengine/frame.h @@ -1,5 +1,5 @@ // frame.h -// +// // Copyright (C) 2003-2009, the Celestia Development Team // Original version by Chris Laurel // @@ -31,7 +31,7 @@ class ReferenceFrame int addRef() const; int release() const; - + UniversalCoord convertFromUniversal(const UniversalCoord& uc, double tjd) const; UniversalCoord convertToUniversal(const UniversalCoord& uc, double tjd) const; Eigen::Quaterniond convertFromUniversal(const Eigen::Quaterniond& q, double tjd) const; @@ -39,13 +39,13 @@ class ReferenceFrame Eigen::Vector3d convertFromAstrocentric(const Eigen::Vector3d& p, double tjd) const; Eigen::Vector3d convertToAstrocentric(const Eigen::Vector3d& p, double tjd) const; - + Selection getCenter() const; virtual Eigen::Quaterniond getOrientation(double tjd) const = 0; virtual Eigen::Vector3d getAngularVelocity(double tdb) const; - virtual bool isInertial() const = 0; + virtual bool isInertial() const = 0; enum FrameType { @@ -85,8 +85,8 @@ class CachingFrame : public ReferenceFrame mutable double lastTime; mutable Eigen::Quaterniond lastOrientation; mutable Eigen::Vector3d lastAngularVelocity; - mutable bool orientationCacheValid; - mutable bool angularVelocityCacheValid; + mutable bool orientationCacheValid; + mutable bool angularVelocityCacheValid; }; @@ -102,7 +102,7 @@ class J2000EclipticFrame : public ReferenceFrame return Eigen::Quaterniond::Identity(); } - virtual bool isInertial() const; + virtual bool isInertial() const; virtual unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth, @@ -117,7 +117,7 @@ class J2000EquatorFrame : public ReferenceFrame J2000EquatorFrame(Selection center); virtual ~J2000EquatorFrame() {}; Eigen::Quaterniond getOrientation(double tjd) const; - virtual bool isInertial() const; + virtual bool isInertial() const; virtual unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth, FrameType frameType) const; @@ -137,7 +137,7 @@ class BodyFixedFrame : public ReferenceFrame virtual ~BodyFixedFrame() {}; Eigen::Quaterniond getOrientation(double tjd) const; virtual Eigen::Vector3d getAngularVelocity(double tjd) const; - virtual bool isInertial() const; + virtual bool isInertial() const; virtual unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth, FrameType frameType) const; @@ -155,7 +155,7 @@ class BodyMeanEquatorFrame : public ReferenceFrame virtual ~BodyMeanEquatorFrame() {}; Eigen::Quaterniond getOrientation(double tjd) const; virtual Eigen::Vector3d getAngularVelocity(double tjd) const; - virtual bool isInertial() const; + virtual bool isInertial() const; virtual unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth, FrameType frameType) const; @@ -193,7 +193,7 @@ class FrameVector RelativeVelocity, ConstantVector, }; - + static FrameVector createRelativePositionVector(const Selection& _observer, const Selection& _target); static FrameVector createRelativeVelocityVector(const Selection& _observer, @@ -229,7 +229,7 @@ class TwoVectorFrame : public CachingFrame * the primary and secondary vectors: * 1 = x, 2 = y, 3 = z, -1 = -x, -2 = -y, -3 = -z */ - TwoVectorFrame(Selection center, + TwoVectorFrame(Selection center, const FrameVector& prim, int primAxis, const FrameVector& sec, @@ -237,7 +237,7 @@ class TwoVectorFrame : public CachingFrame virtual ~TwoVectorFrame() {}; Eigen::Quaterniond computeOrientation(double tjd) const; - virtual bool isInertial() const; + virtual bool isInertial() const; virtual unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth, FrameType frameType) const; diff --git a/src/celengine/frametree.cpp b/src/celengine/frametree.cpp index e9b33a856..93a43c00b 100644 --- a/src/celengine/frametree.cpp +++ b/src/celengine/frametree.cpp @@ -30,7 +30,7 @@ * parents. * * The FrameTree hiearchy is designed for fast visibility culling. There are - * two values stored in each node for this purpose: the bounding sphere + * two values stored in each node for this purpose: the bounding sphere * radius, and the maximum child object radius. The bounding sphere is large * enough to contain the orbits of all child objects, as well as the child * objects themselves. Change tracking is performed whenever the frame tree diff --git a/src/celengine/galaxy.cpp b/src/celengine/galaxy.cpp index fe0d10206..527211962 100644 --- a/src/celengine/galaxy.cpp +++ b/src/celengine/galaxy.cpp @@ -47,7 +47,7 @@ float Galaxy::lightGain = 0.0f; bool operator< (const Blob& b1, const Blob& b2) { - return (b1.position.squaredNorm() < b2.position.squaredNorm()); + return (b1.position.squaredNorm() < b2.position.squaredNorm()); } typedef vector > BlobVector; @@ -164,39 +164,39 @@ void Galaxy::setType(const string& typeStr) if (!formsInitialized) InitializeForms(); - if (customTmpName != NULL) - { - form = buildGalacticForms("models/" + *customTmpName); - } - else - { - switch (type) - { - case S0: - case Sa: - case Sb: - case Sc: - case SBa: - case SBb: - case SBc: - form = spiralForms[type - S0]; - break; - case E0: - case E1: - case E2: - case E3: - case E4: - case E5: - case E6: - case E7: - form = ellipticalForms[type - E0]; - //form = NULL; - break; - case Irr: - form = irregularForm; - break; - } - } + if (customTmpName != NULL) + { + form = buildGalacticForms("models/" + *customTmpName); + } + else + { + switch (type) + { + case S0: + case Sa: + case Sb: + case Sc: + case SBa: + case SBb: + case SBc: + form = spiralForms[type - S0]; + break; + case E0: + case E1: + case E2: + case E3: + case E4: + case E5: + case E6: + case E7: + form = ellipticalForms[type - E0]; + //form = NULL; + break; + case Irr: + form = irregularForm; + break; + } + } } @@ -228,7 +228,7 @@ bool Galaxy::pick(const Ray3d& ray, { if (!isVisible()) return false; - + // The ellipsoid should be slightly larger to compensate for the fact // that blobs are considered points when galaxies are built, but have size // when they are drawn. @@ -251,9 +251,9 @@ bool Galaxy::load(AssociativeArray* params, const string& resPath) params->getNumber("Detail", detail); setDetail((float) detail); - string customTmpName; - if(params->getString("CustomTemplate",customTmpName)) - setCustomTmpName(customTmpName); + string customTmpName; + if(params->getString("CustomTemplate",customTmpName)) + setCustomTmpName(customTmpName); string typeName; params->getString("Type", typeName); @@ -518,95 +518,95 @@ void Galaxy::setLightGain(float lg) GalacticForm* buildGalacticForms(const std::string& filename) { - Blob b; + Blob b; BlobVector* galacticPoints = new BlobVector; - // Load templates in standard .png format - int width, height, rgb, j = 0, kmin = 9; - unsigned char value; - float h = 0.75f; - Image* img; - img = LoadPNGImage(filename); - if (img == NULL) - { - cout<<"\nThe galaxy template *** "<getWidth(); - height = img->getHeight(); - rgb = img->getComponents(); + // Load templates in standard .png format + int width, height, rgb, j = 0, kmin = 9; + unsigned char value; + float h = 0.75f; + Image* img; + img = LoadPNGImage(filename); + if (img == NULL) + { + cout<<"\nThe galaxy template *** "<getWidth(); + height = img->getHeight(); + rgb = img->getComponents(); - for (int i = 0; i < width * height; i++) - { - value = img->getPixels()[rgb * i]; - if (value > 10) - { - float x, y, z, r2, yy, prob; - z = floor(i /(float) width); - x = (i - width * z - 0.5f * (width - 1)) / (float) width; - z = (0.5f * (height - 1) - z) / (float) height; - x += Mathf::sfrand() * 0.008f; - z += Mathf::sfrand() * 0.008f; - r2 = x * x + z * z; + for (int i = 0; i < width * height; i++) + { + value = img->getPixels()[rgb * i]; + if (value > 10) + { + float x, y, z, r2, yy, prob; + z = floor(i /(float) width); + x = (i - width * z - 0.5f * (width - 1)) / (float) width; + z = (0.5f * (height - 1) - z) / (float) height; + x += Mathf::sfrand() * 0.008f; + z += Mathf::sfrand() * 0.008f; + r2 = x * x + z * z; - if ( strcmp ( filename.c_str(), "models/E0.png") != 0 ) - { - float y0 = 0.5f * MAX_SPIRAL_THICKNESS * sqrt((float)value/256.0f) * exp(- 5.0f * r2); - float B, yr; - B = (r2 > 0.35f)? 1.0f: 0.75f; // the darkness of the "dust lane", 0 < B < 1 - float p0 = 1.0f - B * exp(-h * h); // the uniform reference probability, envelopping prob*p0. - do - { - // generate "thickness" y of spirals with emulation of a dust lane - // in galctic plane (y=0) + if ( strcmp ( filename.c_str(), "models/E0.png") != 0 ) + { + float y0 = 0.5f * MAX_SPIRAL_THICKNESS * sqrt((float)value/256.0f) * exp(- 5.0f * r2); + float B, yr; + B = (r2 > 0.35f)? 1.0f: 0.75f; // the darkness of the "dust lane", 0 < B < 1 + float p0 = 1.0f - B * exp(-h * h); // the uniform reference probability, envelopping prob*p0. + do + { + // generate "thickness" y of spirals with emulation of a dust lane + // in galctic plane (y=0) - yr = Mathf::sfrand() * h; - prob = (1.0f - B * exp(-yr * yr))/p0; + yr = Mathf::sfrand() * h; + prob = (1.0f - B * exp(-yr * yr))/p0; - } while (Mathf::frand() > prob); - b.brightness = value * prob; - y = y0 * yr / h; - } - else - { - // generate spherically symmetric distribution from E0.png - do - { - yy = Mathf::sfrand(); - float ry2 = 1.0f - yy * yy; - prob = ry2 > 0? sqrt(ry2): 0.0f; - } while (Mathf::frand() > prob); - y = yy * sqrt(0.25f - r2) ; - b.brightness = value; - kmin = 12; - } + } while (Mathf::frand() > prob); + b.brightness = value * prob; + y = y0 * yr / h; + } + else + { + // generate spherically symmetric distribution from E0.png + do + { + yy = Mathf::sfrand(); + float ry2 = 1.0f - yy * yy; + prob = ry2 > 0? sqrt(ry2): 0.0f; + } while (Mathf::frand() > prob); + y = yy * sqrt(0.25f - r2) ; + b.brightness = value; + kmin = 12; + } - b.position = Vector4f(x, y, z, 1.0f); - unsigned int rr = (unsigned int) (b.position.head(3).norm() * 511); - b.colorIndex = rr < 256? rr: 255; - galacticPoints->push_back(b); - j++; - } - } + b.position = Vector4f(x, y, z, 1.0f); + unsigned int rr = (unsigned int) (b.position.head(3).norm() * 511); + b.colorIndex = rr < 256? rr: 255; + galacticPoints->push_back(b); + j++; + } + } delete img; - galacticPoints->reserve(j); + galacticPoints->reserve(j); - // sort to start with the galaxy center region (x^2 + y^2 + z^2 ~ 0), such that - // the biggest (brightest) sprites will be localized there! + // sort to start with the galaxy center region (x^2 + y^2 + z^2 ~ 0), such that + // the biggest (brightest) sprites will be localized there! - sort(galacticPoints->begin(), galacticPoints->end()); + sort(galacticPoints->begin(), galacticPoints->end()); - // reshuffle the galaxy points randomly...except the first kmin+1 in the center! - // the higher that number the stronger the central "glow" + // reshuffle the galaxy points randomly...except the first kmin+1 in the center! + // the higher that number the stronger the central "glow" - random_shuffle( galacticPoints->begin() + kmin, galacticPoints->end()); + random_shuffle( galacticPoints->begin() + kmin, galacticPoints->end()); - GalacticForm* galacticForm = new GalacticForm(); - galacticForm->blobs = galacticPoints; + GalacticForm* galacticForm = new GalacticForm(); + galacticForm->blobs = galacticPoints; galacticForm->scale = Vector3f::Ones(); - return galacticForm; + return galacticForm; } @@ -625,7 +625,7 @@ void InitializeForms() //convert Hue to RGB - DeepSkyObject::hsv2rgb(&rr, &gg, &bb, hue, 0.20f, 1.0f); + DeepSkyObject::hsv2rgb(&rr, &gg, &bb, hue, 0.20f, 1.0f); Color c(rr, gg, bb); colorTable[i] = Vector3f(c.red(), c.green(), c.blue()); } @@ -652,20 +652,20 @@ void InitializeForms() float ell = 1.0f - (float) eform / 8.0f; // note the correct x,y-alignment of 'ell' scaling!! - // build all elliptical templates from rescaling E0 + // build all elliptical templates from rescaling E0 - ellipticalForms[eform] = buildGalacticForms("models/E0.png"); - if (*ellipticalForms) - ellipticalForms[eform]->scale = Vector3f(ell, ell, 1.0f); + ellipticalForms[eform] = buildGalacticForms("models/E0.png"); + if (*ellipticalForms) + ellipticalForms[eform]->scale = Vector3f(ell, ell, 1.0f); // account for reddening of ellipticals rel.to spirals if (*ellipticalForms) { - unsigned int nPoints = (unsigned int) (ellipticalForms[eform]->blobs->size()); - for (unsigned int i = 0; i < nPoints; ++i) - { - (*ellipticalForms[eform]->blobs)[i].colorIndex = (unsigned int) ceil(0.76f * (*ellipticalForms[eform]->blobs)[i].colorIndex); - } + unsigned int nPoints = (unsigned int) (ellipticalForms[eform]->blobs->size()); + for (unsigned int i = 0; i < nPoints; ++i) + { + (*ellipticalForms[eform]->blobs)[i].colorIndex = (unsigned int) ceil(0.76f * (*ellipticalForms[eform]->blobs)[i].colorIndex); + } } } //Irregular Galaxies @@ -688,7 +688,7 @@ void InitializeForms() b.position = Vector4f(p.x, p.y, p.z, 1.0f); b.brightness = 64u; unsigned int rr = (unsigned int) (r * 511); - b.colorIndex = rr < 256? rr: 255; + b.colorIndex = rr < 256? rr: 255; irregularPoints->push_back(b); ++ip; } diff --git a/src/celengine/galaxy.h b/src/celengine/galaxy.h index 99557c819..793031f99 100644 --- a/src/celengine/galaxy.h +++ b/src/celengine/galaxy.h @@ -73,7 +73,7 @@ class Galaxy : public DeepSkyObject virtual unsigned int getRenderMask() const; virtual unsigned int getLabelMask() const; - + virtual const char* getObjTypeName() const; public: diff --git a/src/celengine/geometry.h b/src/celengine/geometry.h index d080fcd63..c54f662cc 100644 --- a/src/celengine/geometry.h +++ b/src/celengine/geometry.h @@ -32,14 +32,14 @@ public: * distance unmodified. */ virtual bool pick(const Ray3d& r, double& distance) const = 0; - + virtual bool isOpaque() const = 0; virtual bool isNormalized() const { return true; } - + /*! Return true if the specified texture map type is used at * all within this geometry object. This information is used * to decide whether multiple rendering passes are required. diff --git a/src/celengine/glcontext.cpp b/src/celengine/glcontext.cpp index 388d73915..87fbd520f 100644 --- a/src/celengine/glcontext.cpp +++ b/src/celengine/glcontext.cpp @@ -39,7 +39,7 @@ void GLContext::init(const vector& ignoreExt) if (extensionsString != NULL) { char* next = extensionsString; - + while (*next != '\0') { while (*next != '\0' && *next != ' ') diff --git a/src/celengine/glcontext.h b/src/celengine/glcontext.h index e41065924..c213a2059 100644 --- a/src/celengine/glcontext.h +++ b/src/celengine/glcontext.h @@ -21,7 +21,7 @@ class GLContext GLContext(); virtual ~GLContext(); - enum GLRenderPath + enum GLRenderPath { GLPath_Basic = 0, GLPath_Multitexture = 1, @@ -42,7 +42,7 @@ class GLContext }; void init(const std::vector& ignoreExt); - + GLRenderPath getRenderPath() const { return renderPath; }; bool setRenderPath(GLRenderPath); bool renderPathSupported(GLRenderPath) const; diff --git a/src/celengine/globular.cpp b/src/celengine/globular.cpp index 99a67d4b8..89596257e 100644 --- a/src/celengine/globular.cpp +++ b/src/celengine/globular.cpp @@ -3,9 +3,9 @@ // Copyright (C) 2008, Celestia Development Team // Initial code by Dr. Fridger Schrempp // -// Simulation of globular clusters, theoretical framework by +// Simulation of globular clusters, theoretical framework by // Ivan King, Astron. J. 67 (1962) 471; ibid. 71 (1966) 64 -// +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 @@ -33,16 +33,16 @@ using namespace Eigen; using namespace std; -static int cntrTexWidth = 512, cntrTexHeight = 512; +static int cntrTexWidth = 512, cntrTexHeight = 512; static int starTexWidth = 128, starTexHeight = 128; static Color colorTable[256]; static const unsigned int GLOBULAR_POINTS = 8192; static const float LumiShape = 3.0f, Lumi0 = exp(-LumiShape); -// Reference values ( = data base averages) of core radius, King concentration -// and mu25 isophote radius: - -static const float R_c_ref = 0.83f, C_ref = 2.1f, R_mu25 = 40.32f; +// Reference values ( = data base averages) of core radius, King concentration +// and mu25 isophote radius: + +static const float R_c_ref = 0.83f, C_ref = 2.1f, R_mu25 = 40.32f; // min/max c-values of globular cluster data @@ -65,18 +65,18 @@ static bool formsInitialized = false; static bool decreasing (const GBlob& b1, const GBlob& b2) { - return (b1.radius_2d > b2.radius_2d); + return (b1.radius_2d > b2.radius_2d); } static void GlobularTextureEval(float u, float v, float /*w*/, unsigned char *pixel) { - // use an exponential luminosity shape for the individual stars + // use an exponential luminosity shape for the individual stars // giving sort of a halo for the brighter (i.e.bigger) stars. float lumi = exp(- LumiShape * sqrt(u * u + v * v)) - Lumi0; - if (lumi <= 0.0f) - lumi = 0.0f; + if (lumi <= 0.0f) + lumi = 0.0f; int pixVal = (int) (lumi * 255.99f); #ifdef HDR_COMPRESS @@ -94,91 +94,91 @@ static void GlobularTextureEval(float u, float v, float /*w*/, unsigned char *pi float relStarDensity(float eta) { - /*! As alpha blending weight (relStarDensity) I take the theoretical - * number of globular stars in 2d projection at a distance - * rho = r / r_c = eta * r_t from the center (cf. King_1962's Eq.(18)), - * divided by the area = PI * rho * rho . This number density of stars - * I normalized to 1 at rho=0. + /*! As alpha blending weight (relStarDensity) I take the theoretical + * number of globular stars in 2d projection at a distance + * rho = r / r_c = eta * r_t from the center (cf. King_1962's Eq.(18)), + * divided by the area = PI * rho * rho . This number density of stars + * I normalized to 1 at rho=0. - * The resulting blending weight increases strongly -> 1 if the - * 2d number density of stars rises, i.e for rho -> 0. - */ + * The resulting blending weight increases strongly -> 1 if the + * 2d number density of stars rises, i.e for rho -> 0. + */ // Since the central "cloud" is due to lack of visual resolution, - // rather than cluster morphology, we limit it's size by - // taking max(C_ref, CBin). Smaller c gives a shallower distribution! - - float rRatio = max(RRatio_min, RRatio); - float Xi = 1.0f / sqrt(1.0f + rRatio * rRatio); - float XI2 = Xi * Xi; - float rho2 = 1.0001f + eta * eta * rRatio * rRatio; //add 1e-4 as regulator near rho=0 + // rather than cluster morphology, we limit it's size by + // taking max(C_ref, CBin). Smaller c gives a shallower distribution! - return ((log(rho2) + 4.0f * (1.0f - sqrt(rho2)) * Xi) / (rho2 - 1.0f) + XI2) / (1.0f - 2.0f * Xi + XI2); + float rRatio = max(RRatio_min, RRatio); + float Xi = 1.0f / sqrt(1.0f + rRatio * rRatio); + float XI2 = Xi * Xi; + float rho2 = 1.0001f + eta * eta * rRatio * rRatio; //add 1e-4 as regulator near rho=0 + + return ((log(rho2) + 4.0f * (1.0f - sqrt(rho2)) * Xi) / (rho2 - 1.0f) + XI2) / (1.0f - 2.0f * Xi + XI2); } static void CenterCloudTexEval(float u, float v, float /*w*/, unsigned char *pixel) -{ - /*! For reasons of speed, calculate central "cloud" texture only for - * 8 bins of King_1962 concentration, c = CBin, XI(CBin), RRatio(CBin). - */ - - // Skyplane projected King_1962 profile at center (rho = eta = 0): - float c2d = 1.0f - XI; - - float eta = sqrt(u * u + v * v); // u,v = (-1..1) - - // eta^2 = u * u + v * v = 1 is the biggest circle fitting into the quadratic - // procedural texture. Hence clipping - - if (eta >= 1.0f) - eta = 1.0f; +{ + /*! For reasons of speed, calculate central "cloud" texture only for + * 8 bins of King_1962 concentration, c = CBin, XI(CBin), RRatio(CBin). + */ - // eta = 1 corresponds to tidalRadius: + // Skyplane projected King_1962 profile at center (rho = eta = 0): + float c2d = 1.0f - XI; - float rho = eta * RRatio; - float rho2 = 1.0f + rho * rho; + float eta = sqrt(u * u + v * v); // u,v = (-1..1) + + // eta^2 = u * u + v * v = 1 is the biggest circle fitting into the quadratic + // procedural texture. Hence clipping + + if (eta >= 1.0f) + eta = 1.0f; + + // eta = 1 corresponds to tidalRadius: + + float rho = eta * RRatio; + float rho2 = 1.0f + rho * rho; // Skyplane projected King_1962 profile (Eq.(14)), vanishes for eta = 1: - // i.e. absolutely no globular stars for r > tidalRadius: - - float profile_2d = (1.0f / sqrt(rho2) - 1.0f)/c2d + 1.0f ; - profile_2d = profile_2d * profile_2d; + // i.e. absolutely no globular stars for r > tidalRadius: + + float profile_2d = (1.0f / sqrt(rho2) - 1.0f)/c2d + 1.0f ; + profile_2d = profile_2d * profile_2d; #ifdef HDR_COMPRESS pixel[0] = 127; - pixel[1] = 127; + pixel[1] = 127; pixel[2] = 127; -#else +#else pixel[0] = 255; pixel[1] = 255; pixel[2] = 255; #endif - pixel[3] = (int) (relStarDensity(eta) * profile_2d * 255.99f); + pixel[3] = (int) (relStarDensity(eta) * profile_2d * 255.99f); } Globular::Globular() : detail (1.0f), customTmpName (NULL), form (NULL), - r_c (R_c_ref), - c (C_ref), - tidalRadius(0.0f) + r_c (R_c_ref), + c (C_ref), + tidalRadius(0.0f) { - recomputeTidalRadius(); + recomputeTidalRadius(); } unsigned int Globular::cSlot(float conc) const { - // map the physical range of c, minC <= c <= maxC, - // to 8 integers (bin numbers), 0 < cSlot <= 7: - - if (conc <= MinC) - conc = MinC; - if (conc >= MaxC) - conc = MaxC; - + // map the physical range of c, minC <= c <= maxC, + // to 8 integers (bin numbers), 0 < cSlot <= 7: + + if (conc <= MinC) + conc = MinC; + if (conc >= MaxC) + conc = MaxC; + return (unsigned int) floor((conc - MinC) / BinWidth); } - + const char* Globular::getType() const { @@ -224,38 +224,38 @@ float Globular::getCoreRadius() const void Globular::setCoreRadius(const float coreRadius) { - r_c = coreRadius; - recomputeTidalRadius(); + r_c = coreRadius; + recomputeTidalRadius(); } - + float Globular::getHalfMassRadius() const { - // Aproximation to the half-mass radius r_h [ly] - // (~ 20% accuracy) - - return std::tan(degToRad(r_c / 60.0f)) * (float) getPosition().norm() * pow(10.0f, 0.6f * c - 0.4f); + // Aproximation to the half-mass radius r_h [ly] + // (~ 20% accuracy) + + return std::tan(degToRad(r_c / 60.0f)) * (float) getPosition().norm() * pow(10.0f, 0.6f * c - 0.4f); } float Globular::getConcentration() const { - return c; + return c; } void Globular::setConcentration(const float conc) { c = conc; if (!formsInitialized) - InitializeForms(); - - // For saving time, account for the c dependence via 8 bins only, + InitializeForms(); - form = globularForms[cSlot(conc)]; + // For saving time, account for the c dependence via 8 bins only, + + form = globularForms[cSlot(conc)]; recomputeTidalRadius(); } size_t Globular::getDescription(char* buf, size_t bufLength) const { - return snprintf(buf, bufLength, _("Globular (core radius: %4.2f', King concentration: %4.2f)"), r_c, c); + return snprintf(buf, bufLength, _("Globular (core radius: %4.2f', King concentration: %4.2f)"), r_c, c); } @@ -277,12 +277,12 @@ bool Globular::pick(const Ray3d& ray, { if (!isVisible()) return false; - /* + /* * The selection ellipsoid should be slightly larger to compensate for the fact * that blobs are considered points when globulars are built, but have size - * when they are drawn. - */ - Vec3d ellipsoidAxes(getRadius() * (form->scale.x + RADIUS_CORRECTION), + * when they are drawn. + */ + Vec3d ellipsoidAxes(getRadius() * (form->scale.x + RADIUS_CORRECTION), getRadius() * (form->scale.y + RADIUS_CORRECTION), getRadius() * (form->scale.z + RADIUS_CORRECTION)); @@ -300,25 +300,25 @@ bool Globular::load(AssociativeArray* params, const string& resPath) bool ok = DeepSkyObject::load(params, resPath); if (!ok) - return false; + return false; if (params->getNumber("Detail", detail)) - setDetail((float) detail); - - string customTmpName; - if (params->getString("CustomTemplate", customTmpName )) - setCustomTmpName(customTmpName); - + setDetail((float) detail); + + string customTmpName; + if (params->getString("CustomTemplate", customTmpName )) + setCustomTmpName(customTmpName); + double coreRadius; - if (params->getAngle("CoreRadius", coreRadius, 1.0 / MINUTES_PER_DEG)) + if (params->getAngle("CoreRadius", coreRadius, 1.0 / MINUTES_PER_DEG)) { r_c = coreRadius; - setCoreRadius(r_c); + setCoreRadius(r_c); } - - if (params->getNumber("KingConcentration", c)) - setConcentration(c); - + + if (params->getNumber("KingConcentration", c)) + setConcentration(c); + return true; } @@ -328,7 +328,7 @@ void Globular::render(const GLContext& context, const Quaternionf& viewerOrientation, float brightness, float pixelSize) -{ +{ renderGlobularPointSprites(context, fromEigen(offset), fromEigen(viewerOrientation), brightness, pixelSize); } @@ -341,164 +341,164 @@ void Globular::renderGlobularPointSprites(const GLContext&, { if (form == NULL) return; - - float distanceToDSO = offset.length() - getRadius(); - if (distanceToDSO < 0) - distanceToDSO = 0; - - float minimumFeatureSize = 0.5f * pixelSize * distanceToDSO; - - DiskSizeInPixels = getRadius() / minimumFeatureSize; - - /* + + float distanceToDSO = offset.length() - getRadius(); + if (distanceToDSO < 0) + distanceToDSO = 0; + + float minimumFeatureSize = 0.5f * pixelSize * distanceToDSO; + + DiskSizeInPixels = getRadius() / minimumFeatureSize; + + /* * Is the globular's apparent size big enough to * be noticeable on screen? If it's not, break right here to * avoid all the overhead of the matrix transformations and - * GL state changes: - */ - - if (DiskSizeInPixels < 1.0f) - return; + * GL state changes: + */ + + if (DiskSizeInPixels < 1.0f) + return; /* - * When resolution (zoom) varies, the blended texture opacity is controlled by the - * factor 'pixelWeight'. At low resolution, the latter starts at 1, but tends to 0, - * if the resolution increases sufficiently (DiskSizeInPixels >= P1 pixels)! - * The smaller P2 (<1), the faster pixelWeight -> 0, for DiskSizeInPixels >= P1. - */ - - float pixelWeight = (DiskSizeInPixels >= P1)? 1.0f/(P2 + (1.0f - P2) * DiskSizeInPixels / P1): 1.0f; - - // Use same 8 c-bins as in globularForms below! - - unsigned int ic = cSlot(c); + * When resolution (zoom) varies, the blended texture opacity is controlled by the + * factor 'pixelWeight'. At low resolution, the latter starts at 1, but tends to 0, + * if the resolution increases sufficiently (DiskSizeInPixels >= P1 pixels)! + * The smaller P2 (<1), the faster pixelWeight -> 0, for DiskSizeInPixels >= P1. + */ + + float pixelWeight = (DiskSizeInPixels >= P1)? 1.0f/(P2 + (1.0f - P2) * DiskSizeInPixels / P1): 1.0f; + + // Use same 8 c-bins as in globularForms below! + + unsigned int ic = cSlot(c); CBin = MinC + ((float) ic + 0.5f) * BinWidth; // center value of (ic+1)th c-bin - RRatio = pow(10.0f, CBin); - XI = 1.0f / sqrt(1.0f + RRatio * RRatio); - + RRatio = pow(10.0f, CBin); + XI = 1.0f / sqrt(1.0f + RRatio * RRatio); + if(centerTex[ic] == NULL) - { - centerTex[ic] = CreateProceduralTexture( cntrTexWidth, cntrTexHeight, GL_RGBA, CenterCloudTexEval); - } - assert(centerTex[ic] != NULL); - - if (globularTex == NULL) + { + centerTex[ic] = CreateProceduralTexture( cntrTexWidth, cntrTexHeight, GL_RGBA, CenterCloudTexEval); + } + assert(centerTex[ic] != NULL); + + if (globularTex == NULL) { globularTex = CreateProceduralTexture( starTexWidth, starTexHeight, GL_RGBA, GlobularTextureEval); } assert(globularTex != NULL); - glEnable (GL_BLEND); - glEnable (GL_TEXTURE_2D); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + glEnable (GL_BLEND); + glEnable (GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Mat3f viewMat = viewerOrientation.toMatrix3(); Vec3f v0 = Vec3f(-1, -1, 0) * viewMat; Vec3f v1 = Vec3f( 1, -1, 0) * viewMat; Vec3f v2 = Vec3f( 1, 1, 0) * viewMat; Vec3f v3 = Vec3f(-1, 1, 0) * viewMat; - - float tidalSize = 2 * tidalRadius; - Mat3f m = - Mat3f::scaling(form->scale) * fromEigen(getOrientation()).toMatrix3() * - Mat3f::scaling(tidalSize); - + + float tidalSize = 2 * tidalRadius; + Mat3f m = + Mat3f::scaling(form->scale) * fromEigen(getOrientation()).toMatrix3() * + Mat3f::scaling(tidalSize); + vector* points = form->gblobs; - unsigned int nPoints = - (unsigned int) (points->size() * clamp(getDetail())); - - /* Render central cloud sprite (centerTex). It fades away when - * distance from center or resolution increases sufficiently. - */ - - centerTex[ic]->bind(); - - float br = 2 * brightness; + unsigned int nPoints = + (unsigned int) (points->size() * clamp(getDetail())); - glColor4f(Rr, Gg, Bb, min(br * pixelWeight, 1.0f)); + /* Render central cloud sprite (centerTex). It fades away when + * distance from center or resolution increases sufficiently. + */ - glBegin(GL_QUADS); - - glTexCoord2f(0, 0); glVertex(v0 * tidalSize); + centerTex[ic]->bind(); + + float br = 2 * brightness; + + glColor4f(Rr, Gg, Bb, min(br * pixelWeight, 1.0f)); + + glBegin(GL_QUADS); + + glTexCoord2f(0, 0); glVertex(v0 * tidalSize); glTexCoord2f(1, 0); glVertex(v1 * tidalSize); glTexCoord2f(1, 1); glVertex(v2 * tidalSize); - glTexCoord2f(0, 1); glVertex(v3 * tidalSize); - - glEnd(); - - /*! Next, render globular cluster via distinct "star" sprites (globularTex) - * for sufficiently large resolution and distance from center of globular. - * - * This RGBA texture fades away when resolution decreases (e.g. via automag!), - * or when distance from globular center decreases. - */ - - - globularTex->bind(); - - - int pow2 = 128; // Associate "Red Giants" with the 128 biggest star-sprites + glTexCoord2f(0, 1); glVertex(v3 * tidalSize); - float starSize = br * 0.5f; // Maximal size of star sprites -> "Red Giants" - float clipDistance = 100.0f; // observer distance [ly] from globular, where we - // start "morphing" the star-sprite sizes towards - // their physical values - glBegin(GL_QUADS); - - for (unsigned int i = 0; i < nPoints; ++i) - { - GBlob b = (*points)[i]; - Point3f p = b.position * m; - float eta_2d = b.radius_2d; - - /*! Note that the [axis,angle] input in globulars.dsc transforms the - * 2d projected star distance r_2d in the globular frame to refer to the - * skyplane frame for each globular! That's what I need here. - * - * The [axis,angle] input will be needed anyway, when upgrading to - * account for ellipticities, with corresponding inclinations and - * position angles... - */ + glEnd(); + + /*! Next, render globular cluster via distinct "star" sprites (globularTex) + * for sufficiently large resolution and distance from center of globular. + * + * This RGBA texture fades away when resolution decreases (e.g. via automag!), + * or when distance from globular center decreases. + */ - if ((i & pow2) != 0) - { - pow2 <<= 1; - starSize /= 1.25f; - - if (starSize < minimumFeatureSize) - break; - } + globularTex->bind(); - float obsDistanceToStarRatio = (p + offset).distanceFromOrigin() / clipDistance; - float saveSize = starSize; - if (obsDistanceToStarRatio < 1.0f) - { - // "Morph" the star-sprite sizes at close observer distance such that - // the overdense globular core is dissolved upon closing in. - - starSize = starSize * min(obsDistanceToStarRatio, 1.0f); - } - - /* Colors of normal globular stars are given by color profile. - * Associate orange "Red Giant" stars with the largest sprite - * sizes (while pow2 = 128). - */ + int pow2 = 128; // Associate "Red Giants" with the 128 biggest star-sprites - Color col = (pow2 < 256)? colorTable[255]: colorTable[b.colorIndex]; - glColor4f(col.red(), col.green(), col.blue(), - min(br * (1.0f - pixelWeight * relStarDensity(eta_2d)), 1.0f)); - - glTexCoord2f(0, 0); glVertex(p + (v0 * starSize)); - glTexCoord2f(1, 0); glVertex(p + (v1 * starSize)); - glTexCoord2f(1, 1); glVertex(p + (v2 * starSize)); - glTexCoord2f(0, 1); glVertex(p + (v3 * starSize)); - - starSize = saveSize; - } - glEnd(); + float starSize = br * 0.5f; // Maximal size of star sprites -> "Red Giants" + float clipDistance = 100.0f; // observer distance [ly] from globular, where we + // start "morphing" the star-sprite sizes towards + // their physical values + glBegin(GL_QUADS); + + for (unsigned int i = 0; i < nPoints; ++i) + { + GBlob b = (*points)[i]; + Point3f p = b.position * m; + float eta_2d = b.radius_2d; + + /*! Note that the [axis,angle] input in globulars.dsc transforms the + * 2d projected star distance r_2d in the globular frame to refer to the + * skyplane frame for each globular! That's what I need here. + * + * The [axis,angle] input will be needed anyway, when upgrading to + * account for ellipticities, with corresponding inclinations and + * position angles... + */ + + + if ((i & pow2) != 0) + { + pow2 <<= 1; + starSize /= 1.25f; + + if (starSize < minimumFeatureSize) + break; + } + + float obsDistanceToStarRatio = (p + offset).distanceFromOrigin() / clipDistance; + float saveSize = starSize; + + if (obsDistanceToStarRatio < 1.0f) + { + // "Morph" the star-sprite sizes at close observer distance such that + // the overdense globular core is dissolved upon closing in. + + starSize = starSize * min(obsDistanceToStarRatio, 1.0f); + } + + /* Colors of normal globular stars are given by color profile. + * Associate orange "Red Giant" stars with the largest sprite + * sizes (while pow2 = 128). + */ + + Color col = (pow2 < 256)? colorTable[255]: colorTable[b.colorIndex]; + glColor4f(col.red(), col.green(), col.blue(), + min(br * (1.0f - pixelWeight * relStarDensity(eta_2d)), 1.0f)); + + glTexCoord2f(0, 0); glVertex(p + (v0 * starSize)); + glTexCoord2f(1, 0); glVertex(p + (v1 * starSize)); + glTexCoord2f(1, 1); glVertex(p + (v2 * starSize)); + glTexCoord2f(0, 1); glVertex(p + (v3 * starSize)); + + starSize = saveSize; + } + glEnd(); } unsigned int Globular::getRenderMask() const @@ -510,168 +510,168 @@ unsigned int Globular::getLabelMask() const { return Renderer::GlobularLabels; } - + void Globular::recomputeTidalRadius() { - // Convert the core radius from arcminutes to light years - // Compute the tidal radius in light years - - float coreRadiusLy = std::tan(degToRad(r_c / 60.0f)) * (float) getPosition().norm(); - tidalRadius = coreRadiusLy * std::pow(10.0f, c); + // Convert the core radius from arcminutes to light years + // Compute the tidal radius in light years + + float coreRadiusLy = std::tan(degToRad(r_c / 60.0f)) * (float) getPosition().norm(); + tidalRadius = coreRadiusLy * std::pow(10.0f, c); } GlobularForm* buildGlobularForms(float c) { - GBlob b; - vector* globularPoints = new vector; + GBlob b; + vector* globularPoints = new vector; - float rRatio = pow(10.0f, c); // = r_t / r_c - float prob; - float cc = 1.0f + rRatio * rRatio; - unsigned int i = 0, k = 0; - - // Value of King_1962 luminosity profile at center: - - float prob0 = sqrt(cc) - 1.0f; + float rRatio = pow(10.0f, c); // = r_t / r_c + float prob; + float cc = 1.0f + rRatio * rRatio; + unsigned int i = 0, k = 0; - /*! Generate the globular star distribution randomly, according - * to the King_1962 surface density profile f(r), eq.(14). - * - * rho = r / r_c = eta r_t / r_c, 0 <= eta <= 1, - * coreRadius r_c, tidalRadius r_t, King concentration c = log10(r_t/r_c). - */ - - while (i < GLOBULAR_POINTS) - { - /*! - * Use a combination of the Inverse Transform method and - * Von Neumann's Acceptance-Rejection method for generating sprite stars - * with eta distributed according to the exact King luminosity profile. - * - * This algorithm leads to almost 100% efficiency for all values of - * parameters and variables! - */ - - float uu = Mathf::frand(); - - /* First step: eta distributed as inverse power distribution (~1/Z^2) - * that majorizes the exact King profile. Compute eta in terms of uniformly - * distributed variable uu! Normalization to 1 for eta -> 0. - */ - - float eta = tan(uu *atan(rRatio))/rRatio; + // Value of King_1962 luminosity profile at center: - float rho = eta * rRatio; - float cH = 1.0f/(1.0f + rho * rho); + float prob0 = sqrt(cc) - 1.0f; + + /*! Generate the globular star distribution randomly, according + * to the King_1962 surface density profile f(r), eq.(14). + * + * rho = r / r_c = eta r_t / r_c, 0 <= eta <= 1, + * coreRadius r_c, tidalRadius r_t, King concentration c = log10(r_t/r_c). + */ + + while (i < GLOBULAR_POINTS) + { + /*! + * Use a combination of the Inverse Transform method and + * Von Neumann's Acceptance-Rejection method for generating sprite stars + * with eta distributed according to the exact King luminosity profile. + * + * This algorithm leads to almost 100% efficiency for all values of + * parameters and variables! + */ + + float uu = Mathf::frand(); + + /* First step: eta distributed as inverse power distribution (~1/Z^2) + * that majorizes the exact King profile. Compute eta in terms of uniformly + * distributed variable uu! Normalization to 1 for eta -> 0. + */ + + float eta = tan(uu *atan(rRatio))/rRatio; + + float rho = eta * rRatio; + float cH = 1.0f/(1.0f + rho * rho); float Z = sqrt((1.0f + rho * rho)/cc); // scaling variable - - // Express King_1962 profile in terms of the UNIVERSAL variable 0 < Z <= 1, - - prob = (1.0f - 1.0f / Z) / prob0; - prob = prob * prob; - - /* Second step: Use Acceptance-Rejection method (Von Neumann) for - * correcting the power distribution of eta into the exact, - * desired King form 'prob'! - */ + + // Express King_1962 profile in terms of the UNIVERSAL variable 0 < Z <= 1, + + prob = (1.0f - 1.0f / Z) / prob0; + prob = prob * prob; + + /* Second step: Use Acceptance-Rejection method (Von Neumann) for + * correcting the power distribution of eta into the exact, + * desired King form 'prob'! + */ k++; - if (Mathf::frand() < prob / cH) - { - /* Generate 3d points of globular cluster stars in polar coordinates: - * Distribution in eta (<=> r) according to King's profile. - * Uniform distribution on any spherical surface for given eta. - * Note: u = cos(phi) must be used as a stochastic variable to get uniformity in angle! - */ - float u = Mathf::sfrand(); - float theta = 2 * (float) PI * Mathf::frand(); - float sthetu2 = sin(theta) * sqrt(1.0f - u * u); - - // x,y,z points within -0.5..+0.5, as required for consistency: - b.position = 0.5f * Point3f(eta * sqrt(1.0f - u * u) * cos(theta), eta * sthetu2 , eta * u); - - /* - * Note: 2d projection in x-z plane, according to Celestia's - * conventions! Hence... - */ - b.radius_2d = eta * sqrt(1.0f - sthetu2 * sthetu2); + if (Mathf::frand() < prob / cH) + { + /* Generate 3d points of globular cluster stars in polar coordinates: + * Distribution in eta (<=> r) according to King's profile. + * Uniform distribution on any spherical surface for given eta. + * Note: u = cos(phi) must be used as a stochastic variable to get uniformity in angle! + */ + float u = Mathf::sfrand(); + float theta = 2 * (float) PI * Mathf::frand(); + float sthetu2 = sin(theta) * sqrt(1.0f - u * u); - /* For now, implement only a generic spectrum for normal cluster - * stars, modelled from Hubble photo of M80. - * Blue Stragglers are qualitatively accounted for... - * assume color index poportional to Z as function of which the King profile - * becomes universal! - */ - - b.colorIndex = (unsigned int) (Z * 254); - - globularPoints->push_back(b); - i++; - } - } - - // Check for efficiency of sprite-star generation => close to 100 %! - //cout << "c = "<< c <<" i = " << i - 1 <<" k = " << k - 1 << " Efficiency: " << 100.0f * i / (float)k<<"%" << endl; - - GlobularForm* globularForm = new GlobularForm(); - globularForm->gblobs = globularPoints; - globularForm->scale = Vec3f(1.0f, 1.0f, 1.0f); - - return globularForm; + // x,y,z points within -0.5..+0.5, as required for consistency: + b.position = 0.5f * Point3f(eta * sqrt(1.0f - u * u) * cos(theta), eta * sthetu2 , eta * u); + + /* + * Note: 2d projection in x-z plane, according to Celestia's + * conventions! Hence... + */ + b.radius_2d = eta * sqrt(1.0f - sthetu2 * sthetu2); + + /* For now, implement only a generic spectrum for normal cluster + * stars, modelled from Hubble photo of M80. + * Blue Stragglers are qualitatively accounted for... + * assume color index poportional to Z as function of which the King profile + * becomes universal! + */ + + b.colorIndex = (unsigned int) (Z * 254); + + globularPoints->push_back(b); + i++; + } + } + + // Check for efficiency of sprite-star generation => close to 100 %! + //cout << "c = "<< c <<" i = " << i - 1 <<" k = " << k - 1 << " Efficiency: " << 100.0f * i / (float)k<<"%" << endl; + + GlobularForm* globularForm = new GlobularForm(); + globularForm->gblobs = globularPoints; + globularForm->scale = Vec3f(1.0f, 1.0f, 1.0f); + + return globularForm; } void InitializeForms() { - // Build RGB color table, using hue, saturation, value as input. - // Hue in degrees. - - // Location of hue transition and saturation peak in color index space: - int i0 = 36, i_satmax = 16; - // Width of hue transition in color index space: - int i_width = 3; - - float sat_l = 0.08f, sat_h = 0.1f, hue_r = 27.0f, hue_b = 220.0f; - - // Red Giant star color: i = 255: - // ------------------------------- - // Convert hue, saturation and value to RGB + // Build RGB color table, using hue, saturation, value as input. + // Hue in degrees. - DeepSkyObject::hsv2rgb(&Rr, &Gg, &Bb, 25.0f, 0.65f, 1.0f); - colorTable[255] = Color(Rr, Gg, Bb); - - // normal stars: i < 255, generic color profile for now, improve later - // -------------------------------------------------------------------- + // Location of hue transition and saturation peak in color index space: + int i0 = 36, i_satmax = 16; + // Width of hue transition in color index space: + int i_width = 3; + + float sat_l = 0.08f, sat_h = 0.1f, hue_r = 27.0f, hue_b = 220.0f; + + // Red Giant star color: i = 255: + // ------------------------------- + // Convert hue, saturation and value to RGB + + DeepSkyObject::hsv2rgb(&Rr, &Gg, &Bb, 25.0f, 0.65f, 1.0f); + colorTable[255] = Color(Rr, Gg, Bb); + + // normal stars: i < 255, generic color profile for now, improve later + // -------------------------------------------------------------------- // Convert hue, saturation, value to RGB - - for (int i = 254; i >=0; i--) + + for (int i = 254; i >=0; i--) { - // simple qualitative saturation profile: - // i_satmax is value of i where sat = sat_h + sat_l maximal + // simple qualitative saturation profile: + // i_satmax is value of i where sat = sat_h + sat_l maximal - float x = (float) i / (float) i_satmax, x2 = x ; - float sat = sat_l + 2 * sat_h /(x2 + 1.0f / x2); - - // Fast transition from hue_r to hue_b at i = i0 within a width - // i_width in color index space: + float x = (float) i / (float) i_satmax, x2 = x ; + float sat = sat_l + 2 * sat_h /(x2 + 1.0f / x2); - float hue = hue_r + 0.5f * (hue_b - hue_r) * (std::tanh((float)(i - i0) / (float) i_width) + 1.0f); - - DeepSkyObject::hsv2rgb(&Rr, &Gg, &Bb, hue, sat, 0.85f); - colorTable[i] = Color(Rr, Gg, Bb); - } - // Define globularForms corresponding to 8 different bins of King concentration c - - globularForms = new GlobularForm*[8]; + // Fast transition from hue_r to hue_b at i = i0 within a width + // i_width in color index space: - for (unsigned int ic = 0; ic <= 7; ++ic) + float hue = hue_r + 0.5f * (hue_b - hue_r) * (std::tanh((float)(i - i0) / (float) i_width) + 1.0f); + + DeepSkyObject::hsv2rgb(&Rr, &Gg, &Bb, hue, sat, 0.85f); + colorTable[i] = Color(Rr, Gg, Bb); + } + // Define globularForms corresponding to 8 different bins of King concentration c + + globularForms = new GlobularForm*[8]; + + for (unsigned int ic = 0; ic <= 7; ++ic) { float CBin = MinC + ((float) ic + 0.5f) * BinWidth; - globularForms[ic] = buildGlobularForms(CBin); - } - formsInitialized = true; + globularForms[ic] = buildGlobularForms(CBin); + } + formsInitialized = true; } diff --git a/src/celengine/globular.h b/src/celengine/globular.h index 140bc493d..7b4159fc8 100644 --- a/src/celengine/globular.h +++ b/src/celengine/globular.h @@ -3,9 +3,9 @@ // Copyright (C) 2008, Celestia Development Team // Initial implementation by Dr. Fridger Schrempp // -// Simulation of globular clusters, theoretical framework by +// Simulation of globular clusters, theoretical framework by // Ivan King, Astron. J. 67 (1962) 471; ibid. 71 (1966) 64 -// +// // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -36,23 +36,23 @@ class Globular : public DeepSkyObject public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW - Globular(); + Globular(); virtual const char* getType() const; virtual void setType(const std::string&); virtual size_t getDescription(char* buf, size_t bufLength) const; virtual std::string getCustomTmpName() const; virtual void setCustomTmpName(const std::string&); - float getDetail() const; + float getDetail() const; void setDetail(float); float getCoreRadius() const; void setCoreRadius(const float); - void setConcentration(const float); - float getConcentration() const; - float getHalfMassRadius() const; + void setConcentration(const float); + float getConcentration() const; + float getHalfMassRadius() const; unsigned int cSlot(float) const; - + virtual float getBoundingSphereRadius() const { return tidalRadius; } - + virtual bool pick(const Ray3d& ray, double& distanceToPicker, double& cosAngleToBoundCenter) const; @@ -63,25 +63,25 @@ class Globular : public DeepSkyObject float brightness, float pixelSize); virtual void renderGlobularPointSprites(const GLContext& context, - const Vec3f& offset, - const Quatf& viewerOrientation, - float brightness, - float pixelSize); - GlobularForm* getForm() const; + const Vec3f& offset, + const Quatf& viewerOrientation, + float brightness, + float pixelSize); + GlobularForm* getForm() const; virtual unsigned int getRenderMask() const; virtual unsigned int getLabelMask() const; virtual const char* getObjTypeName() const; - + private: void recomputeTidalRadius(); - + private: - float detail; - std::string* customTmpName; - GlobularForm* form; - float r_c; - float c; + float detail; + std::string* customTmpName; + GlobularForm* form; + float r_c; + float c; float tidalRadius; }; diff --git a/src/celengine/glshader.cpp b/src/celengine/glshader.cpp index f3e1e62a0..d2afe864f 100644 --- a/src/celengine/glshader.cpp +++ b/src/celengine/glshader.cpp @@ -38,7 +38,7 @@ GLShader::compile(const vector& source) { if (source.empty()) return ShaderStatus_EmptyProgram; - + // Convert vector of shader source strings to an array for OpenGL const char** sourceStrings = new const char*[source.size()]; for (unsigned int i = 0; i < source.size(); i++) @@ -50,7 +50,7 @@ GLShader::compile(const vector& source) // Actually compile the shader glCompileShaderARB(id); - + GLint compileSuccess; glGetObjectParameterivARB(id, GL_OBJECT_COMPILE_STATUS_ARB, &compileSuccess); @@ -235,7 +235,7 @@ GLShaderLoader::CreateFragmentShader(const vector& source, GLShaderStatus GLShaderLoader::CreateVertexShader(const string& source, GLVertexShader** vs) - + { vector v; v.push_back(source); @@ -338,11 +338,11 @@ GetInfoLog(GLhandleARB obj) char* log = new char[logLength]; if (log == NULL) return string(); - + glGetInfoLogARB(obj, logLength, &charsWritten, log); - + string s(log, charsWritten); delete[] log; - + return s; } diff --git a/src/celengine/glshader.h b/src/celengine/glshader.h index 26d5ebabc..4076ec5a6 100644 --- a/src/celengine/glshader.h +++ b/src/celengine/glshader.h @@ -92,7 +92,7 @@ class FloatShaderParameter FloatShaderParameter(GLhandleARB _obj, const char* name); FloatShaderParameter& operator=(float); - + private: int slot; }; diff --git a/src/celengine/image.cpp b/src/celengine/image.cpp index 5f97892d0..cb5103105 100644 --- a/src/celengine/image.cpp +++ b/src/celengine/image.cpp @@ -403,7 +403,7 @@ Image* LoadImageFromFile(const string& filename) struct my_error_mgr { - struct jpeg_error_mgr pub; // "public" fields + struct jpeg_error_mgr pub; // "public" fields jmp_buf setjmp_buffer; // for return to caller }; @@ -438,8 +438,8 @@ Image* LoadJPEGImage(const string& filename, int) // struct, to avoid dangling-pointer problems. struct my_error_mgr jerr; // More stuff - JSAMPARRAY buffer; // Output row buffer - int row_stride; // physical row width in output buffer + JSAMPARRAY buffer; // Output row buffer + int row_stride; // physical row width in output buffer long cont; // In this example we want to open the input file before doing anything else, diff --git a/src/celengine/lightenv.h b/src/celengine/lightenv.h index 986764865..262078bbd 100644 --- a/src/celengine/lightenv.h +++ b/src/celengine/lightenv.h @@ -94,7 +94,7 @@ public: Eigen::Vector3f eyeDir_obj; Eigen::Vector3f eyePos_obj; - + Eigen::Vector3f ambientColor; }; diff --git a/src/celengine/location.cpp b/src/celengine/location.cpp index 8e1dde041..ae7732711 100644 --- a/src/celengine/location.cpp +++ b/src/celengine/location.cpp @@ -62,7 +62,7 @@ FeatureNameEntry FeatureNames[] = { "Landing Site", Location::LandingSite }, { "Crater", Location::Crater }, }; - + Location::Location() : parent(NULL), @@ -93,7 +93,7 @@ string Location::getName(bool i18n) const void Location::setName(const string& _name) { name = _name; - i18nName = _(_name.c_str()); + i18nName = _(_name.c_str()); if (name == i18nName) i18nName = ""; } @@ -190,7 +190,7 @@ void Location::setParentBody(Body* _parent) } -/*! Get the position of the location relative to its body in +/*! Get the position of the location relative to its body in * the J2000 ecliptic coordinate system. */ Vector3d Location::getPlanetocentricPosition(double t) const diff --git a/src/celengine/lodspheremesh.h b/src/celengine/lodspheremesh.h index ffb5fa63e..99d172846 100644 --- a/src/celengine/lodspheremesh.h +++ b/src/celengine/lodspheremesh.h @@ -1,5 +1,5 @@ // lodspheremesh.h -// +// // Copyright (C) 2001-2010, Celestia Development Team // Original version by Chris Laurel // @@ -60,7 +60,7 @@ public: context(_context) {}; - int step; + int step; unsigned int attributes; // vertex attributes const Frustum& frustum; // frustum, for culling Point3f fp[8]; // frustum points, for culling @@ -68,7 +68,7 @@ public: const GLContext& context; }; - int renderPatches(int phi0, int theta0, + int renderPatches(int phi0, int theta0, int extent, int level, const RenderInfo&); diff --git a/src/celengine/marker.cpp b/src/celengine/marker.cpp index 3cb0a522b..4035d235c 100644 --- a/src/celengine/marker.cpp +++ b/src/celengine/marker.cpp @@ -121,11 +121,11 @@ MarkerRepresentation::operator=(const MarkerRepresentation& rep) m_size = rep.m_size; m_color = rep.m_color; m_label = rep.m_label; - + return *this; } - - + + void MarkerRepresentation::setColor(Color color) { m_color = color; @@ -260,9 +260,9 @@ void MarkerRepresentation::render(float size) const case Circle: glBegin(GL_LINE_LOOP); DrawCircle(s); - glEnd(); + glEnd(); break; - + case Disk: glBegin(GL_POLYGON); DrawCircle(s); diff --git a/src/celengine/marker.h b/src/celengine/marker.h index 027c90f76..806020b52 100644 --- a/src/celengine/marker.h +++ b/src/celengine/marker.h @@ -35,8 +35,8 @@ public: Circle = 10, Disk = 11, Crosshair = 12, - }; - + }; + MarkerRepresentation(Symbol symbol = MarkerRepresentation::Diamond, float size = 10.0f, Color color = Color::White, @@ -47,11 +47,11 @@ public: m_label(label) { } - + MarkerRepresentation(const MarkerRepresentation& rep); - + MarkerRepresentation& operator=(const MarkerRepresentation& rep); - + Symbol symbol() const { return m_symbol; } Color color() const { return m_color; } void setColor(Color); @@ -59,9 +59,9 @@ public: void setSize(float size); string label() const { return m_label; } void setLabel(const std::string&); - + void render(float size) const; - + private: Symbol m_symbol; float m_size; diff --git a/src/celengine/meshmanager.cpp b/src/celengine/meshmanager.cpp index 475d0f8ab..e60bb6acd 100644 --- a/src/celengine/meshmanager.cpp +++ b/src/celengine/meshmanager.cpp @@ -86,7 +86,7 @@ string GeometryInfo::resolve(const string& baseDir) // This suffix is stripped before the file is actually loaded. char uniquifyingSuffix[128]; sprintf(uniquifyingSuffix, "%c%f,%f,%f,%f,%d", UniqueSuffixChar, center.x(), center.y(), center.z(), scale, (int) isNormalized); - + if (!path.empty()) { string filename = path + "/models/" + source; @@ -107,7 +107,7 @@ Geometry* GeometryInfo::load(const string& resolvedFilename) // Strip off the uniquifying suffix string::size_type uniquifyingSuffixStart = resolvedFilename.rfind(UniqueSuffixChar); string filename(resolvedFilename, 0, uniquifyingSuffixStart); - + clog << _("Loading model: ") << filename << '\n'; Model* model = NULL; ContentType fileType = DetermineFileType(filename); @@ -168,7 +168,7 @@ Geometry* GeometryInfo::load(const string& resolvedFilename) } } #endif - + // Condition the model for optimal rendering if (model != NULL) { @@ -468,7 +468,7 @@ ConvertTriangleMesh(M3DTriangleMesh& mesh, Vector2f texCoord = mesh.getTexCoord(triVert[j]); vertexData[dataOffset + 6] = texCoord.x(); vertexData[dataOffset + 7] = texCoord.y(); - } + } } } diff --git a/src/celengine/modelgeometry.cpp b/src/celengine/modelgeometry.cpp index bc33b562c..793a4ba34 100644 --- a/src/celengine/modelgeometry.cpp +++ b/src/celengine/modelgeometry.cpp @@ -123,7 +123,7 @@ ModelGeometry::render(RenderContext& rc, double /* t */) mesh->getVertexCount() * vertexDesc.stride, mesh->getVertexData(), GL_STATIC_DRAW_ARB); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } } diff --git a/src/celengine/nebula.h b/src/celengine/nebula.h index 1fa39d238..8ad63207a 100644 --- a/src/celengine/nebula.h +++ b/src/celengine/nebula.h @@ -40,7 +40,7 @@ class Nebula : public DeepSkyObject void setGeometry(ResourceHandle); ResourceHandle getGeometry() const; - + virtual const char* getObjTypeName() const; public: diff --git a/src/celengine/observer.cpp b/src/celengine/observer.cpp index 3b5af97a4..9e9dd6391 100644 --- a/src/celengine/observer.cpp +++ b/src/celengine/observer.cpp @@ -80,55 +80,55 @@ Observer::Observer() : /*! Copy constructor. */ Observer::Observer(const Observer& o) : - simTime(o.simTime), - position(o.position), - orientation(o.orientation), - velocity(o.velocity), - angularVelocity(o.angularVelocity), - frame(NULL), - realTime(o.realTime), - targetSpeed(o.targetSpeed), - targetVelocity(o.targetVelocity), - beginAccelTime(o.beginAccelTime), - observerMode(o.observerMode), - journey(o.journey), - trackObject(o.trackObject), - trackingOrientation(o.trackingOrientation), - fov(o.fov), - reverseFlag(o.reverseFlag), - locationFilter(o.locationFilter), - displayedSurface(o.displayedSurface) + simTime(o.simTime), + position(o.position), + orientation(o.orientation), + velocity(o.velocity), + angularVelocity(o.angularVelocity), + frame(NULL), + realTime(o.realTime), + targetSpeed(o.targetSpeed), + targetVelocity(o.targetVelocity), + beginAccelTime(o.beginAccelTime), + observerMode(o.observerMode), + journey(o.journey), + trackObject(o.trackObject), + trackingOrientation(o.trackingOrientation), + fov(o.fov), + reverseFlag(o.reverseFlag), + locationFilter(o.locationFilter), + displayedSurface(o.displayedSurface) { - frame = new ObserverFrame(*o.frame); - updateUniversal(); + frame = new ObserverFrame(*o.frame); + updateUniversal(); } Observer& Observer::operator=(const Observer& o) { - simTime = o.simTime; - position = o.position; - orientation = o.orientation; - velocity = o.velocity; - angularVelocity = o.angularVelocity; - frame = NULL; - realTime = o.realTime; - targetSpeed = o.targetSpeed; - targetVelocity = o.targetVelocity; - beginAccelTime = o.beginAccelTime; - observerMode = o.observerMode; - journey = o.journey; - trackObject = o.trackObject; - trackingOrientation = o.trackingOrientation; - fov = o.fov; - reverseFlag = o.reverseFlag; - locationFilter = o.locationFilter; - displayedSurface = o.displayedSurface; + simTime = o.simTime; + position = o.position; + orientation = o.orientation; + velocity = o.velocity; + angularVelocity = o.angularVelocity; + frame = NULL; + realTime = o.realTime; + targetSpeed = o.targetSpeed; + targetVelocity = o.targetVelocity; + beginAccelTime = o.beginAccelTime; + observerMode = o.observerMode; + journey = o.journey; + trackObject = o.trackObject; + trackingOrientation = o.trackingOrientation; + fov = o.fov; + reverseFlag = o.reverseFlag; + locationFilter = o.locationFilter; + displayedSurface = o.displayedSurface; - setFrame(*o.frame); - updateUniversal(); + setFrame(*o.frame); + updateUniversal(); - return *this; + return *this; } @@ -155,7 +155,7 @@ double Observer::getRealTime() const void Observer::setTime(double jd) { simTime = jd; - updateUniversal(); + updateUniversal(); } @@ -260,7 +260,7 @@ void Observer::setAngularVelocity(const Vector3d& v) */ // TODO: This is a generally useful function that should be moved to // the celmath package. -template static Quaternion +template static Quaternion lookAt(Matrix from, Matrix to, Matrix up) { Matrix n = to - from; @@ -277,7 +277,7 @@ lookAt(Matrix from, Matrix to, Matrix up) } #ifdef CELVEC -template static Quat +template static Quat lookAt(Point3 from, Point3 to, Vector3 up) { Vector3 n = to - from; @@ -487,7 +487,7 @@ void Observer::update(double dt, double timeScale) position = p; orientation = q; - + // If the journey's complete, reset to manual control if (t == 1.0f) { @@ -530,7 +530,7 @@ void Observer::update(double dt, double timeScale) orientation.normalize(); #endif } - + updateUniversal(); // Update orientation for tracking--must occur after updateUniversal(), as it @@ -539,7 +539,7 @@ void Observer::update(double dt, double timeScale) { Vector3d up = getOrientation().conjugate() * Vector3d::UnitY(); Vector3d viewDir = trackObject.getPosition(getTime()).offsetFromKm(getPosition()).normalized(); - + setOrientation(lookAt(Vector3d::Zero(), viewDir, up)); } } @@ -627,17 +627,17 @@ void Observer::computeGotoParameters(const Selection& destination, { setFrame(frame->getCoordinateSystem(), destination); } - + UniversalCoord targetPosition = destination.getPosition(getTime()); Vector3d v = targetPosition.offsetFromKm(getPosition()).normalized(); - + jparams.traj = Linear; jparams.duration = gotoTime; jparams.startTime = realTime; - + // Right where we are now . . . jparams.from = getPosition(); - + if (offsetCoordSys == ObserverFrame::ObserverLocal) { jparams.to = targetPosition.offsetKm(orientationUniv.conjugate() * offset); @@ -647,7 +647,7 @@ void Observer::computeGotoParameters(const Selection& destination, ObserverFrame offsetFrame(offsetCoordSys, destination); jparams.to = targetPosition.offsetKm(offsetFrame.getFrame()->getOrientation(getTime()).conjugate() * offset); } - + Vector3d upd = up.cast(); if (upCoordSys == ObserverFrame::ObserverLocal) { @@ -658,25 +658,25 @@ void Observer::computeGotoParameters(const Selection& destination, ObserverFrame upFrame(upCoordSys, destination); upd = upFrame.getFrame()->getOrientation(getTime()).conjugate() * upd; } - + jparams.initialOrientation = getOrientation(); Vector3d focus = targetPosition.offsetFromKm(jparams.to); jparams.finalOrientation = lookAt(Vector3d::Zero(), focus, upd); jparams.startInterpolation = min(startInter, endInter); jparams.endInterpolation = max(startInter, endInter); - + jparams.accelTime = 0.5; double distance = jparams.from.offsetFromKm(jparams.to).norm() / 2.0; pair sol = solve_bisection(TravelExpFunc(distance, jparams.accelTime), 0.0001, 100.0, 1e-10); jparams.expFactor = sol.first; - + // Convert to frame coordinates jparams.from = frame->convertFromUniversal(jparams.from, getTime()); jparams.initialOrientation = frame->convertFromUniversal(jparams.initialOrientation, getTime()); jparams.to = frame->convertFromUniversal(jparams.to, getTime()); - jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); + jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); } @@ -707,7 +707,7 @@ void Observer::computeGotoParametersGC(const Selection& destination, ObserverFrame offsetFrame(offsetCoordSys, destination); Vector3d offsetTransformed = offsetFrame.getFrame()->getOrientation(getTime()).conjugate() * offset; - + jparams.to = targetPosition.offsetKm(offsetTransformed); Vector3d upd = up.cast(); @@ -720,7 +720,7 @@ void Observer::computeGotoParametersGC(const Selection& destination, ObserverFrame upFrame(upCoordSys, destination); upd = upFrame.getFrame()->getOrientation(getTime()).conjugate() * upd; } - + jparams.initialOrientation = getOrientation(); Vector3d focus = targetPosition.offsetFromKm(jparams.to); jparams.finalOrientation = lookAt(Vector3d::Zero(), focus, upd); @@ -738,7 +738,7 @@ void Observer::computeGotoParametersGC(const Selection& destination, jparams.from = frame->convertFromUniversal(jparams.from, getTime()); jparams.initialOrientation = frame->convertFromUniversal(jparams.initialOrientation, getTime()); jparams.to = frame->convertFromUniversal(jparams.to, getTime()); - jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); + jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); } @@ -771,7 +771,7 @@ void Observer::computeCenterParameters(const Selection& destination, jparams.from = frame->convertFromUniversal(jparams.from, getTime()); jparams.initialOrientation = frame->convertFromUniversal(jparams.initialOrientation, getTime()); jparams.to = frame->convertFromUniversal(jparams.to, getTime()); - jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); + jparams.finalOrientation = frame->convertFromUniversal(jparams.finalOrientation, getTime()); } @@ -845,12 +845,12 @@ void Observer::setMode(Observer::ObserverMode mode) void Observer::convertFrameCoordinates(const ObserverFrame* newFrame) { double now = getTime(); - + // Universal coordinates don't change. // Convert frame coordinates to the new frame. position = newFrame->convertFromUniversal(positionUniv, now); orientation = newFrame->convertFromUniversal(orientationUniv, now); - + // Convert goto parameters to the new frame journey.from = ObserverFrame::convert(frame, newFrame, journey.from, now); journey.initialOrientation = ObserverFrame::convert(frame, newFrame, journey.initialOrientation, now); @@ -864,7 +864,7 @@ void Observer::convertFrameCoordinates(const ObserverFrame* newFrame) */ void Observer::setFrame(ObserverFrame::CoordinateSystem cs, const Selection& refObj, const Selection& targetObj) { - ObserverFrame* newFrame = new ObserverFrame(cs, refObj, targetObj); + ObserverFrame* newFrame = new ObserverFrame(cs, refObj, targetObj); if (newFrame != NULL) { convertFrameCoordinates(newFrame); @@ -891,17 +891,17 @@ void Observer::setFrame(const ObserverFrame& f) if (frame != &f) { ObserverFrame* newFrame = new ObserverFrame(f); - + if (newFrame != NULL) { - if (frame != NULL) - { - convertFrameCoordinates(newFrame); - delete frame; - } + if (frame != NULL) + { + convertFrameCoordinates(newFrame); + delete frame; + } frame = newFrame; } - } + } } @@ -1080,7 +1080,7 @@ static double getPreferredDistance(const Selection& selection) // Handle reference points (i.e. invisible objects) specially, since the // actual radius of the point is meaningless. Instead, use the size of // bounding sphere of all child objects. This is useful for system - // barycenters--the normal goto command will place the observer at + // barycenters--the normal goto command will place the observer at // a viewpoint in which the entire system can be seen. if (selection.body()->getClassification() == Body::Invisible) { @@ -1309,10 +1309,10 @@ void Observer::gotoLocation(const UniversalCoord& toPosition, journey.duration = duration; journey.from = position; - journey.initialOrientation = orientation; + journey.initialOrientation = orientation; journey.to = toPosition; journey.finalOrientation = toOrientation; - + journey.startInterpolation = 0.25f; journey.endInterpolation = 0.75f; @@ -1338,7 +1338,7 @@ void Observer::getSelectionLongLat(const Selection& selection, { ObserverFrame frame(ObserverFrame::BodyFixed, selection); Vector3d bfPos = frame.convertFromUniversal(positionUniv, getTime()).offsetFromKm(UniversalCoord::Zero()); - + // Convert from Celestia's coordinate system double x = bfPos.x(); double y = -bfPos.z(); @@ -1355,7 +1355,7 @@ void Observer::gotoSurface(const Selection& sel, double duration) { Vector3d v = getPosition().offsetFromKm(sel.getPosition(getTime())); v.normalize(); - + Vector3d viewDir = orientationUniv.conjugate() * -Vector3d::UnitZ(); Vector3d up = orientationUniv.conjugate() * Vector3d::UnitY(); Quaterniond q = orientationUniv; @@ -1363,16 +1363,16 @@ void Observer::gotoSurface(const Selection& sel, double duration) { q = lookAt(Vector3d::Zero(), up, v); } - + ObserverFrame frame(ObserverFrame::BodyFixed, sel); UniversalCoord bfPos = frame.convertFromUniversal(positionUniv, getTime()); q = frame.convertFromUniversal(q, getTime()); - + double height = 1.0001 * sel.radius(); Vector3d dir = bfPos.offsetFromKm(UniversalCoord::Zero()).normalized() * height; UniversalCoord nearSurfacePoint = UniversalCoord::Zero().offsetKm(dir); - - gotoLocation(nearSurfacePoint, q, duration); + + gotoLocation(nearSurfacePoint, q, duration); }; @@ -1412,7 +1412,7 @@ void Observer::geosynchronousFollow(const Selection& selection) void Observer::phaseLock(const Selection& selection) { Selection refObject = frame->getRefObject(); - + if (selection != refObject) { if (refObject.body() != NULL || refObject.star() != NULL) @@ -1427,7 +1427,7 @@ void Observer::phaseLock(const Selection& selection) if (selection.body() != NULL) { setFrame(ObserverFrame::PhaseLock, selection, Selection(selection.body()->getSystem()->getStar())); - } + } } } @@ -1525,12 +1525,12 @@ ObserverFrame& ObserverFrame::operator=(const ObserverFrame& f) { coordSys = f.coordSys; targetObject = f.targetObject; - + // In case frames are the same, make sure we addref before releasing f.frame->addRef(); frame->release(); frame = f.frame; - + return *this; } @@ -1570,7 +1570,7 @@ ObserverFrame::getFrame() const } -UniversalCoord +UniversalCoord ObserverFrame::convertFromUniversal(const UniversalCoord& uc, double tjd) const { return frame->convertFromUniversal(uc, tjd); @@ -1584,7 +1584,7 @@ ObserverFrame::convertToUniversal(const UniversalCoord& uc, double tjd) const } -Quaterniond +Quaterniond ObserverFrame::convertFromUniversal(const Quaterniond& q, double tjd) const { return frame->convertFromUniversal(q, tjd); @@ -1634,30 +1634,30 @@ ObserverFrame::createFrame(CoordinateSystem _coordSys, { case Universal: return new J2000EclipticFrame(Selection()); - + case Ecliptical: return new J2000EclipticFrame(_refObject); - + case Equatorial: return new BodyMeanEquatorFrame(_refObject, _refObject); - + case BodyFixed: return new BodyFixedFrame(_refObject, _refObject); - + case PhaseLock: { return new TwoVectorFrame(_refObject, FrameVector::createRelativePositionVector(_refObject, _targetObject), 1, FrameVector::createRelativeVelocityVector(_refObject, _targetObject), 2); } - + case Chase: { return new TwoVectorFrame(_refObject, FrameVector::createRelativeVelocityVector(_refObject, _refObject.parent()), 1, FrameVector::createRelativePositionVector(_refObject, _refObject.parent()), 2); } - + case PhaseLock_Old: { FrameVector rotAxis(FrameVector::createConstantVector(Vector3d::UnitY(), @@ -1666,12 +1666,12 @@ ObserverFrame::createFrame(CoordinateSystem _coordSys, FrameVector::createRelativePositionVector(_refObject, _targetObject), 3, rotAxis, 2); } - + case Chase_Old: { FrameVector rotAxis(FrameVector::createConstantVector(Vector3d::UnitY(), new BodyMeanEquatorFrame(_refObject, _refObject))); - + return new TwoVectorFrame(_refObject, FrameVector::createRelativeVelocityVector(_refObject.parent(), _refObject), 3, rotAxis, 2); @@ -1681,7 +1681,7 @@ ObserverFrame::createFrame(CoordinateSystem _coordSys, // TODO: This is only used for computing up vectors for orientation; it does // define a proper frame for the observer position orientation. return new J2000EclipticFrame(Selection()); - + default: return new J2000EclipticFrame(_refObject); } diff --git a/src/celengine/observer.h b/src/celengine/observer.h index 8d149614f..a14f438ee 100644 --- a/src/celengine/observer.h +++ b/src/celengine/observer.h @@ -34,44 +34,44 @@ public: BodyFixed = 3, PhaseLock = 5, Chase = 6, - + // Previous versions of PhaseLock and Chase used the // spin axis of the reference object as a secondary // vector for the coordinate system. PhaseLock_Old = 100, Chase_Old = 101, - + // ObserverLocal is not a real frame; it's an optional // way to specify view vectors. Eventually, there will // be some other way to accomplish this and ObserverLocal // will go away. ObserverLocal = 200, - + Unknown = 1000, }; - + ObserverFrame(); ObserverFrame(CoordinateSystem cs, const Selection& _refObject, const Selection& _targetObj = Selection()); ObserverFrame(const ObserverFrame&); ObserverFrame(const ReferenceFrame& f); - + ~ObserverFrame(); - + ObserverFrame& operator=(const ObserverFrame& f); - + CoordinateSystem getCoordinateSystem() const; Selection getRefObject() const; Selection getTargetObject() const; - + const ReferenceFrame* getFrame() const; - + UniversalCoord convertFromUniversal(const UniversalCoord& uc, double tjd) const; UniversalCoord convertToUniversal(const UniversalCoord& uc, double tjd) const; Eigen::Quaterniond convertFromUniversal(const Eigen::Quaterniond& q, double tjd) const; Eigen::Quaterniond convertToUniversal(const Eigen::Quaterniond& q, double tjd) const; - + static UniversalCoord convert(const ObserverFrame* fromFrame, const ObserverFrame* toFrame, const UniversalCoord& uc, @@ -80,12 +80,12 @@ public: const ObserverFrame* toFrame, const Eigen::Quaterniond& q, double t); - + private: ReferenceFrame* createFrame(CoordinateSystem _coordSys, const Selection& _refObject, const Selection& _targetObject); - + private: CoordinateSystem coordSys; const ReferenceFrame* frame; @@ -107,24 +107,24 @@ public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW Observer(); - Observer(const Observer& o); + Observer(const Observer& o); + + Observer& operator=(const Observer& o); - Observer& operator=(const Observer& o); - UniversalCoord getPosition() const; void setPosition(const UniversalCoord&); - void setPosition(const Eigen::Vector3d&); - + void setPosition(const Eigen::Vector3d&); + Eigen::Quaterniond getOrientation() const; Eigen::Quaternionf getOrientationf() const; void setOrientation(const Eigen::Quaternionf&); void setOrientation(const Eigen::Quaterniond&); - + Eigen::Vector3d getVelocity() const; void setVelocity(const Eigen::Vector3d&); Eigen::Vector3d getAngularVelocity() const; void setAngularVelocity(const Eigen::Vector3d&); - + float getFOV() const; void setFOV(float); @@ -144,7 +144,7 @@ public: const std::string& getDisplayedSurface() const; void setDisplayedSurface(const std::string&); - + uint32 getLocationFilter() const; void setLocationFilter(uint32); @@ -214,7 +214,7 @@ public: Free = 0, Travelling = 1, }; - + ObserverMode getMode() const; void setMode(ObserverMode); @@ -222,7 +222,7 @@ public: { Linear = 0, GreatCircle = 1, - CircularOrbit = 2, + CircularOrbit = 2, }; struct JourneyParams @@ -241,7 +241,7 @@ public: Eigen::Quaterniond rotation1; // rotation on the CircularOrbit around centerObject Selection centerObject; - + TrajectoryType traj; }; @@ -277,7 +277,7 @@ public: void updateUniversal(); void convertFrameCoordinates(const ObserverFrame* newFrame); - + private: double simTime; @@ -286,14 +286,14 @@ public: Eigen::Quaterniond orientation; Eigen::Vector3d velocity; Eigen::Vector3d angularVelocity; - + // Position and orientation in universal coordinates, derived from the // equivalent quantities in the observer reference frame. UniversalCoord positionUniv; Eigen::Quaterniond orientationUniv; - + ObserverFrame* frame; - + double realTime; double targetSpeed; @@ -302,7 +302,7 @@ public: double beginAccelTime; ObserverMode observerMode; - JourneyParams journey; + JourneyParams journey; Selection trackObject; Eigen::Quaterniond trackingOrientation; // orientation prior to selecting tracking diff --git a/src/celengine/opencluster.h b/src/celengine/opencluster.h index 0171ac60d..0bd57e8bf 100644 --- a/src/celengine/opencluster.h +++ b/src/celengine/opencluster.h @@ -37,7 +37,7 @@ class OpenCluster : public DeepSkyObject virtual unsigned int getRenderMask() const; virtual unsigned int getLabelMask() const; - + virtual const char* getObjTypeName() const; public: diff --git a/src/celengine/overlay.cpp b/src/celengine/overlay.cpp index 1470ca0e7..8b6fddd92 100644 --- a/src/celengine/overlay.cpp +++ b/src/celengine/overlay.cpp @@ -92,7 +92,7 @@ void Overlay::endText() if (textBlock > 0) { textBlock--; - xoffset = 0.0f; + xoffset = 0.0f; glPopMatrix(); } } @@ -184,7 +184,7 @@ void Overlay::oprintf(const char* format, ...) char buf[1024]; vsprintf(buf, format, args); print(buf); - + va_end(args); } diff --git a/src/celengine/parseobject.cpp b/src/celengine/parseobject.cpp index 77362e85a..f6ebee759 100644 --- a/src/celengine/parseobject.cpp +++ b/src/celengine/parseobject.cpp @@ -33,11 +33,11 @@ using namespace std; /** * Returns the default units scale for orbits. - * + * * If the usePlanetUnits flag is set, this returns a distance scale of AU and a * time scale of years. Otherwise the distace scale is kilometers and the time * scale is days. - * + * * @param[in] usePlanetUnits Controls whether to return planet units or satellite units. * @param[out] distanceScale The default distance scale in kilometers. * @param[out] timeScale The default time scale in days. @@ -60,10 +60,10 @@ GetDefaultUnits(bool usePlanetUnits, double& distanceScale, double& timeScale) /** * Returns the default distance scale for orbits. - * + * * If the usePlanetUnits flag is set, this returns AU, otherwise it returns * kilometers. - * + * * @param[in] usePlanetUnits Controls whether to return planet units or satellite units. * @param[out] distanceScale The default distance scale in kilometers. */ @@ -98,7 +98,7 @@ ParseDate(Hash* hash, const string& name, double& jd) /*! * Create a new Keplerian orbit from an ssc property table: - * + * * \code EllipticalOrbit * { * # One of the following is required to specify orbit size: @@ -107,7 +107,7 @@ ParseDate(Hash* hash, const string& name, double& jd) * * # Required * Period - * + * * Eccentricity (default: 0.0) * Inclination (default: 0.0) * AscendingNode (default: 0.0) @@ -128,7 +128,7 @@ ParseDate(Hash* hash, const string& name, double& jd) * SemiMajorAxis or PericenterDistance is in AU * Otherwise: * Period is in Julian days - * SemiMajorAxis or PericenterDistance is in kilometers. + * SemiMajorAxis or PericenterDistance is in kilometers. */ static EllipticalOrbit* CreateEllipticalOrbit(Hash* orbitData, @@ -136,7 +136,7 @@ CreateEllipticalOrbit(Hash* orbitData, { // default units for planets are AU and years, otherwise km and days - + double distanceScale; double timeScale; GetDefaultUnits(usePlanetUnits, distanceScale, timeScale); @@ -153,23 +153,23 @@ CreateEllipticalOrbit(Hash* orbitData, return NULL; } } - + double period = 0.0; if (!orbitData->getTime("Period", period, 1.0, timeScale)) { clog << "Period missing! Skipping planet . . .\n"; return NULL; } - + double eccentricity = 0.0; orbitData->getNumber("Eccentricity", eccentricity); double inclination = 0.0; orbitData->getAngle("Inclination", inclination); - + double ascendingNode = 0.0; orbitData->getAngle("AscendingNode", ascendingNode); - + double argOfPericenter = 0.0; if (!orbitData->getAngle("ArgOfPericenter", argOfPericenter)) { @@ -266,13 +266,13 @@ CreateSampledTrajectory(Hash* trajData, const string& path) /** Create a new FixedPosition trajectory. - * + * * A FixedPosition is a property list with one of the following 3-vector properties: - * + * * - \c Rectangular * - \c Planetographic * - \c Planetocentric - * + * * Planetographic and planetocentric coordinates are given in the order longitude, * latitude, altitude. Units of altitude are kilometers. Planetographic and * and planetocentric coordinates are only practical when the coordinate system @@ -283,10 +283,10 @@ CreateFixedPosition(Hash* trajData, const Selection& centralObject, bool usePlan { double distanceScale; GetDefaultUnits(usePlanetUnits, distanceScale); - + Vector3d position = Vector3d::Zero(); - Vector3d v = Vector3d::Zero(); + Vector3d v = Vector3d::Zero(); if (trajData->getLengthVector("Rectangular", v, 1.0, distanceScale)) { // Convert to Celestia's coordinate system @@ -330,41 +330,41 @@ CreateFixedPosition(Hash* trajData, const Selection& centralObject, bool usePlan */ static bool ParseStringList(Hash* table, - const string& propertyName, - list& stringList) + const string& propertyName, + list& stringList) { - Value* v = table->getValue(propertyName); - if (v == NULL) - return NULL; + Value* v = table->getValue(propertyName); + if (v == NULL) + return NULL; - // Check for a single string first. - if (v->getType() == Value::StringType) - { - stringList.push_back(v->getString()); - return true; - } - else if (v->getType() == Value::ArrayType) - { - ValueArray* array = v->getArray(); - ValueArray::const_iterator iter; + // Check for a single string first. + if (v->getType() == Value::StringType) + { + stringList.push_back(v->getString()); + return true; + } + else if (v->getType() == Value::ArrayType) + { + ValueArray* array = v->getArray(); + ValueArray::const_iterator iter; - // Verify that all array entries are strings - for (iter = array->begin(); iter != array->end(); iter++) - { - if ((*iter)->getType() != Value::StringType) - return false; - } + // Verify that all array entries are strings + for (iter = array->begin(); iter != array->end(); iter++) + { + if ((*iter)->getType() != Value::StringType) + return false; + } - // Add strings to stringList - for (iter = array->begin(); iter != array->end(); iter++) - stringList.push_back((*iter)->getString()); + // Add strings to stringList + for (iter = array->begin(); iter != array->end(); iter++) + stringList.push_back((*iter)->getString()); - return true; - } - else - { - return false; - } + return true; + } + else + { + return false; + } } @@ -384,7 +384,7 @@ ParseStringList(Hash* table, * Ending # optional * } \endcode * - * The Kernel property specifies one or more SPK files that must be loaded. Any + * The Kernel property specifies one or more SPK files that must be loaded. Any * already loaded kernels will also be used if they contain trajectories for * the target or origin. * Target and origin are strings that give NAIF IDs for the target and origin @@ -406,22 +406,22 @@ CreateSpiceOrbit(Hash* orbitData, { string targetBodyName; string originName; - list kernelList; + list kernelList; double distanceScale; double timeScale; - + GetDefaultUnits(usePlanetUnits, distanceScale, timeScale); - - if (orbitData->getValue("Kernel") != NULL) - { - // Kernel list is optional; a SPICE orbit may rely on kernels already loaded into - // the kernel pool. - if (!ParseStringList(orbitData, "Kernel", kernelList)) - { - clog << "Kernel list for SPICE orbit is neither a string nor array of strings\n"; - return NULL; - } - } + + if (orbitData->getValue("Kernel") != NULL) + { + // Kernel list is optional; a SPICE orbit may rely on kernels already loaded into + // the kernel pool. + if (!ParseStringList(orbitData, "Kernel", kernelList)) + { + clog << "Kernel list for SPICE orbit is neither a string nor array of strings\n"; + return NULL; + } + } if (!orbitData->getString("Target", targetBodyName)) { @@ -449,55 +449,55 @@ CreateSpiceOrbit(Hash* orbitData, double period = 0.0; orbitData->getTime("Period", period, 1.0, timeScale); - // Either a complete time interval must be specified with Beginning/Ending, or - // else neither field can be present. - Value* beginningDate = orbitData->getValue("Beginning"); - Value* endingDate = orbitData->getValue("Ending"); - if (beginningDate != NULL && endingDate == NULL) - { - clog << "Beginning specified for SPICE orbit, but ending is missing.\n"; - return NULL; - } + // Either a complete time interval must be specified with Beginning/Ending, or + // else neither field can be present. + Value* beginningDate = orbitData->getValue("Beginning"); + Value* endingDate = orbitData->getValue("Ending"); + if (beginningDate != NULL && endingDate == NULL) + { + clog << "Beginning specified for SPICE orbit, but ending is missing.\n"; + return NULL; + } - if (endingDate != NULL && beginningDate == NULL) - { - clog << "Ending specified for SPICE orbit, but beginning is missing.\n"; - return NULL; - } + if (endingDate != NULL && beginningDate == NULL) + { + clog << "Ending specified for SPICE orbit, but beginning is missing.\n"; + return NULL; + } - SpiceOrbit* orbit = NULL; - if (beginningDate != NULL && endingDate != NULL) - { - double beginningTDBJD = 0.0; - if (!ParseDate(orbitData, "Beginning", beginningTDBJD)) - { - clog << "Invalid beginning date specified for SPICE orbit.\n"; - return NULL; - } + SpiceOrbit* orbit = NULL; + if (beginningDate != NULL && endingDate != NULL) + { + double beginningTDBJD = 0.0; + if (!ParseDate(orbitData, "Beginning", beginningTDBJD)) + { + clog << "Invalid beginning date specified for SPICE orbit.\n"; + return NULL; + } - double endingTDBJD = 0.0; - if (!ParseDate(orbitData, "Ending", endingTDBJD)) - { - clog << "Invalid ending date specified for SPICE orbit.\n"; - return NULL; - } - - orbit = new SpiceOrbit(targetBodyName, - originName, - period, - boundingRadius, - beginningTDBJD, - endingTDBJD); - } - else - { - // No time interval given; we'll use whatever coverage window is given - // in the SPICE kernel. - orbit = new SpiceOrbit(targetBodyName, - originName, - period, - boundingRadius); - } + double endingTDBJD = 0.0; + if (!ParseDate(orbitData, "Ending", endingTDBJD)) + { + clog << "Invalid ending date specified for SPICE orbit.\n"; + return NULL; + } + + orbit = new SpiceOrbit(targetBodyName, + originName, + period, + boundingRadius, + beginningTDBJD, + endingTDBJD); + } + else + { + // No time interval given; we'll use whatever coverage window is given + // in the SPICE kernel. + orbit = new SpiceOrbit(targetBodyName, + originName, + period, + boundingRadius); + } if (!orbit->init(path, &kernelList)) { @@ -524,7 +524,7 @@ CreateSpiceOrbit(Hash* orbitData, * } \endcode * * The Kernel property specifies one or more SPICE kernel files that must be - * loaded in order for the frame to be defined over the required range. Any + * loaded in order for the frame to be defined over the required range. Any * already loaded kernels will be used if they contain information relevant * for defining the frame. * Frame and base name are strings that give SPICE names for the frames. The @@ -545,18 +545,18 @@ CreateSpiceRotation(Hash* rotationData, { string frameName; string baseFrameName = "eclipj2000"; - list kernelList; + list kernelList; - if (rotationData->getValue("Kernel") != NULL) - { - // Kernel list is optional; a SPICE rotation may rely on kernels already loaded into - // the kernel pool. - if (!ParseStringList(rotationData, "Kernel", kernelList)) - { - clog << "Kernel list for SPICE rotation is neither a string nor array of strings\n"; - return NULL; - } - } + if (rotationData->getValue("Kernel") != NULL) + { + // Kernel list is optional; a SPICE rotation may rely on kernels already loaded into + // the kernel pool. + if (!ParseStringList(rotationData, "Kernel", kernelList)) + { + clog << "Kernel list for SPICE rotation is neither a string nor array of strings\n"; + return NULL; + } + } if (!rotationData->getString("Frame", frameName)) { @@ -572,52 +572,52 @@ CreateSpiceRotation(Hash* rotationData, double period = 0.0; rotationData->getTime("Period", period, 1.0, 1.0 / HOURS_PER_DAY); - // Either a complete time interval must be specified with Beginning/Ending, or - // else neither field can be present. - Value* beginningDate = rotationData->getValue("Beginning"); - Value* endingDate = rotationData->getValue("Ending"); - if (beginningDate != NULL && endingDate == NULL) - { - clog << "Beginning specified for SPICE rotation, but ending is missing.\n"; - return NULL; - } + // Either a complete time interval must be specified with Beginning/Ending, or + // else neither field can be present. + Value* beginningDate = rotationData->getValue("Beginning"); + Value* endingDate = rotationData->getValue("Ending"); + if (beginningDate != NULL && endingDate == NULL) + { + clog << "Beginning specified for SPICE rotation, but ending is missing.\n"; + return NULL; + } - if (endingDate != NULL && beginningDate == NULL) - { - clog << "Ending specified for SPICE rotation, but beginning is missing.\n"; - return NULL; - } + if (endingDate != NULL && beginningDate == NULL) + { + clog << "Ending specified for SPICE rotation, but beginning is missing.\n"; + return NULL; + } - SpiceRotation* rotation = NULL; - if (beginningDate != NULL && endingDate != NULL) - { - double beginningTDBJD = 0.0; - if (!ParseDate(rotationData, "Beginning", beginningTDBJD)) - { - clog << "Invalid beginning date specified for SPICE rotation.\n"; - return NULL; - } + SpiceRotation* rotation = NULL; + if (beginningDate != NULL && endingDate != NULL) + { + double beginningTDBJD = 0.0; + if (!ParseDate(rotationData, "Beginning", beginningTDBJD)) + { + clog << "Invalid beginning date specified for SPICE rotation.\n"; + return NULL; + } - double endingTDBJD = 0.0; - if (!ParseDate(rotationData, "Ending", endingTDBJD)) - { - clog << "Invalid ending date specified for SPICE rotation.\n"; - return NULL; - } - - rotation = new SpiceRotation(frameName, - baseFrameName, - period, - beginningTDBJD, - endingTDBJD); - } - else - { - // No time interval given; rotation is valid at any time. - rotation = new SpiceRotation(frameName, + double endingTDBJD = 0.0; + if (!ParseDate(rotationData, "Ending", endingTDBJD)) + { + clog << "Invalid ending date specified for SPICE rotation.\n"; + return NULL; + } + + rotation = new SpiceRotation(frameName, + baseFrameName, + period, + beginningTDBJD, + endingTDBJD); + } + else + { + // No time interval given; rotation is valid at any time. + rotation = new SpiceRotation(frameName, baseFrameName, period); - } + } if (!rotation->init(path, &kernelList)) { @@ -807,7 +807,7 @@ CreateOrbit(const Selection& centralObject, fixedPosition = Vector3d(fixedPosition.x(), fixedPosition.z(), -fixedPosition.y()); - + return new FixedOrbit(fixedPosition); } else if (fixedPositionValue->getType() == Value::HashType) @@ -942,19 +942,19 @@ CreateFixedAttitudeRotationModel(Hash* rotationData) { heading = degToRad(heading); } - + double tilt = 0.0; if (rotationData->getAngle("Tilt", tilt)) { tilt = degToRad(tilt); } - + double roll = 0.0; if (rotationData->getAngle("Roll", roll)) { roll = degToRad(roll); } - + Quaterniond q = YRotation(-PI - heading) * XRotation(-tilt) * ZRotation(-roll); @@ -1189,7 +1189,7 @@ CreateRotationModel(Hash* planetData, return CreateFixedRotationModel(fixedRotationValue->getHash()); } } - + Value* fixedAttitudeValue = planetData->getValue("FixedAttitude"); if (fixedAttitudeValue != NULL) { @@ -1673,7 +1673,7 @@ CreateJ2000EclipticFrame(const Universe& universe, const Selection& defaultCenter) { Selection center = getFrameCenter(universe, frameData, defaultCenter); - + if (center.empty()) return NULL; else @@ -1687,7 +1687,7 @@ CreateJ2000EquatorFrame(const Universe& universe, const Selection& defaultCenter) { Selection center = getFrameCenter(universe, frameData, defaultCenter); - + if (center.empty()) return NULL; else @@ -1707,8 +1707,8 @@ CreateTopocentricFrame(const Selection& center, BodyMeanEquatorFrame* eqFrame = new BodyMeanEquatorFrame(target, target); FrameVector north = FrameVector::createConstantVector(Vector3d::UnitY(), eqFrame); FrameVector up = FrameVector::createRelativePositionVector(observer, target); - - return new TwoVectorFrame(center, up, -2, north, -3); + + return new TwoVectorFrame(center, up, -2, north, -3); } @@ -1722,15 +1722,15 @@ CreateTopocentricFrame(const Selection& center, * \code TwoVector * { * Center
- * Primary + * Primary * { * Axis "z" * RelativePosition { Target Observer } * } - * Secondary + * Secondary * { * Axis "x" - * ConstantVector + * ConstantVector * { * Vector [ 0 0 1] * Frame { BodyFixed { Center } } @@ -1777,7 +1777,7 @@ CreateTopocentricFrame(const Universe& universe, observer = center; target = center.parent(); - } + } else { // When no center is provided, use the default observer as the center. This diff --git a/src/celengine/parser.cpp b/src/celengine/parser.cpp index 790a92bde..5506b201f 100644 --- a/src/celengine/parser.cpp +++ b/src/celengine/parser.cpp @@ -131,7 +131,7 @@ ValueArray* Parser::readArray() return NULL; } - ValueArray* array = new ValueArray(); + ValueArray* array = new ValueArray(); Value* v = readValue(); while (v != NULL) @@ -139,7 +139,7 @@ ValueArray* Parser::readArray() array->insert(array->end(), v); v = readValue(); } - + tok = tokenizer->nextToken(); if (tok != Tokenizer::TokenEndArray) { @@ -173,7 +173,7 @@ Hash* Parser::readHash() return NULL; } string name = tokenizer->getNameValue(); - + #ifndef USE_POSTFIX_UNITS readUnits(name, hash); #endif @@ -186,7 +186,7 @@ Hash* Parser::readHash() } hash->addValue(name, *value); - + #ifdef USE_POSTFIX_UNITS readUnits(name, hash); #endif @@ -221,10 +221,10 @@ bool Parser::readUnits(const string& propertyName, Hash* hash) tokenizer->pushBack(); return false; } - + string unit = tokenizer->getNameValue(); Value* value = new Value(unit); - + if (astro::isLengthUnit(unit)) { string keyName(propertyName + "%Length"); @@ -245,10 +245,10 @@ bool Parser::readUnits(const string& propertyName, Hash* hash) delete value; return false; } - + tok = tokenizer->nextToken(); } - + return true; } @@ -278,7 +278,7 @@ Value* Parser::readValue() case Tokenizer::TokenBeginArray: tokenizer->pushBack(); { - ValueArray* array = readArray(); + ValueArray* array = readArray(); if (array == NULL) return NULL; else @@ -418,7 +418,7 @@ bool AssociativeArray::getVector(const string& key, Vec3d& val) const if (v == NULL || v->getType() != Value::ArrayType) return false; - ValueArray* arr = v->getArray(); + ValueArray* arr = v->getArray(); if (arr->size() != 3) return false; @@ -442,7 +442,7 @@ bool AssociativeArray::getVector(const string& key, Vector3d& val) const if (v == NULL || v->getType() != Value::ArrayType) return false; - ValueArray* arr = v->getArray(); + ValueArray* arr = v->getArray(); if (arr->size() != 3) return false; @@ -493,7 +493,7 @@ bool AssociativeArray::getRotation(const string& key, Quatf& val) const if (v == NULL || v->getType() != Value::ArrayType) return false; - ValueArray* arr = v->getArray(); + ValueArray* arr = v->getArray(); if (arr->size() != 4) return false; @@ -512,7 +512,7 @@ bool AssociativeArray::getRotation(const string& key, Quatf& val) const (float) y->getNumber(), (float) z->getNumber()); axis.normalize(); - + double ang = w->getNumber(); double angScale = 1.0; getAngleScale(key, angScale); @@ -526,10 +526,10 @@ bool AssociativeArray::getRotation(const string& key, Quatf& val) const /** * Retrieves a quaternion, scaled to an associated angle unit. - * + * * The quaternion is specified in the catalog file in axis-angle format as follows: * \verbatim {PropertyName} [ angle axisX axisY axisZ ] \endverbatim - * + * * @param[in] key Hash key for the rotation. * @param[out] val A quaternion representing the value if present, unaffected if not. * @return True if the key exists in the hash, false otherwise. @@ -540,7 +540,7 @@ bool AssociativeArray::getRotation(const string& key, Eigen::Quaternionf& val) c if (v == NULL || v->getType() != Value::ArrayType) return false; - ValueArray* arr = v->getArray(); + ValueArray* arr = v->getArray(); if (arr->size() != 4) return false; @@ -596,7 +596,7 @@ AssociativeArray::getAngle(const string& key, double& val, double outputScale, d { if (!getNumber(key, val)) return false; - + double angleScale; if(getAngleScale(key, angleScale)) { @@ -606,24 +606,24 @@ AssociativeArray::getAngle(const string& key, double& val, double outputScale, d { angleScale = (defaultScale == 0.0) ? 1.0 : defaultScale / outputScale; } - + val *= angleScale; - + return true; } -/** @copydoc AssociativeArray::getAngle() */ +/** @copydoc AssociativeArray::getAngle() */ bool AssociativeArray::getAngle(const string& key, float& val, double outputScale, double defaultScale) const { double dval; - + if (!getAngle(key, dval, outputScale, defaultScale)) return false; - + val = ((float) dval); - + return true; } @@ -641,7 +641,7 @@ AssociativeArray::getLength(const string& key, double& val, double outputScale, { if(!getNumber(key, val)) return false; - + double lengthScale; if(getLengthScale(key, lengthScale)) { @@ -651,9 +651,9 @@ AssociativeArray::getLength(const string& key, double& val, double outputScale, { lengthScale = (defaultScale == 0.0) ? 1.0 : defaultScale / outputScale; } - + val *= lengthScale; - + return true; } @@ -662,12 +662,12 @@ AssociativeArray::getLength(const string& key, double& val, double outputScale, bool AssociativeArray::getLength(const string& key, float& val, double outputScale, double defaultScale) const { double dval; - + if (!getLength(key, dval, outputScale, defaultScale)) return false; - + val = ((float) dval); - + return true; } @@ -684,7 +684,7 @@ bool AssociativeArray::getTime(const string& key, double& val, double outputScal { if(!getNumber(key, val)) return false; - + double timeScale; if(getTimeScale(key, timeScale)) { @@ -694,9 +694,9 @@ bool AssociativeArray::getTime(const string& key, double& val, double outputScal { timeScale = (defaultScale == 0.0) ? 1.0 : defaultScale / outputScale; } - + val *= timeScale; - + return true; } @@ -705,12 +705,12 @@ bool AssociativeArray::getTime(const string& key, double& val, double outputScal bool AssociativeArray::getTime(const string& key, float& val, double outputScale, double defaultScale) const { double dval; - + if(!getLength(key, dval, outputScale, defaultScale)) return false; - + val = ((float) dval); - + return true; } @@ -727,7 +727,7 @@ bool AssociativeArray::getLengthVector(const string& key, Eigen::Vector3d& val, { if(!getVector(key, val)) return false; - + double lengthScale; if(getLengthScale(key, lengthScale)) { @@ -737,9 +737,9 @@ bool AssociativeArray::getLengthVector(const string& key, Eigen::Vector3d& val, { lengthScale = (defaultScale == 0.0) ? 1.0 : defaultScale / outputScale; } - + val *= lengthScale; - + return true; } @@ -748,12 +748,12 @@ bool AssociativeArray::getLengthVector(const string& key, Eigen::Vector3d& val, bool AssociativeArray::getLengthVector(const string& key, Eigen::Vector3f& val, double outputScale, double defaultScale) const { Vector3d vecVal; - + if(!getLengthVector(key, vecVal, outputScale, defaultScale)) return false; - + val = vecVal.cast(); - + return true; } @@ -768,18 +768,18 @@ bool AssociativeArray::getSphericalTuple(const string& key, Vector3d& val) const { if(!getVector(key, val)) return false; - + double angleScale; if(getAngleScale(key, angleScale)) { val[0] *= angleScale; val[1] *= angleScale; } - + double lengthScale = 1.0; getLengthScale(key, lengthScale); val[2] *= lengthScale; - + return true; } @@ -788,12 +788,12 @@ bool AssociativeArray::getSphericalTuple(const string& key, Vector3d& val) const bool AssociativeArray::getSphericalTuple(const string& key, Vector3f& val) const { Vector3d vecVal; - + if(!getSphericalTuple(key, vecVal)) return false; - + val = vecVal.cast(); - + return true; } @@ -808,10 +808,10 @@ bool AssociativeArray::getAngleScale(const string& key, double& scale) const { string unitKey(key + "%Angle"); string unit; - + if (!getString(unitKey, unit)) return false; - + return astro::getAngleScale(unit, scale); } @@ -822,7 +822,7 @@ bool AssociativeArray::getAngleScale(const string& key, float& scale) const double dscale; if (!getAngleScale(key, dscale)) return false; - + scale = ((float) dscale); return true; } @@ -838,10 +838,10 @@ bool AssociativeArray::getLengthScale(const string& key, double& scale) const { string unitKey(key + "%Length"); string unit; - + if (!getString(unitKey, unit)) return false; - + return astro::getLengthScale(unit, scale); } @@ -852,7 +852,7 @@ bool AssociativeArray::getLengthScale(const string& key, float& scale) const double dscale; if (!getLengthScale(key, dscale)) return false; - + scale = ((float) dscale); return true; } @@ -868,10 +868,10 @@ bool AssociativeArray::getTimeScale(const string& key, double& scale) const { string unitKey(key + "%Time"); string unit; - + if (!getString(unitKey, unit)) return false; - + return astro::getTimeScale(unit, scale); } @@ -882,7 +882,7 @@ bool AssociativeArray::getTimeScale(const string& key, float& scale) const double dscale; if (!getTimeScale(key, dscale)) return false; - + scale = ((float) dscale); return true; } diff --git a/src/celengine/parser.h b/src/celengine/parser.h index 72cbc00d7..6a6bf63b3 100644 --- a/src/celengine/parser.h +++ b/src/celengine/parser.h @@ -66,7 +66,7 @@ class AssociativeArray HashIterator begin(); HashIterator end(); - + private: map assoc; }; @@ -97,7 +97,7 @@ public: double getNumber() const; string getString() const; - ValueArray* getArray() const; + ValueArray* getArray() const; Hash* getHash() const; bool getBoolean() const; @@ -107,7 +107,7 @@ private: union { string* s; double d; - ValueArray* a; + ValueArray* a; Hash* h; } data; }; @@ -122,9 +122,9 @@ public: private: Tokenizer* tokenizer; - + bool readUnits(const std::string&, Hash*); - ValueArray* readArray(); + ValueArray* readArray(); Hash* readHash(); }; diff --git a/src/celengine/particlesystem.cpp b/src/celengine/particlesystem.cpp index f0bc380c8..29b99e0ad 100644 --- a/src/celengine/particlesystem.cpp +++ b/src/celengine/particlesystem.cpp @@ -50,7 +50,7 @@ using namespace std; * This process is well-suited to a simulation where the time steps are * relatively uniform. But, we cannot rely on a uniform time step in Celestia. * The user may skip ahead instantly to times in the distance past or future, - * change the time rate to over a billion times normal, or reverse time. + * change the time rate to over a billion times normal, or reverse time. * Numerical integration of particle positions is completely impractical. * * Instead, Celestia uses 'stateless' particle systems. From the particle @@ -94,26 +94,26 @@ public: previous(0) { } - + LCGRandomGenerator(uint64 seed) : previous(seed) { } - + uint64 randUint64() { previous = (A * previous + C) & M; return previous; } - + /*! Return a random integer between -2^31 and 2^31 - 1 */ int32 randInt32() { return (int32) (randUint64() >> 16); } - - /*! Return a random integer between 0 and 2^32 - 1 + + /*! Return a random integer between 0 and 2^32 - 1 */ uint32 randUint32() { @@ -131,7 +131,7 @@ public: randBits = (randBits & 0x007fffff) | 0x3f800000; return *reinterpret_cast(&randBits) - 1.0f; } - + /*! Generate a random floating point value in [ -1, 1 ) * This function directly manipulates the bits of a floating * point number, and will not work properly on a system that @@ -143,7 +143,7 @@ public: randBits = (randBits & 0x007fffff) | 0x40000000; return *reinterpret_cast(&randBits) - 3.0f; } - + private: uint64 previous; }; @@ -182,7 +182,7 @@ EllipsoidSurfaceGenerator::generate(LCGRandomGenerator& gen) const float sinPhi = std::sqrt(1.0f - cosPhi * cosPhi); if (cosPhi < 0.0f) sinPhi = -sinPhi; - + float s = std::sin(theta); float c = std::cos(theta); return Vector3f(sinPhi * c * m_semiAxes.x(), sinPhi * s * m_semiAxes.y(), cosPhi * m_semiAxes.z()) + m_center; @@ -197,11 +197,11 @@ ConeGenerator::generate(LCGRandomGenerator& gen) const float sinPhi = std::sqrt(1.0f - cosPhi * cosPhi); if (cosPhi < 0.0f) sinPhi = -sinPhi; - + float s = std::sin(theta); float c = std::cos(theta); return Vector3f(sinPhi * c, sinPhi * s, cosPhi) * (m_minLength + gen.randFloat() * m_lengthVariance); -} +} @@ -291,7 +291,7 @@ ParticleEmitter::setBlendMode(cmod::Material::BlendMode blendMode) } -static const uint64 scrambleMask = (uint64(0xcccccccc) << 32) | 0xcccccccc; +static const uint64 scrambleMask = (uint64(0xcccccccc) << 32) | 0xcccccccc; void ParticleEmitter::render(double tsec, @@ -310,7 +310,7 @@ ParticleEmitter::render(double tsec, if (t > m_endTime + m_lifetime) return; } - + // If a start time is specified, set t to be relative to the start time. // Return immediately if we haven't reached the start time yet. if (startBounded) @@ -319,7 +319,7 @@ ParticleEmitter::render(double tsec, if (t < 0.0) return; } - + Matrix3f modelViewMatrix = rc.getCameraOrientation().conjugate().toRotationMatrix(); rc.setMaterial(&m_material); @@ -330,13 +330,13 @@ ParticleEmitter::render(double tsec, Vector3f v3 = modelViewMatrix * Vector3f(-1.0f, 1.0f, 0.0f); glDisable(GL_LIGHTING); - + Texture* texture = NULL; if (m_texture != InvalidResource) { texture = GetTextureManager()->find(m_texture); } - + if (texture != NULL) { glEnable(GL_TEXTURE_2D); @@ -346,50 +346,50 @@ ParticleEmitter::render(double tsec, { glDisable(GL_TEXTURE_2D); } - + // Use premultiplied alpha glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - glDepthMask(GL_FALSE); - + + glDepthMask(GL_FALSE); + double emissionInterval = 1.0 / m_rate; double dserial = std::fmod(t * m_rate, (double) (1 << 31)); int serial = (int) (dserial); double age = (dserial - serial) * emissionInterval; float invLifetime = (float) (1.0 / m_lifetime); - + double maxAge = m_lifetime; if (startBounded) { maxAge = std::min((double) m_lifetime, t); } - + if (endBounded && tsec > m_endTime) { int skipParticles = (int) ((tsec - m_endTime) * m_rate); serial -= skipParticles; age += skipParticles * emissionInterval; } - + Vec4f startColor(m_startColor.red(), m_startColor.green(), m_startColor.blue(), m_startColor.alpha()); Vec4f endColor(m_endColor.red(), m_endColor.green(), m_endColor.blue(), m_endColor.alpha()); - + unsigned int particleCount = 0; - + while (age < maxAge) { // When the particle buffer is full, render the particles and flush it if (particleCount == particleBufferCapacity) { - glDrawArrays(GL_QUADS, 0, particleCount * 4); + glDrawArrays(GL_QUADS, 0, particleCount * 4); particleCount = 0; } - + float alpha = (float) age * invLifetime; float beta = 1.0f - alpha; float size = alpha * m_endSize + beta * m_startSize; - + // Scramble the random number generator seed so that we don't end up with // artifacts from using regularly incrementing values. // @@ -406,12 +406,12 @@ ParticleEmitter::render(double tsec, color[Color::Green] = (unsigned char) ((alpha * endColor.y + beta * startColor.y) * 255.99f); color[Color::Blue] = (unsigned char) ((alpha * endColor.z + beta * startColor.z) * 255.99f); color[Color::Alpha] = (unsigned char) ((alpha * endColor.w + beta * startColor.w) * 255.99f); - + Vector3f v = m_velocityGenerator->generate(gen); Vector3f center = m_positionGenerator->generate(gen) + v * (float) age; if (m_nonZeroAcceleration) center += m_acceleration * (float) (age * age); - + if (!m_rotationEnabled) { particleBuffer[particleCount * 4 + 0].set(center + v0 * size, Vector2f(0.0f, 1.0f), color); @@ -425,19 +425,19 @@ ParticleEmitter::render(double tsec, float rotation = rotationRate * (float) age; float c = std::cos(rotation); float s = std::sin(rotation); - + particleBuffer[particleCount * 4 + 0].set(center + (modelViewMatrix * Vector3f(-c + s, -s - c, 0.0f)) * size, Vector2f(0.0f, 1.0f), color); particleBuffer[particleCount * 4 + 1].set(center + (modelViewMatrix * Vector3f( c + s, s - c, 0.0f)) * size, Vector2f(1.0f, 1.0f), color); particleBuffer[particleCount * 4 + 2].set(center + (modelViewMatrix * Vector3f( c - s, s + c, 0.0f)) * size, Vector2f(1.0f, 0.0f), color); particleBuffer[particleCount * 4 + 3].set(center + (modelViewMatrix * Vector3f(-c - s, -s + c, 0.0f)) * size, Vector2f(0.0f, 0.0f), color); } - + ++particleCount; - + age += emissionInterval; serial--; } - + // Render any remaining particles in the buffer if (particleCount > 0) { @@ -454,7 +454,7 @@ ParticleEmitter::createMaterial() m_material.blend = m_blendMode; m_material.opacity = 0.99f; m_material.maps[0] = new CelestiaTextureResource(m_texture); -} +} #define STRUCT_OFFSET(s, memberName) ((uint32) (reinterpret_cast(&(s).memberName) - reinterpret_cast(&(s)))) @@ -467,7 +467,7 @@ ParticleSystem::ParticleSystem() : { m_particleCapacity = 1000; m_vertexData = new ParticleVertex[m_particleCapacity * 4]; - + // Create the vertex description; currently, it is the same for all // particle systems. ParticleVertex temp; @@ -485,8 +485,8 @@ ParticleSystem::~ParticleSystem() iter != m_emitterList.end(); iter++) { delete (*iter); - } - + } + delete[] m_vertexData; delete m_vertexDesc; } @@ -496,13 +496,13 @@ void ParticleSystem::render(RenderContext& rc, double tsec) { rc.setVertexArrays(*m_vertexDesc, m_vertexData); - + for (list::const_iterator iter = m_emitterList.begin(); iter != m_emitterList.end(); iter++) { (*iter)->render(tsec, rc, m_vertexData, m_particleCapacity); } - + glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); } diff --git a/src/celengine/particlesystem.h b/src/celengine/particlesystem.h index ac0aa3403..01d2f41e9 100644 --- a/src/celengine/particlesystem.h +++ b/src/celengine/particlesystem.h @@ -34,7 +34,7 @@ struct ParticleVertex color[Color::Blue] = _color[Color::Blue]; color[Color::Alpha] = _color[Color::Alpha]; } - + Eigen::Vector3f position; Eigen::Vector2f texCoord; unsigned char color[4]; @@ -48,45 +48,45 @@ public: ParticleEmitter(); ~ParticleEmitter(); - + void render(double tsec, RenderContext& rc, ParticleVertex* particleBuffer, unsigned int bufferCapacity) const; - + void setAcceleration(const Eigen::Vector3f& acceleration); void createMaterial(); - + void setLifespan(double startTime, double endTime); void setRotationRateRange(float minRate, float maxRate); void setBlendMode(cmod::Material::BlendMode blendMode); - + private: double m_startTime; double m_endTime; public: ResourceHandle m_texture; - + float m_rate; float m_lifetime; - + Color m_startColor; float m_startSize; - + Color m_endColor; float m_endSize; - + VectorGenerator* m_positionGenerator; VectorGenerator* m_velocityGenerator; - + private: Eigen::Vector3f m_acceleration; bool m_nonZeroAcceleration; - + float m_minRotationRate; float m_rotationRateVariance; bool m_rotationEnabled; - + cmod::Material::BlendMode m_blendMode; - + cmod::Material m_material; }; @@ -96,20 +96,20 @@ class ParticleSystem : public Geometry public: ParticleSystem(); virtual ~ParticleSystem(); - + virtual void render(RenderContext& rc, double t = 0.0); virtual bool pick(const Ray3d& r, double& distance) const; virtual bool isOpaque() const; - + void addEmitter(ParticleEmitter* emitter); - + public: std::list m_emitterList; cmod::Mesh::VertexDescription* m_vertexDesc; ParticleVertex* m_vertexData; unsigned int m_particleCapacity; - unsigned int m_particleCount; + unsigned int m_particleCount; }; @@ -134,9 +134,9 @@ class ConstantGenerator : public VectorGenerator { public: ConstantGenerator(const Eigen::Vector3f& value) : m_value(value) {} - + virtual Eigen::Vector3f generate(LCGRandomGenerator& gen) const; - + private: Eigen::Vector3f m_value; }; @@ -152,9 +152,9 @@ public: m_semiAxes(axes * 0.5f) { } - + virtual Eigen::Vector3f generate(LCGRandomGenerator& gen) const; - + private: Eigen::Vector3f m_center; Eigen::Vector3f m_semiAxes; @@ -172,9 +172,9 @@ public: m_direction(p1 - p0) { } - + virtual Eigen::Vector3f generate(LCGRandomGenerator& gen) const; - + private: Eigen::Vector3f m_origin; Eigen::Vector3f m_direction; @@ -192,9 +192,9 @@ public: m_semiAxes(semiAxes) { } - + virtual Eigen::Vector3f generate(LCGRandomGenerator& gen) const; - + private: Eigen::Vector3f m_center; Eigen::Vector3f m_semiAxes; @@ -214,9 +214,9 @@ public: m_lengthVariance(maxLength - minLength) { } - + virtual Eigen::Vector3f generate(LCGRandomGenerator& gen) const; - + private: float m_cosMinAngle; float m_cosAngleVariance; diff --git a/src/celengine/particlesystemfile.cpp b/src/celengine/particlesystemfile.cpp index d624eff81..4ab4477a0 100644 --- a/src/celengine/particlesystemfile.cpp +++ b/src/celengine/particlesystemfile.cpp @@ -43,18 +43,18 @@ ParticleSystem* ParticleSystemLoader::load() { ParticleSystem* particleSystem = new ParticleSystem(); - + while (m_tokenizer.nextToken() != Tokenizer::TokenEnd) { string objType; - + if (m_tokenizer.getTokenType() != Tokenizer::TokenName) { raiseError("Error parsing particle system"); delete particleSystem; return NULL; } - + objType = m_tokenizer.getNameValue(); if (objType != "Emitter") { @@ -74,7 +74,7 @@ ParticleSystemLoader::load() delete particleSystem; return NULL; } - + Hash* objParams = objParamsValue->getHash(); if (objType == "Emitter") { @@ -84,11 +84,11 @@ ParticleSystemLoader::load() delete particleSystem; return NULL; } - + particleSystem->addEmitter(emitter); } } - + return particleSystem; } @@ -101,7 +101,7 @@ ParticleSystemLoader::parseGenerator(Hash* params) { return new ConstantGenerator(constantValue); } - + Value* generatorValue = NULL; generatorValue = params->getValue("Box"); if (generatorValue != NULL) @@ -111,17 +111,17 @@ ParticleSystemLoader::parseGenerator(Hash* params) raiseError("Error in Box syntax"); return NULL; } - + Hash* boxParams = generatorValue->getHash(); - + Vector3f center(0.0f, 0.0f, 0.0f); Vector3f size(0.0f, 0.0f, 0.0f); boxParams->getVector("Center", center); boxParams->getVector("Size", size); - + return new BoxGenerator(center, size); } - + generatorValue = params->getValue("Line"); if (generatorValue != NULL) { @@ -130,17 +130,17 @@ ParticleSystemLoader::parseGenerator(Hash* params) raiseError("Error in Line syntax"); return NULL; } - + Hash* lineParams = generatorValue->getHash(); - + Vector3f p0(0.0f, 0.0f, 0.0f); Vector3f p1(0.0f, 0.0f, 0.0f); lineParams->getVector("Point1", p0); lineParams->getVector("Point2", p1); - + return new LineGenerator(p0, p1); } - + generatorValue = params->getValue("EllipsoidSurface"); if (generatorValue != NULL) { @@ -149,17 +149,17 @@ ParticleSystemLoader::parseGenerator(Hash* params) raiseError("Error in EllipsoidSurface syntax"); return NULL; } - + Hash* ellipsoidSurfaceParams = generatorValue->getHash(); - + Vector3f center(0.0f, 0.0f, 0.0f); Vector3f size(2.0f, 2.0f, 2.0f); ellipsoidSurfaceParams->getVector("Center", center); ellipsoidSurfaceParams->getVector("Size", size); - - return new EllipsoidSurfaceGenerator(center, size * 0.5f); + + return new EllipsoidSurfaceGenerator(center, size * 0.5f); } - + generatorValue = params->getValue("Cone"); if (generatorValue != NULL) { @@ -168,9 +168,9 @@ ParticleSystemLoader::parseGenerator(Hash* params) raiseError("Error in Cone syntax"); return NULL; } - + Hash* coneParams = generatorValue->getHash(); - + double minAngle = 0.0; double maxAngle = 0.0; double minSpeed = 0.0; @@ -179,8 +179,8 @@ ParticleSystemLoader::parseGenerator(Hash* params) coneParams->getNumber("MaxAngle", maxAngle); coneParams->getNumber("MinSpeed", minSpeed); coneParams->getNumber("MaxSpeed", maxSpeed); - - return new ConeGenerator((float) degToRad(minAngle), (float) degToRad(maxAngle), (float) minSpeed, (float) maxSpeed); + + return new ConeGenerator((float) degToRad(minAngle), (float) degToRad(maxAngle), (float) minSpeed, (float) maxSpeed); } generatorValue = params->getValue("GaussianDisc"); @@ -191,17 +191,17 @@ ParticleSystemLoader::parseGenerator(Hash* params) raiseError("Error in GaussianDisc syntax"); return NULL; } - + Hash* gaussianDiscParams = generatorValue->getHash(); - + double sigma = 1.0; gaussianDiscParams->getNumber("Sigma", sigma); return new GaussianDiscGenerator((float) sigma); } - + raiseError("Missing generator for emitter"); - + return NULL; } @@ -215,27 +215,27 @@ ParticleSystemLoader::parseEmitter(Hash* params) { textureHandle = GetTextureManager()->getHandle(TextureInfo(textureFileName, getTexturePath(), TextureInfo::BorderClamp)); } - + double rate = 1.0; double lifetime = 1.0; params->getNumber("Rate", rate); params->getNumber("Lifetime", lifetime); - + double startSize = 1.0; double endSize = 1.0; params->getNumber("StartSize", startSize); params->getNumber("EndSize", endSize); - + Color startColor(Color::White); Color endColor(Color::Black); float startOpacity = 0.0f; float endOpacity = 0.0f; - + params->getColor("StartColor", startColor); params->getNumber("StartOpacity", startOpacity); params->getColor("EndColor", endColor); params->getNumber("EndOpacity", endOpacity); - + VectorGenerator* initialPositionGenerator = NULL; Value* positionValue = params->getValue("InitialPosition"); if (positionValue == NULL) @@ -253,12 +253,12 @@ ParticleSystemLoader::parseEmitter(Hash* params) initialPositionGenerator = parseGenerator(positionValue->getHash()); } } - + if (initialPositionGenerator == NULL) { return NULL; } - + VectorGenerator* initialVelocityGenerator = NULL; Value* velocityValue = params->getValue("InitialVelocity"); if (velocityValue == NULL) @@ -276,26 +276,26 @@ ParticleSystemLoader::parseEmitter(Hash* params) initialVelocityGenerator = parseGenerator(velocityValue->getHash()); } } - + if (initialVelocityGenerator == NULL) { delete initialPositionGenerator; return NULL; } - + Vector3f acceleration; params->getVector("Acceleration", acceleration); - + double startTime = -numeric_limits::infinity(); double endTime = numeric_limits::infinity(); params->getNumber("Beginning", startTime); params->getNumber("Ending", endTime); - + double minRotationRate = 0.0; double maxRotationRate = 0.0; params->getNumber("MinRotationRate", minRotationRate); params->getNumber("MaxRotationRate", maxRotationRate); - + ParticleEmitter* emitter = new ParticleEmitter(); emitter->m_texture = textureHandle; emitter->m_rate = (float) rate; @@ -307,12 +307,12 @@ ParticleSystemLoader::parseEmitter(Hash* params) emitter->m_positionGenerator = initialPositionGenerator; emitter->m_velocityGenerator = initialVelocityGenerator; emitter->createMaterial(); - + emitter->setAcceleration(acceleration); - + emitter->setLifespan(startTime, endTime); emitter->setRotationRateRange((float) degToRad(minRotationRate), (float) degToRad(maxRotationRate)); - + return emitter; } @@ -345,7 +345,7 @@ ParticleSystemLoader::getTexturePath() const } -ParticleSystem* +ParticleSystem* LoadParticleSystem(istream& in, const string& texPath) { ParticleSystemLoader* loader = new ParticleSystemLoader(in); diff --git a/src/celengine/particlesystemfile.h b/src/celengine/particlesystemfile.h index 1cdd54a67..af03157de 100644 --- a/src/celengine/particlesystemfile.h +++ b/src/celengine/particlesystemfile.h @@ -34,7 +34,7 @@ class ParticleSystemLoader const std::string& getErrorMessage() const; void setTexturePath(const std::string&); const std::string& getTexturePath() const; - + static ParticleSystemLoader* OpenParticleSystemFile(std::istream& in); private: @@ -44,7 +44,7 @@ class ParticleSystemLoader Tokenizer m_tokenizer; Parser m_parser; std::string m_errorMessage; - std::string m_texPath; + std::string m_texPath; }; diff --git a/src/celengine/planetgrid.cpp b/src/celengine/planetgrid.cpp index 1c0f53bc8..04d54223a 100644 --- a/src/celengine/planetgrid.cpp +++ b/src/celengine/planetgrid.cpp @@ -63,11 +63,11 @@ static void longLatLabel(const string& labelText, Vector3d pos(cos(phi) * cos(theta) * semiAxes.x(), sin(phi) * semiAxes.y(), -cos(phi) * sin(theta) * semiAxes.z()); - + float nearDist = renderer->getNearPlaneDistance(); - + pos = pos * (1.0 + labelOffset); - + double boundingRadius = semiAxes.maxCoeff(); // Draw the label only if it isn't obscured by the body ellipsoid @@ -77,7 +77,7 @@ static void longLatLabel(const string& labelText, // Compute the position of the label Vector3d labelPos = bodyCenter + bodyOrientation.conjugate() * pos * (1.0 + labelOffset); - + // Calculate the intersection of the eye-to-label ray with the plane perpendicular to // the view normal that touches the front of the objects bounding sphere double planetZ = viewNormal.dot(bodyCenter) - boundingRadius; @@ -85,7 +85,7 @@ static void longLatLabel(const string& labelText, planetZ = -nearDist * 1.001; double z = viewNormal.dot(labelPos); labelPos *= planetZ / z; - + renderer->addObjectAnnotation(NULL, labelText, Renderer::PlanetographicGridLabelColor, labelPos.cast()); @@ -113,7 +113,7 @@ PlanetographicGrid::render(Renderer* renderer, Vector3f semiAxes = body.getSemiAxes(); Vector3d posd = pos.cast(); Vector3d viewRayOrigin = q * -pos.cast(); - + // Calculate the view normal; this is used for placement of the long/lat // label text. Vector3f vn = renderer->getCameraOrientation().conjugate() * -Vector3f::UnitZ(); @@ -146,7 +146,7 @@ PlanetographicGrid::render(Renderer* renderer, latitudeStep = 30.0f; longitudeStep = 30.0f; } - + for (float latitude = -90.0f + latitudeStep; latitude < 90.0f; latitude += latitudeStep) { float phi = degToRad(latitude); @@ -167,7 +167,7 @@ PlanetographicGrid::render(Renderer* renderer, glDrawArrays(GL_LINE_LOOP, 0, circleSubdivisions); glPopMatrix(); glLineWidth(1.0f); - + if (showCoordinateLabels) { if (latitude != 0.0f && abs(latitude) < 90.0f) @@ -241,7 +241,7 @@ PlanetographicGrid::render(Renderer* renderer, break; } - sprintf(buf, "%d%c", showLongitude, ew); + sprintf(buf, "%d%c", showLongitude, ew); longLatLabel(buf, -longitude, 0.0, viewRayOrigin, viewNormal, posd, q, semiAxes, offset, renderer); } } diff --git a/src/celengine/regcombine.h b/src/celengine/regcombine.h index 1b0b97721..478518b86 100644 --- a/src/celengine/regcombine.h +++ b/src/celengine/regcombine.h @@ -1,5 +1,5 @@ // regcombine.h -// +// // Copyright (C) 2001, Chris Laurel // // Some functions for setting up the nVidia register combiners diff --git a/src/celengine/rendcontext.cpp b/src/celengine/rendcontext.cpp index 32d408633..fb3120c31 100644 --- a/src/celengine/rendcontext.cpp +++ b/src/celengine/rendcontext.cpp @@ -319,7 +319,7 @@ FixedFunctionRenderContext::makeCurrent(const Material& m) glMaterialfv(GL_FRONT, GL_SHININESS, &m.specularPower); specularOn = true; } - + { float matEmissive[4] = { m.emissive.red(), m.emissive.green(), @@ -836,7 +836,7 @@ GLSL_RenderContext::makeCurrent(const Material& m) glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE); - break; + break; default: glDisable(GL_BLEND); glDepthMask(GL_TRUE); @@ -1002,7 +1002,7 @@ GLSLUnlit_RenderContext::makeCurrent(const Material& m) glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); - break; + break; default: glDisable(GL_BLEND); glDepthMask(GL_TRUE); diff --git a/src/celengine/rendcontext.h b/src/celengine/rendcontext.h index 687be92e0..c0665dc53 100644 --- a/src/celengine/rendcontext.h +++ b/src/celengine/rendcontext.h @@ -47,10 +47,10 @@ class RenderContext void setPointScale(float); float getPointScale() const; - + void setCameraOrientation(const Eigen::Quaternionf& q); Eigen::Quaternionf getCameraOrientation() const; - + private: const cmod::Material* material; bool locked; @@ -113,15 +113,15 @@ class GLSL_RenderContext : public RenderContext { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW - + GLSL_RenderContext(const LightingState& ls, float _objRadius, const Eigen::Quaternionf& orientation); GLSL_RenderContext(const LightingState& ls, const Eigen::Vector3f& _objScale, const Eigen::Quaternionf& orientation); virtual ~GLSL_RenderContext(); - + virtual void makeCurrent(const cmod::Material&); virtual void setVertexArrays(const cmod::Mesh::VertexDescription& desc, const void* vertexData); - + virtual void setLunarLambert(float); virtual void setAtmosphere(const Atmosphere*); @@ -129,7 +129,7 @@ class GLSL_RenderContext : public RenderContext void initLightingEnvironment(); void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor); void setShadowParameters(CelestiaGLProgram& prog); - + private: const LightingState& lightingState; const Atmosphere* atmosphere; @@ -137,10 +137,10 @@ class GLSL_RenderContext : public RenderContext float objRadius; Eigen::Vector3f objScale; Eigen::Quaternionf objOrientation; - + // extended material properties float lunarLambert; - + ShaderProperties shaderProps; }; @@ -150,7 +150,7 @@ class GLSLUnlit_RenderContext : public RenderContext public: GLSLUnlit_RenderContext(float _objRadius); virtual ~GLSLUnlit_RenderContext(); - + virtual void makeCurrent(const cmod::Material&); virtual void setVertexArrays(const cmod::Mesh::VertexDescription& desc, const void* vertexData); @@ -158,11 +158,11 @@ class GLSLUnlit_RenderContext : public RenderContext private: void initLightingEnvironment(); void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor); - + private: cmod::Material::BlendMode blendMode; float objRadius; - + ShaderProperties shaderProps; }; diff --git a/src/celengine/render.cpp b/src/celengine/render.cpp index 018153d5a..065724d3c 100644 --- a/src/celengine/render.cpp +++ b/src/celengine/render.cpp @@ -317,7 +317,7 @@ public: void render(); void finish(); inline void addStar(const Eigen::Vector3f& pos, const Color&, float); - void setTexture(Texture*); + void setTexture(Texture*); private: struct StarVertex @@ -333,7 +333,7 @@ private: StarVertex* vertices; const GLContext* context; bool useSprites; - Texture* texture; + Texture* texture; }; @@ -442,7 +442,7 @@ PointStarVertexBuffer::PointStarVertexBuffer(unsigned int _capacity) : vertices(NULL), context(NULL), useSprites(false), - texture(NULL) + texture(NULL) { vertices = new StarVertex[capacity]; } @@ -576,7 +576,7 @@ inline void PointStarVertexBuffer::addStar(const Eigen::Vector3f& pos, void PointStarVertexBuffer::setTexture(Texture* _texture) { - texture = _texture; + texture = _texture; } /**** End star vertex buffer classes ****/ @@ -852,11 +852,11 @@ static void RectToSphericalMapEval(float x, float y, float z, // Compute spherical coodinates (r is always 1) double phi = asin(y); double theta = atan2(z, -x); - + // Convert to texture coordinates double u = (theta / PI + 1.0) * 0.5; double v = (-phi / PI + 0.5); - + // Pack texture coordinates in red/green and blue/alpha // u = red + green/256 // v = blue* + alpha/256 @@ -1613,7 +1613,7 @@ void Renderer::addSortedAnnotation(const MarkerRepresentation* markerRep, &winX, &winY, &winZ) != GL_FALSE) { Annotation a; - + a.labelText[0] = '\0'; if (markerRep == NULL) { @@ -1673,7 +1673,7 @@ void Renderer::beginObjectAnnotations() void Renderer::endObjectAnnotations() { objectAnnotationSetOpen = false; - + if (!objectAnnotations.empty()) { renderAnnotations(objectAnnotations.begin(), @@ -1708,7 +1708,7 @@ void Renderer::addObjectAnnotation(const MarkerRepresentation* markerRep, { Annotation a; - + a.labelText[0] = '\0'; if (!labelText.empty()) { @@ -2325,7 +2325,7 @@ void Renderer::genBlurTexture(int blurLevel) void Renderer::genSceneTexture() { - unsigned int *data; + unsigned int *data; if (sceneTexture != 0) glDeleteTextures(1, &sceneTexture); @@ -2339,19 +2339,19 @@ void Renderer::genSceneTexture() 1.0f; sceneTexHScale = (windowHeight > 0) ? (GLfloat)sceneTexHeight / (GLfloat)windowHeight : 1.0f; - data = (unsigned int* )malloc(sceneTexWidth*sceneTexHeight*4*sizeof(unsigned int)); + data = (unsigned int* )malloc(sceneTexWidth*sceneTexHeight*4*sizeof(unsigned int)); memset(data, 0, sceneTexWidth*sceneTexHeight*4*sizeof(unsigned int)); - + glGenTextures(1, &sceneTexture); - glBindTexture(GL_TEXTURE_2D, sceneTexture); + glBindTexture(GL_TEXTURE_2D, sceneTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, sceneTexWidth, sceneTexHeight, 0, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, sceneTexWidth, sceneTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - - free(data); + + free(data); #ifdef DEBUG_HDR static int genSceneTexCounter = 1; HDR_LOG << @@ -3000,12 +3000,12 @@ void Renderer::draw(const Observer& observer, { float nearZ = center.distanceFromOrigin() - radius; nearZ = -nearZ * nearZcoeff; - + if (nearZ > -MinNearPlaneDistance) iter->nearZ = -max(MinNearPlaneDistance, radius / 2000.0f); else iter->nearZ = nearZ; - + if (!convex) { iter->farZ = center.z - radius; @@ -3016,7 +3016,7 @@ void Renderer::draw(const Observer& observer, { // Make the far plane as close as possible float d = center.distanceFromOrigin(); - + // Account for ellipsoidal objects float eradius = radius; if (iter->body != NULL) @@ -3036,7 +3036,7 @@ void Renderer::draw(const Observer& observer, // is spherical, inside the planet.) iter->farZ = iter->nearZ * 2.0f; } - + if (cloudHeight > 0.0f) { // If there's a cloud layer, we need to move the @@ -3046,7 +3046,7 @@ void Renderer::draw(const Observer& observer, square(eradius)); } } - + *notCulled = *iter; notCulled++; @@ -3080,7 +3080,7 @@ void Renderer::draw(const Observer& observer, float radius = iter->body->getRadius(); Vector3f semiAxes = iter->body->getSemiAxes() / radius; - Vector3f recipSemiAxes = semiAxes.cwiseInverse(); + Vector3f recipSemiAxes = semiAxes.cwiseInverse(); Vector3f eyeVec = iter->position / radius; // Compute the orientation of the planet before axial rotation @@ -3173,7 +3173,7 @@ void Renderer::draw(const Observer& observer, glDepthMask(GL_FALSE); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); - + // Render sky grids first--these will always be in the background { glDisable(GL_TEXTURE_2D); @@ -3187,8 +3187,8 @@ void Renderer::draw(const Observer& observer, } // Render deep sky objects - if ((renderFlags & (ShowGalaxies | - ShowGlobulars | + if ((renderFlags & (ShowGalaxies | + ShowGlobulars | ShowNebulae | ShowOpenClusters)) != 0 && universe.getDSOCatalog() != NULL) @@ -3250,24 +3250,24 @@ void Renderer::draw(const Observer& observer, { Asterism* ast = *iter; - if (ast->getActive()) + if (ast->getActive()) { - if (ast->isColorOverridden()) - glColor(ast->getOverrideColor(), opacity); - else - glColor(ConstellationColor, opacity); + if (ast->isColorOverridden()) + glColor(ast->getOverrideColor(), opacity); + else + glColor(ConstellationColor, opacity); - for (int i = 0; i < ast->getChainCount(); i++) - { - const Asterism::Chain& chain = ast->getChain(i); + for (int i = 0; i < ast->getChainCount(); i++) + { + const Asterism::Chain& chain = ast->getChain(i); - glBegin(GL_LINE_STRIP); - for (Asterism::Chain::const_iterator iter = chain.begin(); - iter != chain.end(); iter++) - glVertex3fv(iter->data()); - glEnd(); - } - } + glBegin(GL_LINE_STRIP); + for (Asterism::Chain::const_iterator iter = chain.begin(); + iter != chain.end(); iter++) + glVertex3fv(iter->data()); + glEnd(); + } + } } if ((renderFlags & ShowSmoothLines) != 0) @@ -3313,13 +3313,13 @@ void Renderer::draw(const Observer& observer, { renderMarkers(*universe.getMarkers(), observer.getPosition(), - observer.getOrientation(), + observer.getOrientation(), now); - + // Render background markers; rendering of other markers is deferred until // solar system objects are rendered. renderBackgroundAnnotations(FontNormal); - } + } // Draw the selection cursor bool selectionVisible = false; @@ -3340,7 +3340,7 @@ void Renderer::draw(const Observer& observer, if (sel.body() != NULL) boundingRadius = sel.body()->getBoundingRadius(); else - boundingRadius = sel.radius(); + boundingRadius = sel.radius(); offset *= (1.0 - boundingRadius * 1.01 / distance); // The selection cursor is only partially visible when the selected object is obscured. To implement @@ -3666,19 +3666,19 @@ void Renderer::draw(const Observer& observer, if (minNearDistance > zNearest) zNearest = minNearDistance; } - + // Adjust the nearest interval to include the closest marker (if it's // closer to the observer than anything else if (!depthSortedAnnotations.empty()) { // Factor of 0.999 makes sure ensures that the near plane does not fall - // exactly at the marker's z coordinate (in which case the marker - // would be susceptible to getting clipped.) + // exactly at the marker's z coordinate (in which case the marker + // would be susceptible to getting clipped.) if (-depthSortedAnnotations[0].position.z() > zNearest) zNearest = -depthSortedAnnotations[0].position.z() * 0.999f; } - + #if DEBUG_COALESCE clog << "nEntries: " << nEntries << ", zNearest: " << zNearest << ", prevNear: " << prevNear << "\n"; #endif @@ -3793,7 +3793,7 @@ void Renderer::draw(const Observer& observer, clog << "point: " << renderList[i].body->getName() << "\n"; } break; - + case RenderListEntry::RenderableStar: if (renderList[i].discSizeInPixels > 1) { @@ -3804,7 +3804,7 @@ void Renderer::draw(const Observer& observer, clog << "point: " << "Star" << "\n"; } break; - + default: break; } @@ -3910,7 +3910,7 @@ void Renderer::draw(const Observer& observer, // reset the depth range glDepthRange(0, 1); } - + renderForegroundAnnotations(FontNormal); glMatrixMode(GL_PROJECTION); @@ -3932,7 +3932,7 @@ void Renderer::draw(const Observer& observer, glPolygonMode(GL_FRONT, GL_FILL); glPolygonMode(GL_BACK, GL_FILL); - + glDisable(GL_BLEND); glDepthMask(GL_TRUE); glEnable(GL_LIGHTING); @@ -4621,7 +4621,7 @@ void Renderer::renderEllipsoidAtmosphere(const Atmosphere& atmosphere, double centerDist = eyeVec.norm(); float height = atmosphere.height / radius; - Vector3f recipSemiAxes = semiAxes.cwiseInverse(); + Vector3f recipSemiAxes = semiAxes.cwiseInverse(); Vector3f recipAtmSemiAxes = recipSemiAxes / (1.0f + height); // ellipDist is not the true distance from the surface unless the @@ -4733,7 +4733,7 @@ void Renderer::renderEllipsoidAtmosphere(const Atmosphere& atmosphere, Vector3f botColor = atmosphere.lowerColor.toVector3(); Vector3f topColor = atmosphere.upperColor.toVector3(); Vector3f sunsetColor = atmosphere.sunsetColor.toVector3(); - + if (within) { Vector3f skyColor = atmosphere.skyColor.toVector3(); @@ -4994,7 +4994,7 @@ static void setLightParameters_VP(VertexProcessor& vproc, Vector3f lightColor = light.color.toVector3() * light.irradiance; Vector3f diffuse = diffuseColor.cwiseProduct(lightColor); Vector3f specular = specularColor.cwiseProduct(lightColor); - + // Just handle two light sources for now if (i == 0) { @@ -6296,7 +6296,7 @@ renderEclipseShadows_Shaders(Geometry* geometry, const GLContext& context) { Matrix3f planetTransform = planetOrientation.toRotationMatrix(); - + // Eclipse shadows on mesh objects are only implemented in the GLSL path if (geometry != NULL) return; @@ -6498,9 +6498,9 @@ void Renderer::renderLocations(const Body& body, const vector* locations = body.getLocations(); if (locations == NULL) return; - + Vector3f semiAxes = body.getSemiAxes(); - + float nearDist = getNearPlaneDistance(); double boundingRadius = semiAxes.maxCoeff(); @@ -6510,37 +6510,37 @@ void Renderer::renderLocations(const Body& body, Vector3f vn = getCameraOrientation().conjugate() * -Vector3f::UnitZ(); Vector3d viewNormal = vn.cast(); - + Ellipsoidd bodyEllipsoid(semiAxes.cast()); - + Matrix3d bodyMatrix = bodyOrientation.conjugate().toRotationMatrix(); - + for (vector::const_iterator iter = locations->begin(); iter != locations->end(); iter++) { const Location& location = **iter; - + if (location.getFeatureType() & locationFilter) { // Get the position of the location with respect to the planet center Vector3f ppos = location.getPosition(); - + // Compute the bodycentric position of the location Vector3d locPos = ppos.cast(); - + // Get the planetocentric position of the label. Add a slight scale factor // to keep the point from being exactly on the surface. Vector3d pcLabelPos = locPos * (1.0 + labelOffset); - + // Get the camera space label position Vector3d labelPos = bodyCenter + bodyMatrix * locPos; - + float effSize = location.getImportance(); if (effSize < 0.0f) effSize = location.getSize(); - + float pixSize = effSize / (float) (labelPos.norm() * pixelSize); - + if (pixSize > minFeatureSize && labelPos.dot(viewNormal) > 0.0) { // Labels on non-ellipsoidal bodies need special handling; the @@ -6554,9 +6554,9 @@ void Renderer::renderLocations(const Body& body, if (r < boundingRadius) pcLabelPos = locPos * (boundingRadius * 1.01 / r); } - + double t = 0.0; - + // Test for an intersection of the eye-to-location ray with // the planet ellipsoid. If we hit the planet first, then // the label is obscured by the planet. An exact calculation @@ -6566,7 +6566,7 @@ void Renderer::renderLocations(const Body& body, bool hit = testIntersection(testRay, bodyEllipsoid, t); if (!hit || t >= 1.0) - { + { // Calculate the intersection of the eye-to-label ray with the plane perpendicular to // the view normal that touches the front of the object's bounding sphere double planetZ = viewNormal.dot(bodyCenter) - boundingRadius; @@ -6574,7 +6574,7 @@ void Renderer::renderLocations(const Body& body, planetZ = -nearDist * 1.001; double z = viewNormal.dot(labelPos); labelPos *= planetZ / z; - + uint32 featureType = location.getFeatureType(); MarkerRepresentation* locationMarker = NULL; if (featureType & Location::City) @@ -6596,7 +6596,7 @@ void Renderer::renderLocations(const Body& body, } } } - } + } } @@ -6639,7 +6639,7 @@ estimateReflectedLightFraction(const Vector3d& toSun, // s = sin(phi) * sin(theta) float s = (float) sqrt((1.0f - cosPhi * cosPhi) * (1.0f - cosTheta * cosTheta)); - + float cosPhi1 = cosPhi * cosTheta - s; // cos(phi + theta) float cosPhi2 = cosPhi * cosTheta + s; // cos(phi - theta) @@ -6715,7 +6715,7 @@ setupObjectLighting(const vector& suns, { // Account for the phase Vector3d toSun = objpos - suns[0].position; - irr *= estimateReflectedLightFraction(toSun, toIllum, iter->radius); + irr *= estimateReflectedLightFraction(toSun, toIllum, iter->radius); if (irr > maxIrr) { maxIrr = irr; @@ -6724,7 +6724,7 @@ setupObjectLighting(const vector& suns, } } } -#if DEBUG_SECONDARY_ILLUMINATION +#if DEBUG_SECONDARY_ILLUMINATION clog << "maxIrr = " << maxIrr << ", " << secondaryIlluminators[maxIrrSource].body->getName() << ", " << secondaryIlluminators[maxIrrSource].reflectedIrradiance << endl; @@ -6737,7 +6737,7 @@ setupObjectLighting(const vector& suns, ls.lights[i].direction_eye = toIllum.cast(); ls.lights[i].direction_eye.normalize(); ls.lights[i].irradiance = maxIrr; - ls.lights[i].color = secondaryIlluminators[maxIrrSource].body->getSurface().color; + ls.lights[i].color = secondaryIlluminators[maxIrrSource].body->getSurface().color; ls.lights[i].apparentSize = 0.0f; ls.lights[i].castsShadows = false; i++; @@ -7436,7 +7436,7 @@ bool Renderer::testEclipse(const Body& receiver, const DirectionalLight& light = lightingState.lights[lightIndex]; LightingState::EclipseShadowVector& shadows = *lightingState.shadows[lightIndex]; bool isReceiverShadowed = false; - + // Ignore situations where the shadow casting body is much smaller than // the receiver, as these shadows aren't likely to be relevant. Also, // ignore eclipses where the caster is not an ellipsoid, since we can't @@ -7520,21 +7520,21 @@ bool Renderer::testEclipse(const Body& receiver, isReceiverShadowed = true; } - + // If the caster has a ring system, see if it casts a shadow on the receiver. // Ring shadows are only supported in the OpenGL 2.0 path. if (caster.getRings() && context->getRenderPath() == GLContext::GLPath_GLSL) { bool shadowed = false; - + // The shadow volume of the rings is an oblique circular cylinder if (dist < caster.getRings()->outerRadius + receiver.getRadius()) { // Possible intersection, but it depends on the orientation of the // rings. Quaterniond casterOrientation = caster.getOrientation(now); - Vector3d ringPlaneNormal = casterOrientation * Vector3d::UnitY(); - Vector3d shadowDirection = lightToCasterDir.normalized(); + Vector3d ringPlaneNormal = casterOrientation * Vector3d::UnitY(); + Vector3d shadowDirection = lightToCasterDir.normalized(); Vector3d v = ringPlaneNormal.cross(shadowDirection); if (v.squaredNorm() < 1.0e-6) { @@ -7549,7 +7549,7 @@ bool Renderer::testEclipse(const Body& receiver, // perpendicular to the ring plane and containing the light direction. Vector3d shadowPlaneNormal = v.normalized().cross(shadowDirection); Hyperplane shadowPlane(shadowPlaneNormal, posCaster - posReceiver); - double minDistance = receiver.getRadius() + + double minDistance = receiver.getRadius() + caster.getRings()->outerRadius * ringPlaneNormal.dot(shadowDirection); if (abs(shadowPlane.signedDistance(Vector3d::Zero())) < minDistance) { @@ -7566,7 +7566,7 @@ bool Renderer::testEclipse(const Body& receiver, shadow.ringSystem = caster.getRings(); shadow.casterOrientation = casterOrientation.cast(); } - } + } } } @@ -7672,7 +7672,7 @@ void Renderer::renderPlanet(Body& body, lights.ringShadows[li].direction = -lights.lights[li].position.normalized().cast(); } } - + // Calculate eclipse circumstances if ((renderFlags & ShowEclipseShadows) != 0 && body.getSystem() != NULL) @@ -7835,7 +7835,7 @@ void Renderer::renderPlanet(Body& body, observatoryRep = MarkerRepresentation(MarkerRepresentation::Plus, 8.0f, LocationLabelColor); cityRep = MarkerRepresentation(MarkerRepresentation::X, 3.0f, LocationLabelColor); genericLocationRep = MarkerRepresentation(MarkerRepresentation::Square, 8.0f, LocationLabelColor); - + glEnable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glDisable(GL_BLEND); @@ -8244,7 +8244,7 @@ static float luminosityAtOpposition(float sunLuminosity, // Compute the total energy hitting the planet; assume an albedo of 1.0, so // reflected energy = incident energy. double incidentEnergy = irradiance * circleArea(objRadius * 1000); - + // Compute the luminosity (i.e. power relative to solar power) return (float) (incidentEnergy / astro::SOLAR_POWER); } @@ -8323,7 +8323,7 @@ void Renderer::buildRenderLists(const Vector3d& astrocentricObserverPos, Matrix3f viewMat = observer.getOrientationf().toRotationMatrix(); Vector3f viewMatZ = viewMat.row(2); double invCosViewAngle = 1.0 / cosViewConeAngle; - double sinViewAngle = sqrt(1.0 - square(cosViewConeAngle)); + double sinViewAngle = sqrt(1.0 - square(cosViewConeAngle)); unsigned int nChildren = tree != NULL ? tree->childCount() : 0; for (unsigned int i = 0; i < nChildren; i++) @@ -8360,7 +8360,7 @@ void Renderer::buildRenderLists(const Vector3d& astrocentricObserverPos, // The result of the planetshine test can be reused for the view cone // test, but only when the object's light influence sphere is larger - // than the geometry. This is not + // than the geometry. This is not bool viewConeTestFailed = false; if (body->isSecondaryIlluminator()) { @@ -8476,7 +8476,7 @@ void Renderer::buildRenderLists(const Vector3d& astrocentricObserverPos, // Figure out the magnitude of the brightest possible object in the subtree. // Compute the luminosity from reflected light of the largest object in the subtree - float lum = 0.0f; + float lum = 0.0f; for (unsigned int li = 0; li < lightSourceList.size(); li++) { Vector3d sunPos = pos_v - lightSourceList[li].position; @@ -8517,7 +8517,7 @@ void Renderer::buildRenderLists(const Vector3d& astrocentricObserverPos, { double maxPerpDist = (influenceRadius + dist_vn * sinViewAngle) * invCosViewAngle; double perpDistSq = toViewNormal.squaredNorm(); - if (perpDistSq < maxPerpDist * maxPerpDist) + if (perpDistSq < maxPerpDist * maxPerpDist) traverseSubtree = true; } } @@ -8569,7 +8569,7 @@ void Renderer::buildOrbitLists(const Vector3d& astrocentricObserverPos, // relative to the observer. Vector3d pos_v = pos_s - astrocentricObserverPos; - // Only show orbits for major bodies or selected objects. + // Only show orbits for major bodies or selected objects. Body::VisibilityPolicy orbitVis = body->getOrbitVisibility(); if (body->isVisible() && @@ -8788,7 +8788,7 @@ void Renderer::buildLabelLists(const Frustum& viewFrustum, } } } - } // for each render list entry + } // for each render list entry } @@ -9616,29 +9616,29 @@ void DSORenderer::process(DeepSkyObject* const & dso, { if (distanceToDSO > distanceLimit) return; - + Vector3d dsoPos = dso->getPosition(); Vector3f relPos = (dsoPos - obsPos).cast(); Vector3f center = orientationMatrix.transpose() * relPos; - - double enhance = 4.0, pc10 = 32.6167; - - // The parameter 'enhance' adjusts the DSO brightness as viewed from "inside" - // (e.g. MilkyWay as seen from Earth). It provides an enhanced apparent core - // brightness appMag ~ absMag - enhance. 'enhance' thus serves to uniformly - // enhance the too low sprite luminosity at close distance. + + double enhance = 4.0, pc10 = 32.6167; + + // The parameter 'enhance' adjusts the DSO brightness as viewed from "inside" + // (e.g. MilkyWay as seen from Earth). It provides an enhanced apparent core + // brightness appMag ~ absMag - enhance. 'enhance' thus serves to uniformly + // enhance the too low sprite luminosity at close distance. float appMag = (distanceToDSO >= pc10)? (float) astro::absToAppMag((double) absMag, distanceToDSO): absMag + (float) (enhance * tanh(distanceToDSO/pc10 - 1.0)); - - // Test the object's bounding sphere against the view frustum. If we + + // Test the object's bounding sphere against the view frustum. If we // avoid this stage, overcrowded octree cells may hit performance badly: // each object (even if it's not visible) would be sent to the OpenGL // pipeline. - + if (dso->isVisible()) { - double dsoRadius = dso->getBoundingSphereRadius(); + double dsoRadius = dso->getBoundingSphereRadius(); bool inFrustum = frustum.testSphere(center, (float) dsoRadius) != Frustum::Outside; if (inFrustum) @@ -9651,29 +9651,29 @@ void DSORenderer::process(DeepSkyObject* const & dso, // Ansatz: brightness = a - b * appMag(distanceToDSO), emulating eye sensitivity... // determine a,b such that // a - b * absMag = absMag / avgAbsMag ~ 1; a - b * faintestMag = 0.2. - // The 2nd eq. guarantees that the faintest galaxies are still visible. - - if(!strcmp(dso->getObjTypeName(),"globular")) - avgAbsMag = -6.86; // average over 150 globulars in globulars.dsc. - else if (!strcmp(dso->getObjTypeName(),"galaxy")) - avgAbsMag = -19.04; // average over 10937 galaxies in galaxies.dsc. - - - float r = absMag / (float) avgAbsMag; - float brightness = r - (r - 0.2f) * (absMag - appMag) / (absMag - faintestMag); - - // obviously, brightness(appMag = absMag) = r and - // brightness(appMag = faintestMag) = 0.2, as desired. + // The 2nd eq. guarantees that the faintest galaxies are still visible. - brightness = 2.3f * brightness * (faintestMag - 4.75f) / renderer->getFaintestAM45deg(); + if(!strcmp(dso->getObjTypeName(),"globular")) + avgAbsMag = -6.86; // average over 150 globulars in globulars.dsc. + else if (!strcmp(dso->getObjTypeName(),"galaxy")) + avgAbsMag = -19.04; // average over 10937 galaxies in galaxies.dsc. + + + float r = absMag / (float) avgAbsMag; + float brightness = r - (r - 0.2f) * (absMag - appMag) / (absMag - faintestMag); + + // obviously, brightness(appMag = absMag) = r and + // brightness(appMag = faintestMag) = 0.2, as desired. + + brightness = 2.3f * brightness * (faintestMag - 4.75f) / renderer->getFaintestAM45deg(); #ifdef USE_HDR brightness *= exposure; #endif if (brightness < 0) - brightness = 0; - - if (dsoRadius < 1000.0) + brightness = 0; + + if (dsoRadius < 1000.0) { // Small objects may be prone to clipping; give them special // handling. We don't want to always set the projection @@ -9753,11 +9753,11 @@ void DSORenderer::process(DeepSkyObject* const & dso, appMagEff = appMag; step = 6.0f; break; - case Renderer::GlobularLabels: + case Renderer::GlobularLabels: labelColor = Renderer::GlobularLabelColor; appMagEff = appMag; step = 3.0f; - break; + break; default: // Unrecognized object class labelColor = Color::White; @@ -9897,7 +9897,7 @@ void Renderer::renderSkyGrids(const Observer& observer) double tdb = observer.getTime(); const ObserverFrame* frame = observer.getFrame(); Body* body = frame->getRefObject().body(); - + if (body) { SkyGrid grid; @@ -9905,13 +9905,13 @@ void Renderer::renderSkyGrids(const Observer& observer) grid.setLabelColor(HorizonGridLabelColor); grid.setLongitudeUnits(SkyGrid::LongitudeDegrees); grid.setLongitudeDirection(SkyGrid::IncreasingClockwise); - + Vector3d zenithDirection = observer.getPosition().offsetFromKm(body->getPosition(tdb)).normalized(); - + Vector3d northPole = body->getEclipticToEquatorial(tdb).conjugate() * Vector3d::UnitY(); zenithDirection = toStandardCoords(zenithDirection); northPole = toStandardCoords(northPole); - + Vector3d v = zenithDirection.cross(northPole); // Horizontal coordinate system not well defined when observer @@ -9921,13 +9921,13 @@ void Renderer::renderSkyGrids(const Observer& observer) { v.normalize(); Vector3d u = v.cross(zenithDirection); - + Matrix3d m; m.row(0) = u; m.row(1) = v; m.row(2) = zenithDirection; grid.setOrientation(Quaterniond(m)); - + grid.render(*this, observer, windowWidth, windowHeight); } } @@ -10016,9 +10016,9 @@ void Renderer::renderSelectionPointer(const Observer& observer, Vector3f p2(-20.0f * pixelSize, -6.0f * pixelSize, 0.0f); glBegin(GL_TRIANGLES); - glVertex((p0.x() * c - p0.y() * s + x0) * u + (p0.x() * s + p0.y() * c + y0) * v); - glVertex((p1.x() * c - p1.y() * s + x0) * u + (p1.x() * s + p1.y() * c + y0) * v); - glVertex((p2.x() * c - p2.y() * s + x0) * u + (p2.x() * s + p2.y() * c + y0) * v); + glVertex((p0.x() * c - p0.y() * s + x0) * u + (p0.x() * s + p0.y() * c + y0) * v); + glVertex((p1.x() * c - p1.y() * s + x0) * u + (p1.x() * s + p1.y() * c + y0) * v); + glVertex((p2.x() * c - p2.y() * s + x0) * u + (p2.x() * s + p2.y() * c + y0) * v); glEnd(); glPopMatrix(); @@ -10172,7 +10172,7 @@ void Renderer::renderAnnotations(const vector& annotations, FontStyl // Enable line smoothing for rendering symbols if ((renderFlags & ShowSmoothLines) != 0) enableSmoothLines(); - + #ifdef USE_HDR glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); #endif @@ -10212,13 +10212,13 @@ void Renderer::renderAnnotations(const vector& annotations, FontStyl else markerRep.render(size); glEnable(GL_TEXTURE_2D); - + if (!markerRep.label().empty()) { int labelOffset = (int) markerRep.size() / 2; glTranslatef(labelOffset + PixelOffset, -labelOffset - font[fs]->getHeight() + PixelOffset, 0.0f); font[fs]->render(markerRep.label(), 0.0f, 0.0f); - } + } glPopMatrix(); } @@ -10228,25 +10228,25 @@ void Renderer::renderAnnotations(const vector& annotations, FontStyl int labelWidth = 0; int hOffset = 2; int vOffset = 0; - + switch (annotations[i].halign) { case AlignCenter: labelWidth = (font[fs]->getWidth(annotations[i].labelText)); hOffset = -labelWidth / 2; break; - + case AlignRight: labelWidth = (font[fs]->getWidth(annotations[i].labelText)); hOffset = -(labelWidth + 2); break; - + case AlignLeft: if (annotations[i].markerRep != NULL) hOffset = 2 + (int) annotations[i].markerRep->size() / 2; break; } - + switch (annotations[i].valign) { case AlignCenter: @@ -10259,7 +10259,7 @@ void Renderer::renderAnnotations(const vector& annotations, FontStyl vOffset = 0; break; } - + glColor(annotations[i].color); glTranslatef((int) annotations[i].position.x() + hOffset + PixelOffset, (int) annotations[i].position.y() + vOffset + PixelOffset, 0.0f); @@ -10288,7 +10288,7 @@ Renderer::renderBackgroundAnnotations(FontStyle fs) glEnable(GL_DEPTH_TEST); renderAnnotations(backgroundAnnotations, fs); glDisable(GL_DEPTH_TEST); - + clearAnnotations(backgroundAnnotations); } @@ -10298,7 +10298,7 @@ Renderer::renderForegroundAnnotations(FontStyle fs) { glDisable(GL_DEPTH_TEST); renderAnnotations(foregroundAnnotations, fs); - + clearAnnotations(foregroundAnnotations); } @@ -10352,17 +10352,17 @@ Renderer::renderSortedAnnotations(vector::iterator iter, { size = iter->size; } - + glTranslatef((GLfloat) (int) iter->position.x(), (GLfloat) (int) iter->position.y(), ndc_z); glColor(iter->color); - + glDisable(GL_TEXTURE_2D); if (markerRep.symbol() == MarkerRepresentation::Crosshair) renderCrosshair(size, realTime); else markerRep.render(size); - glEnable(GL_TEXTURE_2D); - + glEnable(GL_TEXTURE_2D); + if (!markerRep.label().empty()) { int labelOffset = (int) markerRep.size() / 2; @@ -10442,17 +10442,17 @@ Renderer::renderAnnotations(vector::iterator startIter, { size = iter->size; } - + glTranslatef((GLfloat) (int) iter->position.x(), (GLfloat) (int) iter->position.y(), ndc_z); glColor(iter->color); - + glDisable(GL_TEXTURE_2D); if (markerRep.symbol() == MarkerRepresentation::Crosshair) renderCrosshair(size, realTime); else markerRep.render(size); - glEnable(GL_TEXTURE_2D); - + glEnable(GL_TEXTURE_2D); + if (!markerRep.label().empty()) { int labelOffset = (int) markerRep.size() / 2; @@ -10461,7 +10461,7 @@ Renderer::renderAnnotations(vector::iterator startIter, } glPopMatrix(); } - + if (iter->labelText[0] != '\0') { if (iter->markerRep != NULL) @@ -10489,7 +10489,7 @@ Renderer::renderAnnotations(vector::iterator startIter, void Renderer::renderMarkers(const MarkerList& markers, const UniversalCoord& cameraPosition, - const Quaterniond& cameraOrientation, + const Quaterniond& cameraOrientation, double jd) { // Calculate the cosine of half the maximum field of view. We'll use this for @@ -10499,13 +10499,13 @@ void Renderer::renderMarkers(const MarkerList& markers, double h = tan(degToRad(fov / 2)); double diag = sqrt(1.0 + square(h) + square(h * (double) windowWidth / (double) windowHeight)); double cosFOV = 1.0 / diag; - + Vector3d viewVector = cameraOrientation.conjugate() * -Vector3d::UnitZ(); - + for (MarkerList::const_iterator iter = markers.begin(); iter != markers.end(); iter++) { Vector3d offset = iter->position(jd).offsetFromKm(cameraPosition); - + // Only render those markers that lie withing the field of view. if ((offset.dot(viewVector)) > cosFOV * offset.norm()) { @@ -10527,9 +10527,9 @@ void Renderer::renderMarkers(const MarkerList& markers, if (iter->object().body() != NULL) boundingRadius = iter->object().body()->getBoundingRadius(); else - boundingRadius = iter->object().radius(); + boundingRadius = iter->object().radius(); offset *= (1.0 - boundingRadius * 1.01 / distance); - + addSortedAnnotation(&(iter->representation()), EMPTY_STRING, iter->representation().color(), offset.cast(), AlignLeft, VerticalAlignTop, symbolSize); @@ -10596,7 +10596,7 @@ void Renderer::loadTextures(Body* body) { body->getRings()->texture.find(textureResolution); } - + if (body->getGeometry() != InvalidResource) { Geometry* geometry = GetGeometryManager()->find(body->getGeometry()); @@ -10633,6 +10633,7 @@ void Renderer::addWatcher(RendererWatcher* watcher) watchers.insert(watchers.end(), watcher); } + void Renderer::removeWatcher(RendererWatcher* watcher) { list::iterator iter = @@ -10641,6 +10642,7 @@ void Renderer::removeWatcher(RendererWatcher* watcher) watchers.erase(iter); } + void Renderer::notifyWatchers() const { for (list::const_iterator iter = watchers.begin(); diff --git a/src/celengine/render.h b/src/celengine/render.h index 0b9174a2d..574e460d1 100644 --- a/src/celengine/render.h +++ b/src/celengine/render.h @@ -139,9 +139,9 @@ class Renderer I18nConstellationLabels = 0x800, DwarfPlanetLabels = 0x1000, MinorMoonLabels = 0x2000, - GlobularLabels = 0x4000, - BodyLabelMask = (PlanetLabels | DwarfPlanetLabels | MoonLabels | MinorMoonLabels | AsteroidLabels | SpacecraftLabels | CometLabels), - }; + GlobularLabels = 0x4000, + BodyLabelMask = (PlanetLabels | DwarfPlanetLabels | MoonLabels | MinorMoonLabels | AsteroidLabels | SpacecraftLabels | CometLabels), + }; enum { ShowNothing = 0x0000, @@ -174,7 +174,7 @@ class Renderer ShowTintedIllumination = 0x4000000, }; - enum StarStyle + enum StarStyle { FuzzyPointStars = 0, PointStars = 1, @@ -186,7 +186,7 @@ class Renderer static const int DefaultRenderFlags = Renderer::ShowStars | Renderer::ShowPlanets | Renderer::ShowGalaxies | - Renderer::ShowGlobulars | + Renderer::ShowGlobulars | Renderer::ShowCloudMaps | Renderer::ShowAtmospheres | Renderer::ShowEclipseShadows | @@ -249,14 +249,14 @@ class Renderer AlignLeft, AlignRight }; - + enum LabelVerticalAlignment { VerticalAlignCenter, VerticalAlignBottom, VerticalAlignTop, }; - + static const int MaxLabelLength = 48; struct Annotation { @@ -270,7 +270,7 @@ class Renderer bool operator<(const Annotation&) const; }; - + void addForegroundAnnotation(const MarkerRepresentation* markerRep, const std::string& labelText, Color color, @@ -300,12 +300,12 @@ class Renderer void endObjectAnnotations(); Eigen::Quaternionf getCameraOrientation() const; float getNearPlaneDistance() const; - + void clearAnnotations(std::vector&); - void clearSortedAnnotations(); + void clearSortedAnnotations(); void invalidateOrbitCache(); - + struct OrbitPathListEntry { float centerZ; @@ -316,7 +316,7 @@ class Renderer float opacity; bool operator<(const OrbitPathListEntry&) const; - }; + }; enum FontStyle { @@ -324,7 +324,7 @@ class Renderer FontLarge = 1, FontCount = 2, }; - + void setFont(FontStyle, TextureFont*); TextureFont* getFont(FontStyle) const; @@ -338,7 +338,7 @@ class Renderer public: // Internal types // TODO: Figure out how to make these private. Even with a friend - // + // struct Particle { Eigen::Vector3f center; @@ -419,7 +419,7 @@ class Renderer typedef ObjectLabel StarLabel; typedef ObjectLabel DSOLabel; // currently not used - + struct DepthBufferPartition { int index; @@ -491,7 +491,7 @@ class Renderer const Eigen::Quaternionf& orientation, double now, float, float); - + void renderReferenceMark(const ReferenceMark& refMark, const Eigen::Vector3f& pos, float distance, @@ -533,8 +533,8 @@ class Renderer void renderLocations(const Body& body, const Eigen::Vector3d& bodyPosition, const Eigen::Quaterniond& bodyOrientation); - - // Render an item from the render list + + // Render an item from the render list void renderItem(const RenderListEntry& rle, const Observer& observer, const Eigen::Quaternionf& cameraOrientation, @@ -551,8 +551,8 @@ class Renderer const Observer& observer); void renderParticles(const std::vector& particles, const Eigen::Quaternionf& orientation); - - + + void addAnnotation(std::vector&, const MarkerRepresentation*, const std::string& labelText, @@ -654,7 +654,7 @@ class Renderer Eigen::Quaternionf m_cameraOrientation; StarVertexBuffer* starVertexBuffer; PointStarVertexBuffer* pointStarVertexBuffer; - PointStarVertexBuffer* glareVertexBuffer; + PointStarVertexBuffer* glareVertexBuffer; std::vector renderList; std::vector secondaryIlluminators; std::vector depthPartitions; @@ -679,7 +679,7 @@ class Renderer bool useClampToBorder; unsigned int textureResolution; DetailOptions detailOptions; - + bool useNewStarRendering; uint32 frameCount; @@ -689,11 +689,11 @@ class Renderer public: #if 0 - struct OrbitSample + struct OrbitSample { double t; Point3d pos; - + OrbitSample(const Eigen::Vector3d& _pos, double _t) : t(_t), pos(_pos.x(), _pos.y(), _pos.z()) { } OrbitSample() { } }; @@ -703,7 +703,7 @@ class Renderer Capsuled boundingVolume; uint32 firstSample; }; - + struct CachedOrbit { std::vector trajectory; @@ -727,7 +727,7 @@ class Renderer SkyContourPoint* skyContour; const ColorTemperatureTable* colorTemp; - + Selection highlightObject; bool videoSync; @@ -737,7 +737,7 @@ class Renderer bool objectAnnotationSetOpen; double realTime; - + // Location markers public: MarkerRepresentation mountainRep; @@ -764,8 +764,8 @@ class Renderer static Color SpacecraftLabelColor; static Color LocationLabelColor; static Color GalaxyLabelColor; - static Color GlobularLabelColor; - static Color NebulaLabelColor; + static Color GlobularLabelColor; + static Color NebulaLabelColor; static Color OpenClusterLabelColor; static Color ConstellationLabelColor; static Color EquatorialGridLabelColor; diff --git a/src/celengine/renderglsl.cpp b/src/celengine/renderglsl.cpp index 15644440b..863ec5697 100644 --- a/src/celengine/renderglsl.cpp +++ b/src/celengine/renderglsl.cpp @@ -65,7 +65,7 @@ void renderEllipsoid_GLSL(const RenderInfo& ri, { float radius = semiAxes.maxCoeff(); - Texture* textures[MAX_SPHERE_MESH_TEXTURES] = + Texture* textures[MAX_SPHERE_MESH_TEXTURES] = { NULL, NULL, NULL, NULL, NULL, NULL }; unsigned int nTextures = 0; @@ -186,7 +186,7 @@ void renderEllipsoid_GLSL(const RenderInfo& ri, // Track the total number of shadows; if there are too many, we'll have // to fall back to multipass. unsigned int totalShadows = 0; - + for (unsigned int li = 0; li < ls.nLights; li++) { if (ls.shadows[li] && !ls.shadows[li]->empty()) @@ -205,7 +205,7 @@ void renderEllipsoid_GLSL(const RenderInfo& ri, glActiveTextureARB(GL_TEXTURE0_ARB + nTextures); ringsTex->bind(); nTextures++; - + // Tweak the texture--set clamp to border and a border color with // a zero alpha. float bc[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -225,8 +225,8 @@ void renderEllipsoid_GLSL(const RenderInfo& ri, } } } - - + + // Get a shader for the current rendering configuration CelestiaGLProgram* prog = GetShaderManager().getShader(shadprop); if (prog == NULL) @@ -402,7 +402,7 @@ void renderClouds_GLSL(const RenderInfo& ri, { float radius = semiAxes.maxCoeff(); - Texture* textures[MAX_SPHERE_MESH_TEXTURES] = + Texture* textures[MAX_SPHERE_MESH_TEXTURES] = { NULL, NULL, NULL, NULL, NULL, NULL }; unsigned int nTextures = 0; @@ -448,7 +448,7 @@ void renderClouds_GLSL(const RenderInfo& ri, } } #endif - + if (atmosphere != NULL) { if (renderFlags & Renderer::ShowAtmospheres) @@ -502,7 +502,7 @@ void renderClouds_GLSL(const RenderInfo& ri, prog->ringWidth = 1.0f / (ringWidth / cloudRadius); } #endif - + if (shadprop.shadowCounts != 0) prog->setEclipseShadowParameters(ls, semiAxes, planetOrientation); diff --git a/src/celengine/renderglsl.h b/src/celengine/renderglsl.h index 0bfdc3f19..1fc298a7d 100644 --- a/src/celengine/renderglsl.h +++ b/src/celengine/renderglsl.h @@ -27,7 +27,7 @@ void renderEllipsoid_GLSL(const RenderInfo& ri, const Eigen::Quaternionf& planetOrientation, const Frustum& frustum, const GLContext& context); - + void renderGeometry_GLSL(Geometry* geometry, const RenderInfo& ri, ResourceHandle texOverride, @@ -37,7 +37,7 @@ void renderGeometry_GLSL(Geometry* geometry, int renderFlags, const Eigen::Quaternionf& planetOrientation, double tsec); - + void renderClouds_GLSL(const RenderInfo& ri, const LightingState& ls, Atmosphere* atmosphere, @@ -50,7 +50,7 @@ void renderClouds_GLSL(const RenderInfo& ri, const Eigen::Quaternionf& planetOrientation, const Frustum& frustum, const GLContext& context); - + void renderAtmosphere_GLSL(const RenderInfo& ri, const LightingState& ls, Atmosphere* atmosphere, @@ -58,7 +58,7 @@ void renderAtmosphere_GLSL(const RenderInfo& ri, const Eigen::Quaternionf& planetOrientation, const Frustum& frustum, const GLContext& context); - + void renderRings_GLSL(RingSystem& rings, RenderInfo& ri, const LightingState& ls, @@ -124,6 +124,5 @@ private: #endif // _CELENGINE_RENDERGLSL_H_ - diff --git a/src/celengine/selection.cpp b/src/celengine/selection.cpp index 0099ca6fe..adf1678d5 100644 --- a/src/celengine/selection.cpp +++ b/src/celengine/selection.cpp @@ -1,5 +1,5 @@ // selection.cpp -// +// // Copyright (C) 2001-2009, the Celestia Development Team // Original version by Chris Laurel // @@ -48,7 +48,7 @@ UniversalCoord Selection::getPosition(double t) const { case Type_Body: return body()->getPosition(t); - + case Type_Star: return star()->getPosition(t); @@ -59,7 +59,7 @@ UniversalCoord Selection::getPosition(double t) const Vector3f p = deepsky()->getPosition().cast(); return UniversalCoord::CreateLy(p.cast()); } - + case Type_Location: { Body* body = location()->getParentBody(); @@ -87,7 +87,7 @@ Vector3d Selection::getVelocity(double t) const { case Type_Body: return body()->getVelocity(t); - + case Type_Star: return star()->getVelocity(t); @@ -95,10 +95,10 @@ Vector3d Selection::getVelocity(double t) const return Vector3d::Zero(); case Type_Location: - { - // For now, just use differentiation for location velocities. + { + // For now, just use differentiation for location velocities. return getPosition(t).offsetFromKm(getPosition(t - VELOCITY_DIFF_DELTA)) / VELOCITY_DIFF_DELTA; - } + } default: return Vector3d::Zero(); @@ -123,7 +123,7 @@ string Selection::getName(bool i18n) const sprintf(buf, "#%d", deepsky()->getCatalogNumber()); return string(buf); } - + case Type_Body: { string name = body()->getName(i18n); @@ -191,7 +191,7 @@ Selection Selection::parent() const case Type_Star: return Selection(star()->getOrbitBarycenter()); - + case Type_DeepSky: // Currently no hierarchy for stars and deep sky objects. return Selection(); diff --git a/src/celengine/selection.h b/src/celengine/selection.h index c1d0e8e83..cda3bcb5b 100644 --- a/src/celengine/selection.h +++ b/src/celengine/selection.h @@ -1,5 +1,5 @@ // selection.h -// +// // Copyright (C) 2001, Chris Laurel // // This program is free software; you can redistribute it and/or diff --git a/src/celengine/shadermanager.cpp b/src/celengine/shadermanager.cpp index 496aba9d6..491e5cf76 100644 --- a/src/celengine/shadermanager.cpp +++ b/src/celengine/shadermanager.cpp @@ -1228,16 +1228,16 @@ Shadow(unsigned int light, unsigned int shadow) // surrounded by a ring of linear falloff from maxDepth to zero. For a total // eclipse, maxDepth is zero. In reality, the falloff function is much more complex: // to calculate the exact amount of sunlight blocked, we need to calculate the - // a circle-circle intersection area. + // a circle-circle intersection area. // (See http://mathworld.wolfram.com/Circle-CircleIntersection.html) - + // The code generated below will compute: // r = 2 * sqrt(dot(shadowCenter, shadowCenter)); // shadowR = clamp((r - 1) * shadowFalloff, 0, shadowMaxDepth) source += "shadowR = clamp((2.0 * sqrt(dot(shadowCenter, shadowCenter)) - 1.0) * " + IndexedParameter("shadowFalloff", light, shadow) + ", 0.0, " + IndexedParameter("shadowMaxDepth", light, shadow) + ");\n"; - + source += "shadow *= 1.0 - shadowR;\n"; return source; @@ -1537,7 +1537,7 @@ PointSizeCalculation() source += "float ptSize = pointScale * pointSize / length(vec3(gl_ModelViewMatrix * gl_Vertex));\n"; source += "pointFade = min(1.0, ptSize * ptSize);\n"; source += "gl_PointSize = ptSize;\n"; - + return source; } @@ -2036,7 +2036,7 @@ ShaderManager::buildFragmentShader(const ShaderProperties& props) { source += DeclareVarying("pointFade", Shader_Float); } - + source += "\nvoid main(void)\n{\n"; source += "vec4 color;\n"; @@ -2243,7 +2243,7 @@ ShaderManager::buildFragmentShader(const ShaderProperties& props) if (!props.usesTangentSpaceLighting()) { source += "float totalLight = "; - + if (props.nLights == 0) { source += "0.0f\n"; @@ -2763,7 +2763,7 @@ ShaderManager::buildEmissiveVertexShader(const ShaderProperties& props) source += " gl_TexCoord[0].st = " + TexCoord2D(0) + ";\n"; } - // Set the color. + // Set the color. string colorSource; if (props.texUsage & ShaderProperties::VertexColors) colorSource = "gl_Color.rgb"; @@ -2811,7 +2811,7 @@ ShaderManager::buildEmissiveFragmentShader(const ShaderProperties& props) { source += "varying float pointFade;\n"; } - + // Begin main() source += "\nvoid main(void)\n"; source += "{\n"; @@ -2825,7 +2825,7 @@ ShaderManager::buildEmissiveFragmentShader(const ShaderProperties& props) #endif colorSource = "color"; } - + if (props.texUsage & ShaderProperties::DiffuseTexture) { source += " gl_FragColor = " + colorSource + " * texture2D(diffTex, gl_TexCoord[0].st);\n"; @@ -2859,30 +2859,30 @@ GLVertexShader* ShaderManager::buildParticleVertexShader(const ShaderProperties& props) { ostringstream source; - + source << CommonHeader; - + source << "// PARTICLE SHADER\n"; source << "// shadow count: " << props.shadowCounts << endl; - + source << DeclareLights(props); - + source << "uniform vec3 eyePosition;\n"; // TODO: scattering constants - + if (props.texUsage & ShaderProperties::PointSprite) { source << "uniform float pointScale;\n"; source << "attribute float pointSize;\n"; } - + // Shadow parameters if (props.shadowCounts != 0) { source << "varying vec3 position_obj;\n"; } - + // Begin main() function source << "\nvoid main(void)\n{\n"; @@ -2913,26 +2913,26 @@ ShaderManager::buildParticleVertexShader(const ShaderProperties& props) { source << " gl_TexCoord[0].st = " << TexCoord2D(0) << ";\n"; } - + // Set the color. Should *always* use vertex colors for color and opacity. source << " gl_FrontColor = gl_Color * brightness;\n"; - + // Optional point size if ((props.texUsage & ShaderProperties::PointSprite) != 0) source << PointSizeCalculation(); - + source << " gl_Position = ftransform();\n"; - + source << "}\n"; // End of main() - + if (g_shaderLogFile != NULL) { *g_shaderLogFile << "Vertex shader source:\n"; DumpShaderSource(*g_shaderLogFile, source.str()); *g_shaderLogFile << endl; } - + GLVertexShader* vs = NULL; GLShaderStatus status = GLShaderLoader::CreateVertexShader(source.str(), &vs); if (status != ShaderStatus_OK) @@ -2948,7 +2948,7 @@ ShaderManager::buildParticleFragmentShader(const ShaderProperties& props) ostringstream source; source << CommonHeader; - + if (props.texUsage & ShaderProperties::DiffuseTexture) { source << "uniform sampler2D diffTex;\n"; @@ -2960,9 +2960,9 @@ ShaderManager::buildParticleFragmentShader(const ShaderProperties& props) for (unsigned int i = 0; i < props.nLights; i++) { source << "uniform vec3 " << FragLightProperty(i, "color") << ";\n"; - } + } } - + // Declare shadow parameters if (props.shadowCounts != 0) { @@ -2978,11 +2978,11 @@ ShaderManager::buildParticleFragmentShader(const ShaderProperties& props) } } } - + // Begin main() source << "\nvoid main(void)\n"; source << "{\n"; - + if (props.texUsage & ShaderProperties::DiffuseTexture) { source << " gl_FragColor = gl_Color * texture2D(diffTex, gl_TexCoord[0].st);\n"; @@ -2991,17 +2991,17 @@ ShaderManager::buildParticleFragmentShader(const ShaderProperties& props) { source << " gl_FragColor = gl_Color;\n"; } - + source << "}\n"; // End of main() - + if (g_shaderLogFile != NULL) { *g_shaderLogFile << "Fragment shader source:\n"; DumpShaderSource(*g_shaderLogFile, source.str()); *g_shaderLogFile << '\n'; } - + GLFragmentShader* fs = NULL; GLShaderStatus status = GLShaderLoader::CreateFragmentShader(source.str(), &fs); if (status != ShaderStatus_OK) @@ -3415,7 +3415,7 @@ CelestiaGLProgram::setEclipseShadowParameters(const LightingState& ls, // Compose the world-to-shadow matrix Matrix4f worldToShadow = shadowRotation * Affine3f(Scaling(1.0f / shadow.penumbraRadius)).matrix() * - Affine3f(Translation3f(-shadow.origin)).matrix(); + Affine3f(Translation3f(-shadow.origin)).matrix(); // Finally, multiply all the matrices together to get the mapping from // object space to shadow map space. @@ -3468,6 +3468,6 @@ CelestiaGLProgram::setAtmosphereParameters(const Atmosphere& atmosphere, // in the vertex shader. Vector3f tScatterCoeffSum = tRayleighCoeff.array() + tMieCoeff; scatterCoeffSum = tScatterCoeffSum; - invScatterCoeffSum = tScatterCoeffSum.cwiseInverse(); + invScatterCoeffSum = tScatterCoeffSum.cwiseInverse(); extinctionCoeff = tScatterCoeffSum + tAbsorptionCoeff; } diff --git a/src/celengine/shadermanager.h b/src/celengine/shadermanager.h index b054d7499..406f04a9f 100644 --- a/src/celengine/shadermanager.h +++ b/src/celengine/shadermanager.h @@ -79,7 +79,7 @@ class ShaderProperties EmissiveModel = 8, ParticleModel = 9, }; - + enum { VolumetricScatteringEffect = 0x0001, @@ -89,7 +89,7 @@ class ShaderProperties public: unsigned short nLights; - unsigned short texUsage; + unsigned short texUsage; unsigned short lightModel; // Eight bits per light, up to four lights @@ -99,16 +99,16 @@ class ShaderProperties // Bit 3, on for self shadowing // Bit 4, on for cloud shadows uint32 shadowCounts; - + // Effects that may be applied with any light model unsigned short effects; - + private: enum { ShadowBitsPerLight = 4, }; - + enum { EclipseShadowMask = 0x3, @@ -119,7 +119,7 @@ class ShaderProperties AnyRingShadowMask = 0x04040404, AnySelfShadowMask = 0x08080808, AnyCloudShadowMask = 0x10101010, - }; + }; }; @@ -149,7 +149,7 @@ class CelestiaGLProgram ~CelestiaGLProgram(); void use() const { program->use(); } - + void setLightParameters(const LightingState& ls, Color materialDiffuse, Color materialSpecular, @@ -164,7 +164,7 @@ class CelestiaGLProgram void setAtmosphereParameters(const Atmosphere& atmosphere, float atmPlanetRadius, float objRadius); - + public: CelestiaGLProgramLight lights[MaxShaderLights]; Vec3ShaderParameter fragLightColor[MaxShaderLights]; @@ -183,7 +183,7 @@ class CelestiaGLProgram FloatShaderParameter ringRadius; Vec4ShaderParameter ringPlane; Vec3ShaderParameter ringCenter; - + // Mix of Lambertian and "lunar" (Lommel-Seeliger) photometric models. // 0 = pure Lambertian, 1 = L-S FloatShaderParameter lunarLambert; @@ -195,7 +195,7 @@ class CelestiaGLProgram // Height of cloud layer above planet, in units of object radius FloatShaderParameter cloudHeight; FloatShaderParameter shadowTextureOffset; - + // Parameters for atmospheric scattering; all distances are normalized for // a unit sphere. FloatShaderParameter mieCoeff; @@ -204,21 +204,21 @@ class CelestiaGLProgram // A value of 0 is isotropic, negative values a primarily backscattering, // positive values are forward scattering. FloatShaderParameter miePhaseAsymmetry; - + // Rayleigh scattering terms. There are three scattering coefficients: red, - // green, and blue light. To simulate Rayleigh scattering, the coefficients + // green, and blue light. To simulate Rayleigh scattering, the coefficients // should be in ratios that fit 1/wavelength^4, but other values may be used // to simulate different types of wavelength dependent scattering. Vec3ShaderParameter rayleighCoeff; FloatShaderParameter rayleighScaleHeight; - + // Precomputed sum and inverse sum of Rayleigh and Mie scattering coefficients Vec3ShaderParameter scatterCoeffSum; Vec3ShaderParameter invScatterCoeffSum; // Precomputed sum of absorption and scattering coefficients--identical to // scatterCoeffSum when there is no absorption. Vec3ShaderParameter extinctionCoeff; - + // Radius of sphere for atmosphere--should be significantly larger than // scale height. Three components: // x = radius @@ -230,7 +230,7 @@ class CelestiaGLProgram FloatShaderParameter pointScale; CelestiaGLProgramShadow shadows[MaxShaderLights][MaxShaderEclipseShadows]; - + private: void initParameters(); void initSamplers(); @@ -254,13 +254,13 @@ class ShaderManager private: CelestiaGLProgram* buildProgram(const ShaderProperties&); - + GLVertexShader* buildVertexShader(const ShaderProperties&); GLFragmentShader* buildFragmentShader(const ShaderProperties&); - + GLVertexShader* buildRingsVertexShader(const ShaderProperties&); GLFragmentShader* buildRingsFragmentShader(const ShaderProperties&); - + GLVertexShader* buildAtmosphereVertexShader(const ShaderProperties&); GLFragmentShader* buildAtmosphereFragmentShader(const ShaderProperties&); diff --git a/src/celengine/simulation.h b/src/celengine/simulation.h index 540b6422e..256c38b93 100644 --- a/src/celengine/simulation.h +++ b/src/celengine/simulation.h @@ -63,7 +63,7 @@ class Simulation Selection findObjectFromPath(std::string s, bool i18n = false); std::vector getObjectCompletion(std::string s, bool withLocations = false); void gotoSelection(double gotoTime, - const Eigen::Vector3f& up, + const Eigen::Vector3f& up, ObserverFrame::CoordinateSystem upFrame); void gotoSelection(double gotoTime, double distance, const Eigen::Vector3f& up, @@ -113,7 +113,7 @@ class Simulation void setObserverMode(Observer::ObserverMode); Observer::ObserverMode getObserverMode() const; - void setFrame(ObserverFrame::CoordinateSystem, const Selection& refObject, const Selection& targetObject); + void setFrame(ObserverFrame::CoordinateSystem, const Selection& refObject, const Selection& targetObject); void setFrame(ObserverFrame::CoordinateSystem, const Selection& refObject); const ObserverFrame* getFrame() const; diff --git a/src/celengine/skygrid.cpp b/src/celengine/skygrid.cpp index 4b4ae3282..85e863fa4 100644 --- a/src/celengine/skygrid.cpp +++ b/src/celengine/skygrid.cpp @@ -96,7 +96,7 @@ static const int DEG_MIN_SEC_SPACING[] = 200*MSEC, 100*MSEC }; - + // Alternate spacing tables #if 0 @@ -107,7 +107,7 @@ static const int HOUR_MIN_SEC_SPACING[] = 2*HR, 1*HR, 30*MIN, 10*MIN, 5*MIN, 1*MIN, 30*SEC, 10*SEC, 5*SEC, 1*SEC, 500*MSEC, 100*MSEC -}; +}; static const int DEG_MIN_SEC_SPACING[] = { @@ -124,10 +124,10 @@ static const int HOUR_MIN_SEC_STEPS[] = 2*HR, 1*HR, 30*MIN, 10*MIN, 5*MIN, 2*MIN+30*SEC, 1*MIN, 30*SEC, 10*SEC, 5*SEC, 2*SEC+500*MSEC, 1*SEC, 500*MSEC, 200*MSEC, 100*MSEC, 50*MSEC, 20*MSEC, 10*MSEC -}; +}; static const int DEG_MIN_SEC_STEPS[] = -{ +{ 30*DEG, 10*DEG, 5*DEG, 2*DEG+30*MIN, 1*DEG, 30*MIN, 10*MIN, 5*MIN, 2*MIN+30*SEC, 1*MIN, 30*SEC, 10*SEC, 5*SEC, 2*SEC+500*MSEC, 1*SEC, 500*MSEC, 200*MSEC, 100*MSEC, @@ -233,7 +233,7 @@ template static bool planeCircleIntersection(const Matrix& T a = u.dot(planeNormal); T b = v.dot(planeNormal); T c = center.dot(planeNormal); - + // The solution is +-acos((-ac +- sqrt(a^2+b^2-c^2))/(a^2+b^2)) T s = a * a + b * b; if (s == 0.0) @@ -241,14 +241,14 @@ template static bool planeCircleIntersection(const Matrix& // No solution; plane containing circle is parallel to test plane return false; } - + if (s - c * c <= 0) { // One or no solutions; no need to distinguish between these // cases for our purposes. return false; } - + // No need to actually call acos to get the solution, since we're just // going to plug it into sin and cos anyhow. T r = b * std::sqrt(s - c * c); @@ -256,22 +256,22 @@ template static bool planeCircleIntersection(const Matrix& T cosTheta1 = (-a * c - r) / s; T sinTheta0 = std::sqrt(1 - cosTheta0 * cosTheta0); T sinTheta1 = std::sqrt(1 - cosTheta1 * cosTheta1); - + *sol0 = center + cosTheta0 * u + sinTheta0 * v; *sol1 = center + cosTheta1 * u + sinTheta1 * v; - + // Check that we've chosen a solution that produces a point on the // plane. If not, we need to use the -acos solution. if (std::abs(sol0->dot(planeNormal)) > 1.0e-8) { *sol0 = center + cosTheta0 * u - sinTheta0 * v; } - + if (std::abs(sol1->dot(planeNormal)) > 1.0e-8) { *sol1 = center + cosTheta1 * u - sinTheta1 * v; } - + return true; } @@ -332,7 +332,7 @@ SkyGrid::longitudeLabel(int longitude, int longitudeStep) const // eastward from due north. if (m_longitudeDirection == IncreasingClockwise) longitude = (totalUnits - longitude) % totalUnits; - + out << longitude / baseUnit << baseUnitSymbol; if (longitudeStep % baseUnit != 0) { @@ -351,7 +351,7 @@ SkyGrid::longitudeLabel(int longitude, int longitudeStep) const // Compute the angular step between parallels -int +int SkyGrid::parallelSpacing(double idealSpacing) const { // We want to use parallels and meridian spacings that are nice multiples of hours, degrees, @@ -367,7 +367,7 @@ SkyGrid::parallelSpacing(double idealSpacing) const break; spacing = DEG_MIN_SEC_SPACING[i]; } - + return spacing; } @@ -423,7 +423,7 @@ SkyGrid::render(Renderer& renderer, double diag = sqrt(1.0 + square(h) + square(h * viewAspectRatio)); double cosHalfFov = 1.0 / diag; double halfFov = acos(cosHalfFov); - + float polarCrossSize = (float) (POLAR_CROSS_SIZE * halfFov); // We want to avoid drawing more of the grid than we have to. The following code @@ -458,7 +458,7 @@ SkyGrid::render(Renderer& renderer, // Compute the minimum longitude range containing the corners; slightly // tricky because of the wrapping at PI/-PI. double minTheta = thetaC0; - double maxTheta = thetaC1; + double maxTheta = thetaC1; double maxDiff = 0.0; updateAngleRange(thetaC0, thetaC1, &maxDiff, &minTheta, &maxTheta); updateAngleRange(thetaC0, thetaC2, &maxDiff, &minTheta, &maxTheta); @@ -478,7 +478,7 @@ SkyGrid::render(Renderer& renderer, std::swap(minTheta, maxTheta); } maxTheta = minTheta + maxDiff; - + // Calculate the normals to the view frustum planes; we'll use these to // when computing intersection points with the parallels and meridians of the // grid. Coordinate labels will be drawn at the intersection points. @@ -487,7 +487,7 @@ SkyGrid::render(Renderer& renderer, frustumNormal[1] = Vector3d( 0, -1, -h); frustumNormal[2] = Vector3d( 1, 0, -w); frustumNormal[3] = Vector3d(-1, 0, -w); - + { for (int i = 0; i < 4; i++) { @@ -505,7 +505,7 @@ SkyGrid::render(Renderer& renderer, centerDec = -PI / 2.0; else centerDec = PI / 2.0; - + double minDec = centerDec - halfFov; double maxDec = centerDec + halfFov; @@ -586,7 +586,7 @@ SkyGrid::render(Renderer& renderer, glVertex3f(x, z, -y); // convert to Celestia coords } glEnd(); - + // Place labels at the intersections of the view frustum planes // and the parallels. Vector3d center(0.0, 0.0, sinPhi); @@ -616,20 +616,20 @@ SkyGrid::render(Renderer& renderer, glColor(m_lineColor); glEnd(); #endif - + Matrix3f m = observer.getOrientationf().toRotationMatrix(); p0 = orientationf.conjugate() * p0; p1 = orientationf.conjugate() * p1; - + if ((m * p0).z() < 0.0) { renderer.addBackgroundAnnotation(NULL, labelText, m_labelColor, p0, hAlign, vAlign); } - + if ((m * p1).z() < 0.0) { renderer.addBackgroundAnnotation(NULL, labelText, m_labelColor, p1, hAlign, vAlign); - } + } } } } @@ -662,7 +662,7 @@ SkyGrid::render(Renderer& renderer, glVertex3f(x, z, -y); // convert to Celestia coords } glEnd(); - + // Place labels at the intersections of the view frustum planes // and the meridians. Vector3d center(0.0, 0.0, 0.0); @@ -696,20 +696,20 @@ SkyGrid::render(Renderer& renderer, Matrix3f m = observer.getOrientationf().toRotationMatrix(); p0 = orientationf.conjugate() * p0; p1 = orientationf.conjugate() * p1; - + if ((m * p0).z() < 0.0 && axis0.dot(isect0) >= cosMaxMeridianAngle) { renderer.addBackgroundAnnotation(NULL, labelText, m_labelColor, p0, hAlign, vAlign); } - + if ((m * p1).z() < 0.0 && axis0.dot(isect1) >= cosMaxMeridianAngle) { renderer.addBackgroundAnnotation(NULL, labelText, m_labelColor, p1, hAlign, vAlign); - } + } } - } + } } - + // Draw crosses indicating the north and south poles glBegin(GL_LINES); glVertex3f(-polarCrossSize, 1.0f, 0.0f); @@ -721,6 +721,6 @@ SkyGrid::render(Renderer& renderer, glVertex3f(0.0f, -1.0f, -polarCrossSize); glVertex3f(0.0f, -1.0f, polarCrossSize); glEnd(); - + glPopMatrix(); } diff --git a/src/celengine/skygrid.h b/src/celengine/skygrid.h index 5a5bfa675..00d079b3b 100644 --- a/src/celengine/skygrid.h +++ b/src/celengine/skygrid.h @@ -38,7 +38,7 @@ public: IncreasingCounterclockwise, IncreasingClockwise, }; - + SkyGrid(); ~SkyGrid(); @@ -88,13 +88,13 @@ public: { m_longitudeUnits = longitudeUnits; } - + //! Get the direction of increasing longitude LongitudeDirection longitudeDirection() const { return m_longitudeDirection; } - + //! Set the direction of increasing longitude (clockwise or counterclockwise) void setLongitudeDirection(LongitudeDirection longitudeDirection) { diff --git a/src/celengine/solarsys.cpp b/src/celengine/solarsys.cpp index 9ebba8523..45f9b2105 100644 --- a/src/celengine/solarsys.cpp +++ b/src/celengine/solarsys.cpp @@ -368,7 +368,7 @@ TimelinePhase* CreateTimelinePhase(Body* body, } bodyFrame->addRef(); - // Use planet units (AU for semimajor axis) if the center of the orbit + // Use planet units (AU for semimajor axis) if the center of the orbit // reference frame is a star. bool usePlanetUnits = orbitFrame->getCenter().star() != NULL; @@ -497,7 +497,7 @@ static bool CreateTimeline(Body* body, defaultOrbitFrame = parentFrameTree->getDefaultReferenceFrame(); defaultBodyFrame = parentFrameTree->getDefaultReferenceFrame(); } - + // If there's an explicit timeline definition, parse that. Otherwise, we'll do // things the old way. Value* value = planetData->getValue("Timeline"); @@ -643,7 +643,7 @@ static bool CreateTimeline(Body* body, // for nearly all natural satellites in the solar system.) rotationModel = CreateDefaultRotationModel(syncRotationPeriod); } - + if (ParseDate(planetData, "Beginning", beginning)) overrideOldTimeline = true; if (ParseDate(planetData, "Ending", ending)) @@ -730,7 +730,7 @@ static Body* CreateBody(const string& name, body = new Body(system, name); // If the body doesn't exist, always treat the disposition as 'Add' disposition = AddObject; - + // Set the default classification for new objects based on the body type. // This may be overridden by the Class property. if (bodyType == SurfaceObject) @@ -1009,7 +1009,7 @@ static Body* CreateBody(const string& name, } } } - + bool clickable = true; if (planetData->getBoolean("Clickable", clickable)) { @@ -1131,7 +1131,7 @@ bool LoadSolarSystemObjects(istream& in, sscError(tokenizer, "object name expected"); return false; } - + // The name list is a string with zero more names. Multiple names are // delimited by colons. string nameList = tokenizer.getStringValue().c_str(); @@ -1160,7 +1160,7 @@ bool LoadSolarSystemObjects(istream& in, Selection parent = universe.findPath(parentName, NULL, 0); PlanetarySystem* parentSystem = NULL; - + vector names; // Iterate through the string for names delimited // by ':', and insert them into the name list. @@ -1193,7 +1193,7 @@ bool LoadSolarSystemObjects(istream& in, bodyType = ReferencePoint; else if (itemType == "SurfaceObject") bodyType = SurfaceObject; - + if (bodyType != UnknownBodyType) { //bool orbitsPlanet = false; @@ -1249,7 +1249,7 @@ bool LoadSolarSystemObjects(istream& in, body = CreateReferencePoint(primaryName, parentSystem, universe, existingBody, objectData, directory, disposition); else body = CreateBody(primaryName, parentSystem, universe, existingBody, objectData, directory, disposition, bodyType); - + if (body != NULL && disposition == AddObject) { vector::const_iterator iter = names.begin(); @@ -1302,7 +1302,7 @@ bool LoadSolarSystemObjects(istream& in, } -SolarSystem::SolarSystem(Star* _star) : +SolarSystem::SolarSystem(Star* _star) : star(_star), planets(NULL), frameTree(NULL) diff --git a/src/celengine/spheremesh.cpp b/src/celengine/spheremesh.cpp index 28fb0668c..2f709e3e2 100644 --- a/src/celengine/spheremesh.cpp +++ b/src/celengine/spheremesh.cpp @@ -287,7 +287,7 @@ void SphereMesh::scale(const Vector3f& s) { // TODO: Make a fast special case for uniform scale factors, where // renormalization is not required. - Vector3f is = s.cwiseInverse(); + Vector3f is = s.cwiseInverse(); for (i = 0; i < nVertices; i++) { int n = i * 3; diff --git a/src/celengine/spheremesh.h b/src/celengine/spheremesh.h index f031aa0a4..3138b6114 100644 --- a/src/celengine/spheremesh.h +++ b/src/celengine/spheremesh.h @@ -1,5 +1,5 @@ // spheremesh.h -// +// // Copyright (C) 2001-2009, the Celestia Development Team // Original version by Chris Laurel // diff --git a/src/celengine/star.cpp b/src/celengine/star.cpp index a5119cd69..1e675cdb2 100644 --- a/src/celengine/star.cpp +++ b/src/celengine/star.cpp @@ -461,7 +461,7 @@ StarDetails::GetNormalStarDetails(StellarClass::SpectralClass specClass, SubclassNames[subclass], LumClassNames[lumClass]); } - + // Use the same properties for an unknown subclass as for subclass 5 if (subclass == StellarClass::Subclass_Unknown) { @@ -1067,8 +1067,8 @@ Star::getVelocity(double t) const const Orbit* orbit = getOrbit(); if (!orbit) { - // The star doesn't have a defined orbit, so the velocity is just - // zero. (This will change when stellar proper motion is implemented.) + // The star doesn't have a defined orbit, so the velocity is just + // zero. (This will change when stellar proper motion is implemented.) return Vector3d::Zero(); } else @@ -1077,13 +1077,13 @@ Star::getVelocity(double t) const if (barycenter == NULL) { - // Star orbit is defined around a fixed point, so the total velocity - // is just the star's orbit velocity. + // Star orbit is defined around a fixed point, so the total velocity + // is just the star's orbit velocity. return orbit->velocityAtTime(t); } else { - // Sum the star's orbital velocity and the velocity of the barycenter. + // Sum the star's orbital velocity and the velocity of the barycenter. return barycenter->getVelocity(t) + orbit->velocityAtTime(t); } } diff --git a/src/celengine/star.h b/src/celengine/star.h index eb827c0a6..101c27b87 100644 --- a/src/celengine/star.h +++ b/src/celengine/star.h @@ -34,7 +34,7 @@ class StarDetails StarDetails(const StarDetails&); ~StarDetails(); - + private: // Prohibit assignment of StarDetails objects StarDetails& operator=(const StarDetails&); @@ -70,7 +70,7 @@ class StarDetails void setInfoURL(const std::string& _infoURL); bool shared() const; - + enum { KnowRadius = 0x1, @@ -106,7 +106,7 @@ class StarDetails Eigen::Vector3f semiAxes; std::string* infoURL; - + std::vector* orbitingStars; bool isShared; @@ -117,7 +117,7 @@ class StarDetails MultiResTexture neutronStarTex; MultiResTexture starTex[StellarClass::Spectral_Count]; }; - + public: static StarDetails* GetStarDetails(const StellarClass&); static StarDetails* CreateStandardStarType(const std::string& _specType, @@ -132,9 +132,9 @@ class StarDetails static StarDetails* GetNeutronStarDetails(); static StarDetails* GetBlackHoleDetails(); static StarDetails* GetBarycenterDetails(); - + static void SetStarTextures(const StarTextureSet&); - + private: static StarTextureSet starTextures; }; diff --git a/src/celengine/starbrowser.cpp b/src/celengine/starbrowser.cpp index 78fb5f236..7899282e7 100644 --- a/src/celengine/starbrowser.cpp +++ b/src/celengine/starbrowser.cpp @@ -1,5 +1,5 @@ // starbrowser.cpp -// +// // Copyright (C) 2001, Chris Laurel // // Star browser tool for Celestia. @@ -36,7 +36,7 @@ struct CloserStarPredicate Vector3f v0 = p0 * 1.0e6f - pos; Vector3f v1 = p1 * 1.0e6f - pos; - return (v0.squaredNorm() < v1.squaredNorm()); + return (v0.squaredNorm() < v1.squaredNorm()); } }; diff --git a/src/celengine/starbrowser.h b/src/celengine/starbrowser.h index 45d40ca81..0ffc9d907 100644 --- a/src/celengine/starbrowser.h +++ b/src/celengine/starbrowser.h @@ -1,5 +1,5 @@ // starbrowser.h -// +// // Copyright (C) 2001, Chris Laurel // // Star browser tool for celestia. diff --git a/src/celengine/starcolors.cpp b/src/celengine/starcolors.cpp index 67f43ace9..10dd177a6 100644 --- a/src/celengine/starcolors.cpp +++ b/src/celengine/starcolors.cpp @@ -66,407 +66,407 @@ Color StarColors_Enhanced[41] = // http://www.vendian.org/mncharity/dir3/blackbody/ Color StarColors_Blackbody_2deg_D65[401] = { - Color(0.0000f, 0.0000f, 0.0000f), // T= 0K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 100K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 200K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 300K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 400K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 500K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 600K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 700K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 800K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 900K P=2.472e+06 - Color(1.0000f, 0.0337f, 0.0000f), // T= 1000K P=2.472e+06 - Color(1.0000f, 0.0592f, 0.0000f), // T= 1100K P=2.112e+07 - Color(1.0000f, 0.0846f, 0.0000f), // T= 1200K P=1.282e+08 - Color(1.0000f, 0.1096f, 0.0000f), // T= 1300K P=5.959e+08 - Color(1.0000f, 0.1341f, 0.0000f), // T= 1400K P=2.243e+09 - Color(1.0000f, 0.1578f, 0.0000f), // T= 1500K P=7.121e+09 - Color(1.0000f, 0.1806f, 0.0000f), // T= 1600K P=1.967e+10 - Color(1.0000f, 0.2025f, 0.0000f), // T= 1700K P=4.839e+10 - Color(1.0000f, 0.2235f, 0.0000f), // T= 1800K P=1.081e+11 - Color(1.0000f, 0.2434f, 0.0000f), // T= 1900K P=2.224e+11 - Color(1.0000f, 0.2647f, 0.0033f), // T= 2000K P=4.268e+11 - Color(1.0000f, 0.2889f, 0.0120f), // T= 2100K P=7.710e+11 - Color(1.0000f, 0.3126f, 0.0219f), // T= 2200K P=1.322e+12 - Color(1.0000f, 0.3360f, 0.0331f), // T= 2300K P=2.166e+12 - Color(1.0000f, 0.3589f, 0.0454f), // T= 2400K P=3.408e+12 - Color(1.0000f, 0.3814f, 0.0588f), // T= 2500K P=5.178e+12 - Color(1.0000f, 0.4034f, 0.0734f), // T= 2600K P=7.624e+12 - Color(1.0000f, 0.4250f, 0.0889f), // T= 2700K P=1.092e+13 - Color(1.0000f, 0.4461f, 0.1054f), // T= 2800K P=1.524e+13 - Color(1.0000f, 0.4668f, 0.1229f), // T= 2900K P=2.081e+13 - Color(1.0000f, 0.4870f, 0.1411f), // T= 3000K P=2.784e+13 - Color(1.0000f, 0.5067f, 0.1602f), // T= 3100K P=3.657e+13 - Color(1.0000f, 0.5259f, 0.1800f), // T= 3200K P=4.725e+13 - Color(1.0000f, 0.5447f, 0.2005f), // T= 3300K P=6.012e+13 - Color(1.0000f, 0.5630f, 0.2216f), // T= 3400K P=7.545e+13 - Color(1.0000f, 0.5809f, 0.2433f), // T= 3500K P=9.349e+13 - Color(1.0000f, 0.5983f, 0.2655f), // T= 3600K P=1.145e+14 - Color(1.0000f, 0.6153f, 0.2881f), // T= 3700K P=1.387e+14 - Color(1.0000f, 0.6318f, 0.3112f), // T= 3800K P=1.665e+14 - Color(1.0000f, 0.6480f, 0.3346f), // T= 3900K P=1.979e+14 - Color(1.0000f, 0.6636f, 0.3583f), // T= 4000K P=2.333e+14 - Color(1.0000f, 0.6789f, 0.3823f), // T= 4100K P=2.729e+14 - Color(1.0000f, 0.6938f, 0.4066f), // T= 4200K P=3.169e+14 - Color(1.0000f, 0.7083f, 0.4310f), // T= 4300K P=3.654e+14 - Color(1.0000f, 0.7223f, 0.4556f), // T= 4400K P=4.188e+14 - Color(1.0000f, 0.7360f, 0.4803f), // T= 4500K P=4.771e+14 - Color(1.0000f, 0.7494f, 0.5051f), // T= 4600K P=5.406e+14 - Color(1.0000f, 0.7623f, 0.5299f), // T= 4700K P=6.093e+14 - Color(1.0000f, 0.7750f, 0.5548f), // T= 4800K P=6.835e+14 - Color(1.0000f, 0.7872f, 0.5797f), // T= 4900K P=7.632e+14 - Color(1.0000f, 0.7992f, 0.6045f), // T= 5000K P=8.485e+14 - Color(1.0000f, 0.8108f, 0.6293f), // T= 5100K P=9.396e+14 - Color(1.0000f, 0.8221f, 0.6541f), // T= 5200K P=1.036e+15 - Color(1.0000f, 0.8330f, 0.6787f), // T= 5300K P=1.139e+15 - Color(1.0000f, 0.8437f, 0.7032f), // T= 5400K P=1.248e+15 - Color(1.0000f, 0.8541f, 0.7277f), // T= 5500K P=1.363e+15 - Color(1.0000f, 0.8642f, 0.7519f), // T= 5600K P=1.484e+15 - Color(1.0000f, 0.8740f, 0.7760f), // T= 5700K P=1.611e+15 - Color(1.0000f, 0.8836f, 0.8000f), // T= 5800K P=1.744e+15 - Color(1.0000f, 0.8929f, 0.8238f), // T= 5900K P=1.883e+15 - Color(1.0000f, 0.9019f, 0.8473f), // T= 6000K P=2.028e+15 - Color(1.0000f, 0.9107f, 0.8707f), // T= 6100K P=2.179e+15 - Color(1.0000f, 0.9193f, 0.8939f), // T= 6200K P=2.337e+15 - Color(1.0000f, 0.9276f, 0.9168f), // T= 6300K P=2.500e+15 - Color(1.0000f, 0.9357f, 0.9396f), // T= 6400K P=2.669e+15 - Color(1.0000f, 0.9436f, 0.9621f), // T= 6500K P=2.845e+15 - Color(1.0000f, 0.9513f, 0.9844f), // T= 6600K P=3.026e+15 - Color(0.9937f, 0.9526f, 1.0000f), // T= 6700K P=3.214e+15 - Color(0.9726f, 0.9395f, 1.0000f), // T= 6800K P=3.407e+15 - Color(0.9526f, 0.9270f, 1.0000f), // T= 6900K P=3.606e+15 - Color(0.9337f, 0.9150f, 1.0000f), // T= 7000K P=3.811e+15 - Color(0.9157f, 0.9035f, 1.0000f), // T= 7100K P=4.022e+15 - Color(0.8986f, 0.8925f, 1.0000f), // T= 7200K P=4.238e+15 - Color(0.8823f, 0.8819f, 1.0000f), // T= 7300K P=4.460e+15 - Color(0.8668f, 0.8718f, 1.0000f), // T= 7400K P=4.688e+15 - Color(0.8520f, 0.8621f, 1.0000f), // T= 7500K P=4.920e+15 - Color(0.8379f, 0.8527f, 1.0000f), // T= 7600K P=5.159e+15 - Color(0.8244f, 0.8437f, 1.0000f), // T= 7700K P=5.402e+15 - Color(0.8115f, 0.8351f, 1.0000f), // T= 7800K P=5.651e+15 - Color(0.7992f, 0.8268f, 1.0000f), // T= 7900K P=5.906e+15 - Color(0.7874f, 0.8187f, 1.0000f), // T= 8000K P=6.165e+15 - Color(0.7761f, 0.8110f, 1.0000f), // T= 8100K P=6.429e+15 - Color(0.7652f, 0.8035f, 1.0000f), // T= 8200K P=6.698e+15 - Color(0.7548f, 0.7963f, 1.0000f), // T= 8300K P=6.973e+15 - Color(0.7449f, 0.7894f, 1.0000f), // T= 8400K P=7.252e+15 - Color(0.7353f, 0.7827f, 1.0000f), // T= 8500K P=7.535e+15 - Color(0.7260f, 0.7762f, 1.0000f), // T= 8600K P=7.824e+15 - Color(0.7172f, 0.7699f, 1.0000f), // T= 8700K P=8.117e+15 - Color(0.7086f, 0.7638f, 1.0000f), // T= 8800K P=8.415e+15 - Color(0.7004f, 0.7579f, 1.0000f), // T= 8900K P=8.717e+15 - Color(0.6925f, 0.7522f, 1.0000f), // T= 9000K P=9.023e+15 - Color(0.6848f, 0.7467f, 1.0000f), // T= 9100K P=9.334e+15 - Color(0.6774f, 0.7414f, 1.0000f), // T= 9200K P=9.649e+15 - Color(0.6703f, 0.7362f, 1.0000f), // T= 9300K P=9.969e+15 - Color(0.6635f, 0.7311f, 1.0000f), // T= 9400K P=1.029e+16 - Color(0.6568f, 0.7263f, 1.0000f), // T= 9500K P=1.062e+16 - Color(0.6504f, 0.7215f, 1.0000f), // T= 9600K P=1.095e+16 - Color(0.6442f, 0.7169f, 1.0000f), // T= 9700K P=1.129e+16 - Color(0.6382f, 0.7124f, 1.0000f), // T= 9800K P=1.163e+16 - Color(0.6324f, 0.7081f, 1.0000f), // T= 9900K P=1.197e+16 - Color(0.6268f, 0.7039f, 1.0000f), // T= 10000K P=1.231e+16 - Color(0.6213f, 0.6998f, 1.0000f), // T= 10100K P=1.267e+16 - Color(0.6161f, 0.6958f, 1.0000f), // T= 10200K P=1.302e+16 - Color(0.6109f, 0.6919f, 1.0000f), // T= 10300K P=1.338e+16 - Color(0.6060f, 0.6881f, 1.0000f), // T= 10400K P=1.374e+16 - Color(0.6012f, 0.6844f, 1.0000f), // T= 10500K P=1.410e+16 - Color(0.5965f, 0.6808f, 1.0000f), // T= 10600K P=1.447e+16 - Color(0.5919f, 0.6773f, 1.0000f), // T= 10700K P=1.484e+16 - Color(0.5875f, 0.6739f, 1.0000f), // T= 10800K P=1.521e+16 - Color(0.5833f, 0.6706f, 1.0000f), // T= 10900K P=1.559e+16 - Color(0.5791f, 0.6674f, 1.0000f), // T= 11000K P=1.597e+16 - Color(0.5750f, 0.6642f, 1.0000f), // T= 11100K P=1.636e+16 - Color(0.5711f, 0.6611f, 1.0000f), // T= 11200K P=1.674e+16 - Color(0.5673f, 0.6581f, 1.0000f), // T= 11300K P=1.713e+16 - Color(0.5636f, 0.6552f, 1.0000f), // T= 11400K P=1.752e+16 - Color(0.5599f, 0.6523f, 1.0000f), // T= 11500K P=1.792e+16 - Color(0.5564f, 0.6495f, 1.0000f), // T= 11600K P=1.832e+16 - Color(0.5530f, 0.6468f, 1.0000f), // T= 11700K P=1.872e+16 - Color(0.5496f, 0.6441f, 1.0000f), // T= 11800K P=1.912e+16 - Color(0.5463f, 0.6415f, 1.0000f), // T= 11900K P=1.953e+16 - Color(0.5431f, 0.6389f, 1.0000f), // T= 12000K P=1.994e+16 - Color(0.5400f, 0.6364f, 1.0000f), // T= 12100K P=2.035e+16 - Color(0.5370f, 0.6340f, 1.0000f), // T= 12200K P=2.076e+16 - Color(0.5340f, 0.6316f, 1.0000f), // T= 12300K P=2.118e+16 - Color(0.5312f, 0.6293f, 1.0000f), // T= 12400K P=2.160e+16 - Color(0.5283f, 0.6270f, 1.0000f), // T= 12500K P=2.202e+16 - Color(0.5256f, 0.6247f, 1.0000f), // T= 12600K P=2.244e+16 - Color(0.5229f, 0.6225f, 1.0000f), // T= 12700K P=2.287e+16 - Color(0.5203f, 0.6204f, 1.0000f), // T= 12800K P=2.330e+16 - Color(0.5177f, 0.6183f, 1.0000f), // T= 12900K P=2.373e+16 - Color(0.5152f, 0.6162f, 1.0000f), // T= 13000K P=2.416e+16 - Color(0.5128f, 0.6142f, 1.0000f), // T= 13100K P=2.459e+16 - Color(0.5104f, 0.6122f, 1.0000f), // T= 13200K P=2.503e+16 - Color(0.5080f, 0.6103f, 1.0000f), // T= 13300K P=2.547e+16 - Color(0.5057f, 0.6084f, 1.0000f), // T= 13400K P=2.591e+16 - Color(0.5035f, 0.6065f, 1.0000f), // T= 13500K P=2.635e+16 - Color(0.5013f, 0.6047f, 1.0000f), // T= 13600K P=2.680e+16 - Color(0.4991f, 0.6029f, 1.0000f), // T= 13700K P=2.724e+16 - Color(0.4970f, 0.6012f, 1.0000f), // T= 13800K P=2.769e+16 - Color(0.4950f, 0.5994f, 1.0000f), // T= 13900K P=2.814e+16 - Color(0.4930f, 0.5978f, 1.0000f), // T= 14000K P=2.860e+16 - Color(0.4910f, 0.5961f, 1.0000f), // T= 14100K P=2.905e+16 - Color(0.4891f, 0.5945f, 1.0000f), // T= 14200K P=2.951e+16 - Color(0.4872f, 0.5929f, 1.0000f), // T= 14300K P=2.997e+16 - Color(0.4853f, 0.5913f, 1.0000f), // T= 14400K P=3.043e+16 - Color(0.4835f, 0.5898f, 1.0000f), // T= 14500K P=3.089e+16 - Color(0.4817f, 0.5882f, 1.0000f), // T= 14600K P=3.135e+16 - Color(0.4799f, 0.5868f, 1.0000f), // T= 14700K P=3.182e+16 - Color(0.4782f, 0.5853f, 1.0000f), // T= 14800K P=3.228e+16 - Color(0.4765f, 0.5839f, 1.0000f), // T= 14900K P=3.275e+16 - Color(0.4749f, 0.5824f, 1.0000f), // T= 15000K P=3.322e+16 - Color(0.4733f, 0.5811f, 1.0000f), // T= 15100K P=3.369e+16 - Color(0.4717f, 0.5797f, 1.0000f), // T= 15200K P=3.416e+16 - Color(0.4701f, 0.5784f, 1.0000f), // T= 15300K P=3.464e+16 - Color(0.4686f, 0.5770f, 1.0000f), // T= 15400K P=3.511e+16 - Color(0.4671f, 0.5757f, 1.0000f), // T= 15500K P=3.559e+16 - Color(0.4656f, 0.5745f, 1.0000f), // T= 15600K P=3.607e+16 - Color(0.4641f, 0.5732f, 1.0000f), // T= 15700K P=3.655e+16 - Color(0.4627f, 0.5720f, 1.0000f), // T= 15800K P=3.703e+16 - Color(0.4613f, 0.5708f, 1.0000f), // T= 15900K P=3.751e+16 - Color(0.4599f, 0.5696f, 1.0000f), // T= 16000K P=3.800e+16 - Color(0.4586f, 0.5684f, 1.0000f), // T= 16100K P=3.848e+16 - Color(0.4572f, 0.5673f, 1.0000f), // T= 16200K P=3.897e+16 - Color(0.4559f, 0.5661f, 1.0000f), // T= 16300K P=3.946e+16 - Color(0.4546f, 0.5650f, 1.0000f), // T= 16400K P=3.995e+16 - Color(0.4534f, 0.5639f, 1.0000f), // T= 16500K P=4.044e+16 - Color(0.4521f, 0.5628f, 1.0000f), // T= 16600K P=4.093e+16 - Color(0.4509f, 0.5617f, 1.0000f), // T= 16700K P=4.143e+16 - Color(0.4497f, 0.5607f, 1.0000f), // T= 16800K P=4.192e+16 - Color(0.4485f, 0.5597f, 1.0000f), // T= 16900K P=4.241e+16 - Color(0.4474f, 0.5586f, 1.0000f), // T= 17000K P=4.291e+16 - Color(0.4462f, 0.5576f, 1.0000f), // T= 17100K P=4.341e+16 - Color(0.4451f, 0.5566f, 1.0000f), // T= 17200K P=4.391e+16 - Color(0.4440f, 0.5557f, 1.0000f), // T= 17300K P=4.441e+16 - Color(0.4429f, 0.5547f, 1.0000f), // T= 17400K P=4.491e+16 - Color(0.4418f, 0.5538f, 1.0000f), // T= 17500K P=4.541e+16 - Color(0.4408f, 0.5528f, 1.0000f), // T= 17600K P=4.592e+16 - Color(0.4397f, 0.5519f, 1.0000f), // T= 17700K P=4.642e+16 - Color(0.4387f, 0.5510f, 1.0000f), // T= 17800K P=4.693e+16 - Color(0.4377f, 0.5501f, 1.0000f), // T= 17900K P=4.743e+16 - Color(0.4367f, 0.5492f, 1.0000f), // T= 18000K P=4.794e+16 - Color(0.4357f, 0.5483f, 1.0000f), // T= 18100K P=4.845e+16 - Color(0.4348f, 0.5475f, 1.0000f), // T= 18200K P=4.896e+16 - Color(0.4338f, 0.5466f, 1.0000f), // T= 18300K P=4.947e+16 - Color(0.4329f, 0.5458f, 1.0000f), // T= 18400K P=4.998e+16 - Color(0.4319f, 0.5450f, 1.0000f), // T= 18500K P=5.049e+16 - Color(0.4310f, 0.5442f, 1.0000f), // T= 18600K P=5.100e+16 - Color(0.4301f, 0.5434f, 1.0000f), // T= 18700K P=5.152e+16 - Color(0.4293f, 0.5426f, 1.0000f), // T= 18800K P=5.203e+16 - Color(0.4284f, 0.5418f, 1.0000f), // T= 18900K P=5.255e+16 - Color(0.4275f, 0.5410f, 1.0000f), // T= 19000K P=5.307e+16 - Color(0.4267f, 0.5403f, 1.0000f), // T= 19100K P=5.358e+16 - Color(0.4258f, 0.5395f, 1.0000f), // T= 19200K P=5.410e+16 - Color(0.4250f, 0.5388f, 1.0000f), // T= 19300K P=5.462e+16 - Color(0.4242f, 0.5381f, 1.0000f), // T= 19400K P=5.514e+16 - Color(0.4234f, 0.5373f, 1.0000f), // T= 19500K P=5.566e+16 - Color(0.4226f, 0.5366f, 1.0000f), // T= 19600K P=5.618e+16 - Color(0.4218f, 0.5359f, 1.0000f), // T= 19700K P=5.671e+16 - Color(0.4211f, 0.5352f, 1.0000f), // T= 19800K P=5.723e+16 - Color(0.4203f, 0.5345f, 1.0000f), // T= 19900K P=5.775e+16 - Color(0.4196f, 0.5339f, 1.0000f), // T= 20000K P=5.828e+16 - Color(0.4188f, 0.5332f, 1.0000f), // T= 20100K P=5.880e+16 - Color(0.4181f, 0.5325f, 1.0000f), // T= 20200K P=5.933e+16 - Color(0.4174f, 0.5319f, 1.0000f), // T= 20300K P=5.986e+16 - Color(0.4167f, 0.5312f, 1.0000f), // T= 20400K P=6.038e+16 - Color(0.4160f, 0.5306f, 1.0000f), // T= 20500K P=6.091e+16 - Color(0.4153f, 0.5300f, 1.0000f), // T= 20600K P=6.144e+16 - Color(0.4146f, 0.5293f, 1.0000f), // T= 20700K P=6.197e+16 - Color(0.4139f, 0.5287f, 1.0000f), // T= 20800K P=6.250e+16 - Color(0.4133f, 0.5281f, 1.0000f), // T= 20900K P=6.303e+16 - Color(0.4126f, 0.5275f, 1.0000f), // T= 21000K P=6.357e+16 - Color(0.4119f, 0.5269f, 1.0000f), // T= 21100K P=6.410e+16 - Color(0.4113f, 0.5264f, 1.0000f), // T= 21200K P=6.463e+16 - Color(0.4107f, 0.5258f, 1.0000f), // T= 21300K P=6.517e+16 - Color(0.4100f, 0.5252f, 1.0000f), // T= 21400K P=6.570e+16 - Color(0.4094f, 0.5246f, 1.0000f), // T= 21500K P=6.623e+16 - Color(0.4088f, 0.5241f, 1.0000f), // T= 21600K P=6.677e+16 - Color(0.4082f, 0.5235f, 1.0000f), // T= 21700K P=6.731e+16 - Color(0.4076f, 0.5230f, 1.0000f), // T= 21800K P=6.784e+16 - Color(0.4070f, 0.5224f, 1.0000f), // T= 21900K P=6.838e+16 - Color(0.4064f, 0.5219f, 1.0000f), // T= 22000K P=6.892e+16 - Color(0.4059f, 0.5214f, 1.0000f), // T= 22100K P=6.946e+16 - Color(0.4053f, 0.5209f, 1.0000f), // T= 22200K P=7.000e+16 - Color(0.4047f, 0.5203f, 1.0000f), // T= 22300K P=7.054e+16 - Color(0.4042f, 0.5198f, 1.0000f), // T= 22400K P=7.108e+16 - Color(0.4036f, 0.5193f, 1.0000f), // T= 22500K P=7.162e+16 - Color(0.4031f, 0.5188f, 1.0000f), // T= 22600K P=7.216e+16 - Color(0.4026f, 0.5183f, 1.0000f), // T= 22700K P=7.270e+16 - Color(0.4020f, 0.5178f, 1.0000f), // T= 22800K P=7.325e+16 - Color(0.4015f, 0.5174f, 1.0000f), // T= 22900K P=7.379e+16 - Color(0.4010f, 0.5169f, 1.0000f), // T= 23000K P=7.433e+16 - Color(0.4005f, 0.5164f, 1.0000f), // T= 23100K P=7.488e+16 - Color(0.4000f, 0.5159f, 1.0000f), // T= 23200K P=7.542e+16 - Color(0.3995f, 0.5155f, 1.0000f), // T= 23300K P=7.597e+16 - Color(0.3990f, 0.5150f, 1.0000f), // T= 23400K P=7.651e+16 - Color(0.3985f, 0.5146f, 1.0000f), // T= 23500K P=7.706e+16 - Color(0.3980f, 0.5141f, 1.0000f), // T= 23600K P=7.760e+16 - Color(0.3975f, 0.5137f, 1.0000f), // T= 23700K P=7.815e+16 - Color(0.3970f, 0.5132f, 1.0000f), // T= 23800K P=7.870e+16 - Color(0.3966f, 0.5128f, 1.0000f), // T= 23900K P=7.925e+16 - Color(0.3961f, 0.5123f, 1.0000f), // T= 24000K P=7.980e+16 - Color(0.3956f, 0.5119f, 1.0000f), // T= 24100K P=8.035e+16 - Color(0.3952f, 0.5115f, 1.0000f), // T= 24200K P=8.089e+16 - Color(0.3947f, 0.5111f, 1.0000f), // T= 24300K P=8.144e+16 - Color(0.3943f, 0.5107f, 1.0000f), // T= 24400K P=8.199e+16 - Color(0.3938f, 0.5103f, 1.0000f), // T= 24500K P=8.255e+16 - Color(0.3934f, 0.5098f, 1.0000f), // T= 24600K P=8.310e+16 - Color(0.3930f, 0.5094f, 1.0000f), // T= 24700K P=8.365e+16 - Color(0.3925f, 0.5090f, 1.0000f), // T= 24800K P=8.420e+16 - Color(0.3921f, 0.5086f, 1.0000f), // T= 24900K P=8.475e+16 - Color(0.3917f, 0.5083f, 1.0000f), // T= 25000K P=8.531e+16 - Color(0.3913f, 0.5079f, 1.0000f), // T= 25100K P=8.586e+16 - Color(0.3909f, 0.5075f, 1.0000f), // T= 25200K P=8.641e+16 - Color(0.3905f, 0.5071f, 1.0000f), // T= 25300K P=8.697e+16 - Color(0.3901f, 0.5067f, 1.0000f), // T= 25400K P=8.752e+16 - Color(0.3897f, 0.5064f, 1.0000f), // T= 25500K P=8.808e+16 - Color(0.3893f, 0.5060f, 1.0000f), // T= 25600K P=8.863e+16 - Color(0.3889f, 0.5056f, 1.0000f), // T= 25700K P=8.919e+16 - Color(0.3885f, 0.5053f, 1.0000f), // T= 25800K P=8.974e+16 - Color(0.3881f, 0.5049f, 1.0000f), // T= 25900K P=9.030e+16 - Color(0.3877f, 0.5045f, 1.0000f), // T= 26000K P=9.086e+16 - Color(0.3874f, 0.5042f, 1.0000f), // T= 26100K P=9.141e+16 - Color(0.3870f, 0.5038f, 1.0000f), // T= 26200K P=9.197e+16 - Color(0.3866f, 0.5035f, 1.0000f), // T= 26300K P=9.253e+16 - Color(0.3863f, 0.5032f, 1.0000f), // T= 26400K P=9.309e+16 - Color(0.3859f, 0.5028f, 1.0000f), // T= 26500K P=9.365e+16 - Color(0.3855f, 0.5025f, 1.0000f), // T= 26600K P=9.421e+16 - Color(0.3852f, 0.5021f, 1.0000f), // T= 26700K P=9.476e+16 - Color(0.3848f, 0.5018f, 1.0000f), // T= 26800K P=9.532e+16 - Color(0.3845f, 0.5015f, 1.0000f), // T= 26900K P=9.588e+16 - Color(0.3841f, 0.5012f, 1.0000f), // T= 27000K P=9.644e+16 - Color(0.3838f, 0.5008f, 1.0000f), // T= 27100K P=9.701e+16 - Color(0.3835f, 0.5005f, 1.0000f), // T= 27200K P=9.757e+16 - Color(0.3831f, 0.5002f, 1.0000f), // T= 27300K P=9.813e+16 - Color(0.3828f, 0.4999f, 1.0000f), // T= 27400K P=9.869e+16 - Color(0.3825f, 0.4996f, 1.0000f), // T= 27500K P=9.925e+16 - Color(0.3821f, 0.4993f, 1.0000f), // T= 27600K P=9.981e+16 - Color(0.3818f, 0.4990f, 1.0000f), // T= 27700K P=1.004e+17 - Color(0.3815f, 0.4987f, 1.0000f), // T= 27800K P=1.009e+17 - Color(0.3812f, 0.4984f, 1.0000f), // T= 27900K P=1.015e+17 - Color(0.3809f, 0.4981f, 1.0000f), // T= 28000K P=1.021e+17 - Color(0.3805f, 0.4978f, 1.0000f), // T= 28100K P=1.026e+17 - Color(0.3802f, 0.4975f, 1.0000f), // T= 28200K P=1.032e+17 - Color(0.3799f, 0.4972f, 1.0000f), // T= 28300K P=1.038e+17 - Color(0.3796f, 0.4969f, 1.0000f), // T= 28400K P=1.043e+17 - Color(0.3793f, 0.4966f, 1.0000f), // T= 28500K P=1.049e+17 - Color(0.3790f, 0.4963f, 1.0000f), // T= 28600K P=1.055e+17 - Color(0.3787f, 0.4960f, 1.0000f), // T= 28700K P=1.060e+17 - Color(0.3784f, 0.4958f, 1.0000f), // T= 28800K P=1.066e+17 - Color(0.3781f, 0.4955f, 1.0000f), // T= 28900K P=1.072e+17 - Color(0.3779f, 0.4952f, 1.0000f), // T= 29000K P=1.077e+17 - Color(0.3776f, 0.4949f, 1.0000f), // T= 29100K P=1.083e+17 - Color(0.3773f, 0.4947f, 1.0000f), // T= 29200K P=1.089e+17 - Color(0.3770f, 0.4944f, 1.0000f), // T= 29300K P=1.094e+17 - Color(0.3767f, 0.4941f, 1.0000f), // T= 29400K P=1.100e+17 - Color(0.3764f, 0.4939f, 1.0000f), // T= 29500K P=1.106e+17 - Color(0.3762f, 0.4936f, 1.0000f), // T= 29600K P=1.111e+17 - Color(0.3759f, 0.4934f, 1.0000f), // T= 29700K P=1.117e+17 - Color(0.3756f, 0.4931f, 1.0000f), // T= 29800K P=1.123e+17 - Color(0.3754f, 0.4928f, 1.0000f), // T= 29900K P=1.128e+17 - Color(0.3751f, 0.4926f, 1.0000f), // T= 30000K P=1.134e+17 - Color(0.3748f, 0.4923f, 1.0000f), // T= 30100K P=1.140e+17 - Color(0.3746f, 0.4921f, 1.0000f), // T= 30200K P=1.145e+17 - Color(0.3743f, 0.4918f, 1.0000f), // T= 30300K P=1.151e+17 - Color(0.3741f, 0.4916f, 1.0000f), // T= 30400K P=1.157e+17 - Color(0.3738f, 0.4914f, 1.0000f), // T= 30500K P=1.162e+17 - Color(0.3735f, 0.4911f, 1.0000f), // T= 30600K P=1.168e+17 - Color(0.3733f, 0.4909f, 1.0000f), // T= 30700K P=1.174e+17 - Color(0.3730f, 0.4906f, 1.0000f), // T= 30800K P=1.180e+17 - Color(0.3728f, 0.4904f, 1.0000f), // T= 30900K P=1.185e+17 - Color(0.3726f, 0.4902f, 1.0000f), // T= 31000K P=1.191e+17 - Color(0.3723f, 0.4899f, 1.0000f), // T= 31100K P=1.197e+17 - Color(0.3721f, 0.4897f, 1.0000f), // T= 31200K P=1.202e+17 - Color(0.3718f, 0.4895f, 1.0000f), // T= 31300K P=1.208e+17 - Color(0.3716f, 0.4893f, 1.0000f), // T= 31400K P=1.214e+17 - Color(0.3714f, 0.4890f, 1.0000f), // T= 31500K P=1.220e+17 - Color(0.3711f, 0.4888f, 1.0000f), // T= 31600K P=1.225e+17 - Color(0.3709f, 0.4886f, 1.0000f), // T= 31700K P=1.231e+17 - Color(0.3707f, 0.4884f, 1.0000f), // T= 31800K P=1.237e+17 - Color(0.3704f, 0.4881f, 1.0000f), // T= 31900K P=1.242e+17 - Color(0.3702f, 0.4879f, 1.0000f), // T= 32000K P=1.248e+17 - Color(0.3700f, 0.4877f, 1.0000f), // T= 32100K P=1.254e+17 - Color(0.3698f, 0.4875f, 1.0000f), // T= 32200K P=1.260e+17 - Color(0.3695f, 0.4873f, 1.0000f), // T= 32300K P=1.265e+17 - Color(0.3693f, 0.4871f, 1.0000f), // T= 32400K P=1.271e+17 - Color(0.3691f, 0.4869f, 1.0000f), // T= 32500K P=1.277e+17 - Color(0.3689f, 0.4867f, 1.0000f), // T= 32600K P=1.283e+17 - Color(0.3687f, 0.4864f, 1.0000f), // T= 32700K P=1.288e+17 - Color(0.3684f, 0.4862f, 1.0000f), // T= 32800K P=1.294e+17 - Color(0.3682f, 0.4860f, 1.0000f), // T= 32900K P=1.300e+17 - Color(0.3680f, 0.4858f, 1.0000f), // T= 33000K P=1.306e+17 - Color(0.3678f, 0.4856f, 1.0000f), // T= 33100K P=1.311e+17 - Color(0.3676f, 0.4854f, 1.0000f), // T= 33200K P=1.317e+17 - Color(0.3674f, 0.4852f, 1.0000f), // T= 33300K P=1.323e+17 - Color(0.3672f, 0.4850f, 1.0000f), // T= 33400K P=1.329e+17 - Color(0.3670f, 0.4848f, 1.0000f), // T= 33500K P=1.334e+17 - Color(0.3668f, 0.4847f, 1.0000f), // T= 33600K P=1.340e+17 - Color(0.3666f, 0.4845f, 1.0000f), // T= 33700K P=1.346e+17 - Color(0.3664f, 0.4843f, 1.0000f), // T= 33800K P=1.352e+17 - Color(0.3662f, 0.4841f, 1.0000f), // T= 33900K P=1.358e+17 - Color(0.3660f, 0.4839f, 1.0000f), // T= 34000K P=1.363e+17 - Color(0.3658f, 0.4837f, 1.0000f), // T= 34100K P=1.369e+17 - Color(0.3656f, 0.4835f, 1.0000f), // T= 34200K P=1.375e+17 - Color(0.3654f, 0.4833f, 1.0000f), // T= 34300K P=1.381e+17 - Color(0.3652f, 0.4831f, 1.0000f), // T= 34400K P=1.386e+17 - Color(0.3650f, 0.4830f, 1.0000f), // T= 34500K P=1.392e+17 - Color(0.3649f, 0.4828f, 1.0000f), // T= 34600K P=1.398e+17 - Color(0.3647f, 0.4826f, 1.0000f), // T= 34700K P=1.404e+17 - Color(0.3645f, 0.4824f, 1.0000f), // T= 34800K P=1.410e+17 - Color(0.3643f, 0.4822f, 1.0000f), // T= 34900K P=1.415e+17 - Color(0.3641f, 0.4821f, 1.0000f), // T= 35000K P=1.421e+17 - Color(0.3639f, 0.4819f, 1.0000f), // T= 35100K P=1.427e+17 - Color(0.3638f, 0.4817f, 1.0000f), // T= 35200K P=1.433e+17 - Color(0.3636f, 0.4815f, 1.0000f), // T= 35300K P=1.439e+17 - Color(0.3634f, 0.4814f, 1.0000f), // T= 35400K P=1.444e+17 - Color(0.3632f, 0.4812f, 1.0000f), // T= 35500K P=1.450e+17 - Color(0.3630f, 0.4810f, 1.0000f), // T= 35600K P=1.456e+17 - Color(0.3629f, 0.4809f, 1.0000f), // T= 35700K P=1.462e+17 - Color(0.3627f, 0.4807f, 1.0000f), // T= 35800K P=1.468e+17 - Color(0.3625f, 0.4805f, 1.0000f), // T= 35900K P=1.473e+17 - Color(0.3624f, 0.4804f, 1.0000f), // T= 36000K P=1.479e+17 - Color(0.3622f, 0.4802f, 1.0000f), // T= 36100K P=1.485e+17 - Color(0.3620f, 0.4800f, 1.0000f), // T= 36200K P=1.491e+17 - Color(0.3619f, 0.4799f, 1.0000f), // T= 36300K P=1.497e+17 - Color(0.3617f, 0.4797f, 1.0000f), // T= 36400K P=1.502e+17 - Color(0.3615f, 0.4796f, 1.0000f), // T= 36500K P=1.508e+17 - Color(0.3614f, 0.4794f, 1.0000f), // T= 36600K P=1.514e+17 - Color(0.3612f, 0.4792f, 1.0000f), // T= 36700K P=1.520e+17 - Color(0.3610f, 0.4791f, 1.0000f), // T= 36800K P=1.526e+17 - Color(0.3609f, 0.4789f, 1.0000f), // T= 36900K P=1.531e+17 - Color(0.3607f, 0.4788f, 1.0000f), // T= 37000K P=1.537e+17 - Color(0.3605f, 0.4786f, 1.0000f), // T= 37100K P=1.543e+17 - Color(0.3604f, 0.4785f, 1.0000f), // T= 37200K P=1.549e+17 - Color(0.3602f, 0.4783f, 1.0000f), // T= 37300K P=1.555e+17 - Color(0.3601f, 0.4782f, 1.0000f), // T= 37400K P=1.561e+17 - Color(0.3599f, 0.4780f, 1.0000f), // T= 37500K P=1.566e+17 - Color(0.3598f, 0.4779f, 1.0000f), // T= 37600K P=1.572e+17 - Color(0.3596f, 0.4777f, 1.0000f), // T= 37700K P=1.578e+17 - Color(0.3595f, 0.4776f, 1.0000f), // T= 37800K P=1.584e+17 - Color(0.3593f, 0.4774f, 1.0000f), // T= 37900K P=1.590e+17 - Color(0.3592f, 0.4773f, 1.0000f), // T= 38000K P=1.595e+17 - Color(0.3590f, 0.4771f, 1.0000f), // T= 38100K P=1.601e+17 - Color(0.3589f, 0.4770f, 1.0000f), // T= 38200K P=1.607e+17 - Color(0.3587f, 0.4768f, 1.0000f), // T= 38300K P=1.613e+17 - Color(0.3586f, 0.4767f, 1.0000f), // T= 38400K P=1.619e+17 - Color(0.3584f, 0.4766f, 1.0000f), // T= 38500K P=1.625e+17 - Color(0.3583f, 0.4764f, 1.0000f), // T= 38600K P=1.630e+17 - Color(0.3581f, 0.4763f, 1.0000f), // T= 38700K P=1.636e+17 - Color(0.3580f, 0.4761f, 1.0000f), // T= 38800K P=1.642e+17 - Color(0.3579f, 0.4760f, 1.0000f), // T= 38900K P=1.648e+17 - Color(0.3577f, 0.4759f, 1.0000f), // T= 39000K P=1.654e+17 - Color(0.3576f, 0.4757f, 1.0000f), // T= 39100K P=1.660e+17 - Color(0.3574f, 0.4756f, 1.0000f), // T= 39200K P=1.666e+17 - Color(0.3573f, 0.4755f, 1.0000f), // T= 39300K P=1.671e+17 - Color(0.3572f, 0.4753f, 1.0000f), // T= 39400K P=1.677e+17 - Color(0.3570f, 0.4752f, 1.0000f), // T= 39500K P=1.683e+17 - Color(0.3569f, 0.4751f, 1.0000f), // T= 39600K P=1.689e+17 - Color(0.3567f, 0.4749f, 1.0000f), // T= 39700K P=1.695e+17 - Color(0.3566f, 0.4748f, 1.0000f), // T= 39800K P=1.701e+17 - Color(0.3565f, 0.4747f, 1.0000f), // T= 39900K P=1.707e+17 - Color(0.3563f, 0.4745f, 1.0000f), // T= 40000K P=1.712e+17 + Color(0.0000f, 0.0000f, 0.0000f), // T= 0K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 100K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 200K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 300K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 400K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 500K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 600K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 700K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 800K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 900K P=2.472e+06 + Color(1.0000f, 0.0337f, 0.0000f), // T= 1000K P=2.472e+06 + Color(1.0000f, 0.0592f, 0.0000f), // T= 1100K P=2.112e+07 + Color(1.0000f, 0.0846f, 0.0000f), // T= 1200K P=1.282e+08 + Color(1.0000f, 0.1096f, 0.0000f), // T= 1300K P=5.959e+08 + Color(1.0000f, 0.1341f, 0.0000f), // T= 1400K P=2.243e+09 + Color(1.0000f, 0.1578f, 0.0000f), // T= 1500K P=7.121e+09 + Color(1.0000f, 0.1806f, 0.0000f), // T= 1600K P=1.967e+10 + Color(1.0000f, 0.2025f, 0.0000f), // T= 1700K P=4.839e+10 + Color(1.0000f, 0.2235f, 0.0000f), // T= 1800K P=1.081e+11 + Color(1.0000f, 0.2434f, 0.0000f), // T= 1900K P=2.224e+11 + Color(1.0000f, 0.2647f, 0.0033f), // T= 2000K P=4.268e+11 + Color(1.0000f, 0.2889f, 0.0120f), // T= 2100K P=7.710e+11 + Color(1.0000f, 0.3126f, 0.0219f), // T= 2200K P=1.322e+12 + Color(1.0000f, 0.3360f, 0.0331f), // T= 2300K P=2.166e+12 + Color(1.0000f, 0.3589f, 0.0454f), // T= 2400K P=3.408e+12 + Color(1.0000f, 0.3814f, 0.0588f), // T= 2500K P=5.178e+12 + Color(1.0000f, 0.4034f, 0.0734f), // T= 2600K P=7.624e+12 + Color(1.0000f, 0.4250f, 0.0889f), // T= 2700K P=1.092e+13 + Color(1.0000f, 0.4461f, 0.1054f), // T= 2800K P=1.524e+13 + Color(1.0000f, 0.4668f, 0.1229f), // T= 2900K P=2.081e+13 + Color(1.0000f, 0.4870f, 0.1411f), // T= 3000K P=2.784e+13 + Color(1.0000f, 0.5067f, 0.1602f), // T= 3100K P=3.657e+13 + Color(1.0000f, 0.5259f, 0.1800f), // T= 3200K P=4.725e+13 + Color(1.0000f, 0.5447f, 0.2005f), // T= 3300K P=6.012e+13 + Color(1.0000f, 0.5630f, 0.2216f), // T= 3400K P=7.545e+13 + Color(1.0000f, 0.5809f, 0.2433f), // T= 3500K P=9.349e+13 + Color(1.0000f, 0.5983f, 0.2655f), // T= 3600K P=1.145e+14 + Color(1.0000f, 0.6153f, 0.2881f), // T= 3700K P=1.387e+14 + Color(1.0000f, 0.6318f, 0.3112f), // T= 3800K P=1.665e+14 + Color(1.0000f, 0.6480f, 0.3346f), // T= 3900K P=1.979e+14 + Color(1.0000f, 0.6636f, 0.3583f), // T= 4000K P=2.333e+14 + Color(1.0000f, 0.6789f, 0.3823f), // T= 4100K P=2.729e+14 + Color(1.0000f, 0.6938f, 0.4066f), // T= 4200K P=3.169e+14 + Color(1.0000f, 0.7083f, 0.4310f), // T= 4300K P=3.654e+14 + Color(1.0000f, 0.7223f, 0.4556f), // T= 4400K P=4.188e+14 + Color(1.0000f, 0.7360f, 0.4803f), // T= 4500K P=4.771e+14 + Color(1.0000f, 0.7494f, 0.5051f), // T= 4600K P=5.406e+14 + Color(1.0000f, 0.7623f, 0.5299f), // T= 4700K P=6.093e+14 + Color(1.0000f, 0.7750f, 0.5548f), // T= 4800K P=6.835e+14 + Color(1.0000f, 0.7872f, 0.5797f), // T= 4900K P=7.632e+14 + Color(1.0000f, 0.7992f, 0.6045f), // T= 5000K P=8.485e+14 + Color(1.0000f, 0.8108f, 0.6293f), // T= 5100K P=9.396e+14 + Color(1.0000f, 0.8221f, 0.6541f), // T= 5200K P=1.036e+15 + Color(1.0000f, 0.8330f, 0.6787f), // T= 5300K P=1.139e+15 + Color(1.0000f, 0.8437f, 0.7032f), // T= 5400K P=1.248e+15 + Color(1.0000f, 0.8541f, 0.7277f), // T= 5500K P=1.363e+15 + Color(1.0000f, 0.8642f, 0.7519f), // T= 5600K P=1.484e+15 + Color(1.0000f, 0.8740f, 0.7760f), // T= 5700K P=1.611e+15 + Color(1.0000f, 0.8836f, 0.8000f), // T= 5800K P=1.744e+15 + Color(1.0000f, 0.8929f, 0.8238f), // T= 5900K P=1.883e+15 + Color(1.0000f, 0.9019f, 0.8473f), // T= 6000K P=2.028e+15 + Color(1.0000f, 0.9107f, 0.8707f), // T= 6100K P=2.179e+15 + Color(1.0000f, 0.9193f, 0.8939f), // T= 6200K P=2.337e+15 + Color(1.0000f, 0.9276f, 0.9168f), // T= 6300K P=2.500e+15 + Color(1.0000f, 0.9357f, 0.9396f), // T= 6400K P=2.669e+15 + Color(1.0000f, 0.9436f, 0.9621f), // T= 6500K P=2.845e+15 + Color(1.0000f, 0.9513f, 0.9844f), // T= 6600K P=3.026e+15 + Color(0.9937f, 0.9526f, 1.0000f), // T= 6700K P=3.214e+15 + Color(0.9726f, 0.9395f, 1.0000f), // T= 6800K P=3.407e+15 + Color(0.9526f, 0.9270f, 1.0000f), // T= 6900K P=3.606e+15 + Color(0.9337f, 0.9150f, 1.0000f), // T= 7000K P=3.811e+15 + Color(0.9157f, 0.9035f, 1.0000f), // T= 7100K P=4.022e+15 + Color(0.8986f, 0.8925f, 1.0000f), // T= 7200K P=4.238e+15 + Color(0.8823f, 0.8819f, 1.0000f), // T= 7300K P=4.460e+15 + Color(0.8668f, 0.8718f, 1.0000f), // T= 7400K P=4.688e+15 + Color(0.8520f, 0.8621f, 1.0000f), // T= 7500K P=4.920e+15 + Color(0.8379f, 0.8527f, 1.0000f), // T= 7600K P=5.159e+15 + Color(0.8244f, 0.8437f, 1.0000f), // T= 7700K P=5.402e+15 + Color(0.8115f, 0.8351f, 1.0000f), // T= 7800K P=5.651e+15 + Color(0.7992f, 0.8268f, 1.0000f), // T= 7900K P=5.906e+15 + Color(0.7874f, 0.8187f, 1.0000f), // T= 8000K P=6.165e+15 + Color(0.7761f, 0.8110f, 1.0000f), // T= 8100K P=6.429e+15 + Color(0.7652f, 0.8035f, 1.0000f), // T= 8200K P=6.698e+15 + Color(0.7548f, 0.7963f, 1.0000f), // T= 8300K P=6.973e+15 + Color(0.7449f, 0.7894f, 1.0000f), // T= 8400K P=7.252e+15 + Color(0.7353f, 0.7827f, 1.0000f), // T= 8500K P=7.535e+15 + Color(0.7260f, 0.7762f, 1.0000f), // T= 8600K P=7.824e+15 + Color(0.7172f, 0.7699f, 1.0000f), // T= 8700K P=8.117e+15 + Color(0.7086f, 0.7638f, 1.0000f), // T= 8800K P=8.415e+15 + Color(0.7004f, 0.7579f, 1.0000f), // T= 8900K P=8.717e+15 + Color(0.6925f, 0.7522f, 1.0000f), // T= 9000K P=9.023e+15 + Color(0.6848f, 0.7467f, 1.0000f), // T= 9100K P=9.334e+15 + Color(0.6774f, 0.7414f, 1.0000f), // T= 9200K P=9.649e+15 + Color(0.6703f, 0.7362f, 1.0000f), // T= 9300K P=9.969e+15 + Color(0.6635f, 0.7311f, 1.0000f), // T= 9400K P=1.029e+16 + Color(0.6568f, 0.7263f, 1.0000f), // T= 9500K P=1.062e+16 + Color(0.6504f, 0.7215f, 1.0000f), // T= 9600K P=1.095e+16 + Color(0.6442f, 0.7169f, 1.0000f), // T= 9700K P=1.129e+16 + Color(0.6382f, 0.7124f, 1.0000f), // T= 9800K P=1.163e+16 + Color(0.6324f, 0.7081f, 1.0000f), // T= 9900K P=1.197e+16 + Color(0.6268f, 0.7039f, 1.0000f), // T= 10000K P=1.231e+16 + Color(0.6213f, 0.6998f, 1.0000f), // T= 10100K P=1.267e+16 + Color(0.6161f, 0.6958f, 1.0000f), // T= 10200K P=1.302e+16 + Color(0.6109f, 0.6919f, 1.0000f), // T= 10300K P=1.338e+16 + Color(0.6060f, 0.6881f, 1.0000f), // T= 10400K P=1.374e+16 + Color(0.6012f, 0.6844f, 1.0000f), // T= 10500K P=1.410e+16 + Color(0.5965f, 0.6808f, 1.0000f), // T= 10600K P=1.447e+16 + Color(0.5919f, 0.6773f, 1.0000f), // T= 10700K P=1.484e+16 + Color(0.5875f, 0.6739f, 1.0000f), // T= 10800K P=1.521e+16 + Color(0.5833f, 0.6706f, 1.0000f), // T= 10900K P=1.559e+16 + Color(0.5791f, 0.6674f, 1.0000f), // T= 11000K P=1.597e+16 + Color(0.5750f, 0.6642f, 1.0000f), // T= 11100K P=1.636e+16 + Color(0.5711f, 0.6611f, 1.0000f), // T= 11200K P=1.674e+16 + Color(0.5673f, 0.6581f, 1.0000f), // T= 11300K P=1.713e+16 + Color(0.5636f, 0.6552f, 1.0000f), // T= 11400K P=1.752e+16 + Color(0.5599f, 0.6523f, 1.0000f), // T= 11500K P=1.792e+16 + Color(0.5564f, 0.6495f, 1.0000f), // T= 11600K P=1.832e+16 + Color(0.5530f, 0.6468f, 1.0000f), // T= 11700K P=1.872e+16 + Color(0.5496f, 0.6441f, 1.0000f), // T= 11800K P=1.912e+16 + Color(0.5463f, 0.6415f, 1.0000f), // T= 11900K P=1.953e+16 + Color(0.5431f, 0.6389f, 1.0000f), // T= 12000K P=1.994e+16 + Color(0.5400f, 0.6364f, 1.0000f), // T= 12100K P=2.035e+16 + Color(0.5370f, 0.6340f, 1.0000f), // T= 12200K P=2.076e+16 + Color(0.5340f, 0.6316f, 1.0000f), // T= 12300K P=2.118e+16 + Color(0.5312f, 0.6293f, 1.0000f), // T= 12400K P=2.160e+16 + Color(0.5283f, 0.6270f, 1.0000f), // T= 12500K P=2.202e+16 + Color(0.5256f, 0.6247f, 1.0000f), // T= 12600K P=2.244e+16 + Color(0.5229f, 0.6225f, 1.0000f), // T= 12700K P=2.287e+16 + Color(0.5203f, 0.6204f, 1.0000f), // T= 12800K P=2.330e+16 + Color(0.5177f, 0.6183f, 1.0000f), // T= 12900K P=2.373e+16 + Color(0.5152f, 0.6162f, 1.0000f), // T= 13000K P=2.416e+16 + Color(0.5128f, 0.6142f, 1.0000f), // T= 13100K P=2.459e+16 + Color(0.5104f, 0.6122f, 1.0000f), // T= 13200K P=2.503e+16 + Color(0.5080f, 0.6103f, 1.0000f), // T= 13300K P=2.547e+16 + Color(0.5057f, 0.6084f, 1.0000f), // T= 13400K P=2.591e+16 + Color(0.5035f, 0.6065f, 1.0000f), // T= 13500K P=2.635e+16 + Color(0.5013f, 0.6047f, 1.0000f), // T= 13600K P=2.680e+16 + Color(0.4991f, 0.6029f, 1.0000f), // T= 13700K P=2.724e+16 + Color(0.4970f, 0.6012f, 1.0000f), // T= 13800K P=2.769e+16 + Color(0.4950f, 0.5994f, 1.0000f), // T= 13900K P=2.814e+16 + Color(0.4930f, 0.5978f, 1.0000f), // T= 14000K P=2.860e+16 + Color(0.4910f, 0.5961f, 1.0000f), // T= 14100K P=2.905e+16 + Color(0.4891f, 0.5945f, 1.0000f), // T= 14200K P=2.951e+16 + Color(0.4872f, 0.5929f, 1.0000f), // T= 14300K P=2.997e+16 + Color(0.4853f, 0.5913f, 1.0000f), // T= 14400K P=3.043e+16 + Color(0.4835f, 0.5898f, 1.0000f), // T= 14500K P=3.089e+16 + Color(0.4817f, 0.5882f, 1.0000f), // T= 14600K P=3.135e+16 + Color(0.4799f, 0.5868f, 1.0000f), // T= 14700K P=3.182e+16 + Color(0.4782f, 0.5853f, 1.0000f), // T= 14800K P=3.228e+16 + Color(0.4765f, 0.5839f, 1.0000f), // T= 14900K P=3.275e+16 + Color(0.4749f, 0.5824f, 1.0000f), // T= 15000K P=3.322e+16 + Color(0.4733f, 0.5811f, 1.0000f), // T= 15100K P=3.369e+16 + Color(0.4717f, 0.5797f, 1.0000f), // T= 15200K P=3.416e+16 + Color(0.4701f, 0.5784f, 1.0000f), // T= 15300K P=3.464e+16 + Color(0.4686f, 0.5770f, 1.0000f), // T= 15400K P=3.511e+16 + Color(0.4671f, 0.5757f, 1.0000f), // T= 15500K P=3.559e+16 + Color(0.4656f, 0.5745f, 1.0000f), // T= 15600K P=3.607e+16 + Color(0.4641f, 0.5732f, 1.0000f), // T= 15700K P=3.655e+16 + Color(0.4627f, 0.5720f, 1.0000f), // T= 15800K P=3.703e+16 + Color(0.4613f, 0.5708f, 1.0000f), // T= 15900K P=3.751e+16 + Color(0.4599f, 0.5696f, 1.0000f), // T= 16000K P=3.800e+16 + Color(0.4586f, 0.5684f, 1.0000f), // T= 16100K P=3.848e+16 + Color(0.4572f, 0.5673f, 1.0000f), // T= 16200K P=3.897e+16 + Color(0.4559f, 0.5661f, 1.0000f), // T= 16300K P=3.946e+16 + Color(0.4546f, 0.5650f, 1.0000f), // T= 16400K P=3.995e+16 + Color(0.4534f, 0.5639f, 1.0000f), // T= 16500K P=4.044e+16 + Color(0.4521f, 0.5628f, 1.0000f), // T= 16600K P=4.093e+16 + Color(0.4509f, 0.5617f, 1.0000f), // T= 16700K P=4.143e+16 + Color(0.4497f, 0.5607f, 1.0000f), // T= 16800K P=4.192e+16 + Color(0.4485f, 0.5597f, 1.0000f), // T= 16900K P=4.241e+16 + Color(0.4474f, 0.5586f, 1.0000f), // T= 17000K P=4.291e+16 + Color(0.4462f, 0.5576f, 1.0000f), // T= 17100K P=4.341e+16 + Color(0.4451f, 0.5566f, 1.0000f), // T= 17200K P=4.391e+16 + Color(0.4440f, 0.5557f, 1.0000f), // T= 17300K P=4.441e+16 + Color(0.4429f, 0.5547f, 1.0000f), // T= 17400K P=4.491e+16 + Color(0.4418f, 0.5538f, 1.0000f), // T= 17500K P=4.541e+16 + Color(0.4408f, 0.5528f, 1.0000f), // T= 17600K P=4.592e+16 + Color(0.4397f, 0.5519f, 1.0000f), // T= 17700K P=4.642e+16 + Color(0.4387f, 0.5510f, 1.0000f), // T= 17800K P=4.693e+16 + Color(0.4377f, 0.5501f, 1.0000f), // T= 17900K P=4.743e+16 + Color(0.4367f, 0.5492f, 1.0000f), // T= 18000K P=4.794e+16 + Color(0.4357f, 0.5483f, 1.0000f), // T= 18100K P=4.845e+16 + Color(0.4348f, 0.5475f, 1.0000f), // T= 18200K P=4.896e+16 + Color(0.4338f, 0.5466f, 1.0000f), // T= 18300K P=4.947e+16 + Color(0.4329f, 0.5458f, 1.0000f), // T= 18400K P=4.998e+16 + Color(0.4319f, 0.5450f, 1.0000f), // T= 18500K P=5.049e+16 + Color(0.4310f, 0.5442f, 1.0000f), // T= 18600K P=5.100e+16 + Color(0.4301f, 0.5434f, 1.0000f), // T= 18700K P=5.152e+16 + Color(0.4293f, 0.5426f, 1.0000f), // T= 18800K P=5.203e+16 + Color(0.4284f, 0.5418f, 1.0000f), // T= 18900K P=5.255e+16 + Color(0.4275f, 0.5410f, 1.0000f), // T= 19000K P=5.307e+16 + Color(0.4267f, 0.5403f, 1.0000f), // T= 19100K P=5.358e+16 + Color(0.4258f, 0.5395f, 1.0000f), // T= 19200K P=5.410e+16 + Color(0.4250f, 0.5388f, 1.0000f), // T= 19300K P=5.462e+16 + Color(0.4242f, 0.5381f, 1.0000f), // T= 19400K P=5.514e+16 + Color(0.4234f, 0.5373f, 1.0000f), // T= 19500K P=5.566e+16 + Color(0.4226f, 0.5366f, 1.0000f), // T= 19600K P=5.618e+16 + Color(0.4218f, 0.5359f, 1.0000f), // T= 19700K P=5.671e+16 + Color(0.4211f, 0.5352f, 1.0000f), // T= 19800K P=5.723e+16 + Color(0.4203f, 0.5345f, 1.0000f), // T= 19900K P=5.775e+16 + Color(0.4196f, 0.5339f, 1.0000f), // T= 20000K P=5.828e+16 + Color(0.4188f, 0.5332f, 1.0000f), // T= 20100K P=5.880e+16 + Color(0.4181f, 0.5325f, 1.0000f), // T= 20200K P=5.933e+16 + Color(0.4174f, 0.5319f, 1.0000f), // T= 20300K P=5.986e+16 + Color(0.4167f, 0.5312f, 1.0000f), // T= 20400K P=6.038e+16 + Color(0.4160f, 0.5306f, 1.0000f), // T= 20500K P=6.091e+16 + Color(0.4153f, 0.5300f, 1.0000f), // T= 20600K P=6.144e+16 + Color(0.4146f, 0.5293f, 1.0000f), // T= 20700K P=6.197e+16 + Color(0.4139f, 0.5287f, 1.0000f), // T= 20800K P=6.250e+16 + Color(0.4133f, 0.5281f, 1.0000f), // T= 20900K P=6.303e+16 + Color(0.4126f, 0.5275f, 1.0000f), // T= 21000K P=6.357e+16 + Color(0.4119f, 0.5269f, 1.0000f), // T= 21100K P=6.410e+16 + Color(0.4113f, 0.5264f, 1.0000f), // T= 21200K P=6.463e+16 + Color(0.4107f, 0.5258f, 1.0000f), // T= 21300K P=6.517e+16 + Color(0.4100f, 0.5252f, 1.0000f), // T= 21400K P=6.570e+16 + Color(0.4094f, 0.5246f, 1.0000f), // T= 21500K P=6.623e+16 + Color(0.4088f, 0.5241f, 1.0000f), // T= 21600K P=6.677e+16 + Color(0.4082f, 0.5235f, 1.0000f), // T= 21700K P=6.731e+16 + Color(0.4076f, 0.5230f, 1.0000f), // T= 21800K P=6.784e+16 + Color(0.4070f, 0.5224f, 1.0000f), // T= 21900K P=6.838e+16 + Color(0.4064f, 0.5219f, 1.0000f), // T= 22000K P=6.892e+16 + Color(0.4059f, 0.5214f, 1.0000f), // T= 22100K P=6.946e+16 + Color(0.4053f, 0.5209f, 1.0000f), // T= 22200K P=7.000e+16 + Color(0.4047f, 0.5203f, 1.0000f), // T= 22300K P=7.054e+16 + Color(0.4042f, 0.5198f, 1.0000f), // T= 22400K P=7.108e+16 + Color(0.4036f, 0.5193f, 1.0000f), // T= 22500K P=7.162e+16 + Color(0.4031f, 0.5188f, 1.0000f), // T= 22600K P=7.216e+16 + Color(0.4026f, 0.5183f, 1.0000f), // T= 22700K P=7.270e+16 + Color(0.4020f, 0.5178f, 1.0000f), // T= 22800K P=7.325e+16 + Color(0.4015f, 0.5174f, 1.0000f), // T= 22900K P=7.379e+16 + Color(0.4010f, 0.5169f, 1.0000f), // T= 23000K P=7.433e+16 + Color(0.4005f, 0.5164f, 1.0000f), // T= 23100K P=7.488e+16 + Color(0.4000f, 0.5159f, 1.0000f), // T= 23200K P=7.542e+16 + Color(0.3995f, 0.5155f, 1.0000f), // T= 23300K P=7.597e+16 + Color(0.3990f, 0.5150f, 1.0000f), // T= 23400K P=7.651e+16 + Color(0.3985f, 0.5146f, 1.0000f), // T= 23500K P=7.706e+16 + Color(0.3980f, 0.5141f, 1.0000f), // T= 23600K P=7.760e+16 + Color(0.3975f, 0.5137f, 1.0000f), // T= 23700K P=7.815e+16 + Color(0.3970f, 0.5132f, 1.0000f), // T= 23800K P=7.870e+16 + Color(0.3966f, 0.5128f, 1.0000f), // T= 23900K P=7.925e+16 + Color(0.3961f, 0.5123f, 1.0000f), // T= 24000K P=7.980e+16 + Color(0.3956f, 0.5119f, 1.0000f), // T= 24100K P=8.035e+16 + Color(0.3952f, 0.5115f, 1.0000f), // T= 24200K P=8.089e+16 + Color(0.3947f, 0.5111f, 1.0000f), // T= 24300K P=8.144e+16 + Color(0.3943f, 0.5107f, 1.0000f), // T= 24400K P=8.199e+16 + Color(0.3938f, 0.5103f, 1.0000f), // T= 24500K P=8.255e+16 + Color(0.3934f, 0.5098f, 1.0000f), // T= 24600K P=8.310e+16 + Color(0.3930f, 0.5094f, 1.0000f), // T= 24700K P=8.365e+16 + Color(0.3925f, 0.5090f, 1.0000f), // T= 24800K P=8.420e+16 + Color(0.3921f, 0.5086f, 1.0000f), // T= 24900K P=8.475e+16 + Color(0.3917f, 0.5083f, 1.0000f), // T= 25000K P=8.531e+16 + Color(0.3913f, 0.5079f, 1.0000f), // T= 25100K P=8.586e+16 + Color(0.3909f, 0.5075f, 1.0000f), // T= 25200K P=8.641e+16 + Color(0.3905f, 0.5071f, 1.0000f), // T= 25300K P=8.697e+16 + Color(0.3901f, 0.5067f, 1.0000f), // T= 25400K P=8.752e+16 + Color(0.3897f, 0.5064f, 1.0000f), // T= 25500K P=8.808e+16 + Color(0.3893f, 0.5060f, 1.0000f), // T= 25600K P=8.863e+16 + Color(0.3889f, 0.5056f, 1.0000f), // T= 25700K P=8.919e+16 + Color(0.3885f, 0.5053f, 1.0000f), // T= 25800K P=8.974e+16 + Color(0.3881f, 0.5049f, 1.0000f), // T= 25900K P=9.030e+16 + Color(0.3877f, 0.5045f, 1.0000f), // T= 26000K P=9.086e+16 + Color(0.3874f, 0.5042f, 1.0000f), // T= 26100K P=9.141e+16 + Color(0.3870f, 0.5038f, 1.0000f), // T= 26200K P=9.197e+16 + Color(0.3866f, 0.5035f, 1.0000f), // T= 26300K P=9.253e+16 + Color(0.3863f, 0.5032f, 1.0000f), // T= 26400K P=9.309e+16 + Color(0.3859f, 0.5028f, 1.0000f), // T= 26500K P=9.365e+16 + Color(0.3855f, 0.5025f, 1.0000f), // T= 26600K P=9.421e+16 + Color(0.3852f, 0.5021f, 1.0000f), // T= 26700K P=9.476e+16 + Color(0.3848f, 0.5018f, 1.0000f), // T= 26800K P=9.532e+16 + Color(0.3845f, 0.5015f, 1.0000f), // T= 26900K P=9.588e+16 + Color(0.3841f, 0.5012f, 1.0000f), // T= 27000K P=9.644e+16 + Color(0.3838f, 0.5008f, 1.0000f), // T= 27100K P=9.701e+16 + Color(0.3835f, 0.5005f, 1.0000f), // T= 27200K P=9.757e+16 + Color(0.3831f, 0.5002f, 1.0000f), // T= 27300K P=9.813e+16 + Color(0.3828f, 0.4999f, 1.0000f), // T= 27400K P=9.869e+16 + Color(0.3825f, 0.4996f, 1.0000f), // T= 27500K P=9.925e+16 + Color(0.3821f, 0.4993f, 1.0000f), // T= 27600K P=9.981e+16 + Color(0.3818f, 0.4990f, 1.0000f), // T= 27700K P=1.004e+17 + Color(0.3815f, 0.4987f, 1.0000f), // T= 27800K P=1.009e+17 + Color(0.3812f, 0.4984f, 1.0000f), // T= 27900K P=1.015e+17 + Color(0.3809f, 0.4981f, 1.0000f), // T= 28000K P=1.021e+17 + Color(0.3805f, 0.4978f, 1.0000f), // T= 28100K P=1.026e+17 + Color(0.3802f, 0.4975f, 1.0000f), // T= 28200K P=1.032e+17 + Color(0.3799f, 0.4972f, 1.0000f), // T= 28300K P=1.038e+17 + Color(0.3796f, 0.4969f, 1.0000f), // T= 28400K P=1.043e+17 + Color(0.3793f, 0.4966f, 1.0000f), // T= 28500K P=1.049e+17 + Color(0.3790f, 0.4963f, 1.0000f), // T= 28600K P=1.055e+17 + Color(0.3787f, 0.4960f, 1.0000f), // T= 28700K P=1.060e+17 + Color(0.3784f, 0.4958f, 1.0000f), // T= 28800K P=1.066e+17 + Color(0.3781f, 0.4955f, 1.0000f), // T= 28900K P=1.072e+17 + Color(0.3779f, 0.4952f, 1.0000f), // T= 29000K P=1.077e+17 + Color(0.3776f, 0.4949f, 1.0000f), // T= 29100K P=1.083e+17 + Color(0.3773f, 0.4947f, 1.0000f), // T= 29200K P=1.089e+17 + Color(0.3770f, 0.4944f, 1.0000f), // T= 29300K P=1.094e+17 + Color(0.3767f, 0.4941f, 1.0000f), // T= 29400K P=1.100e+17 + Color(0.3764f, 0.4939f, 1.0000f), // T= 29500K P=1.106e+17 + Color(0.3762f, 0.4936f, 1.0000f), // T= 29600K P=1.111e+17 + Color(0.3759f, 0.4934f, 1.0000f), // T= 29700K P=1.117e+17 + Color(0.3756f, 0.4931f, 1.0000f), // T= 29800K P=1.123e+17 + Color(0.3754f, 0.4928f, 1.0000f), // T= 29900K P=1.128e+17 + Color(0.3751f, 0.4926f, 1.0000f), // T= 30000K P=1.134e+17 + Color(0.3748f, 0.4923f, 1.0000f), // T= 30100K P=1.140e+17 + Color(0.3746f, 0.4921f, 1.0000f), // T= 30200K P=1.145e+17 + Color(0.3743f, 0.4918f, 1.0000f), // T= 30300K P=1.151e+17 + Color(0.3741f, 0.4916f, 1.0000f), // T= 30400K P=1.157e+17 + Color(0.3738f, 0.4914f, 1.0000f), // T= 30500K P=1.162e+17 + Color(0.3735f, 0.4911f, 1.0000f), // T= 30600K P=1.168e+17 + Color(0.3733f, 0.4909f, 1.0000f), // T= 30700K P=1.174e+17 + Color(0.3730f, 0.4906f, 1.0000f), // T= 30800K P=1.180e+17 + Color(0.3728f, 0.4904f, 1.0000f), // T= 30900K P=1.185e+17 + Color(0.3726f, 0.4902f, 1.0000f), // T= 31000K P=1.191e+17 + Color(0.3723f, 0.4899f, 1.0000f), // T= 31100K P=1.197e+17 + Color(0.3721f, 0.4897f, 1.0000f), // T= 31200K P=1.202e+17 + Color(0.3718f, 0.4895f, 1.0000f), // T= 31300K P=1.208e+17 + Color(0.3716f, 0.4893f, 1.0000f), // T= 31400K P=1.214e+17 + Color(0.3714f, 0.4890f, 1.0000f), // T= 31500K P=1.220e+17 + Color(0.3711f, 0.4888f, 1.0000f), // T= 31600K P=1.225e+17 + Color(0.3709f, 0.4886f, 1.0000f), // T= 31700K P=1.231e+17 + Color(0.3707f, 0.4884f, 1.0000f), // T= 31800K P=1.237e+17 + Color(0.3704f, 0.4881f, 1.0000f), // T= 31900K P=1.242e+17 + Color(0.3702f, 0.4879f, 1.0000f), // T= 32000K P=1.248e+17 + Color(0.3700f, 0.4877f, 1.0000f), // T= 32100K P=1.254e+17 + Color(0.3698f, 0.4875f, 1.0000f), // T= 32200K P=1.260e+17 + Color(0.3695f, 0.4873f, 1.0000f), // T= 32300K P=1.265e+17 + Color(0.3693f, 0.4871f, 1.0000f), // T= 32400K P=1.271e+17 + Color(0.3691f, 0.4869f, 1.0000f), // T= 32500K P=1.277e+17 + Color(0.3689f, 0.4867f, 1.0000f), // T= 32600K P=1.283e+17 + Color(0.3687f, 0.4864f, 1.0000f), // T= 32700K P=1.288e+17 + Color(0.3684f, 0.4862f, 1.0000f), // T= 32800K P=1.294e+17 + Color(0.3682f, 0.4860f, 1.0000f), // T= 32900K P=1.300e+17 + Color(0.3680f, 0.4858f, 1.0000f), // T= 33000K P=1.306e+17 + Color(0.3678f, 0.4856f, 1.0000f), // T= 33100K P=1.311e+17 + Color(0.3676f, 0.4854f, 1.0000f), // T= 33200K P=1.317e+17 + Color(0.3674f, 0.4852f, 1.0000f), // T= 33300K P=1.323e+17 + Color(0.3672f, 0.4850f, 1.0000f), // T= 33400K P=1.329e+17 + Color(0.3670f, 0.4848f, 1.0000f), // T= 33500K P=1.334e+17 + Color(0.3668f, 0.4847f, 1.0000f), // T= 33600K P=1.340e+17 + Color(0.3666f, 0.4845f, 1.0000f), // T= 33700K P=1.346e+17 + Color(0.3664f, 0.4843f, 1.0000f), // T= 33800K P=1.352e+17 + Color(0.3662f, 0.4841f, 1.0000f), // T= 33900K P=1.358e+17 + Color(0.3660f, 0.4839f, 1.0000f), // T= 34000K P=1.363e+17 + Color(0.3658f, 0.4837f, 1.0000f), // T= 34100K P=1.369e+17 + Color(0.3656f, 0.4835f, 1.0000f), // T= 34200K P=1.375e+17 + Color(0.3654f, 0.4833f, 1.0000f), // T= 34300K P=1.381e+17 + Color(0.3652f, 0.4831f, 1.0000f), // T= 34400K P=1.386e+17 + Color(0.3650f, 0.4830f, 1.0000f), // T= 34500K P=1.392e+17 + Color(0.3649f, 0.4828f, 1.0000f), // T= 34600K P=1.398e+17 + Color(0.3647f, 0.4826f, 1.0000f), // T= 34700K P=1.404e+17 + Color(0.3645f, 0.4824f, 1.0000f), // T= 34800K P=1.410e+17 + Color(0.3643f, 0.4822f, 1.0000f), // T= 34900K P=1.415e+17 + Color(0.3641f, 0.4821f, 1.0000f), // T= 35000K P=1.421e+17 + Color(0.3639f, 0.4819f, 1.0000f), // T= 35100K P=1.427e+17 + Color(0.3638f, 0.4817f, 1.0000f), // T= 35200K P=1.433e+17 + Color(0.3636f, 0.4815f, 1.0000f), // T= 35300K P=1.439e+17 + Color(0.3634f, 0.4814f, 1.0000f), // T= 35400K P=1.444e+17 + Color(0.3632f, 0.4812f, 1.0000f), // T= 35500K P=1.450e+17 + Color(0.3630f, 0.4810f, 1.0000f), // T= 35600K P=1.456e+17 + Color(0.3629f, 0.4809f, 1.0000f), // T= 35700K P=1.462e+17 + Color(0.3627f, 0.4807f, 1.0000f), // T= 35800K P=1.468e+17 + Color(0.3625f, 0.4805f, 1.0000f), // T= 35900K P=1.473e+17 + Color(0.3624f, 0.4804f, 1.0000f), // T= 36000K P=1.479e+17 + Color(0.3622f, 0.4802f, 1.0000f), // T= 36100K P=1.485e+17 + Color(0.3620f, 0.4800f, 1.0000f), // T= 36200K P=1.491e+17 + Color(0.3619f, 0.4799f, 1.0000f), // T= 36300K P=1.497e+17 + Color(0.3617f, 0.4797f, 1.0000f), // T= 36400K P=1.502e+17 + Color(0.3615f, 0.4796f, 1.0000f), // T= 36500K P=1.508e+17 + Color(0.3614f, 0.4794f, 1.0000f), // T= 36600K P=1.514e+17 + Color(0.3612f, 0.4792f, 1.0000f), // T= 36700K P=1.520e+17 + Color(0.3610f, 0.4791f, 1.0000f), // T= 36800K P=1.526e+17 + Color(0.3609f, 0.4789f, 1.0000f), // T= 36900K P=1.531e+17 + Color(0.3607f, 0.4788f, 1.0000f), // T= 37000K P=1.537e+17 + Color(0.3605f, 0.4786f, 1.0000f), // T= 37100K P=1.543e+17 + Color(0.3604f, 0.4785f, 1.0000f), // T= 37200K P=1.549e+17 + Color(0.3602f, 0.4783f, 1.0000f), // T= 37300K P=1.555e+17 + Color(0.3601f, 0.4782f, 1.0000f), // T= 37400K P=1.561e+17 + Color(0.3599f, 0.4780f, 1.0000f), // T= 37500K P=1.566e+17 + Color(0.3598f, 0.4779f, 1.0000f), // T= 37600K P=1.572e+17 + Color(0.3596f, 0.4777f, 1.0000f), // T= 37700K P=1.578e+17 + Color(0.3595f, 0.4776f, 1.0000f), // T= 37800K P=1.584e+17 + Color(0.3593f, 0.4774f, 1.0000f), // T= 37900K P=1.590e+17 + Color(0.3592f, 0.4773f, 1.0000f), // T= 38000K P=1.595e+17 + Color(0.3590f, 0.4771f, 1.0000f), // T= 38100K P=1.601e+17 + Color(0.3589f, 0.4770f, 1.0000f), // T= 38200K P=1.607e+17 + Color(0.3587f, 0.4768f, 1.0000f), // T= 38300K P=1.613e+17 + Color(0.3586f, 0.4767f, 1.0000f), // T= 38400K P=1.619e+17 + Color(0.3584f, 0.4766f, 1.0000f), // T= 38500K P=1.625e+17 + Color(0.3583f, 0.4764f, 1.0000f), // T= 38600K P=1.630e+17 + Color(0.3581f, 0.4763f, 1.0000f), // T= 38700K P=1.636e+17 + Color(0.3580f, 0.4761f, 1.0000f), // T= 38800K P=1.642e+17 + Color(0.3579f, 0.4760f, 1.0000f), // T= 38900K P=1.648e+17 + Color(0.3577f, 0.4759f, 1.0000f), // T= 39000K P=1.654e+17 + Color(0.3576f, 0.4757f, 1.0000f), // T= 39100K P=1.660e+17 + Color(0.3574f, 0.4756f, 1.0000f), // T= 39200K P=1.666e+17 + Color(0.3573f, 0.4755f, 1.0000f), // T= 39300K P=1.671e+17 + Color(0.3572f, 0.4753f, 1.0000f), // T= 39400K P=1.677e+17 + Color(0.3570f, 0.4752f, 1.0000f), // T= 39500K P=1.683e+17 + Color(0.3569f, 0.4751f, 1.0000f), // T= 39600K P=1.689e+17 + Color(0.3567f, 0.4749f, 1.0000f), // T= 39700K P=1.695e+17 + Color(0.3566f, 0.4748f, 1.0000f), // T= 39800K P=1.701e+17 + Color(0.3565f, 0.4747f, 1.0000f), // T= 39900K P=1.707e+17 + Color(0.3563f, 0.4745f, 1.0000f), // T= 40000K P=1.712e+17 }; diff --git a/src/celengine/stardb.cpp b/src/celengine/stardb.cpp index 515696cb6..6f62a4546 100644 --- a/src/celengine/stardb.cpp +++ b/src/celengine/stardb.cpp @@ -238,7 +238,7 @@ uint32 StarDatabase::findCatalogNumberByName(const string& name) const if (catalogNumber != Star::InvalidCatalogNumber) return catalogNumber; } - + if (parseCelestiaCatalogNumber(name, &catalogNumber)) { return catalogNumber; @@ -351,7 +351,7 @@ static void catalogNumberToString(uint32 catalogNumber, char* buf, unsigned int buf[0] = '\0'; } - if (catalogNumber <= StarDatabase::MAX_HIPPARCOS_NUMBER) + if (catalogNumber <= StarDatabase::MAX_HIPPARCOS_NUMBER) { sprintf(buf, "HIP %d", catalogNumber); } @@ -701,7 +701,7 @@ bool StarDatabase::loadBinary(istream& in) star.setDetails(details); star.setCatalogNumber(catNo); unsortedStars.add(star); - + nStars++; } @@ -710,7 +710,7 @@ bool StarDatabase::loadBinary(istream& in) DPRINTF(0, "StarDatabase::read: nStars = %d\n", nStarsInFile); clog << nStars << _(" stars in binary database\n"); - + // Create the temporary list of stars sorted by catalog number; this // will be used to lookup stars during file loading. After loading is // complete, the stars are sorted into an octree and this list gets @@ -721,12 +721,12 @@ bool StarDatabase::loadBinary(istream& in) binFileCatalogNumberIndex = new Star*[binFileStarCount]; for (unsigned int i = 0; i < binFileStarCount; i++) { - binFileCatalogNumberIndex[i] = &unsortedStars[i]; + binFileCatalogNumberIndex[i] = &unsortedStars[i]; } sort(binFileCatalogNumberIndex, binFileCatalogNumberIndex + binFileStarCount, PtrCatalogNumberOrderingPredicate()); } - + return true; } @@ -734,14 +734,14 @@ bool StarDatabase::loadBinary(istream& in) void StarDatabase::finish() { clog << _("Total star count: ") << nStars << endl; - + buildOctree(); buildIndexes(); // Delete the temporary indices used only during loading delete[] binFileCatalogNumberIndex; stcFileCatalogNumberIndex.clear(); - + // Resolve all barycenters; this can't be done before star sorting. There's // still a bug here: final orbital radii aren't available until after // the barycenters have been resolved, and these are required when building @@ -818,12 +818,12 @@ bool StarDatabase::createStar(Star* star, } } } - + bool modifyExistingDetails = false; if (disposition == ModifyStar) { StarDetails* existingDetails = star->getDetails(); - + // If we're modifying an existing star and it already has a // customized details record, we'll just modify that. if (!existingDetails->shared()) @@ -842,7 +842,7 @@ bool StarDatabase::createStar(Star* star, existingDetails->setRotationModel(details->getRotationModel()); existingDetails->setVisibility(details->getVisibility()); } - + details = existingDetails; } else if (details == NULL) @@ -850,7 +850,7 @@ bool StarDatabase::createStar(Star* star, details = existingDetails; } } - + string modelName; string textureName; bool hasTexture = starData->getString("Texture", textureName); @@ -866,7 +866,7 @@ bool StarDatabase::createStar(Star* star, double radius; bool hasRadius = starData->getLength("Radius", radius); - + double temperature = 0.0; bool hasTemperature = starData->getNumber("Temperature", temperature); // disallow unphysical temperature values @@ -921,7 +921,7 @@ bool StarDatabase::createStar(Star* star, details->setRadius((float) radius); details->addKnowledge(StarDetails::KnowRadius); } - + if (hasTemperature) { details->setTemperature((float) temperature); @@ -991,7 +991,7 @@ bool StarDatabase::createStar(Star* star, { hasBarycenter = true; barycenterPosition = barycenter->getPosition(); - } + } } if (!hasBarycenter) @@ -1022,7 +1022,7 @@ bool StarDatabase::createStar(Star* star, double ra = 0.0; double dec = 0.0; double distance = 0.0; - + if (disposition == ModifyStar) { Vector3f pos = star->getPosition(); @@ -1039,7 +1039,7 @@ bool StarDatabase::createStar(Star* star, dec = radToDeg(std::asin(v.z())); } } - + bool modifyPosition = false; if (starData->getAngle("RA", ra, DEG_PER_HRA, 1.0)) { @@ -1180,7 +1180,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) while (tokenizer.nextToken() != Tokenizer::TokenEnd) { bool isStar = true; - + // Parse the disposition--either Add, Replace, or Modify. The disposition // may be omitted. The default value is Add. StcDisposition disposition = AddStar; @@ -1202,7 +1202,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) tokenizer.nextToken(); } } - + // Parse the object type--either Star or Barycenter. The object type // may be omitted. The default is Star. if (tokenizer.getTokenType() == Tokenizer::TokenName) @@ -1244,7 +1244,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) firstName = objName.substr(0, next); } } - + Star* star = NULL; switch (disposition) @@ -1270,7 +1270,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) catalogNumber = findCatalogNumberByName(firstName); } } - + if (catalogNumber == Star::InvalidCatalogNumber) { catalogNumber = nextAutoCatalogNumber--; @@ -1280,22 +1280,22 @@ bool StarDatabase::load(istream& in, const string& resourcePath) star = findWhileLoading(catalogNumber); } break; - + case ModifyStar: // If no catalog number was specified, try looking up the star by name if (catalogNumber == Star::InvalidCatalogNumber && !firstName.empty()) { catalogNumber = findCatalogNumberByName(firstName); } - + if (catalogNumber != Star::InvalidCatalogNumber) { star = findWhileLoading(catalogNumber); } - + break; } - + bool isNewStar = star == NULL; tokenizer.pushBack(); @@ -1306,7 +1306,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) clog << "Error reading star." << endl; return false; } - + if (starDataValue->getType() != Value::HashType) { DPRINTF(0, "Bad star definition.\n"); @@ -1317,7 +1317,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) if (isNewStar) star = new Star(); - + bool ok = false; if (isNewStar && disposition == ModifyStar) { @@ -1336,7 +1336,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath) unsortedStars.add(*star); nStars++; delete star; - + // Add the new star to the temporary (load time) index. stcFileCatalogNumberIndex[catalogNumber] = &unsortedStars[unsortedStars.size() - 1]; } @@ -1394,7 +1394,7 @@ void StarDatabase::buildOctree() { root->insertObject(unsortedStars[i], STAR_OCTREE_ROOT_SIZE); } - + DPRINTF(1, "Spatially sorting stars for improved locality of reference . . .\n"); Star* sortedStars = new Star[nStars]; Star* firstStar = sortedStars; @@ -1459,23 +1459,23 @@ Star* StarDatabase::findWhileLoading(uint32 catalogNumber) const { Star refStar; refStar.setCatalogNumber(catalogNumber); - + Star** star = lower_bound(binFileCatalogNumberIndex, binFileCatalogNumberIndex + binFileStarCount, &refStar, PtrCatalogNumberOrderingPredicate()); - + if (star != binFileCatalogNumberIndex + binFileStarCount && (*star)->getCatalogNumber() == catalogNumber) return *star; } - + // Next check for stars loaded from an stc file map::const_iterator iter = stcFileCatalogNumberIndex.find(catalogNumber); if (iter != stcFileCatalogNumberIndex.end()) { return iter->second; } - + // Star not found return NULL; } diff --git a/src/celengine/stardb.h b/src/celengine/stardb.h index a31372bc1..fb5ffa3a8 100644 --- a/src/celengine/stardb.h +++ b/src/celengine/stardb.h @@ -42,17 +42,17 @@ public: m_elementCount(0) { } - + ~BlockArray() { clear(); } - + unsigned int size() const { return m_elementCount; } - + /*! Append an item to the BlockArray. */ void add(T& element) { @@ -62,13 +62,13 @@ public: T* newBlock = new T[m_blockSize]; m_blocks.push_back(newBlock); } - + unsigned int elementIndex = m_elementCount % m_blockSize; m_blocks.back()[elementIndex] = element; - + ++m_elementCount; } - + void clear() { for (typename std::vector::const_iterator iter = m_blocks.begin(); iter != m_blocks.end(); ++iter) @@ -78,7 +78,7 @@ public: m_elementCount = 0; m_blocks.clear(); } - + T& operator[](int index) { unsigned int blockNumber = index / m_blockSize; @@ -92,7 +92,7 @@ public: unsigned int elementNumber = index % m_blockSize; return m_blocks[blockNumber][elementNumber]; } - + private: unsigned int m_blockSize; unsigned int m_elementCount; @@ -101,7 +101,7 @@ private: class StarDatabase -{ +{ public: StarDatabase(); ~StarDatabase(); @@ -133,7 +133,7 @@ class StarDatabase StarNameDatabase* getNameDatabase() const; void setNameDatabase(StarNameDatabase*); - + bool load(std::istream&, const std::string& resourcePath); bool loadBinary(std::istream&); @@ -151,10 +151,10 @@ class StarDatabase ReplaceStar, ModifyStar, }; - - // Not exact, but any star with a catalog number greater than this is assumed to not be - // a HIPPARCOS stars. - static const uint32 MAX_HIPPARCOS_NUMBER = 999999; + + // Not exact, but any star with a catalog number greater than this is assumed to not be + // a HIPPARCOS stars. + static const uint32 MAX_HIPPARCOS_NUMBER = 999999; struct CrossIndexEntry { @@ -191,7 +191,7 @@ private: Star* findWhileLoading(uint32 catalogNumber) const; int nStars; - + Star* stars; StarNameDatabase* namesDB; Star** catalogNumberIndex; @@ -207,7 +207,7 @@ private: Star** binFileCatalogNumberIndex; unsigned int binFileStarCount; // Catalog number -> star mapping for stars loaded from stc files - std::map stcFileCatalogNumberIndex; + std::map stcFileCatalogNumberIndex; struct BarycenterUsage { diff --git a/src/celengine/starname.cpp b/src/celengine/starname.cpp index 6e07ccc38..74a08e055 100644 --- a/src/celengine/starname.cpp +++ b/src/celengine/starname.cpp @@ -104,14 +104,14 @@ StarNameDatabase* StarNameDatabase::readNames(istream& in) { uint32 catalogNumber = Star::InvalidCatalogNumber; - in >> catalogNumber; - if (in.eof()) - break; - if (in.bad()) + in >> catalogNumber; + if (in.eof()) + break; + if (in.bad()) { - failed = true; - break; - } + failed = true; + break; + } // in.get(); // skip a space (or colon); @@ -126,7 +126,7 @@ StarNameDatabase* StarNameDatabase::readNames(istream& in) // Iterate through the string for names delimited // by ':', and insert them into the star database. Note that // db->add() will skip empty names. - string::size_type startPos = 0; + string::size_type startPos = 0; while (startPos != string::npos) { ++startPos; diff --git a/src/celengine/staroctree.cpp b/src/celengine/staroctree.cpp index 94babe604..c998210f1 100644 --- a/src/celengine/staroctree.cpp +++ b/src/celengine/staroctree.cpp @@ -118,7 +118,7 @@ void StarOctree::processVisibleObjects(StarHandler& processor, { float distance = (obsPosition - obj.getPosition()).norm(); float appMag = astro::absToAppMag(obj.getAbsoluteMagnitude(), distance); - + if (appMag < limitingFactor || (distance < MAX_STAR_ORBIT_RADIUS && obj.getOrbit())) processor.process(obj, distance, appMag); } diff --git a/src/celengine/stellarclass.cpp b/src/celengine/stellarclass.cpp index 80f8193fd..4108948e9 100644 --- a/src/celengine/stellarclass.cpp +++ b/src/celengine/stellarclass.cpp @@ -86,39 +86,39 @@ char* StellarClass::str(char* buf, unsigned int buflen) const } else if (st == StellarClass::NormalStar) { - s0[0] = "OBAFGKMRSNWW?LTC"[(unsigned int) getSpectralClass()]; + s0[0] = "OBAFGKMRSNWW?LTC"[(unsigned int) getSpectralClass()]; s0[1] = '\0'; - s1[0] = "0123456789"[getSubclass()]; + s1[0] = "0123456789"[getSubclass()]; s1[1] = '\0'; - switch (getLuminosityClass()) + switch (getLuminosityClass()) { - case StellarClass::Lum_Ia0: - s2 = " I-a0"; - break; - case StellarClass::Lum_Ia: - s2 = " I-a"; - break; - case StellarClass::Lum_Ib: - s2 = " I-b"; - break; - case StellarClass::Lum_II: - s2 = " II"; - break; - case StellarClass::Lum_III: - s2 = " III"; - break; - case StellarClass::Lum_IV: - s2 = " IV"; - break; - case StellarClass::Lum_V: - s2 = " V"; - break; - case StellarClass::Lum_VI: - s2 = " VI"; - break; + case StellarClass::Lum_Ia0: + s2 = " I-a0"; + break; + case StellarClass::Lum_Ia: + s2 = " I-a"; + break; + case StellarClass::Lum_Ib: + s2 = " I-b"; + break; + case StellarClass::Lum_II: + s2 = " II"; + break; + case StellarClass::Lum_III: + s2 = " III"; + break; + case StellarClass::Lum_IV: + s2 = " IV"; + break; + case StellarClass::Lum_V: + s2 = " V"; + break; + case StellarClass::Lum_VI: + s2 = " VI"; + break; default: break; // Do nothing, but prevent GCC4 warnings (Beware: potentially dangerous) - } + } } else { @@ -149,9 +149,9 @@ uint16 StellarClass::pack() const { return (((uint16) starType << 12) | - (((uint16) specClass & 0xf) << 8) | - ((uint16) subclass << 4) | - ((uint16) lumClass)); + (((uint16) specClass & 0xf) << 8) | + ((uint16) subclass << 4) | + ((uint16) lumClass)); } diff --git a/src/celengine/stellarclass.h b/src/celengine/stellarclass.h index f151eab68..4a436f5a5 100644 --- a/src/celengine/stellarclass.h +++ b/src/celengine/stellarclass.h @@ -21,26 +21,26 @@ class StellarClass public: enum StarType { - NormalStar = 0, - WhiteDwarf = 1, - NeutronStar = 2, + NormalStar = 0, + WhiteDwarf = 1, + NeutronStar = 2, BlackHole = 3, }; enum SpectralClass { - Spectral_O = 0, - Spectral_B = 1, - Spectral_A = 2, - Spectral_F = 3, - Spectral_G = 4, - Spectral_K = 5, - Spectral_M = 6, - Spectral_R = 7, // superceded by class C - Spectral_S = 8, - Spectral_N = 9, // superceded by class C - Spectral_WC = 10, - Spectral_WN = 11, + Spectral_O = 0, + Spectral_B = 1, + Spectral_A = 2, + Spectral_F = 3, + Spectral_G = 4, + Spectral_K = 5, + Spectral_M = 6, + Spectral_R = 7, // superceded by class C + Spectral_S = 8, + Spectral_N = 9, // superceded by class C + Spectral_WC = 10, + Spectral_WN = 11, Spectral_Unknown = 12, Spectral_L = 13, Spectral_T = 14, @@ -66,14 +66,14 @@ public: enum LuminosityClass { - Lum_Ia0 = 0, - Lum_Ia = 1, - Lum_Ib = 2, - Lum_II = 3, - Lum_III = 4, - Lum_IV = 5, - Lum_V = 6, - Lum_VI = 7, + Lum_Ia0 = 0, + Lum_Ia = 1, + Lum_Ib = 2, + Lum_II = 3, + Lum_III = 4, + Lum_IV = 5, + Lum_V = 6, + Lum_VI = 7, Lum_Unknown = 8, Lum_Count = 9, }; @@ -85,9 +85,9 @@ public: inline StellarClass(); inline StellarClass(StarType, - SpectralClass, - unsigned int, - LuminosityClass); + SpectralClass, + unsigned int, + LuminosityClass); inline StarType getStarType() const; inline SpectralClass getSpectralClass() const; @@ -122,9 +122,9 @@ std::ostream& operator<<(std::ostream& s, const StellarClass& sc); bool operator<(const StellarClass& sc0, const StellarClass& sc1); StellarClass::StellarClass(StarType t, - SpectralClass sc, - unsigned int ssub, - LuminosityClass lum) : + SpectralClass sc, + unsigned int ssub, + LuminosityClass lum) : starType(t), specClass(sc), lumClass(lum), @@ -138,7 +138,7 @@ StellarClass::StellarClass() : lumClass(Lum_Unknown), subclass(Subclass_Unknown) { - + } StellarClass::StarType StellarClass::getStarType() const diff --git a/src/celengine/texture.cpp b/src/celengine/texture.cpp index 3b65063fe..1e23b91af 100644 --- a/src/celengine/texture.cpp +++ b/src/celengine/texture.cpp @@ -460,7 +460,7 @@ ImageTexture::ImageTexture(Image& img, { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, texCaps.preferredAnisotropy); } - + if (mipMapMode == AutoMipMaps) glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); diff --git a/src/celengine/texture.h b/src/celengine/texture.h index 4de548e21..5e89c3aba 100644 --- a/src/celengine/texture.h +++ b/src/celengine/texture.h @@ -79,7 +79,7 @@ class Texture * shader tricks to be used correctly. */ unsigned int getFormatOptions() const; - + //! Set the format options. void setFormatOptions(unsigned int opts); diff --git a/src/celengine/timeline.cpp b/src/celengine/timeline.cpp index e4b0f7cba..c6e732570 100644 --- a/src/celengine/timeline.cpp +++ b/src/celengine/timeline.cpp @@ -18,7 +18,7 @@ using namespace std; -/*! A Timeline is a list of TimelinePhases that covers a continuous +/*! A Timeline is a list of TimelinePhases that covers a continuous * interval of time. */ @@ -57,7 +57,7 @@ Timeline::appendPhase(TimelinePhase* phase) return true; } - + const TimelinePhase* Timeline::findPhase(double t) const diff --git a/src/celengine/trajmanager.cpp b/src/celengine/trajmanager.cpp index cee7f8e82..487eebc9b 100644 --- a/src/celengine/trajmanager.cpp +++ b/src/celengine/trajmanager.cpp @@ -78,7 +78,7 @@ Orbit* TrajectoryInfo::load(const string& filename) } } else - { + { switch (precision) { case TrajectoryPrecisionSingle: diff --git a/src/celengine/univcoord.h b/src/celengine/univcoord.h index 735868cd5..488c58f12 100644 --- a/src/celengine/univcoord.h +++ b/src/celengine/univcoord.h @@ -111,7 +111,7 @@ class UniversalCoord /** Get the offset in light years of this coordinate from a point (also with * units of light years.) The difference is calculated at high precision and - * the reduced to single precision. + * the reduced to single precision. * * This method is only here to help in porting older code; it shouldn't be * necessary to use it in new code, where the use of the rather the rather diff --git a/src/celengine/universe.cpp b/src/celengine/universe.cpp index 2a6eb51a1..2fe4ecfef 100644 --- a/src/celengine/universe.cpp +++ b/src/celengine/universe.cpp @@ -496,21 +496,21 @@ Selection Universe::pickPlanet(SolarSystem& solarSystem, // Retain that body Body* closestBody = pickInfo.closestBody; - // Check if there is a satellite in front of the primary body that is - // sufficiently close to the pickRay + // Check if there is a satellite in front of the primary body that is + // sufficiently close to the pickRay traverseFrameTree(solarSystem.getFrameTree(), when, ApproxPlanetPickTraversal, (void*) &pickInfo); if (pickInfo.closestBody == closestBody) - return Selection(closestBody); + return Selection(closestBody); // Nothing else around, select the body and return // Are we close enough to the satellite and is it in front of the body? - if ((pickInfo.sinAngle2Closest <= sinTol2) && + if ((pickInfo.sinAngle2Closest <= sinTol2) && (pickInfo.closestDistance > pickInfo.closestApproxDistance)) return Selection(pickInfo.closestBody); // Yes, select the satellite - else - return Selection(closestBody); + else + return Selection(closestBody); // No, select the primary body } diff --git a/src/celengine/vecgl.h b/src/celengine/vecgl.h index b43623eba..9b0059830 100644 --- a/src/celengine/vecgl.h +++ b/src/celengine/vecgl.h @@ -114,13 +114,13 @@ inline void glLightColor(GLenum light, GLenum which, const Vec4f& color) inline void glLightColor(GLenum light, GLenum which, const Color& color) { - Eigen::Vector4f v(color.red(), color.green(), color.blue(), color.alpha()); + Eigen::Vector4f v(color.red(), color.green(), color.blue(), color.alpha()); glLightfv(light, which, v.data()); } inline void glAmbientLightColor(const Color& color) { - Eigen::Vector4f v(color.red(), color.green(), color.blue(), color.alpha()); + Eigen::Vector4f v(color.red(), color.green(), color.blue(), color.alpha()); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, v.data()); } @@ -155,14 +155,14 @@ inline void glTranslate(const Eigen::Vector3d& offset) inline void glRotate(const Eigen::Quaternionf& q) { Eigen::Matrix4f m = Eigen::Matrix4f::Identity(); - m.topLeftCorner(3, 3) = q.toRotationMatrix(); + m.topLeftCorner(3, 3) = q.toRotationMatrix(); glMultMatrixf(m.data()); } inline void glRotate(const Eigen::Quaterniond& q) { Eigen::Matrix4d m = Eigen::Matrix4d::Identity(); - m.topLeftCorner(3, 3) = q.toRotationMatrix(); + m.topLeftCorner(3, 3) = q.toRotationMatrix(); glMultMatrixd(m.data()); } diff --git a/src/celengine/vertexprog.cpp b/src/celengine/vertexprog.cpp index 81d054485..a8a7a5f14 100644 --- a/src/celengine/vertexprog.cpp +++ b/src/celengine/vertexprog.cpp @@ -191,7 +191,7 @@ static bool LoadARBVertexProgram(const string& filename, unsigned int& id) const char* errMsg = (const char*) glGetString(GL_PROGRAM_ERROR_STRING_ARB); if (errMsg == NULL) errMsg = "Unknown error"; - + cout << _("Error in vertex program ") << filename << _(", line ") << findLineNumber(*source, errPos) << ": " << errMsg << '\n'; } @@ -390,7 +390,7 @@ void VertexProcessor::parameter(vp::Parameter param, const Color& c) // VertexProcessorNV implementation -static unsigned int parameterMappings[] = +static unsigned int parameterMappings[] = { 16, // LightDirection0 15, // EyePosition @@ -441,7 +441,7 @@ void VertexProcessorNV::use(unsigned int prog) void VertexProcessorNV::parameter(vp::Parameter param, float x, float y, float z, float w) { - glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, parameterMappings[param], x, y, z, w); } diff --git a/src/celengine/virtualtex.cpp b/src/celengine/virtualtex.cpp index 8db1d312e..74f79866b 100644 --- a/src/celengine/virtualtex.cpp +++ b/src/celengine/virtualtex.cpp @@ -369,14 +369,14 @@ static VirtualTexture* CreateVirtualTexture(Hash* texParams, string tilePrefix = "tx_"; texParams->getString("TilePrefix", tilePrefix); - - // if absolute directory notation for ImageDirectory used, - // don't prepend the current add-on path. - string directory = imageDirectory + "/"; - if (directory.substr(0,1) != "/" && directory.substr(1,1) !=":") + + // if absolute directory notation for ImageDirectory used, + // don't prepend the current add-on path. + string directory = imageDirectory + "/"; + if (directory.substr(0,1) != "/" && directory.substr(1,1) !=":") { - directory = path + "/" + directory; - } + directory = path + "/" + directory; + } return new VirtualTexture(directory, (unsigned int) baseSplit, (unsigned int) tileSize, diff --git a/src/celengine/virtualtex.h b/src/celengine/virtualtex.h index 2e0485a72..3b64b263e 100644 --- a/src/celengine/virtualtex.h +++ b/src/celengine/virtualtex.h @@ -51,7 +51,7 @@ class VirtualTexture : public Texture for (int i = 0; i < 4; i++) children[i] = NULL; }; - + Tile* tile; TileQuadtreeNode* children[4]; }; diff --git a/src/celengine/visibleregion.cpp b/src/celengine/visibleregion.cpp index 2859b690f..850309c1e 100644 --- a/src/celengine/visibleregion.cpp +++ b/src/celengine/visibleregion.cpp @@ -30,7 +30,7 @@ using namespace Eigen; * visible. The following are assumed: * - target is a point * - the body is an ellipsoid - * + * * This reference mark is useful in a few situations. When the * body is a planet or moon and target is the sun, the outline of * the visible region is the terminator. If target is a satellite, @@ -224,7 +224,7 @@ VisibleRegion::render(Renderer* /* renderer */, { double theta = (double) i / (double) (nSections) * 2.0 * PI; Vector3d w = cos(theta) * uAxis + sin(theta) * vAxis; - + Vector3d toCenter = ellipsoidTangent(recipSemiAxes, w, e, e_, ee); toCenter *= maxSemiAxis * scale; glVertex3dv(toCenter.data()); diff --git a/src/celephem/customorbit.cpp b/src/celephem/customorbit.cpp index 5c07c681d..19dffe276 100644 --- a/src/celephem/customorbit.cpp +++ b/src/celephem/customorbit.cpp @@ -43,85 +43,85 @@ static JPLEphemeris* jpleph = NULL; double gPlanetElements[8][9]; double gElements[8][23] = { - { /* mercury... */ + { /* mercury... */ - 178.179078, 415.2057519, 3.011e-4, 0.0, - 75.899697, 1.5554889, 2.947e-4, 0.0, - .20561421, 2.046e-5, 3e-8, 0.0, - 7.002881, 1.8608e-3, -1.83e-5, 0.0, - 47.145944, 1.1852083, 1.739e-4, 0.0, - .3870986, 6.74, -0.42 - }, + 178.179078, 415.2057519, 3.011e-4, 0.0, + 75.899697, 1.5554889, 2.947e-4, 0.0, + .20561421, 2.046e-5, 3e-8, 0.0, + 7.002881, 1.8608e-3, -1.83e-5, 0.0, + 47.145944, 1.1852083, 1.739e-4, 0.0, + .3870986, 6.74, -0.42 + }, - { /* venus... */ + { /* venus... */ - 342.767053, 162.5533664, 3.097e-4, 0.0, - 130.163833, 1.4080361, -9.764e-4, 0.0, - 6.82069e-3, -4.774e-5, 9.1e-8, 0.0, - 3.393631, 1.0058e-3, -1e-6, 0.0, - 75.779647, .89985, 4.1e-4, 0.0, - .7233316, 16.92, -4.4 - }, + 342.767053, 162.5533664, 3.097e-4, 0.0, + 130.163833, 1.4080361, -9.764e-4, 0.0, + 6.82069e-3, -4.774e-5, 9.1e-8, 0.0, + 3.393631, 1.0058e-3, -1e-6, 0.0, + 75.779647, .89985, 4.1e-4, 0.0, + .7233316, 16.92, -4.4 + }, - { /* mars... */ + { /* mars... */ - 293.737334, 53.17137642, 3.107e-4, 0.0, - 3.34218203e2, 1.8407584, 1.299e-4, -1.19e-6, - 9.33129e-2, 9.2064e-5, 7.7e-8, 0.0, - 1.850333, -6.75e-4, 1.26e-5, 0.0, - 48.786442, .7709917, -1.4e-6, -5.33e-6, - 1.5236883, 9.36, -1.52 - }, + 293.737334, 53.17137642, 3.107e-4, 0.0, + 3.34218203e2, 1.8407584, 1.299e-4, -1.19e-6, + 9.33129e-2, 9.2064e-5, 7.7e-8, 0.0, + 1.850333, -6.75e-4, 1.26e-5, 0.0, + 48.786442, .7709917, -1.4e-6, -5.33e-6, + 1.5236883, 9.36, -1.52 + }, - { /* jupiter... */ + { /* jupiter... */ - 238.049257, 8.434172183, 3.347e-4, -1.65e-6, - 1.2720972e1, 1.6099617, 1.05627e-3, -3.43e-6, - 4.833475e-2, 1.6418e-4, -4.676e-7, -1.7e-9, - 1.308736, -5.6961e-3, 3.9e-6, 0.0, - 99.443414, 1.01053, 3.5222e-4, -8.51e-6, - 5.202561, 196.74, -9.4 - }, + 238.049257, 8.434172183, 3.347e-4, -1.65e-6, + 1.2720972e1, 1.6099617, 1.05627e-3, -3.43e-6, + 4.833475e-2, 1.6418e-4, -4.676e-7, -1.7e-9, + 1.308736, -5.6961e-3, 3.9e-6, 0.0, + 99.443414, 1.01053, 3.5222e-4, -8.51e-6, + 5.202561, 196.74, -9.4 + }, - { /* saturn... */ + { /* saturn... */ - 266.564377, 3.398638567, 3.245e-4, -5.8e-6, - 9.1098214e1, 1.9584158, 8.2636e-4, 4.61e-6, - 5.589232e-2, -3.455e-4, -7.28e-7, 7.4e-10, - 2.492519, -3.9189e-3, -1.549e-5, 4e-8, - 112.790414, .8731951, -1.5218e-4, -5.31e-6, - 9.554747, 165.6, -8.88 - }, + 266.564377, 3.398638567, 3.245e-4, -5.8e-6, + 9.1098214e1, 1.9584158, 8.2636e-4, 4.61e-6, + 5.589232e-2, -3.455e-4, -7.28e-7, 7.4e-10, + 2.492519, -3.9189e-3, -1.549e-5, 4e-8, + 112.790414, .8731951, -1.5218e-4, -5.31e-6, + 9.554747, 165.6, -8.88 + }, - { /* uranus... */ + { /* uranus... */ - 244.19747, 1.194065406, 3.16e-4, -6e-7, - 1.71548692e2, 1.4844328, 2.372e-4, -6.1e-7, - 4.63444e-2, -2.658e-5, 7.7e-8, 0.0, - .772464, 6.253e-4, 3.95e-5, 0.0, - 73.477111, .4986678, 1.3117e-3, 0.0, - 19.21814, 65.8, -7.19 - }, + 244.19747, 1.194065406, 3.16e-4, -6e-7, + 1.71548692e2, 1.4844328, 2.372e-4, -6.1e-7, + 4.63444e-2, -2.658e-5, 7.7e-8, 0.0, + .772464, 6.253e-4, 3.95e-5, 0.0, + 73.477111, .4986678, 1.3117e-3, 0.0, + 19.21814, 65.8, -7.19 + }, - { /* neptune... */ + { /* neptune... */ - 84.457994, .6107942056, 3.205e-4, -6e-7, - 4.6727364e1, 1.4245744, 3.9082e-4, -6.05e-7, - 8.99704e-3, 6.33e-6, -2e-9, 0.0, - 1.779242, -9.5436e-3, -9.1e-6, 0.0, - 130.681389, 1.098935, 2.4987e-4, -4.718e-6, - 30.10957, 62.2, -6.87 - }, + 84.457994, .6107942056, 3.205e-4, -6e-7, + 4.6727364e1, 1.4245744, 3.9082e-4, -6.05e-7, + 8.99704e-3, 6.33e-6, -2e-9, 0.0, + 1.779242, -9.5436e-3, -9.1e-6, 0.0, + 130.681389, 1.098935, 2.4987e-4, -4.718e-6, + 30.10957, 62.2, -6.87 + }, - { /* pluto...(osculating 1984 jan 21) */ + { /* pluto...(osculating 1984 jan 21) */ - 95.3113544, .3980332167, 0.0, 0.0, - 224.017, 0.0, 0.0, 0.0, - .25515, 0.0, 0.0, 0.0, - 17.1329, 0.0, 0.0, 0.0, - 110.191, 0.0, 0.0, 0.0, - 39.8151, 8.2, -1.0 - } + 95.3113544, .3980332167, 0.0, 0.0, + 224.017, 0.0, 0.0, 0.0, + .25515, 0.0, 0.0, 0.0, + 17.1329, 0.0, 0.0, 0.0, + 110.191, 0.0, 0.0, 0.0, + 39.8151, 8.2, -1.0 + } }; @@ -151,11 +151,11 @@ static void Nutation(double t, double &deps, double& dpsi) // Parameter t represents the Julian centuries elapsed since 1900. // In other words, t = (jd - 2415020.0) / 36525.0 - double ls, ld; // sun's mean longitude, moon's mean longitude - double ms, md; // sun's mean anomaly, moon's mean anomaly - double nm; // longitude of moon's ascending node + double ls, ld; // sun's mean longitude, moon's mean longitude + double ms, md; // sun's mean anomaly, moon's mean anomaly + double nm; // longitude of moon's ascending node double t2; - double tls, tnm, tld; // twice above + double tls, tnm, tld; // twice above double a, b; t2 = t*t; @@ -210,30 +210,30 @@ static void EclipticToEquatorial(double t, double fEclLat, double fEclLon, // Parameter t represents the Julian centuries elapsed since 1900. // In other words, t = (jd - 2415020.0) / 36525.0 - double seps, ceps; // sin and cos of mean obliquity + double seps, ceps; // sin and cos of mean obliquity double sx, cx, sy, cy, ty; double eps; double deps, dpsi; t = (astro::J2000 - 2415020.0) / 36525.0; t = 0; - eps = Obliquity(t); // mean obliquity for date + eps = Obliquity(t); // mean obliquity for date Nutation(t, deps, dpsi); eps += deps; seps = sin(eps); ceps = cos(eps); sy = sin(fEclLat); - cy = cos(fEclLat); // always non-negative + cy = cos(fEclLat); // always non-negative if (fabs(cy)<1e-20) - cy = 1e-20; // insure > 0 + cy = 1e-20; // insure > 0 ty = sy/cy; cx = cos(fEclLon); sx = sin(fEclLon); dec = asin((sy*ceps)+(cy*seps*sx)); RA = atan(((sx*ceps)-(ty*seps))/cx); if (cx<0) - RA += PI; // account for atan quad ambiguity + RA += PI; // account for atan quad ambiguity RA = pfmod(RA, TWOPI); } @@ -272,9 +272,9 @@ double meanAnomalySun(double t) { double t2, a, b; - t2 = t*t; - a = 9.999736042e1*t; - b = 360*(a - (int)a); + t2 = t*t; + a = 9.999736042e1*t; + b = 360*(a - (int)a); return degToRad(3.5847583e2 - (1.5e-4 + 3.3e-6*t)*t2 + b); } @@ -463,7 +463,7 @@ class VenusOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; mas = meanAnomalySun(t); @@ -482,19 +482,19 @@ class VenusOrbit : public CachingOrbit dml = degToRad(7.7e-4*sin(4.1406+t*2.6227)); dm = dml; - dl = 3.13e-3*cos(2*mas-2*map[1]-2.587)+ - 1.98e-3*cos(3*mas-3*map[1]+4.4768e-2)+ - 1.36e-3*cos(mas-map[1]-2.0788)+ - 9.6e-4*cos(3*mas-2*map[1]-2.3721)+ - 8.2e-4*cos(map[3]-map[1]-3.6318); + dl = 3.13e-3*cos(2*mas-2*map[1]-2.587)+ + 1.98e-3*cos(3*mas-3*map[1]+4.4768e-2)+ + 1.36e-3*cos(mas-map[1]-2.0788)+ + 9.6e-4*cos(3*mas-2*map[1]-2.3721)+ + 8.2e-4*cos(map[3]-map[1]-3.6318); - dr = 2.2501e-5*cos(2*mas-2*map[1]-1.01592)+ - 1.9045e-5*cos(3*mas-3*map[1]+1.61577)+ - 6.887e-6*cos(map[3]-map[1]-2.06106)+ - 5.172e-6*cos(mas-map[1]-5.08065e-1)+ - 3.62e-6*cos(5*mas-4*map[1]-1.81877)+ - 3.283e-6*cos(4*mas-4*map[1]+1.10851)+ - 3.074e-6*cos(2*map[3]-2*map[1]-9.62846e-1); + dr = 2.2501e-5*cos(2*mas-2*map[1]-1.01592)+ + 1.9045e-5*cos(3*mas-3*map[1]+1.61577)+ + 6.887e-6*cos(map[3]-map[1]-2.06106)+ + 5.172e-6*cos(mas-map[1]-5.08065e-1)+ + 3.62e-6*cos(5*mas-4*map[1]-1.81877)+ + 3.283e-6*cos(4*mas-4*map[1]+1.10851)+ + 3.074e-6*cos(2*map[3]-2*map[1]-9.62846e-1); computePlanetCoords(p, map[p], da, dhl, dl, dm, dml, dr, ds, eclLong, eclLat, distance); @@ -526,41 +526,41 @@ class EarthOrbit : public CachingOrbit Vector3d computePosition(double jd) const { - double t, t2; - double ls, ms; // mean longitude and mean anomaly - double s, nu, ea; // eccentricity, true anomaly, eccentric anomaly - double a, b, a1, b1, c1, d1, e1, h1, dl, dr; + double t, t2; + double ls, ms; // mean longitude and mean anomaly + double s, nu, ea; // eccentricity, true anomaly, eccentric anomaly + double a, b, a1, b1, c1, d1, e1, h1, dl, dr; double eclLong, distance; // Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; - t2 = t*t; - a = 100.0021359*t; - b = 360.*(a-(int)a); - ls = 279.69668+.0003025*t2+b; + t2 = t*t; + a = 100.0021359*t; + b = 360.*(a-(int)a); + ls = 279.69668+.0003025*t2+b; ms = meanAnomalySun(t); - s = .016751-.0000418*t-1.26e-07*t2; + s = .016751-.0000418*t-1.26e-07*t2; astro::anomaly(degToRad(ms), s, nu, ea); - a = 62.55209472000015*t; - b = 360*(a-(int)a); - a1 = degToRad(153.23+b); - a = 125.1041894*t; - b = 360*(a-(int)a); - b1 = degToRad(216.57+b); - a = 91.56766028*t; - b = 360*(a-(int)a); - c1 = degToRad(312.69+b); - a = 1236.853095*t; - b = 360*(a-(int)a); - d1 = degToRad(350.74-.00144*t2+b); - e1 = degToRad(231.19+20.2*t); - a = 183.1353208*t; - b = 360*(a-(int)a); - h1 = degToRad(353.4+b); - dl = .00134*cos(a1)+.00154*cos(b1)+.002*cos(c1)+.00179*sin(d1)+ + a = 62.55209472000015*t; + b = 360*(a-(int)a); + a1 = degToRad(153.23+b); + a = 125.1041894*t; + b = 360*(a-(int)a); + b1 = degToRad(216.57+b); + a = 91.56766028*t; + b = 360*(a-(int)a); + c1 = degToRad(312.69+b); + a = 1236.853095*t; + b = 360*(a-(int)a); + d1 = degToRad(350.74-.00144*t2+b); + e1 = degToRad(231.19+20.2*t); + a = 183.1353208*t; + b = 360*(a-(int)a); + h1 = degToRad(353.4+b); + dl = .00134*cos(a1)+.00154*cos(b1)+.002*cos(c1)+.00179*sin(d1)+ .00178*sin(e1); - dr = 5.43e-06*sin(a1)+1.575e-05*sin(b1)+1.627e-05*sin(c1)+ + dr = 5.43e-06*sin(a1)+1.575e-05*sin(b1)+1.627e-05*sin(c1)+ 3.076e-05*cos(d1)+9.27e-06*sin(h1); eclLong = nu+degToRad(ls-ms+dl) + PI; @@ -594,124 +594,124 @@ class LunarOrbit : public CachingOrbit Vector3d computePosition(double jd) const { - double jd19, t, t2; - double ld, ms, md, de, f, n, hp; - double a, sa, sn, b, sb, c, sc, e, e2, l, g, w1, w2; - double m1, m2, m3, m4, m5, m6; + double jd19, t, t2; + double ld, ms, md, de, f, n, hp; + double a, sa, sn, b, sb, c, sc, e, e2, l, g, w1, w2; + double m1, m2, m3, m4, m5, m6; double eclLon, eclLat, horzPar, distance; double RA, dec; // Computation requires an abbreviated Julian day: // epoch January 0.5, 1900. jd19 = jd - 2415020.0; - t = jd19/36525; - t2 = t*t; + t = jd19/36525; + t2 = t*t; - m1 = jd19/27.32158213; - m1 = 360.0*(m1-(int)m1); - m2 = jd19/365.2596407; - m2 = 360.0*(m2-(int)m2); - m3 = jd19/27.55455094; - m3 = 360.0*(m3-(int)m3); - m4 = jd19/29.53058868; - m4 = 360.0*(m4-(int)m4); - m5 = jd19/27.21222039; - m5 = 360.0*(m5-(int)m5); - m6 = jd19/6798.363307; - m6 = 360.0*(m6-(int)m6); + m1 = jd19/27.32158213; + m1 = 360.0*(m1-(int)m1); + m2 = jd19/365.2596407; + m2 = 360.0*(m2-(int)m2); + m3 = jd19/27.55455094; + m3 = 360.0*(m3-(int)m3); + m4 = jd19/29.53058868; + m4 = 360.0*(m4-(int)m4); + m5 = jd19/27.21222039; + m5 = 360.0*(m5-(int)m5); + m6 = jd19/6798.363307; + m6 = 360.0*(m6-(int)m6); - ld = 270.434164+m1-(.001133-.0000019*t)*t2; - ms = 358.475833+m2-(.00015+.0000033*t)*t2; - md = 296.104608+m3+(.009192+.0000144*t)*t2; - de = 350.737486+m4-(.001436-.0000019*t)*t2; - f = 11.250889+m5-(.003211+.0000003*t)*t2; - n = 259.183275-m6+(.002078+.000022*t)*t2; + ld = 270.434164+m1-(.001133-.0000019*t)*t2; + ms = 358.475833+m2-(.00015+.0000033*t)*t2; + md = 296.104608+m3+(.009192+.0000144*t)*t2; + de = 350.737486+m4-(.001436-.0000019*t)*t2; + f = 11.250889+m5-(.003211+.0000003*t)*t2; + n = 259.183275-m6+(.002078+.000022*t)*t2; - a = degToRad(51.2+20.2*t); - sa = sin(a); - sn = sin(degToRad(n)); - b = 346.56+(132.87-.0091731*t)*t; - sb = .003964*sin(degToRad(b)); - c = degToRad(n+275.05-2.3*t); - sc = sin(c); - ld = ld+.000233*sa+sb+.001964*sn; - ms = ms-.001778*sa; - md = md+.000817*sa+sb+.002541*sn; - f = f+sb-.024691*sn-.004328*sc; - de = de+.002011*sa+sb+.001964*sn; - e = 1-(.002495+7.52e-06*t)*t; - e2 = e*e; + a = degToRad(51.2+20.2*t); + sa = sin(a); + sn = sin(degToRad(n)); + b = 346.56+(132.87-.0091731*t)*t; + sb = .003964*sin(degToRad(b)); + c = degToRad(n+275.05-2.3*t); + sc = sin(c); + ld = ld+.000233*sa+sb+.001964*sn; + ms = ms-.001778*sa; + md = md+.000817*sa+sb+.002541*sn; + f = f+sb-.024691*sn-.004328*sc; + de = de+.002011*sa+sb+.001964*sn; + e = 1-(.002495+7.52e-06*t)*t; + e2 = e*e; - ld = degToRad(ld); - ms = degToRad(ms); - n = degToRad(n); - de = degToRad(de); - f = degToRad(f); - md = degToRad(md); + ld = degToRad(ld); + ms = degToRad(ms); + n = degToRad(n); + de = degToRad(de); + f = degToRad(f); + md = degToRad(md); - l = 6.28875*sin(md)+1.27402*sin(2*de-md)+.658309*sin(2*de)+ - .213616*sin(2*md)-e*.185596*sin(ms)-.114336*sin(2*f)+ - .058793*sin(2*(de-md))+.057212*e*sin(2*de-ms-md)+ - .05332*sin(2*de+md)+.045874*e*sin(2*de-ms)+.041024*e*sin(md-ms); - l = l-.034718*sin(de)-e*.030465*sin(ms+md)+.015326*sin(2*(de-f))- - .012528*sin(2*f+md)-.01098*sin(2*f-md)+.010674*sin(4*de-md)+ - .010034*sin(3*md)+.008548*sin(4*de-2*md)-e*.00791*sin(ms-md+2*de)- - e*.006783*sin(2*de+ms); - l = l+.005162*sin(md-de)+e*.005*sin(ms+de)+.003862*sin(4*de)+ - e*.004049*sin(md-ms+2*de)+.003996*sin(2*(md+de))+ - .003665*sin(2*de-3*md)+e*.002695*sin(2*md-ms)+ - .002602*sin(md-2*(f+de))+e*.002396*sin(2*(de-md)-ms)- - .002349*sin(md+de); - l = l+e2*.002249*sin(2*(de-ms))-e*.002125*sin(2*md+ms)- - e2*.002079*sin(2*ms)+e2*.002059*sin(2*(de-ms)-md)- - .001773*sin(md+2*(de-f))-.001595*sin(2*(f+de))+ - e*.00122*sin(4*de-ms-md)-.00111*sin(2*(md+f))+.000892*sin(md-3*de); - l = l-e*.000811*sin(ms+md+2*de)+e*.000761*sin(4*de-ms-2*md)+ + l = 6.28875*sin(md)+1.27402*sin(2*de-md)+.658309*sin(2*de)+ + .213616*sin(2*md)-e*.185596*sin(ms)-.114336*sin(2*f)+ + .058793*sin(2*(de-md))+.057212*e*sin(2*de-ms-md)+ + .05332*sin(2*de+md)+.045874*e*sin(2*de-ms)+.041024*e*sin(md-ms); + l = l-.034718*sin(de)-e*.030465*sin(ms+md)+.015326*sin(2*(de-f))- + .012528*sin(2*f+md)-.01098*sin(2*f-md)+.010674*sin(4*de-md)+ + .010034*sin(3*md)+.008548*sin(4*de-2*md)-e*.00791*sin(ms-md+2*de)- + e*.006783*sin(2*de+ms); + l = l+.005162*sin(md-de)+e*.005*sin(ms+de)+.003862*sin(4*de)+ + e*.004049*sin(md-ms+2*de)+.003996*sin(2*(md+de))+ + .003665*sin(2*de-3*md)+e*.002695*sin(2*md-ms)+ + .002602*sin(md-2*(f+de))+e*.002396*sin(2*(de-md)-ms)- + .002349*sin(md+de); + l = l+e2*.002249*sin(2*(de-ms))-e*.002125*sin(2*md+ms)- + e2*.002079*sin(2*ms)+e2*.002059*sin(2*(de-ms)-md)- + .001773*sin(md+2*(de-f))-.001595*sin(2*(f+de))+ + e*.00122*sin(4*de-ms-md)-.00111*sin(2*(md+f))+.000892*sin(md-3*de); + l = l-e*.000811*sin(ms+md+2*de)+e*.000761*sin(4*de-ms-2*md)+ e2*.000704*sin(md-2*(ms+de))+e*.000693*sin(ms-2*(md-de))+ e*.000598*sin(2*(de-f)-ms)+.00055*sin(md+4*de)+.000538*sin(4*md)+ e*.000521*sin(4*de-ms)+.000486*sin(2*md-de); - l = l+e2*.000717*sin(md-2*ms); - eclLon = ld+degToRad(l); - eclLon = pfmod(eclLon, TWOPI); + l = l+e2*.000717*sin(md-2*ms); + eclLon = ld+degToRad(l); + eclLon = pfmod(eclLon, TWOPI); - g = 5.12819*sin(f)+.280606*sin(md+f)+.277693*sin(md-f)+ - .173238*sin(2*de-f)+.055413*sin(2*de+f-md)+.046272*sin(2*de-f-md)+ - .032573*sin(2*de+f)+.017198*sin(2*md+f)+.009267*sin(2*de+md-f)+ - .008823*sin(2*md-f)+e*.008247*sin(2*de-ms-f); - g = g+.004323*sin(2*(de-md)-f)+.0042*sin(2*de+f+md)+ - e*.003372*sin(f-ms-2*de)+e*.002472*sin(2*de+f-ms-md)+ - e*.002222*sin(2*de+f-ms)+e*.002072*sin(2*de-f-ms-md)+ - e*.001877*sin(f-ms+md)+.001828*sin(4*de-f-md)-e*.001803*sin(f+ms)- - .00175*sin(3*f); - g = g+e*.00157*sin(md-ms-f)-.001487*sin(f+de)-e*.001481*sin(f+ms+md)+ + g = 5.12819*sin(f)+.280606*sin(md+f)+.277693*sin(md-f)+ + .173238*sin(2*de-f)+.055413*sin(2*de+f-md)+.046272*sin(2*de-f-md)+ + .032573*sin(2*de+f)+.017198*sin(2*md+f)+.009267*sin(2*de+md-f)+ + .008823*sin(2*md-f)+e*.008247*sin(2*de-ms-f); + g = g+.004323*sin(2*(de-md)-f)+.0042*sin(2*de+f+md)+ + e*.003372*sin(f-ms-2*de)+e*.002472*sin(2*de+f-ms-md)+ + e*.002222*sin(2*de+f-ms)+e*.002072*sin(2*de-f-ms-md)+ + e*.001877*sin(f-ms+md)+.001828*sin(4*de-f-md)-e*.001803*sin(f+ms)- + .00175*sin(3*f); + g = g+e*.00157*sin(md-ms-f)-.001487*sin(f+de)-e*.001481*sin(f+ms+md)+ e*.001417*sin(f-ms-md)+e*.00135*sin(f-ms)+.00133*sin(f-de)+ .001106*sin(f+3*md)+.00102*sin(4*de-f)+.000833*sin(f+4*de-md)+ .000781*sin(md-3*f)+.00067*sin(f+4*de-2*md); - g = g+.000606*sin(2*de-3*f)+.000597*sin(2*(de+md)-f)+ - e*.000492*sin(2*de+md-ms-f)+.00045*sin(2*(md-de)-f)+ - .000439*sin(3*md-f)+.000423*sin(f+2*(de+md))+ - .000422*sin(2*de-f-3*md)-e*.000367*sin(ms+f+2*de-md)- - e*.000353*sin(ms+f+2*de)+.000331*sin(f+4*de); - g = g+e*.000317*sin(2*de+f-ms+md)+e2*.000306*sin(2*(de-ms)-f)- - .000283*sin(md+3*f); - w1 = .0004664*cos(n); - w2 = .0000754*cos(c); - eclLat = degToRad(g)*(1-w1-w2); + g = g+.000606*sin(2*de-3*f)+.000597*sin(2*(de+md)-f)+ + e*.000492*sin(2*de+md-ms-f)+.00045*sin(2*(md-de)-f)+ + .000439*sin(3*md-f)+.000423*sin(f+2*(de+md))+ + .000422*sin(2*de-f-3*md)-e*.000367*sin(ms+f+2*de-md)- + e*.000353*sin(ms+f+2*de)+.000331*sin(f+4*de); + g = g+e*.000317*sin(2*de+f-ms+md)+e2*.000306*sin(2*(de-ms)-f)- + .000283*sin(md+3*f); + w1 = .0004664*cos(n); + w2 = .0000754*cos(c); + eclLat = degToRad(g)*(1-w1-w2); - hp = .950724+.051818*cos(md)+.009531*cos(2*de-md)+.007843*cos(2*de)+ - .002824*cos(2*md)+.000857*cos(2*de+md)+e*.000533*cos(2*de-ms)+ - e*.000401*cos(2*de-md-ms)+e*.00032*cos(md-ms)-.000271*cos(de)- - e*.000264*cos(ms+md)-.000198*cos(2*f-md); - hp = hp+.000173*cos(3*md)+.000167*cos(4*de-md)-e*.000111*cos(ms)+ - .000103*cos(4*de-2*md)-.000084*cos(2*md-2*de)- - e*.000083*cos(2*de+ms)+.000079*cos(2*de+2*md)+.000072*cos(4*de)+ - e*.000064*cos(2*de-ms+md)-e*.000063*cos(2*de+ms-md)+ - e*.000041*cos(ms+de); - hp = hp+e*.000035*cos(2*md-ms)-.000033*cos(3*md-2*de)- - .00003*cos(md+de)-.000029*cos(2*(f-de))-e*.000029*cos(2*md+ms)+ - e2*.000026*cos(2*(de-ms))-.000023*cos(2*(f-de)+md)+ - e*.000019*cos(4*de-ms-md); - horzPar = degToRad(hp); + hp = .950724+.051818*cos(md)+.009531*cos(2*de-md)+.007843*cos(2*de)+ + .002824*cos(2*md)+.000857*cos(2*de+md)+e*.000533*cos(2*de-ms)+ + e*.000401*cos(2*de-md-ms)+e*.00032*cos(md-ms)-.000271*cos(de)- + e*.000264*cos(ms+md)-.000198*cos(2*f-md); + hp = hp+.000173*cos(3*md)+.000167*cos(4*de-md)-e*.000111*cos(ms)+ + .000103*cos(4*de-2*md)-.000084*cos(2*md-2*de)- + e*.000083*cos(2*de+ms)+.000079*cos(2*de+2*md)+.000072*cos(4*de)+ + e*.000064*cos(2*de-ms+md)-e*.000063*cos(2*de+ms-md)+ + e*.000041*cos(ms+de); + hp = hp+e*.000035*cos(2*md-ms)-.000033*cos(3*md-2*de)- + .00003*cos(md+de)-.000029*cos(2*(f-de))-e*.000029*cos(2*md+ms)+ + e2*.000026*cos(2*(de-ms))-.000023*cos(2*(f-de)+md)+ + e*.000019*cos(4*de-ms-md); + horzPar = degToRad(hp); // At this point we have values of ecliptic longitude, latitude and // horizontal parallax (eclLong, eclLat, horzPar) in radians. @@ -775,7 +775,7 @@ class MarsOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; mas = meanAnomalySun(t); @@ -796,28 +796,28 @@ class MarsOrbit : public CachingOrbit dml = degToRad(-1*(1.133e-2*sin(a)+9.33e-3*cos(a))); dm = dml; dl = 7.05e-3*cos(map[3]-map[2]-8.5448e-1)+ - 6.07e-3*cos(2*map[3]-map[2]-3.2873)+ - 4.45e-3*cos(2*map[3]-2*map[2]-3.3492)+ - 3.88e-3*cos(mas-2*map[2]+3.5771e-1)+ - 2.38e-3*cos(mas-map[2]+6.1256e-1)+ - 2.04e-3*cos(2*mas-3*map[2]+2.7688)+ - 1.77e-3*cos(3*map[2]-map[2-1]-1.0053)+ - 1.36e-3*cos(2*mas-4*map[2]+2.6894)+ - 1.04e-3*cos(map[3]+3.0749e-1); + 6.07e-3*cos(2*map[3]-map[2]-3.2873)+ + 4.45e-3*cos(2*map[3]-2*map[2]-3.3492)+ + 3.88e-3*cos(mas-2*map[2]+3.5771e-1)+ + 2.38e-3*cos(mas-map[2]+6.1256e-1)+ + 2.04e-3*cos(2*mas-3*map[2]+2.7688)+ + 1.77e-3*cos(3*map[2]-map[2-1]-1.0053)+ + 1.36e-3*cos(2*mas-4*map[2]+2.6894)+ + 1.04e-3*cos(map[3]+3.0749e-1); dr = 5.3227e-5*cos(map[3]-map[2]+7.17864e-1)+ - 5.0989e-5*cos(2*map[3]-2*map[2]-1.77997)+ - 3.8278e-5*cos(2*map[3]-map[2]-1.71617)+ - 1.5996e-5*cos(mas-map[2]-9.69618e-1)+ - 1.4764e-5*cos(2*mas-3*map[2]+1.19768)+ - 8.966e-6*cos(map[3]-2*map[2]+7.61225e-1); + 5.0989e-5*cos(2*map[3]-2*map[2]-1.77997)+ + 3.8278e-5*cos(2*map[3]-map[2]-1.71617)+ + 1.5996e-5*cos(mas-map[2]-9.69618e-1)+ + 1.4764e-5*cos(2*mas-3*map[2]+1.19768)+ + 8.966e-6*cos(map[3]-2*map[2]+7.61225e-1); dr += 7.914e-6*cos(3*map[3]-2*map[2]-2.43887)+ - 7.004e-6*cos(2*map[3]-3*map[2]-1.79573)+ - 6.62e-6*cos(mas-2*map[2]+1.97575)+ - 4.93e-6*cos(3*map[3]-3*map[2]-1.33069)+ - 4.693e-6*cos(3*mas-5*map[2]+3.32665)+ - 4.571e-6*cos(2*mas-4*map[2]+4.27086)+ - 4.409e-6*cos(3*map[3]-map[2]-2.02158); + 7.004e-6*cos(2*map[3]-3*map[2]-1.79573)+ + 6.62e-6*cos(mas-2*map[2]+1.97575)+ + 4.93e-6*cos(3*map[3]-3*map[2]-1.33069)+ + 4.693e-6*cos(3*mas-5*map[2]+3.32665)+ + 4.571e-6*cos(2*mas-4*map[2]+4.27086)+ + 4.409e-6*cos(3*map[3]-map[2]-2.02158); computePlanetCoords(p, map[p], da, dhl, dl, dm, dml, dr, ds, eclLong, eclLat, distance); @@ -864,7 +864,7 @@ class JupiterOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; computePlanetElements(t, pList); @@ -892,42 +892,42 @@ class JupiterOrbit : public CachingOrbit c4x7 = cos(4*x7); c5x7 = cos(5*x7); dml = (3.31364e-1-(1.0281e-2+4.692e-3*x1)*x1)*sx5+ - (3.228e-3-(6.4436e-2-2.075e-3*x1)*x1)*cx5- - (3.083e-3+(2.75e-4-4.89e-4*x1)*x1)*s2x5+ - 2.472e-3*sx6+1.3619e-2*sx7+1.8472e-2*s2x7+6.717e-3*s3x7+ - 2.775e-3*s4x7+6.417e-3*s2x7*sx3+ - (7.275e-3-1.253e-3*x1)*sx7*sx3+ - 2.439e-3*s3x7*sx3-(3.5681e-2+1.208e-3*x1)*sx7*cx3; + (3.228e-3-(6.4436e-2-2.075e-3*x1)*x1)*cx5- + (3.083e-3+(2.75e-4-4.89e-4*x1)*x1)*s2x5+ + 2.472e-3*sx6+1.3619e-2*sx7+1.8472e-2*s2x7+6.717e-3*s3x7+ + 2.775e-3*s4x7+6.417e-3*s2x7*sx3+ + (7.275e-3-1.253e-3*x1)*sx7*sx3+ + 2.439e-3*s3x7*sx3-(3.5681e-2+1.208e-3*x1)*sx7*cx3; dml += -3.767e-3*c2x7*sx3-(3.3839e-2+1.125e-3*x1)*cx7*sx3- - 4.261e-3*s2x7*cx3+ - (1.161e-3*x1-6.333e-3)*cx7*cx3+ - 2.178e-3*cx3-6.675e-3*c2x7*cx3-2.664e-3*c3x7*cx3- - 2.572e-3*sx7*s2x3-3.567e-3*s2x7*s2x3+2.094e-3*cx7*c2x3+ - 3.342e-3*c2x7*c2x3; + 4.261e-3*s2x7*cx3+ + (1.161e-3*x1-6.333e-3)*cx7*cx3+ + 2.178e-3*cx3-6.675e-3*c2x7*cx3-2.664e-3*c3x7*cx3- + 2.572e-3*sx7*s2x3-3.567e-3*s2x7*s2x3+2.094e-3*cx7*c2x3+ + 3.342e-3*c2x7*c2x3; dml = degToRad(dml); ds = (3606+(130-43*x1)*x1)*sx5+(1289-580*x1)*cx5-6764*sx7*sx3- - 1110*s2x7*sx3-224*s3x7*sx3-204*sx3+(1284+116*x1)*cx7*sx3+ - 188*c2x7*sx3+(1460+130*x1)*sx7*cx3+224*s2x7*cx3-817*cx3+ - 6074*cx3*cx7+992*c2x7*cx3+ - 508*c3x7*cx3+230*c4x7*cx3+108*c5x7*cx3; + 1110*s2x7*sx3-224*s3x7*sx3-204*sx3+(1284+116*x1)*cx7*sx3+ + 188*c2x7*sx3+(1460+130*x1)*sx7*cx3+224*s2x7*cx3-817*cx3+ + 6074*cx3*cx7+992*c2x7*cx3+ + 508*c3x7*cx3+230*c4x7*cx3+108*c5x7*cx3; ds += -(956+73*x1)*sx7*s2x3+448*s2x7*s2x3+137*s3x7*s2x3+ - (108*x1-997)*cx7*s2x3+480*c2x7*s2x3+148*c3x7*s2x3+ - (99*x1-956)*sx7*c2x3+490*s2x7*c2x3+ - 158*s3x7*c2x3+179*c2x3+(1024+75*x1)*cx7*c2x3- - 437*c2x7*c2x3-132*c3x7*c2x3; + (108*x1-997)*cx7*s2x3+480*c2x7*s2x3+148*c3x7*s2x3+ + (99*x1-956)*sx7*c2x3+490*s2x7*c2x3+ + 158*s3x7*c2x3+179*c2x3+(1024+75*x1)*cx7*c2x3- + 437*c2x7*c2x3-132*c3x7*c2x3; ds *= 1e-7; dp = (7.192e-3-3.147e-3*x1)*sx5-4.344e-3*sx3+ - (x1*(1.97e-4*x1-6.75e-4)-2.0428e-2)*cx5+ - 3.4036e-2*cx7*sx3+(7.269e-3+6.72e-4*x1)*sx7*sx3+ - 5.614e-3*c2x7*sx3+2.964e-3*c3x7*sx3+3.7761e-2*sx7*cx3+ - 6.158e-3*s2x7*cx3- - 6.603e-3*cx7*cx3-5.356e-3*sx7*s2x3+2.722e-3*s2x7*s2x3+ - 4.483e-3*cx7*s2x3-2.642e-3*c2x7*s2x3+4.403e-3*sx7*c2x3- - 2.536e-3*s2x7*c2x3+5.547e-3*cx7*c2x3-2.689e-3*c2x7*c2x3; + (x1*(1.97e-4*x1-6.75e-4)-2.0428e-2)*cx5+ + 3.4036e-2*cx7*sx3+(7.269e-3+6.72e-4*x1)*sx7*sx3+ + 5.614e-3*c2x7*sx3+2.964e-3*c3x7*sx3+3.7761e-2*sx7*cx3+ + 6.158e-3*s2x7*cx3- + 6.603e-3*cx7*cx3-5.356e-3*sx7*s2x3+2.722e-3*s2x7*s2x3+ + 4.483e-3*cx7*s2x3-2.642e-3*c2x7*s2x3+4.403e-3*sx7*c2x3- + 2.536e-3*s2x7*c2x3+5.547e-3*cx7*c2x3-2.689e-3*c2x7*c2x3; dm = dml-(degToRad(dp)/s); da = 205*cx7-263*cx5+693*c2x7+312*c3x7+147*c4x7+299*sx7*sx3+ - 181*c2x7*sx3+204*s2x7*cx3+111*s3x7*cx3-337*cx7*cx3- - 111*c2x7*cx3; + 181*c2x7*sx3+204*s2x7*cx3+111*s3x7*cx3-337*cx7*cx3- + 111*c2x7*cx3; da *= 1e-6; computePlanetCoords(p, map, da, dhl, dl, dm, dml, dr, ds, @@ -976,7 +976,7 @@ class SaturnOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; computePlanetElements(t, pList); @@ -1015,57 +1015,57 @@ class SaturnOrbit : public CachingOrbit s3x8 = sin(3*x8); c3x8 = cos(3*x8); dml = 7.581e-3*s2x5-7.986e-3*sx6-1.48811e-1*sx7-4.0786e-2*s2x7- - (8.14181e-1-(1.815e-2-1.6714e-2*x1)*x1)*sx5- - (1.0497e-2-(1.60906e-1-4.1e-3*x1)*x1)*cx5-1.5208e-2*s3x7- - 6.339e-3*s4x7-6.244e-3*sx3-1.65e-2*s2x7*sx3+ - (8.931e-3+2.728e-3*x1)*sx7*sx3-5.775e-3*s3x7*sx3+ - (8.1344e-2+3.206e-3*x1)*cx7*sx3+1.5019e-2*c2x7*sx3; + (8.14181e-1-(1.815e-2-1.6714e-2*x1)*x1)*sx5- + (1.0497e-2-(1.60906e-1-4.1e-3*x1)*x1)*cx5-1.5208e-2*s3x7- + 6.339e-3*s4x7-6.244e-3*sx3-1.65e-2*s2x7*sx3+ + (8.931e-3+2.728e-3*x1)*sx7*sx3-5.775e-3*s3x7*sx3+ + (8.1344e-2+3.206e-3*x1)*cx7*sx3+1.5019e-2*c2x7*sx3; dml += (8.5581e-2+2.494e-3*x1)*sx7*cx3+1.4394e-2*c2x7*cx3+ - (2.5328e-2-3.117e-3*x1)*cx7*cx3+ - 6.319e-3*c3x7*cx3+6.369e-3*sx7*s2x3+9.156e-3*s2x7*s2x3+ - 7.525e-3*s3x8*s2x3-5.236e-3*cx7*c2x3-7.736e-3*c2x7*c2x3- - 7.528e-3*c3x8*c2x3; + (2.5328e-2-3.117e-3*x1)*cx7*cx3+ + 6.319e-3*c3x7*cx3+6.369e-3*sx7*s2x3+9.156e-3*s2x7*s2x3+ + 7.525e-3*s3x8*s2x3-5.236e-3*cx7*c2x3-7.736e-3*c2x7*c2x3- + 7.528e-3*c3x8*c2x3; dml = degToRad(dml); ds = (-7927+(2548+91*x1)*x1)*sx5+(13381+(1226-253*x1)*x1)*cx5+ - (248-121*x1)*s2x5-(305+91*x1)*c2x5+412*s2x7+12415*sx3+ - (390-617*x1)*sx7*sx3+(165-204*x1)*s2x7*sx3+26599*cx7*sx3- - 4687*c2x7*sx3-1870*c3x7*sx3-821*c4x7*sx3- - 377*c5x7*sx3+497*c2x8*sx3+(163-611*x1)*cx3; + (248-121*x1)*s2x5-(305+91*x1)*c2x5+412*s2x7+12415*sx3+ + (390-617*x1)*sx7*sx3+(165-204*x1)*s2x7*sx3+26599*cx7*sx3- + 4687*c2x7*sx3-1870*c3x7*sx3-821*c4x7*sx3- + 377*c5x7*sx3+497*c2x8*sx3+(163-611*x1)*cx3; ds += -12696*sx7*cx3-4200*s2x7*cx3-1503*s3x7*cx3-619*s4x7*cx3- - 268*s5x7*cx3-(282+1306*x1)*cx7*cx3+(-86+230*x1)*c2x7*cx3+ - 461*s2x8*cx3-350*s2x3+(2211-286*x1)*sx7*s2x3- - 2208*s2x7*s2x3-568*s3x7*s2x3-346*s4x7*s2x3- - (2780+222*x1)*cx7*s2x3+(2022+263*x1)*c2x7*s2x3+248*c3x7*s2x3+ - 242*s3x8*s2x3+467*c3x8*s2x3-490*c2x3-(2842+279*x1)*sx7*c2x3; + 268*s5x7*cx3-(282+1306*x1)*cx7*cx3+(-86+230*x1)*c2x7*cx3+ + 461*s2x8*cx3-350*s2x3+(2211-286*x1)*sx7*s2x3- + 2208*s2x7*s2x3-568*s3x7*s2x3-346*s4x7*s2x3- + (2780+222*x1)*cx7*s2x3+(2022+263*x1)*c2x7*s2x3+248*c3x7*s2x3+ + 242*s3x8*s2x3+467*c3x8*s2x3-490*c2x3-(2842+279*x1)*sx7*c2x3; ds += (128+226*x1)*s2x7*c2x3+224*s3x7*c2x3+ - (-1594+282*x1)*cx7*c2x3+(2162-207*x1)*c2x7*c2x3+ - 561*c3x7*c2x3+343*c4x7*c2x3+469*s3x8*c2x3-242*c3x8*c2x3- - 205*sx7*s3x3+262*s3x7*s3x3+208*cx7*c3x3-271*c3x7*c3x3- - 382*c3x7*s4x3-376*s3x7*c4x3; + (-1594+282*x1)*cx7*c2x3+(2162-207*x1)*c2x7*c2x3+ + 561*c3x7*c2x3+343*c4x7*c2x3+469*s3x8*c2x3-242*c3x8*c2x3- + 205*sx7*s3x3+262*s3x7*s3x3+208*cx7*c3x3-271*c3x7*c3x3- + 382*c3x7*s4x3-376*s3x7*c4x3; ds *= 1e-7; dp = (7.7108e-2+(7.186e-3-1.533e-3*x1)*x1)*sx5-7.075e-3*sx7+ - (4.5803e-2-(1.4766e-2+5.36e-4*x1)*x1)*cx5-7.2586e-2*cx3- - 7.5825e-2*sx7*sx3-2.4839e-2*s2x7*sx3-8.631e-3*s3x7*sx3- - 1.50383e-1*cx7*cx3+2.6897e-2*c2x7*cx3+1.0053e-2*c3x7*cx3- - (1.3597e-2+1.719e-3*x1)*sx7*s2x3+1.1981e-2*s2x7*c2x3; + (4.5803e-2-(1.4766e-2+5.36e-4*x1)*x1)*cx5-7.2586e-2*cx3- + 7.5825e-2*sx7*sx3-2.4839e-2*s2x7*sx3-8.631e-3*s3x7*sx3- + 1.50383e-1*cx7*cx3+2.6897e-2*c2x7*cx3+1.0053e-2*c3x7*cx3- + (1.3597e-2+1.719e-3*x1)*sx7*s2x3+1.1981e-2*s2x7*c2x3; dp += -(7.742e-3-1.517e-3*x1)*cx7*s2x3+ - (1.3586e-2-1.375e-3*x1)*c2x7*c2x3- - (1.3667e-2-1.239e-3*x1)*sx7*c2x3+ - (1.4861e-2+1.136e-3*x1)*cx7*c2x3- - (1.3064e-2+1.628e-3*x1)*c2x7*c2x3; + (1.3586e-2-1.375e-3*x1)*c2x7*c2x3- + (1.3667e-2-1.239e-3*x1)*sx7*c2x3+ + (1.4861e-2+1.136e-3*x1)*cx7*c2x3- + (1.3064e-2+1.628e-3*x1)*c2x7*c2x3; dm = dml-(degToRad(dp)/s); da = 572*sx5-1590*s2x7*cx3+2933*cx5-647*s3x7*cx3+33629*cx7- - 344*s4x7*cx3-3081*c2x7+2885*cx7*cx3-1423*c3x7+ - (2172+102*x1)*c2x7*cx3-671*c4x7+296*c3x7*cx3-320*c5x7- - 267*s2x7*s2x3+1098*sx3-778*cx7*s2x3-2812*sx7*sx3; + 344*s4x7*cx3-3081*c2x7+2885*cx7*cx3-1423*c3x7+ + (2172+102*x1)*c2x7*cx3-671*c4x7+296*c3x7*cx3-320*c5x7- + 267*s2x7*s2x3+1098*sx3-778*cx7*s2x3-2812*sx7*sx3; da += 495*c2x7*s2x3+688*s2x7*sx3+250*c3x7*s2x3-393*s3x7*sx3- - 856*sx7*c2x3-228*s4x7*sx3+441*s2x7*c2x3+2138*cx7*sx3+ - 296*c2x7*c2x3-999*c2x7*sx3+211*c3x7*c2x3-642*c3x7*sx3- - 427*sx7*s3x3-325*c4x7*sx3+398*s3x7*s3x3-890*cx3+ - 344*cx7*c3x3+2206*sx7*cx3-427*c3x7*c3x3; + 856*sx7*c2x3-228*s4x7*sx3+441*s2x7*c2x3+2138*cx7*sx3+ + 296*c2x7*c2x3-999*c2x7*sx3+211*c3x7*c2x3-642*c3x7*sx3- + 427*sx7*s3x3-325*c4x7*sx3+398*s3x7*s3x3-890*cx3+ + 344*cx7*c3x3+2206*sx7*cx3-427*c3x7*c3x3; da *= 1e-6; dhl = 7.47e-4*cx7*sx3+1.069e-3*cx7*cx3+2.108e-3*s2x7*s2x3+ - 1.261e-3*c2x7*s2x3+1.236e-3*s2x7*c2x3-2.075e-3*c2x7*c2x3; + 1.261e-3*c2x7*s2x3+1.236e-3*s2x7*c2x3-2.075e-3*c2x7*c2x3; dhl = degToRad(dhl); computePlanetCoords(p, map, da, dhl, dl, dm, dml, dr, ds, @@ -1113,7 +1113,7 @@ class UranusOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; computePlanetElements(t, pList); @@ -1132,7 +1132,7 @@ class UranusOrbit : public CachingOrbit x11 = x4-x3; x12 = x8-x4; dml = (8.64319e-1-1.583e-3*x1)*sx9+(8.2222e-2-6.833e-3*x1)*cx9+ - 3.6017e-2*s2x9-3.019e-3*c2x9+8.122e-3*sin(x6); + 3.6017e-2*s2x9-3.019e-3*c2x9+8.122e-3*sin(x6); dml = degToRad(dml); dp = 1.20303e-1*sx9+6.197e-3*s2x9+(1.9472e-2-9.47e-4*x1)*cx9; dm = dml-(degToRad(dp)/s); @@ -1140,11 +1140,11 @@ class UranusOrbit : public CachingOrbit ds *= 1e-7; da = -3.825e-3*cx9; dl = (1.0122e-2-9.88e-4*x1)*sin(x4+x11)+ - (-3.8581e-2+(2.031e-3-1.91e-3*x1)*x1)*cos(x4+x11)+ - (3.4964e-2-(1.038e-3-8.68e-4*x1)*x1)*cos(2*x4+x11)+ - 5.594e-3*sin(x4+3*x12)-1.4808e-2*sin(x10)- - 5.794e-3*sin(x11)+2.347e-3*cos(x11)+9.872e-3*sin(x12)+ - 8.803e-3*sin(2*x12)-4.308e-3*sin(3*x12); + (-3.8581e-2+(2.031e-3-1.91e-3*x1)*x1)*cos(x4+x11)+ + (3.4964e-2-(1.038e-3-8.68e-4*x1)*x1)*cos(2*x4+x11)+ + 5.594e-3*sin(x4+3*x12)-1.4808e-2*sin(x10)- + 5.794e-3*sin(x11)+2.347e-3*cos(x11)+9.872e-3*sin(x12)+ + 8.803e-3*sin(2*x12)-4.308e-3*sin(3*x12); sx11 = sin(x11); cx11 = cos(x11); sx4 = sin(x4); @@ -1152,13 +1152,13 @@ class UranusOrbit : public CachingOrbit s2x4 = sin(2*x4); c2x4 = cos(2*x4); dhl = (4.58e-4*sx11-6.42e-4*cx11-5.17e-4*cos(4*x12))*sx4- - (3.47e-4*sx11+8.53e-4*cx11+5.17e-4*sin(4*x11))*cx4+ - 4.03e-4*(cos(2*x12)*s2x4+sin(2*x12)*c2x4); + (3.47e-4*sx11+8.53e-4*cx11+5.17e-4*sin(4*x11))*cx4+ + 4.03e-4*(cos(2*x12)*s2x4+sin(2*x12)*c2x4); dhl = degToRad(dhl); dr = -25948+4985*cos(x10)-1230*cx4+3354*cos(x11)+904*cos(2*x12)+ - 894*(cos(x12)-cos(3*x12))+(5795*cx4-1165*sx4+1388*c2x4)*sx11+ - (1351*cx4+5702*sx4+1388*s2x4)*cos(x11); + 894*(cos(x12)-cos(3*x12))+(5795*cx4-1165*sx4+1388*c2x4)*sx11+ + (1351*cx4+5702*sx4+1388*s2x4)*cos(x11); dr *= 1e-6; computePlanetCoords(p, map, da, dhl, dl, dm, dml, dr, ds, @@ -1206,7 +1206,7 @@ class NeptuneOrbit : public CachingOrbit dl = dr = dml = ds = dm = da = dhl = 0.0; //Calculate the Julian centuries elapsed since 1900 - t = (jd - 2415020.0)/36525.0; + t = (jd - 2415020.0)/36525.0; computePlanetElements(t, pList); @@ -1214,35 +1214,35 @@ class NeptuneOrbit : public CachingOrbit //Compute perturbations s = gPlanetElements[p][3]; - auxJSun(t, &x1, &x2, &x3, &x4, &x5, &x6); + auxJSun(t, &x1, &x2, &x3, &x4, &x5, &x6); x8 = pfmod(1.46205+3.81337*t, TWOPI); x9 = 2*x8-x4; - sx9 = sin(x9); - cx9 = cos(x9); + sx9 = sin(x9); + cx9 = cos(x9); s2x9 = sin(2*x9); - c2x9 = cos(2*x9); - x10 = x8-x2; - x11 = x8-x3; - x12 = x8-x4; - dml = (1.089e-3*x1-5.89833e-1)*sx9+(4.658e-3*x1-5.6094e-2)*cx9- - 2.4286e-2*s2x9; - dml = degToRad(dml); - dp = 2.4039e-2*sx9-2.5303e-2*cx9+6.206e-3*s2x9-5.992e-3*c2x9; - dm = dml-(degToRad(dp)/s); - ds = 4389*sx9+1129*s2x9+4262*cx9+1089*c2x9; - ds *= 1e-7; - da = 8189*cx9-817*sx9+781*c2x9; - da *= 1e-6; - s2x12 = sin(2*x12); - c2x12 = cos(2*x12); - sx8 = sin(x8); - cx8 = cos(x8); - dl = -9.556e-3*sin(x10)-5.178e-3*sin(x11)+2.572e-3*s2x12- - 2.972e-3*c2x12*sx8-2.833e-3*s2x12*cx8; - dhl = 3.36e-4*c2x12*sx8+3.64e-4*s2x12*cx8; - dhl = degToRad(dhl); - dr = -40596+4992*cos(x10)+2744*cos(x11)+2044*cos(x12)+1051*c2x12; - dr *= 1e-6; + c2x9 = cos(2*x9); + x10 = x8-x2; + x11 = x8-x3; + x12 = x8-x4; + dml = (1.089e-3*x1-5.89833e-1)*sx9+(4.658e-3*x1-5.6094e-2)*cx9- + 2.4286e-2*s2x9; + dml = degToRad(dml); + dp = 2.4039e-2*sx9-2.5303e-2*cx9+6.206e-3*s2x9-5.992e-3*c2x9; + dm = dml-(degToRad(dp)/s); + ds = 4389*sx9+1129*s2x9+4262*cx9+1089*c2x9; + ds *= 1e-7; + da = 8189*cx9-817*sx9+781*c2x9; + da *= 1e-6; + s2x12 = sin(2*x12); + c2x12 = cos(2*x12); + sx8 = sin(x8); + cx8 = cos(x8); + dl = -9.556e-3*sin(x10)-5.178e-3*sin(x11)+2.572e-3*s2x12- + 2.972e-3*c2x12*sx8-2.833e-3*s2x12*cx8; + dhl = 3.36e-4*c2x12*sx8+3.64e-4*s2x12*cx8; + dhl = degToRad(dhl); + dr = -40596+4992*cos(x10)+2744*cos(x11)+2044*cos(x12)+1051*c2x12; + dr *= 1e-6; computePlanetCoords(p, map, da, dhl, dl, dm, dml, dr, ds, eclLong, eclLat, distance); @@ -2077,7 +2077,7 @@ class MimasOrbit : public CachingOrbit double getPeriod() const { - return 0.9424218; + return 0.9424218; }; double getBoundingRadius() const @@ -2118,7 +2118,7 @@ class EnceladusOrbit : public CachingOrbit double getPeriod() const { - return 1.370218; + return 1.370218; }; double getBoundingRadius() const @@ -2197,7 +2197,7 @@ class DioneOrbit : public CachingOrbit double getPeriod() const { - return 2.736915; + return 2.736915; }; double getBoundingRadius() const @@ -2726,7 +2726,7 @@ static UranianSatelliteOrbit* CreateUranianSatelliteOrbit(int n) /*! Orbit of Triton, from Seidelmann, _Explanatory Supplement to the * Astronomical Almanac_ (1992), p.373-374. The position of Triton - * is calculated in Neptunocentric coordinates referred to the + * is calculated in Neptunocentric coordinates referred to the * Earth equator/equinox of J2000.0. */ class TritonOrbit : public CachingOrbit @@ -2796,9 +2796,9 @@ class TritonOrbit : public CachingOrbit * Translated to C++ by Chris Laurel from FORTRAN source available at: * ftp://ftp.imcce.fr/pub/ephem/satel/htc20 * - * Coordinates are Saturnocentric and referred to the ecliptic + * Coordinates are Saturnocentric and referred to the ecliptic * and equinox of J2000.0. - */ + */ static const double HeleneTerms[24*5] = { 0,0,0,0,1, @@ -2827,8 +2827,8 @@ static const double HeleneTerms[24*5] = 0,1,-1,0,1, }; -static const double HeleneAmps[24*6] = -{ +static const double HeleneAmps[24*6] = +{ -0.002396,-0.000399,0.000442,0.001278,-0.004939,0.002466, 0.000557,-0.002152,0.001074,0.005500,0.000916,-0.001015,-0.000003, 0.,0.,0.000003,-0.000011,0.000006,-0.000066,0.000265,-0.000133, @@ -2943,8 +2943,8 @@ struct HTC20Angles static const HTC20Angles HeleneAngles = -{ - 2.29427177, +{ + 2.29427177, -0.00802443, 2.29714724, 2.29571726, @@ -3243,7 +3243,7 @@ Orbit* GetCustomOrbit(const string& name) return CreateJPLEphOrbit(JPLEph_Moon, JPLEph_Earth, 27.321661, 5.0e5); if (name == "jpl-earth-emb") // Earth, barycentric return CreateJPLEphOrbit(JPLEph_Earth, JPLEph_EarthMoonBary, 27.321, 1.0e5); - + if (name == "jpl-sun-ssb") // Position of Sun relative to SSB return CreateJPLEphOrbit(JPLEph_Sun, JPLEph_SSB, 11.861773 * 365.25, 2000000); diff --git a/src/celephem/customrotation.cpp b/src/celephem/customrotation.cpp index 881956609..e9dabd1c2 100644 --- a/src/celephem/customrotation.cpp +++ b/src/celephem/customrotation.cpp @@ -48,12 +48,12 @@ public: period(_period), flipped(false) { } - + virtual ~IAURotationModel() {} - + bool isPeriodic() const { return true; } double getPeriod() const { return period; } - + virtual Quaterniond computeSpin(double t) const { // Time argument of IAU rotation models is actually day since J2000.0 TT, but @@ -64,26 +64,26 @@ public: else return YRotation(-degToRad(180.0 + meridian(t))); } - + virtual Quaterniond computeEquatorOrientation(double t) const { double poleRA = 0.0; double poleDec = 0.0; - + t = t - astro::J2000; pole(t, poleRA, poleDec); double node = poleRA + 90.0; double inclination = 90.0 - poleDec; - + if (flipped) return XRotation(PI) * XRotation(degToRad(-inclination)) * YRotation(degToRad(-node)); else return XRotation(degToRad(-inclination)) * YRotation(degToRad(-node)); } - + // Return the RA and declination (in degrees) of the rotation axis virtual void pole(double t, double& ra, double& dec) const = 0; - + virtual double meridian(double t) const = 0; protected: @@ -99,7 +99,7 @@ protected: { flipped = _flipped; } - + private: double period; bool flipped; @@ -115,11 +115,11 @@ public: EarthRotationModel() { } - + ~EarthRotationModel() { } - + Quaterniond computeSpin(double tjd) const { // TODO: Use a more accurate model for sidereal time @@ -128,23 +128,23 @@ public: return YRotation(-theta); } - + Quaterniond computeEquatorOrientation(double tjd) const { double T = (tjd - astro::J2000) / 36525.0; - + // Clamp T to the valid time range of the precession theory. if (T < -P03LP_VALID_CENTURIES) T = -P03LP_VALID_CENTURIES; else if (T > P03LP_VALID_CENTURIES) T = P03LP_VALID_CENTURIES; - + astro::PrecessionAngles prec = astro::PrecObliquity_P03LP(T); astro::EclipticPole pole = astro::EclipticPrecession_P03LP(T); - + double obliquity = degToRad(prec.epsA / 3600); double precession = degToRad(prec.pA / 3600); - + // Calculate the angles pi and Pi from the ecliptic pole coordinates // P and Q: // P = sin(pi)*sin(Pi) @@ -161,11 +161,11 @@ public: Quaterniond eclRotation = RPi.conjugate() * rpi * RPi; Quaterniond q = XRotation(obliquity) * ZRotation(-precession) * eclRotation.conjugate(); - + // convert to Celestia's coordinate system return XRotation(PI / 2.0) * q * XRotation(-PI / 2.0); } - + double getPeriod() const { return 23.9344694 / 24.0; @@ -188,7 +188,7 @@ public: class IAUPrecessingRotationModel : public IAURotationModel { public: - + /*! rotationRate is in degrees per Julian day * pole precession is in degrees per Julian century */ @@ -209,7 +209,7 @@ public: if (rotationRate < 0.0) setFlipped(true); } - + void pole(double d, double& ra, double &dec) const { double T = d / 36525.0; @@ -217,12 +217,12 @@ public: ra = poleRA + poleRARate * T; dec = poleDec + poleDecRate * T; } - + double meridian(double d) const { return meridianAtEpoch + rotationRate * d; } - + private: double poleRA; double poleRARate; @@ -237,7 +237,7 @@ class IAUNeptuneRotationModel : public IAURotationModel { public: IAUNeptuneRotationModel() : IAURotationModel(360.0 / 536.3128492) {} - + void pole(double d, double& ra, double &dec) const { double T = d / 36525.0; @@ -245,13 +245,13 @@ public: ra = 299.36 + 0.70 * sin(N); dec = 43.46 - 0.51 * cos(N); } - + double meridian(double d) const { double T = d / 36525.0; double N = degToRad(357.85 + 52.316 * T); return 253.18 + 536.3128492 * d - 0.48 * sin(N); - } + } }; @@ -263,7 +263,7 @@ class IAULunarRotationModel : public IAURotationModel { public: IAULunarRotationModel() : IAURotationModel(360.0 / 13.17635815) {} - + void calcArgs(double d, double E[14]) const { E[1] = degToRad(125.045 - 0.0529921 * d); @@ -280,7 +280,7 @@ public: E[12] = degToRad(239.961 + 0.1643573 * d); E[13] = degToRad( 25.053 + 12.9590088 * d); } - + void pole(double d, double& ra, double& dec) const { double T = d / 36525.0; @@ -288,7 +288,7 @@ public: double E[14]; calcArgs(d, E); - + ra = 269.9949 + 0.0013*T - 3.8787 * sin(E[1]) @@ -298,7 +298,7 @@ public: + 0.0072 * sin(E[6]) - 0.0052 * sin(E[10]) + 0.0043 * sin(E[13]); - + dec = 66.5392 + 0.0130 * T + 1.5419 * cos(E[1]) @@ -309,10 +309,10 @@ public: + 0.0009 * cos(E[7]) + 0.0008 * cos(E[10]) - 0.0009 * cos(E[13]); - - + + } - + double meridian(double d) const { double E[14]; @@ -342,7 +342,7 @@ public: }; -// Rotations of Martian, Jovian, and Uranian satellites from IAU/IAG Working group +// Rotations of Martian, Jovian, and Uranian satellites from IAU/IAG Working group // on Cartographic Coordinates and Rotational Elements (Corrected for known errata // as of 17 Feb 2006) // See: http://astrogeology.usgs.gov/Projects/WGCCRE/constants/iau2000_table2.html @@ -351,7 +351,7 @@ class IAUPhobosRotationModel : public IAURotationModel { public: IAUPhobosRotationModel() : IAURotationModel(360.0 / 1128.8445850) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -360,7 +360,7 @@ public: ra = 317.68 - 0.108 * T + 1.79 * sin(M1); dec = 52.90 - 0.061 * T - 1.08 * cos(M1); } - + double meridian(double t) const { // Note: negative coefficient of T^2 term for meridian angle indicates faster @@ -377,7 +377,7 @@ class IAUDeimosRotationModel : public IAURotationModel { public: IAUDeimosRotationModel() : IAURotationModel(360.0 / 285.1618970) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -386,7 +386,7 @@ public: ra = 316.65 - 0.108 * T + 2.98 * sin(M3); dec = 53.52 - 0.061 * T - 1.78 * cos(M3); } - + double meridian(double t) const { // Note: positive coefficient of T^2 term for meridian angle indicates slowing @@ -399,12 +399,12 @@ public: /****** Satellites of Jupiter ******/ - + class IAUAmaltheaRotationModel : public IAURotationModel { public: IAUAmaltheaRotationModel() : IAURotationModel(360.0 / 722.6314560) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -413,7 +413,7 @@ public: ra = 268.05 - 0.009 * T - 0.84 * sin(J1) + 0.01 * sin(2.0 * J1); dec = 64.49 + 0.003 * T - 0.36 * cos(J1); } - + double meridian(double t) const { double T = t / 36525.0; @@ -427,22 +427,22 @@ class IAUThebeRotationModel : public IAURotationModel { public: IAUThebeRotationModel() : IAURotationModel(360.0 / 533.7004100) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; double J2 = degToRad(24.62 + 45137.2 * T); clamp_centuries(T); ra = 268.05 - 0.009 * T - 2.11 * sin(J2) + 0.04 * sin(2.0 * J2); - dec = 64.49 + 0.003 * T - 0.91 * cos(J2) + 0.01 * cos(2.0 * J2); + dec = 64.49 + 0.003 * T - 0.91 * cos(J2) + 0.01 * cos(2.0 * J2); } - + double meridian(double t) const { double T = t / 36525.0; double J2 = degToRad(24.62 + 45137.2 * T); return 8.56 + 533.7004100 * t + 1.91 * sin(J2) - 0.04 * sin(2.0 * J2); - } + } }; @@ -450,7 +450,7 @@ class IAUIoRotationModel : public IAURotationModel { public: IAUIoRotationModel() : IAURotationModel(360.0 / 203.4889538) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -458,16 +458,16 @@ public: double J4 = degToRad(355.80 + 1191.3 * T); clamp_centuries(T); ra = 268.05 - 0.009 * T + 0.094 * sin(J3) + 0.024 * sin(J4); - dec = 64.49 + 0.003 * T + 0.040 * cos(J3) + 0.011 * cos(J4); + dec = 64.49 + 0.003 * T + 0.040 * cos(J3) + 0.011 * cos(J4); } - + double meridian(double t) const { double T = t / 36525.0; double J3 = degToRad(283.90 + 4850.7 * T); double J4 = degToRad(355.80 + 1191.3 * T); return 200.39 + 203.4889538 * t - 0.085 * sin(J3) - 0.022 * sin(J4); - } + } }; @@ -475,7 +475,7 @@ class IAUEuropaRotationModel : public IAURotationModel { public: IAUEuropaRotationModel() : IAURotationModel(360.0 / 101.3747235) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -485,9 +485,9 @@ public: double J7 = degToRad(352.35 + 2382.6 * T); clamp_centuries(T); ra = 268.05 - 0.009 * T + 1.086 * sin(J4) + 0.060 * sin(J5) + 0.015 * sin(J6) + 0.009 * sin(J7); - dec = 64.49 + 0.003 * T + 0.486 * cos(J4) + 0.026 * cos(J5) + 0.007 * cos(J6) + 0.002 * cos(J7); + dec = 64.49 + 0.003 * T + 0.486 * cos(J4) + 0.026 * cos(J5) + 0.007 * cos(J6) + 0.002 * cos(J7); } - + double meridian(double t) const { double T = t / 36525.0; @@ -496,7 +496,7 @@ public: double J6 = degToRad(229.80 + 64.3 * T); double J7 = degToRad(352.35 + 2382.6 * T); return 36.022 + 101.3747235 * t - 0.980 * sin(J4) - 0.054 * sin(J5) - 0.014 * sin(J6) - 0.008 * sin(J7); - } + } }; @@ -504,7 +504,7 @@ class IAUGanymedeRotationModel : public IAURotationModel { public: IAUGanymedeRotationModel() : IAURotationModel(360.0 / 50.3176081) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -513,9 +513,9 @@ public: double J6 = degToRad(229.80 + 64.3 * T); clamp_centuries(T); ra = 268.05 - 0.009 * T - 0.037 * sin(J4) + 0.431 * sin(J5) + 0.091 * sin(J6); - dec = 64.49 + 0.003 * T - 0.016 * cos(J4) + 0.186 * cos(J5) + 0.039 * cos(J6); + dec = 64.49 + 0.003 * T - 0.016 * cos(J4) + 0.186 * cos(J5) + 0.039 * cos(J6); } - + double meridian(double t) const { double T = t / 36525.0; @@ -523,7 +523,7 @@ public: double J5 = degToRad(119.90 + 262.1 * T); double J6 = degToRad(229.80 + 64.3 * T); return 44.064 + 50.3176081 * t + 0.033 * sin(J4) - 0.389 * sin(J5) - 0.082 * sin(J6); - } + } }; @@ -531,7 +531,7 @@ class IAUCallistoRotationModel : public IAURotationModel { public: IAUCallistoRotationModel() : IAURotationModel(360.0 / 21.5710715) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -540,9 +540,9 @@ public: double J8 = degToRad(113.35 + 6070.0 * T); clamp_centuries(T); ra = 268.05 - 0.009 * T - 0.068 * sin(J5) + 0.590 * sin(J6) + 0.010 * sin(J8); - dec = 64.49 + 0.003 * T - 0.029 * cos(J5) + 0.254 * cos(J6) - 0.004 * cos(J8); + dec = 64.49 + 0.003 * T - 0.029 * cos(J5) + 0.254 * cos(J6) - 0.004 * cos(J8); } - + double meridian(double t) const { double T = t / 36525.0; @@ -550,7 +550,7 @@ public: double J6 = degToRad(229.80 + 64.3 * T); double J8 = degToRad(113.35 + 6070.0 * T); return 259.51 + 21.5710715 * t + 0.061 * sin(J5) - 0.533 * sin(J6) - 0.009 * sin(J8); - } + } }; @@ -573,7 +573,7 @@ class IAUMimasRotationModel : public IAURotationModel { public: IAUMimasRotationModel() : IAURotationModel(360.0 / 381.9945550) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -582,13 +582,13 @@ public: ra = 40.66 - 0.036 * T + 13.56 * sin(S3); dec = 83.52 - 0.004 * T - 1.53 * cos(S3); } - + double meridian(double t) const { double T = t / 36525.0; double S3 = degToRad(177.40 - 36505.5 * T); double S9 = degToRad(316.45 + 506.2 * T); - return 337.46 + 381.9945550 * t - 13.48 * sin(S3) - 44.85 * sin(S9); + return 337.46 + 381.9945550 * t - 13.48 * sin(S3) - 44.85 * sin(S9); } }; @@ -597,7 +597,7 @@ class IAUEnceladusRotationModel : public IAURotationModel { public: IAUEnceladusRotationModel() : IAURotationModel(360.0 / 262.7318996) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -605,7 +605,7 @@ public: ra = 40.66 - 0.036 * T; dec = 83.52 - 0.004 * T; } - + double meridian(double t) const { return 2.82 + 262.7318996 * t; @@ -617,7 +617,7 @@ class IAUTethysRotationModel : public IAURotationModel { public: IAUTethysRotationModel() : IAURotationModel(360.0 / 190.6979085) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -626,13 +626,13 @@ public: ra = 40.66 - 0.036 * T - 9.66 * sin(S4); dec = 83.52 - 0.004 * T - 1.09 * cos(S4); } - + double meridian(double t) const { double T = t / 36525.0; double S4 = degToRad(300.00 - 7225.9 * T); double S9 = degToRad(316.45 + 506.2 * T); - return 10.45 + 190.6979085 * t - 9.60 * sin(S4) + 2.23 * sin(S9); + return 10.45 + 190.6979085 * t - 9.60 * sin(S4) + 2.23 * sin(S9); } }; @@ -641,7 +641,7 @@ class IAUTelestoRotationModel : public IAURotationModel { public: IAUTelestoRotationModel() : IAURotationModel(360.0 / 190.6979330) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -649,7 +649,7 @@ public: ra = 50.50 - 0.036 * T; dec = 84.06 - 0.004 * T; } - + double meridian(double t) const { return 56.88 + 190.6979330 * t; @@ -661,7 +661,7 @@ class IAUCalypsoRotationModel : public IAURotationModel { public: IAUCalypsoRotationModel() : IAURotationModel(360.0 / 190.6742373) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -670,7 +670,7 @@ public: ra = 40.58 - 0.036 * T - 13.943 * sin(S5) - 1.686 * sin(2.0 * S5); dec = 83.43 - 0.004 * T - 1.572 * cos(S5) + 0.095 * cos(2.0 * S5); } - + double meridian(double t) const { double T = t / 36525.0; @@ -684,7 +684,7 @@ class IAUDioneRotationModel : public IAURotationModel { public: IAUDioneRotationModel() : IAURotationModel(360.0 / 131.5349316) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -692,7 +692,7 @@ public: ra = 40.66 - 0.036 * T; dec = 83.52 - 0.004 * T; } - + double meridian(double t) const { return 357.00 + 131.5349316 * t; @@ -704,7 +704,7 @@ class IAUHeleneRotationModel : public IAURotationModel { public: IAUHeleneRotationModel() : IAURotationModel(360.0 / 131.6174056) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -713,7 +713,7 @@ public: ra = 40.58 - 0.036 * T + 1.662 * sin(S6) + 0.024 * sin(2.0 * S6); dec = 83.52 - 0.004 * T - 0.187 * cos(S6) + 0.095 * cos(2.0 * S6); } - + double meridian(double t) const { double T = t / 36525.0; @@ -727,7 +727,7 @@ class IAURheaRotationModel : public IAURotationModel { public: IAURheaRotationModel() : IAURotationModel(360.0 / 79.6900478) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -736,7 +736,7 @@ public: ra = 40.38 - 0.036 * T + 3.10 * sin(S7); dec = 83.55 - 0.004 * T - 0.35 * cos(S7); } - + double meridian(double t) const { double T = t / 36525.0; @@ -750,7 +750,7 @@ class IAUTitanRotationModel : public IAURotationModel { public: IAUTitanRotationModel() : IAURotationModel(360.0 / 22.5769768) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -759,7 +759,7 @@ public: ra = 36.41 - 0.036 * T + 2.66 * sin(S8); dec = 83.94 - 0.004 * T - 0.30 * cos(S8); } - + double meridian(double t) const { double T = t / 36525.0; @@ -773,7 +773,7 @@ class IAUIapetusRotationModel : public IAURotationModel { public: IAUIapetusRotationModel() : IAURotationModel(360.0 / 4.5379572) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -781,7 +781,7 @@ public: ra = 318.16 - 3.949 * T; dec = 75.03 - 1.142 * T; } - + double meridian(double t) const { return 350.20 + 4.5379572 * t; @@ -793,7 +793,7 @@ class IAUPhoebeRotationModel : public IAURotationModel { public: IAUPhoebeRotationModel() : IAURotationModel(360.0 / 22.5769768) {} - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -801,7 +801,7 @@ public: ra = 355.16; dec = 68.70 - 1.143 * T; } - + double meridian(double t) const { return 304.70 + 930.8338720 * t; @@ -813,7 +813,7 @@ class IAUMirandaRotationModel : public IAURotationModel { public: IAUMirandaRotationModel() : IAURotationModel(360.0 / 254.6906892) { setFlipped(true); } - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -821,7 +821,7 @@ public: ra = 257.43 + 4.41 * sin(U11) - 0.04 * sin(2.0 * U11); dec = -15.08 + 4.25 * cos(U11) - 0.02 * cos(2.0 * U11); } - + double meridian(double t) const { double T = t / 36525.0; @@ -838,7 +838,7 @@ class IAUArielRotationModel : public IAURotationModel { public: IAUArielRotationModel() : IAURotationModel(360.0 / 142.8356681) { setFlipped(true); } - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -846,7 +846,7 @@ public: ra = 257.43 + 0.29 * sin(U13); dec = -15.10 + 0.28 * cos(U13); } - + double meridian(double t) const { double T = t / 36525.0; @@ -861,7 +861,7 @@ class IAUUmbrielRotationModel : public IAURotationModel { public: IAUUmbrielRotationModel() : IAURotationModel(360.0 / 86.8688923) { setFlipped(true); } - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -869,7 +869,7 @@ public: ra = 257.43 + 0.21 * sin(U14); dec = -15.10 + 0.20 * cos(U14); } - + double meridian(double t) const { double T = t / 36525.0; @@ -884,7 +884,7 @@ class IAUTitaniaRotationModel : public IAURotationModel { public: IAUTitaniaRotationModel() : IAURotationModel(360.0 / 41.351431) { setFlipped(true); } - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -892,7 +892,7 @@ public: ra = 257.43 + 0.29 * sin(U15); dec = -15.10 + 0.28 * cos(U15); } - + double meridian(double t) const { double T = t / 36525.0; @@ -906,7 +906,7 @@ class IAUOberonRotationModel : public IAURotationModel { public: IAUOberonRotationModel() : IAURotationModel(360.0 / 26.7394932) { setFlipped(true); } - + void pole(double t, double& ra, double& dec) const { double T = t / 36525.0; @@ -914,7 +914,7 @@ public: ra = 257.43 + 0.16 * sin(U16); dec = -15.10 + 0.16 * cos(U16); } - + double meridian(double t) const { double T = t / 36525.0; @@ -932,9 +932,9 @@ GetCustomRotationModel(const std::string& name) if (!CustomRotationModelsInitialized) { CustomRotationModelsInitialized = true; - + CustomRotationModels["earth-p03lp"] = new EarthRotationModel(); - + // IAU rotation elements for the planets CustomRotationModels["iau-mercury"] = new IAUPrecessingRotationModel(281.01, -0.033, 61.45, -0.005, @@ -961,14 +961,14 @@ GetCustomRotationModel(const std::string& name) CustomRotationModels["iau-pluto"] = new IAUPrecessingRotationModel(313.02, 0.0, 9.09, 0.0, 236.77, -56.3623195); - + // IAU elements for satellite of Earth CustomRotationModels["iau-moon"] = new IAULunarRotationModel(); - + // IAU elements for satellites of Mars CustomRotationModels["iau-phobos"] = new IAUPhobosRotationModel(); CustomRotationModels["iau-deimos"] = new IAUDeimosRotationModel(); - + // IAU elements for satellites of Jupiter CustomRotationModels["iau-metis"] = new IAUPrecessingRotationModel(268.05, -0.009, 64.49, 0.003, @@ -982,7 +982,7 @@ GetCustomRotationModel(const std::string& name) CustomRotationModels["iau-europa"] = new IAUEuropaRotationModel(); CustomRotationModels["iau-ganymede"] = new IAUGanymedeRotationModel(); CustomRotationModels["iau-callisto"] = new IAUCallistoRotationModel(); - + // IAU elements for satellites of Saturn CustomRotationModels["iau-pan"] = new IAUPrecessingRotationModel(40.6, -0.036, 83.5, -0.004, @@ -1007,7 +1007,7 @@ GetCustomRotationModel(const std::string& name) CustomRotationModels["iau-titan"] = new IAUTitanRotationModel(); CustomRotationModels["iau-iapetus"] = new IAUIapetusRotationModel(); CustomRotationModels["iau-phoebe"] = new IAUPhoebeRotationModel(); - + CustomRotationModels["iau-miranda"] = new IAUMirandaRotationModel(); CustomRotationModels["iau-ariel"] = new IAUArielRotationModel(); CustomRotationModels["iau-umbriel"] = new IAUUmbrielRotationModel(); diff --git a/src/celephem/jpleph.cpp b/src/celephem/jpleph.cpp index b98c17714..f57a5946f 100644 --- a/src/celephem/jpleph.cpp +++ b/src/celephem/jpleph.cpp @@ -56,7 +56,7 @@ static double readDouble(istream& in) JPLEphRecord::~JPLEphRecord() { if (coeffs != NULL) - delete coeffs; + delete coeffs; } @@ -115,7 +115,7 @@ Vector3d JPLEphemeris::getPlanetPosition(JPLEphemItem planet, double tjd) const if (tjd < startDate) tjd = startDate; else if (tjd > endDate) - tjd = endDate; + tjd = endDate; // recNo is always >= 0: unsigned int recNo = (unsigned int) ((tjd - startDate) / daysPerInterval); @@ -136,17 +136,17 @@ Vector3d JPLEphemeris::getPlanetPosition(JPLEphemItem planet, double tjd) const // nGranules is unsigned int so it will be compared against FFFFFFFF: if (coeffInfo[planet].nGranules == (unsigned int) -1) { - coeffs = rec->coeffs + coeffInfo[planet].offset; - u = 2.0 * (tjd - rec->t0) / daysPerInterval - 1.0; + coeffs = rec->coeffs + coeffInfo[planet].offset; + u = 2.0 * (tjd - rec->t0) / daysPerInterval - 1.0; } else { - double daysPerGranule = daysPerInterval / coeffInfo[planet].nGranules; - int granule = (int) ((tjd - rec->t0) / daysPerGranule); - double granuleStartDate = rec->t0 + daysPerGranule * (double) granule; - coeffs = rec->coeffs + coeffInfo[planet].offset + + double daysPerGranule = daysPerInterval / coeffInfo[planet].nGranules; + int granule = (int) ((tjd - rec->t0) / daysPerGranule); + double granuleStartDate = rec->t0 + daysPerGranule * (double) granule; + coeffs = rec->coeffs + coeffInfo[planet].offset + granule * coeffInfo[planet].nCoeffs * 3; - u = 2.0 * (tjd - granuleStartDate) / daysPerGranule - 1.0; + u = 2.0 * (tjd - granuleStartDate) / daysPerGranule - 1.0; } // Evaluate the Chebyshev polynomials @@ -155,11 +155,11 @@ Vector3d JPLEphemeris::getPlanetPosition(JPLEphemItem planet, double tjd) const unsigned int nCoeffs = coeffInfo[planet].nCoeffs; for (int i = 0; i < 3; i++) { - cc[0] = 1.0; - cc[1] = u; - sum[i] = coeffs[i * nCoeffs] + coeffs[i * nCoeffs + 1] * u; - for (unsigned int j = 2; j < nCoeffs; j++) - { + cc[0] = 1.0; + cc[1] = u; + sum[i] = coeffs[i * nCoeffs] + coeffs[i * nCoeffs + 1] * u; + for (unsigned int j = 2; j < nCoeffs; j++) + { cc[j] = 2.0 * u * cc[j - 1] - cc[j - 2]; sum[i] += coeffs[i * nCoeffs + j] * cc[j]; } @@ -255,25 +255,25 @@ JPLEphemeris* JPLEphemeris::load(istream& in) } unsigned int nRecords = (unsigned int) ((eph->endDate - eph->startDate) / - eph->daysPerInterval); + eph->daysPerInterval); eph->records.resize(nRecords); for (i = 0; i < nRecords; i++) { - eph->records[i].t0 = readDouble(in); - eph->records[i].t1 = readDouble(in); + eph->records[i].t0 = readDouble(in); + eph->records[i].t1 = readDouble(in); - // Allocate coefficient array for this record; the first two - // 'coefficients' are actually the start and end time (t0 and t1) - eph->records[i].coeffs = new double[eph->recordSize - 2]; - for (unsigned int j = 0; j < eph->recordSize - 2; j++) - eph->records[i].coeffs[j] = readDouble(in); + // Allocate coefficient array for this record; the first two + // 'coefficients' are actually the start and end time (t0 and t1) + eph->records[i].coeffs = new double[eph->recordSize - 2]; + for (unsigned int j = 0; j < eph->recordSize - 2; j++) + eph->records[i].coeffs[j] = readDouble(in); - // Make sure that we read this record successfully - if (!in.good()) - { - delete eph; - return NULL; - } + // Make sure that we read this record successfully + if (!in.good()) + { + delete eph; + return NULL; + } } return eph; diff --git a/src/celephem/nutation.cpp b/src/celephem/nutation.cpp index d9664d7b3..17ba8f1de 100644 --- a/src/celephem/nutation.cpp +++ b/src/celephem/nutation.cpp @@ -176,7 +176,7 @@ astro::Nutation_IAU2000B(double T) double F = arcsecToRad(93.27209062 + 1739527262.8478 * T - 12.7512 * T2 - - 0.001037 * T3 + - 0.001037 * T3 + 0.00000417 * T4); // Mean elongation of the Moon from the Sun diff --git a/src/celephem/orbit.cpp b/src/celephem/orbit.cpp index 9580afeca..075685a69 100644 --- a/src/celephem/orbit.cpp +++ b/src/celephem/orbit.cpp @@ -273,7 +273,7 @@ Vector3d Orbit::velocityAtTime(double tdb) const { Vector3d p0 = positionAtTime(tdb); Vector3d p1 = positionAtTime(tdb + ORBITAL_VELOCITY_DIFF_DELTA); - return (p1 - p0) * (1.0 / ORBITAL_VELOCITY_DIFF_DELTA); + return (p1 - p0) * (1.0 / ORBITAL_VELOCITY_DIFF_DELTA); } @@ -366,10 +366,10 @@ Vector3d EllipticalOrbit::velocityAtE(double E) const if (eccentricity < 1.0) { double a = pericenterDistance / (1.0 - eccentricity); - double b = a * sqrt(1 - square(eccentricity)); + double b = a * sqrt(1 - square(eccentricity)); double sinE = sin(E); double cosE = cos(E); - + double meanMotion = 2.0 * PI / period; double edot = meanMotion / (1 - eccentricity * cosE); @@ -435,9 +435,9 @@ double EllipticalOrbit::getBoundingRadius() const CachingOrbit::CachingOrbit() : - lastTime(-1.0e30), - positionCacheValid(false), - velocityCacheValid(false) + lastTime(-1.0e30), + positionCacheValid(false), + velocityCacheValid(false) { } @@ -453,14 +453,14 @@ Vector3d CachingOrbit::positionAtTime(double jd) const { lastTime = jd; lastPosition = computePosition(jd); - positionCacheValid = true; - velocityCacheValid = false; + positionCacheValid = true; + velocityCacheValid = false; + } + else if (!positionCacheValid) + { + lastPosition = computePosition(jd); + positionCacheValid = true; } - else if (!positionCacheValid) - { - lastPosition = computePosition(jd); - positionCacheValid = true; - } return lastPosition; } @@ -468,20 +468,20 @@ Vector3d CachingOrbit::positionAtTime(double jd) const Vector3d CachingOrbit::velocityAtTime(double jd) const { - if (jd != lastTime) - { - lastVelocity = computeVelocity(jd); - lastTime = jd; // must be set *after* call to computeVelocity - positionCacheValid = false; - velocityCacheValid = true; - } - else if (!velocityCacheValid) - { - lastVelocity = computeVelocity(jd); - velocityCacheValid = true; - } + if (jd != lastTime) + { + lastVelocity = computeVelocity(jd); + lastTime = jd; // must be set *after* call to computeVelocity + positionCacheValid = false; + velocityCacheValid = true; + } + else if (!velocityCacheValid) + { + lastVelocity = computeVelocity(jd); + velocityCacheValid = true; + } - return lastVelocity; + return lastVelocity; } @@ -491,16 +491,16 @@ Vector3d CachingOrbit::velocityAtTime(double jd) const */ Vector3d CachingOrbit::computeVelocity(double jd) const { - // Compute the velocity by differentiating. + // Compute the velocity by differentiating. Vector3d p0 = positionAtTime(jd); - // Call computePosition() instead of positionAtTime() so that we - // don't affect the cached value. - // TODO: check the valid ranges of the orbit to make sure that - // jd+dt is still in range. + // Call computePosition() instead of positionAtTime() so that we + // don't affect the cached value. + // TODO: check the valid ranges of the orbit to make sure that + // jd+dt is still in range. Vector3d p1 = computePosition(jd + ORBITAL_VELOCITY_DIFF_DELTA); - return (p1 - p0) * (1.0 / ORBITAL_VELOCITY_DIFF_DELTA); + return (p1 - p0) * (1.0 / ORBITAL_VELOCITY_DIFF_DELTA); } diff --git a/src/celephem/orbit.h b/src/celephem/orbit.h index 8b2996abe..3c5877090 100644 --- a/src/celephem/orbit.h +++ b/src/celephem/orbit.h @@ -27,8 +27,8 @@ class Orbit /*! Return the orbital velocity in the orbit's reference frame at the * specified time (TDB). Units are kilometers per day. If the method - * is not overridden, the velocity will be computed by differentiation - * of position. + * is not overridden, the velocity will be computed by differentiation + * of position. */ virtual Eigen::Vector3d velocityAtTime(double) const; @@ -122,8 +122,8 @@ class CachingOrbit : public Orbit mutable Eigen::Vector3d lastPosition; mutable Eigen::Vector3d lastVelocity; mutable double lastTime; - mutable bool positionCacheValid; - mutable bool velocityCacheValid; + mutable bool positionCacheValid; + mutable bool velocityCacheValid; }; diff --git a/src/celephem/precession.cpp b/src/celephem/precession.cpp index e2df95c3e..edb887909 100644 --- a/src/celephem/precession.cpp +++ b/src/celephem/precession.cpp @@ -168,14 +168,14 @@ astro::EquatorialPrecessionAngles_P03(double T) double T3 = T2 * T; double T4 = T3 * T; double T5 = T4 * T; - + prec.zetaA = ( 2.650545 + 2306.083227 * T + 0.2988499 * T2 + 0.01801828 * T3 - 0.000005971 * T4 - 0.0000003173 * T5); - prec.zA = ( - 2.650545 + prec.zA = ( - 2.650545 + 2306.077181 * T + 1.0927348 * T2 + 0.01826837 * T3 @@ -186,7 +186,7 @@ astro::EquatorialPrecessionAngles_P03(double T) - 0.04182264 * T3 - 0.000007089 * T4 - 0.0000001274 * T5); - + return prec; } @@ -203,7 +203,7 @@ astro::EclipticPrecession_P03(double T) double T3 = T2 * T; double T4 = T3 * T; double T5 = T4 * T; - + pole.PA = ( 4.199094 * T + 0.1939873 * T2 - 0.00022466 * T3 @@ -214,7 +214,7 @@ astro::EclipticPrecession_P03(double T) + 0.00052413 * T3 - 0.00000646 * T4 - 0.0000000172 * T5); - + return pole; } @@ -230,7 +230,7 @@ astro::EclipticPrecessionAngles_P03(double T) double T3 = T2 * T; double T4 = T3 * T; double T5 = T4 * T; - + ecl.piA = ( 46.998973 * T - 0.0334926 * T2 - 0.00012559 * T3 @@ -242,7 +242,7 @@ astro::EclipticPrecessionAngles_P03(double T) - 0.0005371 * T3 - 0.00004797 * T4 + 0.000000072 * T5); - + return ecl; } @@ -261,7 +261,7 @@ astro::PrecObliquity_P03(double T) double T3 = T2 * T; double T4 = T3 * T; double T5 = T4 * T; - + prec.epsA = (eps0 - 46.836769 * T - 0.0001831 * T2 @@ -280,7 +280,7 @@ astro::PrecObliquity_P03(double T) + 0.000170663 * T4 - 0.0000000560 * T5); #endif - + return prec; } @@ -295,23 +295,23 @@ astro::PrecObliquity_P03(double T) int main(int argc, char* argv[]) { double step = 10.0; - + for (int i = -100; i <= 100; i++) { // Get time in Julian centuries from J2000 double T = (double) i * step / 100; - + astro::EclipticPole ecl = astro::EclipticPrecession_P03LP(T); astro::EclipticPole eclP03 = astro::EclipticPrecession_P03(T); astro::EclipticAngles eclAnglesP03 = astro::EclipticPrecessionAngles_P03(T); - + //clog << ecl.PA - eclP03.PA << ", " << ecl.QA - eclP03.QA << endl; ecl = eclP03; Vec3d v(0.0, 0.0, 0.0); v.x = ecl.PA * 2.0 * PI / 1296000; v.y = -ecl.QA * 2.0 * PI / 1296000; v.z = sqrt(1.0 - v.x * v.x - v.y * v.y); - + Quatd eclRotation = Quatd::vecToVecRotation(Vec3d(0.0, 0.0, 1.0), v); Quatd eclRotation2 = Quatd::zrotation(-degToRad(eclAnglesP03.PiA / 3600.0)) * Quatd::xrotation(degToRad(eclAnglesP03.piA / 3600.0)) * @@ -326,43 +326,43 @@ int main(int argc, char* argv[]) double Q = eclP03.QA * 2.0 * PI / 1296000; double piA = asin(sqrt(P * P + Q * Q)); double PiA = atan2(P, Q); - + // Calculate the rotation from the J2000 ecliptic to the ecliptic // of date. eclRotation3 = Quatd::zrotation(-PiA) * Quatd::xrotation(piA) * Quatd::zrotation(PiA); - + piA = radToDeg(piA) * 3600; PiA = radToDeg(PiA) * 3600; clog << "Pi: " << PiA << ", " << eclAnglesP03.PiA << endl; clog << "pi: " << piA << ", " << eclAnglesP03.piA << endl; } - + astro::PrecessionAngles prec = astro::PrecObliquity_P03LP(T); Quatd p03lpRot = Quatd::xrotation(degToRad(prec.epsA / 3600.0)) * Quatd::zrotation(-degToRad(prec.pA / 3600.0)); p03lpRot = p03lpRot * ~eclRotation3; - + astro::PrecessionAngles prec2 = astro::PrecObliquity_P03(T); //clog << prec.epsA - prec2.epsA << ", " << prec.pA - prec2.pA << endl; - + astro::EquatorialPrecessionAngles precP03 = astro::EquatorialPrecessionAngles_P03(T); Quatd p03Rot = Quatd::zrotation(-degToRad(precP03.zA / 3600.0)) * Quatd::yrotation( degToRad(precP03.thetaA / 3600.0)) * Quatd::zrotation(-degToRad(precP03.zetaA / 3600.0)); p03Rot = p03Rot * Quatd::xrotation(degToRad(eps0 / 3600.0)); - + Vec3d xaxis(0, 0, 1); Vec3d v0 = xaxis * p03lpRot.toMatrix3(); Vec3d v1 = xaxis * p03Rot.toMatrix3(); - + // Show the angle between the J2000 ecliptic pole and the ecliptic // pole at T centuries from J2000 double theta0 = acos(xaxis * v0); double theta1 = acos(xaxis * v1); - - clog << T * 100 << ": " + + clog << T * 100 << ": " << radToDeg(acos(v0 * v1)) * 3600 << ", " << radToDeg(theta0) << ", " << radToDeg(theta1) << ", " diff --git a/src/celephem/rotation.cpp b/src/celephem/rotation.cpp index 753174b9e..5659c935f 100644 --- a/src/celephem/rotation.cpp +++ b/src/celephem/rotation.cpp @@ -51,8 +51,8 @@ RotationModel::angularVelocityAtTime(double tdb) const return dq.vec().normalized() * (2.0 * acos(dq.w()) / dt); #ifdef CELVEC Vector3d v(dq.x, dq.y, dq.z); - v.normalize(); - return v * (2.0 * acos(dq.w) / dt); + v.normalize(); + return v * (2.0 * acos(dq.w) / dt); #endif } @@ -89,7 +89,7 @@ CachingRotationModel::spin(double tjd) const lastSpin = computeSpin(tjd); spinCacheValid = true; } - + return lastSpin; } @@ -110,8 +110,8 @@ CachingRotationModel::equatorOrientationAtTime(double tjd) const lastEquator = computeEquatorOrientation(tjd); equatorCacheValid = true; } - - return lastEquator; + + return lastEquator; } @@ -131,8 +131,8 @@ CachingRotationModel::angularVelocityAtTime(double tjd) const lastAngularVelocity = computeAngularVelocity(tjd); angularVelocityCacheValid = true; } - - return lastAngularVelocity; + + return lastAngularVelocity; } @@ -141,21 +141,21 @@ CachingRotationModel::computeAngularVelocity(double tjd) const { double dt = chooseDiffTimeDelta(*this); Quaterniond q0 = orientationAtTime(tjd); - + // Call computeSpin/computeEquatorOrientation instead of orientationAtTime // in order to avoid affecting the cache. Quaterniond spin = computeSpin(tjd + dt); Quaterniond equator = computeEquatorOrientation(tjd + dt); Quaterniond q1 = spin * equator; Quaterniond dq = q1.conjugate() * q0; - + if (std::abs(dq.w()) > 0.99999999) return Vector3d::Zero(); - + return dq.vec().normalized() * (2.0 * acos(dq.w()) / dt); #ifdef CELVEC - Vec3d v(dq.x, dq.y, dq.z); - v.normalize(); + Vec3d v(dq.x, dq.y, dq.z); + v.normalize(); return v * (2.0 * acos(dq.w) / dt); #endif } @@ -235,7 +235,7 @@ UniformRotationModel::spin(double tjd) const // planet texture maps where zero deg long. is in the middle of // the texture. remainder += 0.5; - + return YRotation(-remainder * 2 * PI - offset); } @@ -251,7 +251,7 @@ Vector3d UniformRotationModel::angularVelocityAtTime(double tdb) const { Vector3d v = equatorOrientationAtTime(tdb).conjugate() * Vector3d::UnitY();; - return v * (2.0 * PI / period); + return v * (2.0 * PI / period); } @@ -304,7 +304,7 @@ PrecessingRotationModel::spin(double tjd) const // planet texture maps where zero deg long. is in the middle of // the texture. remainder += 0.5; - + return YRotation(-remainder * 2 * PI - offset); } diff --git a/src/celephem/rotation.h b/src/celephem/rotation.h index b66907b37..ace2910d0 100644 --- a/src/celephem/rotation.h +++ b/src/celephem/rotation.h @@ -91,17 +91,17 @@ class CachingRotationModel : public RotationModel CachingRotationModel(); virtual ~CachingRotationModel(); - + Eigen::Quaterniond spin(double tjd) const; Eigen::Quaterniond equatorOrientationAtTime(double tjd) const; Eigen::Vector3d angularVelocityAtTime(double tjd) const; - + virtual Eigen::Quaterniond computeEquatorOrientation(double tjd) const = 0; virtual Eigen::Quaterniond computeSpin(double tjd) const = 0; virtual Eigen::Vector3d computeAngularVelocity(double tjd) const; virtual double getPeriod() const = 0; virtual bool isPeriodic() const = 0; - + private: mutable Eigen::Quaterniond lastSpin; mutable Eigen::Quaterniond lastEquator; diff --git a/src/celephem/samporbit.cpp b/src/celephem/samporbit.cpp index 2739a54e3..3a72f35ae 100644 --- a/src/celephem/samporbit.cpp +++ b/src/celephem/samporbit.cpp @@ -237,7 +237,7 @@ template Vector3d SampledOrbit::computePosition(double jd) const Vector3d v32((double) s3.x - (double) s2.x, (double) s3.y - (double) s2.y, (double) s3.z - (double) s2.z); - + // Estimate velocities by averaging the differences at adjacent spans // (except at the end spans, where we just use a single velocity.) Vector3d v0; @@ -250,7 +250,7 @@ template Vector3d SampledOrbit::computePosition(double jd) const { v0 = v21; } - + Vector3d v1; if (n < (int) samples.size() - 1) { @@ -260,7 +260,7 @@ template Vector3d SampledOrbit::computePosition(double jd) const else { v1 = v21; - } + } pos = cubicInterpolate(p0, v0, p1, v1, t); } @@ -349,7 +349,7 @@ template Vector3d SampledOrbit::computeVelocity(double jd) const Vector3d v32((double) s3.x - (double) s2.x, (double) s3.y - (double) s2.y, (double) s3.z - (double) s2.z); - + // Estimate velocities by averaging the differences at adjacent spans // (except at the end spans, where we just use a single velocity.) Vector3d v0; @@ -362,7 +362,7 @@ template Vector3d SampledOrbit::computeVelocity(double jd) const { v0 = v21; } - + Vector3d v1; if (n < (int) samples.size() - 1) { @@ -372,7 +372,7 @@ template Vector3d SampledOrbit::computeVelocity(double jd) const else { v1 = v21; - } + } vel = cubicInterpolateVelocity(p0, v0, p1, v1, t); vel *= 1.0 / h; @@ -686,7 +686,7 @@ static bool SkipComments(istream& in) { done = true; } - else + else { if (inComment) { @@ -739,7 +739,7 @@ template SampledOrbit* LoadSampledOrbit(const string& filename, return NULL; SampledOrbit* orbit = NULL; - + orbit = new SampledOrbit(interpolation); double lastSampleTime = -numeric_limits::infinity(); @@ -794,7 +794,7 @@ template SampledOrbitXYZV* LoadSampledOrbitXYZV(const string& fi return NULL; SampledOrbitXYZV* orbit = NULL; - + orbit = new SampledOrbitXYZV(interpolation); double lastSampleTime = -numeric_limits::infinity(); diff --git a/src/celephem/samporient.cpp b/src/celephem/samporient.cpp index 7681787af..525bc07e3 100644 --- a/src/celephem/samporient.cpp +++ b/src/celephem/samporient.cpp @@ -40,7 +40,7 @@ typedef vector > Orienta * time stamped quaternion keys. Each record in the file has the form: * *