using namespace std;
+namespace movit {
+
EffectChain::EffectChain(float aspect_nom, float aspect_denom, ResourcePool *resource_pool)
: aspect_nom(aspect_nom),
aspect_denom(aspect_denom),
output_dot("step19-split-to-phases.dot");
- for (unsigned i = 0; i < inputs.size(); ++i) {
- inputs[i]->finalize();
- }
-
assert(phases[0]->inputs.empty());
finalized = true;
glDepthMask(GL_FALSE);
check_error();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
if (phases.size() > 1) {
glGenFramebuffers(1, &fbo);
check_error();
output_textures.insert(make_pair(phases[phase], tex_num));
}
- glUseProgram(phases[phase]->glsl_program_num);
+ const GLuint glsl_program_num = phases[phase]->glsl_program_num;
+ check_error();
+ glUseProgram(glsl_program_num);
check_error();
// Set up RTT inputs for this phase.
check_error();
string texture_name = string("tex_") + phases[phase]->effect_ids[input];
- glUniform1i(glGetUniformLocation(phases[phase]->glsl_program_num, texture_name.c_str()), sampler);
+ glUniform1i(glGetUniformLocation(glsl_program_num, texture_name.c_str()), sampler);
check_error();
}
unsigned sampler_num = phases[phase]->inputs.size();
for (unsigned i = 0; i < phases[phase]->effects.size(); ++i) {
Node *node = phases[phase]->effects[i];
- node->effect->set_gl_state(phases[phase]->glsl_program_num, phases[phase]->effect_ids[node], &sampler_num);
+ node->effect->set_gl_state(glsl_program_num, phases[phase]->effect_ids[node], &sampler_num);
check_error();
}
// Now draw!
- glBegin(GL_QUADS);
-
- glTexCoord2f(0.0f, 0.0f);
- glVertex2f(0.0f, 0.0f);
+ float vertices[] = {
+ 0.0f, 1.0f,
+ 0.0f, 0.0f,
+ 1.0f, 1.0f,
+ 1.0f, 0.0f
+ };
+
+ GLuint vao;
+ glGenVertexArrays(1, &vao);
+ check_error();
+ glBindVertexArray(vao);
+ check_error();
- glTexCoord2f(1.0f, 0.0f);
- glVertex2f(1.0f, 0.0f);
+ GLuint position_vbo = fill_vertex_attribute(glsl_program_num, "position", 2, GL_FLOAT, sizeof(vertices), vertices);
+ GLuint texcoord_vbo = fill_vertex_attribute(glsl_program_num, "texcoord", 2, GL_FLOAT, sizeof(vertices), vertices); // Same as vertices.
- glTexCoord2f(1.0f, 1.0f);
- glVertex2f(1.0f, 1.0f);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ check_error();
- glTexCoord2f(0.0f, 1.0f);
- glVertex2f(0.0f, 1.0f);
+ cleanup_vertex_attribute(glsl_program_num, "position", position_vbo);
+ cleanup_vertex_attribute(glsl_program_num, "texcoord", texcoord_vbo);
- glEnd();
+ glUseProgram(0);
check_error();
for (unsigned i = 0; i < phases[phase]->effects.size(); ++i) {
Node *node = phases[phase]->effects[i];
node->effect->clear_gl_state();
}
+
+ glDeleteVertexArrays(1, &vao);
+ check_error();
}
for (map<Phase *, GLuint>::const_iterator texture_it = output_textures.begin();
check_error();
}
}
+
+} // namespace movit