Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2010-12-06 21:33:34 +0000
committerStijn Buys <ingar@osirion.org>2010-12-06 21:33:34 +0000
commitc50095cab023e91ba2a4fec8dcb290e6d817124b (patch)
treee9511df876d45faffb428ee7ae342a8aabab4194 /src/render/draw.cc
parent8c7fa7dd3258e8d3e112fb9780249dd0d0ef008a (diff)
Re-enabled environment mapping with the skybox as cubemap.
Diffstat (limited to 'src/render/draw.cc')
-rw-r--r--src/render/draw.cc122
1 files changed, 101 insertions, 21 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc
index 1e166b3..7511598 100644
--- a/src/render/draw.cc
+++ b/src/render/draw.cc
@@ -19,7 +19,6 @@
#include "render/draw.h"
#include "render/dust.h"
#include "render/gl.h"
-#include "render/sky.h"
#include "math/functions.h"
namespace render
@@ -157,7 +156,13 @@ void pass_prepare(float seconds)
}
/* ----- Skybox ---------------------------------------------------- */
-
+/*
+* To use quake3 skyboxes:
+* switch left and right images
+* rotate top image 90 degrees clockwise
+* rotate bottom image 90 degrees counter-clockwise
+*
+*/
void draw_pass_sky()
{
if (!(r_sky && r_sky->value()))
@@ -169,7 +174,59 @@ void draw_pass_sky()
if (!core::localplayer()->zone()->sky().size())
return;
- Sky::draw(core::localplayer()->zone()->sky(), (r_wireframe && r_wireframe->value()));
+ Textures::load_cubemap("textures/sky/" + core::localplayer()->zone()->sky());
+
+ gl::push();
+ gl::translate(Camera::eye());
+
+ gl::color(1.0f, 1.0f, 1.0f, 1.0f);
+ gl::enable(GL_TEXTURE_CUBE_MAP);
+
+ gl::begin((r_wireframe && r_wireframe->value()) ? gl::LineLoop : gl::Quads);
+
+ // front
+ gl::texcoord(1, 1, 1); gl::vertex(1, 1, 1);
+ gl::texcoord(1, -1, 1); gl::vertex(1, -1, 1);
+ gl::texcoord(1, -1, -1); gl::vertex(1, -1, -1);
+ gl::texcoord(1, 1, -1); gl::vertex(1, 1, -1);
+
+ // right
+ gl::texcoord(1, -1, 1); gl::vertex(1, -1, 1);
+ gl::texcoord(-1, -1, 1); gl::vertex(-1, -1, 1);
+ gl::texcoord(-1, -1, -1); gl::vertex(-1, -1, -1);
+ gl::texcoord(1, -1, -1); gl::vertex(1, -1, -1);
+
+ // back
+ gl::texcoord(-1, -1, 1); gl::vertex(-1, -1, 1);
+ gl::texcoord(-1, 1, 1); gl::vertex(-1, 1, 1);
+ gl::texcoord(-1, 1, -1); gl::vertex(-1, 1, -1);
+ gl::texcoord(-1, -1, -1); gl::vertex(-1, -1, -1);
+
+ // left
+ gl::texcoord(-1, 1, 1); gl::vertex(-1, 1, 1);
+ gl::texcoord(1, 1, 1); gl::vertex(1, 1, 1);
+ gl::texcoord(1, 1, -1); gl::vertex(1, 1, -1);
+ gl::texcoord(-1, 1, -1); gl::vertex(-1, 1, -1);
+
+ // up
+ gl::texcoord(-1, 1, 1); gl::vertex(-1, 1, 1);
+ gl::texcoord(-1, -1, 1); gl::vertex(-1, -1, 1);
+ gl::texcoord(1, -1, 1); gl::vertex(1, -1, 1);
+ gl::texcoord(1, 1, 1); gl::vertex(1, 1, 1);
+
+ // down
+ gl::texcoord(1, 1, -1); gl::vertex(1, 1, -1);
+ gl::texcoord(1, -1, -1); gl::vertex(1, -1, -1);
+ gl::texcoord(-1, -1, -1); gl::vertex(-1, -1, -1);
+ gl::texcoord(-1, 1, -1); gl::vertex(-1, 1, -1);
+
+ gl::end();
+
+ gl::disable(GL_TEXTURE_CUBE_MAP);
+
+ gl::pop();
+
+ Stats::quads += 6;
}
@@ -595,7 +652,13 @@ void draw_model_fragments(model::Model *model,
// TODO this should probably be initialized somewhere else
gl::texgeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
gl::texgeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-
+
+ /*
+ gl::texgeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ gl::texgeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ gl::texgeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ */
+
for (model::Model::Groups::const_iterator git = model->groups().begin(); git != model->groups().end(); git++) {
const model::FragmentGroup *group = (*git);
@@ -688,34 +751,47 @@ void draw_model_fragments(model::Model *model,
if (material->flags() & model::Material::Environment) {
if (!(material->flags() & model::Material::Texture)) {
- /*
- // use sky as envmap if the material defines no texture
- // FIXME broken since skybox
- if (core::localplayer()->zone()->sky_texture()) {
- Textures::bind(core::localplayer()->zone()->sky_texture());
- gl::enable(GL_TEXTURE_2D);
- use_texture = true;
- } else
- */
+
if (use_texture) {
gl::disable(GL_TEXTURE_2D);
use_texture = false;
}
- }
-
- if (!use_env) {
- // enable env mapping
+
+ // use sky as envmap if the material doesn't define a texture
+ if (core::localplayer()->zone()->sky().size()) {
+ gl::enable(GL_TEXTURE_CUBE_MAP);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+
+ gl::enable(GL_TEXTURE_GEN_S);
+ gl::enable(GL_TEXTURE_GEN_T);
+ gl::enable(GL_TEXTURE_GEN_R);
+ use_env = true;
+ }
+
+ } else {
+
+ gl::texgeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ gl::texgeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+
gl::enable(GL_TEXTURE_GEN_S);
gl::enable(GL_TEXTURE_GEN_T);
use_env = true;
+
+ if (!use_texture) {
+ gl::enable(GL_TEXTURE_2D);
+ use_texture = true;
+ }
}
-
} else {
-
if (use_env) {
// disable env mapping
gl::disable(GL_TEXTURE_GEN_S);
gl::disable(GL_TEXTURE_GEN_T);
+ gl::disable(GL_TEXTURE_GEN_R);
+ gl::disable(GL_TEXTURE_CUBE_MAP);
use_env = false;
}
}
@@ -739,6 +815,8 @@ void draw_model_fragments(model::Model *model,
// disable env mapping
gl::disable(GL_TEXTURE_GEN_S);
gl::disable(GL_TEXTURE_GEN_T);
+ gl::disable(GL_TEXTURE_GEN_R);
+ gl::disable(GL_TEXTURE_CUBE_MAP);
use_env = false;
}
@@ -767,6 +845,8 @@ void draw_model_fragments(model::Model *model,
// disable env mapping
gl::disable(GL_TEXTURE_GEN_S);
gl::disable(GL_TEXTURE_GEN_T);
+ gl::disable(GL_TEXTURE_GEN_R);
+ gl::disable(GL_TEXTURE_CUBE_MAP);
use_env = false;
}
@@ -793,12 +873,12 @@ void draw_model_fragments(model::Model *model,
// disable env mapping
gl::disable(GL_TEXTURE_GEN_S);
gl::disable(GL_TEXTURE_GEN_T);
- use_env = false;
+ gl::disable(GL_TEXTURE_GEN_R);
+ gl::disable(GL_TEXTURE_CUBE_MAP);
}
if (use_texture) {
gl::disable(GL_TEXTURE_2D);
- use_texture = false;
}
}