From 71141e830ac9c06f016220e4b263155516903770 Mon Sep 17 00:00:00 2001 From: Mathias Froehlich Date: Sun, 11 Nov 2012 14:26:14 +0100 Subject: [PATCH] hla: Use HLADataElementIndices for HLALocation. --- simgear/hla/HLALocation.hxx | 323 ++++++++++++++++++++++++++---------- 1 file changed, 231 insertions(+), 92 deletions(-) diff --git a/simgear/hla/HLALocation.hxx b/simgear/hla/HLALocation.hxx index 20aea837..627cc763 100644 --- a/simgear/hla/HLALocation.hxx +++ b/simgear/hla/HLALocation.hxx @@ -19,6 +19,7 @@ #define HLALocation_hxx #include "HLABasicDataElement.hxx" +#include "HLATypes.hxx" namespace simgear { @@ -68,29 +69,29 @@ public: virtual void setLinearBodyVelocity(const SGVec3d& linearVelocity) { _linearVelocity = linearVelocity; } - HLADataElementProvider getPositionDataElement(unsigned i) + HLADataElement* getPositionDataElement(unsigned i) { if (3 <= i) - return HLADataElementProvider(); + return 0; return new PositionDataElement(this, i); } - HLADataElementProvider getOrientationDataElement(unsigned i) + HLADataElement* getOrientationDataElement(unsigned i) { if (3 <= i) - return HLADataElementProvider(); + return 0; return new OrientationDataElement(this, i); } - HLADataElementProvider getAngularVelocityDataElement(unsigned i) + HLADataElement* getAngularVelocityDataElement(unsigned i) { if (3 <= i) - return HLADataElementProvider(); + return 0; return new AngularVelocityDataElement(this, i); } - HLADataElementProvider getLinearVelocityDataElement(unsigned i) + HLADataElement* getLinearVelocityDataElement(unsigned i) { if (3 <= i) - return HLADataElementProvider(); + return 0; return new LinearVelocityDataElement(this, i); } @@ -166,11 +167,12 @@ class HLALocationFactory : public SGReferenced { public: virtual ~HLALocationFactory() {} virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap&) const = 0; + virtual HLAAbstractLocation* createLocation(HLAObjectInstance&) const = 0; }; class HLACartesianLocationFactory : public HLALocationFactory { public: - virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const + virtual HLACartesianLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const { HLACartesianLocation* location = new HLACartesianLocation; for (unsigned i = 0; i < 3; ++i) { @@ -192,6 +194,70 @@ public: return location; } + virtual HLACartesianLocation* createLocation(HLAObjectInstance& objectInstance) const + { + HLACartesianLocation* location = new HLACartesianLocation; + for (unsigned i = 0; i < 3; ++i) { + const HLADataElement::IndexPathPair& indexPathPair = _positonIndexPathPair[i]; + if (indexPathPair.first == 0) + continue; + std::string path = objectInstance.getAttributeName(indexPathPair.first); + if (!indexPathPair.second.empty()) + path += HLADataElement::toString(indexPathPair.second); + HLADataElementIndex index; + if (!objectInstance.getDataElementIndex(index, path)) + continue; + objectInstance.setAttributeDataElement(index, location->getPositionDataElement(i)); + } + for (unsigned i = 0; i < 3; ++i) { + const HLADataElement::IndexPathPair& indexPathPair = _orientationIndexPathPair[i]; + if (indexPathPair.first == 0) + continue; + std::string path = objectInstance.getAttributeName(indexPathPair.first); + if (!indexPathPair.second.empty()) + path += HLADataElement::toString(indexPathPair.second); + HLADataElementIndex index; + if (!objectInstance.getDataElementIndex(index, path)) + continue; + objectInstance.setAttributeDataElement(index, location->getOrientationDataElement(i)); + } + for (unsigned i = 0; i < 3; ++i) { + const HLADataElement::IndexPathPair& indexPathPair = _angularVelocityIndexPathPair[i]; + if (indexPathPair.first == 0) + continue; + std::string path = objectInstance.getAttributeName(indexPathPair.first); + if (!indexPathPair.second.empty()) + path += HLADataElement::toString(indexPathPair.second); + HLADataElementIndex index; + if (!objectInstance.getDataElementIndex(index, path)) + continue; + objectInstance.setAttributeDataElement(index, location->getAngularVelocityDataElement(i)); + } + for (unsigned i = 0; i < 3; ++i) { + const HLADataElement::IndexPathPair& indexPathPair = _linearVelocityIndexPathPair[i]; + if (indexPathPair.first == 0) + continue; + std::string path = objectInstance.getAttributeName(indexPathPair.first); + if (!indexPathPair.second.empty()) + path += HLADataElement::toString(indexPathPair.second); + HLADataElementIndex index; + if (!objectInstance.getDataElementIndex(index, path)) + continue; + objectInstance.setAttributeDataElement(index, location->getLinearVelocityDataElement(i)); + } + + for (unsigned i = 0; i < 3; ++i) + objectInstance.setAttributeDataElement(_positonIndex[i], location->getPositionDataElement(i)); + for (unsigned i = 0; i < 3; ++i) + objectInstance.setAttributeDataElement(_orientationIndex[i], location->getOrientationDataElement(i)); + for (unsigned i = 0; i < 3; ++i) + objectInstance.setAttributeDataElement(_angularVelocityIndex[i], location->getAngularVelocityDataElement(i)); + for (unsigned i = 0; i < 3; ++i) + objectInstance.setAttributeDataElement(_linearVelocityIndex[i], location->getLinearVelocityDataElement(i)); + + return location; + } + void setPositionIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair) { if (3 <= index) @@ -218,16 +284,71 @@ public: _linearVelocityIndexPathPair[index] = indexPathPair; } + void setPositionIndex(unsigned index, const HLADataElementIndex& dataElementIndex) + { + if (3 <= index) + return; + _positonIndex[index] = dataElementIndex; + } + void setOrientationIndex(unsigned index, const HLADataElementIndex& dataElementIndex) + { + if (3 <= index) + return; + _orientationIndex[index] = dataElementIndex; + } + + void setAngularVelocityIndex(unsigned index, const HLADataElementIndex& dataElementIndex) + { + if (3 <= index) + return; + _angularVelocityIndex[index] = dataElementIndex; + } + void setLinearVelocityIndex(unsigned index, const HLADataElementIndex& dataElementIndex) + { + if (3 <= index) + return; + _linearVelocityIndex[index] = dataElementIndex; + } + private: HLADataElement::IndexPathPair _positonIndexPathPair[3]; HLADataElement::IndexPathPair _orientationIndexPathPair[3]; HLADataElement::IndexPathPair _angularVelocityIndexPathPair[3]; HLADataElement::IndexPathPair _linearVelocityIndexPathPair[3]; + + HLADataElementIndex _positonIndex[3]; + HLADataElementIndex _orientationIndex[3]; + + HLADataElementIndex _angularVelocityIndex[3]; + HLADataElementIndex _linearVelocityIndex[3]; }; class HLAGeodeticLocation : public HLAAbstractLocation { public: + enum Semantic { + LatitudeDeg, + LatitudeRad, + LongitudeDeg, + LongitudeRad, + ElevationM, + ElevationFt, + HeadingDeg, + HeadingRad, + PitchDeg, + PitchRad, + RollDeg, + RollRad, + GroundTrackDeg, + GroundTrackRad, + GroundSpeedKnots, + GroundSpeedFtPerSec, + GroundSpeedMPerSec, + VerticalSpeedFtPerSec, + VerticalSpeedFtPerMin, + VerticalSpeedMPerSec + }; + HLAGeodeticLocation() : _dirty(true), _cartPosition(SGVec3d::zeros()), @@ -349,7 +470,7 @@ public: { return 60*getVerticalSpeedFtPerSec(); } #define DATA_ELEMENT(name) \ - HLADataElementProvider get## name ## DataElement() \ + HLADataElement* get## name ## DataElement() \ { return new DataElement<&HLAGeodeticLocation::get## name, &HLAGeodeticLocation::set ## name>(this); } DATA_ELEMENT(LatitudeDeg) @@ -376,6 +497,54 @@ public: #undef DATA_ELEMENT + HLADataElement* getDataElement(Semantic semantic) + { + switch (semantic) { + case LatitudeDeg: + return getLatitudeDegDataElement(); + case LatitudeRad: + return getLatitudeRadDataElement(); + case LongitudeDeg: + return getLongitudeDegDataElement(); + case LongitudeRad: + return getLongitudeRadDataElement(); + case ElevationM: + return getElevationMDataElement(); + case ElevationFt: + return getElevationFtDataElement(); + case HeadingDeg: + return getHeadingDegDataElement(); + case HeadingRad: + return getHeadingRadDataElement(); + case PitchDeg: + return getPitchDegDataElement(); + case PitchRad: + return getPitchRadDataElement(); + case RollDeg: + return getRollDegDataElement(); + case RollRad: + return getRollRadDataElement(); + case GroundTrackDeg: + return getGroundTrackDegDataElement(); + case GroundTrackRad: + return getGroundTrackRadDataElement(); + case GroundSpeedKnots: + return getGroundSpeedKnotsDataElement(); + case GroundSpeedFtPerSec: + return getGroundSpeedFtPerSecDataElement(); + case GroundSpeedMPerSec: + return getGroundSpeedMPerSecDataElement(); + case VerticalSpeedFtPerSec: + return getVerticalSpeedFtPerSecDataElement(); + case VerticalSpeedFtPerMin: + return getVerticalSpeedFtPerMinDataElement(); + case VerticalSpeedMPerSec: + return getVerticalSpeedMPerSecDataElement(); + default: + return 0; + } + } + private: template @@ -441,26 +610,26 @@ private: class HLAGeodeticLocationFactory : public HLALocationFactory { public: enum Semantic { - LatitudeDeg, - LatitudeRad, - LongitudeDeg, - LongitudeRad, - ElevationM, - ElevationFt, - HeadingDeg, - HeadingRad, - PitchDeg, - PitchRad, - RollDeg, - RollRad, - GroundTrackDeg, - GroundTrackRad, - GroundSpeedKnots, - GroundSpeedFtPerSec, - GroundSpeedMPerSec, - VerticalSpeedFtPerSec, - VerticalSpeedFtPerMin, - VerticalSpeedMPerSec + LatitudeDeg = HLAGeodeticLocation::LatitudeDeg, + LatitudeRad = HLAGeodeticLocation::LatitudeRad, + LongitudeDeg = HLAGeodeticLocation::LongitudeDeg, + LongitudeRad = HLAGeodeticLocation::LongitudeRad, + ElevationM = HLAGeodeticLocation::ElevationM, + ElevationFt = HLAGeodeticLocation::ElevationFt, + HeadingDeg = HLAGeodeticLocation::HeadingDeg, + HeadingRad = HLAGeodeticLocation::HeadingRad, + PitchDeg = HLAGeodeticLocation::PitchDeg, + PitchRad = HLAGeodeticLocation::PitchRad, + RollDeg = HLAGeodeticLocation::RollDeg, + RollRad = HLAGeodeticLocation::RollRad, + GroundTrackDeg = HLAGeodeticLocation::GroundTrackDeg, + GroundTrackRad = HLAGeodeticLocation::GroundTrackRad, + GroundSpeedKnots = HLAGeodeticLocation::GroundSpeedKnots, + GroundSpeedFtPerSec = HLAGeodeticLocation::GroundSpeedFtPerSec, + GroundSpeedMPerSec = HLAGeodeticLocation::GroundSpeedMPerSec, + VerticalSpeedFtPerSec = HLAGeodeticLocation::VerticalSpeedFtPerSec, + VerticalSpeedFtPerMin = HLAGeodeticLocation::VerticalSpeedFtPerMin, + VerticalSpeedMPerSec = HLAGeodeticLocation::VerticalSpeedMPerSec }; virtual HLAGeodeticLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const @@ -469,68 +638,33 @@ public: for (IndexPathPairSemanticMap::const_iterator i = _indexPathPairSemanticMap.begin(); i != _indexPathPairSemanticMap.end(); ++i) { - switch (i->second) { - case LatitudeDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeDegDataElement(); - break; - case LatitudeRad: - attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeRadDataElement(); - break; - case LongitudeDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeDegDataElement(); - break; - case LongitudeRad: - attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeRadDataElement(); - break; - case ElevationM: - attributePathElementMap[i->first.first][i->first.second] = location->getElevationMDataElement(); - break; - case ElevationFt: - attributePathElementMap[i->first.first][i->first.second] = location->getElevationFtDataElement(); - break; - case HeadingDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getHeadingDegDataElement(); - break; - case HeadingRad: - attributePathElementMap[i->first.first][i->first.second] = location->getHeadingRadDataElement(); - break; - case PitchDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getPitchDegDataElement(); - break; - case PitchRad: - attributePathElementMap[i->first.first][i->first.second] = location->getPitchRadDataElement(); - break; - case RollDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getRollDegDataElement(); - break; - case RollRad: - attributePathElementMap[i->first.first][i->first.second] = location->getRollRadDataElement(); - break; - case GroundTrackDeg: - attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackDegDataElement(); - break; - case GroundTrackRad: - attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackRadDataElement(); - break; - case GroundSpeedKnots: - attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedKnotsDataElement(); - break; - case GroundSpeedFtPerSec: - attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedFtPerSecDataElement(); - break; - case GroundSpeedMPerSec: - attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedMPerSecDataElement(); - break; - case VerticalSpeedFtPerSec: - attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerSecDataElement(); - break; - case VerticalSpeedFtPerMin: - attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerMinDataElement(); - break; - case VerticalSpeedMPerSec: - attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedMPerSecDataElement(); - break; - } + HLAGeodeticLocation::Semantic semantic = HLAGeodeticLocation::Semantic(i->second); + attributePathElementMap[i->first.first][i->first.second] = location->getDataElement(semantic); + } + + return location; + } + + virtual HLAGeodeticLocation* createLocation(HLAObjectInstance& objectInstance) const + { + HLAGeodeticLocation* location = new HLAGeodeticLocation; + + for (IndexPathPairSemanticMap::const_iterator i = _indexPathPairSemanticMap.begin(); + i != _indexPathPairSemanticMap.end(); ++i) { + std::string path = objectInstance.getAttributeName(i->first.first); + if (!i->first.second.empty()) + path += HLADataElement::toString(i->first.second); + HLADataElementIndex index; + if (!objectInstance.getDataElementIndex(index, path)) + continue; + HLAGeodeticLocation::Semantic semantic = HLAGeodeticLocation::Semantic(i->second); + objectInstance.setAttributeDataElement(index, location->getDataElement(semantic)); + } + + for (IndexSemanticMap::const_iterator i = _indexSemanticMap.begin(); + i != _indexSemanticMap.end(); ++i) { + HLAGeodeticLocation::Semantic semantic = HLAGeodeticLocation::Semantic(i->second); + objectInstance.setAttributeDataElement(i->first, location->getDataElement(semantic)); } return location; @@ -538,10 +672,15 @@ public: void setIndexPathPair(Semantic semantic, const HLADataElement::IndexPathPair& indexPathPair) { _indexPathPairSemanticMap[indexPathPair] = semantic; } + void setIndex(Semantic semantic, const HLADataElementIndex& index) + { _indexSemanticMap[index] = semantic; } private: typedef std::map IndexPathPairSemanticMap; IndexPathPairSemanticMap _indexPathPairSemanticMap; + + typedef std::map IndexSemanticMap; + IndexSemanticMap _indexSemanticMap; }; } // namespace simgear -- 2.39.5