/* render/state.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include "render/state.h" #include "render/gl.h" #include "render/render.h" namespace render { int State::render_width = 0; int State::render_height = 0; float State::render_aspect = 0; bool State::render_has_generate_mipmaps = 0; void State::init(int width, int height) { resize(width, height); render_has_generate_mipmaps = false; std::string version(gl::version()); for (size_t i = 0; i < version.size(); i++) { if (version[i] == '.') version[i] = ' '; } std::stringstream versionstream(version); int major, minor; if (versionstream >> major >> minor) { if (major > 1) { render_has_generate_mipmaps = true; } else if (major == 1) { if (minor > 3) render_has_generate_mipmaps = true; } } else { con_warn << "Could not determine OpenGL version!" << std::endl; } } void State::shutdown() { } void State::resize(int width, int height) { render_width = width; render_height = height; render_aspect = (float) width / (float) height; clear(); } void State::clear() { // set viewport gl::viewport(0, 0, render_width, render_height); // set clear color gl::clearcolor(0.0f, 0.0f, 0.0f, 1.0f); // load identity matrices gl::matrixmode(GL_PROJECTION); gl::loadidentity(); gl::matrixmode(GL_MODELVIEW); gl::loadidentity(); // shading model: Gouraud (smooth, the default) gl::shademodel(GL_SMOOTH); //gl::shademodel(GL_FLAT); // color tracking glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // material settings GLfloat specular_reflectance[] = { 0.2f, 0.2f, 0.2f, 1.0f }; glMaterialfv(GL_FRONT, GL_SPECULAR, specular_reflectance); glMateriali(GL_FRONT, GL_SHININESS, 128); // shininess 1-128 // alpha blending function gl::blendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gl::disable(GL_LIGHTING); gl::disable(GL_COLOR_MATERIAL); gl::cullface(GL_BACK); gl::frontface(GL_CCW); gl::disable(GL_CULL_FACE); gl::disable(GL_DEPTH_TEST); gl::disable(GL_BLEND); gl::disable(GL_TEXTURE_2D); } } // namespace render