summaryrefslogtreecommitdiff
path: root/src/mbgl/programs/fill_extrusion_program.hpp
blob: f92bd7c968fcf2cf5cbf6b41d68448b8b2a14834 (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
#pragma once

#include <mbgl/programs/program.hpp>
#include <mbgl/programs/attributes.hpp>
#include <mbgl/programs/uniforms.hpp>
#include <mbgl/programs/textures.hpp>
#include <mbgl/util/geometry.hpp>
#include <mbgl/util/mat4.hpp>
#include <mbgl/util/size.hpp>
#include <mbgl/style/layers/fill_extrusion_layer_properties.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/renderer/render_light.hpp>

#include <string>

namespace mbgl {

class ImagePosition;
class UnwrappedTileID;
class TransformState;
template <class> class Faded;

namespace uniforms {
MBGL_DEFINE_UNIFORM_VECTOR(float, 3, lightpos);
MBGL_DEFINE_UNIFORM_VECTOR(float, 3, lightcolor);
MBGL_DEFINE_UNIFORM_SCALAR(float,    lightintensity);
MBGL_DEFINE_UNIFORM_SCALAR(float,    vertical_gradient);
MBGL_DEFINE_UNIFORM_SCALAR(float,    height_factor);
} // namespace uniforms

using FillExtrusionLayoutAttributes = TypeList<
    attributes::pos,
    attributes::normal_ed>;

using FillExtrusionUniforms = TypeList<
    uniforms::matrix,
    uniforms::opacity,
    uniforms::lightcolor,
    uniforms::lightpos,
    uniforms::lightintensity,
    uniforms::vertical_gradient>;

using FillExtrusionPatternUniforms = TypeList<
    uniforms::matrix,
    uniforms::opacity,
    uniforms::scale,
    uniforms::texsize,
    uniforms::fade,
    uniforms::pixel_coord_upper,
    uniforms::pixel_coord_lower,
    uniforms::height_factor,
    uniforms::lightcolor,
    uniforms::lightpos,
    uniforms::lightintensity,
    uniforms::vertical_gradient>;

class FillExtrusionProgram : public Program<
    FillExtrusionProgram,
    gfx::PrimitiveType::Triangle,
    FillExtrusionLayoutAttributes,
    FillExtrusionUniforms,
    TypeList<>,
    style::FillExtrusionPaintProperties>
{
public:
    using Program::Program;

    static LayoutVertex layoutVertex(Point<int16_t> p, double nx, double ny, double nz, unsigned short t, uint16_t e) {
        const auto factor = pow(2, 13);

        return LayoutVertex {
            {{
                p.x,
                p.y
            }},
            {{
                // Multiply normal vector components by 2^14 to pack them into integers
                // We pack a bool (`t`) into the x component indicating whether it is an upper or lower vertex
                static_cast<int16_t>(floor(nx * factor) * 2 + t),
                static_cast<int16_t>(ny * factor * 2),
                static_cast<int16_t>(nz * factor * 2),
                // The edgedistance attribute is used for wrapping fill_extrusion patterns
                static_cast<int16_t>(e)
            }}
        };
    }

    static LayoutUniformValues layoutUniformValues(
        mat4, const TransformState&, float opacity, const EvaluatedLight&, float verticalGradient);
};

class FillExtrusionPatternProgram : public Program<
    FillExtrusionPatternProgram,
    gfx::PrimitiveType::Triangle,
    FillExtrusionLayoutAttributes,
    FillExtrusionPatternUniforms,
    TypeList<
        textures::image>,
    style::FillExtrusionPaintProperties>
{
public:
    using Program::Program;

    static LayoutUniformValues layoutUniformValues(mat4,
                                                   Size atlasSize,
                                                   const CrossfadeParameters&,
                                                   const UnwrappedTileID&,
                                                   const TransformState&,
                                                   float opacity,
                                                   float heightFactor,
                                                   float pixelRatio,
                                                   const EvaluatedLight&,
                                                   float verticalGradient);
};

using FillExtrusionLayoutVertex = FillExtrusionProgram::LayoutVertex;
using FillExtrusionAttributes = FillExtrusionProgram::AttributeList;


class FillExtrusionLayerPrograms final : public LayerTypePrograms {
public:
    FillExtrusionLayerPrograms(gfx::Context& context, const ProgramParameters& programParameters)
        : fillExtrusion(context, programParameters),
          fillExtrusionPattern(context, programParameters) {
    }
    FillExtrusionProgram fillExtrusion;
    FillExtrusionPatternProgram fillExtrusionPattern;
};

} // namespace mbgl