diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-06-21 11:46:32 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-23 10:25:09 +0300 |
commit | de84454400b0c35f8556957e4945cd7f68b6c8e6 (patch) | |
tree | f88a7acfac7344e79719ebb2091820dd697833a8 /indexer | |
parent | eead0e66ec4f397ecb67aedc8bf252c370efff31 (diff) |
[altitude] The first version of writing to mwm and reading from altitude information.
Diffstat (limited to 'indexer')
-rw-r--r-- | indexer/feature.cpp | 11 | ||||
-rw-r--r-- | indexer/feature.hpp | 13 | ||||
-rw-r--r-- | indexer/feature_altitude.hpp | 49 | ||||
-rw-r--r-- | indexer/feature_loader.cpp | 42 | ||||
-rw-r--r-- | indexer/feature_loader.hpp | 17 | ||||
-rw-r--r-- | indexer/feature_loader_base.cpp | 5 | ||||
-rw-r--r-- | indexer/feature_loader_base.hpp | 2 | ||||
-rw-r--r-- | indexer/indexer.pro | 1 | ||||
-rw-r--r-- | indexer/old/feature_loader_101.hpp | 18 |
9 files changed, 140 insertions, 18 deletions
diff --git a/indexer/feature.cpp b/indexer/feature.cpp index b05151515a..7153bc6476 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -302,7 +302,7 @@ void FeatureType::Deserialize(feature::LoaderBase * pLoader, TBuffer buffer) m_pLoader->InitFeature(this); - m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = false; + m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = m_altitudeParsed = false; m_innerStats.MakeZero(); } @@ -375,6 +375,15 @@ void FeatureType::ParseMetadata() const m_metadataParsed = true; } +void FeatureType::ParseAltitude() const +{ + if (m_altitudeParsed) + return; + + m_pLoader->ParseAltitude(); + m_altitudeParsed = true; +} + StringUtf8Multilang const & FeatureType::GetNames() const { return m_params.name; diff --git a/indexer/feature.hpp b/indexer/feature.hpp index 1913cd3465..108857dba1 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -1,5 +1,6 @@ #pragma once #include "indexer/cell_id.hpp" +#include "indexer/feature_altitude.hpp" #include "indexer/feature_data.hpp" #include "geometry/point2d.hpp" @@ -201,6 +202,7 @@ public: uint32_t ParseTriangles(int scale) const; void ParseMetadata() const; + void ParseAltitude() const; //@} /// @name Geometry. @@ -243,6 +245,12 @@ public: return m_points[i]; } + inline feature::Altitudes const & GetAltitudes() const + { + ASSERT(m_altitudeParsed, ()); + return m_altitudes; + } + template <typename TFunctor> void ForEachTriangle(TFunctor && f, int scale) const { @@ -361,10 +369,15 @@ private: mutable points_t m_points, m_triangles; mutable feature::Metadata m_metadata; + // @TODO |m_altitudes| should be exchanged with vector<TAltitude>. + // If the vector is empty no altitude information is available for this feature. + mutable feature::Altitudes m_altitudes; + mutable bool m_header2Parsed = false; mutable bool m_pointsParsed = false; mutable bool m_trianglesParsed = false; mutable bool m_metadataParsed = false; + mutable bool m_altitudeParsed = false; mutable inner_geom_stat_t m_innerStats; diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp new file mode 100644 index 0000000000..54894f0047 --- /dev/null +++ b/indexer/feature_altitude.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "coding/varint.hpp" + +#include "std/vector.hpp" + +namespace feature +{ +using TAltitude = int16_t; +using TAltitudeVec = vector<feature::TAltitude>; +static TAltitude constexpr kInvalidAltitude = -32768; + +struct Altitudes +{ + Altitudes() = default; + Altitudes(TAltitude b, TAltitude e) : begin(b), end(e) {} + + TAltitude begin = 0; + TAltitude end = 0; +}; + +class Altitude +{ +public: + Altitude() = default; + Altitude(uint32_t featureId, Altitudes const & altitudes) : m_featureId(featureId), m_altitudes(altitudes) {} + + template <class TSink> + void Serialize(TSink & sink) const + { + sink.Write(&m_featureId, sizeof(uint32_t)); + sink.Write(&m_altitudes.begin, sizeof(TAltitude)); + sink.Write(&m_altitudes.end, sizeof(TAltitude)); + } + + /// @TODO template <class TSource> void Deserialize(TSource & src) should be implement here. + /// But now for test purposes deserialization is done with DDVector construction. + + uint32_t GetFeatureId() const { return m_featureId; } + Altitudes const & GetAltitudes() const { return m_altitudes; } + +private: + /// @TODO Note. Feature id is located here because there's no index for altitudes. + /// There's only pairs sorted by feature id. Before merging to master some index has to be implemented. + /// Don't forget to remove |m_featureId|. + uint32_t m_featureId = 0; + Altitudes m_altitudes; +}; +} // namespace feature diff --git a/indexer/feature_loader.cpp b/indexer/feature_loader.cpp index 37093182e8..950f134959 100644 --- a/indexer/feature_loader.cpp +++ b/indexer/feature_loader.cpp @@ -292,6 +292,48 @@ void LoaderCurrent::ParseMetadata() } } +void LoaderCurrent::ParseAltitude() +{ + // @TODO Index and should be used here before merging to master. + + if (m_Info.GetMWMFormat() < version::Format::v8) + return; + + struct TAltitudeIndexEntry + { + uint32_t featureId; + feature::TAltitude beginAlt; + feature::TAltitude endAlt; + }; + + try + { + DDVector<TAltitudeIndexEntry, FilesContainerR::TReader> idx(m_Info.GetAltitudeReader()); + auto it = lower_bound( + idx.begin(), idx.end(), + TAltitudeIndexEntry{static_cast<uint32_t>(m_pF->m_id.m_index), 0, 0}, + [](TAltitudeIndexEntry const & v1, TAltitudeIndexEntry const & v2) + { + return v1.featureId < v2.featureId; + }); + if (it == idx.end()) + return; + + if (m_pF->m_id.m_index != it->featureId) + return; + + if (it->beginAlt == kInvalidAltitude || it->endAlt == kInvalidAltitude) + return; + + m_pF->m_altitudes.begin = it->beginAlt; + m_pF->m_altitudes.end = it->endAlt; + } + catch (Reader::OpenException const &) + { + // Now ignore exception because not all mwm have needed sections. + } +} + int LoaderCurrent::GetScaleIndex(int scale) const { int const count = m_Info.GetScalesCount(); diff --git a/indexer/feature_loader.hpp b/indexer/feature_loader.hpp index 693cb9a451..513ca984c3 100644 --- a/indexer/feature_loader.hpp +++ b/indexer/feature_loader.hpp @@ -21,13 +21,14 @@ namespace feature public: LoaderCurrent(SharedLoadInfo const & info) : BaseT(info) {} - virtual uint8_t GetHeader(); - - virtual void ParseTypes(); - virtual void ParseCommon(); - virtual void ParseHeader2(); - virtual uint32_t ParseGeometry(int scale); - virtual uint32_t ParseTriangles(int scale); - virtual void ParseMetadata(); + /// LoaderBase overrides: + virtual uint8_t GetHeader() override; + void ParseTypes() override; + void ParseCommon() override; + void ParseHeader2() override; + uint32_t ParseGeometry(int scale) override; + uint32_t ParseTriangles(int scale) override; + void ParseMetadata() override; + void ParseAltitude() override; }; } diff --git a/indexer/feature_loader_base.cpp b/indexer/feature_loader_base.cpp index 8aa9d8422e..349ea8055e 100644 --- a/indexer/feature_loader_base.cpp +++ b/indexer/feature_loader_base.cpp @@ -44,6 +44,11 @@ SharedLoadInfo::TReader SharedLoadInfo::GetMetadataIndexReader() const return m_cont.GetReader(METADATA_INDEX_FILE_TAG); } +SharedLoadInfo::TReader SharedLoadInfo::GetAltitudeReader() const +{ + return m_cont.GetReader(ALTITUDE_TAG); +} + SharedLoadInfo::TReader SharedLoadInfo::GetGeometryReader(int ind) const { return m_cont.GetReader(GetTagForIndex(GEOMETRY_FILE_TAG, ind)); diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp index 46f68f1597..2a2b2ff617 100644 --- a/indexer/feature_loader_base.hpp +++ b/indexer/feature_loader_base.hpp @@ -32,6 +32,7 @@ namespace feature TReader GetDataReader() const; TReader GetMetadataReader() const; TReader GetMetadataIndexReader() const; + TReader GetAltitudeReader() const; TReader GetGeometryReader(int ind) const; TReader GetTrianglesReader(int ind) const; @@ -78,6 +79,7 @@ namespace feature virtual uint32_t ParseGeometry(int scale) = 0; virtual uint32_t ParseTriangles(int scale) = 0; virtual void ParseMetadata() = 0; + virtual void ParseAltitude() = 0; inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; } diff --git a/indexer/indexer.pro b/indexer/indexer.pro index 26a2499e36..6602f18ddf 100644 --- a/indexer/indexer.pro +++ b/indexer/indexer.pro @@ -81,6 +81,7 @@ HEADERS += \ edits_migration.hpp \ feature.hpp \ feature_algo.hpp \ + feature_altitude.hpp \ feature_covering.hpp \ feature_data.hpp \ feature_decl.hpp \ diff --git a/indexer/old/feature_loader_101.hpp b/indexer/old/feature_loader_101.hpp index a18c8913da..7c07657013 100644 --- a/indexer/old/feature_loader_101.hpp +++ b/indexer/old/feature_loader_101.hpp @@ -29,15 +29,15 @@ namespace old_101 { namespace feature public: LoaderImpl(::feature::SharedLoadInfo const & info) : BaseT(info) {} - virtual uint8_t GetHeader(); - - virtual void ParseTypes(); - virtual void ParseCommon(); - virtual void ParseHeader2(); - virtual uint32_t ParseGeometry(int scale); - virtual uint32_t ParseTriangles(int scale); - virtual void ParseMetadata() {} /// not supported in this version - + /// LoaderBase overrides: + uint8_t GetHeader() override; + void ParseTypes() override; + void ParseCommon() override; + void ParseHeader2() override; + uint32_t ParseGeometry(int scale) override; + uint32_t ParseTriangles(int scale) override; + void ParseMetadata() override {} /// not supported in this version + void ParseAltitude() override {} /// not supported in this version }; } } |