Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/sky.cc')
-rw-r--r--src/render/sky.cc147
1 files changed, 147 insertions, 0 deletions
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