From c50095cab023e91ba2a4fec8dcb290e6d817124b Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Mon, 6 Dec 2010 21:33:34 +0000 Subject: Re-enabled environment mapping with the skybox as cubemap. --- src/render/draw.cc | 122 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 21 deletions(-) (limited to 'src/render/draw.cc') 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; } } -- cgit v1.2.3