/* 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/render.h" #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, const float wireframe) { 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", false); sky_texture_down = Textures::load(basename + "_down", false); sky_texture_left = Textures::load(basename + "_left", false); sky_texture_right = Textures::load(basename + "_right", false); sky_texture_front = Textures::load(basename + "_front", false); sky_texture_back = Textures::load(basename + "_back", false); } sky_name.assign(name); } /* * NOTE: * to use quake3 skyboxes: * switch left and right images * rotate top image 90 degrees clockwise * rotate bottom image 90 degrees counter-clockwise * */ const gl::Primitive primitive = (wireframe ? gl::LineLoop : gl::Quads); 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(primitive); 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(primitive); 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(primitive); 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(primitive); 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(primitive); 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(primitive); 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); Stats::quads += 6; } 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