Welcome to mirror list, hosted at ThFree Co, Russian Federation.

render_group.hpp « drape_frontend - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2001b9c656d428934edbd01c02150b9e6f19909d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#pragma once

#include "drape_frontend/animation/opacity_animation.hpp"
#include "drape_frontend/animation/value_mapping.hpp"
#include "drape_frontend/frame_values.hpp"
#include "drape_frontend/render_state_extension.hpp"
#include "drape_frontend/tile_utils.hpp"

#include "shaders/program_params.hpp"

#include "drape/pointers.hpp"
#include "drape/render_bucket.hpp"

#include <memory>
#include <vector>
#include <string>

class ScreenBase;
namespace dp { class OverlayTree; }
namespace gpu { class ProgramManager; }

namespace df
{
class DebugRectRenderer;

class BaseRenderGroup
{
public:
  BaseRenderGroup(dp::RenderState const & state, TileKey const & tileKey)
    : m_state(state)
    , m_tileKey(tileKey)
  {}

  virtual ~BaseRenderGroup() = default;

  dp::RenderState const & GetState() const { return m_state; }
  TileKey const & GetTileKey() const { return m_tileKey; }

  virtual void UpdateAnimation();
  virtual void Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
                      FrameValues const & frameValues, ref_ptr<DebugRectRenderer> debugRectRenderer) = 0;

protected:
  dp::RenderState m_state;
  gpu::MapProgramParams m_params;

private:
  TileKey m_tileKey;
};

class RenderGroup : public BaseRenderGroup
{
  using TBase = BaseRenderGroup;
public:
  RenderGroup(dp::RenderState const & state, TileKey const & tileKey);
  ~RenderGroup() override;

  void Update(ScreenBase const & modelView);
  void CollectOverlay(ref_ptr<dp::OverlayTree> tree);
  bool HasOverlayHandles() const;
  void RemoveOverlay(ref_ptr<dp::OverlayTree> tree);
  void SetOverlayVisibility(bool isVisible);
  void Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
              FrameValues const & frameValues, ref_ptr<DebugRectRenderer> debugRectRenderer) override;

  void AddBucket(drape_ptr<dp::RenderBucket> && bucket);

  bool IsEmpty() const { return m_renderBuckets.empty(); }

  void DeleteLater() const { m_pendingOnDelete = true; }
  bool IsPendingOnDelete() const { return m_pendingOnDelete; }
  bool CanBeDeleted() const { return m_canBeDeleted; }

  bool UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom,
                                ref_ptr<dp::OverlayTree> tree);

  bool IsOverlay() const;
  bool IsUserMark() const;

private:
  std::vector<drape_ptr<dp::RenderBucket>> m_renderBuckets;
  mutable bool m_pendingOnDelete;
  mutable bool m_canBeDeleted;

private:
  friend std::string DebugPrint(RenderGroup const & group);
};

class RenderGroupComparator
{
public:
  bool operator()(drape_ptr<RenderGroup> const & l, drape_ptr<RenderGroup> const & r);
  bool m_pendingOnDeleteFound = false;
};

class UserMarkRenderGroup : public RenderGroup
{
  using TBase = RenderGroup;
public:
  UserMarkRenderGroup(dp::RenderState const & state, TileKey const & tileKey);

  void UpdateAnimation() override;

  bool IsUserPoint() const;

private:
  std::unique_ptr<OpacityAnimation> m_animation;
  ValueMapping<float> m_mapping;
};
}  // namespace df