From 64a2a6d71023ab382c996ccdb8e403660fa19916 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 6 Oct 2010 12:11:46 +0000 Subject: replaces skydomes with skyboxes --- src/render/sky.cc | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/render/sky.cc (limited to 'src/render/sky.cc') diff --git a/src/render/sky.cc b/src/render/sky.cc new file mode 100644 index 0000000..e40c4be --- /dev/null +++ b/src/render/sky.cc @@ -0,0 +1,147 @@ +/* + 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 -- cgit v1.2.3