paysages3d/src/render/preview/SceneryTopDownPreviewRenderer.cpp

98 lines
2.3 KiB
C++

#include "SceneryTopDownPreviewRenderer.h"
#include "CloudsDefinition.h"
#include "BasePreview.h"
#include "Scenery.h"
#include "TerrainRenderer.h"
#include "WaterRenderer.h"
#include "CloudsRenderer.h"
#include "LightingManager.h"
SceneryTopDownPreviewRenderer::SceneryTopDownPreviewRenderer(Scenery* scenery):
scenery(scenery)
{
clouds_enabled = true;
render_quality = 3;
}
void SceneryTopDownPreviewRenderer::bindEvent(BasePreview* preview)
{
no_clouds = new CloudsDefinition(NULL);
clouds_enabled = true;
// TODO Translation
preview->addOsd("geolocation");
preview->addToggle("clouds", "Clouds", false);
preview->addToggle("specularity", "Light reflection", false);
preview->configHdrToneMapping(true);
preview->configScaling(0.5, 200.0, 3.0, 50.0);
preview->configScrolling(-1000.0, 1000.0, 0.0, -1000.0, 1000.0, 0.0);
}
void SceneryTopDownPreviewRenderer::updateEvent()
{
setScenery(scenery);
if (not clouds_enabled)
{
getScenery()->getClouds()->clear();
}
getLightingManager()->setSpecularity(specularity_enabled);
prepare();
}
Color SceneryTopDownPreviewRenderer::getColor2D(double x, double y, double scaling)
{
Vector3 location;
double height = getTerrainRenderer()->getHeight(x, y, true);
if (height < getWaterRenderer()->getHeightInfo().max_height)
{
return getWaterRenderer()->getResult(x, y).final;
}
else
{
location.x = x;
location.y = height;
location.z = y;
return getTerrainRenderer()->getFinalColor(location, scaling);
}
}
void SceneryTopDownPreviewRenderer::toggleChangeEvent(const std::string &key, bool value)
{
if (key == "clouds")
{
clouds_enabled = value;
}
else if (key == "specularity")
{
specularity_enabled = value;
}
}
double SceneryTopDownPreviewRenderer::getPrecision(const Vector3 &)
{
return 0.0000001;
}
Vector3 SceneryTopDownPreviewRenderer::getCameraLocation(const Vector3 &target)
{
return target.add(VECTOR_UP.scale(50.0));
}
Color SceneryTopDownPreviewRenderer::applyMediumTraversal(Vector3 location, Color color)
{
if (clouds_enabled)
{
return getCloudsRenderer()->getColor(getCameraLocation(location), location, color);
}
else
{
return color;
}
}