Comet.cpp   Comet.cpp 
skipping to change at line 54 skipping to change at line 54
// These are to avoid having index arrays for each comet when all are equal . // These are to avoid having index arrays for each comet when all are equal .
bool Comet::createTailIndices=true; bool Comet::createTailIndices=true;
bool Comet::createTailTextureCoords=true; bool Comet::createTailTextureCoords=true;
StelTextureSP Comet::comaTexture; StelTextureSP Comet::comaTexture;
StelTextureSP Comet::tailTexture; StelTextureSP Comet::tailTexture;
QVector<float> Comet::tailTexCoordArr; // computed only once for all Comets . QVector<float> Comet::tailTexCoordArr; // computed only once for all Comets .
QVector<unsigned short> Comet::tailIndices; // computed only once for all C omets. QVector<unsigned short> Comet::tailIndices; // computed only once for all C omets.
Comet::Comet(const QString& englishName, Comet::Comet(const QString& englishName,
int flagLighting,
double radius, double radius,
double oblateness, double oblateness,
Vec3f halocolor, Vec3f halocolor,
float albedo, float albedo,
float roughness,
float outgas_intensity,
float outgas_falloff,
const QString& atexMapName, const QString& atexMapName,
const QString& aobjModelName,
posFuncType coordFunc, posFuncType coordFunc,
void* auserDataPtr, void* orbitPtr,
OsculatingFunctType *osculatingFunc, OsculatingFunctType *osculatingFunc,
bool acloseOrbit, bool acloseOrbit,
bool hidden, bool hidden,
const QString& pTypeStr, const QString& pTypeStr,
float dustTailWidthFact, float dustTailWidthFact,
float dustTailLengthFact, float dustTailLengthFact,
float dustTailBrightnessFact) float dustTailBrightnessFact)
: Planet (englishName, : Planet (englishName,
flagLighting,
radius, radius,
oblateness, oblateness,
halocolor, halocolor,
albedo, albedo,
roughness,
atexMapName, atexMapName,
"", "", // no normalmap.
aobjModelName,
coordFunc, coordFunc,
auserDataPtr, orbitPtr,
osculatingFunc, osculatingFunc,
acloseOrbit, acloseOrbit,
hidden, hidden,
false, //No atmosphere false, //No atmosphere
true, //halo true, //halo
pTypeStr), pTypeStr),
absoluteMagnitude(0.), slopeParameter(-1.f), //== uninitialized: used in getVMagnitude()
slopeParameter(-1.), //== uninitialized: used in getVMagnitude()
semiMajorAxis(0.), semiMajorAxis(0.),
isCometFragment(false), isCometFragment(false),
nameIsProvisionalDesignation(false), nameIsProvisionalDesignation(false),
tailFactors(-1., -1.), // mark "invalid" tailFactors(-1., -1.), // mark "invalid"
tailActive(false), tailActive(false),
tailBright(false), tailBright(false),
deltaJDEtail(15.0*StelCore::JD_MINUTE), // update tail geometry ev ery 15 minutes only deltaJDEtail(15.0*StelCore::JD_MINUTE), // update tail geometry ev ery 15 minutes only
lastJDEtail(0.0), lastJDEtail(0.0),
dustTailWidthFactor(dustTailWidthFact), dustTailWidthFactor(dustTailWidthFact),
dustTailLengthFactor(dustTailLengthFact), dustTailLengthFactor(dustTailLengthFact),
dustTailBrightnessFactor(dustTailBrightnessFact) dustTailBrightnessFactor(dustTailBrightnessFact),
intensityFovScale(1.0f),
intensityMinFov(0.001f), // when zooming in further, Coma is no lo
nger visible.
intensityMaxFov(0.010f) // when zooming out further, MilkyComa is
fully visible (when enabled).
{ {
eclipticPos=Vec3d(0.,0.,0.); this->outgas_intensity =outgas_intensity;
rotLocalToParent = Mat4d::identity(); this->outgas_falloff =outgas_falloff;
texMap = StelApp::getInstance().getTextureManager().createTextureThr
ead(StelFileMgr::getInstallationDir()+"/textures/"+texMapName, StelTexture:
:StelTextureParams(true, GL_LINEAR, GL_REPEAT));
gastailVertexArr.clear(); gastailVertexArr.clear();
dusttailVertexArr.clear(); dusttailVertexArr.clear();
comaVertexArr.clear(); comaVertexArr.clear();
gastailColorArr.clear(); gastailColorArr.clear();
dusttailColorArr.clear(); dusttailColorArr.clear();
//TODO: Name processing? //TODO: Name processing?
} }
Comet::~Comet() Comet::~Comet()
{ {
} }
void Comet::setAbsoluteMagnitudeAndSlope(const double magnitude, const doub le slope) void Comet::setAbsoluteMagnitudeAndSlope(const float magnitude, const float slope)
{ {
if (slope < 0 || slope > 20.0) if (slope < 0 || slope > 20.0)
{ {
qDebug() << "Comet::setAbsoluteMagnitudeAndSlope(): Invalid slope parameter value (must be between 0 and 20)"; qDebug() << "Comet::setAbsoluteMagnitudeAndSlope(): Invalid slope parameter value (must be between 0 and 20)";
return; return;
} }
//TODO: More checks? //TODO: More checks?
//TODO: Make it set-once like the number? //TODO: Make it set-once like the number?
skipping to change at line 238 skipping to change at line 242
double siderealPeriod = getSiderealPeriod(); double siderealPeriod = getSiderealPeriod();
if (siderealPeriod>0) if (siderealPeriod>0)
{ {
// TRANSLATORS: Sidereal (orbital) period for comets in Julian years (symbol: a) // TRANSLATORS: Sidereal (orbital) period for comets in Julian years (symbol: a)
oss << q_("Sidereal period: %1 a").arg(QString::numb er(siderealPeriod/365.25, 'f', 3)) << "<br>"; oss << q_("Sidereal period: %1 a").arg(QString::numb er(siderealPeriod/365.25, 'f', 3)) << "<br>";
} }
// GZ: Add speed. I don't know where else to place that bit of information. // GZ: Add speed. I don't know where else to place that bit of information.
// xgettext:no-c-format // xgettext:no-c-format
oss << QString(q_("Speed: %1 km/s")) oss << QString(q_("Speed: %1 km/s"))
.arg(((CometOrbit*)userDataPtr)->getVelocity().le ngth()*AU/86400.0, 0, 'f', 3); .arg(((CometOrbit*)orbitPtr)->getVelocity().lengt h()*AU/86400.0, 0, 'f', 3);
oss << "<br>"; oss << "<br>";
const Vec3d& observerHelioPos = core->getObserverHeliocentri cEclipticPos(); const Vec3d& observerHelioPos = core->getObserverHeliocentri cEclipticPos();
const double elongation = getElongation(observerHelioPos); const double elongation = getElongation(observerHelioPos);
if (withDecimalDegree) if (withDecimalDegree)
{ {
oss << QString(q_("Phase Angle: %1")).arg(StelUtils: :radToDecDegStr(getPhaseAngle(observerHelioPos),4,false,true)) << "<br>"; oss << QString(q_("Phase Angle: %1")).arg(StelUtils: :radToDecDegStr(getPhaseAngle(observerHelioPos),4,false,true)) << "<br>";
oss << QString(q_("Elongation: %1")).arg(StelUtils:: radToDecDegStr(elongation,4,false,true)) << "<br>"; oss << QString(q_("Elongation: %1")).arg(StelUtils:: radToDecDegStr(elongation,4,false,true)) << "<br>";
} }
skipping to change at line 276 skipping to change at line 280
oss << "<br>"; oss << "<br>";
} }
postProcessInfoString(str, flags); postProcessInfoString(str, flags);
return str; return str;
} }
QVariantMap Comet::getInfoMap(const StelCore *core) const QVariantMap Comet::getInfoMap(const StelCore *core) const
{ {
QVariantMap map = StelObject::getInfoMap(core); QVariantMap map = Planet::getInfoMap(core);
map.insert("tail-length-km", tailFactors[1]*AU); map.insert("tail-length-km", tailFactors[1]*AU);
map.insert("coma-diameter-km", tailFactors[0]*AU); map.insert("coma-diameter-km", tailFactors[0]*AU);
return map; return map;
} }
void Comet::setSemiMajorAxis(const double value) void Comet::setSemiMajorAxis(const double value)
{ {
semiMajorAxis = value; semiMajorAxis = value;
} }
skipping to change at line 328 skipping to change at line 332
// with kappa typically 5..15. MPC provides Slope parameter. So we s hould expect to have slopeParameter (a word only used for minor planets!) f or our comets 2..6 // with kappa typically 5..15. MPC provides Slope parameter. So we s hould expect to have slopeParameter (a word only used for minor planets!) f or our comets 2..6
double apparentMagnitude = absoluteMagnitude + 5 * std::log10(observ erCometDistance) + 2.5 * slopeParameter * std::log10(cometSunDistance); double apparentMagnitude = absoluteMagnitude + 5 * std::log10(observ erCometDistance) + 2.5 * slopeParameter * std::log10(cometSunDistance);
return apparentMagnitude; return apparentMagnitude;
} }
void Comet::update(int deltaTime) void Comet::update(int deltaTime)
{ {
Planet::update(deltaTime); Planet::update(deltaTime);
//calculate FOV fade value, linear fade between intensityMaxFov and
intensityMinFov
const double vfov = StelApp::getInstance().getCore()->getMovementMgr
()->getCurrentFov();
intensityFovScale = qBound(0.25,(vfov - intensityMinFov) / (intensit
yMaxFov - intensityMinFov),1.0);
// The rest deals with updating tail geometries and brightness // The rest deals with updating tail geometries and brightness
StelCore* core=StelApp::getInstance().getCore(); StelCore* core=StelApp::getInstance().getCore();
double dateJDE=core->getJDE(); double dateJDE=core->getJDE();
// The CometOrbit is in fact available in userDataPtr! // The CometOrbit is in fact available in userDataPtr!
CometOrbit* orbit=(CometOrbit*)userDataPtr; CometOrbit* orbit=(CometOrbit*)orbitPtr;
Q_ASSERT(orbit); Q_ASSERT(orbit);
if (!orbit->objectDateValid(dateJDE)) return; // don't do anything i f out of useful date range. This allows having hundreds of comet elements. if (!orbit->objectDateValid(dateJDE)) return; // don't do anything i f out of useful date range. This allows having hundreds of comet elements.
//GZ: I think we can make deltaJDtail adaptive, depending on distanc e to sun! For some reason though, this leads to a crash! //GZ: I think we can make deltaJDtail adaptive, depending on distanc e to sun! For some reason though, this leads to a crash!
//deltaJDtail=StelCore::JD_SECOND * qMax(1.0, qMin(eclipticPos.lengt h(), 20.0)); //deltaJDtail=StelCore::JD_SECOND * qBound(1.0, eclipticPos.length() , 20.0);
if (fabs(lastJDEtail-dateJDE)>deltaJDEtail) if (fabs(lastJDEtail-dateJDE)>deltaJDEtail)
{ {
lastJDEtail=dateJDE; lastJDEtail=dateJDE;
// The CometOrbit is in fact available in userDataPtr! // The CometOrbit is in fact available in userDataPtr!
CometOrbit* orbit=(CometOrbit*)userDataPtr; CometOrbit* orbit=(CometOrbit*)orbitPtr;
Q_ASSERT(orbit); Q_ASSERT(orbit);
if (!orbit->objectDateValid(dateJDE)) return; // out of usef ul date range. This should allow having hundreds of comet elements. if (!orbit->objectDateValid(dateJDE)) return; // out of usef ul date range. This should allow having hundreds of comet elements.
if (orbit->getUpdateTails()){ if (orbit->getUpdateTails()){
// Compute lengths and orientations from orbit objec t, but only if required. // Compute lengths and orientations from orbit objec t, but only if required.
tailFactors=getComaDiameterAndTailLengthAU(); tailFactors=getComaDiameterAndTailLengthAU();
// Note that we use a diameter larger than what the formula returns. A scale factor of 1.2 is ad-hoc/empirical (GZ), but may lo ok better. // Note that we use a diameter larger than what the formula returns. A scale factor of 1.2 is ad-hoc/empirical (GZ), but may lo ok better.
computeComa(1.0f*tailFactors[0]); // TBD: APPARENTLY NO SCALING? REMOVE 1.0 and note above. computeComa(1.0f*tailFactors[0]); // TBD: APPARENTLY NO SCALING? REMOVE 1.0 and note above.
skipping to change at line 401 skipping to change at line 409
} }
} }
orbit->setUpdateTails(false); // don't update until position has been recalculated elsewhere orbit->setUpdateTails(false); // don't update until position has been recalculated elsewhere
} }
} }
// And also update magnitude and tail brightness/extinction here. // And also update magnitude and tail brightness/extinction here.
const bool withAtmosphere=(core->getSkyDrawer()->getFlagHasAtmospher e()); const bool withAtmosphere=(core->getSkyDrawer()->getFlagHasAtmospher e());
StelToneReproducer* eye = core->getToneReproducer(); StelToneReproducer* eye = core->getToneReproducer();
float lum = core->getSkyDrawer()->surfacebrightnessToLuminance(getVM agnitude(core)+13.0f); // How to calibrate? float lum = core->getSkyDrawer()->surfaceBrightnessToLuminance(getVM agnitude(core)+13.0f); // How to calibrate?
// Get the luminance scaled between 0 and 1 // Get the luminance scaled between 0 and 1
float aLum =eye->adaptLuminanceScaled(lum); float aLum =eye->adaptLuminanceScaled(lum);
// To make comet more apparent in overviews, take field of view into account: // To make comet more apparent in overviews, take field of view into account:
const float fov=core->getProjection(core->getAltAzModelViewTransform ())->getFov(); const float fov=core->getProjection(core->getAltAzModelViewTransform ())->getFov();
if (fov>20) if (fov>20)
aLum*= (fov/20.0f); aLum*= (fov/20.0f);
// Now inhibit tail drawing if still too dim. // Now inhibit tail drawing if still too dim.
if (aLum<0.002f) if (aLum<0.002f)
skipping to change at line 449 skipping to change at line 457
dusttailColorArr.clear(); dusttailColorArr.clear();
for (int i=0; i<gastailVertexArr.size(); ++i) for (int i=0; i<gastailVertexArr.size(); ++i)
{ {
// Gastail extinction: // Gastail extinction:
Vec3d vertAltAz=core->j2000ToAltAz(gastailVertexArr. at(i), StelCore::RefractionOn); Vec3d vertAltAz=core->j2000ToAltAz(gastailVertexArr. at(i), StelCore::RefractionOn);
vertAltAz.normalize(); vertAltAz.normalize();
Q_ASSERT(fabs(vertAltAz.lengthSquared()-1.0) < 0.001 ); Q_ASSERT(fabs(vertAltAz.lengthSquared()-1.0) < 0.001 );
float oneMag=0.0f; float oneMag=0.0f;
extinction.forward(vertAltAz, &oneMag); extinction.forward(vertAltAz, &oneMag);
float extinctionFactor=std::pow(0.4f, oneMag); // dr op of one magnitude: factor 2.5 or 40% float extinctionFactor=std::pow(0.4f, oneMag); // dr op of one magnitude: factor 2.5 or 40%
gastailColorArr.append(gasColor*extinctionFactor* br ightnessPerVertexFromHead); gastailColorArr.append(gasColor*extinctionFactor* br ightnessPerVertexFromHead*intensityFovScale);
// dusttail extinction: // dusttail extinction:
vertAltAz=core->j2000ToAltAz(dusttailVertexArr.at(i) , StelCore::RefractionOn); vertAltAz=core->j2000ToAltAz(dusttailVertexArr.at(i) , StelCore::RefractionOn);
vertAltAz.normalize(); vertAltAz.normalize();
Q_ASSERT(fabs(vertAltAz.lengthSquared()-1.0) < 0.001 ); Q_ASSERT(fabs(vertAltAz.lengthSquared()-1.0) < 0.001 );
oneMag=0.0f; oneMag=0.0f;
extinction.forward(vertAltAz, &oneMag); extinction.forward(vertAltAz, &oneMag);
extinctionFactor=std::pow(0.4f, oneMag); // drop of one magnitude: factor 2.5 or 40% extinctionFactor=std::pow(0.4f, oneMag); // drop of one magnitude: factor 2.5 or 40%
dusttailColorArr.append(dustColor*extinctionFactor * brightnessPerVertexFromHead); dusttailColorArr.append(dustColor*extinctionFactor * brightnessPerVertexFromHead*intensityFovScale);
brightnessPerVertexFromHead-=brightnessDecreasePerVe rtexFromHead; brightnessPerVertexFromHead-=brightnessDecreasePerVe rtexFromHead;
} }
} }
else // no atmosphere: set all vertices to same brightness. else // no atmosphere: set all vertices to same brightness.
{ {
gastailColorArr.fill(gasColor, gastailVertexArr.length()); gastailColorArr.fill(gasColor *intensityFovScale, gastailVe
dusttailColorArr.fill(dustColor, dusttailVertexArr.length()) rtexArr.length());
; dusttailColorArr.fill(dustColor*intensityFovScale, dusttailV
ertexArr.length());
} }
//qDebug() << "Comet " << getEnglishName() << "JDE: " << date << "g asR" << gasColor[0] << " dustR" << dustColor[0]; //qDebug() << "Comet " << getEnglishName() << "JDE: " << date << "g asR" << gasColor[0] << " dustR" << dustColor[0];
} }
// Draw the Comet and all the related infos: name, circle etc... GZ: Taken from Planet.cpp 2013-11-05 and extended // Draw the Comet and all the related infos: name, circle etc... GZ: Taken from Planet.cpp 2013-11-05 and extended
void Comet::draw(StelCore* core, float maxMagLabels, const QFont& planetNam eFont) void Comet::draw(StelCore* core, float maxMagLabels, const QFont& planetNam eFont)
{ {
if (hidden) if (hidden)
return; return;
skipping to change at line 495 skipping to change at line 503
// This test seemed necessary for reasonable fps in case too many co met elements are loaded. // This test seemed necessary for reasonable fps in case too many co met elements are loaded.
// Problematic: Early-out here of course disables the wanted hint ci rcles for dim comets. // Problematic: Early-out here of course disables the wanted hint ci rcles for dim comets.
// The line makes hints for comets 5 magnitudes below sky limiting m agnitude visible. // The line makes hints for comets 5 magnitudes below sky limiting m agnitude visible.
// If comet is too faint to be seen, don't bother rendering. (Massiv e speedup if people have hundreds of comet elements!) // If comet is too faint to be seen, don't bother rendering. (Massiv e speedup if people have hundreds of comet elements!)
if ((getVMagnitude(core)-5.0f) > core->getSkyDrawer()->getLimitMagni tude() && !core->getCurrentLocation().planetName.contains("Observer", Qt::C aseInsensitive)) if ((getVMagnitude(core)-5.0f) > core->getSkyDrawer()->getLimitMagni tude() && !core->getCurrentLocation().planetName.contains("Observer", Qt::C aseInsensitive))
{ {
return; return;
} }
// The CometOrbit is in fact available in userDataPtr! // The CometOrbit is in fact available in userDataPtr!
CometOrbit* orbit=(CometOrbit*)userDataPtr; CometOrbit* orbit=(CometOrbit*)orbitPtr;
Q_ASSERT(orbit); Q_ASSERT(orbit);
if (!orbit->objectDateValid(core->getJDE())) return; // don't draw a t all if out of useful date range. This allows having hundreds of comet ele ments. if (!orbit->objectDateValid(core->getJDE())) return; // don't draw a t all if out of useful date range. This allows having hundreds of comet ele ments.
Mat4d mat = Mat4d::translation(eclipticPos) * rotLocalToParent; Mat4d mat = Mat4d::translation(eclipticPos) * rotLocalToParent;
// This removed totally the Planet shaking bug!!! // This removed totally the Planet shaking bug!!!
StelProjector::ModelViewTranformP transfo = core->getHeliocentricEcl ipticModelViewTransform(); StelProjector::ModelViewTranformP transfo = core->getHeliocentricEcl ipticModelViewTransform();
transfo->combine(mat); transfo->combine(mat);
// Compute the 2D position and check if in the screen // Compute the 2D position and check if in the screen
const StelProjectorP prj = core->getProjection(transfo); const StelProjectorP prj = core->getProjection(transfo);
float screenSz = getAngularSize(core)*M_PI/180.*prj->getPixelPerRadA tCenter(); float screenSz = getAngularSize(core)*M_PI/180.*prj->getPixelPerRadA tCenter();
float viewport_left = prj->getViewportPosX(); float viewport_left = prj->getViewportPosX();
float viewport_bottom = prj->getViewportPosY(); float viewport_bottom = prj->getViewportPosY();
if (prj->project(Vec3d(0), screenPos) if (prj->project(Vec3d(0.), screenPos)
&& screenPos[1]>viewport_bottom - screenSz && screenPos[1] < viewport_bottom + prj->getViewportHeight()+screenSz && screenPos[1]>viewport_bottom - screenSz && screenPos[1] < viewport_bottom + prj->getViewportHeight()+screenSz
&& screenPos[0]>viewport_left - screenSz && screenPos[0] < v iewport_left + prj->getViewportWidth() + screenSz) && screenPos[0]>viewport_left - screenSz && screenPos[0] < v iewport_left + prj->getViewportWidth() + screenSz)
{ {
// Draw the name, and the circle if it's not too close from the body it's turning around // Draw the name, and the circle if it's not too close from the body it's turning around
// this prevents name overlapping (ie for jupiter satellites ) // this prevents name overlapping (ie for jupiter satellites )
float ang_dist = 300.f*atan(getEclipticPos().length()/getEqu inoxEquatorialPos(core).length())/core->getMovementMgr()->getCurrentFov(); float ang_dist = 300.f*atan(getEclipticPos().length()/getEqu inoxEquatorialPos(core).length())/core->getMovementMgr()->getCurrentFov();
// if (ang_dist==0.f) ang_dist = 1.f; // if ang_dist == 0, t he Planet is sun.. --> GZ: we can remove it. // if (ang_dist==0.f) ang_dist = 1.f; // if ang_dist == 0, t he Planet is sun.. --> GZ: we can remove it.
// by putting here, only draw orbit if Comet is visible for clarity // by putting here, only draw orbit if Comet is visible for clarity
drawOrbit(core); // TODO - fade in here also... drawOrbit(core); // TODO - fade in here also...
skipping to change at line 584 skipping to change at line 592
Vec3d eclposNrm=eclipticPos - core->getObserverHeliocentricEclipticP os() ; eclposNrm.normalize(); Vec3d eclposNrm=eclipticPos - core->getObserverHeliocentricEclipticP os() ; eclposNrm.normalize();
Mat4d comarot=Mat4d::rotation(Vec3d(0.0, 0.0, 1.0)^(eclposNrm), std: :acos(Vec3d(0.0, 0.0, 1.0).dot(eclposNrm)) ); Mat4d comarot=Mat4d::rotation(Vec3d(0.0, 0.0, 1.0)^(eclposNrm), std: :acos(Vec3d(0.0, 0.0, 1.0).dot(eclposNrm)) );
StelProjector::ModelViewTranformP transfo2 = transfo->clone(); StelProjector::ModelViewTranformP transfo2 = transfo->clone();
transfo2->combine(comarot); transfo2->combine(comarot);
StelPainter sPainter(core->getProjection(transfo2)); StelPainter sPainter(core->getProjection(transfo2));
sPainter.setBlending(true, GL_ONE, GL_ONE); sPainter.setBlending(true, GL_ONE, GL_ONE);
sPainter.setCullFace(false); sPainter.setCullFace(false);
StelToneReproducer* eye = core->getToneReproducer(); StelToneReproducer* eye = core->getToneReproducer();
float lum = core->getSkyDrawer()->surfacebrightnessToLuminance(getVM agnitudeWithExtinction(core)+11.0f); // How to calibrate? float lum = core->getSkyDrawer()->surfaceBrightnessToLuminance(getVM agnitudeWithExtinction(core)+11.0f); // How to calibrate?
// Get the luminance scaled between 0 and 1 // Get the luminance scaled between 0 and 1
float aLum =eye->adaptLuminanceScaled(lum); float aLum =eye->adaptLuminanceScaled(lum);
float magFactor=qMin(qMax(aLum, 0.25f), 2.0f); float magFactor=qBound(0.25f*intensityFovScale, aLum*intensityFovSca le, 2.0f);
comaTexture->bind(); comaTexture->bind();
sPainter.setColor(0.3f*magFactor,0.7*magFactor,magFactor); sPainter.setColor(0.3f*magFactor,0.7*magFactor,magFactor);
sPainter.setArrays((Vec3d*)comaVertexArr.constData(), (Vec2f*)comaTe xCoordArr.constData()); sPainter.setArrays((Vec3d*)comaVertexArr.constData(), (Vec2f*)comaTe xCoordArr.constData());
sPainter.drawFromArray(StelPainter::Triangles, comaVertexArr.size()/ 3); sPainter.drawFromArray(StelPainter::Triangles, comaVertexArr.size()/ 3);
sPainter.setBlending(false); sPainter.setBlending(false);
} }
// Formula found at http://www.projectpluto.com/update7b.htm#comet_tail_for mula // Formula found at http://www.projectpluto.com/update7b.htm#comet_tail_for mula
Vec2f Comet::getComaDiameterAndTailLengthAU() Vec2f Comet::getComaDiameterAndTailLengthAU()
 End of changes. 26 change blocks. 
30 lines changed or deleted 42 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/