4
// Copyright © 2020 Celestia Development Team. All rights reserved.
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.
12
#include "viewporteffect.h"
13
#include "framebuffer.h"
15
#include "shadermanager.h"
16
#include "mapmanager.h"
18
namespace gl = celestia::gl;
19
namespace util = celestia::util;
21
static const Renderer::PipelineState ps;
23
bool ViewportEffect::preprocess(Renderer* renderer, FramebufferObject* fbo)
25
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFboId);
29
bool ViewportEffect::prerender(Renderer* renderer, FramebufferObject* fbo)
31
if (!fbo->unbind(oldFboId))
34
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
35
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
39
bool ViewportEffect::distortXY(float &x, float &y)
44
PassthroughViewportEffect::PassthroughViewportEffect() :
49
bool PassthroughViewportEffect::render(Renderer* renderer, FramebufferObject* fbo, int width, int height)
51
auto *prog = renderer->getShaderManager().getShader("passthrough");
58
prog->samplerParam("tex") = 0;
59
glBindTexture(GL_TEXTURE_2D, fbo->colorTexture());
60
renderer->setPipelineState(ps);
62
glBindTexture(GL_TEXTURE_2D, 0);
67
void PassthroughViewportEffect::initialize()
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,
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
84
vo = gl::VertexObject();
85
bo = gl::Buffer(gl::Buffer::TargetHint::Array, quadVertices, gl::Buffer::BufferUsage::StaticDraw);
90
CelestiaGLProgram::VertexCoordAttributeIndex,
92
gl::VertexObject::DataType::Float,
98
CelestiaGLProgram::TextureCoord0AttributeIndex,
100
gl::VertexObject::DataType::Float,
106
WarpMeshViewportEffect::WarpMeshViewportEffect(WarpMesh *mesh) :
112
bool WarpMeshViewportEffect::prerender(Renderer* renderer, FramebufferObject* fbo)
117
return ViewportEffect::prerender(renderer, fbo);
120
bool WarpMeshViewportEffect::render(Renderer* renderer, FramebufferObject* fbo, int width, int height)
122
auto *prog = renderer->getShaderManager().getShader("warpmesh");
129
prog->samplerParam("tex") = 0;
130
prog->floatParam("screenRatio") = (float)height / width;
131
glBindTexture(GL_TEXTURE_2D, fbo->colorTexture());
132
renderer->setPipelineState(ps);
134
glBindTexture(GL_TEXTURE_2D, 0);
139
void WarpMeshViewportEffect::initialize()
145
vo = gl::VertexObject();
148
bo.setData(mesh->scopedDataForRendering(), gl::Buffer::BufferUsage::StaticDraw);
150
vo.setCount(mesh->count());
153
CelestiaGLProgram::VertexCoordAttributeIndex,
155
gl::VertexObject::DataType::Float,
161
CelestiaGLProgram::TextureCoord0AttributeIndex,
163
gl::VertexObject::DataType::Float,
169
CelestiaGLProgram::IntensityAttributeIndex,
171
gl::VertexObject::DataType::Float,
177
bool WarpMeshViewportEffect::distortXY(float &x, float &y)
184
if (!mesh->mapVertex(x * 2.0f, y * 2.0f, &u, &v))