/* render/sky.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "render/camera.h" #include "render/sky.h" #include "render/textures.h" namespace render { size_t Sky::sky_texture_up = 0; size_t Sky::sky_texture_down = 0; size_t Sky::sky_texture_left = 0; size_t Sky::sky_texture_right = 0; size_t Sky::sky_texture_front = 0; size_t Sky::sky_texture_back = 0; std::string Sky::sky_name; void Sky::draw(const std::string & name) { if (sky_name.compare(name) != 0) { unload(); } if (!sky_name.size()) { if (name.size()) { const std::string basename("textures/sky/" + name); sky_texture_up = Textures::load(basename + "_up"); sky_texture_down = Textures::load(basename + "_down"); sky_texture_left = Textures::load(basename + "_left"); sky_texture_right = Textures::load(basename + "_right"); sky_texture_front = Textures::load(basename + "_front"); sky_texture_back = Textures::load(basename + "_back"); } sky_name.assign(name); } /* * NOTE * for quake3 skyboxes: the _left texture is actually the right side of the skybox */ gl::push(); gl::translate(Camera::eye()); gl::enable(GL_TEXTURE_2D); gl::color(1.0f, 1.0f, 1.0f, 1.0f); // front Textures::bind(sky_texture_front); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(1, 1, 1); gl::texcoord(1, 0); gl::vertex(1, -1, 1); gl::texcoord(1, 1); gl::vertex(1, -1, -1); gl::texcoord(0, 1); gl::vertex(1, 1, -1); gl::end(); // right Textures::bind(sky_texture_right); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(1, -1, 1); gl::texcoord(1, 0); gl::vertex(-1, -1, 1); gl::texcoord(1, 1); gl::vertex(-1, -1, -1); gl::texcoord(0, 1); gl::vertex(1, -1, -1); gl::end(); // back Textures::bind(sky_texture_back); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(-1, -1, 1); gl::texcoord(1, 0); gl::vertex(-1, 1, 1); gl::texcoord(1, 1); gl::vertex(-1, 1, -1); gl::texcoord(0, 1); gl::vertex(-1, -1, -1); gl::end(); // left Textures::bind(sky_texture_left); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(-1, 1, 1); gl::texcoord(1, 0); gl::vertex(1, 1, 1); gl::texcoord(1, 1); gl::vertex(1, 1, -1); gl::texcoord(0, 1); gl::vertex(-1, 1, -1); gl::end(); // up Textures::bind(sky_texture_up); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(-1, 1, 1); gl::texcoord(1, 0); gl::vertex(-1, -1, 1); gl::texcoord(1, 1); gl::vertex(1, -1, 1); gl::texcoord(0, 1); gl::vertex(1, 1, 1); gl::end(); // down Textures::bind(sky_texture_down); gl::begin(gl::Quads); gl::texcoord(0, 0); gl::vertex(1, 1, -1); gl::texcoord(1, 0); gl::vertex(1, -1, -1); gl::texcoord(1, 1); gl::vertex(-1, -1, -1); gl::texcoord(0, 1); gl::vertex(-1, 1, -1); gl::end(); gl::pop(); gl::disable(GL_TEXTURE_2D); } void Sky::unload() { if (sky_texture_up) { Textures::unload(sky_texture_up); sky_texture_up = 0; } if (sky_texture_down) { Textures::unload(sky_texture_down); sky_texture_down = 0; } if (sky_texture_left) { Textures::unload(sky_texture_left); sky_texture_left = 0; } if (sky_texture_right) { Textures::unload(sky_texture_right); sky_texture_right = 0; } if (sky_texture_front) { Textures::unload(sky_texture_front); sky_texture_front = 0; } if (sky_texture_back) { Textures::unload(sky_texture_back); sky_texture_back = 0; } sky_name.clear(); } } // namespace render