paysages3d/src/render/opengl/OpenGLSkybox.cpp

86 lines
3.2 KiB
C++
Raw Normal View History

2013-12-21 22:48:54 +00:00
#include "OpenGLSkybox.h"
#include <cmath>
#include "OpenGLRenderer.h"
#include "OpenGLShaderProgram.h"
#include "OpenGLSharedState.h"
2015-12-07 22:32:55 +00:00
#include "OpenGLVertexArray.h"
2013-12-21 22:48:54 +00:00
#include "Scenery.h"
#include "AtmosphereDefinition.h"
#include "AtmosphereRenderer.h"
#include "AtmosphereModelBruneton.h"
#include "FloatNode.h"
2013-12-21 22:48:54 +00:00
OpenGLSkybox::OpenGLSkybox(OpenGLRenderer *renderer) : OpenGLPart(renderer) {
2013-12-21 22:48:54 +00:00
program = createShader("skybox");
program->addVertexSource("skybox");
program->addFragmentSource("atmosphere");
program->addFragmentSource("tonemapping");
2013-12-21 22:48:54 +00:00
program->addFragmentSource("skybox");
2015-12-07 22:32:55 +00:00
vertices = createVertexArray(false, true);
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->setVertexCount(14);
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(0, Vector3(1.0f, 1.0f, 1.0f));
vertices->set(12, Vector3(1.0f, 1.0f, 1.0f));
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(1, Vector3(1.0f, -1.0f, 1.0f));
vertices->set(5, Vector3(1.0f, -1.0f, 1.0f));
vertices->set(13, Vector3(1.0f, -1.0f, 1.0f));
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(2, Vector3(-1.0f, 1.0f, 1.0f));
vertices->set(10, Vector3(-1.0f, 1.0f, 1.0f));
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(3, Vector3(-1.0f, -1.0f, 1.0f));
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(4, Vector3(-1.0f, -1.0f, -1.0f));
vertices->set(8, Vector3(-1.0f, -1.0f, -1.0f));
2013-12-21 22:48:54 +00:00
2015-12-07 22:32:55 +00:00
vertices->set(6, Vector3(1.0f, -1.0f, -1.0f));
2015-12-07 22:32:55 +00:00
vertices->set(7, Vector3(1.0f, 1.0f, -1.0f));
vertices->set(11, Vector3(1.0f, 1.0f, -1.0f));
vertices->set(9, Vector3(-1.0f, 1.0f, -1.0f));
}
OpenGLSkybox::~OpenGLSkybox() {
}
void OpenGLSkybox::initialize() {
// Watch for definition changes
renderer->getScenery()->getAtmosphere()->propDayTime()->addWatcher(this, true);
renderer->getScenery()->getAtmosphere()->propHumidity()->addWatcher(this, true);
renderer->getScenery()->getAtmosphere()->propSunRadius()->addWatcher(this, true);
2013-12-21 22:48:54 +00:00
}
void OpenGLSkybox::update() {
SoftwareBrunetonAtmosphereRenderer *bruneton =
(SoftwareBrunetonAtmosphereRenderer *)renderer->getAtmosphereRenderer();
2013-12-22 17:05:11 +00:00
renderer->getSharedState()->set("transmittanceTexture", bruneton->getModel()->getTextureTransmittance());
renderer->getSharedState()->set("inscatterTexture", bruneton->getModel()->getTextureInscatter());
2013-12-21 22:48:54 +00:00
}
void OpenGLSkybox::render() {
2015-12-07 22:32:55 +00:00
program->draw(vertices);
2013-12-21 22:48:54 +00:00
}
2015-09-14 17:25:54 +00:00
void OpenGLSkybox::nodeChanged(const DefinitionNode *node, const DefinitionDiff *) {
if (node->getPath() == "/atmosphere/daytime") {
Vector3 sun_direction = renderer->getAtmosphereRenderer()->getSunDirection(false);
renderer->getSharedState()->set("sunDirection", sun_direction);
Color sun_color = renderer->getScenery()->getAtmosphere()->sun_color;
renderer->getSharedState()->set("sunColor", sun_color);
renderer->getSharedState()->set("dayTime", renderer->getScenery()->getAtmosphere()->propDayTime()->getValue());
} else if (node->getPath() == "/atmosphere/humidity") {
renderer->getSharedState()->set("atmosphereHumidity",
renderer->getScenery()->getAtmosphere()->propHumidity()->getValue());
} else if (node->getPath() == "/atmosphere/sun_radius") {
renderer->getSharedState()->set("sunRadius",
renderer->getScenery()->getAtmosphere()->propSunRadius()->getValue());
}
}