Celestia

Форк
0
/
viewporteffect.cpp 
190 строк · 4.5 Кб
1
//
2
// viewporteffect.cpp
3
//
4
// Copyright © 2020 Celestia Development Team. All rights reserved.
5
//
6
// This program is free software; you can redistribute it and/or
7
// modify it under the terms of the GNU General Public License
8
// as published by the Free Software Foundation; either version 2
9
// of the License, or (at your option) any later version.
10

11
#include <array>
12
#include "viewporteffect.h"
13
#include "framebuffer.h"
14
#include "render.h"
15
#include "shadermanager.h"
16
#include "mapmanager.h"
17

18
namespace gl = celestia::gl;
19
namespace util = celestia::util;
20

21
static const Renderer::PipelineState ps;
22

23
bool ViewportEffect::preprocess(Renderer* renderer, FramebufferObject* fbo)
24
{
25
    glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFboId);
26
    return fbo->bind();
27
}
28

29
bool ViewportEffect::prerender(Renderer* renderer, FramebufferObject* fbo)
30
{
31
    if (!fbo->unbind(oldFboId))
32
        return false;
33

34
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
35
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
36
    return true;
37
}
38

39
bool ViewportEffect::distortXY(float &x, float &y)
40
{
41
    return true;
42
}
43

44
PassthroughViewportEffect::PassthroughViewportEffect() :
45
    ViewportEffect()
46
{
47
}
48

49
bool PassthroughViewportEffect::render(Renderer* renderer, FramebufferObject* fbo, int width, int height)
50
{
51
    auto *prog = renderer->getShaderManager().getShader("passthrough");
52
    if (prog == nullptr)
53
        return false;
54

55
    initialize();
56

57
    prog->use();
58
    prog->samplerParam("tex") = 0;
59
    glBindTexture(GL_TEXTURE_2D, fbo->colorTexture());
60
    renderer->setPipelineState(ps);
61
    vo.draw();
62
    glBindTexture(GL_TEXTURE_2D, 0);
63

64
    return true;
65
}
66

67
void PassthroughViewportEffect::initialize()
68
{
69
    if (initialized)
70
        return;
71
    initialized = true;
72

73
    static std::array quadVertices = {
74
        // positions   // texCoords
75
        -1.0f,  1.0f,  0.0f, 1.0f,
76
        -1.0f, -1.0f,  0.0f, 0.0f,
77
         1.0f, -1.0f,  1.0f, 0.0f,
78

79
        -1.0f,  1.0f,  0.0f, 1.0f,
80
         1.0f, -1.0f,  1.0f, 0.0f,
81
         1.0f,  1.0f,  1.0f, 1.0f
82
    };
83

84
    vo = gl::VertexObject();
85
    bo = gl::Buffer(gl::Buffer::TargetHint::Array, quadVertices, gl::Buffer::BufferUsage::StaticDraw);
86

87
    vo.setCount(6);
88
    vo.addVertexBuffer(
89
        bo,
90
        CelestiaGLProgram::VertexCoordAttributeIndex,
91
        2,
92
        gl::VertexObject::DataType::Float,
93
        false,
94
        4 * sizeof(float),
95
        0);
96
    vo.addVertexBuffer(
97
        bo,
98
        CelestiaGLProgram::TextureCoord0AttributeIndex,
99
        2,
100
        gl::VertexObject::DataType::Float,
101
        false,
102
        4 * sizeof(float),
103
        2 * sizeof(float));
104
}
105

106
WarpMeshViewportEffect::WarpMeshViewportEffect(WarpMesh *mesh) :
107
    ViewportEffect(),
108
    mesh(mesh)
109
{
110
}
111

112
bool WarpMeshViewportEffect::prerender(Renderer* renderer, FramebufferObject* fbo)
113
{
114
    if (mesh == nullptr)
115
        return false;
116

117
    return ViewportEffect::prerender(renderer, fbo);
118
}
119

120
bool WarpMeshViewportEffect::render(Renderer* renderer, FramebufferObject* fbo, int width, int height)
121
{
122
    auto *prog = renderer->getShaderManager().getShader("warpmesh");
123
    if (prog == nullptr)
124
        return false;
125

126
    initialize();
127

128
    prog->use();
129
    prog->samplerParam("tex") = 0;
130
    prog->floatParam("screenRatio") = (float)height / width;
131
    glBindTexture(GL_TEXTURE_2D, fbo->colorTexture());
132
    renderer->setPipelineState(ps);
133
    vo.draw();
134
    glBindTexture(GL_TEXTURE_2D, 0);
135

136
    return true;
137
}
138

139
void WarpMeshViewportEffect::initialize()
140
{
141
    if (initialized)
142
        return;
143
    initialized = true;
144

145
    vo = gl::VertexObject();
146
    bo = gl::Buffer();
147

148
    bo.setData(mesh->scopedDataForRendering(), gl::Buffer::BufferUsage::StaticDraw);
149

150
    vo.setCount(mesh->count());
151
    vo.addVertexBuffer(
152
        bo,
153
        CelestiaGLProgram::VertexCoordAttributeIndex,
154
        2,
155
        gl::VertexObject::DataType::Float,
156
        false,
157
        5 * sizeof(float),
158
        0);
159
    vo.addVertexBuffer(
160
        bo,
161
        CelestiaGLProgram::TextureCoord0AttributeIndex,
162
        2,
163
        gl::VertexObject::DataType::Float,
164
        false,
165
        5 * sizeof(float),
166
        2 * sizeof(float));
167
    vo.addVertexBuffer(
168
        bo,
169
        CelestiaGLProgram::IntensityAttributeIndex,
170
        1,
171
        gl::VertexObject::DataType::Float,
172
        false,
173
        5 * sizeof(float),
174
        4 * sizeof(float));
175
}
176

177
bool WarpMeshViewportEffect::distortXY(float &x, float &y)
178
{
179
    if (mesh == nullptr)
180
        return false;
181

182
    float u;
183
    float v;
184
    if (!mesh->mapVertex(x * 2.0f, y * 2.0f, &u, &v))
185
        return false;
186

187
    x = u / 2.0f;
188
    y = v / 2.0f;
189
    return true;
190
}
191

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.