Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

location.cpp

Go to the documentation of this file.
00001 // location.cpp
00002 //
00003 // Copyright (C) 2003, Chris Laurel <claurel@shatters.net>
00004 //
00005 // This program is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU General Public License
00007 // as published by the Free Software Foundation; either version 2
00008 // of the License, or (at your option) any later version.
00009 
00010 #include <map>
00011 #include <celengine/location.h>
00012 #include <celengine/body.h>
00013 #include <celutil/util.h>
00014 
00015 using namespace std;
00016 
00017 static map<string, uint32> FeatureNameToFlag;
00018 static bool featureTableInitialized = false;
00019 
00020 struct FeatureNameEntry
00021 {
00022     const char* name;
00023     uint32 flag;
00024 };
00025 
00026 FeatureNameEntry FeatureNames[] =
00027 {
00028     { "AA", Location::Crater },
00029     { "VA", Location::Vallis },
00030     { "MO", Location::Mons },
00031     { "PM", Location::Planum },
00032     { "CM", Location::Chasma },
00033     { "PE", Location::Patera },
00034     { "ME", Location::Mare },
00035     { "RU", Location::Rupes },
00036     { "TE", Location::Tessera },
00037     { "RE", Location::Regio },
00038     { "CH", Location::Chaos },
00039     { "TA", Location::Terra },
00040     { "AS", Location::Astrum },
00041     { "CR", Location::Corona },
00042     { "DO", Location::Dorsum },
00043     { "FO", Location::Fossa },
00044     { "CA", Location::Catena },
00045     { "MN", Location::Mensa },
00046     { "RI", Location::Rima },
00047     { "UN", Location::Undae },
00048     { "RT", Location::Reticulum },
00049     { "PL", Location::Planitia },
00050     { "LI", Location::Linea },
00051     { "FL", Location::Fluctus },
00052     { "FR", Location::Farrum },
00053     { "LF", Location::LandingSite },
00054     { "XX", Location::Other },
00055     { "City", Location::City },
00056     { "Observatory", Location::Observatory },
00057     { "Landing Site", Location::LandingSite },
00058     { "Crater", Location::Crater },
00059 };
00060  
00061 
00062 Location::Location() :
00063     parent(NULL),
00064     position(0.0f, 0.0f, 0.0f),
00065     size(0.0f),
00066     importance(-1.0f),
00067     featureType(Other),
00068     infoURL(NULL)
00069 {
00070 }
00071 
00072 Location::~Location()
00073 {
00074     if (infoURL != NULL)
00075         delete infoURL;
00076 }
00077 
00078 
00079 string Location::getName(bool i18n) const
00080 {
00081     if (!i18n || i18nName == "") return name;
00082     return i18nName;
00083 }
00084 
00085 
00086 void Location::setName(const string& _name)
00087 {
00088     name = _name;
00089     i18nName = _(_name.c_str()); 
00090     if (name == i18nName) i18nName = "";
00091 }
00092 
00093 
00094 Vec3f Location::getPosition() const
00095 {
00096     return position;
00097 }
00098 
00099 
00100 void Location::setPosition(const Vec3f& _position)
00101 {
00102     position = _position;
00103 }
00104 
00105 
00106 float Location::getSize() const
00107 {
00108     return size;
00109 }
00110 
00111 
00112 void Location::setSize(float _size)
00113 {
00114     size = _size;
00115 }
00116 
00117 
00118 float Location::getImportance() const
00119 {
00120     return importance;
00121 }
00122 
00123 
00124 void Location::setImportance(float _importance)
00125 {
00126     importance = _importance;
00127 }
00128 
00129 
00130 string Location::getInfoURL() const
00131 {
00132     return "";
00133 }
00134 
00135 
00136 void Location::setInfoURL(const string&)
00137 {
00138 }
00139 
00140 
00141 uint32 Location::getFeatureType() const
00142 {
00143     return featureType;
00144 }
00145 
00146 
00147 void Location::setFeatureType(uint32 _featureType)
00148 {
00149     featureType = _featureType;
00150 }
00151 
00152 
00153 static void initFeatureTypeTable()
00154 {
00155     featureTableInitialized = true;
00156 
00157     for (int i = 0; i < (int)(sizeof(FeatureNames) / sizeof(FeatureNames[0])); i++)
00158     {
00159         FeatureNameToFlag[string(FeatureNames[i].name)] = FeatureNames[i].flag;
00160     }
00161 }
00162 
00163 
00164 uint32 Location::parseFeatureType(const string& s)
00165 {
00166     if (!featureTableInitialized)
00167         initFeatureTypeTable();
00168 
00169     int flag = FeatureNameToFlag[s];
00170     return flag != 0 ? flag : (uint32) Other;
00171 }
00172 
00173 
00174 Body* Location::getParentBody() const
00175 {
00176     return parent;
00177 }
00178 
00179 
00180 void Location::setParentBody(Body* _parent)
00181 {
00182     parent = _parent;
00183 }
00184 
00185 
00186 Point3d Location::getPlanetocentricPosition(double t) const
00187 {
00188     if (parent == NULL)
00189         return Point3d(position.x, position.y, position.z);
00190 
00191     Quatd q = parent->getEclipticalToGeographic(t);
00192     return Point3d(position.x, position.y, position.z) * q.toMatrix3();
00193 }
00194 
00195 
00196 Point3d Location::getHeliocentricPosition(double t) const
00197 {
00198     if (parent == NULL)
00199         return Point3d(position.x, position.y, position.z);
00200 
00201     return parent->getHeliocentricPosition(t) +
00202         (getPlanetocentricPosition(t) - Point3d(0.0, 0.0, 0.0));
00203 }

Generated on Sat Jan 14 22:30:27 2006 for Celestia by  doxygen 1.4.1