00001
00002
00003
00004
00005
00006
00007
00008
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 }