Number5
Visualisierung 2 Project - Florian Schober (0828151, f.schober@live.com), Andreas Walch (0926780, walch.andreas89@gmail.com)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
HighlightTargetEffect.cpp
Go to the documentation of this file.
1 #include "Application.hpp"
2 
3 
5 : m_app(app)
6 , m_shaderFocusId(m_app->getShaders().get("pp_focusid"))
7 , m_shaderVBlur(m_app->getShaders().get("pp_vblur"))
8 , m_shaderHBlur(m_app->getShaders().get("pp_hblur"))
9 , m_shaderFSQuad(m_app->getShaders().get("fsquad"))
10 {
11  glGenTextures(m_texFull.size(), &(m_texFull[0]));
12  glGenTextures(m_texHalf.size(), &(m_texHalf[0]));
13  glGenFramebuffers(m_fboFull.size(), &(m_fboFull[0]));
14  glGenFramebuffers(m_fboHalf.size(), &(m_fboHalf[0]));
15 
16  for (auto& texFull : m_texFull)
17  {
18  glBindTexture(GL_TEXTURE_2D, texFull);
19  {
20  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
21  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
22  }
23  glBindTexture(GL_TEXTURE_2D, 0);
24  }
25  for (auto& texHalf : m_texHalf)
26  {
27  glBindTexture(GL_TEXTURE_2D, texHalf);
28  {
29  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
30  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
31  }
32  glBindTexture(GL_TEXTURE_2D, 0);
33  }
34 
35  resize(app->getWindow().getSize());
36 
37  for (size_t i = 0; i < m_fboFull.size(); i++)
38  {
39  auto& fbo = m_fboFull[i];
40 
41  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
42  {
43  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texFull[i], 0);
44 
45  GLuint buffers[] = { GL_COLOR_ATTACHMENT0 };
46  glDrawBuffers(1, buffers);
47 
48  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
49  if (e != GL_FRAMEBUFFER_COMPLETE)
50  cerr << "ERROR: fbo not complete" << endl;
51  }
52  glBindFramebuffer(GL_FRAMEBUFFER, 0);
53  }
54 
55  for (size_t i = 0; i < m_fboHalf.size(); i++)
56  {
57  auto& fbo = m_fboHalf[i];
58 
59  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
60  {
61  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texHalf[i], 0);
62 
63  GLuint buffers[] = { GL_COLOR_ATTACHMENT0 };
64  glDrawBuffers(1, buffers);
65 
66  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
67  if (e != GL_FRAMEBUFFER_COMPLETE)
68  cerr << "ERROR: fbo not complete" << endl;
69  }
70  glBindFramebuffer(GL_FRAMEBUFFER, 0);
71  }
72 
73 
74 
75 
76  vec4 data[] =
77  {
78  vec4(0,0,0,0),
79  vec4(1,1,1,1),
80  vec4(0,1,0,1),
81 
82  vec4(0,0,0,0),
83  vec4(1,0,1,0),
84  vec4(1,1,1,1)
85  };
86 
87  glGenBuffers(1, &m_positionBuffer);
88  glBindBuffer(GL_ARRAY_BUFFER, m_positionBuffer);
89  glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
90  glBindBuffer(GL_ARRAY_BUFFER, 0);
91 
92  glGenVertexArrays(1, &m_vao);
93  glBindVertexArray(m_vao);
94 
95  glBindBuffer(GL_ARRAY_BUFFER, m_positionBuffer);
96  GLint positionIndex = Shader::position;
97  glEnableVertexAttribArray(positionIndex);
98  glVertexAttribPointer(positionIndex, 4, GL_FLOAT, GL_FALSE, 0, 0);
99 
100  glBindVertexArray(0);
101  glBindBuffer(GL_ARRAY_BUFFER, 0);
102 
103  m_shaderFocusId->use();
104  m_shaderFocusId->uniform("tex", (int)0);
105  m_shaderVBlur->use();
106  m_shaderVBlur->uniform("tex", (int)0);
107  m_shaderHBlur->use();
108  m_shaderHBlur->uniform("tex", (int)0);
109  m_shaderFSQuad->use();
110  m_shaderFSQuad->uniform("tex", (int)0);
111 }
113 {
114  glDeleteTextures(m_texFull.size(), &(m_texFull[0]));
115  glDeleteTextures(m_texHalf.size(), &(m_texHalf[0]));
116  glDeleteFramebuffers(m_fboFull.size(), &(m_fboFull[0]));
117  glDeleteFramebuffers(m_fboHalf.size(), &(m_fboHalf[0]));
118 
119  glDeleteBuffers(1, &m_positionBuffer);
120  glDeleteVertexArrays(1, &m_vao);
121 }
122 
123 void HighlightTargetEffect::resize(vec2 const & size)
124 {
125  m_size = uvec2((uint)size.x, (uint)size.y);
126 
127  for (auto& texFull : m_texFull)
128  {
129  glBindTexture(GL_TEXTURE_2D, texFull);
130  {
131  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, (GLsizei)size.x, (GLsizei)size.y, 0, GL_RGBA, GL_HALF_FLOAT, nullptr);
132  }
133  glBindTexture(GL_TEXTURE_2D, 0);
134  }
135  for (auto& texHalf : m_texHalf)
136  {
137  glBindTexture(GL_TEXTURE_2D, texHalf);
138  {
139  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, (GLsizei)(size.x/2), (GLsizei)(size.y/2), 0, GL_RGBA, GL_HALF_FLOAT, nullptr);
140  }
141  glBindTexture(GL_TEXTURE_2D, 0);
142  }
143  for (auto& fboFull : m_fboFull)
144  {
145  glBindFramebuffer(GL_FRAMEBUFFER, fboFull);
146  {
147  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, (GLint)size.x);
148  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, (GLint)size.y);
149 
150  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
151  if (e != GL_FRAMEBUFFER_COMPLETE)
152  cerr << "ERROR: fbo not complete" << endl;
153  }
154  glBindFramebuffer(GL_FRAMEBUFFER, 0);
155  }
156  for (auto& fboHalf : m_fboHalf)
157  {
158  glBindFramebuffer(GL_FRAMEBUFFER, fboHalf);
159  {
160  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, (GLint)(size.x/2));
161  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, (GLint)(size.y/2));
162 
163  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
164  if (e != GL_FRAMEBUFFER_COMPLETE)
165  cerr << "ERROR: fbo not complete" << endl;
166  }
167  glBindFramebuffer(GL_FRAMEBUFFER, 0);
168  }
169 }
170 
171 void HighlightTargetEffect::draw(double time, double timeDelta)
172 {
173  auto &picker = m_app->getPicker();
174 
175  if (!picker.hasFocusId())
176  {
177  glBindFramebuffer(GL_FRAMEBUFFER, m_fboHalf[0]);
178  {
179  glClearColor(0, 0, 0, 0);
180  glClear(GL_COLOR_BUFFER_BIT);
181  }
182  glBindFramebuffer(GL_FRAMEBUFFER, 0);
183  return;
184  }
185 
186  glDisable(GL_DEPTH_TEST);
187  glBindVertexArray(m_vao);
188 
189  // Highlight Focus-ID to full[0]
190  {
191  glBindFramebuffer(GL_FRAMEBUFFER, m_fboFull[0]);
192  m_shaderFocusId->use();
193  m_shaderFocusId->uniform("focusid", picker.getFocusId());
194  m_shaderFocusId->uniform("texelSize", vec2(1.0f/m_size.x, 1.0f/m_size.y));
196  glDrawArrays(GL_TRIANGLES, 0, 6);
197  }
198 
199  glViewport(0, 0, (GLsizei)(m_size.x/2), (GLsizei)(m_size.y/2));
200 
201  // Scale down to half[0]
202  {
203  glBindFramebuffer(GL_FRAMEBUFFER, m_fboHalf[0]);
204  m_shaderFSQuad->use();
205  m_shaderFSQuad->uniform("texelSize", vec2(1.0f/m_size.x, 1.0f/m_size.y));
206  glBindTexture(GL_TEXTURE_2D, m_texFull[0]);
207  glDrawArrays(GL_TRIANGLES, 0, 6);
208  }
209 
210  // H-Blur to half[1]
211  {
212  glBindFramebuffer(GL_FRAMEBUFFER, m_fboHalf[1]);
213  m_shaderHBlur->use();
214  m_shaderHBlur->uniform("texelSize", vec2(2.0f/m_size.x, 2.0f/m_size.y));
215  glBindTexture(GL_TEXTURE_2D, m_texHalf[0]);
216  glDrawArrays(GL_TRIANGLES, 0, 6);
217  }
218 
219  // V-Blur to half[0]
220  {
221  glBindFramebuffer(GL_FRAMEBUFFER, m_fboHalf[0]);
222  m_shaderVBlur->use();
223  m_shaderVBlur->uniform("texelSize", vec2(2.0f/m_size.x, 2.0f/m_size.y));
224  glBindTexture(GL_TEXTURE_2D, m_texHalf[1]);
225  glDrawArrays(GL_TRIANGLES, 0, 6);
226  }
227 
228  glViewport(0, 0, (GLsizei)(m_size.x), (GLsizei)(m_size.y));
229  glBindFramebuffer(GL_FRAMEBUFFER, 0);
230 
231  glBindVertexArray(0);
232  glEnable(GL_DEPTH_TEST);
233 }
234 
236 {
237  glActiveTexture(GL_TEXTURE0 + target);
238  glBindTexture(GL_TEXTURE_2D, m_texHalf[0]);
239 }
void use()
Definition: Shader.cpp:111
array< GLuint, 1 > m_texFull
void draw(double time, double timeDelta)
SceneFBO & getSceneFBO()
Definition: Application.hpp:61
array< GLuint, 2 > m_fboHalf
HighlightTargetEffect(Application *app)
static const uint position
Definition: Shader.hpp:122
void bindIdTexture(GLuint target=0)
Definition: SceneFBO.cpp:148
Window & getWindow()
Definition: Application.hpp:41
void resize(vec2 const &size)
vec2 const & getSize() const
Definition: Window.hpp:45
Picker & getPicker()
Definition: Application.hpp:91
array< GLuint, 2 > m_texHalf
void bindResultTexutre(GLuint target=0)
array< GLuint, 1 > m_fboFull
GLint uniform(string const &name)
Definition: Shader.cpp:115