From 83011c67dce2c938ff88d7520d5ad64fef17eca7 Mon Sep 17 00:00:00 2001 From: vng Date: Sun, 9 Jan 2011 15:11:43 +0200 Subject: [PATCH] Build index for the best geometry (highest drawable scale). --- data/minsk-pass.mwm | Bin 74719 -> 74709 bytes indexer/feature.cpp | 53 +++++++++++++++++++++++--------- indexer/feature.hpp | 4 +-- indexer/feature_impl.hpp | 11 ++----- indexer/scale_index_builder.hpp | 13 ++++++-- 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/data/minsk-pass.mwm b/data/minsk-pass.mwm index ca6fbe4ff943b508c4604c12d97e035534f54ab8..9c1ef2e461483ed7f49c3767d5adf61573e99b46 100644 GIT binary patch delta 745 zcmX}qPe_wt90&04^FDjs#xzW_6mcztFzK+2>fnfQhaz#EqY|PHdI{#Ke>x~Btf`F$ z3+$37Pa&^Qk!wX4X>&W6hg2jhf-bqg6nHSI=R2yyKKuTDzvuV7?_i(OuJ>t|xax?@ zj=!ND*wX<#>;%4c1D!oUp%0kp2fj!3^y`C`e&T!;_=f*hCO^^p1B-F=jn-!MoSN4V; z&INsZN4EVFN%G_R!>)_4iC9)U@m7~^u^DA%rm_t zDe{VBNscV3k+q}Zl1ilMm##yVaOxtR=fhBWWfrdOFu(>32)(HTv0?n8$ktJ}kgx2BA%9S#GZi72f)n q&0pYJz2W+-7Z{o+Ot;8wy}LLmL{iU`PFea#W#N!`^C;OS_WuE8kEnwH delta 740 zcmYMxOGs2v7zgnGxpVJ0IX)&DLe0@giqeRwMFgXZGU!Fpwuqrcf+;d-V9P^7~iaTj> zG2Pa+8whs-sRKae2+(~BSc?Mb0pQ<|nt8F;P}AzGP!qFFo9p*sD^37t*JrD;l_g}( zX_nud<}+adtm-x@KEhOGss>0CiRdL&9pG}{a^P~{a^UKKwO)^=kH~0#Fvux5#c2Z& zEIo25AFO3Ew-fmzZ`bO83^&cl>xFI+kxvRSxw9C(aG4tplUro;tmZD$7}FTHiSHr$ z^%3Wdw5jlX>=DGZjgRl-XM* zf8@x@LD4VMD<|8JvvHU_B|XGX8c2(5c^|s6QHR*vLbj1ZV8iN^|*4>utN3vDb-K+)qYV(raHu~|69= 0 && offsets[i] == kInvalidOffset) --i; + if (i >= 0) + return i; + else + CHECK ( false, ("Feature should have any geometry ...") ); + } + else + { + for (size_t i = 0; i < ARRAY_SIZE(feature::g_arrScales); ++i) + if (scale <= feature::g_arrScales[i]) + { + if (offsets[i] != kInvalidOffset) + return i; + else + break; + } + } + + return -1; } namespace @@ -565,16 +588,16 @@ uint32_t FeatureType::ParseGeometry(int scale) const uint32_t sz = 0; if (Header() & HEADER_IS_LINE) { - uint32_t const offset = GetOffset(scale, m_lineOffsets); - if (offset != kInvalidOffset) + int const ind = GetScaleIndex(scale, m_lineOffsets); + if (ind != -1) { ReaderSource src( - m_cont->GetReader(feature::GetTagForScale(GEOMETRY_FILE_TAG, scale))); - src.Skip(offset); + m_cont->GetReader(feature::GetTagForIndex(GEOMETRY_FILE_TAG, ind))); + src.Skip(m_lineOffsets[ind]); feature::LoadPoints(m_Geometry, src); CalcRect(m_Geometry, m_LimitRect); - sz = static_cast(src.Pos() - offset); + sz = static_cast(src.Pos() - m_lineOffsets[ind]); } } @@ -590,16 +613,16 @@ uint32_t FeatureType::ParseTriangles(int scale) const uint32_t sz = 0; if (Header() & HEADER_IS_AREA) { - uint32_t const offset = GetOffset(scale, m_trgOffsets); - if (offset != kInvalidOffset) + uint32_t const ind = GetScaleIndex(scale, m_trgOffsets); + if (ind != -1) { ReaderSource src( - m_cont->GetReader(feature::GetTagForScale(TRIANGLE_FILE_TAG, scale))); - src.Skip(offset); + m_cont->GetReader(feature::GetTagForIndex(TRIANGLE_FILE_TAG, ind))); + src.Skip(m_trgOffsets[ind]); feature::LoadTriangles(m_Triangles, src); CalcRect(m_Triangles, m_LimitRect); - sz = static_cast(src.Pos() - offset); + sz = static_cast(src.Pos() - m_trgOffsets[ind]); } } diff --git a/indexer/feature.hpp b/indexer/feature.hpp index 19c01f988c..5d423ade3e 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -434,9 +434,7 @@ private: static void ReadOffsetsImpl(ArrayByteSource & src, offsets_t & offsets); - static uint32_t const kInvalidOffset = uint32_t(-1); - - uint32_t GetOffset(int scale, offsets_t const & offset) const; + int GetScaleIndex(int scale, offsets_t const & offset) const; mutable offsets_t m_lineOffsets, m_trgOffsets; }; diff --git a/indexer/feature_impl.hpp b/indexer/feature_impl.hpp index 269619e4bb..dc7eea151c 100644 --- a/indexer/feature_impl.hpp +++ b/indexer/feature_impl.hpp @@ -119,7 +119,7 @@ namespace feature static int g_arrScales[] = { 5, 10, 14, 17 }; // 17 = scales::GetUpperScale() - inline string GetTagForScale(char const * prefix, int scale) + inline string GetTagForIndex(char const * prefix, int ind) { string str; str.reserve(strlen(prefix) + 1); @@ -127,14 +127,9 @@ namespace feature static char arrChar[] = { '0', '1', '2', '3' }; STATIC_ASSERT ( ARRAY_SIZE(arrChar) == ARRAY_SIZE(g_arrScales) ); + ASSERT ( ind >= 0 && ind < ARRAY_SIZE(arrChar), (ind) ); - for (size_t i = 0; i < ARRAY_SIZE(feature::g_arrScales); ++i) - if (scale <= feature::g_arrScales[i]) - { - str += arrChar[i]; - break; - } - + str += arrChar[ind]; return str; } } diff --git a/indexer/scale_index_builder.hpp b/indexer/scale_index_builder.hpp index d301deb2ce..1184e93316 100644 --- a/indexer/scale_index_builder.hpp +++ b/indexer/scale_index_builder.hpp @@ -49,6 +49,13 @@ STATIC_ASSERT(sizeof(CellFeaturePair) == 12); template class FeatureCoverer { + int GetGeometryScale() const + { + // Do not pass actual level. We should build index for the best geometry (pass -1). + return -1; + //return m_ScaleRange.second-1; + } + public: FeatureCoverer(uint32_t bucket, SorterT & sorter, @@ -64,7 +71,7 @@ public: { if (FeatureShouldBeIndexed(f)) { - vector const cells = covering::CoverFeature(f, m_ScaleRange.second-1); + vector const cells = covering::CoverFeature(f, GetGeometryScale()); for (vector::const_iterator it = cells.begin(); it != cells.end(); ++it) m_Sorter.Add(CellFeaturePair(*it, offset)); ++m_NumFeatures; @@ -75,8 +82,8 @@ public: template bool FeatureShouldBeIndexed(TFeature const & f) const { - if (f.IsEmptyGeometry(m_ScaleRange.second-1)) - return false; + if (f.IsEmptyGeometry(GetGeometryScale())) + return false; uint32_t const minScale = feature::MinDrawableScaleForFeature(f); return (m_ScaleRange.first <= minScale && minScale < m_ScaleRange.second);