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

defines.cpp « graphics - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 827df1e45a759e8b7bc3198ee3422d8b0d4dcacb (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "defines.hpp"
#include "../coding/file_name_utils.hpp"
#include "../base/macros.hpp"
#include "../base/logging.hpp"
#include "../std/string.hpp"
// for strcmp
#include "../std/memcpy.hpp"

namespace graphics
{
  namespace
  {
    // Use custom struct to leave {} initialization notation (pair doesn't support it).
    template <class FirstT, class SecondT> struct DataT
    {
      FirstT first;
      SecondT second;
    };

    typedef DataT<int, char const *> DataIS;

    template <class SecondT, size_t N>
    SecondT FindSecondByFirst(DataT<int, SecondT> (&arr)[N], int t)
    {
      for (size_t i = 0; i < N; ++i)
      {
        if (t == arr[i].first)
          return arr[i].second;
      }

      LOG(LERROR, (t));
      return SecondT();
    }

    template <class FirstT, class SecondT, size_t N, class CompareT>
    FirstT FindFirstBySecond(DataT<FirstT, SecondT> (&arr)[N],
                             SecondT t, CompareT comp)
    {
      for (size_t i = 0; i < N; ++i)
      {
        if (comp(t, arr[i].second))
          return arr[i].first;
      }

      LOG(LERROR, (t));
      return FirstT();
    }

    struct EqualStrings
    {
      bool operator() (char const * s1, char const * s2) const
      {
        return (strcmp(s1, s2) == 0);
      }
    };
  }

  DataIS s_density[] = {
    {EDensityLDPI, "ldpi"},
    {EDensityMDPI, "mdpi"},
    {EDensityHDPI, "hdpi"},
    {EDensityXHDPI, "xhdpi"},
    {EDensityXXHDPI, "xxhdpi"}
  };

  char const * convert(EDensity density)
  {
    return FindSecondByFirst(s_density, density);
  }

  string const resourcePath(string const & name, EDensity d)
  {
    return my::JoinFoldersToPath(string("resources-") + convert(d), name);
  }

  double visualScale(EDensity density)
  {
    static double const vs [5] = { 0.75, 1, 1.5, 2, 3 };
    return vs[density];
  }

  DataIS s_semantics[] = {
    {ESemPosition, "Position"},
    {ESemNormal, "Normal"},
    {ESemTexCoord0, "TexCoord0"},
    {ESemSampler0, "Sampler0"},
    {ESemModelView, "ModelView"},
    {ESemProjection, "Projection"}
  };

  void convert(char const * name, ESemantic & sem)
  {
    sem = static_cast<ESemantic>(FindFirstBySecond(s_semantics, name, EqualStrings()));
  }

  DataIS s_storages[] = {
    {ETinyStorage, "TinyStorage"},
    {ESmallStorage, "SmallStorage"},
    {EMediumStorage, "MediumStorage"},
    {ELargeStorage, "LargeStorage"},
    {EInvalidStorage, "InvalidStorage"}
  };

  char const * convert(EStorageType type)
  {
    return FindSecondByFirst(s_storages, type);
  }

  DataIS s_textures[] = {
    {ESmallTexture, "SmallTexture"},
    {EMediumTexture, "MediumTexture"},
    {ELargeTexture, "LargeTexture"},
    {ERenderTargetTexture, "RenderTargetTexture"},
    {EStaticTexture, "StaticTexture"},
    {EInvalidTexture, "InvalidTexture"}
  };

  char const * convert(ETextureType type)
  {
    return FindSecondByFirst(s_textures, type);
  }

  DataT<int, unsigned> s_dataTypes[] = {
    {EInteger, sizeof(int)},
    {EIntegerVec2, sizeof(int) * 2},
    {EIntegerVec3, sizeof(int) * 3},
    {EIntegerVec4, sizeof(int) * 4},
    {EFloat, sizeof(float)},
    {EFloatVec2, sizeof(float) * 2},
    {EFloatVec3, sizeof(float) * 3},
    {EFloatVec4, sizeof(float) * 4},
    {EFloatMat2, sizeof(float) * 4},
    {EFloatMat3, sizeof(float) * 9},
    {EFloatMat4, sizeof(float) * 16},
    {ESampler2D, sizeof(int)}
  };

  unsigned elemSize(EDataType type)
  {
    return FindSecondByFirst(s_dataTypes, type);
  }
}