Cleanup skybox preparation code

This commit is contained in:
Vincent Lejeune 2014-12-11 20:42:18 +01:00
parent 334cca21ad
commit 5f47fee897
4 changed files with 17 additions and 15 deletions

View File

@ -1392,7 +1392,7 @@ scene::ISceneNode *IrrDriver::addSkyBox(const std::vector<video::ITexture*> &tex
SphericalHarmonicsTextures = sphericalHarmonics;
SkyboxCubeMap = 0;
SkyboxSpecularProbe = 0;
m_SH_dirty = true;
m_skybox_ready = false;
return m_scene_manager->addSkyBoxSceneNode(texture[0], texture[1],
texture[2], texture[3],
texture[4], texture[5]);
@ -1402,7 +1402,7 @@ void IrrDriver::suppressSkyBox()
{
SkyboxTextures.clear();
SphericalHarmonicsTextures.clear();
m_SH_dirty = true;
m_skybox_ready = false;
if ((SkyboxCubeMap) && (!ProfileWorld::isNoGraphics()))
{
glDeleteTextures(1, &SkyboxCubeMap);
@ -1788,7 +1788,7 @@ void IrrDriver::onUnloadWorld()
void IrrDriver::setAmbientLight(const video::SColorf &light)
{
m_scene_manager->setAmbientLight(light);
m_SH_dirty = true;
m_skybox_ready = false;
} // setAmbientLight
video::SColorf IrrDriver::getAmbientLight() const

View File

@ -236,7 +236,7 @@ private:
std::vector<video::ITexture *> SkyboxTextures;
std::vector<video::ITexture *> SphericalHarmonicsTextures;
bool m_SH_dirty;
bool m_skybox_ready;
float blueSHCoeff[9];
float greenSHCoeff[9];
@ -455,7 +455,7 @@ public:
void getOpenGLData(std::string *vendor, std::string *renderer,
std::string *version);
void generateSkyboxCubemap();
void prepareSkybox();
void generateDiffuseCoefficients();
void renderSkybox(const scene::ICameraSceneNode *camera);
void setPhase(STKRenderingPass);

View File

@ -176,7 +176,11 @@ void IrrDriver::renderGLSL(float dt)
irr_driver->getSceneManager()->setAmbientLight(SColor(0, 0, 0, 0));
// TODO: put this outside of the rendering loop
generateDiffuseCoefficients();
if (!m_skybox_ready)
{
prepareSkybox();
m_skybox_ready = true;
}
if (!UserConfigParams::m_dynamic_lights)
glEnable(GL_FRAMEBUFFER_SRGB);

View File

@ -274,20 +274,20 @@ GLuint generateCubeMapFromTextures(const std::vector<video::ITexture *> &texture
return result;
}
void IrrDriver::generateSkyboxCubemap()
void IrrDriver::prepareSkybox()
{
glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
assert(SkyboxTextures.size() == 6);
SkyboxCubeMap = generateCubeMapFromTextures(SkyboxTextures);
SkyboxSpecularProbe = generateSpecularCubemap(SkyboxCubeMap);
generateDiffuseCoefficients();
if (!SkyboxTextures.empty())
{
SkyboxCubeMap = generateCubeMapFromTextures(SkyboxTextures);
SkyboxSpecularProbe = generateSpecularCubemap(SkyboxCubeMap);
}
}
void IrrDriver::generateDiffuseCoefficients()
{
if (!m_SH_dirty)
return;
m_SH_dirty = false;
const unsigned texture_permutation[] = { 2, 3, 0, 1, 5, 4 };
unsigned sh_w = 0, sh_h = 0;
@ -379,8 +379,6 @@ void IrrDriver::renderSkybox(const scene::ICameraSceneNode *camera)
{
if (SkyboxTextures.empty())
return;
if (!SkyboxCubeMap)
generateSkyboxCubemap();
glBindVertexArray(MeshShader::SkyboxShader::getInstance()->cubevao);
glDisable(GL_CULL_FACE);
assert(SkyboxTextures.size() == 6);