void MyPosition::CacheAccuracySector(ref_ptr<dp::TextureManager> mng) { int const TriangleCount = 40; int const VertexCount = 3 * TriangleCount; float const etalonSector = math::twicePi / static_cast<double>(TriangleCount); dp::TextureManager::ColorRegion color; mng->GetColorRegion(df::GetColorConstant(GetStyleReader().GetCurrentStyle(), df::MyPositionAccuracy), color); glsl::vec2 colorCoord = glsl::ToVec2(color.GetTexRect().Center()); buffer_vector<Vertex, TriangleCount> buffer; glsl::vec2 startNormal(0.0f, 1.0f); for (size_t i = 0; i < TriangleCount + 1; ++i) { glsl::vec2 normal = glsl::rotate(startNormal, i * etalonSector); glsl::vec2 nextNormal = glsl::rotate(startNormal, (i + 1) * etalonSector); buffer.emplace_back(startNormal, colorCoord); buffer.emplace_back(normal, colorCoord); buffer.emplace_back(nextNormal, colorCoord); } dp::GLState state(gpu::ACCURACY_PROGRAM, dp::GLState::OverlayLayer); state.SetColorTexture(color.GetTexture()); { dp::Batcher batcher(TriangleCount * dp::Batcher::IndexPerTriangle, VertexCount); dp::SessionGuard guard(batcher, [this](dp::GLState const & state, drape_ptr<dp::RenderBucket> && b) { drape_ptr<dp::RenderBucket> bucket = move(b); ASSERT(bucket->GetOverlayHandlesCount() == 0, ()); m_nodes.emplace_back(state, bucket->MoveBuffer()); m_parts[MY_POSITION_ACCURACY].second = m_nodes.size() - 1; }); dp::AttributeProvider provider(1 /*stream count*/, VertexCount); provider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(buffer.data())); m_parts[MY_POSITION_ACCURACY].first = batcher.InsertTriangleList(state, make_ref(&provider), nullptr); ASSERT(m_parts[MY_POSITION_ACCURACY].first.IsValid(), ()); }
dp::BindingInfo const & GetCapBindingInfo() override { return GetBindingInfo(); }